COND演算子を使用して空でない行をitabに追加する

Dec 11 2020

value演算子を使用して、3つの変数の値に基づいてラインアイテムを移動する必要がある内部テーブルがあります。

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

ここでは、lv_var_3は空です。私にとって、変数が空の場合、lt_tableに行を作成することすらすべきではありません。

どうすればこれを達成できますか?

回答

3 SandraRossi Dec 11 2020 at 22:26

あなたの質問への直接の答えはLINES OF、中間内部テーブルから任意の数の行を追加するために使用することです。これは、空になる可能性がある(0行が追加される)か、そうでない(任意の数の行、この場合は1行)可能性があります。

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

しかし、コードが判読できないことに気付くかもしれません。すべての行を追加してから最初の行を削除するなど、他のコードも可能です。

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

または、同じ原則ですが、コンストラクター式では読みにくくなります。

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

または、最初のような別の可能性がありますが、変数名を繰り返さないでください。

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