AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Datenbanken Delphi DBGrid sortieren nach Spalte und Ab- oder Aufwärts
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid sortieren nach Spalte und Ab- oder Aufwärts

Ein Thema von Daniel B · begonnen am 19. Nov 2003 · letzter Beitrag vom 3. Aug 2006
Antwort Antwort
Daniel B
(Gast)

n/a Beiträge
 
#1

DBGrid sortieren nach Spalte und Ab- oder Aufwärts

  Alt 19. Nov 2003, 09:49
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;
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 19. Nov 2003, 10:04
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]
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 25. Sep 2004, 12:48
Unser Forenuser Union hat dazu noch eine kleine Erweiterung geschrieben, um mehrere Spalten gemischt zu sortieren.
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]
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4

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

  Alt 3. Aug 2006, 12:51
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

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

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.
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 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