代码之家  ›  专栏  ›  技术社区  ›  user2184523

用于查找AX 2012 R3中库存为零的所有wmsLocations的SQL查询

  •  0
  • user2184523  · 技术社区  · 8 年前

    我已经试了一天了,但似乎找不到正确的方法。我需要一个SQL查询,该查询将返回零库存的所有位置(inventSum.PostedQty+inventSum.Received-inventSum.declared+inventSum.Registered-inventSum.Picked<=0) 我认为应该像下面这样简单,但这是返回给我的位置(inventSum.PostedQty+inventSum.Received-inventSum.declared+inventSum.Registered-inventSum.Picked>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);
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   10p    8 年前

    有些项目的实际库存为零,而其他项目在同一地点的实际库存为正,您是否考虑过这一点?是否还需要按项目筛选?如果您需要查找 全部的 项目没有库存,然后尝试使用 notexists 而不是 存在

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

    exists join inventSum
    where (inventDim.InventDimId == inventSum.InventDimId) &&
    (inventSum.PostedQty + inventSum.Received - inventSum.Deducted + inventSum.Registered - inventSum.Picked <= 0);
    

    根据您的声明

    notexists 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;
    
        2
  •  0
  •   user2184523    8 年前

    我试过了,但它还是给了我所有的唱片。当我尝试generateonly和forceliteral时,看起来sql查询是正确的,但结果数据仍然给了我不相关的值。我最终通过创建一个AOT查询对象来修复它。解决方案很长,所以我将其添加到博客 https://locus90.blogspot.co.uk/2018/05/a-sql-query-to-find-all-wmslocations.html

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

    再次感谢您的帮助,如果您能推荐一个简单的解决方案,请告诉我。