MRP SQL

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

 

 

 

 


/****************************************************************
*                                                                                                                             *
*                           系統  :生產管理系統                                                                     *
*                           功能  :MRP計算                                                                           *
*                                                                                                                              *      
*                             時間  :2005-10-10                                                                   *
*                                                                                                                              *
****************************************************************/
--   Exec   Sp_RunningMRP  '2005/11/16','20051130004','',0,''
ALTER                             PROCEDURE  [dbo].[Sp_RunningMRP]
 @StartDateTime DateTime,
 @CalcuNO Varchar(15),
 @Runer Varchar(20),
 @Returnid Int output,
 @ErrMsg Varchar(100) Output
As
Begin Transaction

Declare   @MaxEndDate DateTime
Declare   @Count  Int
Declare   @Year    Int
Declare   @Month Int
Declare   @FirstDate Datetime

          Set   @Returnid = 0
          Set   @ErrMsg = ''

          Select   @Count = Count(*),@MaxEndDate = Max(EndDate)
          From   B_TimeCircle
          If  @Count = 0
          Begin
                      Set    @Returnid = 0
                      Set    @ErrMsg = '沒有進行計劃展望維護!'
                      GoTo ExitLable                    
          End       
          Select   @Count = Count(*)
          From   B_TimeArea
          If  @Count = 0
          Begin
                      Set    @Returnid = 0
                      Set    @ErrMsg = '沒有進行計劃週期維護!'
                      GoTo ExitLable                    
          End      

         If Month(@Startdatetime) = 1
         Begin
                     Set     @Year = Year(@StartDateTime) - 1
                     Set     @Month = 12
         End
         Else
         Begin
                    Set      @Year = Year(@StartDateTime)
                    Set      @Month = Month(@StartDateTime) - 1
        End
        Select   @FirstDate = Cast(Convert(Char(10), @Startdatetime, 121) As Datetime) - Day(@Startdatetime) + 1
