Forum PgiBat

PgiBat, le logiciel compagnon de Batigest

Vous n'êtes pas identifié(e).

#1 2013-04-03 13:59:38

Jean-Pierre Leon
Administrateur
Inscription : 2013-03-12
Messages : 54

Comment améliorer les performances d'un paramétrage

Il y a plusieurs techniques, assez faciles, qui permettent de gagner du temps lors d'une impression.

  • On peut limiter le nombre de tables lues,

  • On peut réduire le nombre de boucles effectuées,

  • On peut réduire le nombre de champs sélectionnés dans les requêtes.

Lecture des tables

il faut comprendre que chaque action de type "Lit {table}, {index}" est une interrogation de la base de données, il y a donc un temps de réponse nécessaire de la part du serveur. Pour l'exemple, nous allons prendre un extrait de paramétrage devis, dans la partie du script qui gère les ouvrages et les sous-ouvrages

  1. Si Typ=OUVRAGE Ou Typ=SSOUVR Alors

  2. 'Positionnement sur sous-traitant correspondant

  3. Lit SsTrait, Ligne.FourSsTrait

  4. 'Positionnement sur élément correspondant

  5. Lit Element, Ligne.CodeElem

  6. Si Typ=OUVRAGE Alors

  7. Si Ligne.SautPage=Vrai Alors ModifBloc("Ouvrage","Sav,Temp")

  8. Si Element.LibelleTec <> "" Alors

  9. Imprimer "InterLigne, Ouvrage, DebutOuvrageTechnique, OuvrageTechnique"

  10. Sinon

  11. Imprimer "InterLigne, Ouvrage"

  12. FinSi

  13. Sinon

  14. Si Ligne.SautPage=Vrai Alors ModifBloc("SsOuvrage","Sav,Temp")

  15. Imprimer SsOuvrage

  16. FinSi

  17. Sinon

à la ligne 3, le logiciel va interroger la table des Sous-Traitants, afin de vous permettre de récupérer d'éventuelles informations liées à la fiche du sous-traitant que vous avez, éventuellement, associé à l'ouvrage en cours de lecture...
si vous n'utilisez pas cette possibilité, autant désactiver cette ligne !
à la ligne 5, même chose, le logiciel va interroter la table des éléments (la bibliothèque), table qui peut comporter des dizaines, voire quelques centaines de miliers de lignes, pour lire les informations de la fiche ouvrage. Dans la majorité des cas, cette action est inutile, sauf si, par exemple, vous souhaitez récupérer le libellé technique.

Pour un devis qui comporterait 50 ouvrages, vous avez déjà économisé 100 interrogations de la base de données !

Réduire le nombre de boucles

un exemple facile à comprendre est, toujours dans les éditions de devis, la partie dédiée au "Récapitulatif", dont voici le script :

  1. 'Récapitulatif des tranches

  2. Ligne="DevisLigne" de Devis

  3. Pour Chaque Ligne

  4. Si Changement(Page) Alors Imprimer "DébutRecap, TrancheRecap)...FinRecap"

  5. Si Ligne.NumLig>=0 Alors

  6. 'Tranche <Sans Nom>

  7. Si Ligne.NumLig=0 Alors

  8. Si (Ligne.Pv>0) Et (Ligne.NonEdit = Faux) Alors Imprimer TrancheRecap

  9. Sinon

  10. Si (Ligne.Type=TRANCHE) Et (Ligne.NonEdit = Faux) Alors Imprimer TrancheRecap

  11. FinSi

  12. FinSi

  13. Boucler

La ligne 2 détermine l'ensemble des lignes sur lesquelles le script va travailler. Cela ne se voit pas, car c'est directement géré par le logiciel, il s'agit de l'ensemble des lignes du devis. Donc, si nous imaginons un devis avec 5 tranches, chacune avec 10 ouvrages, et chaque ouvrage avec 5 lignes de sous-détail, nous avons 5x10x5 lignes, soit 250 lignes, à parcourir, uniquement pour imprimer les tranches. Pour un gros devis, on peut avoir ainsi quelques milliers de lignes.

Si l'on modifie la ligne 2 en remplaçant "DevisLigne" par une requête SQL, on limitera les lignes aux seules tranches de niveau 1, soit 5 lignes dans notre exemple, et la formule serait donc :
Ligne = Liste "SELECT * FROM DevisLigne WHERE (NumLig>0) AND (Type='T') AND (NivTr=1) AND (NonEdit=false) AND (Code = '" & Devis.Code & "') ORDER BY NumLig"

De plus, il n'est pas nécessaire de vérifier s'il s'agit d'une tranche, ni de vérifier NumLig, ni le niveau de la tranche, ni l'option "non édité", puisque tout est déjà intégré dans la requête, l'ensemble des lignes serait donc le suivant :

  1. 'Récapitulatif des tranches

  2. Ligne = Liste "SELECT * FROM DevisLigne WHERE (NumLig>0) AND (Type='T') AND (NivTr=1) AND (NonEdit=false) AND (Code = '" & Devis.Code & "') ORDER BY NumLig"

  3. Pour Chaque Ligne

  4. Si Changement(Page) Alors Imprimer "DébutRecap, (TrancheRecap)...FinRecap"

  5. Imprimer TrancheRecap

  6. Boucler

Dans cette opération, vous passez de quelques centaines (milliers) de lignes à quelques unités, voire quelques dizaines tout au plus.

Réduire le nombre de champs sélectionnés dans les requêtes.

Si vous rédigez une requête de sélection, et que dans celle-ci vous ne précisez pas le nom des champs, votre requête aura cette syntaxe : SELECT * FROM {table}

En procédant de cette manière, vous obligez le logiciel à identifier lui-même les champs, ce qui va prendre du temps, et d'autre part le volume de données sera plus important, inutilement.
Si nous reprenons l'exemple du récapitulatif des tranches, il était possible de limiter la requête aux seuls champs dont on a réellement besoin, c'est à dire ce qui est utilisé dans le récapitulatif : numérotation, désignation commercial, quantité, pv net (attention [Montant HT Net] n'est pas dans la base, c'est une valeur calculée par le programme)

notre requête serait donc : SELECT Numerotation, LibelleCom, Qte, PvNet, (Qte*PvNet) AS [Montant HT Net] FROM DevisLigne

Voilà, à vos chronomètres, choisissez le devis le plus volumineux de votre base de données, et faites des comparaisons !

Hors ligne

Pied de page des forums

Propulsé par FluxBB 1.5.3