Каскадный цикл в SQL Server 2012 - PullRequest
0 голосов
/ 29 апреля 2019

Попытка создать отчет по бухгалтерской книге для проекта, над которым я сейчас работаю.Отчет должен выглядеть так, как показано на скриншоте ниже:

введите описание ссылки здесь

Для этого я написал код T-SQL:

CREATE PROCEDURE sp_ReportCustomerLedger 
    @fromDate DATETIME, @toDate DATETIME    
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @customers TABLE (cust_row_Id INT IDENTITY(1,1) PRIMARY KEY, AccountId INT)

    INSERT INTO @customers 
        SELECT a.AccountId 
        FROM tbl_Customer a 
        RIGHT JOIN tbl_Invoice b ON a.CustomerId = b.CustomerId
        GROUP BY b.CustomerId, a.AccountId 
        ORDER BY a.AccountId

    DECLARE @customerCount INT = 0

    SELECT @customerCount = COUNT(*) FROM @customers
    DECLARE @i INT = 1

    WHILE(@i <= @customerCount)
    BEGIN
        DECLARE @accountId INT

        SELECT @accountId = AccountId 
        FROM @customers 
        WHERE cust_row_Id = @i

        DECLARE @transactions TABLE (trans_row_id INT IDENTITY(1,1) PRIMARY KEY, Amount DECIMAL(18,2), TransactionDate DATE, EntryType INT, TransactionId INT)

       INSERT INTO @transactions 
           SELECT a.Amount, b.TransactionDate, a.EntryType, a.TransactionId 
           FROM tbl_Ledger a 
           LEFT JOIN tbl_Transaction b ON a.TransactionId = b.TransactionId
           WHERE a.AccountId = @accountId 
             AND b.TransactionDate BETWEEN @fromDate AND @toDate
           ORDER BY b.TransactionDate

       DECLARE @transCount INT = 0
       DECLARE @j INT = 0

       SELECT @transCount = COUNT(*) FROM @transactions

       DECLARE @result TABLE (TransactionDate DATE, Dr DECIMAL(18,2), Cr DECIMAL(18,2), Balance DECIMAL(18,2))

       DECLARE @initialBalance DECIMAL(18,2) =  0
       DECLARE @initialDr DECIMAL(18,2) =  0
       DECLARE @initialCr DECIMAL(18,2) =  0

       SELECT @initialDr = SUM(a.Amount) 
       FROM tbl_Ledger a 
       LEFT JOIN tbl_Transaction b ON a.TransactionId = b.TransactionId
       WHERE a.AccountId = @accountId 
         AND b.TransactionDate <= @fromDate 
         AND a.EntryType = 2

       SELECT @initialCr = SUM(a.Amount) 
       FROM tbl_Ledger a 
       LEFT JOIN tbl_Transaction b ON a.TransactionId = b.TransactionId
       WHERE a.AccountId = @accountId AND b.TransactionDate <= @fromDate AND a.EntryType = 1

SET @initialBalance = @initialDr - @initialCr

WHILE(@j<=@transCount)
BEGIN

DECLARE @entryType INT = (SELECT EntryType FROM @transactions WHERE trans_row_id = @j)
DECLARE @amount DECIMAL = (SELECT Amount FROM @transactions WHERE trans_row_id = @j)
DECLARE @transactionDate DATE = (SELECT TransactionDate FROM @transactions WHERE trans_row_id = @j)
DECLARE @dr DECIMAL(18, 0) = 0
DECLARE @cr DECIMAL(18, 0) = 0
DECLARE @balance DECIMAL(18, 0) = 0

IF(@entryType = 2)
BEGIN
SET @dr = @amount
SET @balance = @initialBalance + @dr
END
ELSE
BEGIN
SET @cr = @amount
SET @balance = @initialBalance - @cr
END

INSERT INTO @result SELECT @transactionDate, @dr, @cr, @balance


SET @j = @j + 1
END;

SELECT @initialBalance AS 'Initial Balance';

SELECT * FROM @result;


DELETE FROM @result
DELETE FROM @transactions

SET @i = @i + 1
END;

DELETE FROM @customers


END
GO

Проблема: после выполнения скрипт продолжает работать без остановок с пустыми данными.При каждом выходе я проверял, что переменные таблицы очищены или их данные удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...