Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Ordenar DBGrid por columnas (https://www.clubdelphi.com/foros/showthread.php?t=27646)

Palmiro 27-11-2005 00:19:49

Ordenar DBGrid por columnas
 
Hola Gente, alguien me puede decir como hacer para ordenar un DBGrid haciendo click en el encabezado. Desde ya muchas Gracias...

mazinger 27-11-2005 00:34:34

1.- Utiliza TJvDBUltimGrid, que dispone de esa opción.
2.- Puedes capturar el evento OnTitleClick del DBGrid y cambiar la SQL del Dataset ordenandolo por el campo correspondiente
Te paso un ejemplo válido para Un ADODataSet

Código Delphi [-]
 procedure TdmRecursos.OrdenaGrid(aColumn: TColumn);
 Var
   SQL,Orden, Temp : String;
   Index : Integer;
   Marca : TBookMark;
 begin
   With (aColumn.Grid.DataSource.DataSet  as TADODataSet) do begin
     If (aColumn.Field.FieldKind = fkCalculated) Or
        (aColumn.Field.FieldKind = fkLookup) Then ShowMessage('No se puede ordenar por este campo')
     Else Begin
       Marca := aColumn.Grid.DataSource.DataSet.GetBookmark;
       Try
         Close;
         SQL := CommandText;
         If aColumn.Field.Lookup Then Orden := aColumn.Field.KeyFields
           Else Orden := aColumn.FieldName;
         Index :=Pos('Order',SQL)-1;
         If Index <> -1
            Then Temp := Copy(SQL,0,Index)+'Order by '+Orden
            Else Temp := SQL + ' Order by '+Orden;
         CommandText := Temp;
         Open;
         aColumn.Grid.DataSource.DataSet.GotoBookmark(Marca);
       Finally
         aColumn.Grid.DataSource.DataSet.FreeBookmark(Marca);
       End;
     End;
   End;
 end;

Palmiro 27-11-2005 14:15:43

Ordenar un DBGrid
 
Muchas gracias.. voy a probar tu ejemplo.

fjcg02 27-11-2005 19:53:39

Si tienes objetos ADO de acceso a datos y ADOQuerys, puedes capturar el evento onTitleClick y poner

QueryX.Sort:= 'campo1, campo2 ASC';

Puedes hacer todas las combinaciones que quieras.

Lo he probado hoy y he alucinado, porque no lo conocía.

Espero que te sirva de ayuda.

Un saludo

Epachsoft 27-11-2005 21:44:55

Y para no dejar por fuera la parte comercial.

Si puedes meter en tu presupuesto comprar componentes. Quantum Grid de DevExpress, es el sueño hecho realidad en el manejo de grids.

El sort es simplemente increible, no solo haces clicks en las columnas, las puedes agrupar visualmente, drag and drop y el usuario inclusive puede consturir sus propios agrupamientos, etc.

Pero, esa es una de las 8,000 cosas extras que puedes hacer con ellos. Yo lo pense DEMASIADO antes de comprarmelos, pero ahora, casi que toda solucion la trato de representar de una u otra forma en grid, debido a las cosas increibles que uno puede hacer con este grid.

Neftali [Germán.Estévez] 28-11-2005 09:58:29

Por último, si quieres hacerlo con el DBGrid estandard de delphi, tampoco es muy complicado; Aquí lo tienes explicado muy claro y con el código necesario.

pnsd_89 25-03-2016 18:35:17

Buenas yo uso un DBGridEh con DBxpert logro ordenar con el siguiente codigo:

Código Delphi [-]
procedure OrdenaDataSetGridEH(var CDS: TClientDataSet; Column: TColumnEH; var dbgPrin: TDBGridEH);
const
  idxDefault = 'DEFAULT_ORDER';
var
  strColumn : string;
  i : integer;
  bolUsed : boolean;
  idOptions : TIndexOptions;
begin

  strColumn := idxDefault;
  if Column.Field.FieldKind in [fkCalculated, fkLookup, fkAggregate, fkInternalCalc] then Exit;
  if Column.Field.DataType in [ftBlob, ftMemo] then Exit;
  //
  //for i := 0 to dbgPrin.Columns.Count -1 do
    //dbgPrin.Columns[i].Title.Font.Style := [];
  for i := 0 to dbgPrin.Columns.Count -1 do
    dbgPrin.Columns[i].Title.Font.Color := clNavy;

  //
  bolUsed := (Column.Field.FieldName = CDS.IndexName);
  //
  CDS.IndexDefs.Update;
  for i := 0 to CDS.IndexDefs.Count - 1 do
  begin
    if CDS.IndexDefs.Items[i].Name = Column.Field.FieldName then
    begin
      strColumn := Column.Field.FieldName;
      case (CDS.IndexDefs.Items[i].Options = [ixDescending]) of
         True : idOptions := [];
         False : idOptions := [ixDescending];
      end;
    end;
  end;
  //
  if (strColumn = idxDefault)  or (bolUsed) then
  begin
    if bolUsed then
      CDS.DeleteIndex(Column.Field.FieldName);
    try

      {Esto evita un error de Key Violation}
      if (idOptions <> [ixDescending])
      and (idOptions <> []) then
        idOptions := [];

      CDS.AddIndex(Column.Field.FieldName, Column.Field.FieldName, idOptions,'', '', 0);
      strColumn := Column.Field.FieldName;
    except
      if bolUsed then strColumn := idxDefault;
    end;
  end;
  //
  try
    CDS.IndexName := strColumn;
    Column.Title.Font.Color := clRed;
    Column.Title.Caption := Column.Title.Caption;
    Column.Title.Font.Style := [fsbold];
    CDS.First;
  except
    CDS.IndexName := idxDefault;
  end;
  //
end;

Ahora cuando a un CDS le creo un campo de tipo lookup el mismo no lo ordena y realmente ya he mirado mucho y no logro entender el porque


La franja horaria es GMT +2. Ahora son las 14:36:32.

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