RES: [firebase-br] Ajuda para montar um SP que calcule saldo diário..

José Aparecido da Silva joseasilva em bol.com.br
Qua Out 25 14:41:14 -03 2006


Segue o código para a SP. Espero que funcione. Me reporte algum erro
Use assim SELECT * from PROC_MOVI(:datainicial) onde datainicial é o
parametro para a procedure ;
********************************************
SET TERM ^ ;

CREATE PROCEDURE PROC_MOVI (
    DATAINICIAL DATE)
RETURNS (
    CAILAN INTEGER,
    CAIDAT DATE,
    CAITIP CHAR(1),
    CAIHIS VARCHAR(40),
    CAIVAL NUMERIC(12,),
    SALDO NUMERIC(12,2))
AS
DECLARE VARIABLE DEBITO DOUBLE PRECISION;
DECLARE VARIABLE CREDITO DOUBLE PRECISION;
DECLARE VARIABLE SALDOATUAL DOUBLE PRECISION;
begin
  select sum(movi.CAIVAL) from CAIXA movi where movi.CAITIP = 'D' and
movi.CAIDAT < :DATAINICIAL into :DEBITO;
  select sum(movi.CAIVAL) from CAIXA movi where movi.CAITIP = 'C' and
movi.CAIDAT < :DATAINICIAL into :CREDITO;
  SALDOATUAL =coalesce(CREDITO,0) - coalesce(DEBITO,0) ;
  CAILAN =0 ;
  CAIDAT = DATAINICIAL - 1;
  CAITIP = '';
  CAIHIS = 'SALDO ANTERIOR';
  CAIVAL = SALDOATUAL;
  SALDO = SALDOATUAL;
  suspend;
  for select
CAILAN,CAIDAT,CAITIP,CAIHIS,COALESCE(CAIVAL,0),COALESCE(CAIVAL,0) from CAIXA
where CAIDAT >= :DATAINICIAL order by CAIDAT,CAILAN into
:CAILAN,:CAIDAT,:CAITIP,:CAIHIS,:CAIVAL,:SALDO do
  begin
      if (CAITIP = 'C') then SALDO = SALDOATUAL + :CAIVAL;
      if (CAITIP = 'D') then SALDO = SALDOATUAL - :CAIVAL;
      SALDOATUAL = :SALDO;
      suspend;
  end
end
^

SET TERM ; ^

GRANT SELECT ON CAIXA TO PROCEDURE PROC_MOVI;

GRANT EXECUTE ON PROCEDURE PROC_MOVI TO SYSDBA;


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Fausto
Enviada em: quarta-feira, 25 de outubro de 2006 15:04
Para: FireBase
Assunto: [firebase-br] Ajuda para montar um SP que calcule saldo diário..

Boa tarde gente..
Agora estou apelando mesmo..
Estou precisando de uma ajuda para escrever uma stored procedure 
retornável que calcule o saldo diário,tal qual extrato bancário.
Tenho a tabela CAIXA com os seguintes campos
 CAIDAT  DATE NOT NULL  : Data de lançamento
 CAILAN  INTEGER NOT NULL : PK AutoIncremento via generator
 CAIHIS    VARCHAR(40) : Histórico      
 CAIVAL  NUMERIC(12,2): Valor
 CAITIP  CHAR(1):Informa se é Débito ou Crédito (D/C)
Preciso desenvolver uma procedure que me retorne estes campos da tabela 
CAIXA, mais uma terceira coluna que seria o calculo do saldo atual, 
entre duas datas.
De tal forma que o resultado fosse este:

      Data       Lan    Valor     Saldo
   01/10/2005    87    250,00    250,00
   01/10/2005    88    200,00    450,00
   01/10/2005    89    200,00    650,00
   01/10/2005    99    -435,00   215,00
   04/10/2005    91    300,00    515,00
Observem que a coluna saldo é calculada linha a linha..No paradox eu
utilizava uma Query com a seguinte instrução:
SELECT CAIDAT, CAILAN, CAIVAL, sum (DISTINCT CAIVAL)
FROM CAIXA
GROUP BY CAIDAT,CAILAN,CAIVAL

Mas os amigos Eduardo Jedliczka e Kleber Caneva, me responderam que no
FIREBIRD a clausula distinct utiliza toda uma linha e não somente para
função SUM.
Portanto se alguém puder me ajudar com a construção desta SP, ou tenha algo
já pronto e puder me ceder ficarei eternamente grato.

Fausto





______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista