none
Dúvida Relatório de Extrato Bancário RRS feed

  • Pergunta

  • Bom dia pessoal,

    Por favor, estou precisando de uma ajuda. Estou desenvolvendo um relatório de extrato bancário onde eu tenho as movimentações de entradas e saídas, e o saldo inicial. Porém, preciso criar uma coluna chamada saldo atual, onde deverá ser calculado a evolução do saldo durante o dia, com relação as movimentações realizadas, vejam a imagem abaixo:


     O unico valor que eu tenho ref. ao saldo é o valor de 1000,00 que é o saldo do dia anterior, e com esse campo/valor, preciso que o mesmo seja incrementado com os valores de entradas e saidas do dia, para que no final eu tenha o saldo atualizado.

    Voces poderiam me auxiliar?

    Muito obrigado pela atenção!

    Abraço,

    Tarsio Alvares

    quarta-feira, 22 de maio de 2013 11:58

Respostas

  • Tarsio,

    Sinceramente não foi fácil e talvez a solução que eu tenha chego não seja a melhor opção todo caso resolve o seu problema. Vale lembrar que depende de como esta seu dataset para esta solução uma vez que é necessário adaptações na função do report ou na query do dataset.

    1 - TSQL utilizado para criação da tabela ja contendo a query do dataset:

    --Database context change
    USE Teste
    GO
    
    --Table creation
    IF(OBJECT_ID('TabelaBancaria') IS NOT NULL)
    	DROP TABLE TabelaBancaria
    
    IF(OBJECT_ID('SaldoBancario') IS NOT NULL)
    	DROP TABLE SaldoBancario
    
    CREATE TABLE SaldoBancario
    (
    	Conta			INT,
    	Saldo			MONEY
    )
    
    CREATE TABLE TabelaBancaria
    (
    	Conta			INT,
    	Data			DATE,
    	Natureza		VARCHAR(100),
    	Movimentacao	MONEY
    )
    GO
    
    --Data load
    INSERT INTO SaldoBancario(Conta, Saldo)
    VALUES (1, 1000.00)
    
    INSERT INTO TabelaBancaria(Conta, Data, Natureza, Movimentacao)
    VALUES
    (1, '20130101', 'Natureza 01', 100.00),
    (1, '20130102', 'Natureza 01', -200.00),
    (1, '20130103', 'Natureza 01', -100.00),
    (1, '20130104', 'Natureza 01', 100.00)
    GO
    
    --Select from report
    SELECT
    	a.Conta,
    	a.Saldo,
    	b.Data,
    	b.Movimentacao,
    	b.Natureza
    FROM SaldoBancario a
    INNER JOIN TabelaBancaria b
    	ON (a.Conta = b.Conta)
    /* OUTPUT DA QUERY A SER UTILIZADO NO RELATORIO
    Conta	Saldo	Data		Movimentacao	Natureza
    1		1000,00	2013-01-01	100,00			Natureza 01
    1		1000,00	2013-01-02	-200,00			Natureza 01
    1		1000,00	2013-01-03	-100,00			Natureza 01
    1		1000,00	2013-01-04	100,00			Natureza 01
    */

    Print do relatório em desenvolvimento:

    Print do relatório em execução:

    Expression utilizadas no relatorio (Logica: De cima para baixa e da esquerda para a direita nos campos <<Expr>>):

    Saldo inicial: ="Saldo atual: " & First(Fields!Saldo.Value, "Bancario")

    Entrada: =Iif(Sum(Fields!Movimentacao.Value) >= 0, Sum(Fields!Movimentacao.Value), "")

    Saida: =Iif(Sum(Fields!Movimentacao.Value) < 0, Sum(Fields!Movimentacao.Value), "")

    Valor corrente: =RunningValue(Fields!Saldo.Value + Fields!Movimentacao.Value, Sum, nothing) - First(Fields!Saldo.Value, "Bancario") * (RowNumber(Nothing) - 1)

    Saldo final: ="Saldo final: " & First(Fields!Saldo.Value, "Bancario") + Sum(Fields!Movimentacao.Value, "Bancario")


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 22 de maio de 2013 12:46
    Moderador

Todas as Respostas

  • Tarsio,

    Sinceramente não foi fácil e talvez a solução que eu tenha chego não seja a melhor opção todo caso resolve o seu problema. Vale lembrar que depende de como esta seu dataset para esta solução uma vez que é necessário adaptações na função do report ou na query do dataset.

    1 - TSQL utilizado para criação da tabela ja contendo a query do dataset:

    --Database context change
    USE Teste
    GO
    
    --Table creation
    IF(OBJECT_ID('TabelaBancaria') IS NOT NULL)
    	DROP TABLE TabelaBancaria
    
    IF(OBJECT_ID('SaldoBancario') IS NOT NULL)
    	DROP TABLE SaldoBancario
    
    CREATE TABLE SaldoBancario
    (
    	Conta			INT,
    	Saldo			MONEY
    )
    
    CREATE TABLE TabelaBancaria
    (
    	Conta			INT,
    	Data			DATE,
    	Natureza		VARCHAR(100),
    	Movimentacao	MONEY
    )
    GO
    
    --Data load
    INSERT INTO SaldoBancario(Conta, Saldo)
    VALUES (1, 1000.00)
    
    INSERT INTO TabelaBancaria(Conta, Data, Natureza, Movimentacao)
    VALUES
    (1, '20130101', 'Natureza 01', 100.00),
    (1, '20130102', 'Natureza 01', -200.00),
    (1, '20130103', 'Natureza 01', -100.00),
    (1, '20130104', 'Natureza 01', 100.00)
    GO
    
    --Select from report
    SELECT
    	a.Conta,
    	a.Saldo,
    	b.Data,
    	b.Movimentacao,
    	b.Natureza
    FROM SaldoBancario a
    INNER JOIN TabelaBancaria b
    	ON (a.Conta = b.Conta)
    /* OUTPUT DA QUERY A SER UTILIZADO NO RELATORIO
    Conta	Saldo	Data		Movimentacao	Natureza
    1		1000,00	2013-01-01	100,00			Natureza 01
    1		1000,00	2013-01-02	-200,00			Natureza 01
    1		1000,00	2013-01-03	-100,00			Natureza 01
    1		1000,00	2013-01-04	100,00			Natureza 01
    */

    Print do relatório em desenvolvimento:

    Print do relatório em execução:

    Expression utilizadas no relatorio (Logica: De cima para baixa e da esquerda para a direita nos campos <<Expr>>):

    Saldo inicial: ="Saldo atual: " & First(Fields!Saldo.Value, "Bancario")

    Entrada: =Iif(Sum(Fields!Movimentacao.Value) >= 0, Sum(Fields!Movimentacao.Value), "")

    Saida: =Iif(Sum(Fields!Movimentacao.Value) < 0, Sum(Fields!Movimentacao.Value), "")

    Valor corrente: =RunningValue(Fields!Saldo.Value + Fields!Movimentacao.Value, Sum, nothing) - First(Fields!Saldo.Value, "Bancario") * (RowNumber(Nothing) - 1)

    Saldo final: ="Saldo final: " & First(Fields!Saldo.Value, "Bancario") + Sum(Fields!Movimentacao.Value, "Bancario")


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Email: fabrizzio.antoniaci@gmail.com

    quarta-feira, 22 de maio de 2013 12:46
    Moderador
  • Fabricio!

    Mais uma vez, muito obrigado pelo seu auxílio e atenção!

    Hoje mesmo vou testar a solução que você passou e te retorno aqui o resultado final ok!?

    Realmente esse cenário foi mais complexo, tenho enfrentado algumas dificuldades nesse tipo de relatório onde tenho um valor fixo, e preciso provisionar ou então projetar como no caso de um fluxo de caixa.

    Bom, vou fazer os testes e simulações, voltamos conversar!

    Abraço,,

    Tarsio Alvares.

    quarta-feira, 22 de maio de 2013 12:51
  • Fabrizzio,

    Preciso de uma orientação, por favor:

    Fazendo da forma como você me orientou funciona corretamente, porém, o problema é o seguinte, a coluna do saldo atual é atualizada conforme as movimentações, mas funciona apenas se eu filtrar uma única conta, caso eu selecione mais de uma conta, a coluna saldo atual continua na conta seguinte com o ultimo valor da conta anterior, mas eu preciso tratar essa expressão por conta, cada conta individualmente, agrupando por conta.

    Voce poderia me orientar?

    Muito obrigado!

    segunda-feira, 5 de agosto de 2013 17:29
  • Tarsio,

    Uma alternativa no proprio relatorio eh usar a expressar "RunningValue" (http://msdn.microsoft.com/en-us/library/ms159136(v=SQL.100).aspx)

    Por exemplo, = RunningValue(sum, Fields!Entradas.Value +Fields!Saidas.Value, Nothing)

    Running value mostra o valor da agregacao para cada linha do grupo.

    Att

    Boreki


    Boreki[MSFT] - SQL Server Reporting Services

    quinta-feira, 8 de agosto de 2013 21:43