Я пытаюсь создать хранимую процедуру MS SQL 2005 для распределения запаса на складе для определенного компонента в заказе. Доступно несколько партий товара, и они должны использоваться в определенном порядке. Я могу циклически просматривать доступные запасы и распределять их до тех пор, пока заказ не будет выполнен, но я стараюсь думать больше о множестве, чем о последовательном, и избегать использования CURSOR.
Вот мой запрос, который позволяет получить складские запасы для определенного компонента заказа;
SELECT
STOCK.ComponentId,
STOCK.StockId,
STOCK.ExpiryDate,
STOCK.BatchNo,
STOCK.StockQty,
ORDER_ITEMS.OrderQty
FROM
STOCK
JOIN ORDER_ITEMS ON ORDER_ITEMS.ComponentId = STOCK.ComponentId
WHERE
STOCK.WarehouseId = @WarehouseId
AND STOCK.StockQty > 0
AND ORDER_ITEMS.OrderItemId = @OrderItemId
Я поместил это во временную таблицу или создал CTE с запросом и применил предложение ORDER BY, чтобы отсортировать запас по мере необходимости. Это дает мне набор результатов, как:
ComponentId | StockId | ExpiryDate | BatchNo | StockQty | OrderQty
-------------------------------------------------------------------
359 | 3107 | 2013-10-01 | 132435-1 | 20 | 50
359 | 3215 | 2013-10-01 | 154558-1 | 100 | 50
359 | 3216 | 2014-01-01 | 154689-1 | 100 | 50
Что мне нужно сделать, это вставить записи в таблицу STOCK_ALLOCATED
, используя столько партий товара, сколько необходимо для выполнения объема Заказа. В приведенном выше примере я бы использовал все 20 из первого ряда, а затем нужно 30 из второго ряда.
Для этого потребуется вставить две записи в таблицу STOCK_ALLOCATED
с OrderItemId
, StockId
и количеством (20 и 30) для двух использованных партий, а также уменьшить количество запаса в таблице STOCK
соответственно.
Предполагая, что для обеспечения постоянного ведения таблиц запасов имеются необходимые транзакции, существует ли способ выполнять вставки и обновления без использования CURSOR для циклического просмотра и отслеживания того, сколько я уже выделил и сколько мне еще нужно