FOR 表达式和 let 表达式过滤内部 table
FOR expression and let expression to filter an internal table
我编写了以下代码行
DATA(lt_heads_ok) = VALUE my_head_table( for wa IN g_heads
LET ok = g_model->is_head_ok( wa-id )
IN ( COND #( WHEN ok = abap_true THEN wa ) ) ).
我可以激活它,但结果对我来说似乎很奇怪。
事实上,我得到了所有的行,但空行是 none 根据我的条件,它们是有效的。
有没有办法避免在不符合"COND"条件时追加空行?
可以通过两种方式在 FOR 迭代中有条件地添加行。请注意,即使未使用 LET
也会出现相同的问题。
第一种方法是使用LINES OF
:
CLASS lcl_app DEFINITION.
PUBLIC SECTION.
CLASS-METHODS is_ok IMPORTING sflight TYPE sflight RETURNING VALUE(result) TYPE abap_bool.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
METHOD is_ok.
IF sflight-seatsmax - sflight-seatsocc > 10. result = abap_true. ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
TYPES ty_sflights TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
SELECT * FROM sflight INTO TABLE @DATA(sflights).
DATA(sflights_filtered) = VALUE ty_sflights(
FOR <sflight> IN sflights
( LINES OF COND #(
WHEN lcl_app=>is_ok( <sflight> ) = abap_true
THEN VALUE #( ( <sflight> ) ) ) ) ).
第二种方法是使用REDUCE
:
DATA(sflights_filtered) = REDUCE #(
INIT aux_sflights TYPE ty_sflights
FOR <sflight> IN sflights
NEXT aux_sflights = COND #(
WHEN lcl_app=>is_ok( <sflight> ) = abap_true
THEN VALUE #( BASE aux_sflights ( <sflight> ) )
ELSE aux_sflights ) ).
我编写了以下代码行
DATA(lt_heads_ok) = VALUE my_head_table( for wa IN g_heads
LET ok = g_model->is_head_ok( wa-id )
IN ( COND #( WHEN ok = abap_true THEN wa ) ) ).
我可以激活它,但结果对我来说似乎很奇怪。 事实上,我得到了所有的行,但空行是 none 根据我的条件,它们是有效的。
有没有办法避免在不符合"COND"条件时追加空行?
可以通过两种方式在 FOR 迭代中有条件地添加行。请注意,即使未使用 LET
也会出现相同的问题。
第一种方法是使用LINES OF
:
CLASS lcl_app DEFINITION.
PUBLIC SECTION.
CLASS-METHODS is_ok IMPORTING sflight TYPE sflight RETURNING VALUE(result) TYPE abap_bool.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
METHOD is_ok.
IF sflight-seatsmax - sflight-seatsocc > 10. result = abap_true. ENDIF.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
TYPES ty_sflights TYPE STANDARD TABLE OF sflight WITH DEFAULT KEY.
SELECT * FROM sflight INTO TABLE @DATA(sflights).
DATA(sflights_filtered) = VALUE ty_sflights(
FOR <sflight> IN sflights
( LINES OF COND #(
WHEN lcl_app=>is_ok( <sflight> ) = abap_true
THEN VALUE #( ( <sflight> ) ) ) ) ).
第二种方法是使用REDUCE
:
DATA(sflights_filtered) = REDUCE #(
INIT aux_sflights TYPE ty_sflights
FOR <sflight> IN sflights
NEXT aux_sflights = COND #(
WHEN lcl_app=>is_ok( <sflight> ) = abap_true
THEN VALUE #( BASE aux_sflights ( <sflight> ) )
ELSE aux_sflights ) ).