Web 服务一次只让我得到 1000 行,但总数超过 30000 [英] Web service only let me get 1000 rows at a time but the total is over 30000

查看:20
本文介绍了Web 服务一次只让我得到 1000 行,但总数超过 30000的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Netsuite 提供的一些网络服务https://system.netsuite.com/help/helpcenter/en_US/Output/Help/SuiteFlex/WebServices/STP_searchMore.html#1087957

I am using some web services provided by Netsuite https://system.netsuite.com/help/helpcenter/en_US/Output/Help/SuiteFlex/WebServices/STP_searchMore.html#1087957

它只让我一次获得 1000 行,然后我需要对下一组 1000 行执行第二次搜索,依此类推.有一些示例代码,但它只返回第二组行,我不确定如何获得第三、第四等.

It only let me get 1000 rows at a time and then I need to perform a second search for the next set of 1000 rows and so on. There's some example code but it only returns the second set of rows, I am not sure on how to get the third, fourth and so on.

到目前为止我的代码是:

My code so far is:

private void getAllCustomers()
{
    // Instantiate a search object for customers.
    CustomerSearch custSearch = new CustomerSearch();
    CustomerSearchBasic custSearchBasic = new CustomerSearchBasic();


    // Search the customer status which is a list field (16,13,15)
    String statusKeysValue = "16,13,15";
    SearchMultiSelectField status = null;
    if (statusKeysValue != null && !statusKeysValue.Trim().Equals(""))
    {
        status = new SearchMultiSelectField();
        status.@operator = SearchMultiSelectFieldOperator.anyOf;
        status.operatorSpecified = true;
        string[] nskeys = statusKeysValue.Split(new Char[] { ',' });

        RecordRef[] recordRefs = new RecordRef[statusKeysValue.Length];
        for (int i = 0; i < nskeys.Length; i++)
        {
            RecordRef recordRef = new RecordRef();
            recordRef.internalId = nskeys[i];
            recordRefs[i] = recordRef;
        }
        status.searchValue = recordRefs;
        custSearchBasic.entityStatus = status;
    }

    custSearch.basic = custSearchBasic;

    // Invoke search() web services operation
    SearchResult response = _service.search(custSearch);            

     // Process response
    if (response.status.isSuccess)
    {
        // Process the records returned in the response
        // Here I get the first 1000 records
        processGetAllCustomersResponse(response);

        // Since pagination controls what is returned, check to see
        // if there are anymore pages to retrieve.

        SearchResult seachMoreResult = searchMore(response);

        if (seachMoreResult != null)
        {
            // Process response
            if (seachMoreResult.status.isSuccess)
            {
                // Here I get the next 1000 records
                    processGetAllCustomersResponse(seachMoreResult);

                // My problem now is to get the third set of 1000 customers, then the fourth and so on till I got all 34500 something
            }
            else
            {

            }

        }
    }
    else
    {

    }
}

private SearchResult searchMore(SearchResult response)
{
    // Keep getting pages until there are no more pages to get
    while (response.totalRecords > (response.pageSize * response.pageIndex))
    {
        return _service.searchMore(response.pageIndex + 1);
    }

    return null;
}

在 processGetAllCustomersResponse 中,我只是将行插入另一个工作正常的数据库中(除了没有获得我想要的所有行).

In processGetAllCustomersResponse I simply insert the rows in another database which works fine (apart from not getting all the rows I want).

推荐答案

我编写了 NetSuite 提供的示例的替代方案.此示例根据 TimeBill 的创建日期检索它们.

I wrote this alternative to the NetSuite-supplied examples. This example retrieves TimeBill's based on their create date.

    /// <summary>
    /// Return the list of time bills whose last modified date is within 
    /// the indicated date range.
    /// </summary>
    /// <param name="from">Required from date</param>
    /// <param name="to">Optional to date</param>
    /// <returns>List of time bills</returns>
    public IEnumerable<TimeBill> GetTimeBills(DateTime from, DateTime to)
    {
        _log.Debug(String.Format("Enter TimeBill(DateTime from='{0}', DateTime to='{1}')", from, to));

        // Build search criteria.
        TimeBillSearch search = new TimeBillSearch();
        TimeBillSearchBasic searchBasic = new TimeBillSearchBasic();
        SearchDateField searchDateField = new SearchDateField();
        searchDateField.@operator = SearchDateFieldOperator.within;
        searchDateField.operatorSpecified = true;
        searchDateField.searchValue = from;
        searchDateField.searchValueSpecified = true;
        searchDateField.searchValue2 = to;
        searchDateField.searchValue2Specified = true;
        searchBasic.dateCreated = searchDateField;
        search.basic = searchBasic;

        return this.Get<TimeBill>(search);
    }  

    /// <summary>
    /// Perform a paged search and convert the returned record to the indicated type.
    /// </summary>
    private IEnumerable<T> Get<T>(SearchRecord searchRecord)
    {
        _log.Debug("Enter Get<T>(SearchRecord searchRecord)");

        // This is returned.
        List<T> list = new List<T>();

        // The suitetalk service return this.
        SearchResult result = null;

        using (ISuiteTalkService service = SuiteTalkFactory.Get<SuiteTalkService>())
        {
            do
            {
                // .search returns the first page of data.
                if (result == null)
                {
                    result = service.search(searchRecord);
                }
                else // .searchMore returns the next page(s) of data.
                {
                    result = service.searchMoreWithId(result.searchId, result.pageIndex + 1);
                }

                if (result.status.isSuccess)
                {
                    foreach (Record record in result.recordList)
                    {
                        if (record is T)
                        {
                            list.Add((T)Convert.ChangeType(record, typeof(T)));
                        }
                    }
                }
            }
            while (result.pageIndex < result.totalPages);
        }
        return list;
    }

这篇关于Web 服务一次只让我得到 1000 行,但总数超过 30000的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