Fórum Ajuda para montar procedure .. #57152

25/10/2006

0

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 [b:d9383a009e]CAIXA[/b:d9383a009e] 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/11/2005    87    250,00    250,00
   01/11/2005    88    200,00    200,00
   01/11/2005    89    200,00    200,00
   01/11/2005    99    -435,00   435,00
   04/11/2005    91    300,00    300,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 descobri 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


Faustoalves

Faustoalves

Responder

Posts

26/10/2006

Catunda

CREATE PROCEDURE CAIXA (
DATA1 DATE,
DATA2 DATE)
RETURNS (
DATA DATE,
LAN INTEGER,
VALOR NUMERIC(15,2),
SALDO NUMERIC(15,2))
AS
begin
saldo=0;
for select caidat,cailan,sum(caival) from caixa
where (caidat>=:data1 and caidat<=:data2)
group by caidat,cailan
order by caidat,cailan
into :dia,:cmda,:total do
begin
saldo=:saldo+:total;
suspend;
end
end


Responder

Gostei + 0

26/10/2006

Catunda

desculpe .. na procedure enviada esqueci de alterar a linha do INTO e a da incrementação do SALDO. Então ficaria:

CREATE PROCEDURE CAIXA (DATA1 DATE, DATA2 DATE)
RETURNS (DATA DATE, LAN INTEGER, VALOR NUMERIC(15,2),
SALDO NUMERIC(15,2))
AS
begin
saldo=0;
for select caidat,cailan,sum(caival) from caixa
where (caidat>=:data1 and caidat<=:data2)
group by caidat,cailan
order by caidat,cailan
into :data,:lan,:valor do
begin
saldo=:saldo+:valor;
suspend;
end
end


Responder

Gostei + 0

26/10/2006

Faustoalves

Amigo muitíssimo obrigado..
era exatamente disso que estava precisando..
Valeu
Fausto


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar