Fórum Problema com campos agregados e reordenação de dados. #366103

12/11/2008

0

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.


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

Vitor Alcantara

Responder

Posts

13/11/2008

Vitor Alcantara

Galera desculpa pelo UP, mais é que estou precisando muito disso.


Responder

Gostei + 0

13/11/2008

Joaoshi

Tive um problema parecido, a solução foi antes de verificar os indices:

ClientDataSet.IndexName := ´´;


Parece que não tem nada a ver né?

Espero ter ajudado.


Responder

Gostei + 0

14/11/2008

Vitor Alcantara

Amigo joaoshi valeu pela tentativa mais infelizmente a sua idéia não surtiu o resultado esperado. Mais obrigado assim mesmo.


Responder

Gostei + 0

14/11/2008

Vitor Alcantara

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


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?


Responder

Gostei + 0

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

Aceitar