1

我正在创建一个存储过程来计算事务表中每个备件的移动平均成本 (MAC)。它是某种自动检查和修复每一行的 MAC。我正在使用基于集合的方法,因为我避免使用光标。

我的交易表有以下几列:

Transaction No -- 记录该行的交易编号 TransacType -- 交易类型值将是 BEG (Beginning Balance), ISS (for Issuance), 和 RR (for Received Stocks)

库存号 -- 产品编号

成本——库存编号的每单位成本

数量——交易的数量

MAC -- 移动平均成本

规则: - 如果事务是 RR,Sproc 将计算 MAC。- 随后所有 ISS 交易的成本将等于最新 RR 的 MAC。

样品表

-----------------------------------------------------------------------
TransacNo     TransacType   StockNo Cost    Qty MAC 
-----------------------------------------------------------------------
0               BEG     AE1 450.00  10  450.00  
1               RR      AE1 460.00  05  453.33
2               ISS     AE1 453.33  01  ------
3               RR      AE1 460.00  05  455.09
4               ISS     AE1 455.09  01  ------
5               BEG     AE2 450.00  10  450.00
6               RR      AE2 460.00  05  453.33
7               ISS     AE2 453.33  01  ------
8               RR      AE2 460.00  05  455.09
9               ISS     AE2 455.09  01      ------
------------------------------------------------------------------------

我的移动平均成本公式:

Moving Average Cost = ((Latest MAC * Current OnHand Qty) + (RR Cost * RR Qty))
            ---------------------------------------------------------------
                    (Current OnHand Qty + RR Qty)

我的 MAC 修复代码:

Declare @LatestMAC decimal(18,2);
set @LatestMAC = 0.00

Declare @CurrentOnHand int;
Set @CurrentOnHand = 0


Declare @TotalISS int;
Declare @TotalRR int;

Update TransacTable
Set

@TotalISS =  
            ISNULL((
            Select SUM(Qty) 
            from 
                TransacTable TT 
            where 
                TT.TransacType = 'ISS' and
                TT.StockNo = StockNo and
                TT.TransacNo < TransacNo),0),   
@TotalRR =  
            ISNULL((
            Select SUM(Qty) 
            from 
                TransacTable TT 
            where 
                TT.TransacType = 'RR' and
                TT.StockNo = StockNo and
                TT.TransacNo < TransacNo),0),   

@LatestMAC = (Select top(1) ISNULL(MAC,0) 
            from 
                TransacTable TT 
            where 
                TT.TransacType = 'RR' and 
                TT.StockNo = StockNo and 
                TT.TransacNo < TransacNo 
            Order by 
                TT.TransacNo desc),

@CurrentOnHand = @TotalRR - @TotalISS,

MAC = 
Case
    WHEN TransacType = 'BEG'
        THEN MAC
    WHEN TransacType = 'RR'
        THEN ((@LatestMAC * @CurrentOnHand) + (Cost * Quantity) / (@CurrentOnHand * Quantity))
    else NULL
End,

Cost = 
Case
    When TransacType = 'ISS'
        THEN @LatestMAC
    else Cost
end

我的问题是 MAC 方程所需的变量(TotalISS、TotalRR、CurrentMAC)返回 NULL。

是否不允许在您正在更新的表中选择列值?或者我的解决方案本身有错误?我基于这个例子得出了我的解决方案 -这里。 我不想使用光标,所以我使用了这种方法。

请帮我。

4

1 回答 1

0

这看起来太复杂了。

尝试

update yourtable
set
    mac =  ss  
from yourtable t1
    outer apply (
         Select 
              SUM(cost*quantity* case transactype when 'iss' then -1 else 1 end)
                  /SUM(quantity * case transactype when 'iss' then -1 else 1 end) as ss 
              from yourtable 
              where transacno <= t1.transacno 
              and stockno = t1.stockno
              ) t2
于 2012-10-09T11:44:28.293 回答