Использование FOR с динамической внутренней таблицей - PullRequest
2 голосов
/ 25 сентября 2019

Я бы хотел преобразовать приведенный ниже метод во вложенный FOR вместо вложенного LOOP, но я не знаю, как это сделать, поскольку внутренняя таблица является динамической (это может быть один из 5 различных типов).

TYPES: BEGIN OF ty_result,
         lgart TYPE string,
         betrg TYPE string,
         betpe TYPE string,
       END OF ty_result,
       ty_results TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY.
DATA: known_table       TYPE ty_results,
      also_known_table  TYPE ty_results,
      mt_period_results TYPE ty_results.

FIELD-SYMBOLS: <dynamic_table> TYPE STANDARD TABLE,
               <betrg>, <betpe>, <lgart>.

LOOP AT known_table REFERENCE INTO DATA(known_line).

  READ TABLE <dynamic_table> TRANSPORTING NO FIELDS WITH KEY ('LGART') = known_line->*-lgart.

  IF sy-subrc <> 0. CONTINUE. ENDIF.

  DATA(lv_tabix) = sy-tabix.

  LOOP AT <dynamic_table> ASSIGNING FIELD-SYMBOL(<dynamic_line>) FROM lv_tabix.

    UNASSIGN: <betrg>, <betpe>, <lgart>.

    ASSIGN COMPONENT: 'BETPE' OF STRUCTURE <dynamic_line> TO <betpe>,
                      'BETRG' OF STRUCTURE <dynamic_line> TO <betrg>,
                      'LGART' OF STRUCTURE <dynamic_line> TO <lgart>.


    IF <lgart> <> known_line->*-lgart.
      EXIT.
    ENDIF.

    APPEND VALUE ty_result( lgart = <lgart>
                            betrg = <betrg>
                            betpe = <betpe> ) TO mt_period_results.

  ENDLOOP.
ENDLOOP.

Когда внутренняя таблица не является динамической, я могу сделать это следующим образом:

 append lines of value zwta_t_results(
   for known_line in known_table
    for also_known_line  in also_known_table 
      where ( lgart = known_line-lgart )
        ( lgart = known_line-lgart
          betrg = also_known_line-betrg
          betpe = also_known_line-betpe ) to mt_period_results.

Так что вопрос: можно ли использовать итератор FOR (в качестве второго метода) сдинамическая таблица?

1 Ответ

2 голосов
/ 25 сентября 2019

Мой ответ был проверен на ABAP 7.52.К сожалению, в настоящее время возможно использовать только подмножество статического варианта ASSIGN, используя LET <fs> = writable_expression IN внутри выражения конструкции (включая «FOR» итерации таблицы ), где «записываемое выражение»ограничивается табличным выражением, NEW и CAST.Так что он довольно ограничен, нет эквивалентов для динамических вариантов ASSIGN, поэтому вы можете использовать только обходные пути.

Синтаксис после WHERE допускает динамическое выражение, поэтомуможно будет ввести WHERE ('LGART = KNOWN_LINE-LGART').Однако это может быть очень неэффективно, если цикл вложен в другой цикл (как в вашем случае), поэтому следует определить индекс, чтобы ускорить итерацию.Если должен использоваться вторичный индекс, то условие должно быть USING KEY ('KEYNAME') WHERE ('LGART = KNOWN_LINE-LGART').

Теперь вот обходной путь для вашего конкретного случая: вы статически определяете имена компонентов, поэтому одна возможность состоит в том, чтобы определитьстатическая структура с именами этих компонентов и использование оператора построения CORRESPONDING.Обратите внимание, что я не тестировал его, но я думаю, что по нескольким причинам производительность использования CORRESPONDING в вашем случае выше, чем при использовании ASSIGN.

Следующий код должен работать.Я предполагаю, что внутренняя таблица за <dynamic_table> имеет первичный ключ, отсортированный по LGART (TYPE SORTED TABLE OF ... WITH NON-UNIQUE KEY lgart), так что производительность хорошая:

TYPES: BEGIN OF ty_struc,
         lgart TYPE string,
         betrg TYPE string,
         betpe TYPE string,
       END OF ty_struc.

known_table = VALUE #( ( lgart = 'A' ) ( lgart = 'B' ) ).
also_known_table = VALUE #( ( lgart = 'A' ) ( lgart = 'C' ) ( lgart = 'A' ) ).
ASSIGN also_known_table TO <dynamic_table>.

APPEND LINES OF
    VALUE ty_results(
      FOR known_line IN known_table
        FOR <inner_line> IN <dynamic_table>
          WHERE ('LGART = KNOWN_LINE-LGART')
          LET struc = CORRESPONDING ty_struc( <inner_line> ) IN
          ( lgart = known_line-lgart
            betrg = struc-betrg
            betpe = struc-betpe ) )
    TO mt_period_results.
...