关于SAP B1 SQL查询获取首个库位字段的优化咨询
问题分析
原查询返回默认库位而非目标首个库位,核心问题如下:
- 关联
OITW T3时未限定WhsCode,会匹配物料任意仓库的默认库位,而非当前查询仓库的对应库位 - 错误关联
OBIN与默认库位字段dftbinabs,直接引入了默认库位的逻辑分支 WTR1(仓库收货单明细)的FisrtBin字段与生产订单物料的首个库位需求不匹配,关联逻辑偏差
优化方案
根据需求场景,提供两种优化后的查询:
场景1:获取对应仓库下有库存物料的首个库位(按库位编号升序取第一个有库存的库位)
SELECT t0.ItemCode, FIRST_VALUE(t4.BinCode) OVER (PARTITION BY t0.ItemCode, t0.WhsCode ORDER BY t4.BinCode) AS Bin_Location, t1.OnHand AS Bin_Quantity FROM [dbo].[OITW] t0 JOIN [dbo].[OITM] t1 ON t1.ItemCode = t0.ItemCode JOIN [dbo].[OIBQ] t4 ON t0.ItemCode = t4.ItemCode AND t0.WhsCode = t4.WhsCode WHERE t4.OnHandQty <> 0 GROUP BY t0.ItemCode, t0.WhsCode, t1.OnHand;
场景2:获取生产订单关联物料的首个库位(按生产订单行顺序取)
SELECT r1.ItemCode, FIRST_VALUE(b.BinCode) OVER (PARTITION BY r1.DocEntry, r1.ItemCode ORDER BY r1.LineNum) AS Bin_Location, i.OnHand AS Bin_Quantity FROM [dbo].[RDR1] r1 JOIN [dbo].[ORDR] r0 ON r0.DocEntry = r1.DocEntry JOIN [dbo].[OITM] i ON i.ItemCode = r1.ItemCode LEFT JOIN [dbo].[OBIN] b ON b.AbsEntry = r1.BinAbs WHERE r0.DocStatus = 'O' GROUP BY r1.DocEntry, r1.ItemCode, i.OnHand;
优化说明
- 移除了与默认库位相关的冗余表关联,避免逻辑干扰
- 使用
FIRST_VALUE()窗口函数精准控制首个库位的筛选规则(可根据需求调整ORDER BY后的字段,比如库位创建时间) - 严格限定仓库关联条件,确保库位与物料的仓库上下文匹配
- 简化查询逻辑,减少不必要的
DISTINCT使用,提升查询效率
内容的提问来源于stack exchange,提问作者Daniel Carreira
相关产品推荐
相关产品推荐

