Explorando índices do ClientDataSet

ClientDataSet - Índices

 

Nesta matéria veremos como explorar índices no ClientDataSet, você deve estar imaginando e por quê eles seriam mesmo necessários quando as pesquisas seqüeciais através do Locate são tão rápidas. Em alguns casos os índices são realmente necessários, por exemplo: Um uma aplicação onde o uso do Locate é fundamental, quando se utiliza índices o ganho de desempenho é visível.

 

Dica: Confira na edição 39 da Revista ClubeDelphi a matéria Primeiras Pesquisas, que mostra as técnicas de busca dísponíveis no ClentDataSet. 

Criando Índices

Como na definição de campo, os índices podem ser criados em tempo de projeto ou no tempo de execução. Diferentemente das definições de campo, que são usualmente criadas em tempo de projeto, você poderia criar e destruir índices em tempo de execução.

Criando índices em tempo de projeto

Para criar um índice em tempo de projeto, selecione o componente ClientDataSet, localizado em um Form ou DataModule. No Object Inspector, dê um duplo-clique na propriedade IndexDefs. Aparecerá o editor de índices. Veja na tabela 1, propriedades do índice.

Propriedade

Descrição

Name

Esta propriedade respresenta o nome do índice.

Fields

Lista de campos, delimitada por ponto-e-vírgula que forma o índice.

DescFields

Uma lista dos campos contidos na propriedade Fields, a qual deveria ser indexada em ordem descendente. Por exemplo: para classificar em ordem ascendente por nome e depois descendente por salário, atribua 'Nome;Salario' a Fields e 'Salario' a DescFields.

CaseInsFields

Uma lista de campos contidos na propriedade Fields que deveria ser indexada de uma maneira não sensível a casos.

GroupingLevel

Usado para agregação.

Options

Atribui opções adicionais aos índices. Veja na tabela 2.

Tabela 1 - Propriedades do Índice no ClientDataSet.

 

Dica: Confira na edição 39 da Revista ClubeDelphi a matéria Primeiras Pesquisas, que mostra as técnicas de busca dísponíveis no ClentDataSet. 

Opção

Descrição

IxPrimary

O índice é o principal do DataSet

IxUnique

O índice é único.

IxDescending

O índice está em ordem descendente.

IxCaseinsensitive

O índice não é sensível a casos.

GroupingLevel

Usado para agregação.

Tabela 2 - Opções do índice no ClientDataSet.

Criando e excluindo índices em run-time

Ao contrário da definição de campo (normalmente criada em design-time), as definições de índices são algo frequentemente criadas em run-time. Porque índices podem ser criados e destruídos fácil e rapidamente. Assim, se você precisa de um índice apenas por um período pequeno de tempo, a criação e destruíção de índices à medida das necessidadeds ajuda a preservar memória.

Para criar um índice, utilize o método AddIndex do clientdataset. Ele usa três parâmetros obrigatórios, bem como três opcionais, e é definido assim:

 

Procedure AddIndex (const Name, Fields: String; Options: TindexOptions;

Const DesFields: string := ‘’; const CaseInsFields: string := ‘’;

Const GroupingLevel: Integer = 0; 

 

Os parâmetros correspondem às propriedades TindexDef relacionadas na tabela 1. O código abaixo mostra como criar um índice pelos último e primeiro nomes:

 

ClientDataSet1.Addindex(‘IndNome’, Last;First, ,[ixUnique]);

 

Quando você decidir que não precisa mais do índice, pode excluí-lo usando o DeleteIndex. O DeleteIndex usa um único parâmetro: nome do índice que será excluído. O código abaixo mostra como excluir o índice criado anteriormente:

 

ClientDataSet1.DeleteIndex(‘IndNome’);

Usando índices

A criação de um indice não executa nenhuma classificação do DataSet. Ele simplesmente cria um índice disponivel para os dados. Depois que você cria um índice, acaba tornando-o ativo pela atribuição da propriedade IndexName do dataset, como:

 

ClientDataSet.IndexName := ‘IndNome’;

 

Se você tiver dois ou mais índices definidos em um dataset, , pode mudar rapidamente para frente e para trás alterando o valor da propriedade IndexName. Se desejar descontinuar o uso um índice e reverter à ordem de registros original, pode atribuir uma string vazia a propriedade IndexName, tal como ilustrado nos códigos abaixo:

 

// classifica por nome

ClientDataSet1.IndexName := ‘IndNome’;

 

// classifica por salário

ClientDataSet1.IndexName := ‘IndSalario’;

 

// classificação padrão

ClientDataSet1.IndexName := ‘’;

 

Existe um segunda maneira de especificar índices durante a execução. Em vez de criar um índice e atribuir a propriedade IndexFieldNames. O IndexFieldNames aceita um lista de campos delimitada por pontos-e-vígulas para a indexação. Veja abaixo como usá-lo:

ClientDataSet1.IndexFieldNames := ‘Unome;Pnome’;

 

Recuperando informações de um índice

Existem dois métodos para a recuperação de informações de índice em unm dataset, vejamos a seguir:

GetIndexNames

Este método é o mais simples para recuperar informações de índices. Ele utiliza um único parâmetro, um objeto Tstrings, no qual armazena os nomes de índice resultantes. O trecho de código abaixo mostra como exibir num ListBox os nomes de todos os índices definidos para um dataset:

 

ClientDataSet1.GetIndexNames(Listbox1.Items);

 

TIndexDefs

Se você desejar obter informações mais detalhadas sobre um índice, pode ir diretamente à fonte: TindexDefs. O TindexDefs contém uma lista de todos os índices com todos as informações associadas a cada um (como os campos que formam o índices, etc.). No código abaixo vemos como acessar informações sobre índices diretamente no TindexDefs.

 

var

  Index: Integer;

  IndexDef: TindexDefs;

begin

  ClientDataSet1.IndexDefs.Update;

  For Index:=0 to ClientDataSet1Index.IndexDefs.Count – 1 do

  begin

    IndexDef := ClientDataSet1.IndexDefs[Index];

    Listbox1.Items.Add(IndexDef.Name);

  end;

end;

 

Note a chamada ao IndexDefs.Update antes do código que faz loop por meio da definição de índices. Essa chamada é necessário para grantir que a lista interna IndexDefs seja atualizada. Sem isso, é possível que o IndexDefs pudesse não conter nenhuma informação

Este artigo procurou esclarecer algumas dúvidas que os desenvovedores possuem em relação a criação de índices em datasets.