Ordenar registros no grid clicando sobre a barra de título.

24/07/2006

0

Pessoal,

Estou usando DBExpress:
SQLDataSet + DataSetProvider + ClientDataSet para acessar o BD (Firebird atualmente).

O que eu queria fazer é o seguinte: ao clicar sobre a barra de título, fazer com que a ordem dos registros fosse alterada. Quando usava IBX conseguia fazer, não se se da melhor forma mas funcionava.... eu editava o SQL e mandava abrir novamente... mas não estou conseguindo fazer isso com esse trio q estou usando...

Uso DataModules com todos os trios de componente e uso um template com o meu form base para dados, onde tenho apenas um dataset ligado ao grid.

Se alguém puder dar uma dica... agradeço.



[]´s


Techsoft

Techsoft

Responder

Post mais votado

22/02/2018

Pessoal, quem quiser ao clicar ordenar Ascendente ou vice-versa clicando no título de uma coluna do DBGRID com uma FDQuery é só fazer:
with NomedaQuery do
begin
if IndexFieldNames = Column.FieldName + ':D' then
IndexFieldNames := Column.FieldName + ':A' // ascendente
else
IndexFieldNames := Column.FieldName + ':D'; // descendente
end;

Irineu Junior

Irineu Junior
Responder

Mais Posts

24/07/2006

Marcelo_mileris

Já que está usando o ClientDataSet vc pode utilizar o evento [b:fd502d20d7]OnTitleClick[/b:fd502d20d7] do DBGrid e usar o seguite codigo:

  ClientDataSet1.IndexFieldNames := Column.FieldName;



Responder

25/07/2006

Techsoft

Obrigado amigo.

Era isso mesmo que eu estava precisando.

[]´s


Responder

27/07/2006

Leitorbinario

Como fazer com IBX?


Responder

27/07/2006

Techsoft

Quando eu usava IBX, eu simplesmente ao clicar no title do grid eu colocava no SQL a cláusula ORDER BY referente ao campo da coluna que eu cliquei.


Responder

27/07/2006

Fabiano Góes

ai pessoal, será que alguem pode postar um codigo de exemplo pra isso:

grato !!!!
Fabiano Góes.


Responder

27/07/2006

Fabiano Góes

ai pessoal, será que alguem pode postar um codigo de exemplo pra isso:

grato !!!!
Fabiano Góes.


Responder

27/07/2006

Techsoft

opa... vou postar como eu fazia.. .pode ser q tenha alguma forma mais prática...

eu criava uma constante com o meu SQL. e quando clicava sobre o barra de título do grid executava o seguinte:

with IBQUERY1 do
begin
  Close;
  SQL.Clear;
  SQL.Add(SQLD); //SQLD ONDE ESTÁ MEU SQL PADRÃO
  SQL.Add(´ORDER BY ´+Column.FieldName);
  Open;
end;


Column eh um parâmetro do evento TitleClick do DBGrid e nele eu tenho o FieldName que está na coluna q estou clicando.

Se for usar o wwDBGrid da InfoPower por exemplo... ai substitui o Column.FieldName por AFieldName ou algo assim... não lembro exatamente,..... Funciona, não sei se é a melhor maneira...


Responder

27/07/2006

Techsoft

opa... vou postar como eu fazia.. .pode ser q tenha alguma forma mais prática...

eu criava uma constante com o meu SQL. e quando clicava sobre o barra de título do grid executava o seguinte:

with IBQUERY1 do
begin
  Close;
  SQL.Clear;
  SQL.Add(SQLD); //SQLD ONDE ESTÁ MEU SQL PADRÃO
  SQL.Add(´ORDER BY ´+Column.FieldName);
  Open;
end;


Column eh um parâmetro do evento TitleClick do DBGrid e nele eu tenho o FieldName que está na coluna q estou clicando.

Se for usar o wwDBGrid da InfoPower por exemplo... ai substitui o Column.FieldName por AFieldName ou algo assim... não lembro exatamente,..... Funciona, não sei se é a melhor maneira...


Responder

28/07/2006

Micheus

Este exemplo eu havia postado em outro forum. É basicamente o que o [b:5239fc933b]techsoft[/b:5239fc933b] postou, apenas com mais uns detalhes que costumo utilizar:
procedure TForm1.FormShow(Sender :TObject);
begin
// força a inicialização pelo campo da primeira coluna
  DBGrid1TitleClick(DBGrid1.Columns[0]);
end;
...
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  Idx :Integer;
begin
// Alteração da query ordenando pelo campo "clicado"
  with DBGrid.DataSource.DataSet as TIBQuery do
  begin;
    Idx := Pos(´ORDER BY ´, UpperCase(SQL.Text));
    if Idx > 0 then
    begin
      SQL.Text := Copy(SQL.Text, 1, IdX -1);
      SQL.Text := SQL.Text +´ORDER BY ´+Column.FieldName;
    end;
    Close;
    Open;
  end;
