2017-01-22 7 views
0

Я работаю над отчетом, который позволит пользователю просмотреть текущие итоги.Как построить скользящий вперед отчет SSRS

Это a матрица. Я включил образец того, как выглядят данные.

Отчет должен начинать текущую сумму с октября с суммой в 42 доллара США. Затем отчет будет подсчитываться по счетам. Затем возьмите $ 42 + $ 64 = $ 106. 106 долларов США переносятся на декабрьский месяц с начала баланса на уровне 106 долларов США.

Report that I am working on

Пример отчета

     2016-011   2016-012 

Beginning Balance  42     106 

AP      31     41 
APAJ     32     42 
CJ      33     43 
GEN     -32     -42 

Total Account   64     84 

Begin Bal + Total Acc 106     190 

Пример данных

DECLARE @ClosingBalTemp TABLE 
(
    Account_ID varchar(30), 
    Period_Nbr varchar(10), 
    Source_Code varchar(10), 
    Closing_Balance_Amt numeric(16,2) 
) 

INSERT INTO @ClosingBalTemp (Account_ID, Period_Nbr, Source_Code, Closing_Balance_Amt) 

    VALUES ('01-002-333', '2016-008', 'AP', 1), 
      ('01-002-333', '2016-008', 'APAJ', 2), 
      ('01-002-333', '2016-008', 'CJ', 3), 
      ('01-002-333', '2016-008', 'GEN', -2), 
      ('01-002-333', '2016-009', 'AP', 11), 
      ('01-002-333', '2016-009', 'APAJ', 12), 
      ('01-002-333', '2016-009', 'CJ', 13), 
      ('01-002-333', '2016-009', 'GEN', -12), 
      ('01-002-333', '2016-010', 'AP', 20), 
      ('01-002-333', '2016-010', 'APAJ', 21), 
      ('01-002-333', '2016-010', 'CJ', 23), 
      ('01-002-333', '2016-010', 'GEN', -22), 
      ('01-002-333', '2016-011', 'AP', 31), 
      ('01-002-333', '2016-011', 'APAJ', 32), 
      ('01-002-333', '2016-011', 'CJ', 33), 
      ('01-002-333', '2016-011', 'GEN', -32), 
      ('01-002-333', '2016-012', 'AP', 41), 
      ('01-002-333', '2016-012', 'APAJ', 42), 
      ('01-002-333', '2016-012', 'CJ', 43), 
      ('01-002-333', '2016-012', 'GEN', -42) 

SELECT * FROM @ClosingBalTemp 


The data should look like this 

The logic is almost working. The Bal type is not calculating the running balance correctly after Period 9. The 4.00 is coming from Oct that does not display. 

B BAL 2016 9 4.00 
T AP  2016 9 11.00 
T APAJ 2016 9 12.00 
T CJ  2016 9 13.00 
T GEN 2016 9 -12.00 
B BAL 2016 10 24.00  **Should be 33** 
T AP  2016 10 20.00 
T APAJ 2016 10 21.00 
T CJ  2016 10 23.00 
T GEN 2016 10 -22.00 
B BAL 2016 11 42.00  **Should be 75** 
T AP  2016 11 31.00 
T APAJ 2016 11 32.00 
T CJ  2016 11 33.00 
T GEN 2016 11 -32.00 
B BAL 2016 12 64.00  **Should be 139** 
T AP  2016 12 41.00 
T APAJ 2016 12 42.00 
T CJ  2016 12 43.00 
T GEN 2016 12 -42.00 

ответ

0

Я не думаю, что итоговые результаты будут работать из-за расположения столбцов. Мы хотим, чтобы вершина 2016-012 появилась со дна 2016-011. Я скажу, что я не совсем понимаю ваш набор данных, и я делаю много бросков вперед/пробных балансов Hers's s post on Trial blances. Но я верю, что решил вашу проблему с использованием материала 2008 года с помощью предлагаемой хранимой процедуры. В идеале, год и период будут отдельными полями, чтобы облегчить расчет периодов. Я просто закодировал их сейчас. С выходом вы можете создать столбец для каждого месяца в своем отчете SSRS. Вы можете рассчитать итоговый результат месяца в SSRS. В 2008 году может быть лучший способ сделать это, но у меня нет 2008 на моем сервере, поэтому я не могу проверить. (Я бы обрабатывать начальные сводки баланса по-разному)

DECLARE @CurrentPeriod CHAR(10); 
DECLARE @PriorPeriod CHAR(10); 
DECLARE @PPPeriod CHAR(10) 

SET @CurrentPeriod = '2016-012'; 
SET @PriorPeriod = '2016-011'; 
SET @PPPeriod = '2016-010'; 
-- First Step - Summarize the balances 
WITH Balances (CurrentPeriodOpenBal, PriorPeriodOpenBal) 
    AS (
    SELECT SUM(CASE WHEN cbt.Period_Nbr IN (@PPPeriod, @PriorPeriod) 
      THEN cbt.Closing_Balance_Amt ELSE 0 END) 
      AS CurrentPeriodOpenBal, 
     SUM(CASE WHEN cbt.Period_Nbr IN (@PPPeriod) 
      THEN cbt.Closing_Balance_Amt ELSE 0 END) 
      AS PriorPeriodOpenBal 
     FROM dbo.ClosingBalTemp cbt 
     WHERE cbt.Period_Nbr < @CurrentPeriod 
) 
-- Now we are going to combine our balances and our transaction 
, 
BalTrans (TransType, SourceCode, PeriodNbr, Amount) AS 
(
SELECT 'B', 'BAL', @PriorPeriod, bal.PriorPeriodOpenBal 
FROM Balances bal 
UNION ALL 
SELECT 'B', 'BAL', @CurrentPeriod, bal.CurrentPeriodOpenBal 
FROM Balances bal 
UNION ALL 
SELECT 'T', trans.Source_Code, trans.Period_Nbr, trans.Closing_Balance_Amt 
    FROM dbo.ClosingBalTemp trans 
    WHERE trans.Period_Nbr BETWEEN @PriorPeriod AND @CurrentPeriod 
) 
-- Now we simply order our transactions 
SELECT bt.TransType, bt.SourceCode, bt.PeriodNbr, bt.Amount FROM BalTrans bt 
ORDER BY bt.PeriodNbr, bt.TransType, bt.SourceCode 

--- Пересмотренный вариант

-- First Step - convert period to fiscla year and period 
WITH Trans AS 
    (SELECT cbt.Account_ID, 
    cbt.Period_Nbr, 
    CAST(SUBSTRING(cbt.Period_Nbr,1,4) AS INT) AS FiscalYear, 
    CAST(SUBSTRING(cbt.Period_Nbr,6,3) AS INT) AS FiscalPeriod, 
    cbt.Source_Code, 
    cbt.Closing_Balance_Amt 
    FROM dbo.ClosingBalTemp cbt) 


-- This gets the total balance for each period - we add one to the period 
-- to figure out the opening info 
, Balances (FiscalYear, FiscalPeriod, OpenPeriod, Amount) 
AS (
    SELECT DISTINCT 
     bal.FiscalYear, 
     bal.FiscalPeriod, 
     bal.FiscalPeriod + 1 AS OpenPeriod, 
     SUM(bal.Closing_Balance_Amt) OVER(ORDER BY bal.Period_Nbr) AS Amount 
     FROM Trans bal 
     WHERE bal.Period_Nbr >= @PPPeriod 
      AND bal.Period_Nbr < @StartingPeriod 
) 
-- Now we are going to combine our balances and our transaction 
, 

BalTrans (TransType, SourceCode, FiscalYear, FiscalPeriod, Amount) AS 
(
SELECT 'B', 'BAL', bl.FiscalYear, bl.OpenPeriod, bl.Amount FROM Balances bl  
UNION ALL 
SELECT 'T', trans.Source_Code, trans.FiscalYear, trans.FiscalPeriod, 
     trans.Closing_Balance_Amt 
FROM Trans trans 
WHERE trans.Period_Nbr BETWEEN @EndingPeriod AND @StartingPeriod 
) 
SELECT bt.TransType, bt.SourceCode, bt.FiscalYear, Bt.FiscalPeriod, 
bt.Amount FROM BalTrans bt 
ORDER BY bt.FiscalYear, bt.FiscalPeriod, bt.TransType, bt.SourceCode 

- Пример с курсором

DECLARE @EndPeriod CHAR(10); 
DECLARE @StartPeriod CHAR(10); 
DECLARE @PPPeriod CHAR(10) 
-- Ideally, year and period would be separate integer fields 
-- so one could calculate prior period from current Period. 
-- But that's not the key part of the question 
SET @EndPeriod = '2016-012'; 
SET @StartPeriod = '2016-009'; 
SET @PPPeriod = '2016-008'; 

DECLARE @Period_Nbr CHAR(10); 
DECLARE @Source_Code CHAR(10); 
DECLARE @Closing_Balance_Amt NUMERIC(16,2); 

DECLARE @ReportPeriod CHAR(10); 
DECLARE @ReportBalance NUMERIC(16,2); 

CREATE TABLE #Output 
(ID INTEGER IDENTITY (1,1) PRIMARY KEY, 
    Period_Nbr CHAR(10), 
    Source_Code CHAR(10), 
    Closing_Balance_Amt numeric(10,2) 
) 
    -- the following insures that SSRS sees the output correctly 
IF 1=2 
    BEGIN 
    SELECT ID, 
     Period_Nbr, 
     Source_Code, 
     Closing_Balance_Amt 
     FROM #Output; 
    END; 

DECLARE OMGUAC CURSOR FAST_FORWARD FOR 
    SELECT Period_Nbr, Source_Code, Closing_Balance_Amt 
    FROM dbo.ClosingBalTemp 
    WHERE Period_Nbr BETWEEN @PPPeriod AND @EndPeriod 
    ORDER BY Period_Nbr, Source_Code; 

OPEN OMGUAC; 

FETCH NEXT FROM OMGUAC INTO @Period_Nbr,@Source_Code,@Closing_Balance_Amt; 

SET @ReportPeriod = @Period_Nbr; 
SET @ReportBalance = 0; 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
    -- When the period Changes, print the opening balance 
    IF @Period_Nbr <> @ReportPeriod  
     BEGIN 
      INSERT INTO #Output 
       (Period_Nbr , 
        Source_Code , 
        Closing_Balance_Amt 
       ) 
      VALUES (@Period_Nbr, 'Open Bal',@ReportBalance); 
     END 
IF @Period_Nbr > @PPPeriod 
    BEGIN 
     INSERT INTO #Output 
       (Period_Nbr , 
        Source_Code , 
        Closing_Balance_Amt 
       ) 
     VALUES (@Period_Nbr, @Source_Code,@Closing_Balance_Amt); 
    END 
    SET @ReportBalance = @ReportBalance + @Closing_Balance_Amt; 
    SET @ReportPeriod = @Period_Nbr 
    FETCH NEXT FROM OMGUAC INTO @Period_Nbr, @Source_Code, 
@Closing_Balance_Amt; 
    END; 
SELECT * FROM #Output 
ORDER BY ID; 
DROP TABLE #Output; 
CLOSE OMGUAC; 
DEALLOCATE OMGUAC; 
+0

Привет Адам, Wow! Спасибо за вашу помощь. Это здорово ... У меня небольшая проблема. Если вы вводите 2016-009 за предыдущий период и 2016-008 за предыдущий предыдущий период и 2016-012 за текущий период, BAL не рассчитывается на 2016-010 или 2016-011. Он не рассчитывается для периодов, находящихся в пределах диапазона выбора. Отчет должен работать с любым диапазоном периода, который вводится. –

+0

Во-первых, я прошу вас принять мой ответ. Благодарю. Затем в вашем вопросе не указывалось, как вы собираетесь делать выбор - сколько периодов, как на это нужно ответить, поэтому я предположил, что вы выбрали два месяца. Укажите, что вы представляете, варианты (и столбцы), и ответ должен быть довольно легко настроить –

+0

Hi Adam, Извините за это. Да, я не объяснил, как будут выбраны данные. Данные выбираются в диапазоне дат 08/01/16 - 12/31/16. Я конвертирую 2 даты, чтобы получить начальный и конечный периоды. Тогда базой по количеству периодов будет заголовок столбца, кроме предыдущего предыдущего периода. Я получаю только начальный баланс с этого периода. После этого сумма каждого периода будет начальным балансом следующего периода. Это произойдет, пока не отобразится весь период. –