Выражение FOR и выражение let для фильтрации внутренней таблицы - PullRequest
0 голосов
/ 04 октября 2018

Я кодировал следующую строку кода

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 голосов
/ 04 октября 2018

Добавление строк условно в итерации 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 ) ).
...