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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:36:05