Fórum cd.nirlan #1768

10/01/2009

0

como criar um campo calculado em um clientdataset em tempo de execução ? obrigado
Nirlan Fundao

Nirlan Fundao

Responder

Posts

10/01/2009

Ricardo Boaro

                     Olá

                     Para que eu entenda bem a situação e possa apresentar uma solução plausível, o seu ClientDataSet esta ligado a um Provider ou vc usa ele apenas em memória?

                     Abraço
Responder

Gostei + 0

10/01/2009

Nirlan Fundao

uso apenas em memória. O objetivo é somente para exibir um total em um label abaixo de um DBGRID.
Responder

Gostei + 0

11/01/2009

Ricardo Boaro

        Perfeito!

        Sendo assim ja tenho a solução para o seu problema, vamos criar um campo Aggregate.
        Para isso, acesse o Field Editor do seu ClientDataSet, clique com o direito do mouse e selecione NEW.

        Defina um nome para o seu Field, por exemplo TotalValor, em TYPE selecione Aggregate, e em FIELD TYPE marque a opção Aggregate.

        Depois acesse a propriedade Expression e coloque la o que vc precisa, por exemplo, para efetuar a soma da coluna da um field SUM(NomeFieldASerSomado). Se vc der uma olhada no help do delphi na opçao Field Aggregate do ClientDataSet, verá que podemos fazer várias operacoes com esse tipo.

        Feito isso deixe seu Field aggregate selecionado e no Object Inspector mude a propriedade ACTIVE para True.
com isso vc ativa o seu FIELD AGGREGATE.

        Após selecione seu ClientDataSet e no Object Inspector mude a propriedade AggregatesActive para True, dessa forma vc habilitou os field aggregates no ClientDataSet.

        Bom com essas configuraçoes, vc pode utilizar o seu Aggregate Field, lembrando que como vc ja deve ter os fields criados em seu clientDataSet é necessário antes de fazer esse procedimento, clicar com o direito sobre o ClientDataset e selecionar CLEAR Data, depois acessar a propriedade FieldDefs e apagar todos os fields, ai sim vc cria o seu field Aggregate e após repita o procedimento clicando com o direito do mouse e selecionando Create DataSet.

        Agora no seu código fonte, para atribuir o valor do seu campo aggregate para um Label por exemplo, faça o seguinte:

          Label1.Caption := FloatToStr(ClientDataSet1TotalValor.Value); nesse caso o TotalValor é o meu campo aggregate.

          Com isso resolvemos seu problema.

          Se vc tiver mais alguma dúvida estou a disposição, caso contrário me passe seu OK para fecharmos o chamado.

          Abraço

Responder

Gostei + 0

11/01/2009

Nirlan Fundao

entendi perfeitamente a sua explicação, mas conforme a primeira mensagem que enviei, eu preciso criar o campo calculado em tempo de execução. A minha tela de consulta é genérica para várias tabelas, sendo que algumas terão campos calculados e outras não. Por isso o campo precisaria ser criado em tempo de execução. Nirlan
Responder

Gostei + 0

12/01/2009

Ricardo Boaro

             Vamos lá então.

             Vou passar a vc uma solução que testei aqui e funcionou. Veja para criarmos Fields dinâmicamente usamos:

           var
            CampoCalc : TField;
            Qtde, valor : TField;

            CampoCalc :=  TFloatField.Create(application);
            Qtde :=  TFloatField.Create(application);
            Valor :=  TFloatField.Create(application);
        
           Feito isso podemos acessá-los pelo método FieldByName.

           No caso do campo calculado, eu criei uma função que faz o field CampoCalc, receber a Qtde * o valor, e no evento OnCalcField do ClientDataSet eu chamo a função que faz o calculo.

           Dessa forma funcionou, veja se isso resolve o seu problema

           Abraço

Responder

Gostei + 0

12/01/2009

Nirlan Fundao

OK. podemos encerrar este chamado. Obrigado.
Responder

Gostei + 0

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

Aceitar