Générateur de code ABAP en ligne

Souvent, lors du codage ABAP, une tâche typique survient - initialiser d'autres champs par les valeurs de certains champs de la table interne (sélectionner dans la table de base de données, en appelant FM, sous-routines). Et le code dans ce cas est très simple en termes d'algorithme, mais c'est beaucoup. J'ai toujours voulu réduire le temps consacré à ces opérations de routine. Et il a même écrit une méthode basée sur la création dynamique de programmes pour sélectionner les valeurs de référence par leurs clés dans les tables de la base de données .

Dans les commentaires signalés

" illisibilité du code " est votre micro-langage que vous devez apprendre.
" appels dynamiques " - les appels dynamiques ne sont pas les bienvenus, y compris dans ce cas le journal d'utilisation ne trouve pas de place pour utiliser les tables / champs correspondants.

Comme alternative, je proposais toujours une option avec la génération automatique de code, mais seulement maintenant, j'ai apporté cette chose à un outil fini . Peu importe, s'il vous plaît, sous le chat.

L'idée est simple: il existe un ensemble de paramètres par lesquels un code ABAP est généré selon un modèle donné.

Prenons un exemple simple: dans la table interne, mettez le nom du champ par la valeur du champ . Parlant dans le langage technique du développeur: dans la table interne, par la valeur du champ BUKRS, mettez la valeur du champ BUTXT selon la table de base de données T001 .

Déclaration simple en une seule phrase. Mais pour réaliser cela, vous devez soit faire LOOP sur la table interne et SELECT SINGLE dans une boucle (ce qui est rapide, mais du point de vue de la vitesse, ce n'est pas très bienvenu, surtout s'il y a beaucoup de lignes dans la table interne), ou sélectionner des valeurs BUKRS uniques, une requête dans la table de base de données T001, puis nous notons les valeurs correspondantes du champ BUTXT via READ TABLE. Dans ce cas, le code sera plus optimal, mais son écriture n'est pas si rapide, car ce code est déjà beaucoup. De plus, il n'y a rien de compliqué - un travail presque simple de "singe" sur la dactylographie.

Et ici, un générateur automatique vient à la rescousse, car un tel code a une forme passe-partout, ce qui signifie que son écriture peut être automatisée.

Spécifiez les paramètres suivants:

Table DB: T001
domaines de communication: BUKRS
champs initialisés: BUTXT

et obtenez le code généré suivant
*--      T001 FORM values_from_tab_T001 USING "-- ()  uv_in_BUKRS TYPE any "--   uv_out_BUTXT TYPE any CHANGING "--    ct_table TYPE ANY TABLE . "--    ? CHECK NOT ( ct_table[] IS INITIAL ). "--     TYPES: BEGIN OF lty_item, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF lty_item. DATA ls_item TYPE lty_item. DATA lt_item LIKE TABLE OF ls_item. FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_item. FIELD-SYMBOLS <ls_table> TYPE any. FIELD-SYMBOLS <lv_BUKRS> TYPE any. FIELD-SYMBOLS <lv_BUTXT> TYPE any. "--    LOOP AT ct_table ASSIGNING <ls_table>. CLEAR ls_item. ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. APPEND ls_item TO lt_item. ENDLOOP. "--     SORT lt_item BY BUKRS. DELETE ADJACENT DUPLICATES FROM lt_item COMPARING BUKRS. "--     SELECT BUKRS BUTXT FROM T001 INTO TABLE lt_item FOR ALL ENTRIES IN lt_item WHERE BUKRS = lt_item-BUKRS . "--     SORT lt_item BY BUKRS. "--     LOOP AT ct_table ASSIGNING <ls_table>. "--    ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. "--    ASSIGN COMPONENT uv_out_BUTXT OF STRUCTURE <ls_table> TO <lv_BUTXT>. "--      READ TABLE lt_item ASSIGNING <ls_item> WITH KEY BUKRS = ls_item-BUKRS BINARY SEARCH. IF sy-subrc = 0. IF <lv_BUTXT> IS ASSIGNED. <lv_BUTXT> = <ls_item>-BUTXT. ENDIF. ELSE. IF <lv_BUTXT> IS ASSIGNED. CLEAR <lv_BUTXT>. ENDIF. ENDIF. ENDLOOP. ENDFORM. 

Il suffit maintenant d'appeler le sous-programme généré dans votre programme

 PERFORM values_from_tab_T001 USING 'BUKRS' 'BUTXT' CHANGING lt_TABLE. 

Consultez le code sur le site Web du générateur ABAP
Les noms des champs de la table interne et de la table interne elle-même sont passés en tant que paramètres au sous-programme. Après l'appel, le champ BUTXT aura la valeur souhaitée.

Les noms des champs de la table interne sont faits sous forme de paramètres afin que le même sous-programme puisse être appelé pour différents champs. C'est-à-dire si vous avez deux champs BE dans la table interne (par exemple, BUKRS1 et BUKRS2), il vous suffit de générer un sous-programme et de l'appeler deux fois

 PERFORM values_from_tab_T001 USING 'BUKRS1' 'BUTXT1' CHANGING lt_TABLE. PERFORM values_from_tab_T001 USING 'BUKRS2' 'BUTXT1' CHANGING lt_TABLE. 

Dans ce cas, la «non-optimalité» apparaît, car il y aura deux SELECT dans la table de base de données T001, bien que dans le cas idéal, vous pouvez tout faire à travers un seul. Mais c'est le coût de l'automatisation. Il est peu probable que cela ralentisse considérablement l'exécution du programme, mais si nécessaire, vous pouvez toujours «terminer» le sous-programme pour vos besoins privés.

Vous pouvez initialiser plusieurs champs à la fois, et dans certaines conditions, spécifier des constantes (par exemple sy-langu, qui est souvent utilisé lors du choix des textes). Dans l'exemple standard, les noms de l'UE sont sélectionnés conformément au tableau T006A.

Lors de la génération du code, un lien est également créé par lequel l'exemple créé peut être ouvert dans le navigateur.

Actuellement, il existe plusieurs modèles dans le générateur:

  1. Définissez la structure [+ type de table] - définissez la structure + type de table + table de ce type + espace de travail de table + symbole de champ de la table. Ce n'est pas toujours nécessaire, mais il est plus facile de supprimer celui généré que de le taper manuellement
  2. La suppression d'enregistrements en double de la table interne par champs est un générateur très simple et en général, un tel code peut être écrit manuellement, mais s'il y a beaucoup de champs, alors, à mon avis, il est préférable d'utiliser ce modèle
  3. Sélectionnez des valeurs de référence dans la table de base de données - le modèle décrit ci-dessus
  4. Sélectionnez des valeurs de référence - le modèle vous permet de définir des valeurs de champ via un appel à FM, sous-programmes. Dans ce cas, les appels sont mis en cache.
  5. Sélectionnez des valeurs de référence dans le domaine - ce modèle n'a pas de paramètres et a été ajouté pour pouvoir simplement copier ce code dans votre programme

Je pense qu'une description détaillée du fonctionnement de chaque modèle n'a pas de sens, car il est plus facile de voir le résultat de son travail sur le site . Chaque modèle a des valeurs par défaut pour ses paramètres et si vous êtes un développeur abap, vous comprendrez rapidement le code.

Source: https://habr.com/ru/post/fr426967/


All Articles