Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ordenar un dbgrid en acendente y decendente. (https://www.clubdelphi.com/foros/showthread.php?t=57874)

Jheysson13 01-07-2008 00:10:45

Ordenar un dbgrid en acendente y decendente.
 
hola.
me pregunto como puedo crear un Boton 'ordenar', para un bdgrid que cuando seleccione una celda pueda ordenar en descendente y/o decendente el dbgrid con respecto a ese campo, espero ser claro.

utilizo un ztable, firebird.

nota:esto puedo hacerlo con el componente zquery pero en este caso me gustaria un ztable.

gracias de antemano:)

enecumene 01-07-2008 00:56:08

Hola, puedes utilizar los filtros del dataset para ordenar los datos en el DBGrid, o tambien puedes usar el truco 458 en la sección de trucos.

Saludos.

Caro 01-07-2008 01:08:00

Hola Jheysson13, puedes utilizar el evento OnTittleClick del DbGrid y la propiedad Sort de tu DataSet, un ejemplo con los componentes Ado.

Código Delphi [-]
 Orden : String;
.....
.....
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
 Campo : String;
begin
 Campo := Column.FieldName; //Obtenemos el nombre del campo
 if Orden='DESC' then
  begin
   AdoTable1.Sort := Campo+' '+Orden; //Ordenamos por el campo que ha hecho click en orden desendente
   Orden := 'ASC';
  end
 else
  begin
   AdoTable1.Sort := Campo+' '+Orden;
   Orden := 'DESC';
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 Orden := 'ASC'; //Inicializamos orden
end;

El ZTable creo que tiene una propiedad SortedField, entonces Sort cambias por SortedField.

Saluditos

Jheysson13 01-07-2008 18:10:54

saludo de nuevo

solo queria decir que he provado los dos codigos y me funcionaron los dos.

salvo que ambos me daban el mismo problema tanto el del truco 458, como el que me detallo caro.

es que al momento de clickear por primera vez sobre la columna me ordena los campos de la manera inversa al orden, pero si clickeo otra vez no lo hace, a menos que clickee sobre otro campo y asi sucesivamente.

otra cosa es que cuando doy un refresh a la ztable no me deja el orden defaul, sino que lo deja invertido siempre..

como puedo solucionar esto.. gracias de nuevo.

enecumene 01-07-2008 18:31:05

Hola, en el truco prueba cambiando estas lineas:

Código Delphi [-]
if DBGrid1.DataSource.DataSet is TCustomADODataSet then
  with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
  begin    
     if PreviousColumnIndex > -1 then 
        begin
         DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
         DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
        end
    Column.title.Font.Style := 
    Column.title.Font.Style + [fsBold];
    PreviousColumnIndex := Column.Index;

if Column.Field <> nil then
 if (Pos(Column.Field.FieldName, Sort) = 1)
    and (Pos(' DESC', Sort)= 0) then
      Sort := Column.Field.FieldName + ' DESC'
    else
      Sort := Column.Field.FieldName + ' ASC';
  end;
end;

ojo lo hice al vuelo, puede que no funcione.

Saludos.

Caro 01-07-2008 18:35:04

Hola Jheison, a mi me funciona bien haciendo click en la misma columna primero me ordena en ascendente y si clikeo otra vez en la misma en desendente, porque en el codigo que te puse esta así, una vez que ha ordenado en ASC cambia el orden a DESC y viceversa, la variable Orden tiene que ser una variable global en tu unidad.

Saluditos

Jheysson13 01-07-2008 18:42:53

enecumene cuando hice el codigo me fije en los detalles de esas lineas que se encontraban en el tema y los cambie tabien, pero me sigue igual, sin mencionar que estoy trabajando con ztable y no adotable lo k hace que tenga que adaptarlo mas. gracias de todos modos.

caro la variable Orden la declare de manera global como dices pero no se que es lo que pasa, supongo que sera por el componente que estoy usando, ya que es mucha coincidencia que ambos trucos tengan el mismo problema..

de todas formas gracias por la informacion, y su ayuda. vere que puedo hacer.

salu2

cjmatador 02-07-2008 02:18:02

utiliza un query en vez del dbtable que es mucho mas facil y puedes resolver mas facilmente el problema
en el sql pones

select * from tabla order by campo desc
select * from tabla order by campo asc

creo que es asi
saludos

Jheysson13 02-07-2008 02:26:27

tienes razon es mas facil, pero como dije en un principio ya tengo el proyecto muy avanzado para cambiar el ztable por zquery, entiendes mi punto.

de haber sabido que tendria este incombeniente ubiese elejido el query desde el principio..

salu2:):)


La franja horaria es GMT +2. Ahora son las 17:04:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi