TClientDataSet campo intercalc agregate ???
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.
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
Curtidas 0
Respostas
Allan
04/07/2003
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
Allan
GOSTEI 0
Chaplinux
04/07/2003
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.
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.
GOSTEI 0
Rafael Mattos
04/07/2003
Como vai amigo, estou enfrentando o mesmo problema. Com campos "Data" funciona perfeitamente mas com InternalCalc nem pensar. Você conseguiu resolver esse problema?
GOSTEI 0
Eriley Barbosa
04/07/2003
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
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
GOSTEI 0
Rafael Mattos
04/07/2003
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?
GOSTEI 0
Eriley Barbosa
04/07/2003
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
GOSTEI 0
Rafael Mattos
04/07/2003
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.
GOSTEI 0
Rafael Mattos
04/07/2003
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...
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...
GOSTEI 0