Fórum Como obter saldo anterior #490244
26/08/2014
0
É o seguinte tenho uma tabela chamada lançamentos e estou querendo obter a apresentação de: Data de Lançamento, Conta, Saldo Anterior, Valor Entrada, Valor Saída, Saldo Atual, Histórico....
Já tenho a seguinte sql que está funcionando perfeitamente:
criterio:='select '+
'l.dt_lanca as Data, '+
'l.autor as Descricao, '+
'sum(l.vl_entra) as Entrada, '+
'sum(l.vl_sai) as Saida, '+
'(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo, '+
'c.conta as conta '+
'from '+
'lancamentos l, contas c '+
'where '+
'l.cod_conta = c.cod_conta '+
'and '+
'l.cod_recurso = '+EdtCod_recurso.Text +
' and '+
'l.dt_lanca between "'+FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'" and "'+FormatDateTime('mm/dd/yyyy',DtpFinal.Date)+'" '+
'group by '+
'l.dt_lanca,l.autor, c.conta '+
'order by '+
'l.dt_lanca';
Com tudo preciso exibir o saldo anterior, o que confeço não estou conseguindo.... alguém ai pode ajudar????
Desde já agradeço!!!!
Hardsoft Informática
Curtir tópico
+ 0Post mais votado
18/11/2015
Sinceramente nem lembro dos detalhes deste post... rsrs
Revisei a query e acredito que ainda tinha uma falha, com relação ao join do saldo anterior. Como estava como inner, caso não houvesse saldo anterior, não traria registros.
Criei as tabelas para o teste com os scripts que estavam no post.
Criei duas contas e 4 lançamentos para cada.
Seguem os comandos sql para popular as tabelas.
Corrigido o sql alterando para left outer join dos lançamentos anteriores.
Adicionada coluna de SALDO_REAL, pois a coluna SALDO é a somatória dos lançamentos do período, a coluna SALDO_ANT é a somatória dos valores anteriores e a nova coluna traz o saldo real do período pesquisado.
Obs: Não possuo sql server para teste. Meus testes são no Oracle. Confirme se a sintaxe para o filtro de datas está correta ou se precisa alterar o formato no sql server.
-- COMANDOS DE LANCAMENTOS PARA O EXEMPLO
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (1,TO_DATE('17/11/15','DD/MM/RR'),'0,01','11',15,1,0.01,0,NULL,NULL,NULL,NULL,0,0.01,NULL,NULL,NULL,NULL,'N',NULL);
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (2,TO_DATE('17/11/15','DD/MM/RR'),'0,02','11',15,1,0.02,0,NULL,NULL,NULL,NULL,0,0.03,NULL,NULL,NULL,NULL,'N',NULL);
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (3,TO_DATE('18/11/15','DD/MM/RR'),'0,03','11',15,1,0.03,0,NULL,NULL,NULL,NULL,0,0.06,NULL,NULL,NULL,NULL,'N',NULL);
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (4,TO_DATE('18/11/15','DD/MM/RR'),'-0,04','11',15,1,0,0.04,NULL,NULL,NULL,NULL,0,0.02,NULL,NULL,NULL,NULL,'N',NULL);
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (5,TO_DATE('17/11/15','DD/MM/RR'),'0,05','11',15,2,0.05,0,NULL,NULL,NULL,NULL,0,0.05,NULL,NULL,NULL,NULL,'N',NULL);
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (6,TO_DATE('17/11/15','DD/MM/RR'),'0,06','11',15,2,0.06,0,NULL,NULL,NULL,NULL,0,0.11,NULL,NULL,NULL,NULL,'N',NULL);
Insert into LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) values (7,to_date('18/11/15','DD/MM/RR'),'-0,07','11',15,2,0,0.07,null,null,null,null,0,0.04,null,null,null,null,'N',null);
INSERT INTO LANCAMENTOS (SEQ_LANCA,DT_LANCA,NR_DOC,MES,ANO,COD_CONTA,VL_ENTRA,VL_SAI,COD_HIST,COMPLEMENTO,COD_SECRET,AUTOR,COD_RECURSO,SALDO,COD_EVENTO,FORMPGTO,SALDO_RECURSO,SEGMENTO,EXPORTADO,DATA_EXPORTADO) VALUES (8,TO_DATE('18/11/15','DD/MM/RR'),'0,08','11',15,2,0.08,0,NULL,NULL,NULL,NULL,0,0.12,NULL,NULL,NULL,NULL,'N',NULL);
-- COMANDOS DE CONTAS PARA O EXEMPLO INSERT INTO CONTAS (COD_CONTA,CONTA,CLASSE,TIPO,MOVIMENTO,SALDO,SALDOPER1,SALDOPER2,SALDOPER3,SALDOPER4,SALDOPER5,SEGMENTO,AGREGAR,COD_INTEGRA) VALUES (1,'SALDO ABERTURA',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); INSERT INTO CONTAS (COD_CONTA,CONTA,CLASSE,TIPO,MOVIMENTO,SALDO,SALDOPER1,SALDOPER2,SALDOPER3,SALDOPER4,SALDOPER5,SEGMENTO,AGREGAR,COD_INTEGRA) VALUES (2,'ALIMENTAÇÃO',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-- SQL COM SALDO
SELECT
LCTOS.DATA,
LCTOS.DESCRICAO,
LCTOS.ENTRADA,
LCTOS.SAIDA,
LCTOS.SALDO,
LCTOS.CONTA,
LCTOS.COD_CONTA,
(SUM(SALDO_ANT.VL_ENTRA) - SUM(SALDO_ANT.VL_SAI)) AS SALDO_ANT,
((SUM(SALDO_ANT.VL_ENTRA) - SUM(SALDO_ANT.VL_SAI)) + LCTOS.SALDO) AS SALDO_REAL
FROM
(
SELECT
L.DT_LANCA AS DATA,
L.AUTOR AS DESCRICAO,
SUM(L.VL_ENTRA) AS ENTRADA,
SUM(L.VL_SAI) AS SAIDA,
(SUM(L.VL_ENTRA) - SUM(L.VL_SAI)) AS SALDO,
C.CONTA,
L.COD_CONTA
FROM
LANCAMENTOS L, CONTAS C
WHERE
L.COD_CONTA = C.COD_CONTA
AND L.COD_RECURSO = 0
--FILTRAR AQUI O PERIODO QUE QUER CONSULTAR
AND L.DT_LANCA BETWEEN '18.11.2015' AND '18.11.2015'
--
GROUP BY
L.DT_LANCA,L.AUTOR, C.CONTA, L.COD_CONTA
ORDER BY
L.DT_LANCA
)
LCTOS
LEFT OUTER JOIN LANCAMENTOS SALDO_ANT ON LCTOS.COD_CONTA = SALDO_ANT.COD_CONTA
--FILTRAR AQUI MENOR QUE O PERIODO QUE QUER CONSULTAR
AND SALDO_ANT.DT_LANCA < '18.11.2015'
--
GROUP BY
LCTOS.DATA,
LCTOS.DESCRICAO,
LCTOS.ENTRADA,
LCTOS.SAIDA,
LCTOS.SALDO,
LCTOS.CONTA,
LCTOS.COD_CONTA
ORDER BY
LCTOS.DATA
Abraççç
Renato Rubinho
Gostei + 1
Mais Posts
27/08/2014
Joel Rodrigues
O que você considera saldo anterior? Seria o saldo antes do último lançamento?
Por exemplo:
1) Entrada: 10 | Saída: 0 | Saldo: 10
2) Entrada: 10 | Saída: 0 | Saldo: 20
3) Entrada: 0 | Saída: 5 | Saldo: 15
Saldo atual: 15
Saldo anterior: 20?
Gostei + 0
27/08/2014
Renato Rubinho
Do resultado do seu select faça um novo join com a tabela de lançamentos calculando o saldo do período anterior.
select
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
(sum(saldo.vl_entra) - sum(saldo.vl_sai)) as Saldo_Ant
from
(
select
l.dt_lanca as Data,
l.autor as Descricao,
sum(l.vl_entra) as Entrada,
sum(l.vl_sai) as Saida,
(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo,
c.conta as conta,
l.cod_conta
from
lancamentos l, contas c
where
l.cod_conta = c.cod_conta
and l.cod_recurso = EdtCod_recurso.Text +
and l.dt_lanca between "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'" and "FormatDateTime('mm/dd/yyyy',DtpFinal.Date)+'"
group by
l.dt_lanca,l.autor, c.conta
order by
l.dt_lanca
)
lctos,
lancamentos saldo_ant
where
lctos.cod_conta = saldo_ant.cod_conta
and saldo_ant.dt_lanca < "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'"
group by
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
order by
lctos.Data
Abraççç,
Renato
Gostei + 0
27/08/2014
Hardsoft Informática
O que você considera saldo anterior? Seria o saldo antes do último lançamento?
Por exemplo:
1) Entrada: 10 | Saída: 0 | Saldo: 10
2) Entrada: 10 | Saída: 0 | Saldo: 20
3) Entrada: 0 | Saída: 5 | Saldo: 15
Saldo atual: 15
Saldo anterior: 20?
Isso mesmo joel, é para exibir o último saldo antes do lançamento. por exemplo tenho lá passagens. quero exibir quanto tava ontem (saldo anterior), para depois exibir Entrada hoje ou Saída e quanto ficou... mas to levando um esquenta no saldo anterior..
Gostei + 0
27/08/2014
Hardsoft Informática
Do resultado do seu select faça um novo join com a tabela de lançamentos calculando o saldo do período anterior.
select
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
(sum(saldo.vl_entra) - sum(saldo.vl_sai)) as Saldo_Ant
from
(
select
l.dt_lanca as Data,
l.autor as Descricao,
sum(l.vl_entra) as Entrada,
sum(l.vl_sai) as Saida,
(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo,
c.conta as conta,
l.cod_conta
from
lancamentos l, contas c
where
l.cod_conta = c.cod_conta
and l.cod_recurso = EdtCod_recurso.Text +
and l.dt_lanca between "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'" and "FormatDateTime('mm/dd/yyyy',DtpFinal.Date)+'"
group by
l.dt_lanca,l.autor, c.conta
order by
l.dt_lanca
)
lctos,
lancamentos saldo_ant
where
lctos.cod_conta = saldo_ant.cod_conta
and saldo_ant.dt_lanca < "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'"
group by
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
order by
lctos.Data
Abraççç,
Renato
Meu jovem primeiro lhe agradeço a atenção.... bom fiz como vc sugeriu mas ai agora ta dando erro..
Dynamic Sql Error
Sql erro code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause
Gostei + 0
27/08/2014
Hardsoft Informática
Do resultado do seu select faça um novo join com a tabela de lançamentos calculando o saldo do período anterior.
select
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
(sum(saldo.vl_entra) - sum(saldo.vl_sai)) as Saldo_Ant
from
(
select
l.dt_lanca as Data,
l.autor as Descricao,
sum(l.vl_entra) as Entrada,
sum(l.vl_sai) as Saida,
(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo,
c.conta as conta,
l.cod_conta
from
lancamentos l, contas c
where
l.cod_conta = c.cod_conta
and l.cod_recurso = EdtCod_recurso.Text +
and l.dt_lanca between "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'" and "FormatDateTime('mm/dd/yyyy',DtpFinal.Date)+'"
group by
l.dt_lanca,l.autor, c.conta
order by
l.dt_lanca
)
lctos,
lancamentos saldo_ant
where
lctos.cod_conta = saldo_ant.cod_conta
and saldo_ant.dt_lanca < "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'"
group by
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
order by
lctos.Data
Abraççç,
Renato
Meu jovem primeiro lhe agradeço a atenção.... bom fiz como vc sugeriu mas ai agora ta dando erro..
Dynamic Sql Error
Sql erro code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause
Gostei + 0
27/08/2014
Hardsoft Informática
Do resultado do seu select faça um novo join com a tabela de lançamentos calculando o saldo do período anterior.
select
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
(sum(saldo.vl_entra) - sum(saldo.vl_sai)) as Saldo_Ant
from
(
select
l.dt_lanca as Data,
l.autor as Descricao,
sum(l.vl_entra) as Entrada,
sum(l.vl_sai) as Saida,
(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo,
c.conta as conta,
l.cod_conta
from
lancamentos l, contas c
where
l.cod_conta = c.cod_conta
and l.cod_recurso = EdtCod_recurso.Text +
and l.dt_lanca between "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'" and "FormatDateTime('mm/dd/yyyy',DtpFinal.Date)+'"
group by
l.dt_lanca,l.autor, c.conta
order by
l.dt_lanca
)
lctos,
lancamentos saldo_ant
where
lctos.cod_conta = saldo_ant.cod_conta
and saldo_ant.dt_lanca < "FormatDateTime('mm/dd/yyyy',DtpInicio.date)+'"
group by
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
order by
lctos.Data
Abraççç,
Renato
Meu jovem primeiro lhe agradeço a atenção.... bom fiz como vc sugeriu mas ai agora ta dando erro..
Dynamic Sql Error
Sql erro code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause
Gostei + 0
27/08/2014
Hardsoft Informática
Nesse modelo sql que fiz está me retornando de maneira correta as Entradas, as Saídas e o Saldo Atual....
select
l.dt_lanca as Data,
c.conta as Descricao,
sum(l.vl_entra) as Entrada,
sum(l.vl_sai) as Saida,
(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo,
l.autor as Historico
from
lancamentos l, contas c
where
l.cod_conta = c.cod_conta
and
l.cod_recurso = 1
and
l.dt_lanca between '01.08.2014' and '31.08.2014'
group by
l.dt_lanca,l.autor, c.conta
order by
l.dt_lanca
Mas preciso obter também o saldo anterior de cada registro exibido no dbgrid....
A estrutura da minha tabela é:
CREATE TABLE LANCAMENTOS (
SEQ_LANCA INTEGER NOT NULL,
DT_LANCA DATE,
NR_DOC VARCHAR(20),
MES VARCHAR(10),
ANO INTEGER,
COD_CONTA INTEGER,
VL_ENTRA DOUBLE PRECISION,
VL_SAI DOUBLE PRECISION,
COD_HIST INTEGER,
COMPLEMENTO VARCHAR(40),
COD_SECRET INTEGER,
AUTOR VARCHAR(255),
COD_RECURSO INTEGER,
SALDO DOUBLE PRECISION,
COD_EVENTO INTEGER,
FORMPGTO INTEGER,
SALDO_RECURSO DOUBLE PRECISION,
SEGMENTO VARCHAR(15),
EXPORTADO VARCHAR(1) DEFAULT 'N',
DATA_EXPORTADO DATE
);
O resultado que estou obtendo até agora com a sql acima esta assim...
Gostei + 0
27/08/2014
Alisson Santos
No caso qual é a estrutura de código dentro do programa.
Pois antes de executar a rotina sql tem que primeiro entender como o seu programa está, pois dentro dele provavelmente terá que fazer um laço para retorna essas informações ou fazer uma procedure que execute de uma só vez retornando os valores para a query.
Qual o banco?
Gostei + 0
27/08/2014
Hardsoft Informática
Meu banco de dados é Firebird, uso como acesso aos dados ibquery no delphi 7.... Acho que não entendi bem o que quis me dizer...
Minha aplicação tem uma tela onde o usuário vai informar o período a ser consulta e dai após a consulta deverá exibir num grid o nome da conta, o saldo anterior, valor de entrada, valor de saída e saldo atual
Data Lançamento | Conta | Saldo anterior | Entrada | Saída | Saldo Atual
07/08/2014 | Saldo Abertura | 0,00 | 600,00 | 0,00 | 600,00
07/08/2014 | Alimentação |0,00 | 0,00 | 12,00 | -12,00
08/08/2014 | Alimentação |-12,00 | 0,00 | 12,00 | -24,00
Gostei + 0
28/08/2014
Renato Rubinho
Deixei uma vírgula perdida no último campo do group by
Veja se funciona sem ela.
Se não funcionar, posta o sql da sua tabela "contas" para simular o comando com as tabelas criadas.
group by lctos.Data, lctos.Descricao, lctos.Entrada, lctos.Saida, lctos.Saldo, lctos.conta, lctos.cod_conta, <<<<--- order by lctos.Data
Gostei + 0
28/08/2014
Hardsoft Informática
A tabela contas tem a seguinte estrutura:
CREATE TABLE CONTAS (
COD_CONTA INTEGER NOT NULL,
CONTA VARCHAR(40),
CLASSE VARCHAR(17),
TIPO VARCHAR(10),
MOVIMENTO VARCHAR(10),
SALDO DOUBLE PRECISION,
SALDOPER1 DOUBLE PRECISION,
SALDOPER2 DOUBLE PRECISION,
SALDOPER3 DOUBLE PRECISION,
SALDOPER4 DOUBLE PRECISION,
SALDOPER5 DOUBLE PRECISION,
SEGMENTO VARCHAR(15),
AGREGAR CHAR(3),
COD_INTEGRA INTEGER
);
Dela só preciso o nome da conta o restante vem da tabela LANCAMENTOS que já mensionei
Vou tentar com o sql q vc sugeriu
Gostei + 0
29/08/2014
Renato Rubinho
Simulei com esse e funcionou.
select
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta,
(sum(saldo_ant.vl_entra) - sum(saldo_ant.vl_sai)) as Saldo_Ant
from
(
select
l.dt_lanca as Data,
l.autor as Descricao,
sum(l.vl_entra) as Entrada,
sum(l.vl_sai) as Saida,
(sum(l.vl_entra) - sum(l.vl_sai)) as Saldo,
c.conta,
l.cod_conta
from
lancamentos l, contas c
where
l.cod_conta = c.cod_conta
and l.cod_recurso = 0
and l.dt_lanca between '01.08.2014' and '01.08.2014'
group by
l.dt_lanca,l.autor, c.conta, l.cod_conta
order by
l.dt_lanca
)
lctos,
lancamentos saldo_ant
where
lctos.cod_conta = saldo_ant.cod_conta
and saldo_ant.dt_lanca < '01.08.2014'
group by
lctos.Data,
lctos.Descricao,
lctos.Entrada,
lctos.Saida,
lctos.Saldo,
lctos.conta,
lctos.cod_conta
order by
lctos.Data
Abraççç,
Renato
Gostei + 0
17/11/2015
Hardsoft Informática
Gostei + 0
17/11/2015
Targino Silveira
Abraços
Gostei + 0
17/11/2015
Marcos P
Sql Server, né mesmo ?
Faz o seguinte : vai no Fiddle, cria tua estrutura de dados e coloca a query como está hoje.
Depois volta aqui e me avisa, que tento de ajudar.
Ok ?!?
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)