Olá galera,
estou com um problema e já venho tentando resolver a um tempo, mas ainda não obtive sucesso.
Preciso desenvolver um relatório em forma de extrato bancário, nesse formato como o da imagem.
Preciso saber se é possível fazer somente utilizando SQL.
Para retornar a consulta devo inserir um período (Data1 e Data2), ou seja, vai retornar o resultado entre essas duas datas.
Tenho duas tabelas compra e venda, cada tabela armazena a DATA e o VALOR, pode ser feito várias inserções no mesmo dia, por isso a importância de apresentar o valor somado durante o dia.
Porém, têm um valor que é calculado antes da data1 que é o SALDO ANTERIOR (COMPRA - VENDA), e depois somado do VALOR de ENTRADA(COMPRA) e RETIRADA da SAIDA(VENDA), mostrando ao LADO o SALDO do dia.
Outra questão é que nem sempre naquele dia que tem entrada, terá saída e vice-versa. Então devo retornar o valor ZERO para fazer a soma e atualizar o SALDO.
Eu tenho um pouco de prática,
eu sei as etapas e o código necessário pra obter os resultados em parte. Mas não consigo unir pra fazer tudo em uma query.
Por exemplo como estou usando o IReport, utilizei sub relatórios para fazer um protótipo do relatório. Mas não ficou como deveria ser.
select SUM(sr.valor) as valor, SUM(sr.valor), sr.data from cliente c
inner join entrada sr on sr.cliente= c.cliente and data >= $P{dataInicio} and data <= $P{dataFim} and sr.cliente = $P{clienteId} group by sr.data order by sr.data
utilizo o mesmo código acima pra tabela “saida”, outro sub relatório.
no entanto, dessa forma não consigo fazer os cálculos pra obter o SALDO, em cada dia.
Sim, isso eu faço no Java mesmo e levo em uma variável para o IReport,
no entanto, eu preciso de um esquema pra em cada linha me retornar o saldo do dia, como na tabela acima.
pra obter esse SALDO, eu pego o SALDO ANTERIOR, devo somar com a ENTRADA do dia, e subtraio com a SAÍDA do mesmo dia, dai vai pra próxima linha, casa haja mais datas com valor, no retorno da consulta.
creio que com 3 variáveis vc resolva
uma que some as entradas, outra para somar as saidas e outra para calcular o saldoAtual.
as expressões:
$V{totalEntradas}.add($F{valorEntrada})
$V{totalSaidas}.add($F{valorSaida})
$P{saldoAnterior}.add($V{totalEntradas}).subtract($V{totalSaidas})
dai é só imprimir a 3a variável
Não esqueça de inicializar as duas variáveis de soma
BigDecimal.ZERO na expressao inicial(se estiver trabalhando com BigDecimal nos valores)
Olá @valtemir , blz? não entendi perfeitamente. Poderia me explicar detalhadamente a aplicação desse código?
Minha dúvida é mais em relação ao código SQL que irá gerar esses resultados.
veja que em cada linha que foi gerada da consulta, é gerado um valor de entrada e de saída. Caso não tenha valor nesse dia o retorno é ZERO. Daí na mesma linha o SALDO é calculado, fazendo a soma, e depois a subtração.
Só pra melhorar a explicação.
Vamos supor que no dia 01/10/18 foram feitas duas entradas (100 e 200), mas no mesmo dia não foi feito nenhuma saída, então… pra esse dia a entrada deve retornar 300, e a saída deve retornar 0, para que possa calcular o SALDO, isso serve o mesmo quando se tem Saída pra tal dia, e não tem entrada pra esse mesmo dia.
A questão é que quando uso INNER JOIN para consultar as duas tabelas, eu só consigo referenciar o dia se tiver nas duas tabelas, ou pelo menos se tiver na tabela ENTRADA… mas se tiver VALOR de tal dia, só na tabela SAÍDA, eu não consigo retornar o zero da tabela ENTRADA naquela linha.
creio que utilizando uma subquery resolva teu problema com SQL:
select geral.data, sum(geral.valor_e), sum(geral.valor_s)
from (select cliente, data, valor as valor_e, 0 as valor_s from entradas
union
select cliente, data, 0 as valor_e, valor as valor_s from saidas) as geral
group by geral.data
order by geral.data
Perfeito @valtemir, era realmente isso que estava precisando, o resultado é gerado na tabela com os valores de entrada e saída… Só não consegui adaptar pra me atualizar o SALDO, exemplo.
Vou ter um valor que vai iniciar que é o SALDOANTERIOR, vamos supor que seja 1000, esses 1000 precisa atualizar a cada linha da query…
Bem alí onde tenho a coluna SALDO na primeira linha, em vez 131.380, deveria ser 132.380.
E na linha abaixo deveria ser, 328.850 (pois é calculado dos saldos anteriores), e assim por diante.
Esse SALDOANTERIOR vai ser uma variável que eu envio direto da aplicação, como parâmetro.
As três variáveis que falei anteriormente devem ser criadas no Ireport, onde uma soma as entradas(o field gerado pelo SQL) e outra soma as saídas(o field/campo gerado pelo SQL)
E a terceira serve para calcular o SALDO que será impresso, pegando o saldo anterior que vc passou como parâmetro e adicionando a variável que contem o total das entradas e subtraindo a outra variável que contem o total das saídas.