Получение данных из файла QB в несколько итераций - PullRequest
0 голосов
/ 30 октября 2018

Я выбираю названия компаний и другие данные из файла QB со следующим кодом, используя QB-SDK :

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

Кажется, что он извлекает исходные данные, например, извлекает первую тысячу записей, и это все ... Логика будет подобна извлечению первых нескольких записей данных, затем следующих нескольких записей и так далее, пока не будет получено общее количество извлеченных записей. .... Но, к сожалению, QB SDK не предоставляет эту возможность, поскольку позволяет только получить первые несколько записей, и это все ...

Что я на самом деле хочу сделать, это:

У меня есть несколько записей по 100 тыс. В файле компании QB, и я хотел бы получить первые несколько записей (например, десять тысяч записей), затем перейти к следующим 10 тысячам записей, а затем к следующим 10 тысячам и так далее ... до тех пор, пока все записи извлечены.

Хотя я могу сделать это с ORNameFilter , TotalBalanceFilter и некоторыми другими фильтрами, но я хочу сделать это, как первые 10 тысяч записей, чем следующие 10 тысяч, и так далее до итого записей из файла моей компании.

Это фактически продолжение этого ТАКОГО вопроса.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 01 ноября 2018

Здесь наш код для получения счетов из диапазона дат. Используется 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...