How to implement FIFO in sql

前端 未结 4 978
星月不相逢
星月不相逢 2020-12-16 05:35

I working on FIFO implementation in sql. I have Batch number concept in my application. If suppose I am selling on inventory then my application should tell me that which in

4条回答
  •  星月不相逢
    2020-12-16 06:16

    This should work for you:
    Working sample on Fiddle

    CREATE FUNCTION [dbo].[GetBatchAmounts]
    (
        @requestedAmount int
    
    )
    RETURNS 
    @tBatchResults TABLE 
    (   
        Batch nvarchar(50),
        Amount int
    )
    AS
    BEGIN
        /*This is just a mock of ersults of your query*/
        DECLARE @RS_GIN_Master TABLE( 
    
         Qty int,
         batch_no NVARCHAR(max),
         accept_date DATETIME
        )
    
        insert into @RS_GIN_Master(Qty,batch_no,accept_date)
        SELECT 10,'BT002', CAST(CAST(2014 AS varchar) + '-' + CAST(8 AS varchar) + '-' + CAST(4 AS varchar) AS DATETIME)
    
        insert into @RS_GIN_Master(Qty,batch_no,accept_date)
        SELECT 10,'BT003', CAST(CAST(2014 AS varchar) + '-' + CAST(8 AS varchar) + '-' + CAST(5 AS varchar) AS DATETIME)
    
        insert into @RS_GIN_Master(Qty,batch_no,accept_date)
        SELECT 10,'BT001', CAST(CAST(2014 AS varchar) + '-' + CAST(8 AS varchar) + '-' + CAST(6 AS varchar) AS DATETIME)
        /*---------------------------*/
    
         DECLARE @Qty int
         DECLARE @batch_no NVARCHAR(max)
         DECLARE @accept_date DATETIME
    
    
        DECLARE myCursor CURSOR FOR
    
        SELECT Qty, batch_no, accept_date FROM @RS_GIN_Master ORDER BY accept_date ASC
    
        OPEN myCursor
    
        FETCH NEXT FROM myCursor INTO  @Qty, @batch_no,@accept_date
    
        WHILE (@@FETCH_STATUS = 0 AND @requestedAmount > 0 ) 
        BEGIN
    
            Declare @actualQty int
            IF @requestedAmount > @Qty
                SET @actualQty = @Qty
            ELSE    
                SET @actualQty = @requestedAmount
    
    
            INSERT INTO @tBatchResults (batch, Amount)
            SELECT @batch_no, @actualQty
    
            set @requestedAmount  = @requestedAmount - @actualQty
    
            FETCH NEXT FROM myCursor INTO @Qty, @batch_no,@accept_date
    
        END /*WHILE*/
    
        CLOSE myCursor
        DEALLOCATE myCursor
    
        RETURN
    END
    

    Just make sure to replace the marked part of the function with your query...

提交回复
热议问题