You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ABAP二级FOR循环无法访问外层变量I的问题求解

问题:ABAP内表构造器中外层循环变量无法在WHERE子句使用的解决办法

代码片段

TYPES: BEGIN OF ty_table_line,
         idx   TYPE i,
         posnr TYPE i,
         quan  TYPE i,
       END OF ty_table_line,
       ty_internal_table TYPE SORTED TABLE OF ty_table_line WITH UNIQUE KEY idx.

DATA(lt_set) = VALUE ty_internal_table( ( idx = 1 posnr = 1 quan = 2 )
                                        ( idx = 2 posnr = 1 quan = 40 )
                                        ( idx = 3 posnr = 1 quan = 10 )
                                        ( idx = 4 posnr = 1 quan = 88 ) ).

DATA(lt_set_2) = VALUE ty_internal_table(
      FOR i = 0 WHILE i <= 4
      ( LINES OF VALUE #( FOR <line> IN lt_set[]
                          WHERE ( idx = i + 1 )
                          ( <line> ) ) ) ).

报错信息

The variable "I" cannot be used here.

解决方法

原因说明

ABAP表构造器中,FOR ... IN ... WHERE的WHERE子句属于表表达式的局部作用域,只能访问当前循环的行变量(如<line>),无法直接引用外层FOR循环的迭代变量(如i)。

方案1:使用FILTER函数替代内层WHERE子句

FILTER函数的作用域支持访问外层变量,可以直接用它过滤内表数据,替代内层的循环+WHERE结构:

DATA(lt_set_2) = VALUE ty_internal_table(
      FOR i = 0 WHILE i <= 4
      ( LINES OF FILTER #( lt_set[] WHERE ( idx = i + 1 ) ) ) ).

方案2:用IF/ WHEN替代WHERE子句

在内层循环体中使用IF或WHEN判断条件,即可访问外层的i变量:

DATA(lt_set_2) = VALUE ty_internal_table(
      FOR i = 0 WHILE i <= 4
      ( FOR <line> IN lt_set[]
          ( WHEN idx = i + 1 THEN <line> ) ) ).

或者IF写法:

DATA(lt_set_2) = VALUE ty_internal_table(
      FOR i = 0 WHILE i <= 4
      ( FOR <line> IN lt_set[]
          ( IF idx = i + 1 THEN <line> ) ) ).

说明

两种方案中,FILTER函数的写法更简洁高效,它直接基于内表进行过滤操作,避免了多余的循环遍历。

内容的提问来源于stack exchange,提问作者isekaid_maou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:45:39