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
這裏用到的遊標貌似不怎麼好~~~須要改善 測試