Fórum erro de index no dbgrid indexando #13926

12/01/2010

0

ola estou com o seguinte erro tenho uma rotina de index orderm o dbgrid  ela me da o seguinte erro index does not exist   vou passar a funca e o erro de tela   a rotina de index e esta   procedure Tctpc0501.DBGrid1TitleClick(Column: TColumn);
var
  IndexDef      : TIndexDef;
  intIndex      : integer;
  strIndexName  : string;
  blnDescending : boolean;
begin
  if Assigned(OldColumn) then
  OldColumn.Title.Color := DBGrid1.FixedColor;
  Column.Title.Color    := $00408080;
  OldColumn := Column;
  blnDescending := False;
  strIndexName  := 'TEMP' + Column.Field.FieldName;
  intIndex := dtm_forn.cdsfornecedor.IndexDefs.IndexOf(strIndexName);
  //Recupera o numero do índice através do nome
  if dtm_forn.cdsfornecedor.IndexName = strIndexName then
  begin
    // Se o indice escolhido já é o ativo
    // muda pra descendente
    IndexDef := dtm_forn.cdsfornecedor.IndexDefs.Find(strIndexName);
    //método Find: Retorna
    //o nome do indice ativo
    blnDescending:=IndexDef.DescFields = '';
    //Verifica se o indexDef.DescFields do índice é nulo
  end;   if intIndex >= 0 then
  begin
    // Se existir um índice para
    //este campo, deletá-lo
    dtm_forn.cdsfornecedor.DeleteIndex(strIndexName);
    dtm_forn.cdsfornecedor.IndexDefs.Delete(intIndex);
  end;
  e o erro de tela  
Jorge Barbosa

Jorge Barbosa

Responder

Posts

12/01/2010

Wesley Yamazack

Olá amigo,
  O que você esta querendo fazer é incluir um index que não existe no seu DataSet. Veja se este exemplo não lhe ajuda

Exemplo :


procedure TFrmCiente.DBPadraoTitleClick(Column: TColumn);
var
I: word;
begin
  for I:=0 to DBGrid1.Columns.Count-1 do
  begin
    TDBGrid(Column.Grid).Columns.Items[I].Title.Caption:=
    Trim(AnsiReplaceStr(TDBGrid(Column.Grid).Columns.Items[I].Title.Caption,'>>',''));
  end;
  Column.Title.Caption:= Column.Title.Caption + ' >>';
  TClientDataSet (TDBGrid(Column.Grid).DataSource.DataSet).IndexFieldNames := Column.FieldName; { Index que você clicou, ou seja a coluna que você clicou possui um FieldName, e por ele que você ordena }
end;

Estou a disposição. Para qualquer dúvida


Um abraço

Wesley Y
Responder

Gostei + 0

12/01/2010

Jorge Barbosa

oi amigo     sua funcao e legal mas so falto inverter de     coloca em acedente   e descendente     assuim realmente ela vai me ajudar   se vc repar o que eu te passei faz isso   ser que vc poderia me   orientar como fazer   nesta funcao
Responder

Gostei + 0

12/01/2010

Wesley Yamazack

Olá amigo, segue abaixo o código para asc e desc.


procedure TFrmUF.DBGrid1TitleClick(Column: TColumn);
var
  OrdenaDescAnt:Boolean;

Begin
  If Not TClientDataSet(Column.Grid.DataSource.DataSet).Active Then
     Abort;

  // O índice já está em uso
  TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.update;
   if (Column.Field.FieldName=TClientDataSet(Column.Grid.DataSource.DataSet).IndexName) then
  begin
    OrdenaDescAnt := (ixDescending in TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.Find(Column.Field.FieldName).Options);
    TClientDataSet(Column.Grid.DataSource.DataSet).DeleteIndex(Column.Field.FieldName);
  end;

  if OrdenaDescAnt then
     TClientDataSet(Column.Grid.DataSource.DataSet).AddIndex(Column.Field.FieldName, Column.Field.FieldName, [], '', '', 0)
  else
     TClientDataSet(Column.Grid.DataSource.DataSet).AddIndex(Column.Field.FieldName, Column.Field.FieldName, [ixdescending], '', '', 0);

  TClientDataSet(Column.Grid.DataSource.DataSet).IndexName := Column.Field.FieldName;

end;

Veja se resolve seu problema. Lembrando que funciona para qualquer DBGrid. Pois não tem dataset engessado

Um abraço

Wesley Y
Responder

Gostei + 0

12/01/2010

Jorge Barbosa

esta me dando agora o seguinte erro   name not unique in  this context.   quando se click em varias colunas    
Responder

Gostei + 0

13/01/2010

Wesley Yamazack

Olá amigo,
 segue abaixo a alteração.

procedure TFrmUF.DBGrid1TitleClick(Column: TColumn);
var
  OrdenaDescAnt:Boolean;
  Idx:TIndexDef;
Begin
  If Not TClientDataSet(Column.Grid.DataSource.DataSet).Active Then
     Abort;

  // O índice já está em uso
  TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.update;
  if (Column.Field.FieldName=TClientDataSet(Column.Grid.DataSource.DataSet).IndexName) then
  begin
    OrdenaDescAnt := (ixDescending in TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.Find(Column.Field.FieldName).Options);
    TClientDataSet(Column.Grid.DataSource.DataSet).DeleteIndex(Column.Field.FieldName);
  end;

  if(TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.IndexOf(Column.Field.FieldName)) > -1 then
    Idx := TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.Find(Column.Field.FieldName)
  else
    idx := nil;

  if OrdenaDescAnt then
  begin
     if(Idx = nil)then
        TClientDataSet(Column.Grid.DataSource.DataSet).AddIndex(Column.Field.FieldName, Column.Field.FieldName, [], '', '', 0)
     else
       idx.Options := idx.Options - [ixdescending];
  end
  else
  begin
     if(Idx = nil)then
        TClientDataSet(Column.Grid.DataSource.DataSet).AddIndex(Column.Field.FieldName, Column.Field.FieldName, [ixdescending], '', '', 0)
     else
       idx.Options := idx.Options + [ixdescending];
  end;

  TClientDataSet(Column.Grid.DataSource.DataSet).IndexName := Column.Field.FieldName;
end;


Um abraço

Wesley Y
Responder

Gostei + 0

13/01/2010

Jorge Barbosa

oi Wesley  to testando mas parece que resolveu o problema   seria pedir muito se vc me passa so     a linha para mudar de cor a columa   para saber qual coluna esta     ordernando      obrigado      
Responder

Gostei + 0

13/01/2010

Jorge Barbosa

oi Wesley  to testando mas parece que resolveu o problema   seria pedir muito se vc me passa so     a linha para mudar de cor a columa   para saber qual coluna esta     ordernando      obrigado      
Responder

Gostei + 0

13/01/2010

Wesley Yamazack

Olá amigo,
  Infelizmente não poderei responder esta sua duvida neste chamado, pedirei que abra um novo chamado, e pode fazer solicitação para que eu responda o próximo chamado. OK ?
   Pois para cada dúvida um chamado, tudo bem ?

Um abraço

Wesley Y
Responder

Gostei + 0

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

Aceitar