SAP Business One中筛选未完全交货且无采购订单的销售订单查询优化
优化SAP Business One销售订单查询方案
我明白你的问题了——原查询会把部分交货的订单也捞出来,这是因为它只检查订单里有没有符合条件的行,而不是判断整个订单的状态。咱们可以通过检查订单整体的关联状态来优化查询,精准定位你要的两类订单:完全未转交货的订单,或者完全没有采购订单关联的订单。
优化后的查询语句
SELECT DISTINCT T0.* FROM ORDR T0 WHERE -- 第一类:完全未转至交货单的订单(所有行都没关联交货单) NOT EXISTS ( SELECT 1 FROM RDR1 T1 WHERE T1.DocEntry = T0.DocEntry AND T1.TrgtEntry IS NOT NULL ) OR -- 第二类:无采购订单关联的订单(所有行都没关联PO) NOT EXISTS ( SELECT 1 FROM RDR1 T1 WHERE T1.DocEntry = T0.DocEntry AND T1.BaseEntry IS NOT NULL )
逻辑解释
- 完全未转交货的订单:用
NOT EXISTS判断该订单下有没有任何一行关联了交货单(TrgtEntry IS NOT NULL),如果没有,说明整个订单都没转交货,符合要求。 - 完全无PO的订单:同样用
NOT EXISTS判断该订单下有没有任何一行关联了采购订单(BaseEntry IS NOT NULL),如果没有,说明整个订单都没有PO关联,符合要求。 DISTINCT用来去重,避免同时符合两类条件的订单被重复返回。
如果你需要的是「存在未交货行的订单」而非「完全未交货」
如果你实际需求是允许部分交货的订单(只要有未交货的行就算),同时加上无PO的订单,可以用下面的查询:
SELECT DISTINCT T0.* FROM ORDR T0 WHERE -- 存在未转交货的行 EXISTS ( SELECT 1 FROM RDR1 T1 WHERE T1.DocEntry = T0.DocEntry AND T1.TrgtEntry IS NULL ) OR -- 完全无PO关联 NOT EXISTS ( SELECT 1 FROM RDR1 T1 WHERE T1.DocEntry = T0.DocEntry AND T1.BaseEntry IS NOT NULL )
这样就能精准匹配你的需求,不会再把部分交货的订单误捞进来啦~
内容的提问来源于stack exchange,提问作者aintno12u
相关产品推荐
相关产品推荐

