1

我有一个小型应用程序,它迭代“保存的搜索”的结果,从几个自定义列中检索值(简化示例):

var results = searchResults.Select(a => new
{
    X = ((SearchColumnBooleanCustomField)a.basic.customFieldList
        .First(b => b.scriptId == "custentityX")).searchValue
    Y = ((SearchColumnDateCustomField)a.basic.customFieldList
        .First(b => b.scriptId == "custentityY")).searchValue
    Z = ((SearchColumnSelectCustomField)a.basic.customFieldList
        .First(b => b.scriptId == "custentityZ")).searchValue.name
}

对于大多数返回的列类型,我得到一个与类型一致的值(bool/date/etc...),但是对于“SearchColumnSelectCustomField”,我在返回的“searchValue.name”中没有得到任何值,它始终为空,但是始终填充“searchValue.internalID”列。因此,由于某种原因,它获得了选择,但没有从该选择中返回值。

如何从 SuiteTalk("searchValue.name") 访问我可以从 NetSuite 界面看到的文本值?我是否必须执行另一个查询来检索与该 internalID 相关的所有值键对?对于每个自定义字段?如果是这样,那么首先名称字段的目的是什么?

我试过四处寻找这个,但并没有真正分配关于这个主题的文档(或一般的 SuiteTalk),在其他语言(PHP/Java)中人们提到“getSelectValue”(这里和简要这里),我可以在 C# 中尝试这个,但我不确定这些是否适用,或者是否可以为自定义值选择完成。然后有一些参考用于在搜索之前确定值,对我来说似乎有点矫枉过正,真的那么难吗?我有几十个我想在我的最终应用程序中访问的自定义字段。似乎应该有一个更简单的方法......

4

2 回答 2

3

据我所知,Web 服务响应将仅包含 SearchColumnSelectCustomField 的 internalId 和 typeId。为了获得名称,您必须首先查询 NetSuite 以查找所有自定义列表及其值。

您可以使用 CustomListSearch 执行此操作,并将 bodyFieldsOnly 搜索首选项设置为 false。不向 CustomListSearch 传递任何条件,您将返回每个自定义列表及其值。只需将结果存储在内存中,并在从保存的搜索中读取列值时引用它。

于 2016-11-08T22:26:02.650 回答
2

我尝试了@Adud123 发布的答案,效果很好,代码如下:

public Dictionary<string, Dictionary<long, string>> getCustomFieldLists()
{
    return
        nsService.search(new CustomListSearch())
            .recordList.Select(a => (CustomList) a)
            .ToDictionary(a => a.internalId,
                a => a.customValueList.customValue
                     .ToDictionary(b => b.valueId, c => c.value));
}

var valueLookup = getCustomFieldLists();

var results = searchResults.Select(a => new
{
    Z = (a.basic.customFieldList.Where(b => b.scriptId == "custentityZ")
        .Select(a => (SearchColumnSelectCustomField)a)
        .Select(a => valueLookup[a.searchValue.typeId][a.searchValue.internalId])
        .First()
}
于 2016-11-08T23:33:05.837 回答