SQL存儲過程 一個簡單進銷存系統按日的庫存

一個簡單進銷存系統按日的庫存

轉載請註明出處,聯繫我: [email protected]
本人熱衷於數據庫技術及算法的研究,志同道合之士, 歡迎探討

一下是數據庫表結構
在這裏插入圖片描述
以下是結果
在這裏插入圖片描述

ALTER PROC dbo.proc_StokcWithDate 
@StartDate DATE,
@EndDate DATE,
@PartNumQuery NVARCHAR(200)
AS
BEGIN
  SELECT
    tt.Date
   ,CAST(0 AS DECIMAL(18, 5)) AccInQty
   ,CAST(0 AS DECIMAL(18, 5)) AccOutQty
   ,CAST(0 AS DECIMAL(18, 5)) Balance INTO #StockWithDate
  FROM dbo.TQPartTran tt
  WHERE 1 = 2;

  DECLARE @EveryDate DATE = @StartDate;
  DECLARE @i2 INT = 0;
  WHILE @EveryDate < @EndDate
  BEGIN
  SELECT
    @EveryDate = DATEADD(DAY, @i2, @StartDate)
  INSERT INTO #StockWithDate ([Date])
    VALUES (@EveryDate);
  SET @i2 = @i2 + 1;
  END

  SELECT DISTINCT
    tt.PartNum INTO #PartNum
  FROM dbo.TQPartTran tt;

  IF LEN(@PartNumQuery) > 0
  BEGIN
    TRUNCATE TABLE #PartNum;
    INSERT INTO #PartNum (PartNum)
      VALUES (@PartNumQuery);
  END

  SELECT
    ROW_NUMBER() OVER (ORDER BY swd.Date, pn.PartNum) ID
   ,pn.PartNum
   ,swd.* INTO #BaseInfo
  FROM #StockWithDate swd
      ,#PartNum pn;

  CREATE INDEX BaseInfoIndex ON #BaseInfo (ID);

  DECLARE @PartNum NVARCHAR(200)
         ,@Date DATE;
  DECLARE @i INT = 1
         ,@n INT = 0;
  SELECT
    @n = COUNT(ID)
  FROM #BaseInfo bi;
  WHILE @i <= @n
  BEGIN
  SELECT
    @PartNum = bi.PartNum
   ,@Date = bi.Date
  FROM #BaseInfo bi
  WHERE bi.ID = @i;

  UPDATE #BaseInfo
  SET AccInQty = (SELECT
          SUM(tt.Qty)
        FROM TQPartTran tt
        WHERE tt.PartNum = @PartNum
        AND tt.Date <= @Date
        AND tt.TranType = 'PUR-STK')
     ,AccOutQty = (SELECT
          SUM(tt.Qty)
        FROM TQPartTran tt
        WHERE tt.PartNum = @PartNum
        AND tt.Date <= @Date
        AND tt.TranType = 'STK-CUS')
  WHERE ID = @i;

  SET @i = @i + 1;
  END

  UPDATE #BaseInfo
  SET AccInQty = 0
  WHERE AccInQty IS NULL;
  UPDATE #BaseInfo
  SET AccOutQty = 0
  WHERE AccOutQty IS NULL;
  UPDATE #BaseInfo
  SET Balance = AccInQty - AccOutQty;

  IF LEN(@PartNumQuery) > 0
  BEGIN
    SELECT
      bi.ID 序號
     ,bi.PartNum 料號
     ,bi.Date 日期
     ,CAST(bi.AccInQty AS DECIMAL(18, 2)) 累計入庫
     ,CAST(bi.AccOutQty AS DEC(18, 2)) 累計出庫
     ,CAST(bi.Balance AS DEC(18, 2)) 結餘
    FROM #BaseInfo bi
    WHERE bi.PartNum = @PartNumQuery
    ORDER BY bi.Date, bi.PartNum;
  END
  ELSE
  BEGIN
    SELECT
      bi.ID 序號
     ,bi.PartNum 料號
     ,bi.Date 日期
     ,CAST(bi.AccInQty AS DECIMAL(18, 2)) 累計入庫
     ,CAST(bi.AccOutQty AS DEC(18, 2)) 累計出庫
     ,CAST(bi.Balance AS DEC(18, 2)) 結餘
    FROM #BaseInfo bi
  END

  DROP TABLE #PartNum;
  DROP TABLE #StockWithDate;
  DROP TABLE #BaseInfo;
END


--exec proc_StokcWithDate '2020-05-8','2020-05-13',N''  
--exec proc_StokcWithDate '2020-05-8','2020-05-13',''
--exec proc_StokcWithDate '2020-05-8','2020-05-13',N''  
--exec proc_StokcWithDate '2020-05-8','2020-05-13',''
GO
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章