ABAP SQL WHERE子句使用内表日期结合BETWEEN运算符报错如何解决
问题原因
ABAP 内置d类型是8位字符结构存储的日期值,Open SQL 执行内表关联查询时,内表字段和数据库表DATS类型字段的隐式类型转换不符合数据库运算符的要求,要么触发类型不匹配报错,要么转换后的值异常导致查询结果错误。
可行解决方案
- 方案1:显式转换字段类型(推荐,无需修改原有内表定义)
在WHERE子句中用CAST将内表日期字段强制转换为数据库兼容的DATS类型,代码示例:SELECT * FROM FPLT INNER JOIN @it_openprd AS OP ON FPLT~TETXT = OP~TETXT WHERE FPLT~FKDAT BETWEEN CAST( OP~fromdate AS DATS ) AND CAST( OP~todate AS DATS ) AND FPLT~NFDAT BETWEEN CAST( OP~fromdate AS DATS ) AND CAST( OP~todate AS DATS ) INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_result). - 方案2:替换为
FOR ALL ENTRIES IN语法(兼容性最好)
内表关联的类型匹配规则比FOR ALL ENTRIES更严格,换成该语法可以规避大多数类型适配问题,注意使用前必须判断内表非空,否则会返回所有FPLT条目:IF it_openprd IS NOT INITIAL. SELECT * FROM FPLT FOR ALL ENTRIES IN @it_openprd WHERE TETXT = @it_openprd-TETXT AND FKDAT BETWEEN @it_openprd-fromdate AND @it_openprd-todate AND NFDAT BETWEEN @it_openprd-fromdate AND @it_openprd-todate INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_result). ENDIF. - 方案3:修改内表结构字段类型
将内表的日期字段直接声明为ABAP字典类型DATS,而非ABAP内置d类型,Open SQL对字典类型的适配性更高,修改后原来的关联查询代码可以直接运行:TYPES: BEGIN OF s_openprd, TETXT TYPE TETXT, fromdate TYPE DATS, " 替换原来的TYPE d todate TYPE DATS, " 替换原来的TYPE d END OF s_openprd. DATA: it_openprd TYPE TABLE OF s_openprd WITH KEY TETXT.
如果需要排查问题可以用ST05开启SQL跟踪,查看实际传递到数据库的条件值,确认日期转换是否符合预期。
内容的提问来源于stack exchange,提问作者Cutter
相关产品推荐
相关产品推荐