--調入PO欠數  (#T1)
Select Itemno, Syspono,IsNull(Poqs,0)As Poqs,DelyDate
Into #TA1
From(
             Select AA.*,BB.Delyqty,IsNull(AA.Qty,0) - IsNull(BB.Delyqty,0) As Poqs  from
                        (Select m.Syspono,ItemNo,Sum(qty) As qty, 
                          Case When D.DelyDate Is Null Then M.DelyDate  Else D.DelyDate End As DelyDate
                                  From (   Select Syspono, DelyDate From O_POMas 
                                                  Where  IsStopDely = 0  And  IsPauseDely = 0
                                                  And IsDirectExport  = 0  And  MRPClosed = 0
                                                  And Issure = 1 And poDate <= @Startdatetime 
                                                  Group By  Syspono, DelyDate
                                                 ) M
                                                  Inner Join O_PODet D On M.SysPoNo = D.SysPoNo
                                                  Where  D.IsNeedDely = 1 
                                                  Group By M.Syspono,ItemNo,D.DelyDate,M.DelyDate
                            ) AA
                                 Left join  (Select D.Syspono,D.ItemNo,IsNull(Sum(qty),0) As delyqty
                                                   From O_DLMas M       
                                                   Inner Join O_DLDet  D On M.SysDelyNo = D.SysDelyNo
                                                  Group By D.Syspono,D.ItemNo
                          ) BB  On AA.Syspono = BB.Syspono and AA.ItemNo = BB.ItemNo
                               Where  IsNull(AA.Qty,0) <> IsNull(BB.Delyqty,0)
          ) TT 
Order by Itemno

Select itemno,Sum(IsNull(Poqs,0)) As Poqs ,DelyDate
Into #T1
From   #TA1
Group By Itemno,DelyDate 
Order by  Itemno
----------------------------------------------------------------------------------------------------------------------
/*存倉數=車間存數+貨倉庫存數 */
-----------------------------------------------------------------------------------------------------------------------------
--車間存數 (#T3)
Select Partno Into #A1
From VB_Purgoods
Where Len(Partno) > 1 
Group By Partno
-- 注意﹕ 查詢O_AssReportMas,O_AssReportDet是裝配線上的數
Select  Itemno ,Stockqty
Into #T3
From (
            Select BB.*,C.itemno
             From (
                        Select A.Bompartno,A.Stockqty
                         From O_AssReportMas B  Inner Join O_AssReportDet A  On A.sysNO = B.SysNO 
                        Where  B.[Date] = @StartDateTime
                        And  A.Bompartno   Not In (Select*From #A1)
                        ) BB      Inner Join VB_part C  On C.partno = BB.bompartno
               UniOn All
               Select BB.*,C.itemno
                From (
                           Select A.Bompartno,A.Stockqty
                           From O_AssReportMas B  Inner Join O_AssReportDet A   On A.sysNO = B.SysNO 
                          Where  B.[Date] = @StartDateTime  And  A.Bompartno  In (Select*From #A1)
                          ) BB     Inner Join VB_Purgoods C  On C.partno = BB.Bompartno                         
            ) CC Where  Stockqty > 0
Group By  Itemno ,Stockqty
Drop table #A1
------------------------------------------
--貨倉庫存數 (#T4)   注﹕其實當天的庫存已經載總數裏包括了
 Select ItemNO,Sum(InStockQty) As InStockQty,Sum(OutStockQty) As OutStockQty,
  Sum(CSQty) + Sum(InStockTQty) - Sum(OutStockTQty)  As StockQty    --   StockQty是負數系統暫當零考慮
  Into  #T4
  From(
    --庫存數量總數
     Select D.ItemNO,  InStockQty  = 0,  OutStockQty = 0,
                  InStockTQty  = Case When B.IsRDFlag = '1' Then Sum(D.Qty) Else 0 End, --入庫總數
                 OutStockTQty  = Case When B.IsRDFlag = '0' Then Sum(D.Qty) Else 0 End, CSQty = 0
     From   O_StockMas M Inner Join O_StockDet  D On M.SysStockBillNO=D.SysStockBillNO
     Inner Join B_StockRD_Type B On M.RDID = B.RDID Inner Join VB_Items S On S.ItemNO = D.ItemNO
     Where     M.StockDate >= @FirstDate  And     M.StockDate < @StartDateTime + 1  
     Group By  B.IsRDFlag,M.RDID,D.ItemNO
     UNION ALL
     --清倉數 
     Select  D.ItemNO, InStockQty  = 0,   OutStockQty = 0,    InStockTQty = 0,  OutStockTQty = 0,Sum(D.Qty) As CSQty
     From  O_CheckStockMas M Inner  Join  O_CheckStockDet  D On M.SysCheckStockNo = D.SysCheckStockNo
     Inner join VB_Items I ON D.ItemNO = I.ItemNO
     Where M.[Year] = @Year AND M.[Month] = @Month   Group By D.ItemNO )  As F
    Group By ItemNO
-----------------------------------------------------------------------------------------------------------------------------
--毛需求=調入ForeCast總數+PO欠數(PO欠數﹐PO追加) 
Select  ItemNo,SumFCQty,DelyDate
Into     #T5
From (
            Select  ItemNo,Poqs As SumFCQty,DelyDate
            From #T1
            Union All
            Select d.itemno,Sum(IsNull(Qty,0)) As SumFCQty,D.NeedDate  as DelyDate
            From W_SalesForeCastMas M  Inner Join W_SalesForeCastDet D On m.Sysbillno = d.Sysbillno
            Where M.Issure = 1
            And D.Havemrp = 1
            And M.MRPClosed = 0
            And D.MRPClose = 0
            And D.NeedDate <= @MaxEndDate
            Group By  D.Itemno, D.NeedDate
           )N Order by DelyDate
----------------------------------------------------------------------------------------------------------------------------
--調入生產BOM資料
 Select M.Itemno As Fitemno, D.Itemno As CItemno,D.Qty,B.Source
 Into     #T6
 From B_ItemBomMas M
 Inner Join B_ItemBomDet D  On M.Sysbillno = D.Sysbillno
 Inner Join VB_Items B On B.Itemno = D.Itemno
 Where   M.Bomtype = 0  And M.Issure = 1
-----------------------------------------------------------------------------------------------------------------------------
--MRP計算開始
Declare @Itemno Varchar(30)
Declare @SumFCQty  Decimal(20,5) --  總數
Declare @BomDetItemno Varchar(30)
Declare @BomDetQty Decimal(20,5)
Declare @FCusPoqs Decimal(20,5)--  客戶欠數  @CusPoqs Decimal(20,5),
Declare @VenPoqs Decimal(20,5),@FvenPoqs Decimal(20,5) --  供應商欠數
Declare @PdQty  Decimal(20,5),@FPDQty Decimal(20,5) --  盤點數
Declare @CcQty Decimal(20,5),@FHCQty Decimal(20,5)--  存倉數
Declare @FAllQty Decimal(20,5) --  總數
Declare @CAllQty Decimal(20,5)
Declare @FLeadTime  Int   --  父提前期
Declare @LeadTime    Int   --   本節點提前期
Declare @Source Varchar(10)--  料品來源
Declare @NeedDate DateTime
Declare @Foot Int
Declare @CNeedQty  Decimal(20,5)
Declare @CcNeedQty  Decimal(20,5)
Declare @CCount       Int
Declare @FNQty Decimal(20,5)  --  父毛需求
Declare @CnQty Decimal(20,5)  --  子毛需求

Set @Foot=0
            Declare Table_FC Cursor for Select itemno,SumFCQty,DelyDate From #T5
            Open Table_FC
            Fetch Next From Table_FC Into @Itemno,@SumFCQty,@NeedDate
            While (@@Fetch_Status = 0)
            Begin 
--判斷在BOM表中是否存在
                      Select @Count = Count(*) From B_ItemBomMas  Where Itemno = @Itemno And BomType = 0 And Issure = 1
                      If  @Count = 0
                      Begin
                                 Insert Into B_ItemNotBom(itemno,idkey,needDate) Values (@Itemno,1,@NeedDate)
                                 Fetch Next From Table_FC Into @Itemno,@SumFCQty,@NeedDate  
                      End  
                      Else  Begin
                      Set  @FvenPoqs = 0
                      Set  @FPDQty = 0
                      Set  @FHcQty = 0
                      Set  @FcusPoqs = 0     
                      Set  @FNQty = 0
-- 父提前期計算
                               Select  @FLeadTime = Ceiling(IsNull(I.LeadTime,0)/Case When IsNull(A.aDate,0) = 0 Then 1 Else IsNull( A.aDate,0) End)
                               From VB_Items I,(Select Top 1 aDate From B_TimeArea)A  Where ItemNo = @Itemno
--車間存數 --初始庫存 
                               Select @FPDQty = IsNull(stockqty,0) From #T3 Where Itemno = @Itemno
--貨倉庫存     --初始庫存
                               Select @FHCQty = IsNull(StockQty,0) From #T4 Where ItemNO = @Itemno
-- 類別
                               Select  @Source = Source  From  VB_Items   Where ItemNo = @Itemno
--- 加入父節點﹐目的是在生成自制單時包含父節點
                     Select       @FAllQty = IsNull(@SumFCQty,0) - IsNull(@FPDQty,0) - IsNull(@FHCQty,0)
                     Select       @FNQty = IsNull(@SumFCQty,0)

                     Select    @CCount  = Count(*)   From W_MRPResultDetail  Where CalcuNo = @CalcuNo  And CItemno = @Itemno-- And CNeedQty<>0 
                     If   @CCount = 0
                     Begin
                                  Insert Into W_MRPResultDetail(CalcuNo,LeadTime,NeedDate,RunDate,FItemNO,FNeedQty,FPurPoqs,FCusPoqs,
                                                      FHCQty,FPDQty,CItemno,CNeedQty,CUnitQty,CPurPoqs,CCusPoqs,CHCQty,CPDQty,CSource,
                                                      IsRunOver,foot,FQty,CQty)
                                  Values(@CalcuNo,@FLeadTime, @NeedDate,GetDate(),@Itemno,IsNull(@FAllQty,0),IsNull(@FvenPoqs,0),0,IsNull(@FHCQty,0),
                                                     IsNull(@FPDQty,0), @Itemno,IsNull(@FAllQty,0),1,IsNull(@FvenPoqs,0),IsNull(@FcusPoqs,0),
                                                     IsNull(@FHCQty,0),IsNull(@FPDQty,0),@Source,0,@Foot,IsNull(@FNQty,0),IsNull(@FNQty,0))                                                       

                                  If   @@Error <> 0
                                 Begin
                                            Set   @Returnid = 0
                                            Set   @ErrMsg = '插入數據出錯﹐請與電腦部聯系!'
                                            GoTo ExitLable         
                                 End
                     End
                     Else
                     Begin
                                  Select  Top 1 @CNeedQty = CNeedQty  From  W_MRPResultDetail
                                  Where   CalcuNo = @CalcuNo  And  CItemno = @Itemno 
                                  Order by RunDate Desc
                                  Insert Into W_MRPResultDetail(CalcuNo,LeadTime,NeedDate,RunDate,FItemNO,FNeedQty,FPurPoqs,FCusPoqs,
                                                      FHCQty,FPDQty, CItemno,CNeedQty,CUnitQty,CPurPoqs,CCusPoqs,CHCQty,CPDQty,CSource,
                                                      IsRunOver,foot,FQty,CQty)
                                  Select      @CalcuNo,@FLeadTime, @NeedDate,GetDate(),@Itemno,
                                                     Case  When  @CNeedQty>=0 Then  IsNull(@FNQty,0)  Else    @FNQty+@CNeedQty End,
                                                     IsNull(@FvenPoqs,0),IsNull(@FCusPoqs,0),IsNull(@FHCQty,0),IsNull(@FPDQty,0), @Itemno,
                                                     Case  When  @CNeedQty>=0 Then  IsNull(@FNQty,0)  Else    @FNQty+@CNeedQty End,
                                                     @SumFCQty,IsNull(@FvenPoqs,0),IsNull(@FcusPoqs,0),
                                                     0,0,@Source,0,@Foot,IsNull(@FNQty,0),IsNull(@FNQty,0)

                                  If   @@Error <> 0
                                 Begin
                                             Set   @Returnid = 0
                                             Set   @ErrMsg = '插入數據出錯﹐請與電腦部聯系!'
                                             GoTo ExitLable         
                                 End
                     End
--展開下一層
                     Declare Table_BOM Cursor for   Select Citemno,Qty,Source From #T6  Where  Fitemno=@Itemno
                     Open Table_BOM
                     Fetch Next From Table_BOM Into @BOMDetItemno,@BomDetQty,@Source
                     While (@@Fetch_Status = 0)
                     Begin   
                              Set  @VenPoqs = 0
                              Set  @PdQty = 0
                              Set  @CcQty = 0
                              Set  @CAllQty = 0
--                              Set  @CusPoqs = 0      
                              Set  @CnQty = 0
-- 本節點提前期
                             Select  @LeadTime = @FLeadTime + Ceiling(IsNull(I.LeadTime,0)/Case When IsNull(A.aDate,0) = 0 Then 1 Else IsNull(A.aDate,0) End)
                             From VB_Items I,(Select Top 1 aDate From B_TimeArea)A Where ItemNo = @BOMDetItemno
--車間存數
                             Select @PdQty = IsNull(StockQty,0)  From #T3 Where ItemNo = @BOMDetItemno
--貨倉庫存
                             Select @CcQty = IsNull(StockQty,0)  From #T4 Where ItemNO = @BOMDetItemno
-- 類型
                             Select @Source = Source   From  VB_Items  Where ItemNo = @BOMDetItemno
--計算總數
                             Select @CAllQty = (Case When @CCount <= 0 Then Case When @FAllQty > 0  Then @FAllQty Else 0 End
                                                         Else Case  When  @CNeedQty >= 0 Then  IsNull(@FNQty,0)
                                                         Else IsNull(@FNQty,0) + IsNull(@CNeedQty,0) End End) * IsNull(@BomDetQty,0) - @PdQty - @CcQty
                             Select  @CnQty = (Case When @CCount <= 0 Then Case When IsNull(@FAllQty,0) > 0  Then IsNull(@FAllQty,0)
                                                                Else 0 End Else    Case  When  IsNull(@CNeedQty,0) >= 0 Then  IsNull(@FNQty,0)
                                                                             Else   IsNull(@FNQty,0) + IsNull(@CNeedQty,0) End End) * IsNull(@BomDetQty,0)
--如果毛需求小於等於0﹐則不用考慮本節點需求
                If      @CnQty <= 0
                     Fetch Next From Table_BOM Into @BOMDetItemno,@BomDetQty,@Source    
                Else  Begin
--單層展開   
                     Select    @Count  = Count(*)   From W_MRPResultDetail  Where CalcuNo = @CalcuNo And  CItemno = @BOMDetItemno --And CNeedQty<>0
                     If   @Count = 0
                     Begin
                             Insert Into W_MRPResultDetail (CalcuNo,LeadTime,NeedDate,RunDate,FItemNO,FNeedQty,FPurPoqs,FCusPoqs,
                                             FHCQty,FPDQty, CItemno,CNeedQty,CUnitQty,CPurPoqs,CCusPoqs,CHCQty,CPDQty,CSource,
                                             IsRunOver,foot,FQty,CQty)
                             Values(@CalcuNo,@LeadTime,@NeedDate, GetDate(),@Itemno,(Case When @CCount <= 0 Then  IsNull(@FAllQty,0)
                                              Else  Case  When  @CNeedQty >= 0 Then  IsNull(@FNQty,0) 
                                                                      Else    IsNull(@FNQty,0) + IsNull(@CNeedQty,0) End End),
                                             IsNull(@FvenPoqs,0),0,IsNull(@FHCQty,0),
                                             IsNull(@FPDQty,0), @BOMDetItemno,IsNull(@CAllQty,0),@BomDetQty,IsNull(@VenPoqs,0),0,
                                             IsNull(@CcQty,0),IsNull(@PdQty,0),@Source,0,@Foot,IsNull(@FNQty,0),IsNull(@CnQty,0))

                            If @@ROWCount = 0
                            Begin
                                        Set    @Returnid = 0
                                        Set    @ErrMsg = 'MRP計算出錯,請與電腦部聯系!'
                                        GoTo ExitLable    
                            End   
                       End
                       Else
                       Begin
                             Select  Top 1 @CcNeedQty = IsNull(CNeedQty,0)  From  W_MRPResultDetail
                             Where  CalcuNo = @CalcuNo And CItemno = @BOMDetItemno
                             Order by RunDate Desc
                             Insert Into W_MRPResultDetail (CalcuNo,LeadTime,NeedDate,RunDate,FItemNO,FNeedQty,FPurPoqs,FCusPoqs,
                                                 FHCQty,FPDQty,CItemno,CNeedQty,CUnitQty,CPurPoqs,CCusPoqs,CHCQty,CPDQty,CSource,
                                                 IsRunOver,foot,FQty,CQty)
                            Select  @CalcuNo,@LeadTime,@NeedDate, GetDate(),@Itemno,(Case When @CCount <= 0 Then  IsNull(@FAllQty,0)
                                              Else Case  When  IsNull(@CNeedQty,0) >= 0 Then  IsNull(@FNQty,0) 
                                                                     Else    IsNull(@FNQty,0) + IsNull(@CNeedQty,0) End End),
                             IsNull(@FvenPoqs,0),0,IsNull(@FHCQty,0), IsNull(@FPDQty,0), @BOMDetItemno,
                             Case When IsNull(@CcNeedQty,0) >= 0 Then IsNull(@CnQty,0)
                                         Else IsNull(@CnQty,0) + IsNull(@CcNeedQty,0) End ,
                             @BomDetQty,IsNull(@VenPoqs,0),0,0,0,@Source,0,@Foot,IsNull(@FNQty,0),IsNull(@CnQty,0)

                              If   @@Error <> 0
                              Begin
                                          Set   @Returnid = 0
                                          Set   @ErrMsg = '插入數據出錯﹐請與電腦部聯系!'
                                          GoTo ExitLable         
                              End
                       End
                      Fetch Next From Table_BOM Into @BOMDetItemno,@BomDetQty,@Source
                      End

             End
             Close Table_BOM
             DeAllocate Table_BOM

             Update  W_MRPResultDetail Set  IsRunOver = 1 Where CalcuNo = @CalcuNo And FItemNo = @ItemNo And CItemNo = @Itemno
             If @@ROWCount = 0
             Begin
                          Set    @Returnid = 0
                          Set    @ErrMsg = 'MRP計算插入數據出錯,請與電腦部聯系!'
                          GoTo ExitLable    
             End 
             Set  @SumFCQty = 0
             Fetch Next From Table_FC Into @Itemno,@SumFCQty, @NeedDate
             End
          End
          Close Table_FC
          DeAllocate Table_FC  

Declare @CItemNO Varchar(30)
Declare @CQty  Decimal(20,5)
Declare @NdDate DateTime
Declare @dNeedQty   Decimal(20,5)
Declare @Sysno Int

Set @Foot=1
--進行多次展開的循環過程      
BOMLable:
Begin
             Set @Count = 0
             Select @Count = Count(*)  From W_MRPResultDetail
             Where CalcuNo = @CalcuNo And CSource = '自制'
             And IsRunOver = 0 
             And  CNeedQty > 0              -- 考慮要自制的來進行展開

             If @Count > 0
             Begin
                           Select Sysno,CItemno,CNeedQty,NeedDate,FHCQty,FPDQty
                            Into   #ABC
                            From W_MRPResultDetail
                            Where CalcuNo = @CalcuNo And CSource = '自制'
                            And IsRunOver = 0
                            And  CNeedQty > 0 

             Declare Table_BOMAgain Cursor for Select  Sysno,CItemno,CNeedQty,NeedDate,FHCQty,FPDQty  From #ABC
             Open Table_BOMAgain
             Fetch Next From Table_BOMAgain  Into @Sysno,@CItemNO,@CQty,@NdDate,@FHCQty,@FPDQty
             While (@@Fetch_Status = 0)
             Begin
---記錄沒有BOM資料的ItemNO
                        Select   @Count = Count(*)
                        From B_ItemBomMas
                        Where Itemno = @CItemNO And Issure = 1 And Bomtype = 0

                        If   @Count = 0
                        Begin
                                   Update  W_MRPResultDetail Set  IsRunOver = 2 Where Sysno = @Sysno
                                   Insert Into B_ItemNotBom(Itemno,Idkey,NeedDate) Values (@CItemNO,2,@NdDate)
                       End
                       Else
                       Begin
-- @FLeadTime 父提前期
                                   Select  @FLeadTime = IsNull(LeadTime,0)  From W_MRPResultDetail
                                   Where CalcuNo = @CalcuNo  And CItemNo = @CItemNO And sysno = @Sysno

                                  Declare Table_BOM Cursor for    Select Citemno,Qty,Source From #T6  Where  Fitemno = @CItemNO 
                                  Open Table_BOM
                                  Fetch Next From Table_BOM Into @BOMDetItemno,@BomDetQty,@Source
                                  While (@@Fetch_Status = 0)
                                  Begin
                                              Set  @VenPoqs = 0
                                              Set  @PdQty = 0
                                              Set  @CcQty = 0
                                              Set  @FAllQty = 0
                                              Set  @CAllQty = 0
--                                              Set  @CusPoqs = 0
                                              Set  @CnQty = 0
-- @LeadTime 本節點的提前期
                                             Select  @LeadTime = @FLeadTime  + Ceiling( IsNull( I.LeadTime ,0)/Case When IsNull(A.aDate,0)=0 Then 1 Else IsNull(A.aDate,0) End)
                                             From VB_Items I,(Select Top 1 aDate From B_TimeArea)A
                                             Where  ItemNo = @BOMDetItemno
--車間存數
                                             Select @PdQty = IsNull(stockqty,0)  From #T3 Where Itemno = @BOMDetItemno 
--貨倉庫存
                                             Select @CcQty = IsNull(StockQty,0)  From #T4 Where ItemNO = @BOMDetItemno
--計算總數
                                            Select  @Count = Count(*)  From   W_MRPResultDetail 
                                            Where  CalcuNo = @CalcuNo And CItemNo = @BOMDetItemno

                                            If   @Count = 0
                                            Begin
                                                       Select     @CAllQty = IsNull(@CQty,0) * IsNull(@BomDetQty,0) - IsNull(@PdQty,0) - IsNull(@CcQty,0)                                           
                                                       Select     @CnQty = IsNull(@CQty,0) * IsNull(@BomDetQty,0)  
                                            End
                                            Else
                                            Begin
                                                       Select  Top 1  @dNeedQty = IsNull(CNeedQty,0)  From   W_MRPResultDetail 
                                                       Where  CalcuNo = @CalcuNo And  CItemNo = @BOMDetItemno
                                                       Order by RunDate Desc
                                                       Select   @CAllQty = Case When  IsNull(@dNeedQty,0) >= 0
                                                                                                          Then   IsNull(@CQty,0)*IsNull(@BomDetQty,0) 
                                                                                               Else IsNull(@CQty,0)*IsNull(@BomDetQty,0)+IsNull(@dNeedQty,0)  End
                                                       Select   @CnQty  =   IsNull(@CQty,0)*IsNull(@BomDetQty,0)
                                            End
-- 如果本節點毛需求小於等於0﹐不用考慮本節點
                                            If      @CnQty <= 0
                                              Fetch Next From Table_BOM Into @BOMDetItemno,@BomDetQty,@Source
--BOM展開   20051101   不用再考慮PO欠數﹐但是要考慮車間和庫存量
                                           Else   Begin
                                            Insert Into W_MRPResultDetail (CalcuNo,LeadTime,NeedDate,RunDate,FItemNO,FNeedQty,FPurPoqs,
                                                                FCusPoqs,FHCQty,FPDQty, CItemno,CNeedQty,CUnitQty,CPurPoqs,CCusPoqs,
                                                                CHCQty,CPDQty,CSource,IsRunOver,Foot,FQty,CQty)
                                            Values(@CalcuNo,@LeadTime,@NdDate,GetDate(),@CItemNO,IsNull(@CQty,0),0,0, IsNull(@FHCQty,0),
                                                              IsNull(@FPDQty,0), @BOMDetItemno,@CAllQty,@BomDetQty,IsNull(@VenPoqs,0),0,
                                                              Case When @Count  > 0 Then 0 Else IsNull(@CcQty,0) End,
                                                              Case When @Count  > 0 Then 0 Else IsNull(@PdQty,0) End,
                                                               @Source,0,@Foot,IsNull(@CQty,0),IsNull(@CnQty,0))  
   
                                            If @@ROWCount = 0
                                            Begin
                                                        Set    @Returnid = 0
                                                        Set    @ErrMsg = 'MRP計算插入數據出錯,請與電腦部聯系!'
                                                        GoTo ExitLable    
                                           End

                                           Update  W_MRPResultDetail Set  IsRunOver = 1 Where sysno = @sysno
                                           If @@ROWCount  = 0
                                           Begin
                                                       Set    @Returnid = 0
                                                       Set    @ErrMsg = 'MRP計算插入數據出錯,請與電腦部聯系!'
                                                       GoTo ExitLable    
                                           End 
                                           Fetch Next From Table_BOM Into @BOMDetItemno,@BomDetQty,@Source
                                          End
                                 End
                                 Close Table_BOM
                                 DeAllocate Table_BOM   
                         End
                        Fetch Next From Table_BOMAgain Into @Sysno,@CItemNO,@CQty,@NdDate,@FHCQty,@FPDQty    
                End
               Close Table_BOMAgain
               DeAllocate Table_BOMAgain  
               Drop table #ABC
   End
End
--/再次判斷     如果還有的話則進行bom展開﹐如果沒有的話則要開始進行時間的循環
  Select @Count = 0
  Select @Count = Count(*)
  From W_MRPResultDetail
  Where CalcuNo = @CalcuNo And  CSource = '自制'
   And   IsRunOver = 0
   And  CNeedQty > 0

   If @Count  >  0
   Begin
              Select     @Foot = 1 + @Foot
              GoTo BOMLable--循環計算
   End   Else
   Begin     
--把BOM結構中屬於的採購的拿出來準備做採購單 ; 已訂未送在按時段循環的時候計算
              Select Citemno As ItemNo,Sum(Cqty)  As MaoQty,Sum(Case When CNeedQty < 0 Then 0 Else CNeedQty End) As JNeedQty ,
                            0 As CCusPoqs,0 As vPoqs,LeadTime, NeedDate,  Sum(CHCQty) As HCQty,Sum(CPDQty) As PDQty
              Into #Result1 
              From W_MRPResultDetail
              Where CalcuNo = @CalcuNo And  CSource = '採購'
              Group By Citemno,LeadTime,NeedDate
--              Having Sum(CNeedQty)>0 
              Order By Citemno

              Select       @Count = 0
              Select @Count = Count(*)
              From #Result1

              If   @Count = 0
              Begin
                        Set    @Returnid = 0
                        Set    @ErrMsg = 'MRP運算完畢,本次計算沒有需要採購的物料!'
                        GoTo ExitLable
               End

               Select R.*,B.partno,B.Partname,B.Model,B.Vendorno,B.Vendor
               Into #Result2
               From #Result1 R   Inner Join VB_Items  B On  B.itemno = R.itemno
               Where B.Issure = 1
--運算所有的自制FOR廠內加工    此處只考慮採購和加工兩種情況﹐虛擬件等未考慮在內!!!
             Select  Citemno As ItemNo,Sum(Cqty) As MaoQty,Sum(Case When CNeedQty < 0 Then 0 Else CNeedQty End) As JNeedQty ,
                            0 As CCusPoqs,0 As vPoqs,LeadTime, NeedDate, Sum(CHCQty) As HCQty,Sum(CPDQty) As PDQty
              Into #SelfMasterResult1 
              From W_MRPResultDetail
              Where CalcuNo = @CalcuNo  And  CSource <>  '採購' 
              Group By Citemno,LeadTime,NeedDate
              Order By Citemno

              Select       @Count = 0
              Select @Count = Count(*) From #SelfMasterResult1
              If @Count = 0
              Begin
                        Set    @Returnid = 0
                        Set    @ErrMsg = 'MRP運算完畢﹐本次計算沒有要加工的物料!'
                        GoTo ExitLable
              End

              Select R.*,B.Partno,B.Partname,B.Model,B.Vendorno,B.Vendor,GetDate() as RunDate
              Into #SelfMasterResult2
              From #SelfMasterResult1 R   Inner Join VB_Items  B On  B.Itemno = R.Itemno
              Where B.Issure = 1

              Insert Into W_MRPResultForSelf(CalcuNo,LeadTime,NeedDate,Itemno,Partno,Partname,Model,Vendorno,Vendor,
                                                                               Maoqty,VPoqs,Hcqty,Pdqty,Jneedqty,RunDate)
              Select  @CalcuNO, LeadTime ,NeedDate,Itemno,Partno,Partname,Model,Vendorno,Vendor,
                             Maoqty,VPoqs,Hcqty,Pdqty,Jneedqty,RunDate
              From #SelfMasterResult2

              If @@Error <> 0
              Begin
                        Set @Returnid = 0
                        Set @ErrMsg = '沒有生成加工單,請與電腦部聯系!'
                       GoTo ExitLable    
               End  
Declare  @RItemno         Varchar(30)
Declare  @RPartno          Varchar(30)
Declare  @Rpartname    Varchar(100)
Declare  @Rmodel          Varchar(100)
Declare  @RVendor        Varchar(50)
Declare  @RVendorno   Varchar(20)
Declare  @RmaoQty        Decimal(20,5)
Declare  @RVPoqs        Decimal(20,5)
Declare  @RHCQty           Decimal(20,5)
Declare  @RPDQty           Decimal(20,5)
Declare  @RJNeedQty    Decimal(20,5)
Declare  @NDate               DateTime
Declare  @LdTime            Int                        --提前期
Declare  @ID                       Int

          Declare Talbe_Result Cursor  for Select LeadTime,NeedDate,Itemno,Partno,Partname,Model,Vendorno,Vendor,Maoqty,
                                                                                         VPoqs,Hcqty,Pdqty,Jneedqty
          From #Result2
          Open Talbe_Result
          Fetch Next From Talbe_Result  Into  @LdTime,@NDate,@RItemno,@RPartno,@Rpartname,@Rmodel,@RVendorno,
                                                                                @RVendor,@RmaoQty,@RVPoqs,@RHCQty,@RPDQty,@RJNeedQty
          While (@@Fetch_Status = 0)
          Begin
                     Insert Into W_MRPResultForPo (LeadTime,NeedDate,CalcuNo,Itemno,Partno,Partname,Model,Vendorno,Vendor,
                                                                                     Maoqty,VPoqs,Hcqty,Pdqty,Jneedqty,RunDate)
                     Values  (@LdTime,@NDate, @CalcuNO,@RItemno,@RPartno,@Rpartname,@Rmodel,@RVendorno,@RVendor,
                                      @RmaoQty, @RVPoqs,@RHCQty,@RPDQty,@RJNeedQty,GetDate())

                     If @@ROWCount = 0
                     Begin
                                Set    @Returnid = 0
                                Set    @ErrMsg = 'MRP分配供應商出錯,請與電腦部聯系!'
                                GoTo ExitLable    
                    End

                Fetch Next From Talbe_Result  Into @LdTime,@NDate,@RItemno,@RPartno,@Rpartname,@Rmodel,@RVendorno,
                                                                                          @RVendor,@RmaoQty,@RVPoqs,@RHCQty,@RPDQty,@RJNeedQty
          End
          Close  Talbe_Result
          DeAllocate Talbe_Result
End
--關閉所有已經運算過的預測單
     Update W_SalesForeCastMas Set MRPClosed = 1
     From W_SalesForeCastMas M, W_SalesForeCastDet D
     Where  D.Sysbillno = M.Sysbillno 
     And  D.NeedDate <= @MaxEndDate
     And M.Issure = 1 
     And M.MRPClosed = 0
     And D.Havemrp = 1

      If @@ROWCount = 0
     Begin
                   Set @Returnid = 0
                   Set @ErrMsg = '更新預測單表頭出錯!'
                   GoTo ExitLable    
     End

     Update W_SalesForeCastdet Set MRPClose = 1
     From W_SalesForeCastMas M, W_SalesForeCastDet D
     Where D.Sysbillno = M.Sysbillno
     And  D.NeedDate <= @MaxEndDate 
     And M.Issure = 1
     And D.MRPClose = 0
     And D.Havemrp = 1

     If @@ROWCount = 0
     Begin
                  Set    @Returnid = 0
                  Set    @ErrMsg = '更新預測單明細出錯!'
                  GoTo ExitLable    
      End
--關閉所有已經運算過的訂單
     Update O_POMas Set MRPClosed = 1
     Where   poDate <= @MaxEndDate 
      And Issure = 1  And IsDirectExport = 0
      And  Syspono Not In (Select  Syspono From #TA1)

      If @@ROWCount = 0
     Begin
                   Set @Returnid = 0
                   Set @ErrMsg = '更新訂單表頭出錯!'
                   GoTo ExitLable    
     End

     Update O_PODet Set MRPClosed = 1
     Where  Syspono  In (Select  Syspono From O_POMas Where MRPClosed = 1)

     If @@ROWCount = 0
     Begin
                  Set    @Returnid = 0
                  Set    @ErrMsg = '更新訂單明細出錯!'
                  GoTo ExitLable    
      End
---------------------------------------------------------------------------------------------------------------------------------------------------
--- 進行按時間區段循環
Declare    @FirstI               Int     --用於判斷是否第一個時間區段﹐因為這個時間段的庫存要特殊處理
Declare    @aStartDate   DateTime
Declare    @aEndDate    DateTime
Declare    @TimeArea    Int    -- 時間區段個數
Declare    @aCount          Int
          Select           @FirstI = 0
-----   採購PO預計入庫(供應商欠數),已訂未送 
--注意﹕有消息說把預計入庫都放在第一個區段內﹐不用考慮在別的區段的情況。消息有待確認!!!!!
          Select  B.Itemno, A.Poqs as SumFCQty,A.Purpodate as DelyDate  
          Into #T2
          From (
                       Select Syspartno, Purpodate,Sum(IsNull(Poqs,0)) As Poqs
                       From (
                                    Select aa.*, bb.Delyqty,IsNull(aa.Qty,0)-IsNull(bb.Delyqty,0) As Poqs
                                    From  (
                                                 Select  Purpono,Purpodate ,Syspartno,Sum(Qty) As Qty
                                                 From (
                                                             Select Syspurpono,Purpono,Case When IsDate(DelyDate)=1 Then  Convert(DateTime,DelyDate,120)  Else  PurPoDate  End  Purpodate
                                                             From O_PurPOMas       --下面的 purpodate以後換成O_purPODet中的delydate
                                                             Where Isstop=0 And Issure=1 And Purpodate<=@MaxEndDate
                                                             ) m   Inner Join O_PurPODet d On m.Syspurpono=d.Syspurpono
                                                              Group By Purpono,m.Purpodate,Syspartno
                                                    )  aa    
                                                        Left Join  (
                                                                           Select d.Pono,d.Syspartno,IsNull(Sum(Qty),0) As Delyqty
                                                                           From O_VendorDelyMas m
                                                                           Inner Join O_VendorDelyDet  d On m.SysDelyNo=d.SysDelyNo
                                                                          Group By d.Pono,d.Syspartno
                                                                           ) bb  On aa.Purpono=bb.Pono And aa.Syspartno=bb.Syspartno
                                                           Where  IsNull(aa.Qty,0)<>IsNull(bb.Delyqty,0) 
                                          )  TT  Group By Syspartno,Purpodate
                        ) A Inner Join
                           (Select Syspartno,Itemno From VB_Purgoods Group By Syspartno,Itemno ) B On A.Syspartno=B.Syspartno
--需求的全部物料號碼 For  Purchase          
          Select  Distinct  CalcuNo, ItemNO,PartNo,PartName,Model,VendorNo, Vendor
          Into         #ItemCount
          From     W_MRPResultForPo  
          Where  CalcuNo = @CalcuNo
--需求的全部自制號碼 For  Self-Make
         Select Distinct CalcuNo,ItemNo,PartNo,PartName,Model
         Into         #SelfCount
         From W_MRPResultForself
          Where  CalcuNo = @CalcuNo
--*************** ***********************************************  開始時間循環
          Declare Time_Result Cursor  for Select   StartDate,EndDate   From  B_TimeCircle
          Open Time_Result
          Fetch Next From Time_Result   Into @aStartDate,  @aEndDate
          While (@@Fetch_Status = 0)
          Begin
-----------------------------------------------------------------------------------------------------------   
                  If  @FirstI = 0
                 Begin
--第一時區的預計入庫計算For Purchase
                       Select   Sum(SumFCQty)  As VPoqs,ItemNo 
                       Into     #Futureqty1
                       From  #T2  
                       Where  DelyDate <  @aEndDate + 1
                       Group By  ItemNo  

                       Select  ItemNo, Sum(IsNull(VPoqs,0))VPoqs,  Sum(IsNull(HCQty,0))HCQty , Sum(IsNull(PDQty,0))PDQty
                       Into   #KuCunQty
                       From  W_MRPResultForPo     Where     CalcuNO = @CalcuNO
                       Group By  ItemNo
                       Select  R.ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Sum(Maoqty)Maoqty,Sum(JNeedQty) JNeedQty,
                                     Sum(R.VPoqs)VPoqs,P.HCQty As HCQty,P.PDQty As PDQty,Max(NeedDate) NeedDate,
                                     Max(IsNull(LeadTime,0)) LeadTime

                       Into   #Nextqty1               
                       From  W_MRPResultForPo  R  Left Join #KuCunQty P On R.ItemNo = P.ItemNo
                       Where   NeedDate < @aEndDate + 1
                       And  CalcuNO = @CalcuNO
                      Group By  R.ItemNo,PartNo,PartName,Model,VendorNo,Vendor ,P.HCQty,  P.PDQty
--第一時間區段的毛需求 For   Self-Make      
                       Select  ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Sum(Maoqty)Maoqty,Sum(JNeedQty) JNeedQty,
                                     Sum(IsNull(HCQty,0)) + Sum(IsNull(PDQty,0))  As StockQty,--Sum(IsNull(VPoqs,0))+Sum(IsNull(HCQty,0))+Sum(IsNull(PDQty,0))-Sum(Maoqty)
                                     Sum(IsNull(VPoqs,0))VPoqs,Sum(IsNull(HCQty,0))HCQty,Sum(IsNull(PDQty,0))PDQty,
                                     Max(NeedDate) As NeedDate,Max(IsNull(LeadTime,0)) LeadTime
                       Into   #NextqtyA1               
                       From  W_MRPResultForSelf
                       Where   NeedDate < @aEndDate + 1
                       And  CalcuNO = @CalcuNO
                      Group By  ItemNo,PartNo,PartName,Model,VendorNo,Vendor   
--------------------------------- 考慮安全庫存﹐最小批量和批量增量
                       Select  @CalcuNO As CalcuNo,  1 As TimeArea,N.ItemNO,N.PartNo,N.PartName,N.Model,N.VendorNo, N.Vendor,
                                      IsNull(N.Maoqty,0) As Maoqty,                                     
                                      Case When (( IsNull(N.HCQty,0) + IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) ) < 0 Then
                                                           (Case  When   IsNull(I.BatchAppendQty,0) = 0 Then 
                                                                                       (Case When ((0 - (( IsNull(N.HCQty,0) + IsNull(N.PDQty,0) + IsNull(F.VPoqs,0))*1.0 - IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                IsNull(I.MinQty,0)
                                                                                                   Else ((0 - (( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                        End) 
                                                                           Else  Case When    (Case When ((0 - (( IsNull(N.HCQty,0) + IsNull(N.PDQty,0) + IsNull(F.VPoqs,0))*1.0 - IsNull(N.Maoqty,0) ) + IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 ) <= IsNull(I.MinQty,0) Then
                                                                                                                                             IsNull(I.MinQty,0)
                                                                                                                                Else ((0 - (( IsNull(N.HCQty,0) + IsNull(N.PDQty,0) + IsNull(F.VPoqs,0))*1.0 - IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                   End) <= IsNull(I.BatchAppendQty,0) Then    IsNull(I.BatchAppendQty,0)
                                                                                       Else      
                                                                                                Case When ( Convert(int,(Case When ((0 - (( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ( (IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End))% Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End))=0   Then
                                                                                                                              (Case When ((0 - (( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - (( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)
                                                                                                                Else
                                                                                                                          ( ( (Case When ((0 - (( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - (( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0) )+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)/Case When IsNull( I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)+1)* IsNull(I.BatchAppendQty,0)
                                                                                                       End
                                                                                           End
                                                                      End)*IsNull(D.Yield,0)/100  + ( IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0)-IsNull(N.Maoqty,0) )
                                      Else
                                                IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0)-IsNull(N.Maoqty,0)
                                      End as Stockqty,
                                      IsNull(F.VPoqs,0) As PlanIn,0  As PlanNum ,N.NeedDate,N.LeadTime,
                                      Case When ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))< 0 Then
                                                              (0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))
                                                   Else   0    
                                      End As Needqty,
                                      Case When ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))< 0 Then
                                                           (Case  When   IsNull(I.BatchAppendQty,0)=0 Then 
                                                                                       (Case When ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then

                                                                                                                IsNull(I.MinQty,0)
                                                                                                   Else ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                        End) 
                                                                           Else  Case When    (Case When ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                             IsNull(I.MinQty,0)
                                                                                                                                Else ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                   End)<= IsNull(I.BatchAppendQty,0) Then    IsNull(I.BatchAppendQty,0)
                                                                                       Else      
                                                                                                Case When (Convert(int, (Case When ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End))%Convert(int, Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End))=0   Then
                                                                                                                              (Case When ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)
                                                                                                                Else
                                                                                                                          ( ( (Case When ((0 - ((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 -((IsNull(N.HCQty,0)+IsNull(N.PDQty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)/ Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)+1)* IsNull(I.BatchAppendQty,0)
                                                                                                       End
                                                                                           End
                                                                      End)  
                                                    Else  0 
                                      End  As PlanPoNum

                       Into  #TimeArea1
                       From  #Nextqty1  N  Left  Join  #Futureqty1 F On  N.ItemNO = F.ItemNO
                       Left  Join  VB_Items  I  On  N.ItemNo = I.ItemNo
                       Left  Join (Select Distinct  M.Yield,D.ItemNo From B_ItemBomMas M Inner Join B_ItemBomDet D On M.sysbillNo = D.sysbillNo) D On N.ItemNo = D.ItemNo
                  End
--其他時間區段For Purchase
                  Else  Begin
--不是第一時區的預計入庫計算For Purchase
                       Select   Sum(SumFCQty)  As VPoqs,ItemNo 
                       Into   #Futureqty
                       From  #T2
                       Where  DelyDate >= @aStartDate  And DelyDate < @aEndDate+1
                       Group By  ItemNo

                       Select  ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Sum(Maoqty)Maoqty,Sum( VPoqs) VPoqs,
                                    0 As HCQty,0 As PDQty,Max(NeedDate) NeedDate,Max(IsNull(LeadTime,0)) LeadTime
                        Into   #Nextqty               
                        From  W_MRPResultForPo
                        Where NeedDate >= @aStartDate
                        And  NeedDate < @aEndDate + 1
                        And  CalcuNo = @CalcuNo
                        Group By  ItemNo,PartNo,PartName,Model,VendorNo,Vendor 

--其他時間區段For Self-Mastery      
                        Select  ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Sum(Maoqty)Maoqty,Sum(JNeedQty) NeedQty,
                                    Max(NeedDate) NeedDate,Max(IsNull(LeadTime,0)) LeadTime
                        Into   #NextqtyA               
                        From  W_MRPResultForSelf
                        Where NeedDate >= @aStartDate
                        And  NeedDate < @aEndDate + 1
                        And  CalcuNo = @CalcuNo
                        Group By  ItemNo,PartNo,PartName,Model,VendorNo,Vendor 
--------------------------------------
                       Select  @CalcuNO As CalcuNo,IsNull(@TimeArea,0)+1 As TimeArea, N.ItemNO,N.PartNo,N.PartName,N.Model,N.VendorNo,
                                      N.Vendor,IsNull(N.Maoqty,0) As Maoqty,
                                      Case When (IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0)-IsNull(N.Maoqty,0))< 0 Then
                                                              (0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))
                                                   Else   0    
                                      End As Needqty,
                                      Case When ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))< 0 Then
                                                           (Case  When   IsNull(I.BatchAppendQty,0)=0 Then 
                                                                                       (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                IsNull(I.MinQty,0)
                                                                                                   Else ((0 -( (IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                        End) 
                                                                           Else  Case When    (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                             IsNull(I.MinQty,0)
                                                                                                                                Else ((0 -( (IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                   End)<= IsNull(I.BatchAppendQty,0) Then    IsNull(I.BatchAppendQty,0)
                                                                                       Else      
                                                                                                Case When ( Convert(int,(Case When ((0 -( (IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End))% Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End))=0   Then
                                                                                                                              (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)
                                                                                                                Else
                                                                                                                          ( ( (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)/ Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)+1)* IsNull(I.BatchAppendQty,0)

                                                                                                       End
                                                                                           End
                                                                      End)*IsNull(D.Yield,0)/100  + ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))
                                      Else
                                              ( IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0)
                                      End as Stockqty,
                                      IsNull(F.VPoqs,0) As PlanIn,0  As PlanNum ,
                                      Case When ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))< 0 Then
                                                           (Case  When   IsNull(I.BatchAppendQty,0)=0 Then 
                                                                                       (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                IsNull(I.MinQty,0)
                                                                                                   Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                        End) 
                                                                           Else  Case When    (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                             IsNull(I.MinQty,0)
                                                                                                                                Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )

                                                                                                                   End)<= IsNull(I.BatchAppendQty,0) Then    IsNull(I.BatchAppendQty,0)
                                                                                       Else      
                                                                                                Case When ( Convert(int,(Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End))% Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End))=0   Then
                                                                                                                              (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)
                                                                                                                Else
                                                                                                                          ( ( (Case When ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )<=IsNull(I.MinQty,0) Then
                                                                                                                                                    IsNull(I.MinQty,0)
                                                                                                                                        Else ((0 - ((IsNull(P.Stockqty,0)+IsNull(F.VPoqs,0))*1.0-IsNull(N.Maoqty,0))+IsNull(I.SecInv,0))*IsNull(D.Yield,0)/100 )
                                                                                                                               End)/Case When IsNull( I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)+1)* IsNull(I.BatchAppendQty,0)
                                                                                                       End
                                                                                           End
                                                                      End)  
                                                    Else  0 
                                      End  As PlanPoNum,
                                      N.NeedDate,N.LeadTime

                       Into   #TimeArea2   
                       From  #Nextqty  N  Left  Join  #Futureqty F On  N.ItemNO = F.ItemNO
                       Left Join (Select  * From  W_MRPData
                                          Where  CalcuNo = @CalcuNO And TimeArea = @FirstI  And Flag = 0 ) P On N.ItemNO = P.ItemNO   
                       Left Join VB_Items I On N.ItemNo = I.ItemNo
                       Left  Join (Select Distinct  M.Yield,D.ItemNo From B_ItemBomMas M
                                           Inner Join B_ItemBomDet D On M.sysbillNo=D.sysbillNo) D On N.ItemNo = D.ItemNo
                    End
---------------------------------------------------------------------------------------------------------------
--按時間循環 開始 
                       If   @FirstI = 0    --第一時間區段    
                       Begin     
-- 先插入自制記錄  For Self-make
                                    Select  @Count = 0
                                    Select  @aCount = 0

                                    Select  @Count =  Count(*)
                                    From  #SelfCount
                                    Select  @aCount = Count(*)
                                    From  #NextqtyA1

                                    If   @Count <> @aCount
                                    Begin
                                               Insert  W_MRPData(CalcuNo,TimeArea,S.ItemNo,PartNo,PartName,Model, VendorNo, Vendor,
                                                           Maoqty,Stockqty,PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                              Select    @CalcuNo,1 As TimeArea,S.ItemNo,PartNo,PartName,Model,'' As VendorNo,'' As Vendor,
                                                             0 As Maoqty,IsNull(F.HCQty,0)+IsNull(F.PDQty,0) As Stockqty,0 As PlanIn,0 As NeedQty,
                                                             0 As PlanNum,0 As PlanPoNum, @aStartDate ,0 As LeadTime,1 As Flag
                                              From   #SelfCount  S Left  Join   (Select  Top 1 ItemNO,HCQty,PDQty From W_MRPResultForSelf
                                                                                                             Where CalcuNO=@CalcuNo  And HCQty<>0 Or (PDQty<>0))F
                                                          On S.ItemNo = F.ItemNo 

                                              If   @@Error <> 0
                                              Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                              End   

                                             Update W_MRPData   Set Maoqty=IsNull(N.Maoqty,0),LeadTime = IsNull(N.LeadTime,0),
                                                             Stockqty=Case When (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0))>0 Then
                                                                                      ( Case When IsNull(I.BatchAppendQty,0)=0 Then   
                                                                                                 Case When  (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End
                                                                                        Else Case  When  (Case When  (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0)-IsNull(N.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End)<=IsNull(I.BatchAppendQty,0) Then
                                                                                                             IsNull(I.BatchAppendQty,0)  Else  Case When  Convert(int,(Case When  (N.Maoqty-N.Stockqty+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End))%Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)=0
                                                                                                             Then   (Case When  (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End)
                                                                                                    Else   ( (Case When  (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(N.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End)/Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End +1)*IsNull(I.BatchAppendQty,0)
                                                                                          End  End End)*IsNull(D.Yield,100)/100+IsNull(N.StockQty,0) - IsNull(N.Maoqty,0)
                                                                                  Else    (IsNull(N.Stockqty,0) - IsNull(N.Maoqty,0))  End,                                                                                         
                                                             NeedQty=Case When (IsNull(N.Maoqty,0)-IsNull(N.Stockqty,0))>0 Then (IsNull(N.Maoqty,0)-IsNull(N.Stockqty,0)+IsNull(I.SecInv,0))
                                                                                              Else 0  End                                                             
                                             From     W_MRPData M Inner Join (Select ItemNo,Maoqty,JNeedQty,StockQty,LeadTime
                                                                                                                  From #NextqtyA1)N On M.ItemNo = N.ItemNo
                                            Left Join  VB_Items I  On M.ItemNo = I.ItemNo
                                            Left Join (Select  Distinct  Yield,ItemNo From B_ItemBomMas ) D On N.ItemNo = D.ItemNo
                                             Where  CalcuNo = @CalcuNo And Flag = 1 And TimeArea = 1 

                                             If   @@Error <> 0
                                             Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算修改數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                              End
                                    End
                                    Else
                                    Begin
                                                 Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                                        Stockqty, PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                 Select   @CalcuNo,@FirstI + 1  As TimeArea,N.ItemNO,PartNo,PartName,Model,VendorNo, Vendor,
                                                                 Maoqty,Case When (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))) > 0 Then
                                                                                       (Case When IsNull(I.BatchAppendQty,0) = 0 Then   
                                                                                                 Case When  (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End
                                                                                        Else Case  When  (Case When  (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End)<=IsNull(I.BatchAppendQty,0) Then
                                                                                                             IsNull(I.BatchAppendQty,0)  Else  Case When  Convert(int,(Case When  (N.Maoqty-(VPoqs+HCQty+PDQty)+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End))%Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)=0
                                                                                                             Then   (Case When  (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0)) + IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End)
                                                                                                    Else   ( (Case When  (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0))+IsNull(I.SecInv,0))*100/IsNull(D.Yield,100) End)/Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End+1)*IsNull(I.BatchAppendQty,0)
                                                                                          End  End End)*IsNull(D.Yield,100)/100+(IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0)) - IsNull(Maoqty,0)
                                                                                  Else    (IsNull(VPoqs,0) + IsNull(HCQty,0) + IsNull(PDQty,0) - IsNull(N.Maoqty,0))  End   As Stockqty,   
                                                                                 0 As PlanIn,
                                                                 Case When (IsNull(Maoqty,0)-(IsNull(VPoqs,0)+IsNull(HCQty,0)+IsNull(PDQty,0)))>0 Then  (IsNull(Maoqty,0)-(IsNull(VPoqs,0)+IsNull(HCQty,0)+IsNull(PDQty,0)))+IsNull(I.SecInv,0)
                                                                             Else 0 End  As Needqty,0 As  PlanNum ,
                                                                 0 As  PlanPoNum,NeedDate,LeadTime,1 As Flag
                                                 From  #NextqtyA1 N Left Join (Select  ItemNo,SecInv,BatchAppendQty,MinQty From VB_Items) I On N.ItemNo=I.ItemNo
                                                 Left Join (Select  Distinct  Yield,ItemNo From B_ItemBomMas) D On N.ItemNo=D.ItemNo

                                                 If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End
                                    End
-- 插入採購記錄  For Purchse
                                    Select  @Count = 0
                                    Select  @aCount = 0

                                    Select  @Count =  Count(*)
                                    From  #TimeArea1
                                    Select  @aCount = Count(*)
                                    From  #ItemCount

                                    If   @Count <> @aCount
                                    Begin
                                                 Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                      Stockqty,PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                 Select   @CalcuNo,1 As TimeArea,M.ItemNO,PartNo,PartName,Model,VendorNo, Vendor,0 As Maoqty,
                                                                 ( IsNull(F.VPoqs,0)+IsNull(D.HCQty,0)+IsNull(D.PDQty,0))  As Stockqty ,
                                                                  IsNull(F.VPoqs,0) As PlanIn,0 As Needqty,0 As PlanNum ,0 As PlanPoNum,
                                                                 @aStartDate, 0,0 As Flag
                                                 From  #ItemCount   M Left  Join #Futureqty1 F  On M.ItemNo = F.ItemNo
                                                 Left Join  #KuCunQty  D  On M.ItemNo=D.ItemNo

                                                  If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End

                                                 Update   W_MRPData  Set  Maoqty = N.Maoqty,Needqty = N.Needqty,PlanPoNum = M.PlanPoNum + N.PlanPoNum,
                                                                    LeadTime = N.LeadTime,Stockqty = N.Stockqty,PlanIn = N.PlanIn
                                                  From W_MRPData M  Inner Join
                                                                                             (Select  ItemNo, Maoqty,Needqty,Stockqty,PlanIn,LeadTime,PlanPoNum
                                                                                               From #TimeArea1 )N On  M.ItemNo = N.ItemNo  
                                                  Where  CalcuNo = @CalcuNo  And TimeArea = @FirstI + 1 And Flag = 0

                                                  If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算修改數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End
                                    End
                                    Else
                                    Begin
                                                 Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                                         Stockqty, PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                 Select   CalcuNo,TimeArea,ItemNO,PartNo,PartName,Model,VendorNo, Vendor,Maoqty,
                                                                 Case When IsNull(Stockqty,0)<=0 Then 0 Else IsNull(Stockqty,0)  End ,PlanIn,Needqty,
                                                                 PlanNum , PlanPoNum,NeedDate,LeadTime,0 As Flag
                                                 From  #TimeArea1

                                                 If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End
                                    End      
                                    Drop table  #Futureqty1 
                                    Drop table  #Nextqty1   
                                    Drop table  #KuCunQty
                                    Drop table  #NextqtyA1          
                                    Drop table  #TimeArea1           

                       End
                       Else     --其他時間區段   
                       Begin
--  For  Self-Make
                                    Select  @Count = 0
                                    Select  @aCount = 0

                                    Select  @Count =  Count(*)
                                    From  #SelfCount
                                    Select  @aCount = Count(*)
                                    From  #NextqtyA

                                    If    @Count <> @aCount
                                    Begin
                                                 Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                                        Stockqty, PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                 Select    @CalcuNo,@FirstI + 1 As TimeArea,M.ItemNo,M.PartNo,M.PartName,M.Model,
                                                                  '' As VendorNo,'' As Vendor, 0 As Maoqty,D.Stockqty,0 As PlanIn,0 As Needqty,
                                                                  0 As PlanNum,0 As PlanPoNum,@aStartDate, 0 As LeadTime,1 As Flag
                                                 From    #SelfCount  M
                                                 Left  Join (Select  ItemNo,Stockqty From  W_MRPData   Where CalcuNo = @CalcuNo  And Flag = 1
                                                                    And   TimeArea = @FirstI)  D On  M.ItemNo = D.ItemNo

                                                 If   @@Error <> 0
                                                 Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                 End   

                                                 Update  W_MRPData  Set  Maoqty =IsNull( N.Maoqty,0),Needqty = Case When  (IsNull(N.Maoqty,0)-IsNull(D.Stockqty,0))<=0 
                                                                                               Then  0   Else (IsNull(N.Maoqty,0)-IsNull(D.Stockqty,0))+IsNull(I.SecInv,0)  End,
                                                                 Stockqty = Case When (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0))>0 Then
                                                                                              ( Case When IsNull(I.BatchAppendQty,0)=0 Then   
                                                                                                     Case When  (N.Maoqty-D.Stockqty+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End
                                                                                                Else Case  When  (Case When  (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0) +IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0) +IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End)<=IsNull(I.BatchAppendQty,0) Then
                                                                                                             IsNull(I.BatchAppendQty,0)  Else  Case When  Convert(int,(Case When  (IsNull(N.Maoqty,0)-IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End))%Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)=0
                                                                                                             Then   (Case When  (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End)
                                                                                                    Else   ( (Case When  (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(N.Maoqty,0) - IsNull(D.Stockqty,0) +IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End)/Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End+1)*IsNull(I.BatchAppendQty,0)
                                                                                                   End  End End)*IsNull(O.Yield,100)/100+IsNull(D.Stockqty,0) - IsNull(N.Maoqty,0)
                                                                                    Else    (IsNull(D.Stockqty,0)-IsNull(N.Maoqty,0))  End,
                                                                                               NeedDate=Case   When  (@FirstI+1-M.LeadTime)<=0 then @aStartDate
                                                                                               Else (Select StartDate From B_TimeCircle Where Sn=@FirstI+1-M.LeadTime)
                                                                                               End                                                                                                      
                                                From W_MRPData M   Inner Join (Select  ItemNo, Maoqty,NeedQty,LeadTime
                                                                                                                   From #NextqtyA )N  On  M.ItemNo = N.ItemNo 
                                                 Left Join (Select  ItemNo,Stockqty  From  W_MRPData  Where CalcuNo = @CalcuNo And Flag = 1
                                                                                                                   And TimeArea=@FirstI)D On M.ItemNo=D.ItemNo
                                                 Left Join (Select ItemNo,MinQty,BatchAppendQty,SecInv From VB_Items) I  On M.ItemNo = I.ItemNo
                                                 Left Join (Select  Distinct Yield,ItemNo From B_ItemBomMas) O On M.ItemNo = O.ItemNo
                                                 Where CalcuNo = @CalcuNo And TimeArea = @FirstI + 1   And  Flag = 1

                                                  If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算修改數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End
                                    End
                                    Else
                                    Begin
                                                 Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                  Stockqty, PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                 Select    @CalcuNo,@FirstI+1 As TimeArea,M.ItemNo,M.PartNo,M.PartName,M.Model,M.VendorNo,
                                                                  M.Vendor,IsNull(M.Maoqty,0)As Maoqty,Case When (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0))>0 Then
                                                                                      ( Case When IsNull(I.BatchAppendQty,0)=0 Then   
                                                                                                 Case When  (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else  (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End
                                                                                        Else Case  When  (Case When  (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End)<=IsNull(I.BatchAppendQty,0) Then
                                                                                                             IsNull(I.BatchAppendQty,0)  Else  Case When Convert(int, (Case When  (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End))%Convert(int,Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End)=0
                                                                                                             Then   (Case When  (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0) +IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0)+IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End)
                                                                                                    Else   ( (Case When  (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100)<=IsNull(I.MinQty,0) Then
                                                                                                             IsNull(I.MinQty,0) Else   (IsNull(M.Maoqty,0) - IsNull(D.Stockqty,0) + IsNull(I.SecInv,0))*100/IsNull(O.Yield,100) End)/Case When IsNull(I.BatchAppendQty,0)=0 Then 1 Else IsNull(I.BatchAppendQty,0) End+1)*IsNull(I.BatchAppendQty,0)
                                                                                          End  End End)*IsNull(O.Yield,100) + IsNull(D.Stockqty,0) - IsNull(M.Maoqty,0)
                                                                                  Else    (IsNull(D.Stockqty,0) - IsNull(M.Maoqty,0))  End  As Stockqty, 0 As PlanIn,
                                                                  Case When (IsNull(M.Maoqty,0)-IsNull(D.Stockqty,0))>0 Then   (IsNull(M.Maoqty,0)-IsNull(D.Stockqty,0))+IsNull(I.SecInv,0)
                                                                  Else 0  End  As  NeedQty,
                                                                  0 As PlanNum,0 As PlanPoNum,
                                                                  Case   When  (@FirstI+1-M.LeadTime)<=0 then @aStartDate
                                                                                 Else (Select StartDate From B_TimeCircle Where Sn=@FirstI+1-M.LeadTime)
                                                                    End ,M.LeadTime,1 As Flag
                                                 From    #NextqtyA   M   Left  Join
                                                              (Select  ItemNo,Stockqty From  W_MRPData   Where CalcuNo = @CalcuNo   And  Flag = 1
                                                                                                                And   TimeArea=@FirstI)  D On  M.ItemNo=D.ItemNo
                                                 Left Join (Select  ItemNo,MinQty,BatchAppendQty,SecInv From VB_Items) I On M.ItemNo = I.ItemNo
                                                 Left Join (Select  Distinct  Yield,ItemNo From B_ItemBomMas) O On M.ItemNo = O.ItemNo
                                                 Where  M.NeedDate >= @aStartDate  And  M.NeedDate <= @aEndDate

                                                 If   @@Error <> 0
                                                 Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                 End   
                                    End
--  For  Purchase
                                    Select  @Count = 0
                                    Select  @aCount = 0
  
                                    Select  @Count =  Count(*)
                                    From  #TimeArea2
                                    Select   @aCount = Count(*)
                                    From #ItemCount
                                    If   @Count <> @aCount
                                    Begin
                                                 Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                 Stockqty,PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                 Select   @CalcuNo,(@FirstI+1) As TimeArea,M.ItemNO,M.PartNo,M.PartName,M.Model,M.VendorNo,
                                                                 M.Vendor,0 As Maoqty,Case When (IsNull(D.Stockqty,0)+IsNull(F.VPoqs,0))>0 Then (IsNull(D.Stockqty,0)+IsNull(F.VPoqs,0)) Else 0 End Stockqty ,
                                                                 IsNull(F.VPoqs,0) As PlanIn,0 As Needqty,0 As PlanNum ,0 As PlanPoNum,@aStartDate, 0,0 As Flag 
                                                 From  #ItemCount   M  Left  Join W_MRPData  D 
                                                 On (M.CalcuNo=D.CalcuNo And M.ItemNo=D.ItemNo And D.TimeArea=@FirstI   And  D.Flag = 0)
                                                 Left  Join #Futureqty  F  On M.ItemNo=F.ItemNo

                                                  If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End

                                                 Update   W_MRPData  Set  Maoqty = IsNull(N.Maoqty,0),Needqty=IsNull(N.Needqty,0),Stockqty=IsNull(N.Stockqty,0),
                                                                                                        LeadTime=IsNull(N.LeadTime,0), PlanIn = IsNull(N.PlanIn,0),PlanPoNum=IsNull(N.PlanPoNum,0)
                                                 From W_MRPData M   Inner Join(Select  ItemNo, Maoqty,Needqty,Stockqty,PlanIn,LeadTime,
                                                                                              PlanPoNum From #TimeArea2 )N On  M.ItemNo = N.ItemNo 
                                                 Where CalcuNo = @CalcuNo And TimeArea = @FirstI + 1   And  Flag = 0

                                                  If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算修改數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End
                                   End
                                   Else
                                   Begin
                                                  Insert W_MRPData(CalcuNo,TimeArea,ItemNo,PartNo,PartName,Model,VendorNo,Vendor,Maoqty,
                                                                  Stockqty,PlanIn,Needqty,PlanNum,PlanPoNum,NeedDate,LeadTime,Flag)
                                                  Select    CalcuNo, (@FirstI + 1) As TimeArea, ItemNO,PartNo,PartName,Model,VendorNo,Vendor,
                                                                   Maoqty, Case  When IsNull(Stockqty,0)<=0 Then 0 Else IsNull(Stockqty,0) End ,
                                                                   PlanIn, Needqty,0  As PlanNum,PlanPoNum,NeedDate,LeadTime, 0 As Flag
                                                  From   #TimeArea2

                                                  If   @@Error <> 0
                                                  Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                                  End
                                    End   
                                   Drop table  #NextqtyA     
                                   Drop table  #Nextqty       
                                   Drop table  #Futureqty 
                                   Drop table  #TimeArea2                  
                       End
                       Select  @FirstI = @FirstI + 1
                       Fetch Next From Time_Result   Into @aStartDate,  @aEndDate
          End  
          Close  Time_Result
          DeAllocate Time_Result
          Drop table  #T2
          Drop table #ItemCount
          Drop table #SelfCount
--取得淨需求量﹐計劃訂貨量﹐計劃訂單下達
Declare    @aTimeArea  Int
Declare    @aItemNo       Varchar(30)
Declare    @Needqty       Decimal(20,5)
Declare    @aLeadTime Int
Declare    @bCount Int

     Select   @bCount = Count(*)  
     From  W_MRPData
     Where  CalcuNo = @CalcuNo
     And PlanPoNum > 0   And  Flag = 0

     If  @bCount = 0  
     Begin
                Set    @Returnid = 1
                Set    @ErrMsg = 'MRP運算完畢!'
                GoTo ExitLable
     End
     Else
     Begin
                   Select  TimeArea,ItemNo,PlanPoNum,Convert(Int,LeadTime) LeadTime 
                   Into   #T8  
                   From  W_MRPData
                   Where  CalcuNo = @CalcuNo
                   And PlanPoNum > 0   And  Flag = 0
                   Order by ItemNo,TimeArea

                               Declare  Update_table   Cursor    For   Select   TimeArea,ItemNo,PlanPoNum,LeadTime  From #T8
                               Open  Update_table
                               Fetch Next From Update_table   Into @aTimeArea,  @aItemNo  ,@Needqty,@aLeadTime
                               While @@Fetch_Status =  0
                               Begin
                                              Select  @bCount = Count( *)  From W_MRPData
                                              Where CalcuNo = @CalcuNo
                                              And  ItemNo = @aItemNo
                                              And  TimeArea  = @aTimeArea  -  @aLeadTime
                                              And  Flag = 0

                                              If   @bCount  > 0 
                                               Begin                                                             
                                                            If  (@aLeadTime <> 0) 
                                                            Begin
                                                                        Update  W_MRPData  Set  PlanPoNum = IsNull(PlanPoNum,0) + IsNull(@Needqty,0) 
                                                                        Where  CalcuNo = @CalcuNo
                                                                        And  ItemNo = @aItemNo
                                                                        And  TimeArea = @aTimeArea - @aLeadTime 
                                                                        And  Flag = 0

                                                                        Update  W_MRPData  Set  PlanPoNum =  0 
                                                                        Where  CalcuNo = @CalcuNo
                                                                        And  ItemNo = @aItemNo
                                                                        And  TimeArea = @aTimeArea
                                                                        And  Flag = 0
                                                           End
                                               End
                                               Else
                                               Begin
                                                            If   @aTimeArea<>1
                                                            Begin
                                                                        Update  W_MRPData  Set  PlanPoNum = IsNull(PlanPoNum,0) + IsNull(@Needqty,0) 
                                                                        Where  CalcuNo = @CalcuNo
                                                                        And  ItemNo = @aItemNo
                                                                        And  TimeArea = 1
                                                                        And  Flag = 0

                                                                        Update  W_MRPData  Set  PlanPoNum =  0 
                                                                        Where  CalcuNo = @CalcuNo
                                                                        And  ItemNo = @aItemNo
                                                                        And  TimeArea = @aTimeArea
                                                                        And  Flag = 0                                                                      
                                                            End
                                               End

                                               If   @@Error <> 0
                                               Begin
                                                             Set   @Returnid = 0
                                                             Set   @ErrMsg = 'MRP計算插入數據出錯﹐請與電腦部聯系!'
                                                             GoTo ExitLable         
                                               End
                                             Fetch Next From Update_table   Into  @aTimeArea,  @aItemNo  ,@Needqty,@aLeadTime
                               End
                               Close  Update_table
                               DeAllocate  Update_table       
                     
                   Set    @Returnid = 1
                   Set    @ErrMsg = 'MRP運算完畢!'
                   GoTo ExitLable
     End
-----------------------------------------------------------------------------------------------------------------------------
ExitLable:
 If @Returnid = 0   
 Begin
     ROLLBACK TRANSACTION    
 End
 Else
 Begin
             COMMIT TRANSACTION     
             Drop table #TA1
             Drop table #T5
             Drop table #T6
             Drop table #Result1
             Drop table #Result2
             Drop table #SelfMasterResult1
             Drop table #SelfMasterResult2
  End

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章