0

所以這是爲了SSRS報告,所以我使用臨時表。我有兩張表,一張用於交易,我只是用它來拉帳戶和金額。第二個是我試圖根據事務進行調整的已攤銷的拖欠信息,但我遇到了語法問題。 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語句的方式不起作用。案例邏輯需要在SELECTSET內發生。你的只是那裏,和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