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

