[firebase-br] RES: Caculo de saldo - Mais de uma conta
UNIBRAS - PROGRAMACAO
programacao em unibrasdistribuidora.com.br
Qui Jan 26 15:27:41 -03 2012
Pessoal,
Nãp sei se já foi resolvido, talves as rotinas abaixo possam ajudar:
Att.
José Aparecido
Softmaxi Tecnologia em Software
www.softmaxi.com.br
----------------INICIO DE ROTINAS-------------------------
---------------------------atualiza saldo da conta SET TERM ^ ;
CREATE PROCEDURE PROC_ATUALIZA_SALDO_CONTA (
codconta integer,
dt date,
valor numeric(18,2))
as
BEGIN
/*Caso já exista um saldo para a conta na data informada no parâmetro DT,
atualiza o valor*/
IF (EXISTS(SELECT 1 FROM SALDO_BANCO WHERE CODIGO_CONTA_BCO = :CODCONTA
AND DATA = :DT)) THEN
BEGIN
UPDATE SALDO_BANCO SET VLR_SALDO_ATUAL = VLR_SALDO_ATUAL + :VALOR
WHERE CODIGO_CONTA_BCO = :CODCONTA AND DATA = :DT;
END
ELSE
/*Caso não haja saldo para a conta na data informada no parâmetro DT,
inclui o valor*/
BEGIN
INSERT INTO SALDO_BANCO(CODIGO_CONTA_BCO, DATA, VLR_SALDO_ATUAL)
VALUES (:CODCONTA, :DT, :VALOR);
END
END^
SET TERM ; ^
GRANT SELECT,INSERT,UPDATE ON SALDO_BANCO TO PROCEDURE
PROC_ATUALIZA_SALDO_CONTA;
GRANT EXECUTE ON PROCEDURE PROC_ATUALIZA_SALDO_CONTA TO SYSDBA;
-------------------- retorna saldo anterior---------------------------------
SET TERM ^ ;
CREATE PROCEDURE PROC_RETORNA_SALDO_ANTERIOR (
codconta integer,
dt date)
returns (
valor numeric(18,2))
as
BEGIN
SELECT VLR_SALDO_ATUAL FROM SALDO_BANCO
WHERE CODIGO_CONTA_BCO = :CODCONTA
AND DATA = (SELECT MAX(DATA) FROM SALDO_BANCO WHERE DATA < :DT)
INTO :VALOR;
END^
SET TERM ; ^
GRANT SELECT ON SALDO_BANCO TO PROCEDURE PROC_RETORNA_SALDO_ANTERIOR;
GRANT EXECUTE ON PROCEDURE PROC_RETORNA_SALDO_ANTERIOR TO SYSDBA;
-----------------------------extrato
banco-------------------------------------
SET TERM ^ ;
CREATE PROCEDURE SPEXTRATOBANCO (
inicio date,
fim date,
id_conta smallint)
returns (
data date,
valor decimal(15,2),
tipo char(1),
historico varchar(150),
notas varchar(1000),
conciliado char(1),
nro_cheque varchar(12),
codigo_extrato numeric(12,0),
documento varchar(20),
codigo_conta_bco smallint)
as
declare variable saldo_ant_credito decimal(15,2); declare variable
saldo_ant_debito decimal(15,2); declare variable saldo_ant_conta
decimal(15,2); declare variable saldo_final decimal(15,2); begin
select (sum(exc.VLR_LANCAMENTO)) from
extrato_banco exc where exc.data < :inicio and exc.tipo_lancamento = 'C'
and exc.codigo_conta_bco = :id_conta into :saldo_ant_credito;
select (sum(exd.VLR_LANCAMENTO)) from
extrato_banco exd where exd.data < :inicio and exd.tipo_lancamento = 'D'
and exd.codigo_conta_bco = :id_conta
into :saldo_ant_debito;
select (sum(SALDO_INICIAL_CONTA)) from
conta where codigo_conta_bco = :id_conta
into :saldo_ant_conta;
data = :inicio - 1;
historico = 'SALDO_ANTERIOR';
valor = ((saldo_ant_credito + (saldo_ant_conta)) - saldo_ant_debito);
saldo_final = valor;
if (:valor < 0) then begin
tipo = 'D';
valor = valor * -1;
end
else begin
tipo = 'C';
end
suspend;
tipo = 'D';
for select codigo_conta_bco, data, vlr_lancamento, historico, notas,
baixado, nro_cheque, codigo_extrato, documento from extrato_banco
where data >= :inicio and data <= :fim and tipo_lancamento = 'D'
and codigo_conta_bco = :id_conta into :codigo_conta_bco, :data,
:valor, :historico, :notas, :conciliado, :nro_cheque, :codigo_extrato,
:documento
do
begin
saldo_final = saldo_final - valor;
suspend;
end
tipo = 'C';
for select codigo_conta_bco, data, vlr_lancamento, historico, notas,
baixado, nro_cheque, codigo_extrato, documento from extrato_banco
where data >= :inicio and data <= :fim and tipo_lancamento = 'C'
and codigo_conta_bco = :id_conta into :codigo_conta_bco, :data,
:valor, :historico, :notas, :conciliado, :nro_cheque, :codigo_extrato,
:documento
do
begin
saldo_final = saldo_final + valor;
suspend;
end
data = :fim;
historico = 'SALDO FINAL';
tipo = 'C';
valor = saldo_final;
suspend;
end^
SET TERM ; ^
GRANT SELECT ON EXTRATO_BANCO TO PROCEDURE SPEXTRATOBANCO;
GRANT SELECT ON CONTA TO PROCEDURE SPEXTRATOBANCO;
GRANT EXECUTE ON PROCEDURE SPEXTRATOBANCO TO SYSDBA;
------------------------------ FINAL DAS
ROTINAS----------------------------------------
Att.
José Aparecido
Softmaxi Tecnologia em Software
www.softmaxi.com.br
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Fabiano Lima
Enviada em: quarta-feira, 25 de janeiro de 2012 21:40
Para: FireBase
Assunto: Re: [firebase-br] Caculo de saldo - Mais de uma conta
Paulo, aproveitando o gancho se vc conseguir dar uma luz no meu codigo,
preciso que o saldo seja calculado porem tem que ser distintos pois tenho 3
contas diferentes e preciso retornar os valores de saldo de cada uma delas
nos lançamentos
Segue link do meu problema
http://firebase.com.br/pipermail/lista_firebase.com.br/2012-January/076557.h
tml
Grato
Fabiano Lima
____________________________________________
Em 25/01/2012 21:13, Paulo Portella < pportellaa.firebase em gmail.com >
escreveu:
Heheheh
Meu nome é Paulo.Portella... O H.David Burton é quem assina a frase que
posto, que eu gosto muito desses (e outros) dizeres.
Mas fico feliz que você encontrou a solução pro que precisava.
E conte sempre com a gente. estamos aqui pra ajudar.
Um abraço.
"Vivam de maneira que as pessoas que os conheçam, ainda que não conheçam a
CRISTO, queiram CONHECÊ-LO por conhecerem vocês"
H. David Burton
Em 25/01/2012 15:19, Diego Bulgarelli escreveu:
> Olá, H. David Burton!
>
> Acredito que o comando Case não funciona neste caso pois preciso
"*calcular > o saldo com base no registro anterior"*.
> Vou mudar a ordem dos registros citados e repare que o saldo dos
registros > pode mudar (menos o do último registro):
> COD DESCR VALOR DC *SALDO*
> 2 Compra 50 C *50*
> 3 Venda 30 D *20*
> 1 Teste C 100 C *120*
>
> Já fiz calculando na própria aplicação mas perde muito performance.
> Estou muito curioso para achar uma maneira de fazer isso via SQL mesmo,
mas > até hoje não vi ninguém falando sobre um assunto parecido.
>
> Grato
> Diego Bulgarelli
>
>
> Em 25 de janeiro de 2012 14:51, Paulo Portella< >
pportellaa.firebase em gmail.com> escreveu:
>
>> Procura ver o comando CASE
>> ex:
>>
http://www.devmedia.com.br/**post-1489-O-case-do-firebird.**html<http://w
ww.devmedia.com.br/post-1489-O-case-do-firebird.html>;
>>
>> "Vivam de maneira que as pessoas que os conheçam, ainda que não
conheçam a >> CRISTO, queiram CONHECÊ-LO por conhecerem vocês"
>> H. David Burton
>>
>>
>> Em 25/01/2012 12:41, Diego Bulgarelli escreveu:
>>
>>> 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
>>>
>>>
>> ______________________________**________________
>> 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<http://www.firebase.co
m.br/fb/artigo.php?id=1107>;
>> Para consultar mensagens antigas:
http://firebase.com.br/**pesquisa<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
______________________________________________
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