Динамически обновляемая переменная в SQL для SAP Business One, доступная для запроса Promise - PullRequest
0 голосов
/ 26 марта 2019

Мой бизнес пытался разработать 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
...

Любая помощь будет принята с благодарностью.

...