Olá amigos, o e-mail é um pouco extenso mas acho que o assunto interessa 
a bastante gente, por favor leiam;

A poucos dias resolvi destrinchar todos os tipos de informacoes que 
podem ser definidas em um campo do ClientDataSet (propriedade FieldKind);

Fiz algumas descobertas, tirei algumas conclusões e consegui algumas 
dúvidas também.

Existem 5 tipos implemantados no ClientDataSet:

1- fkData - Estes campos representam campos que existem fisicamente no 
banco de dados;
2- fkLookup - Os famosos DBLookupComboBoxes
3- fkCalculated - Campo interno cujo valor é calculado através do evento 
OnCalcFields, este campo não tem seu valor enviado ao banco de dados o 
que é ótimo para campos cujo valor podem ser obtidos através de outros 
campos existentes (Ex: Juros); (Adoro este tipo de campo mas tenhos 
minhas dúvidas, leia abaixo)
4- fkInternalCalc - Tem a mesma funcionalidade do tipo fkCalculated 
porém seu valor é gravado no ClientDataSet mas não é enviao ao Banco de 
Dados.
5- fkAggregate - Este eh o bicho, o único tipo que possui uma 
propriedade Expression onde podem ser implementados calculos como Soma,  
Média, Contagem, Minimo e Máximo, porém seu uso é um tanto trabalhoso e 
obscuro;

Agora vem as dúvidas galera:
Quando eu tenho um campo de um registro Ex: JUROS, eu posso definir um 
campo do tipo Calculated e efetuar o cálculo dos juros sobre o campo 
VALOR do mesmo registro no evento OnCalcFields, funciona às mil 
maravilhas, mas suponhamos que eu tenha que calcular o VALOR total de um 
PEDIDO, composto por vários itens, nesta situação não posso usar um 
campo do tipo Calculated por que no evento OnCalcFields não é permitido 
a movimentação do ponteiro ou modificações de dados do ClientDataSet uma 
vez que estas operações executam o evento OnCalcFields novamente e o 
sistema entraria em Loop Infinito, isso está bem claro na documentação 
do Delphi (Note:    When the AutoCalcFields property is true, an 
OnCalcFields event handler should not modify the dataset (or a linked 
dataset if it is part of a master-detail relationship), because such 
modifications retrigger the OnCalcField event, leading to infinite 
recursion.)
Bom com esta restrição parti para a implementação desses valores em um 
campo fkInternalCalc, mas este por sua vez não me agradou pelo fato de 
ter que fazer os cáculos manualmente, editar o registro e gravar o 
resultato, sem falar que ele não serve para totalizar nada jah que seu 
valor eh gravado e deve ser calculado para cada registro do 
ClientDataSet, rápidamente abandonei este tipo.
Restou-me ainda a solução fkAggregate, fiz algumas tentativas sem 
sucesso e pensei "poxa mas que tipo de campo embaçado", sem falar que a 
própria documentação do Delphi sobre ele eh bem pobre, mas depois de 
várias tentativas obtive sucesso, e passei a usá-lo frequentemente, mas 
algumas coisas tem me deixado com a pulga atrás da orelha;

1- A documentação do Delphi sobre este tipo deixa a desejar
2- Quando você cria um campo com este tipo ele vem *desativado???* por 
default
3- A propriedade Visible deste campo também vem *desatitavada???* por 
default
4- No ClientDataSet se eu tentar arrastar este campo sobre o formulário 
para que seja adicionado o Label e o DBEdit correspondente a ele nada 
acontece???
5- Ele só pode efetuar cálculos sobre os campos do tipo fkCalculated
6- Para que os cálculos funcionem a propriedade AggregatesActive do 
ClientDataSet deve estar Ativa

Agora por favor amigos me respondam, estou indo pelo caminho errado?
O que vocês usam para totalizar pedidos, contas, lotes, etc...?
Eu particularmente não gosto de fazer estes cáculos no Banco de Dados e 
retornar os valores via SQL pois hoje em dia as máquinas mesmo as 
estações mais simples são suficientemente rápidas e tem uma quantidade 
de memória razoável para efetuar estes cálculos simples sem haver perda 
de desempenho.
E além do mais quanto menos informações vierem do servidor menor é o 
tráfego na rede;

Acho que eh isso

[ ]`s a todos;

Rodrigo Schiavo



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

Para ver as mensagens antigas, acesse:
 http://br.groups.yahoo.com/group/delphi-br/messages

Para falar com o moderador, envie um e-mail para:
 [EMAIL PROTECTED] ou [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a