// restaurando a cor do título
  DBGrid1.Columns[DBGrid1.Tag].Title.Color := clBtnFace;
  DBGrid1.Columns[DBGrid1.Tag].Title.Font.Color := clWindowText;
  DBGrid1.Columns[DBGrid1.Tag].Title.Font.Style := [];
// guarda a coluna selecionada
  DBGrid.Tag := Column.Index;
// alterando a cor do título do campo ordenado
  DBGrid1.Columns[DBGrid1.Tag].Title.Color := $00BE7C7C;
  DBGrid1.Columns[DBGrid1.Tag].Title.Font.Color := clWhite;
  DBGrid1.Columns[DBGrid1.Tag].Title.Font.Style := [fsBold];
end;
Obs: levo em consideração que a cláusula ORDER BY está em uma linha única na propriedade SQL (que é um TString)


Responder

22/08/2006

Cyber

Eu uso uma maneira mais enxuta, só nao sei se vai funcionar no seu tipo de source, essa maneira ordena Crescente e Decrescente quando clicada no titulo da DBGrid1!

Usando AdoQuery

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if (DM.ADOQuery1.Sort<>column.FieldName+´ ASC´) then
DM.ADOQuery1.Sort:=column.FieldName+´ ASC´
else
DM.ADOQuery1.sort:=column.fieldname+´ DESC´;
end;


Caso funcione diga ai para o pessoal!


Responder

09/11/2007

Isoares

Amigos,
Estou iniciando em programação. Utilizo Delphi 2005. Conexão a BD com IBX.
Gostaria de saber se há uma maneira de atualizar na tela (apenas atualizar e não editar, incluir ou excluir) os registros num dataset cujos dados são apresentados em DBEdit´s e tambem se é possível fazer isso num DBGrid, ambos SEM executar as operações Close/Open, uma vez que salvo engano, isso gera transito desnecessário na rede.
Os componentes atualmente utilizados são:
DataModule com IBDataBase, ligado a InterBase 1.0 e IBTransaction ligado ao IBDataBase.
No form, utilizo: IBDataSet ligado ao IBDataBase e ao IBTansaction;
DataSource, ligado ao IBDataSet.
Já li a respeito do ClientDataSet, mas ainda nao me sinto preparado o suficiente para utilizá-lo. Tenho que ler mais a respeito. Portanto, caso alguém possa me ajudar, com os componentes atuais, agradeço.


Responder

09/11/2007

Pestana_

opa... vou postar como eu fazia.. .pode ser q tenha alguma forma mais prática... eu criava uma constante com o meu SQL. e quando clicava sobre o barra de título do grid executava o seguinte:
with IBQUERY1 do
begin
  Close;
  SQL.Clear;
  SQL.Add(SQLD); //SQLD ONDE ESTÁ MEU SQL PADRÃO
  SQL.Add(´ORDER BY ´+Column.FieldName);
  Open;
end;
Column eh um parâmetro do evento TitleClick do DBGrid e nele eu tenho o FieldName que está na coluna q estou clicando. Se for usar o wwDBGrid da InfoPower por exemplo... ai substitui o Column.FieldName por AFieldName ou algo assim... não lembro exatamente,..... Funciona, não sei se é a melhor maneira...


Ola techsoft, atualmente estou fazendo a mesma coisa do que você, eu ainda não descobri como ordenar utilizando indeces como da pra fazer com ClientDataSet, na verdade a minha opnião não tem como ordenar por indeces no [b:4c62f8c894]IBquery[/b:4c62f8c894].

A unica coisa que tem que fazer é passar por todo este transtorno de montar a query novamente ordenado pelo o campo selecionado no dbgrid e depois executar a query, acho desnecessariamente isso, mas como já havia falado não tem como ordenar por indeces no IBquery.


Pestana.


Responder

17/05/2014

Getulio Torres

Ola pessoal como faço para ordenar o DBGRID clicando na barra de titulos?
Eu uso o IBQuery (QProd) Ligado no DM.IBDataBase, e o DBGRID ligado ao DSProd (DataSource), e DSProd(datasource) esta ligado ao QProd(IBQuery)
uso o banco de dados Firebird 2.1, alguem pode me ajudar? Grato....
Responder

12/01/2017

Vivaldo Junior

Para quem usa query
procedure TFrmClientes.DBGrid1TitleClick(Column: TColumn);
begin
with Query1 do begin
if SortType = stAscending then
SortType := stDescending
else
IndexFieldNames := Column.FieldName;
First;
end;
end;
Responder

01/08/2018

Tássio Gois

Pessoal, quem quiser ao clicar ordenar Ascendente ou vice-versa clicando no título de uma coluna do DBGRID com uma FDQuery é só fazer:
with NomedaQuery do
begin
if IndexFieldNames = Column.FieldName + ':D' then
IndexFieldNames := Column.FieldName + ':A' // ascendente
else
IndexFieldNames := Column.FieldName + ':D'; // descendente
end;


Muito Bom!
Me ajudou bastante. Foi o código mais limpo que encontrei.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar