-3
votes

Exception lorsque vous essayez d'aller chercher plus de 1 milliards de clients et de factures de QBO API

J'ai plus de 1000 clients et factures (s) et j'essaie d'aller chercher tous ces clients et toutes les factures dans une liste déroulante.

Documentation sur le site QBO suggère que nous devrions Nécessité d'utiliser la pagination si je veux charger tous les clients d'une grille, mais ce que je veux, c'est de charger tous les clients et les factures dans une liste déroulante. P>

Je suis Obtenir une exception suivante lorsque j'essaie d'aller chercher plus de 1000 clients et factures: P>

Une exception de validation a été lancée. P>

Détails: QueryValidationError: La valeur 100000 est trop grande. La valeur maximale maximale est de 1000. P> blockQuote>

J'essaie d'extraire tous les clients à l'aide du code suivant P>

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


3 commentaires

Donc, votre titre de question dit "un million", votre code dit "100 mille", et l'exception indique "Vous ne pouvez pas récupérer plus de 1000". Je vois une légère "attention au détail" problème ici ..


J'utilise Kendo Grid pour charger tous les clients et factures et I Opération de serveur désactivé = FALSE for Kendo Grid, c'est pourquoi je ne veux envoyer aucune demande au serveur. Je veux juste charger tous les clients et les factures à la fois. Pour plus de clarté, j'ai mentionné ci-dessus que je souhaite charger tous les enregistrements dans une liste déroulante


Merci pour la suggestion.


3 Réponses :


0
votes

Vous ne pouvez pas télécharger ces enregistrements tout à la fois. C'est ce que l'erreur vous dit - très clairement. Il n'y a pas de moyen magique d'éviter les règles du serveur.

Cependant, je pense vraiment que vous ne devriez pas les télécharger tous de temps en temps. Une liste déroulante n'est pas un bon moyen d'afficher ce montant de données aux utilisateurs. Considérez l'expérience utilisateur - voudriez-vous faire défiler une liste de milliers de clients pour essayer de trouver celui que vous souhaitez? Ou serait-il plus facile de commencer à taper une partie du nom et à faire apparaître une courte liste de correspondances possibles à choisir?

Un moyen plus convivial d'implémenter cela permettrait une boîte automatique à la place d'une liste déroulante et une fois que l'utilisateur a dactylographié quelques caractères, il peut utiliser AJAX pour rechercher l'API pour les clients dont les noms. ou des identifiants contiennent ces personnages. Ensuite, vous n'avez besoin que de retourner un petit nombre d'enregistrements à chaque fois, et l'utilisateur ne sera pas bloqué avant de faire défiler 10 minutes pour trouver un client au bas d'une liste de 10 000 enregistrements.


2 commentaires

Cher, je connais toutes les choses que vous suggérez ci-dessus, mais des exigences du client de temps sont très étranges et elles veulent ce qu'elles suggèrent exactement, nous ne pouvons donc pas suggérer une meilleure solution à eux, c'est pourquoi je pose cette question, j'ai résolu le cas ci-dessus et posté ma réponse ici aussi. merci pour votre réponse rapide et belle conseille


Je sais que tout sur les clients ... Mais aussi parfois, notre travail de personnel technique est de leur dire poliment que nous avons pensé à une meilleure idée. Dès que vous expliquez que la demande facilite l'utilisation, ou le rend moins cher, ou plus rapide, ou quel que soit l'avantage, dans mon expérience, ils sont généralement heureux d'accepter le changement. Dans ce cas, si vous ne pouvez pas les convaincre à l'avance, je pense qu'ils peuvent réaliser le problème quand ils commencent à essayer d'utiliser la liste déroulante ridicule :-). Bonne chance pour votre projet.



1
votes

La réponse directe consiste à boucler suffisamment de fois pour obtenir les enregistrements dont vous avez besoin: xxx

ou si vous souhaitez essayer de le faire en parallèle (et l'API permet des connexions simultanées): < / p> xxx

puisque la série d'appels est susceptible d'être coûteux, je vous suggère de mettre en cache les résultats.


0 commentaires

1
votes

J'ai écrit le code ci-dessous et j'ai résolu mon problème.

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 commentaires

Cela fonctionnera mais j'imagine que cela pourrait être assez lent