Abap 与动态内部表一起使用

Abap 与动态内部表一起使用,abap,Abap,我想将下面的方法转换为嵌套FOR而不是嵌套循环,但我不知道如何做,因为内部表是动态的(它可以是5种不同类型中的一种) 所以问题是:是否可以将FOR iterator(作为第二种方法)与动态表一起使用?我的答案是针对ABAP 7.52检查的。不幸的是,目前只能通过在构造表达式(包括“FOR”)内部使用LET=writable_expression来使用ASSIGN静态变量的子集,其中“writable expression”仅限于表表达式NEW和CAST。因此它是相当有限的,对于ASSIGN的动态

我想将下面的方法转换为嵌套FOR而不是嵌套循环,但我不知道如何做,因为内部表是动态的(它可以是5种不同类型中的一种)


所以问题是:是否可以将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.