Annonce commerciale :

  
 English (United States) Français (France)
Register  
 
Saturday, May 19, 2012

Annonce commerciale

Articles
01

je vous propose une astuce simple pour avoir la montre affiché avec l'état d'avancement d'un process....

Pour cela on fait appel à une fonction (SM37) SAPGUI_PROGRESS_INDICATOR dans notre boucle ...

Dans un projet réel cette fonction sera incluse dans la dernière boucle de vos loop at TABLE_INTERNE into WORK_AREA.

Et pour etre complet nous calculons le pourcentage d'avancement. Pour cela on applique une règle de 3. On extrait le nb de record traité dans la table interne, par exemple avec un DESCRIBE. 

La régle est :

pourcent =  ( compteur dans la boucle * 100 ) / nombre total de record qui seront traités.

Mais passons à la pratique avec un code exemple :

REPORT  ZJFOPROGRESS.

DATA: nbLoop type i value 0,
      cpLoop type i value 0,
      pourcentLoop type i value 0,
      strNbLoop type string.

DATA: strMessage type STRING value ''.

*** INITIALISER le nb de boucles que vous voulez tester.
nbLoop = 1000.

DO nbLoop TIMES.
  cpLoop = cpLoop + 1.
*** calculer le pourcentage de progression.
  pourcentLoop = ( cploop * 100 ) / nbLoop.

*** génerer le text du message
  MOVE cpLoop to strNbLoop.
  CONCATENATE  'nous traitons le record n°' strNbLoop into strMessage.


  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      PERCENTAGE = pourcentLoop
      TEXT       = strMessage.
*** Votre traitement
  write '*'.
*** une boucle pour ralentir le programme (a remplacer).
  DO 1000000 timesENDDO.

ENDDO.

Voilouuuuuu

Actions: E-mail | RSS comment feed |

Comments

# sebastien.ferry
Friday, February 05, 2010 4:21 AM
Salut,

un point que beaucoup oublient:

l'affichage de l'avancement sur le client prend beaucoup de temps, ce qui ne se perçoit guère au niveau individuel, mais peut-être franchement rédhibitoire quand l'appel est répété de nombreuses fois.

La communication réseau entre le serveur et le client ralentit rééllement l'éxécution d'un programme (suivant les cas ).

Pour limiter cet impact, je fais appel à la fonction SAPGUI_PROGRESS_INDICATOR par paliers, tous les 10% dans cet exemple:

IF pourcentLoop > pourcentLoop_previous + 10.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = pourcentLoop
TEXT = strMessage.

pourcentLoop_previous = pourcentLoop.
ENDIF.




PS: et sinon, pour les extrêmistes, ont peut remplacer la multiplication/division pour le calcul du pourcentage par des additions...
(PRECISION: c'est pour les extrêmistes, et je ne suis pas sûr que ça change grand chose de remplacer le calcul du pourcentage!)
# voob
Monday, March 01, 2010 12:12 PM
Bonjour,

sébastien.ferry, cette condition n'a une bonne syntaxe : IF pourcentLoop > pourcentLoop_previous + 10.

De même que cpLoop = cpLoop + 1, inutile.
Utilisez un simple sy-index.

Voilà comment j'aurais écrit ce prog :

REPORT ZYMOWORKTEST.

DATA: nbLoop type i value 0,
cpLoop type i value 0,
pourcentLoop type i value 0,
appelLoop type i value 0,
strNbLoop type string.

DATA: strMessage type string.

*** INITIALISER le nb de boucles que vous voulez tester.
nbLoop = 1000.

DO nbLoop TIMES.
*** calculer le pourcentage de progression.
pourcentLoop = ( sy-index * 100 ) / nbLoop.

*** génerer le text du message
MOVE sy-index to strNbLoop.
CONCATENATE 'nous traitons le record n°' strNbLoop into strMessage.

ADD 1 TO appelLOOP.
IF appelLOOP = 10.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = pourcentLoop
TEXT = strMessage.
*** Votre traitement

CLEAR appelLOOP.
ENDIF.
write sy-index.

*** une boucle pour ralentir le programme (a remplacer).
DO 50000 times.
ENDDO.

ENDDO.

Post Comment

Only registered users may post comments.
  
 Print   


Les maques SAP, ABAP, BSP, Microsoft, .net, sont des marques déposées par leurs ayant-droiits.

Le site www.sap-integration.net est un site indépendant de SAP et de Microsoft et de tout autre éditeurs de logiciels ou fabricants de matériels.