COND 연산자를 사용하여 비어 있지 않은 줄을 itab에 추가

Dec 11 2020

값 연산자를 사용하여 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->* ) ) ) ) ).