GARANTIR DESCONTO

Fórum TClientDataSet campo intercalc agregate ??? #167806

04/07/2003

0

Alguem sabe como se trabalha com campos do tipo Internalcalc de um Tclientdataset?

ou seja, como se calcula esse campo em um outro campo de tipo aggregate?

pois dei um sum(campo_intercalc) no campo aggregate e não funcionou, ou seja, não calculou a coluna.


Help!!!

Obrigado.


Chaplinux

Chaplinux

Responder

Posts

04/07/2003

Allan

Verefique se a propriedade active do campo aggregate que vc criou está true e a propriedade AggregatesActive do ClienteDataSet tb deve estar como True .

Allan


Responder

Gostei + 0

04/07/2003

Chaplinux

O poior que esta tudo para true.

Antigamente estava funcionando quando o campo da coluna realmente existia na tabela. Mas eu eleiminei ela do banco , já q o posso fazer campo calculado, mas o aggregado não aceita campo calculado e sim somente internalcalc. mudei para internalcalc e num funionou.

só que essa coluna eu fiz tipo o campo calculado, é a soma de qtde * valor.

mas o total sempre é zero.


Responder

Gostei + 0

04/08/2010

Rafael Mattos

Como vai amigo, estou enfrentando o mesmo problema. Com campos "Data" funciona perfeitamente mas com InternalCalc nem pensar. Você conseguiu resolver esse problema?
Responder

Gostei + 0

04/08/2010

Eriley Barbosa

Antigamente estava funcionando quando o campo da coluna realmente existia na tabela. Mas eu eleiminei ela do banco , já q o posso fazer campo calculado, mas o aggregado não aceita campo calculado e sim somente internalcalc. mudei para internalcalc e num funionou.

só que essa coluna eu fiz tipo o campo calculado, é a soma de qtde * valor.

mas o total sempre é zero.
Apague o campo agregado que você criou. Selecione o ClientDataset, e modifique a sua propriedade AggregatesActive para True a fim de habilitar o uso de campos agregados.   Aplique um duplo clique no ClientDataset e no seu editor de campos clique com o botão direito do mouse e selecione a opção New Field.   Na tela de configuração do campo, defina sua propriedade Name como VirtTotalGeral, sua propriedade Type como Float e em Field Type, selecione a opção Aggregate e em seguida clique no botão OK para criar o campo.   O campo agregado aparece numa área destacada em virtude de não haver uma ocorrência deste para cada registro como no campo calculado convencional, este ocorre uma vez só para todo o ClientDataSet. Prosseguindo com a sua configuração, selecione o campo VirtTotalGeral no editor de campos e modifique a sua propriedade Active para True a fim de habilitarmos o seu uso. Na propriedade DisplayFormat coloque a máscara #,###,##0.00 e na propriedade Expression defina o seguinte comando SUM(qtde * valor), podemos notar bastante semelhança com o comando referente na linguagem sql, justamente para agregar valores calculados ou não, numa amostragem a partir de um campo. Atenciosamente   Eriley
Responder

Gostei + 0

04/08/2010

Rafael Mattos

Tudo bem com você Eriley?   Sobre as configurações no campo aggregate está tudo certo, eu acho, pois li difersos tópicos com as mesmas instruções. No mesmo ClientDataSet com o mesmo campo aggregate eu consigo somar (Expression = sum(COD_ITEM)) que é um campo DATA, mas quando eu mudo para (Expression=sum(TotalCalculado)) que é um campo InternalCalc do ClientDataSet não funciona...   Será que tem mais alguma coisa que deva ser configurada no Campo ou no ClientDataSet?     
Responder

Gostei + 0

04/08/2010

Eriley Barbosa

Tudo bem.   O campo internal calc é um campo que é para guardar um valor momentaneo, ou seja, apenas na hora que está fazendo o calculo, sendo que o resultado do calculo deve ser gravado em um campo fisico na tabela, dai por isso acho que não funciona.   Atenciosamente   Eriley
Responder

Gostei + 0

04/08/2010

Rafael Mattos

Pois é Eriley... eu andei lendo nas dicas do próprio site devmedia que os InternalCalc já eram para isso...   Mas "seguindo o baile", fiz o seguinte:   Coloquei no meu DataModule um DataSetProvider ligado a esse ClientDataSet(CDS1) onde possui o campo InternalCalc e outro ClientDataSet (CDS2) ligado ao DataSetProvider.   Mandei criar o campo InternalCalc do CDS1 no CDS2 e dai criei um campo Aggregate no CDS2 e funcionou... Só que como eu quero gerar esse valor no campo aggregate toda a vez que eu mudo um registro no CDS1, no Evento OnChange do campo InternalCalc do CDS1 eu mando dar um Refresh no CDS2...   O problema é o seguinte ele dá um refresh também no CDS1 mandando meu cursor para o primeiro registro, e isso não pode acontecer.   Não tem como eu somente atualizar no CDS2 sem alterar nada no CDS1.   Grato.
Responder

Gostei + 0

05/08/2010

Rafael Mattos

Buenas pessoal.  Consegui resolver, digo contornar o problema do campo aggregate não somar campos InternalCal.   Como eu postei anteriormente eu tenho um ClientDataSet chamdo cdsItens com os campos Quantidade(fkData), Valor(fkData) e TotalValorItem(fkInternalCalc). Neste cdsItens no enento onCalcFields tem o script TotalValorItem:= Quantidade * Valor e no evento OnChange do campo TotalValorItem adicionei o seguinte script:   procedure TDataModule.cdsItensTotalValorItemChange(Sender: TField);
var
  LocalRegTabela: TBookMark; begin
    // Marca onde o estva o ponteiro da tabela, pois quando eu dou um refresh na tabela cdsTotalGeralItens, por estar ligada a cdsItens pelo DataSetProvider, tambem era atualizada e o ponteiro ia para o primeiro registeo.   LocalRegTabela:= cdsItens.GetBookmark;
  //Atualiza a tabela cdsTotalGeralItens e recalcula o total geral dos itens   dmPrincipal.cdsTotalGeralItens.Refresh;
  // Retorna com o ponteiro onde estava anteriormente na tabela cdsItens   cdsItens.GotoBookmark(LocalRegTabela); 
  //Libera da memória   cdsItens.FreeBookmark(LocalRegTabela);
end;   Adicionei um DataSetProvider e a sua propriedade DataSet liguei ao cdsItens, adicionei outro ClientDataSet chamado cdsTotalGeralItens. Esse CDS mudei a propriedade ProviderName=DataSetProvider criado anteriormente e AggregatesActive=True,  adcionei o campo TotalValorItem(fkData) e criei o campo TotalValor(fkAggregate) com sua propriedades Active= True, Expression = sum(TotalValorItem)e Visible=True.   Outra coisa, estou usando Delphi 2009.   Bom pessoal espero que tenham entendido, e qualquer dúvida é só postar ai.   Abraço...
Responder

Gostei + 0

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

Aceitar