Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD9] Problème SQL

7 réponses
Avatar
mat
Bonjour,

je reviens sur mon post du 28/10 car je n'ai toujours pas trouvé de
solution pour faire marcher une requête qui fonctionne parfaitement sous
WD8. Elle n'est peut-être pas simple à comprendre: j'ai un fichier
"Transaction" qui contient tous les mouvements stock, géré par lot et
entrepôt. Dans le résultat, j'ai besoin de toutes les lignes qui
correspondent aux critères de recherche, donc sans les totaliser, ce que
j'obtiens par une sous-requête. Il y a également des traitements
conditionnels que je préfère gérer ensuite dans une boucle sur le
résultat. Le plus important, il ne faut pas inclure les transactions
regroupés par IDInvoice+(InvoiceItem/1000), IDCompany, IDWarehouse, qui
sont à zéro. Le code ce-dessous fait tout cela à merveille sous WD8.
Sous WD9 l'exécution de la requête renvoie immédiatement VRAI. Mais le
moment qu'on entre la boucle "POUR TOUS maRequete sur xyz" le programme
se coince. Il est évident que le résultat n'est pas du tout prêt.

Est-ce que quelqu'un voit une autre solution pour obtenir le même
résultat? Merci d'avance.

Salutations
Mat


FROM Transaction
WHERE Transaction.IDRecType = 0
AND Transaction.IsNew = 0
AND Transaction.Date <= '20051028'
AND Transaction.IDInvoice + (Transaction.InvoiceItem/1000) IN (SELECT
IDInvoice + (InvoiceItem/1000) FROM Transaction as T WHERE T.IdInvoice
= Transaction.IDInvoice AND T.InvoiceItem = Transaction.InvoiceItem AND
T.IDCompany = Transaction.IDcompany AND T.IDWarehouse =
Transaction.IDWarehouse AND IDRecType = 0 AND IsNew = 0 AND Date <=
'20051028' GROUP BY IDInvoice + (InvoiceItem/1000), IDcompany,
IDWarehouse Having sum(T.Quantity)<>0) AND Transaction.IDCompany = 2

7 réponses

Avatar
mat
...SQL sur HF...
Avatar
mat
mat wrote:
Est-ce que quelqu'un voit une autre solution pour obtenir le même
résultat? Merci d'avance.




Bon, comme souvent quand je poste une question, j'ai trouvé la solution
suivante qui est en oûtre plus rapide que l'original:

1) dans les déclarations de la fenêtre, je déclare une source de donnée
dsSQL

2) Je fais une nouvelle requête pour totaliser les transactions
vQuery1 est chaîne =...
"SELECT IDInvoice + InvoiceItem/1000 AS IDInv_Item, SUM(Quantity) AS
TotQuant "
vQuery1 += "FROM Transaction "
vQuery1 += "WHERE Transaction.IDRecType = 0 AND Transaction.IsNew = 0
AND Transaction.Date <= '" + pgf.PeriodSelection.ToDate + "' "
StockTrnWhere(vQuery1) // cela ajoute les conditions where
vQuery1 += " GROUP BY IDInv_Item, IDCompany, IDWarehouse "
SI PAS HExécuteRequêteSQL(dsSQL, vQuery1) ALORS
Info(HErreurInfo,"" ,vQuery1) ; RETOUR
FIN
POUR TOUT dsSQL AVEC "TotQuant = 0"
HSupprime(dsSQL)
FIN

3) Ensuite, ma requête principale devient:
..."FROM Transaction "
vQuery += "WHERE Transaction.IDRecType = 0 AND Transaction.IsNew = 0 AND
Transaction.Date <= '" + pgf.PeriodSelection.ToDate + "' "
vQuery += " AND Transaction.IDInvoice + (Transaction.InvoiceItem/1000) IN "
vQuery += "(SELECT IDInv_Item FROM dsSQL) "

Salutations
Mat
Avatar
mat
mat wrote:
mat wrote:

Est-ce que quelqu'un voit une autre solution pour obtenir le même
résultat? Merci d'avance.





Bon, comme souvent quand je poste une question, j'ai trouvé la solution
suivante qui est en oûtre plus rapide que l'original:



puisque on est à WD8 en clientèle, je teste cette solution sous cette
version. Résultat surprenant: c'est le contraire comme sous WD9.

WD8 WD9
Requête originale 13s. plante
Requête modifié (avec
présélection) 32s. 13s.

Quand est-ce que PC Soft commenceront à informer leur clients lorsqu'
ils modifient des fonctions?

Salutations
Mat
Avatar
mat
mat wrote:

...pardon, c'est n'importe quoi...

puisque on est à WD8 en clientèle, je teste cette solution sous cette
version. Résultat surprenant: c'est le contraire comme sous WD9.

WD8 WD9
Requête originale 13s. plante
Requête modifié (avec
présélection) 32s. 13s.




WD8 WD9
Requête originale 23s. plante
Requête modifié (avec
présélection) 32s. 13s.
Avatar
mat
mat wrote:

