将 FOR 与动态内部 table 一起使用?
Using FOR with a dynamic internal table?
我想将下面的方法转换为嵌套的 FOR 而不是嵌套的 LOOP,但我不知道该怎么做,因为内部 table 是动态的(它可以是 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.
当内部table不是动态的时候,我可以这样做:
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 迭代器(作为第二种方法)与动态 table 一起使用?
我的回答已针对 ABAP 7.52 检查。不幸的是,目前只能通过在构造表达式(包括“FOR
”table iterations)中使用 LET <fs> = writable_expression IN
来使用 ASSIGN
的静态变体的子集,其中 "writable expression" 仅限于 table 表达式、NEW 和 CAST。所以它相当有限,ASSIGN
的动态变体没有等效项,因此您只能使用变通方法。
WHERE
后的语法允许动态表达式,因此可以输入 WHERE ('LGART = KNOWN_LINE-LGART')
。但是,如果循环嵌套在另一个循环中(就像您的情况一样),它可能会非常不利,因此应该定义一个索引以加速迭代。如果要使用二级索引,那么条件应该是USING KEY ('KEYNAME') WHERE ('LGART = KNOWN_LINE-LGART')
.
现在,这是针对您的特定情况的解决方法:您静态定义组件的名称,因此一种可能性是使用这些组件名称定义静态结构并使用 CORRESPONDING
构造运算符。请注意,我没有对其进行测试,但我认为出于多种原因,在您的情况下使用 CORRESPONDING
的性能比使用 ASSIGN
.
更快
下面的代码应该可以工作。我假设<dynamic_table>
后面的内部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.
我想将下面的方法转换为嵌套的 FOR 而不是嵌套的 LOOP,但我不知道该怎么做,因为内部 table 是动态的(它可以是 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.
当内部table不是动态的时候,我可以这样做:
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 迭代器(作为第二种方法)与动态 table 一起使用?
我的回答已针对 ABAP 7.52 检查。不幸的是,目前只能通过在构造表达式(包括“FOR
”table iterations)中使用 LET <fs> = writable_expression IN
来使用 ASSIGN
的静态变体的子集,其中 "writable expression" 仅限于 table 表达式、NEW 和 CAST。所以它相当有限,ASSIGN
的动态变体没有等效项,因此您只能使用变通方法。
WHERE
后的语法允许动态表达式,因此可以输入 WHERE ('LGART = KNOWN_LINE-LGART')
。但是,如果循环嵌套在另一个循环中(就像您的情况一样),它可能会非常不利,因此应该定义一个索引以加速迭代。如果要使用二级索引,那么条件应该是USING KEY ('KEYNAME') WHERE ('LGART = KNOWN_LINE-LGART')
.
现在,这是针对您的特定情况的解决方法:您静态定义组件的名称,因此一种可能性是使用这些组件名称定义静态结构并使用 CORRESPONDING
构造运算符。请注意,我没有对其进行测试,但我认为出于多种原因,在您的情况下使用 CORRESPONDING
的性能比使用 ASSIGN
.
下面的代码应该可以工作。我假设<dynamic_table>
后面的内部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.