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
相关产品推荐
相关产品推荐

