Problema com campos agregados e reordenação de dados.
Na minha aplicação utilizo os seguintes componentes de acesso : ADODataSet + DataSetProvider + ClientDataSet.
Dentro de alguns de meus clientDataSets utilizo de campos agregados.
Até ai tudo bem, eles mostram os dados certos até a hora que mando reordenar os ClientDatasets.
Para reordenar o ClientDataSet utilizo o evento OnTitleClick dos meus dbGrids com a seguinte rotina.
Quando faço essa reordenação os totais somados nos campos agregados ou duplicam ou zeram, somente voltando ao normal quando do um close e um open no meu ClientDataSet.
Alguém saberia me explicar um método de contornar isso?
Agradeço desde já atenciosamente Vitor Araújo Alcântara
Dentro de alguns de meus clientDataSets utilizo de campos agregados.
Até ai tudo bem, eles mostram os dados certos até a hora que mando reordenar os ClientDatasets.
Para reordenar o ClientDataSet utilizo o evento OnTitleClick dos meus dbGrids com a seguinte rotina.
procedure tFrm.DbGridTitleClick(Column: TColumn); var indice: string; existe: boolean; clientdataset_idx: tclientdataset; begin if Column.Grid.DataSource.DataSet is TClientDataSet then begin clientdataset_idx := TClientDataset(Column.Grid.DataSource.DataSet); if clientdataset_idx.IndexFieldNames = Column.FieldName then begin indice := AnsiUpperCase(Column.FieldName+´_INV´); try clientdataset_idx.IndexDefs.Find(indice); existe := true; except existe := false; end; if not existe then with clientdataset_idx.IndexDefs.AddIndexDef do begin Name := indice; Fields := Column.FieldName; Options := [ixDescending]; end; clientdataset_idx.IndexName := indice; end else clientdataset_idx.IndexFieldNames := Column.FieldName; end; end;
Quando faço essa reordenação os totais somados nos campos agregados ou duplicam ou zeram, somente voltando ao normal quando do um close e um open no meu ClientDataSet.
Alguém saberia me explicar um método de contornar isso?
Agradeço desde já atenciosamente Vitor Araújo Alcântara
Vitor Alcantara
Curtidas 0
Respostas
Vitor Alcantara
12/11/2008
Galera desculpa pelo UP, mais é que estou precisando muito disso.
GOSTEI 0
Joaoshi
12/11/2008
Tive um problema parecido, a solução foi antes de verificar os indices:
Parece que não tem nada a ver né?
Espero ter ajudado.
ClientDataSet.IndexName := ´´;
Parece que não tem nada a ver né?
Espero ter ajudado.
GOSTEI 0
Vitor Alcantara
12/11/2008
Amigo joaoshi valeu pela tentativa mais infelizmente a sua idéia não surtiu o resultado esperado. Mais obrigado assim mesmo.
GOSTEI 0
Vitor Alcantara
12/11/2008
Estou quase conseguindo resolver.
Garimpando pela internet achei esse tópico [url]http://qc.codegear.com/wc/qcmain.aspx?d=1712[/url] da onde retirei esse procedimento
Só que após reindexar o meu clientdataset eu disparo o evento ResetAggFieldsAndAggs(MeuDataSet), as vezes ele mostra o resultado no meu DbText e as vezes ele oculta.
Pelo menos ele não ta mais dando o valor errado.
Alguém ai teria alguma idéia de como contornar isso?
Garimpando pela internet achei esse tópico [url]http://qc.codegear.com/wc/qcmain.aspx?d=1712[/url] da onde retirei esse procedimento
type TCrackCDS = class(TCustomClientDataSet); procedure ResetAggFieldsAndAggs(CDS:TClientDataSet); var i: integer; Agg: TAggregate; begin // do the AggFields ... for i := 0 to CDS.AggFields.Count - 1 do begin Agg := (CDS.AggFields[i] as TAggregateField).Handle; if (Agg <> nil) and Agg.Active then begin Agg.Active := False; Agg.Active := True; end; end; // do the Aggs ... for i := 0 to CDS.Aggregates.Count - 1 do begin Agg := CDS.Aggregates[i]; if Agg.Active then begin Agg.Active := False; Agg.Active := True; end; end; TCrackCDS(CDS).DataEvent(deRecordChange, 0); end;
Só que após reindexar o meu clientdataset eu disparo o evento ResetAggFieldsAndAggs(MeuDataSet), as vezes ele mostra o resultado no meu DbText e as vezes ele oculta.
Pelo menos ele não ta mais dando o valor errado.
Alguém ai teria alguma idéia de como contornar isso?
GOSTEI 0