多次迭代从QB文件检索数据

时间:2018-10-30 01:20:54

标签: c# xml quickbooks intuit

我正在使用QB-SDK通过以下代码从QB文件中获取公司名称和其他数据:

public IList<CustomerModelQB> GetAllCustomer(string fromName = "a", string toName = "z", bool IsActiveOnly = true)
{
    RequestMsgSet.ClearRequests();
    ICustomerQuery CustomerQueryRq = RequestMsgSet.AppendCustomerQueryRq();

    if (IsActiveOnly)
    {
        if (CustomerQueryRq != null)
                CustomerQueryRq.ORCustomerListQuery.CustomerListFilter.ActiveStatus.SetValue(
                ENActiveStatus.asActiveOnly);
    }
    else
        CustomerQueryRq.ORCustomerListQuery.CustomerListFilter.ActiveStatus.SetValue(ENActiveStatus.asAll);


    //Set field value for FromName
    CustomerQueryRq.ORCustomerListQuery.CustomerListFilter.ORNameFilter.NameRangeFilter.FromName.SetValue(fromName);
    //Set field value for ToName
    CustomerQueryRq.ORCustomerListQuery.CustomerListFilter.ORNameFilter.NameRangeFilter.ToName.SetValue(toName);

    CustomerQueryRq.IncludeRetElementList.Add("FullName");
    CustomerQueryRq.IncludeRetElementList.Add("AccountNumber");

    ResponseMsgSet = SessionManager.DoRequests(RequestMsgSet);

    return WalkCustomerQuery(ResponseMsgSet);
}

我看着iterator并尝试了一些代码。

iterator

似乎它正在像获取前一千条记录那样获取初始数据,仅此而已...逻辑就像是先获取数据的前几条记录,然后再获取接下来的几条记录,依此类推,直到获取了记录总数....但是不幸的是QB SDK没有提供此功能,因为它只是让我获取前几条记录,仅此而已...

我真正想做的是:

我的QB公司文件中只有10万条记录,我想获取前几条记录(例如一万条记录),而不是移到下一条10,000条记录,再移到下一条10,000条,依此类推...直到所有记录已获取。

尽管可以使用 ORNameFilter TotalBalanceFilter 和其他一些过滤器来执行此操作,但我想这样做,例如前1万条记录比下1万条记录等等。直到我公司档案中的记录总数。

这实际上是this SO问题的延续。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

这里是我们的代码,可从日期范围获取发票。它使用QBFC。

    public List<tbInvoiceHeader> GetInvoices(DateTime? fromDate, DateTime? toDate, bool fromModifiedDate, string invoiceNumber)
    {
        var invoices = new List<tbInvoiceHeader>();

        IMsgSetRequest requestMsgSet;
        IMsgSetResponse responseMsgSet;

        requestMsgSet = GetLatestMsgSetRequest();
        requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue;

        IInvoiceQuery invoiceQuery = requestMsgSet.AppendInvoiceQueryRq();
        IInvoiceFilter invoiceFilter = invoiceQuery.ORInvoiceQuery.InvoiceFilter;

        if (!string.IsNullOrEmpty(invoiceNumber))
        {
            invoiceFilter.ORRefNumberFilter.RefNumberFilter.RefNumber.SetValue(invoiceNumber);
            invoiceFilter.ORRefNumberFilter.RefNumberFilter.MatchCriterion.SetValue(ENMatchCriterion.mcStartsWith);
        }
        else
        {
            if (fromDate.HasValue)
            {
                if (!fromModifiedDate)
                {
                    invoiceFilter.ORDateRangeFilter.TxnDateRangeFilter.ORTxnDateRangeFilter.TxnDateFilter.FromTxnDate.SetValue(fromDate.Value);
                }
                else
                {
                    invoiceFilter.ORDateRangeFilter.ModifiedDateRangeFilter.FromModifiedDate.SetValue(fromDate.Value, asDateOnly: true);
                }
            }

            if (toDate.HasValue)
            {
                if (!fromModifiedDate)
                {
                    invoiceFilter.ORDateRangeFilter.TxnDateRangeFilter.ORTxnDateRangeFilter.TxnDateFilter.ToTxnDate.SetValue(toDate.Value);
                }
                else
                {
                    invoiceFilter.ORDateRangeFilter.ModifiedDateRangeFilter.ToModifiedDate.SetValue(toDate.Value, asDateOnly: true);
                }
            }
        }

        invoiceFilter.MaxReturned.SetValue(iterationNumber); // Set max returns element.
        invoiceQuery.iterator.SetValue(ENiterator.itStart);
        invoiceQuery.IncludeLinkedTxns.SetValue(true);
        invoiceQuery.IncludeLineItems.SetValue(true);   
        invoiceQuery.OwnerIDList.Add("0");              // To include customs fields

        responseMsgSet = mySessionManager.DoRequests(requestMsgSet);
        do 
        {
            //Step 5: Interpret the response
            IResponseList rsList = responseMsgSet.ResponseList;

            //Retrieve the one response corresponding to our single request
            IResponse response = rsList.GetAt(0);

            if (response.StatusCode == 0) //We have one or more invoices-> show them
            {
                IInvoiceRetList invoiceList = response.Detail as IInvoiceRetList;
                int maxCnt = invoiceList.Count;

                if (invoiceProgressEvent != null)
                {
                    invoiceProgressEvent(new ProgressEvent() { Count = maxCnt, RemainingCnt = response.iteratorRemainingCount, Invoices = invoices });
                }

                //for logging only
                //XmlDocument doc = new XmlDocument();
                //doc.LoadXml(responseMsgSet.ToXMLString());
                //XmlNodeList nodes = doc.SelectNodes("//InvoiceRet");
                for (int ndx = 0; ndx < maxCnt; ndx++)
                {
                    //var xmlText = nodes[ndx].InnerXml;
                    IInvoiceRet invoiceRet = invoiceList.GetAt(ndx);
                    invoices.Add(GetInvoiceHeaderDetail(invoiceRet));
                }
            }

            if (response.iteratorRemainingCount > 0)
            {
                invoiceQuery.iteratorID.SetValue(response.iteratorID);
                invoiceQuery.iterator.SetValue(ENiterator.itContinue);
                responseMsgSet = mySessionManager.DoRequests(requestMsgSet);
            }
            else
            {
                //This cause The iteratorID "..." is not valid.
                //invoiceQuery.iteratorID.SetValue(response.iteratorID);
                //invoiceQuery.iterator.SetValue(ENiterator.itStop);
                //responseMsgSet = mySessionManager.DoRequests(requestMsgSet);
                break;
            }
        } while (true);

        return invoices;
    }