NetSuite SuiteTalk:已保存搜索“已删除记录”类型

本文关键字:已删除记录 记录 类型 删除 搜索 SuiteTalk 保存 NetSuite | 更新日期: 2023-09-27 18:18:24

如何在NetSuite中获得类型为"已删除记录"的"已保存搜索"的结果?其他搜索类型是显而易见的(CustomerSearchAdvanced, ItemSearchAdvanced等…),但这个似乎没有在线参考,只是关于删除记录的文档,而不是在它们上运行保存的搜索。

更新1

我应该再澄清一下我要做的事情。在NetSuite中,您可以在记录类型"已删除记录"上运行(和保存)已保存搜索,我相信您可以通过此过程从web界面访问至少5列(不包括用户定义的列):

  • 删除日期
  • 删除<
  • 上下文/gh>
  • 记录类型
  • <
  • 名称/gh>

您还可以设置搜索条件作为"已保存搜索"的一部分。我想访问我的系统中已经存在的一系列"已保存搜索",利用它们已经设置的搜索条件,并从它们显示的所有5列中检索数据。

NetSuite SuiteTalk:已保存搜索“已删除记录”类型

Deleted Record记录不支持在版本2016_2的SuiteTalk,这意味着你不能运行保存搜索和拉下的结果。

这在与NetSuite集成时并不少见。(

我在这些情况下一直做的是创建一个RESTlet (NetSuite的wannabe RESTful API框架)SuiteScript,它将运行搜索(或做任何可能的SuiteScript和不可能的SuiteTalk)并返回结果。

来自文档:

您可以部署与NetSuite数据交互的服务器端脚本遵循RESTful原则。RESTlets将SuiteScript API扩展为允许自定义集成与NetSuite。使用的一些好处restlet包括以下功能:

找到提高可用性和性能的机会实现一个更轻量级的RESTful集成比基于soap的web服务更灵活。支持无状态通信在客户端和服务器之间。控制客户端和服务器实现。中使用基于令牌或用户凭据的内置身份验证HTTP报头。开发手机客户端,如iPhone和Android。集成外部基于web的应用程序,如Gmail或谷歌应用程序。为基于widget的用户界面创建后端。RESTlets为熟悉的开发人员提供了易于采用的功能与NetSuite基于soap的web相比,SuiteScript支持更多的行为服务,这些服务仅限于那些定义为SuiteTalk操作的服务。RESTlets也比可用的Suitelets更安全对未登录的用户。有关更详细的比较,请参阅RESTlets与其他NetSuite集成选项。

在您的情况下,这将是一个几乎微不足道的脚本创建,它将收集结果并返回JSON编码(最简单)或任何您需要的格式。

与编写脚本相比,您可能会花费更多的时间来获得基于令牌的身份验证(TBA)。

[Update]添加一些与我在下面的注释中提到的相关的代码示例:

注意,SuiteTalk代理对象模型在这方面令人沮丧缺乏它可以很好地利用的继承。所以你以类似SafeTypeCastName()的代码。反射是最好的工具之一在我的工具箱中,当涉及到使用SuiteTalk代理时。为例如,所有的*RecordRef类型有共同的字段/道具反射节省了您在处理对象时的所有地方进行类型检查我怀疑你有。

public static TType GetProperty<TType>(object record, string propertyID)
{
    PropertyInfo pi = record.GetType().GetProperty(propertyID);
    return (TType)pi.GetValue(record, null);
}
public static string GetInternalID(Record record)
{
    return GetProperty<string>(record, "internalId");
}
public static string GetInternalID(BaseRef recordRef)
{
    PropertyInfo pi = recordRef.GetType().GetProperty("internalId");
    return (string)pi.GetValue(recordRef, null);
}
public static CustomFieldRef[] GetCustomFieldList(Record record)
{
    return GetProperty<CustomFieldRef[]>(record, CustomFieldPropertyName);
}

感谢@SteveK修改后的最终答案。我认为从长远来看,我将不得不实现所建议的,短期内我尝试实现他的第一个解决方案("getDeleted"),我想在这方面添加一些更多的细节,以防将来有人需要使用这种方法:

//private NetSuiteService nsService = new DataCenterAwareNetSuiteService("login");
//private TokenPassport createTokenPassport() { ... }
private IEnumerable<DeletedRecord> DeletedRecordSearch()
{
    List<DeletedRecord> results = new List<DeletedRecord>();
    int totalPages = Int32.MaxValue;
    int currentPage = 1;
    while (currentPage <= totalPages)
    {
        //You may need to reauthenticate here
        nsService.tokenPassport = createTokenPassport();
        var queryResults = nsService.getDeleted(new GetDeletedFilter
        {
            //Add any filters here...
            //Example
            /*
            deletedDate = new SearchDateField()
                    {
                        @operator = SearchDateFieldOperator.after,
                        operatorSpecified = true,
                        searchValue = DateTime.Now.AddDays(-49),
                        searchValueSpecified = true,
                        predefinedSearchValueSpecified = false,
                        searchValue2Specified = false
                    }
            */
        }, currentPage);
        currentPage++;
        totalPages = queryResults.totalPages;
        results.AddRange(queryResults.deletedRecordList);
    }
    return results;
}
private Tuple<string, string> SafeTypeCastName(
    Dictionary<string, string> customList, 
    BaseRef input)
{
    if (input.GetType() == typeof(RecordRef)) {
        return new Tuple<string, string>(((RecordRef)input).name, 
            ((RecordRef)input).type.ToString());
    }
    //Not sure why "Last Sales Activity Record" doesn't return a type...
    else if (input.GetType() == typeof(CustomRecordRef)) {
        return new Tuple<string, string>(((CustomRecordRef)input).name, 
            customList.ContainsKey(((CustomRecordRef)input).internalId) ? 
                customList[((CustomRecordRef)input).internalId] : 
                "Last Sales Activity Record"));
    }
    else {
        return new Tuple<string, string>("", "");
    }
}
public Dictionary<string, string> GetListCustomTypeName()
{
    //You may need to reauthenticate here
    nsService.tokenPassport = createTokenPassport();
    return
        nsService.search(new CustomListSearch())
            .recordList.Select(a => (CustomList)a)
            .ToDictionary(a => a.internalId, a => a.name);
}
//Main code starts here
var results = DeletedRecordSearch();
var customList = GetListCustomTypeName();
var demoResults = results.Select(a => new
{
    DeletedDate = a.deletedDate,
    Type = SafeTypeCastName(customList, a.record).Item2,
    Name = SafeTypeCastName(customList, a.record).Item1
}).ToList();

我必须应用所有过滤器API端,这只返回三列:

  • 删除日期
  • 记录类型(与Web UI的格式不同)
  • <
  • 名称/gh>