使用 COND 运算符将非空行附加到 itab
Appending non-empty lines to itab with COND operator
我有一个内部 table,其中我必须使用值运算符根据 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.
我怎样才能做到这一点?
您问题的直接答案是使用 LINES OF
以便从中间内部 table 追加任意数量的行,这些行可能为空(添加 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->* ) ) ) ) ).
我有一个内部 table,其中我必须使用值运算符根据 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.
我怎样才能做到这一点?
您问题的直接答案是使用 LINES OF
以便从中间内部 table 追加任意数量的行,这些行可能为空(添加 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->* ) ) ) ) ).