我们如何在Netsuite中检索自定义列表(下拉列表)的值

时间:2016-08-03 19:25:27

标签: web-services netsuite suitetalk

我有记录类型“XYZ”,其具有名为“奖励区域”的字段,其类型列表/记录。 “奖励区域”是自定义列表类型,是一个下拉控件。

使用Suitetalk如何从该下拉列表中检索这些值?

谢谢

2 个答案:

答案 0 :(得分:0)

我觉得this之类的东西应该有效。它将用于将internalId的结果转换为实际文本类型,您可能能够以另一种方式利用它。也许你可以用这样的东西(C#)创建一个查找列表:

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

var valueLookup = getCustomFieldLists()["award area"];

答案 1 :(得分:0)

这是我为自己做的事情,因为NetSuite不仅为我们提供了一种方便的方式来访问这些内容,这让我很恼火。我希望以下数据可供参考:

  • 自定义列表的内部ID
  • 自定义列表的名称
  • 自定义列表项的内部ID
  • 自定义列表项的名称值

Screenshot of what I wanted to get

我希望/需要访问所有这些内容,并且我希望能够仅通过提供Custom List的内部ID和Custom List Item的内部ID来获取Custom List Item的名称Value。因此,在我自己的集成客户端中,类似于David Rogers的回答,但没有花哨的Linq,我发现最好的解决方案是Dictionary >>。

这样,对于外部词典,我可以将关键字设置为“定制列表”的内部ID,对于内部词典,我可以将关键字设置为“定制列表项目”本身的内部ID。然后,我将获得“免费”自定义列表的名称作为元组的开始部分,并获得“免费”的实际名称值作为内部字典的值。

下面是我生成该对象的方法代码:

/// <summary>
/// Gets the collection of all custom lists, and places it in the public CustomListEntries object
/// </summary>
/// <returns></returns>
private Dictionary<string, Tuple<string, Dictionary<long, string>>> GetCustomLists()
{
    Dictionary<string, Tuple<string, Dictionary<long, string>>> customListEntries = new Dictionary<string, Tuple<string, Dictionary<long, string>>>();
    SearchPreferences sp = SuiteTalkService.searchPreferences; //Store search preferences to reset back later, just need body fields this one time
    SuiteTalkService.searchPreferences = new SearchPreferences() { bodyFieldsOnly = false };
    SearchResult sr = SuiteTalkService.search(new CustomListSearch());
    SuiteTalkService.searchPreferences = sp; //Restore search preferences

    foreach (CustomList cl in sr.recordList)
    {
        Dictionary<long, string> customListItems = new Dictionary<long, string>();
        if (cl.customValueList == null) continue;
        foreach (CustomListCustomValue clcv in cl.customValueList.customValue)
        {
            customListItems.Add(clcv.valueId, clcv.value);
        }
        customListEntries.Add(cl.internalId, new Tuple<string, Dictionary<long, string>>(cl.name, customListItems));
    }
    return customListEntries;
}

然后,在我的Integration类的构造函数中,我可以将对象设置为返回结果:

public Dictionary<string, Tuple<string, Dictionary<long, string>>> CustomListEntries = GetCustomLists();

最后,每当我需要访问这些值时,由于我将所有这些设置都提前了,所以我可以执行以下操作:

dr[Class] = SuiteTalkIntegrator.CustomListEntries[lorr.typeId].Item2[long.Parse(lorr.internalId)];

在上面的这种情况下,我的“ lorr”对象是一个ListOrRecordRef对象,该对象是我从SavedSearch的搜索结果中从SearchColumnSelectCustomField.searchValue获得的。我不知道这对其他找到此代码的人是否有用,但是由于我对找到此问题的简单答案感到沮丧,所以我想与所有人共享我的解决方案。

坦率地说,我最沮丧的是,此功能并没有立即提供给我们,但我注意到NetSuite在SuiteTalk API中做出了很多错误的设计选择,例如不进行自定义记录字段的“ RecordField”类,而不是将其记录字段放在RecordField的IEnumerable下,这样程序员就可以以通用方式遍历记录中的所有值,而不必显式命名它们并重新构造相同的代码逻辑。一遍又一遍...呃...