FOR表达式,让let表达式过滤内部表

时间:2018-10-04 11:02:18

标签: sap abap

我编写了以下代码行

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

我可以激活它,但结果对我来说似乎很奇怪。 确实我得到了所有行,但是根据我的条件,空行都不是有效的。

是否有一种方法可以避免在不符合“ COND”条件的情况下添加空行?

1 个答案:

答案 0 :(得分:1)

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