0

これはSSRSレポート用ですので、私は一時表を使用しています。私は2つのテーブルを持っています.1つは取引のためのテーブルで、私はアカウントと金額を引き出すために使っています。 2番目はトランザクションに基づいて調整しようとしている償却された延滞情報ですが、構文上の問題が発生しています。 case文は、カーソルや更新で使用できないのですか?ネストされたカーソルベースの更新

--Example Transaction:Account 123456 Principal 500.00 Interest 250.00 

delinquent 5 months of 200 principal each month, the transaction had principal amount of 500, the first two are left alone, the third is reduced to 100 to match the total to the transaction amount, leaving a remaining amount of 0 

--Delinquent data 
-- 11/2015 Prin 200 Int 80 -> Prin 0 Int 0 (running total Prin 500 Int 250) 
-- 10/2015 Prin 200 Int 80 -> Prin 0 Int 10 (running total Prin 500 Int 250) 
-- 9/2015 Prin 200 Int 80 -> Prin 100 Int 80 (running total Prin 500 Int 240) 
-- 8/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 400 Int 160) 
-- 7/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 200 Int 80) <- process starts from the oldest and goes up. 

それは次の行の調整を続けていく次いで、最も古い行で始まる調整、残りの合計を見つけなければならないように、私はセットに処理できないので、これは、カーソルを使用する必要があります。トランザクション量に達すると、残りの行はゼロになります。残りの金額を取引表に戻します。

Declare TranCursor Cursor FORWARD_ONLY 
For Select LoanNumber, PrincipalCollected, InterestCollected, ServiceFee, PayoffPrincipal,PayoffInterest,PayoffServiceFee 
From #transFinal 
FOR UPDATE OF PayoffPrincipal,PayoffInterest,PayoffServiceFee 


Open TranCursor; 
Fetch next from TranCursor into @TranLoan, @TranPrin, @TranInt, @TranServ, @POPrin,@POInt,@POServ 
while (@@Fetch_status = 0) 
Begin 
    --Process this individual loan's transaction by going through each set of amortized amounts starting with the oldest and reducing excess of transaction amounts to zero. 
    --eg. delinquent 3 months of 200 principal each month, the transaction had principal amount of 500, the first two are left alone, the third is reduced to 100 to match the total to the transaction amount 
    --Transaction Principal 500 Interest 250 
    --Delinquent data 
    -- 11/2015 Prin 200 Int 80 -> Prin 0 Int 0 (running total Prin 500 Int 250) 
    -- 10/2015 Prin 200 Int 80 -> Prin 0 Int 10 (running total Prin 500 Int 250) 
    -- 9/2015 Prin 200 Int 80 -> Prin 100 Int 80 (running total Prin 500 Int 240) 
    -- 8/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 400 Int 160) 
    -- 7/2015 Prin 200 Int 80 -> Prin 200 Int 80 (running total Prin 200 Int 80) <- process starts from the oldest and goes up. 
    Declare DelqCursor CURSOR FORWARD_ONLY 
    FOR select LoanNumber,DelqPrin ,DelqInt ,DelqServFee from #dq 
     where LoanNumber = @TranLoan 
     Order by PaidToDate Asc 
     For update OF DelqPrin, DelqInt, DelqServFee; 
     Open DelqCursor; 
----------------------------------------------------------------------------------------------------------- 
-- Processing individual row of delinquent data 
----------------------------------------------------------------------------------------------------------- 
Fetch next from DelqCursor into @DelqPrin, @DelqInt, @DelqServ, @DelqPTD --, @POPrin,@POInt,@POServ 
while (@@Fetch_status = 0) 
    BEGIN 


      CASE when @TranPrin = 0 then set @DelqPrin = 0 -- Syntax error on case 
       WHEN @TranPrin >0 and @TranPrin > @DelqPrin then -- Syntax error on when 
        set @TranPrin = @TranPrin - @DelqPrin 
        set @ColPrin = @ColPrin + @DelqPrin 
       WHEN @TranPrin >0 and @TranPrin < @DelqPrin then 
        set @ColPrin = @ColPrin + @TranPrin 
        set @TranPrin = 0 
        set @DelqPrin = @DelqPrin [email protected] 
      end 

      CASE when @TranInt = 0 then set @DelqInt = 0 
       WHEN @TranInt >0 and @TranInt > @DelqInt then 
        set @TranInt = @TranInt - @DelqInt 
        set @ColInt = ColInt + @DelqInt 
       WHEN @TranInt >0 and @TranInt < @DelqInt then 
        set @ColInt = @ColInt + @TranInt 
        set @TranInt = 0 
        set @DelqInt = @DelqInt [email protected] 
      end 

      CASE when @TranServ = 0 then set @DelqServFee = 0 
       WHEN @TranServ >0 and @TranServ> @DelqServ then 
        set @TranServ = @TranServ - @DelqServ 
        set @ColServ = ColServ + @DelqServ 
       WHEN @TranServ >0 and @TranServ < @DelqServ then 
        set @ColServ = @ColServ + @TranServ 
        set @TranServ = 0 
        set @DelqServ = @DelqServ [email protected] 
      end 

Fetch next from DelqCursor into @DelqPrin, @DelqInt, @DelqServ, @DelqPTD 
End 
----------------------------------------------------------------------------------- 
--All rows of delinquent data for a single loan have been processed. Now we update the Payoff columns 
---------------------------------------------------------------------------------- 
Set @PoPrin = @ColPrin 
Set @PoInt = @ColInt 
Set @PoServ = @ColServ 
--Todo Finish update statement for outside loop to update transaction table 
Close DelqCursor-- Finished with delinquent data for this loan. We close the cursor 
Fetch next from TranCursor into @TranLoan, @TranPrin, @TranInt, @TranServ, @POPrin,@POInt,@POServ --Start Processing next loan 
End 

Close TranCursor 
deallocate DelqCursor 
deallocate TranCursor 

私は文は私にエラーを与えているとき、なぜ私の場合を把握するために取得することができます任意の洞察力をいただければと思います。私は、ケースロジックが動作しないようにするmsdn構文には何も見ません。

答えて

1

CASEステートメントをコーディングした方法は機能しません。ケースロジックは、SELECT、またはSETで発生する必要があります。あなたのものはです。SETは、THENの後ろにあります。

あなたのコードにあるCASEごとに、このようなロジックに変更する必要があります。

IF @TranPrin = 0 
    SET @DelqPrin = 0 

IF @TranPrin >0 AND @TranPrin > @DelqPrin 
BEGIN 
    SET @TranPrin = @TranPrin - @DelqPrin 
    SET @ColPrin = @ColPrin + @DelqPrin 
END 

IF @TranPrin > 0 AND @TranPrin < @DelqPrin 
BEGIN 
    SET @ColPrin = @ColPrin + @TranPrin 
    SET @TranPrin = 0 
    SET @DelqPrin = @DelqPrin [email protected] 
END 

CASE (Transact SQL) Reference

+0

私はそれを選択するか、設定されていなかったという事実を逃したかわかりません。ありがとう。 – xenapan

関連する問題