1

トランザクション テーブル内の各スペア パーツの移動平均コスト (MAC) を計算するストアド プロシージャを作成しています。これは、各行の MAC のある種の自動チェックと修正です。カーソルを避けているため、セットベースのアプローチを使用しています。

私のトランザクションテーブルには次の列があります:

Transaction No -- 行の取引番号のレコード TransacType -- 取引タイプの値は、BEG (期首残高)、ISS (発行の場合)、および RR (受入株式の場合) になります。

在庫番号 -- 製品番号

コスト -- ストック番号の単位あたりのコスト

数量 -- トランザクションの数量

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

私の問題は、必要な変数 (TotalISS、TotalRR、CurrentMAC) が MAC 方程式に 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 に答える