實戰計算BOM成本的存儲過程

  1 USE [TD_ManagerInfo]
  2 GO
  3 /****** 對象:  StoredProcedure [dbo].[pro_GetBOMList]    腳本日期: 06/20/2013 20:55:43 ******/
  4 SET ANSI_NULLS ON
  5 GO
  6 SET QUOTED_IDENTIFIER ON
  7 GO
  8 
  9 -- =============================================
 10 -- Author:  JOY
 11 -- Create date: 2013-6-6
 12 -- Description: 根據品號查詢全部BOM清單
 13 -- =============================================
 14 ALTER PROCEDURE [dbo].[pro_GetBOMList]
 15  -- 存儲過程參數
 16  @PROID varchar(100)
 17 AS
 18 BEGIN
 19 
 20     --檢查臨時表
 21     If object_id('tempdb..##BOMINFO') is not null Drop Table ##BOMINFO
 22 
 23     --建立臨時表
 24     Create table ##BOMINFO
 25     (
 26            BOM_NO varchar(100) not null,    --BOM號
 27            PRD_NO varchar(100) PRIMARY KEY, --品號
 28            PRDNAME varchar(100),            --品名
 29         MIN_PURCHASE INT default(0),     --最小採購量
 30            PRICE [numeric](18,5) default(0),           --單價
 31            PRICESubtotal [numeric](18,5) default(0),   --單個部品金額 採購量*單價
 32            SUP_COUNT INT default(0),        --供應商/家
 33            ID_NO varchar(100),              --子件ID
 34            LAYER INT,
 35     )
 36 
 37     --遞歸讀取BOM表(With前面有語句須要用分好隔開)
 38     ;With TBOM as 
 39  ( 
 40   Select BOM_NO,PRD_NO,[NAME],ID_NO,QTY from DB_TD02.DB_TD02.dbo.TF_BOM WHERE BOM_NO '" target="_blank">=@PROID+'->'
 41   UNION ALL
 42   Select B.BOM_NO,B.PRD_NO,B.NAME,B.ID_NO,B.QTY from TBOM
 43   inner join DB_TD02.DB_TD02.dbo.TF_BOM B on TBOM.ID_NO=B.BOM_NO
 44  )
 45 
 46  --Select * from TBOM (測試數據)
 47     --根據型號查詢BOM記錄複製到臨時表(層級)
 48     Insert into ##BOMINFO(BOM_NO,PRD_NO,PRDNAME,ID_NO) Select B.BOM_NO,B.PRD_NO,B.NAME,B.ID_NO from TBOM B
 49 
 50 
 51     -----------------------------------------------------------------------------------------------------
 52     -------------------------------遊標執行對遞歸後TBOM的其餘計算處理-------------------------------------
 53     -----------------------------------------------------------------------------------------------------
 54     --申明變量(用戶遊標複製操做)
 55     declare @PRD_NO varchar(100)
 56     declare @PRDNAME varchar(100)
 57     declare @BomCusCount int       --貨品對應供應商總數
 58     declare @PRICE numeric(18,8)   --部品單價
 59     declare @MIN_PURCHASE int      --最小採購量
 60     declare @Layer int --層級
 61     declare @KND varchar(1)   --大類代號
 62     declare @IDX1 varchar(10) --中類代號(包裝類、噴油件、電鍍件...)
 63     declare @SUP1 varchar(12) --主供應商
 64     declare @MAXDAYS numeric(18,8) --最長前置期
 65     declare @MAXDAYSVALUE numeric(18,8) --存放最終前置值
 66     Select @MAXDAYSVALUE=0 --初始化最長前置期
 67     Select @MAXDAYS=0      --初始化最長前置期
 68 
 69     --聲明一個遊標cur_BOMINFO,select語句中參數的個數必需要和從遊標取出的變量名相同
 70     declare cur_BOMINFO cursor for select PRD_NO from ##BOMINFO
 71     --打開遊標
 72     Open cur_BOMINFO
 73     --讀取遊標 一條記錄插入變量
 74     Fetch next from cur_BOMINFO into @PRD_NO
 75     While(@@fetch_status = 0)
 76   Begin
 77    --根據品號查找對應供應商個數
 78             Select @BomCusCount=COUNT(C.CUS_NO) from DB_TD02.DB_TD02.dbo.PRDT_CUS C WHERE C.PRD_NO =@PRD_NO
 79            
 80             --修改前Select top 1 @KND=KND,@IDX1=IDX1,@SUP1=SUP1 from DB_TD02.DB_TD02.dbo.PRDT P WHERE P.PRD_NO =@PRD_NO
 81             
 82             --根據品號供應商信息更新
 83             Update ##BOMINFO set SUP_COUNT=SUP_COUNT+@BomCusCount where PRD_NO=@PRD_NO
 84              
 85             --查找貨品查找單價
 86             Select top 1 @PRICE=isnull(UP_DEF.UP,0.0000) from DB_TD02.DB_TD02.dbo.UP_DEF UP_DEF WHERE PRD_NO=@PRD_NO
 87             --根據品號查找單價信息更新
 88             Update ##BOMINFO set PRICE=@PRICE where PRD_NO=@PRD_NO
 89 
 90             --根據品號查找最小採購量
 91             Select @MIN_PURCHASE=isnull(QTY_MIN,0),@MAXDAYS=NEED_DAYS from DB_TD02.DB_TD02.dbo.PRDT WHERE PRD_NO=@PRD_NO
 92             --根據品號查找最早採購量信息更新
 93             Update ##BOMINFO set MIN_PURCHASE=@MIN_PURCHASE where PRD_NO=@PRD_NO
 94             
 95             --判斷最長前置期
 96             IF @MAXDAYS>@MAXDAYSVALUE
 97                begin
 98                 Set  @MAXDAYSVALUE=@MAXDAYSVALUE
 99                end
100 
101             --繼續....
102    Fetch next from cur_BOMINFO into @PRD_NO
103   End
104     --關閉遊標
105  Close cur_BOMINFO
106     --刪除遊標
107  Deallocate cur_BOMINFO
108 
109     --查詢結果
110     --print @MAXDAYSVALUE
111     --Select * from ##BOMINFO
112 
113 END

這裏用到的遊標貌似不怎麼好~~~須要改善 測試

相關文章
相關標籤/搜索