Ajuda - Campos Aggregates

Firebird

20/04/2006

Amigos,

Estou com um probleminha. Estou desenvolvendo um sistema com Delphi7 com firebird 1.5 com componentes IBX/IBDataBase/IBTransaction/IBDataset/DataSource e gostaria de saber se existe a possibilidades de criar 4 campos Aggregates em uma tabela minha chamada Caixa_Det onde teriam a funcionalidade de:

1º campo : Somar todos valores do campo valor;

2º campo : Somar todos os valores do campo valor, cujo uma flag que criei seja (E) tipo char1 que indica as entradas;

3º campo : Somar todos os valores do campo valor, cujo uma flag que criei seja (S) tipo char1 que indica as saidas;

4º campo : subtrair as entradas das saídas.

Eu poderia fazer isso através de laços (while do) mas minha aplicação já tem muitos processos pesados e ficaria com + estes, porém os campos aggregates tem essa finalidade de fazer esses processos de uma forma mais ´leve´ e simples, ví em uma vídeo aula, porém era com ClientDataSet e não estou conseguindo fazer com o IBDataSet.

espero ter sido claro, este é um simples controle financeiro de caixa diário.

desde já eu agradeço a quem poder me ajudar.

ai irmão (oTTo) alguma luz.... :lol:

T+


Alexandre_torres

Alexandre_torres

Curtidas 0

Respostas

Thomaz_prg

Thomaz_prg

20/04/2006

Aí cara... não sou o Otto mas talvez possa ajudar....

Os componentes dataset IBX (Ibtable, ibquery, ibdataset) não possuem campos aggregate (Disponível nos ClientDataSet´s). Mas você pode tentar ´simular´ isso no seu select, ou criando seu select a partir de uma procedure (selecionável), ou então através de um select direto mesmo, criando os devidos índices para não haver perda de performance. Poderia ser assim:

select 
  ID_CAIXA,
  DATA, 
  TIPO,   /* Sua flag */
  VALOR,
  (select SUM(VALOR) from CAIXA_DET) as SOMA_GERAL,
  (select SUM(VALOR) from CAIXA_DET where TIPO=´E´) as VALOR_ENT,
  (select SUM(VALOR) from CAIXA_DET where TIPO=´S´) as VALOR_SAI,
  (select SUM(
      (case tipo when ´S´ then -1 else 1 end)*VALOR
   ) from CAIXA_DET) as VALOR_ATUAL
from 
  CAIXA_DET


Para melhorar a performance, crie um índice para o campo TIPO.
Apenas a carater de explicação, na linha referente ao campo VALOR_ATUAL (soma das entradas menos a soma das saídas), o banco verifica se o campo tipo está definido para ´S´ e se tiver, multiplica VALOR por -1 (ou seja, deixa o valor negativo) e soma ele ao montante.
Creio que isto ajudará.


GOSTEI 0
Alexandre_torres

Alexandre_torres

20/04/2006

Amigo,

thomaz_prg obrigado pela dica, vou testar agora mesmo e postarei aqui mais tarde.

T+


GOSTEI 0
POSTAR