Como ordenar um ClientDataSet de forma decrescente?
Fala galera do Show Delphi, tudo beleza?
Ordenar os dados de um DataSet sem ser via SQL é necessário em várias ocasiões, tanto para facilitar a localização de registros por usuários coo minimizar a necessidade de consultas ao banco de dados.
Certo e como fazer?
Para ordenar de forma crescente é relativamente fácil, sendo somente necessário colocar o campo na propriedade IndexFieldNames do ClientDataSet.
Porém para ordenar de forma decrescente é um pouco mais complexo, sendo necessário o uso do IndexDefs.
Os IndexDefs Índices persistentes são criados no IndexDefs de seu DataSet. Assim você pode, para cada índice, definir uma série de propriedades. São utilizados da mesma forma que os índices temporários, bastando utilizar o nome dado ao índice persistente quando os mesmos forem criados em design-time.
Para adicionar um índice persistente podemos fazer conforme o código abaixo:
1
2
3
4
5
6
| with ClientDataSet1.IndexDefs.AddIndexDef do
begin
Name := vIndice;
Fields := Column.FieldName;
Options := [ixDescending];
end; |
with ClientDataSet1.IndexDefs.AddIndexDef do
begin
Name := vIndice;
Fields := Column.FieldName;
Options := [ixDescending];
end;
Certo, mas parece complicado, tem como facilitar?
Claro! Para simplificar o processo, foi desenvolvida uma rotina genérica, para a ordenação do ClientDataSet pelo clique da coluna em um DBGrid.
Neste caso, no primeiro clique ordena de forma crescente e no segundo clique ordena de forma decrescente.
Veja o exemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
vIndice: string;
vExiste: boolean;
begin
if ClientDataSet1.IndexFieldNames = Column.FieldName then
begin
vIndice := AnsiUpperCase(Column.FieldName + '_INV');
try
ClientDataSet1.IndexDefs.Find(vIndice);
vExiste := True;
except
vExiste := False;
end;
if not (vExiste) then
begin
with ClientDataSet1.IndexDefs.AddIndexDef do
begin
Name := vIndice;
Fields := Column.FieldName;
Options := [ixDescending];
end;
end;
ClientDataSet1.IndexName := vIndice;
end
else
ClientDataSet1.IndexFieldNames := Column.FieldName;
end; |
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
vIndice: string;
vExiste: boolean;
begin
if ClientDataSet1.IndexFieldNames = Column.FieldName then
begin
vIndice := AnsiUpperCase(Column.FieldName + '_INV');
try
ClientDataSet1.IndexDefs.Find(vIndice);
vExiste := True;
except
vExiste := False;
end;
if not (vExiste) then
begin
with ClientDataSet1.IndexDefs.AddIndexDef do
begin
Name := vIndice;
Fields := Column.FieldName;
Options := [ixDescending];
end;
end;
ClientDataSet1.IndexName := vIndice;
end
else
ClientDataSet1.IndexFieldNames := Column.FieldName;
end;
Veja que é esta linha: Options := [ixDescending];
que faz a ordenação inversa.
Isso é muito útil, por exemplo, para fazer ordenações crescentes e decrescentes automaticamente em seus DBGrids.
Dúvidas ou sugestões, deixe nos comentários do post.
Um abraço e até o próximo post. Valeu!
Fonte
Baseado no post: https://pt.stackoverflow.com/questions/6075/ordena%C3%A7%C3%A3o-crescente-e-decrecente-no-clientdataset
-
Giovani Da Cruz
-
15.708 views
- 0 comentários
- 16 de setembro de 2015
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo