ABAP中REDUCE生成扁平结构而非内表的问题及代码修正问询
问题核心原因
你写的REDUCE代码存在两个核心错误:
- 返回类型定义错误:当前REDUCE指定的返回类型是单个结构
ty_whr,自然最终只能得到一行数据,需要改为返回对应类型的内表,和原始LOOP逻辑的输出类型匹配。 - 核心逻辑缺失:没有实现截取
fieldname前缀(去掉A~)的长度计算逻辑,也没有获取循环行索引来判断是否为最后一行的逻辑。
修正后的实现代码
方案1:和原LOOP输出一致,直接返回string_table类型
" 先获取总行数用于判断是否为最后一行 DATA(lv_total_lines) = lines( lt_fields ). DATA(lt_wherecondn) = REDUCE string_table( INIT condn_tab = VALUE string_table( ) " 初始化空的结果内表 FOR idx = 1 THEN idx + 1 " 记录当前循环的行索引,替代原LOOP的sy-tabix FOR <fields> IN lt_fields NEXT condn_tab = VALUE #( BASE condn_tab " 保留内表现有数据 ( COND #( " 用LET语法在表达式内定义临时变量计算截取长度 LET lv_len = strlen( <fields>-fieldname ) - 2 IN WHEN idx <> lv_total_lines THEN <fields>-fieldname+2(lv_len) && | IN | && |@| && <fields>-fieldname && | AND | ELSE <fields>-fieldname+2(lv_len) && | IN | && |@| && <fields>-fieldname ) ) ) ).
方案2:如果需要返回ty_whr类型的内表,调整返回类型即可
TYPES: BEGIN OF ty_whr, fieldname TYPE string, END OF ty_whr, tt_whr TYPE STANDARD TABLE OF ty_whr WITH EMPTY KEY. DATA(lv_total_lines) = lines( lt_fields ). DATA(lt_where) = REDUCE tt_whr( INIT whr_tab = VALUE tt_whr( ) FOR idx = 1 THEN idx + 1 FOR <fields> IN lt_fields NEXT whr_tab = VALUE #( BASE whr_tab ( fieldname = COND #( LET lv_len = strlen( <fields>-fieldname ) - 2 IN WHEN idx <> lv_total_lines THEN <fields>-fieldname+2(lv_len) && | IN | && |@| && <fields>-fieldname && | AND | ELSE <fields>-fieldname+2(lv_len) && | IN | && |@| && <fields>-fieldname ) ) ) ).
关键逻辑说明
FOR idx = 1 THEN idx + 1用来同步获取当前循环的行索引,功能和原LOOP里的sy-tabix完全一致。LET lv_len = ... IN是ABAP新语法支持的表达式内临时变量定义,你可以把原来的lv_length计算逻辑放在这里,不需要单独声明全局变量。BASE关键字是内表构造的增量追加语法,每次循环都会在原有内表的基础上新增一行,实现原APPEND语句的效果。
内容的提问来源于stack exchange,提问作者isekaid_maou
相关产品推荐
相关产品推荐

