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
相关产品推荐
相关产品推荐

