SAP中EKKO、EKPO与EKBE表的正确连接逻辑及收货数据获取
SAP中EKKO、EKPO、EKBE三张表的正确连接逻辑
表关联基础
三张表的核心关联规则:
- EKKO(采购订单抬头)与EKPO(采购订单行项目):通过**EBELN(采购订单编号)**关联,一个抬头对应多个行项目。
- EKPO与EKBE(采购订单历史记录):通过**EBELN(采购订单编号) + EBELP(行项目号)**关联,一个行项目可对应多条历史记录(如多次收货、发票校验)。
你的当前代码问题
你使用LEFT JOIN EKBE后在WHERE子句过滤EKBE.BEWTP = 'E',这会把原本LEFT JOIN保留的“无收货的采购订单行项目”全部过滤掉,实际效果等同于INNER JOIN EKBE。如果需求是仅获取有收货记录的行项目,结果没问题,但写法不够严谨;如果要保留所有行项目并显示对应收货(无收货则为空),这个逻辑就错误了。
针对“获取采购订单下所有收货记录”的正确写法
场景1:仅获取存在收货记录的采购订单及对应收货
SELECT "required columns" FROM EKKO INNER JOIN EKPO ON EKKO.EBELN = EKPO.EBELN INNER JOIN EKBE ON EKPO.EBELN = EKBE.EBELN AND EKPO.EBELP = EKBE.EBELP AND EKBE.BEWTP = 'E' -- E代表收货(Goods Receipt)
场景2:保留所有采购订单行项目,同时关联对应收货记录(无收货则显示空)
SELECT "required columns" FROM EKKO INNER JOIN EKPO ON EKKO.EBELN = EKPO.EBELN LEFT JOIN EKBE ON EKPO.EBELN = EKBE.EBELN AND EKPO.EBELP = EKBE.EBELP AND EKBE.BEWTP = 'E' -- 将收货类型过滤放在JOIN条件中,而非WHERE
补充说明
BEWTP = 'E'是SAP标准的收货交易类型,若需更精准区分收货场景,可结合EKBE.VGABE字段(如VGABE = 1代表入库收货)。
内容的提问来源于stack exchange,提问作者Sanjai Palliyil
相关产品推荐
相关产品推荐

