[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