Anhängen nicht leerer Zeilen an itab mit dem Operator COND

Dec 11 2020

Ich habe eine interne Tabelle, in der ich Werbebuchungen basierend auf dem Wert für 3 Variablen mit dem Wertoperator verschieben muss.

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 ) ) ). 

Hier ist lv_var_3 leer. Wenn eine Variable leer ist, sollte sie für mich nicht einmal eine Zeile in der lt_table erstellen.

Wie kann ich das erreichen?

Antworten

3 SandraRossi Dec 11 2020 at 22:26

Die direkte Antwort auf Ihre Frage besteht darin LINES OF, eine beliebige Anzahl von Zeilen aus einer internen Zwischentabelle anzuhängen, die möglicherweise leer sein kann (0 Zeilen hinzugefügt) oder nicht (beliebig viele Zeilen, in Ihrem Fall 1 Zeile):

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 ) ) ) ) ).

Möglicherweise stellen Sie jedoch fest, dass der Code nicht lesbar ist. Andere Codes sind möglich, z. B. das Hinzufügen aller Zeilen und das Löschen der Anfangszeilen:

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

Oder das gleiche Prinzip, aber mit Konstruktorausdrücken weniger lesbar:

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> ) ).

Oder eine andere Möglichkeit wie die erste, ohne jedoch die Variablennamen zu wiederholen:

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->* ) ) ) ) ).