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

使用REDUCE构造动态查询条件时报String calculation not permitted here错误

问题原因

  • 类型不匹配错误:你用REDUCE指定的返回类型是自定义结构体ty_whr,但NEXT分支直接返回字符串拼接结果,无法直接赋值给结构体,所以触发String calculation not permitted here报错。
  • 拼接逻辑错误:你当前的写法每次直接覆盖whereclause的值,之前拼接的条件会被完全覆盖,最终只能得到最后一个字段的筛选条件,无法得到多条件用AND拼接的结果。
  • 动态WHERE入参格式错误:ABAP 动态SELECT的WHERE条件如果使用内表传入,标准行类型是长度为72的字符型,不需要自定义结构体。

修正方案

方案1:拼接为单个WHERE条件字符串

TYPES: BEGIN OF ty_whr,
         fieldname TYPE string,
       END OF ty_whr.

DATA(lt_fields) = VALUE rsds_frange_t( ).
" 先把条件拼接为字符串
DATA(lv_where_str) = REDUCE string(
                       INIT cond = ``
                       FOR <fields> IN lt_fields
                       NEXT cond = COND #( 
                                      WHEN cond IS NOT INITIAL
                                      THEN cond && <fields>-fieldname && | IN @| && <fields>-fieldname && | AND |
                                      ELSE <fields>-fieldname && | IN @| && <fields>-fieldname
                                    ) ).
" 赋值到结构体
DATA(ls_where) = VALUE ty_whr( fieldname = lv_where_str ).

方案2:生成标准动态WHERE条件内表(更推荐,避免长度溢出)

DATA: lt_where TYPE STANDARD TABLE OF string WITH EMPTY KEY.

LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<fields>).
  IF sy-tabix <> 1.
    APPEND `AND ` TO lt_where.
  ENDIF.
  APPEND |{ <fields>-fieldname } IN @{ <fields>-fieldname }| TO lt_where.
ENDLOOP.

生成的lt_where可以直接放到动态SELECT的WHERE (lt_where)语法中使用。

内容的提问来源于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:24:03