Criar saldo, linha a linha, com especificações
Nota importante: para ter acesso aos vídeos e arquivos exemplos deste site, adquira um dos planos apresentados abaixo. Você pode comprar em até 5x no Cartão de Crédito.
Veja como comprar e saiba mais sobre o material oferecido, clicando aqui.
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:
Faça o login aqui para ter acesso ao código.
Usuario Nelio:
Fenomenal!
Obrigado.
Download
1 comentário(s) Paulo Sergio Zaccarioto 26/04/2020 17:22:10 Como Ficaria o VBA, consulta, frm e rel ,alterando os campos da tabela para Data - Histórico - Obs: - Crédito - Debito - Saldo |