Ajout de lignes non vides à itab avec l'opérateur COND

Dec 11 2020

J'ai une table interne dans laquelle je dois déplacer des éléments de ligne en fonction de la valeur de 3 variables à l'aide de l'opérateur de valeur.

types: 
 ty_table type standard table of string with default key.

Data(Lv_var_1) = 'LINE 1'.
Data(Lv_var_2) = 'LINE 2'.
Data(Lv_var_3) = ''.

data(lt_table) = value ty_table( ( cond #( WHEN lv_var_1 is not initial THEN lv_var_1 ) )
                                 ( cond #( WHEN lv_var_2 is not initial THEN lv_var_2 ) )
                                 ( cond #( WHEN lv_var_3 is not initial THEN lv_var_3 ) ) ). 

Ici, lv_var_3 est vide. Pour moi, lorsqu'une variable est vide, elle ne devrait même pas créer de ligne dans la table lt_table.

Comment puis-je atteindre cet objectif?

Réponses

3 SandraRossi Dec 11 2020 at 22:26

La réponse directe à votre question est d'utiliser de LINES OFmanière à ajouter un nombre arbitraire de lignes à partir d'une table interne intermédiaire, qui peut être potentiellement vide (0 ligne ajoutée) ou non (n'importe quel nombre de lignes, dans votre cas 1 ligne):

types:
 ty_table type standard table of string with default key.

Data(Lv_var_1) = `LINE 1`.
Data(Lv_var_2) = `LINE 2`.
Data(Lv_var_3) = ``.

data(lt_table) = value ty_table(
    ( LINES OF cond ty_table( WHEN lv_var_1 is not initial THEN VALUE #( ( lv_var_1 ) ) ) )
    ( LINES OF cond ty_table( WHEN lv_var_2 is not initial THEN VALUE #( ( lv_var_2 ) ) ) )
    ( LINES OF cond ty_table( WHEN lv_var_3 is not initial THEN VALUE #( ( lv_var_3 ) ) ) ) ).

Mais vous vous rendez compte que le code n'est pas lisible, d'autres codes sont possibles comme l'ajout de toutes les lignes puis la suppression des lignes initiales:

DATA(lt_table) = VALUE ty_table(
  ( lv_var_1 ) ( lv_var_2 ) ( lv_var_3 ) ).
DELETE lt_table WHERE table_line IS INITIAL.

Ou le même principe mais moins lisible avec les expressions constructeurs:

Data(lt_table) = value ty_table(
    FOR <line> IN VALUE ty_table( ( lv_var_1 ) ( lv_var_2 ) ( lv_var_3 ) )
    WHERE ( table_line IS NOT INITIAL )
    ( <line> ) ).

Ou une autre possibilité comme la première, mais sans répéter les noms des variables:

TYPES ty_vars TYPE STANDARD TABLE OF REF TO string WITH EMPTY KEY.
DATA(lt_table) = VALUE ty_table(
  FOR var IN VALUE ty_vars( ( REF #( lv_var_1 ) ) ( REF #( lv_var_2 ) ) ( REF #( lv_var_3 ) ) )
  ( LINES OF COND ty_table( WHEN var->* NE `` THEN VALUE #( ( var->* ) ) ) ) ).