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

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

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

Исключение проверки было брошено.

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

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

public static List<Customer> GetAllQBOCustomers(ServiceContext context)
{
   return Helper.FindAll<Customer>(context, new Customer(),1,100000);
}
-3
Naveed Alam 2 Май 2019 в 10:48

3 ответа

Лучший ответ

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

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);
1
Naveed Alam 3 Май 2019 в 06:33

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

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
John Wu 3 Май 2019 в 08:34

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

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

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

0
ADyson 2 Май 2019 в 10:31