Fórum Ordenar ClientDataset (IndexFieldNames) em ordem decrescente #254981
18/10/2004
0
...dá pra indexar o ClienteDataset pela propriedade IndexFieldNames em ordem decrescente?
eu quero ordenar dinamicamente, por isso estou tentando evitar o ORDER BY
Emerson Nascimento
Curtir tópico
+ 0Post mais votado
12/10/2016
if FDQuery1.IndexFieldNames = Column.FieldName then
FDQuery1.IndexFieldNames := Column.FieldName + ':D'
else
FDQuery1.IndexFieldNames := Column.FieldName;
Marcelo Belanga
Gostei + 4
Mais Posts
18/10/2004
Osocram
e p mudar p descrescente
adiciona no campo idOption do index a opcao ixDescending
Gostei + 1
19/10/2004
Emerson Nascimento
tenho um clientdataset q recebe instruções dinamicamente, conforme a escolha do usuário. ele escolhe tabela, os campos que deseja mostrar e como quer agrupar. depois, na grade que exibe esses valores, ele pode clicar no título de uma coluna e a ordenação será pelo campo dessa coluna cujo título foi clicado. se por acaso for dado um novo clique num título cujo campo é o indice ativo, será invertida a ordem (assim como acontece no windows explorer).
por que não utilizar o IndexName: não quero ficar criando índices.
utilizo apenas a propriedade [b:49ed744fc1]IndexFieldNames[/b:49ed744fc1]. tem outra forma?
Gostei + 1
19/10/2004
Osocram
if Column.Field.FieldKind = fkData then begin
CDS.IndexFieldNames := Column.DisplayName;
dae vc faz uma verificacao se for a mesma coluna vc adiciona o ixDescending
Gostei + 1
20/10/2004
Emerson Nascimento
onde coloco o ixDescending?
Gostei + 0
20/10/2004
Ananias Duarte
1) se não intiver usando o ClienteDataSet, como é que faz isso;
2) onde é que é colocado o código que vc citou?
obrigado
emerson.en
Achei legal essa técnica que vc está implementando no DBGrid. Por favor, pode repassá-la para mim. Sou inciante no Delphi(6) e goataria de colocar essa ´facilidade´ em todos os DBGrids do sistema que estou ´tantando´ desenvolver.
abraços
Gostei + 1
07/02/2006
Macario
Eu tambem estou quem esta necessidade.
Grato. :arrow:
Gostei + 0
07/02/2006
Emerson Nascimento
eu fiz assim: ao clicar na grade, vejo se o campo no IndexFieldNames é o mesmo campo cuja coluna foi clicada: - se não é o mesmo campo, altero o IndexFieldNames para o campo clicado - se é o mesmo campo (isso indica que a ordenação será invertida)... verifico se existe o índice "CAMPO"_INV: - se não encontrar esse índice, o crio com a opção ixDescending; depois altero a propriedade IndexName para "CAMPO"_INV
caso eu não tenha conseguido me explicar bem, eu posso te passar um exemplo...
Gostei + 1
08/02/2006
Macario
Então relamente com IndexFieldName não é possivel (tá uma sugestão pra Borland, ou até mesmo pra quem goste de criar seus proprios Procedimentos).
No caso, como você esta tratando quando ja criou um indice?
por exmeplo, foi criado pra coluna1, depois pra coluna2. Voce libera e cria no novo ou vai deixando?
Por favor, poste seu exemplo.
8)
Gostei + 1
08/02/2006
Emerson Nascimento
procedure TForm1.DBGrid1TitleClick(Column: TColumn); var indice: string; existe: boolean; clientdataset_idx: tclientdataset; begin clientdataset_idx := TClientDataset(Column.Grid.DataSource.DataSet); if clientdataset_idx.IndexFieldNames = Column.FieldName then begin indice := AnsiUpperCase(Column.FieldName+´_INV´); try clientdataset_idx.IndexDefs.Find(indice); existe := true; except existe := false; end; if not existe then with clientdataset_idx.IndexDefs.AddIndexDef do begin Name := indice; Fields := Column.FieldName; Options := [ixDescending]; end; clientdataset_idx.IndexName := indice; end else clientdataset_idx.IndexFieldNames := Column.FieldName; end;
- note que essa rotina não altera a posição do ponteiro de registros. caso ache necessário, adicione a linha [i:b6a810ba7d]clientdataset_idx.first[/i:b6a810ba7d] ao final da rotina.
- note também que NÃO se deve liberar o clientdataset_idx da memória, pois ele é uma referência ao objeto real. se você liberá-lo, estará destruindo o clientdataset real.
- note ainda que esse(s) índice(s) será(ão) perdido(s) quando o clientdataset for fechado, pois eles estão somente em memória.
Gostei + 1
08/02/2006
Macario
Gostei + 1
12/04/2015
Paulo Andrade
procedure TfFuncionarios.DBGrid1TitleClick(Column: TColumn);
var
indice: string;
existe: boolean;
cds_idx: TADODataSet;
begin
cds_idx := TADODataSet(Column.Grid.DataSource.DataSet);
if cds_idx.IndexFieldNames = Column.FieldName then
begin
indice := AnsiUpperCase(Column.FieldName+' DESC');
try
cds_idx.IndexDefs.Find(indice);
existe := true;
except
existe := false;
end;
if not existe then
with cds_idx.IndexDefs.AddIndexDef do
begin
Name := indice;
Fields := Column.FieldName;
Options := [ixDescending];
end;
cds_idx.IndexFieldNames := indice;
end else
cds_idx.IndexFieldNames := Column.FieldName;
Ordenacao := Column.FieldName;
end;Gostei + 1
12/04/2015
Emerson Nascimento
Foi dito claramente que a rotina foi desenvolvida para ClientDatasets. Para os demais datasets, basta efetuar as alterações necessárias como, no seu caso, a troca do TClientDataset pelo TADODataSet.
Gostei + 1
13/04/2015
Paulo Andrade
No meu caso usei TADODataSet mesmo e banco SQL Server.
Foi dito claramente que a rotina foi desenvolvida para ClientDatasets. Para os demais datasets, basta efetuar as alterações necessárias como, no seu caso, a troca do TClientDataset pelo TADODataSet.
Gostei + 1
Clique aqui para fazer login e interagir na Comunidade :)