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
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
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) "
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
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.
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.
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.
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
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
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" <NoSPAM-mnobs@bluemail.ch> a écrit dans le message de
news:43708860$1_2@news.bluewin.ch...
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
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
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
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.
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.