我正在创建一个存储过程来计算事务表中每个备件的移动平均成本 (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。
是否不允许在您正在更新的表中选择列值?或者我的解决方案本身有错误?我基于这个例子得出了我的解决方案 -这里。 我不想使用光标,所以我使用了这种方法。
请帮我。