Axapta 用于查找AX 2012 R3中库存为零的所有WMS位置的SQL查询

Axapta 用于查找AX 2012 R3中库存为零的所有WMS位置的SQL查询,axapta,dynamics-ax-2012,x++,dynamics-ax-2012-r3,inventory-management,Axapta,Dynamics Ax 2012,X++,Dynamics Ax 2012 R3,Inventory Management,我已经试了一天了,但似乎找不到正确的方法。我需要一个SQL查询,该查询将返回物理库存为零的所有位置(inventSum.PostedQty+inventSum.Received-inventSum.deletred+inventSum.Registered-inventSum.0)。有人能帮我找出这里出了什么问题吗 select wmslocationid from wmsLocation order by wmsLocation.wMSLocationId where (wmsLocation

我已经试了一天了,但似乎找不到正确的方法。我需要一个SQL查询,该查询将返回物理库存为零的所有位置(inventSum.PostedQty+inventSum.Received-inventSum.deletred+inventSum.Registered-inventSum.0)。有人能帮我找出这里出了什么问题吗

select
wmslocationid
from wmsLocation
order by wmsLocation.wMSLocationId
where
(wmsLocation.inventLocationId == inventLocationId) //default warehouse
exists join inventDim
where (inventDim.InventSiteId == inventSiteId) &&//default site
(inventDim.InventLocationId == inventLocationId) &&
(inventDim.WMSLocationId == wmsLocation.wMSLocationId)
exists join inventSum
where (inventDim.InventDimId == inventSum.InventDimId) &&
(inventSum.PostedQty + inventSum.Received - inventSum.Deducted + inventSum.Registered - inventSum.Picked <= 0);
选择
wmslocationid
来自wmsLocation
按wmsLocation.wMSLocationId订购
哪里
(wmsLocation.inventLocationId==inventLocationId)//默认仓库
存在加入inventDim
其中(inventDim.InventSiteId==InventSiteId)&&//默认站点
(inventDim.InventLocationId==InventLocationId)&&
(inventDim.WMSLocationId==wmsLocation.WMSLocationId)
存在连接inventSum
其中(inventDim.InventDimId==inventSum.InventDimId)&&

(inventSum.PostedQty+inventSum.Received-inventSum.Decreated+inventSum.Registered-inventSum.Picked某些项目的实际库存为零,而其他项目的实际库存为正,您是否考虑过这一点?您是否还需要按项目进行筛选?如果您需要查找所有项目都有库存的位置ve零库存,然后尝试使用notexists而不是exists

我目前没有地方测试它,但你可以试着更换

exists join inventSum
where (inventDim.InventDimId == inventSum.InventDimId) &&
(inventSum.PostedQty + inventSum.Received - inventSum.Deducted + inventSum.Registered - inventSum.Picked <= 0);
还有,你可以试试

select wmslocationid from inventDim
    group by wmslocationid
    where inventDim.InventSiteId        == inventSiteId         //default site
       && inventDim.InventLocationId    == inventLocationId     //default warehouse
notexists join inventSum   
    where inventSum.InventDimId == inventDim.InventDimId
       && inventSum.Closed      == NoYes::No
       && inventSum.PostedQty + inventSum.Received - inventSum.Deducted + inventSum.Registered - inventSum.Picked > 0;

我试过了,但它仍然给了我所有的记录。当我尝试generateonly和forceliteral时,看起来sql查询是正确的,但结果数据仍然给了我不相关的值。我最终通过创建一个AOT查询对象来修复它。解决方案很长,所以我将其添加到了博客中

简而言之,我最终通过创建一个带有wmsLocations的AOT查询对象解决了这个问题,我在其中按位置ID分组,InventDim的内部联接与InventSum的外部联接与InventSum的内部联接,并且在查询上有一个视图,其中syscomputed列可以找到该wmsLocations组的物理库存,我们可以将其用作一个范围该查询为我们提供了所有位置。这只适用于内部联接,因此对于没有inventdim的每个剩余位置,都需要另一个不存在联接


再次感谢您的帮助,并让我知道您是否可以为此推荐一个简单的解决方案。

您是否尝试过将
generateOnly
放入AX语句中,然后执行
info(wmsLocation.getSQLStatement())
?这将告诉您
TSQL
查询,您可以将其放入SSMS中找出问题所在。我眼前没有AX环境,或者我会玩弄它。还要添加
forceLiterals
。因此,X++语句的第一部分是
从wmsLoca中选择generateonly forceLiterals slowmcationid操作
,然后在最后添加
信息(wmsLocation.getSQLStatement());
然后您应该能够了解sqlstatement中发生了什么,希望现在一切正常。
select wmslocationid from inventDim
    group by wmslocationid
    where inventDim.InventSiteId        == inventSiteId         //default site
       && inventDim.InventLocationId    == inventLocationId     //default warehouse
notexists join inventSum   
    where inventSum.InventDimId == inventDim.InventDimId
       && inventSum.Closed      == NoYes::No
       && inventSum.PostedQty + inventSum.Received - inventSum.Deducted + inventSum.Registered - inventSum.Picked > 0;