Abap 与动态内部表一起使用
我想将下面的方法转换为嵌套FOR而不是嵌套循环,但我不知道如何做,因为内部表是动态的(它可以是5种不同类型中的一种)Abap 与动态内部表一起使用,abap,Abap,我想将下面的方法转换为嵌套FOR而不是嵌套循环,但我不知道如何做,因为内部表是动态的(它可以是5种不同类型中的一种) 所以问题是:是否可以将FOR iterator(作为第二种方法)与动态表一起使用?我的答案是针对ABAP 7.52检查的。不幸的是,目前只能通过在构造表达式(包括“FOR”)内部使用LET=writable_expression来使用ASSIGN静态变量的子集,其中“writable expression”仅限于表表达式NEW和CAST。因此它是相当有限的,对于ASSIGN的动态
所以问题是:是否可以将FOR iterator(作为第二种方法)与动态表一起使用?我的答案是针对ABAP 7.52检查的。不幸的是,目前只能通过在构造表达式(包括“
FOR
”)内部使用LET=writable_expression来使用ASSIGN
静态变量的子集,其中“writable expression”仅限于表表达式NEW和CAST。因此它是相当有限的,对于ASSIGN
的动态变量没有等价性,因此您只能使用变通方法
后面的语法允许动态表达式,因此可以输入WHERE('LGART=KNOWN\u LINE-LGART')
。但是,如果循环嵌套在另一个循环中(就像在您的例子中一样),那么它可能会非常不利,因此应该定义一个索引以加速迭代。如果要使用辅助索引,则条件应为使用键('KEYNAME'),其中('LGART=KNOWN\u LINE-LGART')
现在,针对您的特定情况,这里有一个变通方法:静态定义组件的名称,因此一种可能是使用这些组件名称定义静态结构,并使用构造操作符。请注意,我没有测试它,但我认为由于几个原因,在您的情况下,使用对应的
比使用分配
的性能更快
下面的代码应该可以工作。我假设
后面的内部表有一个按LGART
排序的主键(使用非唯一键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.
类型:从结构开始,
lgart类型字符串,
betrg类型字符串,
betpe类型字符串,
结构结束。
已知的表=值((lgart='A')(lgart='B'))。
另外,表=值((lgart='A')(lgart='C')(lgart='A'))。
将已知的表也分配给。
附加行
结果的价值(
对于已知_表中的已知_行
因为
其中('LGART=KNOWN\u LINE-LGART')
设struc=IN中相应的ty_struc()
(lgart=已知的\u线-lgart
betrg=结构betrg
betpe=struc betpe)
查看mt_期间的结果。
您能否简化您的答案,以便用另一个代码提供答案。谢谢。你好,桑德拉,我删除了所有我认为不必要的行。现在理解更好吗?谢谢另外,正如您提到的,WHERE后面的语法允许动态表达式
,这也有助于解决这个问题,因为我可以编写一个合适的WHERE子句,而不是执行所有的动态赋值和检查。尽管如此,使用FOR的选项使它更干净,所以这就是我将使用的(至少在我编写一个迫使我使用其他选项的性能比较之前)
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.
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.