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

FOR ALL ENTRIES搭配NOT EXISTS查询VBRK语法报错如何修正

错误原因

  • 你编写的NOT EXISTS子查询不符合ABAP OpenSQL语法规则:子查询内不允许使用INTO TABLE、FOR ALL ENTRIES关键字,且你当前的子查询逻辑和主查询没有关联,完全没必要用嵌套查询实现该过滤需求
  • 你原本的需求是过滤当前查询行的NETWR字段不为0,直接在主查询的WHERE条件中加对应过滤规则即可

方案1:直接在主查询加过滤条件(最推荐)

直接在WHERE子句补充netwr <> 0即可,代码如下:

" 先判断驱动内表非空,避免FOR ALL ENTRIES查询全表
IF gt_vbfa_inv IS NOT INITIAL.
  SELECT DISTINCT * 
    FROM vbrk 
    INTO TABLE gt_vbrk
    FOR ALL ENTRIES IN gt_vbfa_inv
    WHERE vbeln = gt_vbfa_inv-vbeln
      AND netwr <> 0. " 直接加过滤规则排除净值为0的条目
ENDIF.

方案2:查询后过滤内表

如果因为特殊场景不方便在查询时加过滤条件,也可以查询完后直接删除内表中符合条件的条目:

IF gt_vbfa_inv IS NOT INITIAL.
  SELECT DISTINCT * 
    FROM vbrk 
    INTO TABLE gt_vbrk
    FOR ALL ENTRIES IN gt_vbfa_inv
    WHERE vbeln = gt_vbfa_inv-vbeln.
ENDIF.

" 删除净价值为0的条目
DELETE gt_vbrk WHERE netwr = 0.

补充:正确的NOT EXISTS写法(适配需要关联其他表判断的场景)

如果你后续有需要通过子查询判断存在性的需求,正确的写法如下(示例为排除存在对应交货单净值为0的发票,仅作语法参考):

IF gt_vbfa_inv IS NOT INITIAL.
  SELECT DISTINCT * 
    FROM vbrk AS main
    INTO TABLE gt_vbrk
    FOR ALL ENTRIES IN gt_vbfa_inv
    WHERE vbeln = gt_vbfa_inv-vbeln
      AND NOT EXISTS ( SELECT * 
                       FROM vbrk AS sub
                       WHERE sub~vbeln = main~vbeln " 子查询要和主查询关联
                         AND sub~netwr = 0 ).
ENDIF.

注意:这个写法对你当前的需求属于过度实现,仅做语法示例用,优先用方案1即可

内容的提问来源于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:15:05