исключение при попытке получить более 1 тысячи клиентов и счетов из QBO API - PullRequest
0 голосов
/ 02 мая 2019

У меня более 1000 клиентов и счетов, и я пытаюсь собрать всех этих клиентов и счетов в выпадающий список.

Документация на сайте QBO предлагаетчто нам нужно использовать нумерацию страниц, если я хочу загрузить всех клиентов в сетке, но я хочу загрузить всех клиентов и счета-фактуры в раскрывающемся списке.

При попытке получить более 1000 клиентов и счетов-фактур я получаю следующее исключение:

Было сгенерировано исключение проверки.

Подробности: QueryValidationError: значение 100000слишком великМаксимально допустимое значение 1000.

Я пытаюсь выбрать всех клиентов, используя следующий код

public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
   return Helper.FindAll<Customer>(context, new Customer(),1,100000);
}

Ответы [ 3 ]

1 голос
/ 02 мая 2019

Простой ответ - зациклить достаточное количество раз, чтобы получить нужные записи:

public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
    var list = new List<Customer>();
    for (int i=0; i<=10000; i+= 1000)
    {
        var results = Helper.FindAll<Customer>(context, new Customer(),i, 1000);
        list.AddRange(results);
    }
    return list;
}

Или, если вы хотите попробовать сделать это параллельно (а API допускает одновременные соединения):

public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
    var bag = new ConcurrentBag<Customer>();
    Parallel.ForEach( Enumerable.Range(0, 10), i =>
    {
        var results = Helper.FindAll<Customer>(context, new Customer(),i * 1000, 1000);
        bag.AddRange(results);
    });
    return bag.ToList();
}

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

1 голос
/ 03 мая 2019

Я написал следующий код и решил мою проблему.

1. First I get the count of all the customers 
2. Then I get all the customers in chunks and the chunk size is 1000 
3. Create a List for customers. 
4. Define 3 integer type variables for counting. 
5. After that use do-while loop  
6. Add all the customers are added to the main customer list


        string strQuery = "Select Count(*) From Customer";
        string custCount = qboAccess.GetCutomerCount(qboInz.QboServiceContext, strQuery);
        List<qboData.Customer> customers = new List<Customer>();
        int maxSize = 0;
        int position = 1;
        int count = Convert.ToInt32(custCount);
        do
        {
          var custList = qboAccess.GetAllQBOEntityRecords(qboInz.QboServiceContext, new Customer(), position, 1000);
          customers.AddRange(custList);
          maxSize += custList.Count();
          position += 1000;
        } while (count > maxSize);
0 голосов
/ 02 мая 2019

Вы не можете загрузить эти записи сразу. Это то, что говорит вам ошибка - очень ясно. Нет волшебного способа избежать правил сервера.

Тем не менее, я действительно думаю, что вам все равно не следует загружать их все сразу. Выпадающий список не является хорошим способом отображения такого количества данных для пользователей. Подумайте об опыте пользователей - хотите ли вы прокрутить список тысяч клиентов, чтобы найти нужного? Или было бы проще начать вводить часть имени, и у нее появится короткий список возможных совпадений на выбор?

Более удобный способ реализовать это - использовать поле автозаполнения вместо раскрывающегося списка, и после того, как пользователь набрал несколько символов, он может использовать AJAX для поиска в API клиентов, чьи имена или идентификаторы содержат эти символы. Тогда вам нужно будет только возвращать небольшое количество записей каждый раз, и пользователь не будет застревать при необходимости прокручивать в течение 10 минут, просто чтобы найти клиента внизу списка из 10000 записей.

...