sábado, 1 de outubro de 2011

Conexão com SGDBS Utilizando DBExpress – Parte 3


Conexão com SGDBS Utilizando DBExpress – Parte 3

Salve Galera apos muito tempo de espera estou de volta para continuar o artigo e passar algumas opções que o ClientDataSet nos trás.
Para visualizar o Artigo Anterior acesse:

http://bragatec.blogspot.com/2009/12/conexao-com-sgdbs-utilizando-dbexpress.html
Iniciaremos com a criação de index de memoria que otimização a ordenação e a localização.
Declaramos a procedure sendo passados como parametro o ClientDataSet que queremos criar o Index o Grid e a Coluna detalhes nos comentarios.

procedure TFRMDemoDBExpress.CdsSetOrderDBgrig(var CDS: TClientDataSet;
var DBG: TDBGrid; Column: TColumn);
const
idxDefault = 'DEFAULT_ORDER';
var
strColumn : string;
i : integer;
bolUsed : boolean;
idOptions : TIndexOptions;
begin
strColumn := idxDefault;

//Verificar se é possivel criar index para o tipo de dados da Coluna Solicitadas
if Column.Field.FieldKind in [fkCalculated, fkLookup, fkAggregate] then
Exit;

if Column.Field.DataType in [ftBlob, ftMemo] then
Exit;

//Mudar a Cor e Fonte do Titulo da Coluna que está sendo Feita a Ordenação para melhor visualização do Usuario
for i := 0 to DBG.Columns.Count - 1 do
begin
DBG.Columns[i].Title.Font.Color := clBlack;
end;

DBG.Columns[Column.Index].Title.Font.Color := clRed;

//Verificar se o Index já está sendo utilizado
bolUsed := (Column.Field.FieldName = CDS.IndexName);

//Criação do Index
CDS.IndexDefs.Update; //Alterar Index Existente
//Percorrer os index para inversão da ordenação
for i := 0 to CDS.IndexDefs.Count - 1 do
begin
if CDS.IndexDefs.Items[i].Name = Column.Field.FieldName then
begin
strColumn := Column.Field.FieldName;
case (CDS.IndexDefs.Items[i].Options = [ixDescending]) of
True : idOptions := [];//Ascendente
False : idOptions := [ixDescending]; //Decrescente
end;
end;
end;

//caso o Index já estiver sendo utilizado ou for o Index Padrão Destruir da Memoria
if (strColumn = idxDefault) or (bolUsed) then
begin
if bolUsed then
CDS.DeleteIndex(Column.Field.FieldName);//Deletar Index da memoria
try
//Criar o Index na Memoria
CDS.AddIndex(Column.Field.FieldName,
Column.Field.FieldName,
idOptions,
'',
'',
0);
strColumn := Column.Field.FieldName;
except
if bolUsed then
strColumn := idxDefault;
end;
end;

//Aplicar o Index ao ClientDataSet
try
CDS.IndexName := strColumn;
except
CDS.IndexName := idxDefault;
end;
end;
apos declararmos a procude basta apenas no Evento OnTitleClick adicionar a chamada como abaixo

CdsSetOrderDBgrig(CDSFirebird,dbgFirebird,Column);

Adicione os Seguintes componentes na Applicação um Edit, ComboBOX e um Button

Para realizarmos a pesquisa utilizando Index iremos colocar em um ComboBox todos os campos do ClientDateSet para isso no afteropen colocaremos a sequinte linha DataSet.GetFieldNames(eCampo.Items); onde eCampo é nosso Combo.

No OnClick do Botão iremos colocar da seguinte forma.

procedure TFRMDemoDBExpress.BitBtn1Click(Sender: TObject);
var
i : Integer;
begin
inherited;
//Realizar a Criação do Index Da Coluna que iremos realizar a Pesquisa
CDSFirebird.IndexDefs.Update;
for i := 0 to CDSFirebird.IndexDefs.Count - 1 do
begin
if CDSFirebird.IndexDefs.Items[i].Name = eCampo.Text then
begin
CDSFirebird.DeleteIndex(eCampo.Text);
end;
end;

//Atribuir Cor e Fonte ao Titulo do Grid para Facilitar a Identificação do usuario a ordenação que está sendo utilizada
for i := 0 to dbgFirebird.Columns.Count - 1 do
begin
if dbgFirebird.Columns[i].Field.FieldName = eCampo.Text then
dbgFirebird.Columns[i].Title.Font.Color := clRed
else
dbgFirebird.Columns[i].Title.Font.Color := clBlack;;
end;

CDSFirebird.AddIndex(eCampo.Text,
eCampo.Text,
[],
'',
'',
0);
CDSFirebird.IndexName := eCampo.Text;

//Atribuir ao CDS o campo e conteudo a ser pesquisado
CDSFirebird.SetKey;
CDSFirebird.FieldByName(eCampo.Text).AsString := ePesquisa.Text;

//Ir para o Registro que foi Filtrado anteriormente
if not CDSFirebird.GotoKey then
ShowMessage('Record not found');
end;

Conclusão:
Nessa nossa Terceira parte vimos como realizar ordenação por indice de memoria e Filtro em memora com utilização de indice para melhor performace.
Espero que todos aproveitem o conteudo divulgado e em caso de duvidas estou a disposição para ajudar pelo e-mail bragaped@gmail.com.