【问题标题】:How to read more than 1000 records return from netsuite search results in c#?如何在c#中读取从netsuite搜索结果返回的1000多条记录?
【发布时间】:2014-09-16 22:38:05
【问题描述】:

我无法读取所有记录。它只读取第一页索引记录。我想阅读所有页面的所有记录。 Totalrecords 是 2055 条,但仅读取第 1000 条记录。请有人尽快帮我解决这个问题。

TransactionSearchAdvanced ticketSearch = new TransactionSearchAdvanced();
ticketSearch.savedSearchId = "287";
SearchResult results = new SearchResult();
results = _service.search(ticketSearch);

// If everything was okay, start processing records
if (results.status.isSuccess)
    {
        foreach (SearchResult sr in searchMoreResults)
          {
            //System.Console.WriteLine("Results found.");
            foreach (SearchRow searchRow in results.searchRowList)
              {
                TransactionSearchRow SaleTicket = (TransactionSearchRow)searchRow;
                if (SaleTicket.basic != null)
                   {
                     if (SaleTicket.basic.tranId != null)
                      {

                        SearchColumnStringField[] scsf = SaleTicket.basic.tranId;
                        variables.salesOrderNumber = scsf[0].searchValue;
                        SearchColumnSelectField[] Field = SaleTicket.basic.entity;
                        RecordRef rr = Field[0].searchValue;
                        if (!string.IsNullOrEmpty(rr.internalId))
                           {
                             variables.customerNsInternalID = rr.internalId;
                           }
                        variables.customerIdIntergerPart = Convert.ToInt32(variables.salesOrderNumber.Substring((variables.salesOrderNumber.IndexOf("-") + 1)));
                        InsertSalesOrderRecords(variables);

                        }
                        }
                    }
                }

            }

【问题讨论】:

  • searchMoreResults 来自哪里?

标签: c#-4.0 netsuite


【解决方案1】:

不知道如何使用 C# 和 Web 服务,但这是我使用 SuiteScript 的方式

var savedSearch = nlapiLoadSearch(recordType, searchId);
var resultset = savedSearch.runSearch();
var returnSearchResults = [];
var searchid = 0;
do {
    var resultslice = resultset.getResults(searchid, searchid + 1000);
    for ( var rs in resultslice) {
        returnSearchResults.push(resultslice[rs]);
        searchid++;
    }
} while (resultslice.length >= 1000);

return returnSearchResults;

【讨论】:

  • 如果你把它作为一个 RESTlet 并从 C# 代码中调用它会更快。
【解决方案2】:

根据this answer,1000 条记录是硬性限制。查看this question 的答案,了解您的问题的可能解决方案。

【讨论】:

  • 我尝试使用此链接解决方案。但是当它调用 searchmore netsuite 方法时,它会出现类似会话的错误。
  • 这对我有用,但我每次运行“searchMoreWithId”时都必须重置“tokenPassport”,不知道为什么。有点慢的过程...
【解决方案3】:

这是它的伪代码(我主要使用 javascript,所以这将是伪伪代码;))

b_keepLoop = true, b_internalId = false;

while (b_keepLoop){

var a_filters = [];
if(b_internalId){
   a_filters.push(new nlobjSearchFilter('internalidnumber', null, 'greaterthanorequalto',   i_lastTranId));
}

searchResults = nlapiSearchRecord('transaction', a_searchName[0], a_filters); //10 units
/**do whatever you want for your actual code**/
if (searchResults.length >= 1000) {
            i_lastTranId = searchResults[(searchResults.length - 1)].getId();
            b_internalId = true;
} 
else {
        b_keepLoop = false;
}

【讨论】:

  • 我假设您知道您正在使用的编程语言,而不是 API。基本上,获取搜索的最后一个 id 并将其用作下一次搜索调用的过滤器。您正在努力解决这个过程的哪一部分,所以也许我们可以帮助您?你知道 API 调用吗?你不知道如何在 C# 中做循环吗?你在哪方面苦苦挣扎?
猜你喜欢
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多