WD8 WD9
Requête originale 13s. plante
Requête modifié (avec
présélection) 32s. 13s.





WD8 WD9
Requête originale 23s. plante
Requête modifié (avec
présélection) 32s. 13s.




encore une observation...

sous HF C/S la requête passe maintenant aussi, mais prend 29 secondes...
confirmation que tout ce qui est bon pour accélérer HF Classic est
mauvais pour HF C/S. Remplacer la boucle POUR TOUS maRequete, pour
supprimer les enregistrements avec valeur zéro, par une requête DELETE
ne fait pas de différence. En fait ça augmente le temps d'exécution de
2.7 à 3.5 secondes jusque là. Par contre, la boucle POUR TOUT qui suit
la requête principale pour chercher les libellés dans plusieurs fichiers
et faire des calculs conditionnels prend 26 secondes. Donc le moment
qu'on traite plusieurs fichiers à la fois, les deux systèmes sont
peut-être compatibles mais simplement pas utilisable avec le même code.
A mon avis, contrairement à l'impression donné par PCSoft, c'est une
illusion vouloir faire une application unique qui marche correctement
pour les deux systèmes de fichier HF, justement à cause des failles des
requêtes sous HF Classic.

Salutations
Mat
Avatar
Real Phil
Salut Mat,

Au lieu de faire à la fin,
POUR TOUT dsSQL AVEC "TotQuant = 0"
HSupprime(dsSQL)
FIN


as-tu essayé de "sauter" directement par dessus les enregistrements inutiles
en déclarant dans ton premier WHERE d'ignorer les enregistrements contenant
Quantity=0 ?

Cela donnerait "WHERE Transaction.Quantity<>0 AND Transaction.IDRecType = 0
AND ..." et le POUR TOUT de la fin ne serait plus nécessaire.

Théoriquement, cela devrait passer tout de suite à la ligne suivante dès que
la rubrique Quantity=0 sans valider les autres conditions. Ce qui devrait
être rapide au maximum.

Réal Phil


"mat" a écrit dans le message de
news:43708860$
mat wrote:
> Est-ce que quelqu'un voit une autre solution pour obtenir le même
> résultat? Merci d'avance.


Bon, comme souvent quand je poste une question, j'ai trouvé la solution
suivante qui est en oûtre plus rapide que l'original:

1) dans les déclarations de la fenêtre, je déclare une source de donnée
dsSQL

2) Je fais une nouvelle requête pour totaliser les transactions
vQuery1 est chaîne =...
"SELECT IDInvoice + InvoiceItem/1000 AS IDInv_Item, SUM(Quantity) AS
TotQuant "
vQuery1 += "FROM Transaction "
vQuery1 += "WHERE Transaction.IDRecType = 0 AND Transaction.IsNew = 0
AND Transaction.Date <= '" + pgf.PeriodSelection.ToDate + "' "
StockTrnWhere(vQuery1) // cela ajoute les conditions where
vQuery1 += " GROUP BY IDInv_Item, IDCompany, IDWarehouse "
SI PAS HExécuteRequêteSQL(dsSQL, vQuery1) ALORS
Info(HErreurInfo,"" ,vQuery1) ; RETOUR
FIN
POUR TOUT dsSQL AVEC "TotQuant = 0"
HSupprime(dsSQL)
FIN

3) Ensuite, ma requête principale devient:
..."FROM Transaction "
vQuery += "WHERE Transaction.IDRecType = 0 AND Transaction.IsNew = 0 AND
Transaction.Date <= '" + pgf.PeriodSelection.ToDate + "' "
vQuery += " AND Transaction.IDInvoice + (Transaction.InvoiceItem/1000) IN


"
vQuery += "(SELECT IDInv_Item FROM dsSQL) "

Salutations
Mat


Avatar
mat
Real Phil wrote:
Salut Mat,

Au lieu de faire à la fin,

POUR TOUT dsSQL AVEC "TotQuant = 0"
HSupprime(dsSQL)
FIN



as-tu essayé de "sauter" directement par dessus les enregistrements inutiles
en déclarant dans ton premier WHERE d'ignorer les enregistrements contenant
Quantity=0 ?

Cela donnerait "WHERE Transaction.Quantity<>0 AND Transaction.IDRecType = 0
AND ..." et le POUR TOUT de la fin ne serait plus nécessaire.

Théoriquement, cela devrait passer tout de suite à la ligne suivante dès que
la rubrique Quantity=0 sans valider les autres conditions. Ce qui devrait
être rapide au maximum.

Réal Phil





Bonjour Réal,

merci pour ton idée, mais malheureusement ce n'est pas une solution.
Généralement les transactions n'ont pas de quantité 0. Ceux qui ne
m'intéressent pas sont les transactions appartenant à un lot donnant un
total de 0 (lot 1, trans1 +100, lot1 trans2 -50, lot1 trans2 -50: lot1 =
0), et ceci à n'importe quelle date.

Salutations
Mat