SQL-запрос для поиска всех wmsLocations с нулевым запасом в AX 2012 R3
Я пробовал это в течение дня, и я не могу найти правильный способ сделать это. Мне нужен SQL-запрос, который возвращает мне все местоположения с нулевым физическим запасом (инвентаризации - InventSum.PostedQty + изобретений - изобретений - изобретений, изобретений - изобретений - изобретений <= 0). Я думаю, что это должно быть так же просто, как показано ниже, но это возвращая мне места, где (ventSum.PostedQty + инвентарь Sum.Received - инвентарь Sum.Deducted + инвентарь Sum.Registered - инвентарь Sum.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 ответа
Я попробовал это, но это все равно дало мне все записи. Когда я пытался выполнить generateonly и forceliteral, это выглядело так, как будто sql-запрос корректен, но данные результата все еще давали мне несвязанные значения. Я решил исправить это, создав объект AOT Query. Решение очень длинное, поэтому я добавил его в блог https://locus90.blogspot.co.uk/2018/05/a-sql-query-to-find-all-wmslocations.html.
В двух словах, я в итоге исправил это, создав объект запроса AOT с wmsLocations, где я группирую по идентификатору местоположения, внутреннее соединение - с InventDim, но InventDim имеет внешнее соединение с InventSum и имею представление по запросу, в котором столбец syscomputed находит. физический запас для этой группы wmsLocations, который мы можем использовать в качестве диапазона в другом запросе, дающем нам все местоположения. Это работает только с внутренним соединением, поэтому для каждого оставшегося местоположения, без инвентаризации, требовалось другое несуществующее соединение.
Еще раз спасибо за вашу помощь, и дайте мне знать, если вы можете порекомендовать простое решение для этого.
У некоторых предметов может быть нулевой физический запас, в то время как у других предметов может быть положительный физический запас в том же месте, вы это учитывали? Вам также нужно фильтровать по элементам? Если вам нужно найти места, где все предметы имеют нулевой запас, попробуйте использовать заметки вместо существующих.
Мне пока негде это проверить, но вы можете попробовать заменить
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;