Мой бизнес пытался разработать SQL-запрос в SAP-бизнесе, который будет показывать наши номера «Доступны для обещания» для всех наших товаров. Идея состоит в том, чтобы каждый день в диапазоне дат (в нашем случае 90 дней) занимал начальную позицию инвентаря, вычитал заказы, добавлял входящий инвентарь, затем достигал конечной позиции запаса в течение дня. Затем рассчитайте то же самое на следующий день и так далее. Мы хотим, чтобы наименьшая конечная позиция запасов в этом диапазоне дат для каждого элемента
У нас уже есть запрос, но проблема в том, что я не знаю, как получить начальную позицию инвентаря для обновления, поэтому начальная позиция для каждого дня остается статической.
declare @start DATE = GETDATE()
declare @end DATE = (GETDATE()+90)
;with DAYS (date)
AS
(
SELECT
@start
UNION ALL
SELECT
DATEADD(dd,1,date)
FROM DAYS
WHERE DATEADD(dd,1,date)<=@end
)
(
SELECT
T100.*,
T0.[ItemCode],
T0.[ItemName],
(
T1.[OnHand] -
(
SELECT
ISNULL(SUM(T6.[OpenQty]),0)
FROM ORDR T5
INNER JOIN RDR1 T6
ON T5.[DocEntry] = T6.[DocEntry]
WHERE
T0.[ItemCode] = T6.[ItemCode]
AND T5.[DocStatus] = 'O'
AND T6.[LineStatus] = 'O'
AND T5.[CANCELED] = 'N'
AND T5.DocDueDate = T100.date
) +
(
SELECT
ISNULL(SUM(T8.[Quantity]),0)
FROM OPOR T7
INNER JOIN POR1 T8
ON T7.[DocEntry] = T8.[DocEntry]
WHERE
T0.[ItemCode] = T8.[ItemCode]
AND T7.[DocStatus] = 'O'
AND T8.[LineStatus] = 'O'
AND T7.[CANCELED] = 'N'
AND T7.DocDueDate = T100.date
)
) AS 'ATP Qty'
INTO #temp
FROM DAYS T100,
OITM T0
INNER JOIN OITW T1
ON T0.[ItemCode] = T1.[ItemCode]
WHERE
T1.[WhsCode] = '01'
)
option (maxrecursion 365)
SELECT
t.[ItemCode] AS [Item Number],
t.[ItemName],
MIN(t.[ATP Qty]) AS [ATP Qty]
FROM #temp t
GROUP BY t.ItemCode, t.[ItemName]
ORDER BY t.ItemCode
DROP TABLE #temp
Как вы можете видеть выше, для расчета берется T1. [OnHand] -Инвентарные ауты + Инвентарные входы за каждый день. T1. [Onhand] должна быть переменной, которая затем обновляется для каждого дня следующим образом (к сожалению, я гораздо больше привык к C, чем к SQL):
@inventory1 = T1.[OnHand]
@inventory2 = 0
Day 1:
@inventory2 = @inventory1-outs+ins
@inventory1 = @inventory2
Day 2:
@inventory2=@inventory1-outs+ins
@inventory1 = @inventory2
...
Любая помощь будет принята с благодарностью.