Dołączanie niepustych wierszy do itab z operatorem COND
Mam wewnętrzną tabelę, w której muszę przenosić pozycje na podstawie wartości na 3 zmiennych za pomocą operatora wartości.
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 ) ) ).
Tutaj lv_var_3 jest pusty. Dla mnie, gdy jakakolwiek zmienna jest pusta, nie powinna nawet tworzyć wiersza w lt_table.
Jak mogę to osiągnąć?
Odpowiedzi
Bezpośrednią odpowiedzią na twoje pytanie jest użycie LINES OFtak, aby dołączyć dowolną liczbę wierszy z pośredniej tabeli wewnętrznej, która może być potencjalnie pusta (dodano 0 linii) lub nie (dowolna liczba linii, w twoim przypadku 1 linia):
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 ) ) ) ) ).
Ale możesz zdać sobie sprawę, że kod nie jest czytelny, możliwe są inne kody, takie jak dodanie wszystkich wierszy, a następnie usunięcie początkowych wierszy:
DATA(lt_table) = VALUE ty_table(
( lv_var_1 ) ( lv_var_2 ) ( lv_var_3 ) ).
DELETE lt_table WHERE table_line IS INITIAL.
Lub ta sama zasada, ale mniej czytelna w przypadku wyrażeń konstruktora:
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> ) ).
Lub inna możliwość jak pierwsza, ale bez powtarzania nazw zmiennych:
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->* ) ) ) ) ).