Ordenar registros no grid clicando sobre a barra de título.
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
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
Curtidas 0
Melhor post
Irineu Junior
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;
with NomedaQuery do
begin
if IndexFieldNames = Column.FieldName + ':D' then
IndexFieldNames := Column.FieldName + ':A' // ascendente
else
IndexFieldNames := Column.FieldName + ':D'; // descendente
end;
GOSTEI 3
Mais Respostas
Marcelo_mileris
24/07/2006
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;
GOSTEI 0
Techsoft
24/07/2006
Obrigado amigo.
Era isso mesmo que eu estava precisando.
[]´s
Era isso mesmo que eu estava precisando.
[]´s
GOSTEI 0
Leitorbinario
24/07/2006
Como fazer com IBX?
GOSTEI 0
Techsoft
24/07/2006
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.
GOSTEI 0
Fabiano Góes
24/07/2006
ai pessoal, será que alguem pode postar um codigo de exemplo pra isso:
grato !!!!
Fabiano Góes.
grato !!!!
Fabiano Góes.
GOSTEI 0
Fabiano Góes
24/07/2006
ai pessoal, será que alguem pode postar um codigo de exemplo pra isso:
grato !!!!
Fabiano Góes.
grato !!!!
Fabiano Góes.
GOSTEI 0
Techsoft
24/07/2006
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:
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...
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...
GOSTEI 0
Techsoft
24/07/2006
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:
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...
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...
GOSTEI 0
Micheus
24/07/2006
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:Obs: levo em consideração que a cláusula ORDER BY está em uma linha única na propriedade SQL (que é um TString)
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;
GOSTEI 0
Cyber
24/07/2006
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
Caso funcione diga ai para o pessoal!
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!
GOSTEI 1
Isoares
24/07/2006
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.
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.
GOSTEI 0
Pestana_
24/07/2006
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:
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...
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;
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.
GOSTEI 0
Getulio Torres
24/07/2006
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....
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....
GOSTEI 0
Nelson Santos
24/07/2006
ganhe dinheiro com softwares 3D em Delphi 7
http://www.3dsistemas.com.br
http://www.3dsistemas.com.br
GOSTEI 0
Vivaldo Junior
24/07/2006
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;
procedure TFrmClientes.DBGrid1TitleClick(Column: TColumn);
begin
with Query1 do begin
if SortType = stAscending then
SortType := stDescending
else
IndexFieldNames := Column.FieldName;
First;
end;
end;
GOSTEI 0
Tássio Gois
24/07/2006
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;
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.
GOSTEI 0