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.