QBO SDK C# — асинхронный пакетный процесс создания нескольких клиентов

я хочу вставить несколько объектов клиента, я перешел по этой ссылке https://developer.intuit.com/docs/0025_quickbooksapi/0055_devkits/0100_ipp_.net_devkit/0300_asynchronous_calls/2_batch_process, но появляется следующая ошибка: «Вы можете добавлять или редактировать только одно имя за раз. Повторите попытку».


Публикация моего кода:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Web;
using Intuit.Ipp.Core;
using Intuit.Ipp.Security;
using Intuit.Ipp.Services;
using HelloIntuitAnywhere.Utilities;
using Intuit.Ipp.Data.Qbo;
using Intuit.Ipp.Data.Extensions;
using System.Linq;
using System.IO;
using Intuit.Ipp.Data;

namespace HelloIntuitAnywhere
{
    public partial class BatchRequest : System.Web.UI.Page
    {
        public delegate IntuitBatchResponse DelegateBatchCompleted(IntuitBatchRequest batchRequest);
        protected void Page_Load(object sender, EventArgs e)
        {

            if (HttpContext.Current.Session.Keys.Count > 0)
            {
                String realmId = HttpContext.Current.Session["realm"].ToString();
                String accessToken = HttpContext.Current.Session["accessToken"].ToString();
                String accessTokenSecret = HttpContext.Current.Session["accessTokenSecret"].ToString();
                String consumerKey = ConfigurationManager.AppSettings["consumerKey"].ToString(CultureInfo.InvariantCulture);
                String consumerSecret = ConfigurationManager.AppSettings["consumerSecret"].ToString(CultureInfo.InvariantCulture);
                IntuitServicesType intuitServiceType = (IntuitServicesType)HttpContext.Current.Session["intuitServiceType"];

                OAuthRequestValidator oauthValidator = new OAuthRequestValidator(accessToken, accessTokenSecret, consumerKey, consumerSecret);
                ServiceContext context = new ServiceContext(oauthValidator, realmId, intuitServiceType);
                DataServices commonService = new DataServices(context);

                try
                {
                    switch (intuitServiceType)
                    {
                        case IntuitServicesType.QBO:

                            IntuitBatchRequest batchRequest = new IntuitBatchRequest();
                            batchRequest.BatchItem = new BatchItemRequest[10];

                            for (int i = 0; i < 10; i++)
                            {
                                Item itm1 = CreateItem("it8" + i.ToString());
                                string guid = Guid.NewGuid().ToString("N");
                                guid = guid.Substring(0, 30);
                                guid = i.ToString();
                                BatchItemRequest itm1BatchItem = new BatchItemRequest();
                                itm1BatchItem.bId = guid;
                                itm1BatchItem.Item = itm1;
                                itm1BatchItem.operation = OperationEnum.create;
                                itm1BatchItem.operationSpecified = true;
                                batchRequest.BatchItem[i] = itm1BatchItem;
                            }



                            //IntuitBatchResponse batchResponse = commonService.ExecuteBatch<IntuitBatchRequest>(batchRequest);
                            try
                            {
                                DelegateBatchCompleted delegateBatch = new DelegateBatchCompleted(commonService.ExecuteBatch<IntuitBatchRequest>);
                                IAsyncResult result = delegateBatch.BeginInvoke(batchRequest, new AsyncCallback(CallbackMethod), delegateBatch);
                            }
                            catch (Exception ex)
                            {
                                throw ex;
                            }


                            break;

                        default:
                            throw new Exception("Data Source not defined.");
                    }


                }
                catch
                {
                    throw;
                }
            }
        }

        private Intuit.Ipp.Data.Qbo.Item CreateItem(string str)
        {
            Intuit.Ipp.Data.Qbo.Item item = new Intuit.Ipp.Data.Qbo.Item();

            item.Desc = str + "Test Desc";
            item.Name = str + "Test Name";
            item.Taxable = true;
            item.TaxableSpecified = true;
            item.ExternalKey = new Intuit.Ipp.Data.Qbo.IdType() { idDomain = Intuit.Ipp.Data.Qbo.idDomainEnum.QBO, Value = str + "123" };
            item.UnitPrice = new Intuit.Ipp.Data.Qbo.Money() { Amount = 6, AmountSpecified = true, CurrencyCode = Intuit.Ipp.Data.Qbo.currencyCode.AED, CurrencyCodeSpecified = false };

            item.IncomeAccountRef = new Intuit.Ipp.Data.Qbo.AccountRef() { AccountId = new Intuit.Ipp.Data.Qbo.IdType() { idDomain = Intuit.Ipp.Data.Qbo.idDomainEnum.QBO, Value = "1" }, AccountType = Intuit.Ipp.Data.Qbo.AccountTypeEnum.Asset, AccountTypeSpecified = true };

            item.Type = Intuit.Ipp.Data.Qbo.ItemTypeEnum.Assembly;

            return item;
        }

        static void CallbackMethod(IAsyncResult result)
        {
            DelegateBatchCompleted delegateBatch = (DelegateBatchCompleted)result.AsyncState;
            IntuitBatchResponse batchResponse = delegateBatch.EndInvoke(result);
        }


    }
}

person Navneet Garg    schedule 21.06.2013    source источник
comment
Я использую пакетный процесс QBO для асинхронного доступа к нескольким объектам данных в одном запросе.   -  person Navneet Garg    schedule 21.06.2013


Ответы (1)


Сообщение об ошибке совершенно ясное: API Quickbooks позволяет редактировать только одного клиента за раз.

Предположительно, они блокируют таблицу Customer, поскольку одновременные изменения не поддерживаются ни бизнес-уровнем, ни базовой моделью данных.

Учитывая это ограничение, я не вижу способа обойти проблему.

Они позволяют вам вызывать синхронный метод асинхронно, поэтому вам не нужно блокировать, пока метод не завершится, но это не означает, что вы можете быть в двух изменениях клиента одновременно. Однако вы можете заняться другой работой, пока редактирование завершено.

person Eric J.    schedule 21.06.2013
comment
так в чем смысл пакетного процесса? - person Navneet Garg; 21.06.2013
comment
Пакетный процесс: для асинхронного доступа к нескольким объектам данных в одном запросе. - person Navneet Garg; 21.06.2013
comment
Navneet, SDK позволит вам объединять несколько вызовов API вместе, но по-прежнему не позволяет добавлять/редактировать несколько имен в одном вызове. Я не могу быть уверен, что вы делаете, не видя кода. Вы следовали инструкциям по созданию слушателя? Можете ли вы сделать один или несколько вызовов в пакетном режиме и получить событие обратного вызова? - person Jarred Keneally; 24.06.2013