SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO ALTER function fn_dGetCurrentStockInfo(@Prod varchar(40), @BeginDate Datetime, @EndDate Datetime, @CostType Int, @QtyRule Int, @AlltType Int, @ObVerse Int, @dFQty decimal(30,10),@dFOQty decimal(30,10), @dFCost decimal(30,10), @dFAmt decimal(30,10),@RptName varchar(20)) returns @ResultTable table (PROD varchar(40) primary key, PLUSQTY decimal(30,10), PLUSOQTY decimal(30,10), PLUSCOST decimal(30,10), PLUSAMT decimal(30,10), MINUSQTY decimal(30,10), MINUSOQTY decimal(30,10), MINUSCOST decimal(30,10), MINUSAMT decimal(30,10), SALEAMT decimal(30,10), BALQTY decimal(30,10), BALOQTY decimal(30,10), BALCOST decimal(30,10), BALAMT decimal(30,10), TMPAMT decimal(30,10)) as begin --declare for count cursor data-- declare @v2_sdate datetime declare @v2_qty decimal(30,10) declare @v2_ouqty decimal(30,10) declare @v2_qtytran int declare @v2_qtyop int declare @v2_sortid varchar(2) declare @v2_cost decimal(30,10) declare @v2_amt decimal(30,10) declare @v2_amt1 decimal(30,10) declare @v2_costtran int declare @v2_vchrcode varchar(14) declare @v2_cust varchar(20) declare @v2_srceri varchar(16) declare @iSide int declare @dQty decimal(30,10) declare @dOQty decimal(30,10) declare @dAmt decimal(30,10) declare @rPlusQty decimal(30,10) set @rPlusQty = 0 declare @rPlusOQty decimal(30,10) set @rPlusOQty = 0 declare @rPlusCost decimal(30,10) set @rPlusCost = 0 declare @rPlusAmt decimal(30,10) set @rPlusAmt = 0 declare @rMinusQty decimal(30,10) set @rMinusQty = 0 declare @rMinusOQty decimal(30,10) set @rMinusOQty = 0 declare @rMinusCost decimal(30,10) set @rMinusCost = 0 declare @rMinusAmt decimal(30,10) set @rMinusAmt = 0 declare @rSaleAmt decimal(30,10) set @rSaleAmt = 0 declare @rBalQty decimal(30,10) set @rBalQty = @dFQty declare @rBalOQty decimal(30,10) set @rBalOQty = @dFOQty declare @rBalCost decimal(30,10) set @rBalCost = @dFCost declare @rBalAmt decimal(30,10) set @rBalAmt = @dFAmt declare @rTmpAmt decimal(30,10) set @rTmpAmt = @dFAmt declare @TQty decimal(30,10) set @TQty = 0 declare @TAmt decimal(30,10) set @TAmt = 0 --declare for count cursor data-- declare pt_v2 cursor for select T.SDATE,T.QTY,T.OUQTY,T.QTYTRAN,T.QTYOP,T.SORTID,T.VCHRCODE,T.CUST,T.COST,T.SRCERI,T.AMT*T.QTYOP AS AMT,T.COSTTRAN,T.AMT AS AMT1 from PRODTRAN T where (T.SDATE >= @BeginDate and T.SDATE <= @EndDate) and ((@QtyRule = 0) or ((@QtyRule = 1) and (T.SORTID not in ('1D','1E','5D','5E')))) and ((@AlltType = 1) or ((@AlltType = 0) and ((T.SORTID <> '1Z') AND (T.SORTID <> '51')))) and (T.PROD = @Prod) order by T.SDATE,T.INDATETIME,T.SORTID,T.VCHRCODE,T.ERI open pt_v2 fetch next from pt_v2 into @v2_sdate, @v2_qty,@v2_ouqty, @v2_qtytran, @v2_qtyop, @v2_sortid, @v2_vchrcode, @v2_cust, @v2_cost, @v2_srceri, @v2_amt, @v2_costtran,@v2_amt1 while @@FETCH_STATUS = 0 begin set @dQty = 0 set @dOQty = 0 set @dAmt = 0 set @iSide = dbo.fn_iGetSide(@v2_sortid, @v2_qtyop) if @v2_sortid = '1C' begin set @dAmt = Round(@v2_amt, dbo.fn_iPam('A'), 0) set @rPlusAmt = @rPlusAmt + @dAmt end else if @v2_sortid = '5C' set @rSaleAmt = @rSaleAmt + Round(@v2_amt*-1, dbo.fn_iPam('A'), 0) else begin if @v2_qtytran = 1 begin if ((@iSide = 1) or (@v2_sortid = '1W') and (@v2_qtyop = 1)) --or --((@iSide = -1) and (@v2_sortid = '1W') and (@v2_qtyop = -1)) begin set @dQty = @v2_qty*@v2_qtyop set @dOQty = @v2_ouqty*@v2_qtyop set @rPlusQty = @rPlusQty + @dQty set @rPlusOQty = @rPlusOQty + @dOQty set @rPlusCost = @v2_cost --set @dAmt = Round(@dQty*@v2_cost, dbo.fn_iPam('A'), 0) if (@v2_sortid = '1W') set @dAmt = Round(@v2_amt1, dbo.fn_iPam('A'), 0) else begin if @v2_costtran = 1 --zs 销售退货BUG set @dAmt = Round(@v2_amt, dbo.fn_iPam('A'), 0) else set @dAmt = Round(@dQty*@v2_cost, dbo.fn_iPam('A'), 0) end set @rPlusAmt = @rPlusAmt + @dAmt end else if @iSide = -1 begin if (@v2_sortid = '1W') and (@v2_qtyop = -1) begin set @dQty = abs(@v2_qty)*@v2_qtyop*-1 set @dOQty =abs( @v2_ouqty)*@v2_qtyop*-1 end else begin set @dQty = @v2_qty*@v2_qtyop*-1 set @dOQty = @v2_ouqty*@v2_qtyop*-1 end set @rMinusQty = @rMinusQty + @dQty set @rMinusOQty = @rMinusOQty + @dOQty if (@v2_sortid = '1W') set @dAmt = Round(abs(@v2_amt1), dbo.fn_iPam('A'), 0) else begin --判断出货时,结存是否为0 if Round(@rBalQty + @dQty*-1, dbo.fn_iPam('Q'), 0) = 0 set @dAmt = @rBalAmt else set @dAmt = Round(@dQty*@v2_cost, dbo.fn_iPam('A'), 0) end set @rMinusAmt = @rMinusAmt + @dAmt if (@v2_sortid = '1B') or (@v2_sortid = '5B') set @rSaleAmt = @rSaleAmt + Round(@v2_amt*-1, dbo.fn_iPam('A'), 0) if Upper(@RptName) = 'RPT6882-1' set @rMinusCost = @rMinusAmt else set @rMinusCost = @v2_cost set @dQty = @dQty * -1 set @dOQty = @dOQty * -1 set @dAmt = @dAmt * -1 end end else if @v2_sortid = '1X' begin set @dQty = @v2_qty*@v2_qtyop set @dOQty = @v2_ouqty*@v2_qtyop set @rPlusQty = @rPlusQty + @dQty set @rPlusOQty = @rPlusOQty + @dOQty set @dAmt = Round(@v2_amt, dbo.fn_iPam('A'), 0) set @rPlusAmt = @rPlusAmt + @dAmt end end set @rBalQty = Round(@rBalQty + @dQty, dbo.fn_iPam('Q'), 0) set @rBalOQty = Round(@rBalOQty + @dOQty, dbo.fn_iPam('Q'), 0) set @rBalAmt = @rBalAmt + @dAmt set @rTmpAmt = @rTmpAmt + @dAmt if (@v2_costtran <> 0) and (@rBalQty <> 0) set @rBalCost = Round(@rTmpAmt/@rBalQty, dbo.fn_iPam('P'), 0) if @rPlusQty <>0 set @rPlusCost = Round(@rPlusAmt/@rPlusQty,dbo.fn_iPam('P'),0) if @rMinusQty <> 0 set @rMinusCost = Round(@rMinusAmt/@rMinusQty,dbo.fn_iPam('P'),0) if @ObVerse = 0 begin if @CostType <> 1 set @rBalCost = dbo.fn_dGetCost(@Prod, @v2_sdate, @CostType) set @rTmpAmt = @rBalCost*@rBalQty set @rBalAmt = Round(@rBalCost*@rBalQty, dbo.fn_iPam('A'), 0) end fetch next from pt_v2 into @v2_sdate, @v2_qty,@v2_ouqty, @v2_qtytran, @v2_qtyop, @v2_sortid, @v2_vchrcode, @v2_cust, @v2_cost, @v2_srceri, @v2_amt, @v2_costtran,@v2_amt1 end close pt_v2 deallocate pt_v2 insert into @ResultTable select @Prod, @rPlusQty,@rPlusOQty, @rPlusCost, @rPlusAmt, @rMinusQty,@rMinusOQty, @rMinusCost, @rMinusAmt, @rSaleAmt, @rBalQty,@rBalOQty, @rBalCost, @rBalAmt, @rTmpAmt return end GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO