[firebase-br] Caculo de saldo

Diego Bulgarelli diegobulg em gmail.com
Qua Jan 25 12:41:40 -03 2012


Galera, boa tarde!

Não sei se é isto que está mas tenho uma dúvida parecida:
Gostaria que minha consulta retornasse com um saldo calculado (este campo
não existe na tabela).
Ex (DC = Débito ou Crédito):
COD  DESCR   VALOR   DC    *SALDO*
1       Teste C    100        C      *100*
2       Compra      50        C      *150*
3       Venda        30        D      *120*
*
*
Eu pensei em fazer a consulta e dar um While do primeiro ao último registro
fazendo isso.
Tem como fazer isso?

Grato
Diego Bulgarelli

Em 25 de janeiro de 2012 11:44, Fabiano Lima <frguitar em bol.com.br> escreveu:

> Realmente meu amigo esta errado. Por descuido enviei o codigo anterior.
> Segue o "correto"
>
> CREATE OR ALTER PROCEDURE SLD_CX(
> DATA_INI DATE,
> DATA_FIN DATE)
> RETURNS (
> R_LANC_ID INTEGER,
> R_CCONTA INTEGER,
> R_CCONTAB INTEGER,
> R_SALDO NUMERIC(11,2))
> AS
> DECLARE VARIABLE V_CREDITO NUMERIC(10,2);
> DECLARE VARIABLE V_DEBITO NUMERIC(10,2);
> DECLARE VARIABLE V_DATA TIMESTAMP;
> DECLARE VARIABLE V_SALDO_ANT NUMERIC(10,2);
> DECLARE VARIABLE V_SALDO_INI NUMERIC(10,2);
>
> BEGIN
> FOR
> SELECT LANC_ID, CCONTA, DATA, CREDITO, DEBITO
> FROM LANC
> WHERE DATA BETWEEN :DATA_INI AND :DATA_FIN
> ORDER BY DATA
> INTO :R_LANC_ID, :R_CCONTA, :V_DATA, :V_CREDITO, :V_DEBITO
> DO
>
> BEGIN
>
> SELECT SUM (CREDITO - DEBITO) FROM LANC WHERE DATA < :DATA_INI AND CCONTA
> = CCONTA INTO :V_SALDO_ANT;
> SELECT SALDO_INI FROM CADBANCO WHERE CCONTA = :R_CCONTA INTO :V_SALDO_I NI;
>
> BEGIN
>
>
> R_SALDO = :V_SALDO_ANT + :V_CREDITO - :V_DEBITO;
>
> IF (R_SALDO IS NULL or :v_saldo_ini <> '0.00') THEN
>
> R_SALDO = :V_SALDO_INI + :V_CREDITO - :V_DEBITO;
>
> SUSPEND;
> END
> END
> END
>
> Na situação de exemplo em que:
>
> saldo_ini = 100
>
> lanc 1
> debito =1
>
> lanc 2
> debto = 10
>
>
> ele me devolve
>
> lanc 1 saldo = 99
> lanc 2 saldo = 90
>
> Logo ele não considera o ultimo saldo para fazer o calculo, e eu não
> estava inclinado a usar select sum no credito dentro do periodo pq ele iria
> me retornar a soma de tudo e não até o lançamento em questão.
>
> abraço
> Fabiano
>
>
>
> ____________________________________________
>
> Em 25/01/2012 10:24, Gamarra de Jesus Daniel <
> danielgamarradejesus em gmail.com > escreveu:
> Amigo, não compreendi para que serve o ultimo select, uma vez que a
> variável saldo já obteve um valor.
> Além do que o select leva em consideração as próprias variáveis.
> Abraço
>
> Em 24 de janeiro de 2012 16:39, Fabiano Lima  escreveu:
>
> > Então, desfiz meus triggers e troquei a função de calculo do saldo
> para
> > uma procedure.
> > Porem estou com um problema para somar valores distintos pois tenho 3
> > contas as quais tenho que ter o calculo do saldo independente)
> > Na procedure abaixo eu obtenho o saldo inicial de acordo com o codigo
> da
> > conta, mas na hora de calcular o saldo ele sempre esta fazendo a soma
> do
> > credito menos a soma do debito, e ignorando o select onde obtenho o
> saldo
> > anterior ao data_ini
> >
> > //// segue o codigo/////
> >
> >
> > CREATE OR ALTER PROCEDURE SLD_CX(
> >    DATA_INI DATE,
> >    DATA_FIN DATE)
> > RETURNS (
> >    R_LANC_ID INTEGER,
> >    R_CCONTA INTEGER,
> >    R_CCONTAB INTEGER,
> >    R_SALDO_INI NUMERIC(11,2),
> >    R_SALDO NUMERIC(11,2))
> > AS
> > DECLARE VARIABLE V_CREDITO NUMERIC(10,2);
> > DECLARE VARIABLE V_DEBITO NUMERIC(10,2);
> > DECLARE VARIABLE V_DATA TIMESTAMP;
> > DECLARE VARIABLE V_SALDO_ANT_CRED NUMERIC(10,2);
> > DECLARE VARIABLE V_SALDO_ANT_DEB NUMERIC(10,2);
> > DECLARE VARIABLE V_SALDO NUMERIC(10,2);
> >
> > BEGIN
> >        FOR
> >        SELECT LANC_ID, CCONTA, DATA, CREDITO, DEBITO
> >        FROM LANC
> >        WHERE DATA BETWEEN :DATA_INI AND :DATA_FIN
> >        ORDER BY DATA
> >        INTO :R_LANC_ID, :R_CCONTA, :V_DATA, :V_CREDITO, :V_DEBITO
> >        DO
> >
> >    BEGIN
> >
> >       SELECT SUM (CREDITO) FROM LANC WHERE DATA < :DATA_INI AND
> CCONTA =
> > CCONTA INTO :V_SALDO_ANT_CRED;
> >       SELECT SUM (DEBITO) FROM LANC WHERE DATA < :DATA_INI AND
> CCONTA =
> > CCONTA INTO :V_SALDO_ANT_DEB;
> >
> >       R_SALDO = (V_SALDO_ANT_CRED - V_SALDO_ANT_DEB);
> >
> >       IF (R_SALDO IS NULL) THEN
> >
> >        SELECT SALDO_INI, CCONTA FROM CADBANCO
> >        WHERE CCONTA = :R_CCONTA
> >        INTO :R_SALDO_INI, :R_CCONTAB;
> >
> >       R_SALDO = R_SALDO_INI;
> >
> >       BEGIN
> >
> >       SELECT DISTINCT :R_SALDO + :V_CREDITO - :V_DEBITO
> >       FROM LANC WHERE (LANC_ID = :R_LANC_ID)
> >       AND (DATA = :V_DATA)
> >       AND (CCONTA = :R_CCONTAB)
> >       INTO :R_SALDO;
> >       SUSPEND;
> >
> >       END
> >
> >    END
> >
> > END
> >
> >
> >
> > Agradeço qualquer ajuda.
> >
> > Fabiano
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
>
>
>
> --
> "Dai-me Senhor, a perseverança das ondas do mar, que fazem de cada recuo um
> ponto de partida para um novo avanço."
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista