bollywood actresses hair loss hair rehab london contact number cheap hair extensions brazilian curly hair with closure hair extension fails human hair wigs black ponytail hairstyles 2018 sunny hair extensions uk hair extensions remy hair extensions weft koko one piece hair extensions clip hair
Criar saldo linha a linha com especificações

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é 2x no Cartão de Crédito. 

Veja como comprar e saiba mais sobre o material oferecido,  clicando aqui.

Open v3

 

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

 


 

 


1 comentário(s)

Paulo Sergio Zaccarioto   26/04/2019 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


Envie seu comentário: