Je pense que je vais commencer une grande série d’article visant à dénoncer une des plus grande blague de l’informatique : le monde du SAP… Et de son langage natif l’ABAP.
SAP est une sorte de baleine, un truc immense et bien encré dans la plupart des grandes entreprises. Le logiciel a 30 ans, et il le montre bien. L’interface est absolument hideuse, l’ergonomie est encore pire… Mais avant de critiquer les aspects fonctionnels du programme, ce qui fera l’objet d’un autre article, je voudrais m’attarder sur quelques prises de tête avec le langage natif… L’ABAP…
Prise de tête numéro 2 (perte de 2h de travail à la recherche du bug) :
Une table interne contient les données suivantes :
-
WERKS | ZUONR | XAABG
-
SD01 | 13005 | X
-
SD01 | 00065 |
-
SD02 | 35792 | X
-
SD03 | 15283 | X
Je devais compter le nb d’affectations (ZUONR) par division (WERKS), et ensuite faire un tri par rapport au code de comptabilisation (XAABG).
Il paraissait logique de parcourir la table, d’incrémenter un compteur qui se réinitialiserait à chaque fois que l’on rencontrait une nouvelle division. Fort heureusement, il existe en ABAP une commande AT NEW [champs] qui, placé dans une boucle, permet de détecter lorsque le champs change.
Mon code était donc simple (pour du sap):
-
" Boucler sur la table, mettre chaque ligne dans ws_affect "
-
LOOP AT wt_affect INTO ws_affect.
-
ww_count = ww_count + 1.
-
AT NEW werks.
-
" Traitement et compte "
-
PERFORM mywork USING ws_affect ww_count.
-
ENDAT.
-
ENDLOOP.
Et pourtant… Il semblait que tout était juste, ayant utilisé le AT NEW précédemment.. Et pourtant!! Mon code ne fonctionnait pas!! Tout avait l’air de marcher jusqu’à ce que je rentre dans mon PERFORM ou les données de ma ligne était perdues… J’avais déjà mis une heure pour trouver ou était le bug…
Juste avant le AT NEW, ma ligne ws_affect contient :
-
WERKS | ZUONR | XAABG
-
SD02 | 35792 | X
Enfin, juste après cette commande, par magie,ws_affect devient :
-
WERKS | ZUONR | XAABG
-
SD02 | * | *
J’ai fini par comprendre qu’au sein d’un AT NEW, SAP détruisait tout ce qu’il y avait après le champs recherché, ce qui rendait impossible le traitement de cette ligne sans en avoir au préalable copié le contenu (ou l’index). Une seule question… Warum messieurs??