Bonjour. Je vais faire de mon mieux pour expliquer ma question sans poster le SQL (il y a 650 lignes). Faites-moi savoir si vous avez besoin de plus d'informations.
Nous avons un système interne de gestion des commandes qui alloue les stocks en temps réel. Pour que l'allocation fonctionne correctement, nous devons savoir combien de stocks sont disponibles chaque fois qu'un utilisateur demande ce sur quoi il doit travailler (en chargeant/rechargeant sa liste de tâches). Les données ressembleraient à ceci :
ID ItemID QtyOrdered QtyAvailableAfterAllocation ParentID
1 1234 5 500 NULL
2 1234 15 485 1
3 1234 10 475 2
Actuellement, une boucle while est utilisée pour définir la valeur de l'indicateur QtyAvailableAfterAllocation colonne. L'exemple ci-dessus démontre la nécessité de la boucle. La valeur de QtyAvailableAfterAllocation de la ligne 2 dépend de la valeur de QtyAvailableAfterAllocation de la ligne 1. La ligne 3 dépend de la ligne 2 et ainsi de suite.
Il s'agit de la version (très) simplifiée de la logique. Elle devient infiniment plus compliquée lorsque l'on prend en compte les kits (groupes d'articles en stock qui appartiennent à un seul article parent). Dans certains cas, il n'est pas nécessaire d'allouer des stocks à l'article parce qu'il fait partie d'un kit dont les stocks sont suffisants pour répondre à la commande. C'est pourquoi nous ne pouvons pas faire un total courant. De plus, les kits peuvent être imbriqués à l'intérieur des kits jusqu'au Nième niveau. C'est là que réside le problème. Lorsque l'on traite un grand nombre de commandes comportant des kits imbriqués, les performances de la requête sont très faibles. Je pense que la boucle est à blâmer (les tests l'ont prouvé). Voici donc la question :
Est-il possible de valider une mise à jour, une ligne à la fois et dans un ordre spécifique (sans boucle), afin que le ou les enregistrements enfants ci-dessous puissent accéder à la colonne mise à jour (QtyAvailAfterOrder_AllocationScope) dans l'enregistrement parent ?
EDITAR
Voici une petite partie du SQL. C'est la boucle while actuelle. Peut-être que cela aidera à montrer la logique nécessaire pour déterminer l'allocation pour chaque enregistrement.