|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : février 2004 Messages : 20 ![]() |
bonjour,
dans un programme abap j'ai 2 LOOP imbriqués : - le premier parcourt une liste d'article (environ 3000) - le deuxième parcourt une structure de 300000 lignes pour faire des sommes sur l'article en question mon traitement fera donc au max 3000 * 300000 traitements. y at-il une manière d'optimiser les LOOP pour réduire les temps de traitement (tri ou conditions particuliers...) ? Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Membre expérimenté
![]() |
Bonjour cam360,
Utilise les LOOP indéxés, c'est plus performant et ça t'evite de parcourir 3000fois la totalité de ta deuxième table. Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre habitué
![]() |
bonjour,
je pense que ce qu'a mit celdron est tout à fait correcte, et je ne suis pas sur qu'il y ait de meilleur solution. |
|
|
00
|
|
|
#4 | ||
|
Membre expérimenté
![]() |
Salut,
En effet, je pense que cette solution est la meilleure bien qu'il existe un autre type de LOOP imbriqué indéxé (que j'ai vite laissé tomber) car il consiste a conserver l'index de la 2nd table (wpt_s920) et de repartir de cet index et faire des conditions pour vérifier si le n° article (en reprenant l'exemple) est le même etc., au lieu de faire un READ TABLE... Un exemple pour rendre hommage à un vieux bout de code ^^. Code :
Au final, ça revient au même, si les deux tables sont triées selon la même clé mais c'est plus facile d'utiliser un READ TABLE. A++. |
||
|
|
00
|
|
|
#5 |
|
Membre habitué
![]() |
et bien je dirai ke le BINARY SEARCH reste essentielle, car la recherche est plus rapide.
Sinon, j'aime bien ta seconde méthode Celdron, car elle permet de ne pas avoir de read table (qui va prendre du tps), alors que la conservation de l'index ne prends rien!! |
|
|
00
|
|
|
#6 |
|
Membre expérimenté
![]() |
Oui, le BINARY SEARCH reste forcement essentiel pour optimiser un READ TABLE, encore faut-il ne pas oublier de faire un SORT de sa table interne en fonction des clés de lecture, sinon ça marche pas ou alors c'est un gros coup d'bol (ou de cocu <= appeler sa copine dans la minute pour lui demander ce qu'elle fabrique
Sinon oui, la deuxième solution est moins consommatrice en temps, mais ça deviens vite une usine à gaz si la condition IF...ENDIF se complique. Et point de vue perf, ça doit se voir surtout sur un traitement de masse. Bref cam360, t'as toutes les billes en main. A++.
|
|
|
00
|
|
|
#7 | |||
|
Invité régulier
![]() Inscription : février 2004 Messages : 20 ![]() |
Citation:
Oui mais le EXIT me fait avancer d'un pas dans "wpt_s920" et pas dans "wpt_article"... Imaginons que le 1er article de la table des articles n'existe pas dans wpt_s920, on va parcourir toute la table et ne retourner aucun résultat ! ce qui est faux puisque pour d'autres articles j'ai des valeurs dans "wpt_s920" ! |
|||
|
|
00
|
|
|
#8 |
|
Membre expérimenté
![]() |
A t'écouter, on croirait que le LOOP ne sert pas à incrémenter l'index à chaque nouvelle boucle... ^_^
Sinon, en effet, le EXIT va te faire sortir de la boucle sur wpt_s920, et si tu en sors, tu va reboucler sur wpt_article en te positionnant sur l'article suivant. Mais on ne va pas parcourir toute la table wpt_s920 puisqu'on test si les deux numéros d'article wps_s920-matnr et wps_article-matnr sont égaux. Si ce n'est le cas, ça veut dire que wps_s920-matnr est plus grand que wps_article-matnr,puisque tes deux tables sont triés par rapport au n° d'article(matnr) par ordre croissant et donc,de ce fait on va conserver l'index de wpt_s920 qui vaudra encore 1 donc à la prochaine boucle on repartira du début. Si pour l'article suivant (wps_article-matnr), on retrouve une, ou plusieurs lignes (selon le contenu de ta 2nd table et l'algo à mettre en place), dès que wps_s920-matnr > wps_article-matnr, on va conserver l'index en cours (par exemple 3), et on repartira de l'index 3, sur la table wpt_s920, pour le wps_article-matnr d'après. Je sais pas si j'ai été assez clair mais regarde bien ma condition IF...ELSEIF...ENDIF. A+. |
|
|
00
|
|
|
#9 |
|
Invité régulier
![]() Inscription : février 2004 Messages : 20 ![]() |
désolé,
je me suis embrouillé tout seul avec les tabix... en fait tout marche très bien comme ça et les temps de traitement ont été bien divisés ! je suis passé de 10min à 26s !! j'ai essayé également de faire la différence entre le traitement avec le READ et le traitement sans, c'est quasi identique. merci beaucoup |
|
|
00
|
|
|
#10 |
|
Membre confirmé
![]() Inscription : octobre 2007 Messages : 209 ![]() |
pour moi le plus optimal est d'utiliser des read table from index dans des boucles do enddo sur les 2 tables
il suffit de gérer les 2 niveaux d'index et d'avancer en même temps (en ayant trié au préalable les 2 tables) mais bon la solution est plus complexe à mettre en place et dans l'exemple il vaut mieux utiliser les loop indexés |
|
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() Développeur ERP Inscription : février 2011 Messages : 2 ![]() |
Bonjour, je me permet d'ajouter un complément à cette discussion, même si le dernier message date de 2008.
Je viens de découvrir qu'on peut à la fois utiliser FROM sy-tabix et les conditions WHERE dans le LOOP. Cela évite d'avoir à refaire des test de sorties dans des conditions (IF blabla-champ1 <> trucmuche-champ1. EXIT. ENDIF.) Voici un programme de test qui vous permet de voir le déroulement en debug: Code ABAP :
|
||
|
|
00
|
|
|
#12 |
|
Membre expérimenté
![]() |
Salut,
Ce qui me freine avec cette méthode c'est que j'ai peur que l'on parcourt toute la table à partir de l'indice donné.
__________________
Boaf...signature <= ça suffira ça ?? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com