Показать сообщение отдельно
Старый 13.10.2020, 10:37   #8  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
В итоге сделал так - в начале получаются остатки из InventSum
X++:
    while select sum(AvailPhysical), sum(PhysicalInvent), sum(OnOrder), sum(ReservOrdered), sum(ReservPhysical) from inventSum
        group by ItemId
        where inventSum.ClosedQty           == NoYes::No
    join InventLocationId from inventDim
        group by InventLocationId
        where inventDim.InventDimId         == inventSum.InventDimId
        &&    inventDim.InventLocationId    == _inventLocationId
Потом получаются остатки из WHSInventReserve и в цикле объединяются с теми что есть в InventSum (через временную таблицу)
X++:
    while select sum(AvailPhysical), sum(ReservOrdered), sum(ReservPhysical) from WHSInventReserve
        group by ItemId
    join  WHSReservationHierarchyItem
        group by ItemId
        where WHSReservationHierarchyItem.ItemId      == WHSInventReserve.ItemId &&
              WHSReservationHierarchyItem.ItemDataAreaId  == WHSInventReserve.dataAreaId
    join WHSReservationHierarchyElement
        group by DimensionFieldId
        where WHSReservationHierarchyElement.DimensionFieldId          == fieldNum(InventDim, InventLocationId) &&
              WHSReservationHierarchyElement.ReservationHierarchy      == WHSReservationHierarchyItem.ReservationHierarchy &&
              WHSReservationHierarchyElement.ReservationHierarchyLevel == WHSInventReserve.HierarchyLevel
    join InventLocationId from inventDim
        group by InventLocationId
        where inventDim.InventDimId         == WHSInventReserve.InventDimId
        &&    inventDim.InventLocationId    == _inventLocationId
...
Второй цикл работает в 6 раз медленнее чем первый, но все равно в целом получается в 10 раз быстрее чем получать остатки по каждой номенклатуре
За это сообщение автора поблагодарили: fed (5), EVGL (5), raz (5), sukhanchik (8), Logger (5), SRF (1).