如何关联VBFA与VBRK表查询筛选NETWR不为0的SD凭证
可以直接合并为单次关联查询实现,性能比拆分查询、LOOP遍历都更优,推荐写法如下:
SELECT DISTINCT v~* FROM vbfa AS v INNER JOIN vbrk AS b ON b~vbeln = v~vbeln INTO TABLE gt_vbfa_inv FOR ALL ENTRIES IN gt_vbak WHERE v~vbelv = gt_vbak-vbeln AND v~vbtyp_n IN ('M', 'O', 'P', '5', '6') AND v~stufe = '00' AND b~netwr NE 0 AND NOT EXISTS ( SELECT * FROM vbfa WHERE vbelv = v~vbeln AND posnv = v~posnn AND vbtyp_n IN ('N', 'S') AND stufe = '00' ).
逻辑说明
- 用
INNER JOIN关联VBFA和VBRK,直接在查询层加入netwr NE 0的过滤,省去中间内表gt_vbfa_inv的二次查询步骤 - 保留了你原有NOT EXISTS子查询逻辑,过滤存在后续冲销/取消凭证的记录
- 加入
DISTINCT避免同一张VBRK对应多条VBFA记录时产生重复,和你原有第二次查询的逻辑对齐
如果你的系统是较旧版本,不支持FOR ALL ENTRIES和JOIN混用,可以用简化的二次过滤写法,不需要写LOOP遍历:
* 先查符合基础条件的VBFA记录 SELECT * FROM vbfa AS v INTO TABLE @gt_vbfa_inv FOR ALL ENTRIES IN @gt_vbak WHERE vbelv = @gt_vbak-vbeln AND vbtyp_n IN ('M', 'O', 'P', '5', '6') AND stufe = '00' AND NOT EXISTS ( SELECT * FROM vbfa WHERE vbelv = v~vbeln AND posnv = v~posnn AND vbtyp_n IN ('N', 'S') AND stufe = '00' ). IF sy-subrc = 0. * 直接过滤掉对应VBRK净价值为0的记录,不需要额外查询存储gt_vbrk DELETE gt_vbfa_inv WHERE vbeln NOT IN ( SELECT vbeln FROM vbrk WHERE netwr NE 0 ). ENDIF.
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

