Quick Tips: Ordenação no DBGrid – Parte 2

 

Nesta quick tip veremos como fazermos a ordenação crescente e decrescente na DBGrid quando o usuário clicar no título da coluna.

 

Na quick anterior nós vimos como ordenar uma coluna de forma crescente. Nesta veremos como fazer esta ordenação de forma decrescente. Toda vez que o usuário clicar na mesma coluna para ordenar, nós iremos inverter o tipo de ordenação, por exemplo, temos a grid ordenada pela coluna FIRST_NAME de forma crescente, ao clicarmos nesta coluna a ordenação passará a ser decrescente, se clicarmos novamente, voltará a ser crescente.

 

Para que isso seja possível, precisaremos armazenar qual a coluna ordenada anteriormente, para sabermos se a coluna que está sendo ordenada no momento é a mesma ou não. Para isso vamos declarar uma variável chamada OldColumn no escopo privado do formulário.

 

  Private

    OldColumn:TColumn;

 

Após isso, vamos alterar o nosso código do TitleClick do DBGrid para que fique da seguinte forma:

 

procedure TForm1.DBGridPrincipalTitleClick(Column: TColumn);

var

  OrdenaDescAnt:Boolean;

  Idx:TIndexDef;

Begin

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

     Abort;

 

  TClientDataSet(Column.Grid.DataSource.DataSet).IndexDefs.update;

 

  //se tiver coluna anterior

  if Assigned(OldColumn) then

  begin

    //Verifica se o índice atual é descendente

    OrdenaDescAnt := (ixDescending in TClientDataSet(OldColumn.Grid.DataSource.DataSet).IndexDefs.Find(OldColumn.Field.FieldName).Options);

    //Remove index existente

    TClientDataSet(OldColumn.Grid.DataSource.DataSet).DeleteIndex(OldColumn.Field.FieldName);

  end;

 

  //Verifica se o index da lista default do dataSet

  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;

 

  //Se estava configurado para ordem descendente ou

  //se clicou em uma coluna diferente da anterior

  //Então ordena de forma ascendente

  if (OrdenaDescAnt)or(OldColumn <> Column)then

  begin

     //se index nao estiver criado entao adiciona, senao remove configuração descendente

     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

     //se index nao estiver criado entao adiciona, senao adiciona configuração descendente

     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;

 

  OldColumn := Column;

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

end;

 

É isso aí pessoal, vou ficando por aqui.

Fiquem a vontade para criticar, tirar dúvidas e sugerir novos temas.
Abraço.

Ricardo Coelho