如何在Open SQL语句的JOIN ON条件中使用子串截取功能?
ABAP Open SQL 单调用查询实现方案
问题背景
需要查询采购凭证历史表EKBE的相关数据,目标是仅通过一次数据库调用完成查询,首次编写的SQL执行报错:
SELECT po~menge, po~vgabe FROM ekbe as po JOIN ekbe as dlv ON dlv~ebeln = po~ebeln AND dlv~buzei = po~ebelp+1(4) WHERE dlv~belnr = @nast-objky(10) AND dlv~buzei = @nast-objky+12(4) AND po~vgabe IN ('1', '8') INTO TABLE @DATA(lt_orders).
报错原因:po~ebelp+1(4) 语法错误,EBELP字段长度为5位,BUZEI字段长度为4位,原错位偏移关联的逻辑本身不成立。
初始替代实现(两次数据库调用)
通过两次查询配合FOR ALL ENTRIES语法可以实现需求,代码如下:
SELECT ebeln, ebelp FROM ekbe WHERE belnr = @nast-objky(10) AND buzei = @nast-objky+12(4) INTO TABLE @DATA(t_po). SELECT menge, vgabe FROM ekbe FOR ALL ENTRIES IN @t_po WHERE ebeln = @t_po-ebeln AND ebelp = @t_po-ebelp AND vgabe IN ('1', '8') INTO TABLE @DATA(t_orders).
最终正确单调用实现
后续修正关联逻辑错误后,无需错位偏移,直接通过相同EBELN、EBELP关联即可实现一次调用完成查询,正确代码如下:
SELECT po~menge, po~vgabe FROM ekbe as po JOIN ekbe as dlv ON dlv~ebeln = po~ebeln AND dlv~ebelp = po~ebelp WHERE dlv~belnr = @nast-objky(10) AND dlv~buzei = @nast-objky+12(4) AND po~vgabe IN ('1', '8') INTO TABLE @DATA(lt_orders).
内容的提问来源于stack exchange,提问作者kdobrev
相关产品推荐
相关产品推荐

