sexta-feira, 1 de outubro de 2010

Ordenar um ClientDataSet em tempo de execução.

Pra isso vamos precisar conferir se as units DB e DBClient estão em nossa uses.

Agora vamos declarar a seguinte Procedure:

procedure OrdenarDataSet(var Tabela: TClientDataSet; Campos: String; Tipo: TIndexOptions);

Sendo que Tabela vai armazenar o ClientDataSet que precisa ser ordenado, Campos, que obviamente são os campos que serão ordenados e finalmente Tipo, que indica o tipo de ordenação e outros tipos de tratamento especiais, no caso do tipo, o mais comum é usar ou não o tipo ixDescending.





Ctrl + Shift + C em cima de nossa Procedure para criarmos seu corpo e vamos adicionar o seguinte código:

procedure TDM_Principal.OrdenarDataSet(var Tabela: TClientDataSet; Campos: String; Tipo: TIndexOptions);
var
    i: Integer;
    Nome: String;
begin
    //Fazer um loop nos index já criados
    for i := 0 to Tabela.IndexDefs.Count - 1 do
    begin
        //Verificar se já existe um index com os dados que pedimos
        if (Tabela.IndexDefs.Items[i].Fields = Campos) and (Tabela.IndexDefs.Items[i].Options = Tipo) then
        begin
            //Se sim, setar o index no DataSet e sair da procedure
            Tabela.IndexName := Tabela.IndexDefs.Items[i].Name;
            exit;
        end;
    end;


    //Se não existem index criados ou nenhum deles é o que foi requisitado..


    //Criar um nome identificador do index
    Nome := 'Index' + IntToStr(Tabela.IndexDefs.Count + 1);


    //Criar o index
    with Tabela.IndexDefs.AddIndexDef do
    begin
        Name := Nome;
        Fields := Campos;
        Options := Tipo;
    end;


    //Setá-lo no ClientDataSet
    Tabela.IndexName := Nome;
end;

Agora para utilizar é simples.

Ordernar por data do mais antigo para o mais novo:

DM_Principal.OrdenarDataSet(DM_Principal.ClientDataSet, 'DATA', []);

Ordenar por data do mais novo para o mais antigo:

DM_Principal.OrdenarDataSet(DM_Principal.ClientDataSet, 'DATA', [ixDescending]);

Ordenar por nome em ordem alfabética

DM_Principal.OrdenarDataSet(DM_Principal.ClientDataSet, 'NOME', []);

Nenhum comentário:

Postar um comentário