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