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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:54:03