User Tools

Site Tools


abap:dynamic_programming

This is an old revision of the document!


Programmation dynamique

La programmation dynamique en ABAP est un art particulier qui requiert acrobaties et équilibrismes…

Les field-symbols

L'élément central de la programmation dynamique : les field-symbols.

/!\ Ne pas tenter de manipuler un field-symbol non assigné, sinon gare au GETWA_NOT_ASSIGNED ! /!\

Déclaration

  FIELD-SYMBOLS : <et_plip> TYPE STANDARD TABLE, " Table
                  <ls_plop> TYPE any, " Whatever
                  <fs1>. "Whatever, short form...

Assignation

ASSIGN ls_plop TO <ls_plop>. "Var
ASSIGN et_plip[] TO <et_plip>[]. "Table content

Typage dynamique

Au delà de l'assignation de field-symbols depuis des sources instanciées et typées (même si le type peut ne pas être connu à l'avance), il faut aussi parfois pouvoir manipuler des données qui vont être crées lors de l'exécution et dont le type est inconnu à l'avance. Pour cela il va falloir recourir à des commandes particulières et à des fonctions qui vont puiser des informations directement auprès du kernel (autrefois des FM ALV, aujourd'hui des classes dédiées).

Typage par comparaison

DATA: dy_line  TYPE REF TO data.
 
CREATE DATA dy_line LIKE LINE OF <et_plip>.
ASSIGN dy_line->* TO <les_plop>.

Jouer avec les composants d'une structure

Exemple pratique : un MOVE-CORRESPONDING dynamique (agnostique sur la structure d'entrée comme de sortie) !

DATA:  ls_line TYPE abap_compdescr.
  REFRESH <et_plip>.
  LOOP AT lit_ausp ASSIGNING <ls_ausp>.
    " Get output structure components
    descr_ref ?= cl_abap_typedescr=>describe_by_data( <ls_ausp> ).
    LOOP AT  descr_ref->components INTO ls_line.
      ASSIGN COMPONENT ls_line-name OF STRUCTURE <ls_ausp> TO <fs1>.
      IF sy-subrc NE 0.
        EXIT.
      ENDIF.
      ASSIGN COMPONENT ls_line-name OF STRUCTURE <ls_plop> TO <fs2>.
      IF sy-subrc = 0.
        <fs2> = <fs1>.
      ENDIF.
    ENDLOOP.
    APPEND <ls_plop> TO <et_plip>.
  ENDLOOP.

Note : il est évidemment possible d'enrichir ce code avec des fonctionnalités pour par exemple ne pas transporter les champs vides de la structure 1 vers la 2 ou encore faire des transcos au passage…

abap/dynamic_programming.1418667558.txt.gz · Last modified: 2014/12/15 19:19 by ginko