Fórum Ajuda - Campos Aggregates #55853
20/04/2006
0
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+
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
Curtir tópico
+ 0
Responder
Posts
20/04/2006
Thomaz_prg
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:
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á.
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á.
Responder
Gostei + 0
21/04/2006
Alexandre_torres
Amigo,
thomaz_prg obrigado pela dica, vou testar agora mesmo e postarei aqui mais tarde.
T+
thomaz_prg obrigado pela dica, vou testar agora mesmo e postarei aqui mais tarde.
T+
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)