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

如何关联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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:36:03