... Assinatura do site por 1 ano + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$100,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Criar saldo, linha a linha, com especificações

Usuário Nélio:

Bom dia!

Estou com uma imensa dificuldade em conseguir resolver este problema.

Na tabela de dados, possuo a título de exemplo:

ID - data - texto - valor

ID Data Texto Valor
1 20/06/2017 1 2
2 21/06/2017 2 3
3 19/06/2017 3 1
4 16/06/2017 1 9
5 20/06/2017 1 3
6 08/12/2016 1 50

 

Pretendo extrair um extrato/consulta que me dê o saldo linha a linha.

Até agora o melhor que consegui foi:

Data Texto Valor Saldo
08/12/2016 1 50 50
16/06/2017 1 9 59
20/06/2017 1 3 64
20/06/2017 1 2 64

 

Através da sintaxe:

SELECT QE.data, QE.texto, QE.valor, 
(select sum(valor) from Tabela1 where data<=QE.data and texto="1") AS saldo, QE.id
FROM Tabela1 AS QE
WHERE (((QE.texto)="1"))
ORDER BY QE.data;

Onde o saldo é calculado através da parte em vermelho.

O que se pretendia seria:

Data Texto Valor Saldo
08/12/2016 1 50 50
16/06/2017 1 9 59
20/06/2017 1 3 62
20/06/2017 1 2 64

 

Devo alertar, que fazer através de ID<=QE.ID não funciona, porque podem surgir movimentos com data anterior aos já registrados. O saldo deve ser sempre calculado com base em data ascendente, mesmo com registros com datas anteriores.

Quais as alterações que devo fazer à sintaxe?

Suporte:

Nélio,

o cálculo tem que ser obrigatoriamente na consulta?  A consulta é para gerar um relatório ou um formulário?

Usuário Nélio:

Avelino,

o objetivo é gerar um extrato, em que filtraremos entre as datas de XX-XX-XXXX a YY-YY-YYYY.  Não terá, obrigatoriamente, que ser uma consulta.

Suporte:

Nelio,

no exemplo deste meu artigo, tem um relatório de movimento bancário, com o cálculo de saldo, feito de forma bem simples. Aproveita e assista o vídeo, que vale muito à pena.

Caso continue com dificuldades, anexe aqui um BD com alguns dados fictícios, na tabela movimentos.

Usuário Nélio:

Avelino,

no exemplo disponibilizado temos o código.

SALDO: (select sum([credito] - [debito]) from tblMovimentos AS tex WHERE tex.id <=tblMovimentos.id)

Acontece que existem 2 limitações:

1 - Nesta linha de código apenas utiliza um bem ou elemento a somar.

2 - A SQL vai comparar a linha anterior com a seguinte, tendo em conta a ordem de inserção.

Se alterar um registro e colocar uma data anterior e posteriormente retirar um extrato ordenado por data, o saldo fica inconsistente, porque vai calcular com base no ID e não na data. Eu pretendia que uma base de dados, com imensos dados, me retire extratos específicos e por datas, linha a linha.

Essa é a minha dificuldade.

Suporte:

Nélio,

segue exemplo. Abra o formulário frmTeste, entre com os valores válidos e clique no botão visualizar.

Veja abaixo toda a programação feita direto no relatório:

Private Sub CabeçalhoDoRelatório_Print(Cancel As Integer, PrintCount As Integer)
Dim strFiltro$
strFiltro = "texto ='" & Forms!frmTeste!cboTexto & "' and "
strFiltro = strFiltro & "[data] < #" & Format(Forms!frmTeste!dataInicial, "mm/dd/yyyy") & "#"
Me!SaldoAnterior = Nz(DSum("valor", "tabela1", strFiltro), 0)
dblAcumulado = Me!SaldoAnterior
End Sub

Private Sub Detalhe_Print(Cancel As Integer, PrintCount As Integer)
dblAcumulado = Me!valor + dblAcumulado
Me!saldo = dblAcumulado
End Sub

Private Sub Report_Open(Cancel As Integer)
Dim strFiltro$
strFiltro = "[texto] ='" & Forms!frmTeste!cboTexto & "' and "
strFiltro = strFiltro & "([data] between #" & Format(Forms!frmTeste!dataInicial, "mm/dd/yyyy") & "# "
strFiltro = strFiltro & "AND #" & Format(Forms!frmTeste!DataFinal, "mm/dd/yyyy") & "#)"
Me.RecordSource = "SELECT * FROM tabela1 WHERE " & strFiltro & " ORDER BY [data];"
End Sub

Private Sub RodapéDoRelatório_Print(Cancel As Integer, PrintCount As Integer)
dblAcumulado = 0
End Sub

Usuario Nelio:

Fenomenal!

Obrigado.

Download

 


 

 


Não há comentário

Envie seu comentário: