Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Datenbanken (https://www.delphipraxis.net/22-library-datenbanken/)
-   -   Delphi DBGrid sortieren nach Spalte und Ab- oder Aufwärts (https://www.delphipraxis.net/12035-dbgrid-sortieren-nach-spalte-und-ab-oder-aufwaerts.html)

Daniel B 19. Nov 2003 09:49


DBGrid sortieren nach Spalte und Ab- oder Aufwärts
 
Hi,

hiermit kann man ein Grid egal auf welche Spalte man klickt entweder Auf- oder Abwärts sortieren.
Die Variable vor der Prozedurendeklaration, soll nur bedeuten das die Var in einer Klasse, oder Global oder ins Privat z.B. sein sollte, es geht auch da wo sie jetzt ist, sie darf nur nicht in der Prozedur sein, sonst ist es 1. nicht initialisiert und 2. könnte man sich sonst nie den letzten Wert speichern.
In der Zeile(ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn;) ist das ASC nicht nötig das dies schon der Standardwert von Order ist.
Delphi-Quellcode:
var
  bSortOrder: Boolean;

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  sSortColumn: String;
begin
  sSortColumn := DBGrid1.Columns.Items[Column.Index].FieldName;
  ADODataSet1.Close;
  if bSortOrder then
  begin
    ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn;
  end
  else
  begin
    ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn + ' DESC';
  end;
  ADODataSet1.Open;
  bSortOrder := not bSortOrder;
end;

Sharky 19. Nov 2003 10:04

Re: DBGrid sortieren nach Spalte und Ab- oder Aufwärts
 
Hai,

ich habe da noch eine Idee.

Die Sortierreihenfolge wird nur geändert wenn mann nocheinmal auf die selbe Titelspalte klickt.
Ansonsten wird bei selber reihenfolge nur das Sortierfeld geändert.

bSortOrder und sSortColumn sollten natürlich im OnCreate initialisiert werden.

Delphi-Quellcode:
var
  bSortOrder: Boolean;
  sSortColumn: string;

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  if Column.FieldName <> sSortColumn then
  begin
    sSortColumn := Column.FieldName;
  end
  else
  begin
    bSortOrder := not bSortOrder;
  end;
  ADODataSet1.Close;
  if bSortOrder then
  begin
    ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn;
  end
  else
  begin
    ADODataSet1.CommandText := 'SELECT * FROM Table ORDER BY ' + sSortColumn + ' DESC';
  end;
  ADODataSet1.Open;
end;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]

CalganX 25. Sep 2004 12:48

Re: DBGrid sortieren nach Spalte und Ab- oder Aufwärts
 
Unser Forenuser Union hat dazu noch eine kleine Erweiterung geschrieben, um mehrere Spalten gemischt zu sortieren.
Zitat:

Zitat von Union
mit diesem Code läßt sich nach mehreren Spalten gemischt auf- und absteigend sortieren. Übergeben wird ein String Array im Format ['Feldname-1 ASC|DESC, ',..,'Feldname-n ASC|DESC, ']. Z.b ['Kundenname ASC, ', 'Datum DESC, ']. Eine existierende ORDER BY wird in der letzten Zeile des SQL vermutet und aus dieser vor dem Neuerzeugen gelöscht. Bitte auf die Roten Komma mit der Leerstelle am Ende jedes Strings achten!

Delphi-Quellcode:
procedure ApplySortToQuery(AQuery: TQuery; ASortArray: array of string);
var
  I: Integer;
  ASortString, AFilter: string;
begin
  ASortString := '';
  for I := 0 to High(ASortArray) do
    ASortString := ASortString + ASortArray[I];
  // Achtung, die letzten zwei Zeichen werden gelöscht!
  System.Delete(ASortString, Length(ASortString)-1, 2);
  AFilter := AQuery.Filter;
  try
    AQuery.DisableControls;
    AQuery.Close;
    AQuery.Filter := '';

    if pos('order by', AQuery.SQL.Strings[AQuery.SQL.Count-1]) > 0 then
      AQuery.SQL.Delete(AQuery.SQL.Count-1);

    if ASortString <> '' then
      ASortString := 'order by ' + ASortString;
    AQuery.SQL.Add(ASortString);
  finally
    AQuery.Open;
    AQuery.Filter := AFilter;
    AQuery.EnableControls;
  end;
end;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]

CalganX 3. Aug 2006 12:51

Re: DBGrid sortieren nach Spalte und Ab- oder Aufwärts
 
Peinhard hat noch folgenden Vorschlag:

Wenn man mit ADO und client-seitigem Cursor (clUseClient) arbeitet, kann man auch auf das erneute Holen der Datenmenge (neuer SELECT mit geändertem ORDER BY) verzichten. Die property 'Sort' der ADO-Objekte 'hört' auf die gleiche Syntax wie sie auch nach ORDER BY verwendet wird, es ist also sehr einfach die Codebeispiele entsprechend anzupassen. Beispiel: statt einen neuen

SQL-Code:
SELECT * FROM Tabelle ORDER BY Datum DESC, Bezeichnung ASC
abzusetzen, folgenden Code ausführen:

Delphi-Quellcode:
ADODataset.Sort := 'Datum DESC, Bezeichnung ASC';
Auch bei der Sort-Syntax gilt wie bei ORDER BY, daß ASC bei Feldern ohne explizite Angabe Voreinstellung ist, also weggelassen werden kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz