AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQLite + DBGrid + Sortieren über Spalten Click
Thema durchsuchen
Ansicht
Themen-Optionen

SQLite + DBGrid + Sortieren über Spalten Click

Ein Thema von Andidreas · begonnen am 16. Jan 2014 · letzter Beitrag vom 21. Jan 2014
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

SQLite + DBGrid + Sortieren über Spalten Click

  Alt 16. Jan 2014, 17:15
Datenbank: SQLite • Version: ? • Zugriff über: UniDac
Hallo zusammen,

ich verwende in meinem Programm eine SQLite Datenbank.
Die User möchten nun das Sie über den Klick auf den Titel einer Spalte die Datenmenge nach dieser Spalte Sortieren, so wie es halt auch fast jedes Programm macht.

Ich hab das bisher noch nie umsetzen müssen und hab bisl im Internet darüber gesucht.

Hab ich das richtig interpretiert das man die Datenmenge im DBGrid nicht sortieren kann, sondern das man den SQL Befehl erneut mit der Order By Klausel absetzen muss?

Mein Lösungsansatz (der auch funktioniert) sieht bisher wie folgt aus:

Delphi-Quellcode:
  //Get Sort Column Number and Name
  If Column.Index = giSortColumn Then
  Begin
    If gsSortOrder = 'ASCThen gsSortOrder := 'DESCElse gsSortOrder := 'ASC';
  End Else
  Begin
    gsSortOrder := 'ASC';
  End;

  giSortColumn := Column.Index;
  sFieldName := Column.FieldName;


  //Sort
  Try
    With (sqlitefile_query1) Do
    Begin
      Active := False;
      datsrc_test.DataSet := Nil;
      SQL.Clear;
      SQL.Add('Select * From DATCOM');
      SQL.Add('Order By ' + sFieldName + ' ' + gsSortOrder);
      datsrc_test.DataSet := sqlitefile_query1;
      Active := True;
    End;
  Except
    On E:Exception Do
    Begin
      MessageDlg(E.Message, mtError, [mbOK], 0);
      Exit;
    End;
  End;

  //Show Sort Column
  dbgrid_test.Columns[giSortColumn].Title.Font.Style := dbgrid_test.Columns[giSortColumn].Title.Font.Style + [fsBold];
giSortColumn und gsSortOrder sind Globale Variablen in denen ich mir den letzten Sortier Stand merke.
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 16. Jan 2014, 19:12
Hab ich das richtig interpretiert das man die Datenmenge im DBGrid nicht sortieren kann, sondern das man den SQL Befehl erneut mit der Order By Klausel absetzen muss?
Richtig.
Es sei denn du verwendest ein Grid, dass die Datenmenge intern zwischenspeichert und daher auch sortieren kann.
wie z.B.
https://www.devexpress.com/products/vcl/exquantumgrid/
fork me on Github
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 02:39
Hab ich das richtig interpretiert das man die Datenmenge im DBGrid nicht sortieren kann, sondern das man den SQL Befehl erneut mit der Order By Klausel absetzen muss?
Nicht unbedingt, wenn man wie du UniDac einsetzt. Denn in den zugehörigen Dataset- bwz. Query-Komponenten gibt es das Property IndexFieldNames, dem du einfach den Feldnamen, nach dem sortiert werden soll, als String übergibst. Du kannst auch nach mehreren Feldern sortieren, z.B. erst nach Nachnamen und dann nach Vornamen:

MyQuery.IndexFieldNames := 'Nachname ASC CIS; Vorname DESC';

Da UniDac und IbDac aus derselben Schmiede stammen, gehe ich mal davon aus, daß das, was in meiner IbDac-Hilfe steht, auch für UniDac gilt:

Use the IndexFieldNames property to get or set the list of fields on which the recordset is sorted. Specify the name of each column in IndexFieldNames to use as an index for a table. Ordering of column names is significant. Separate names with semicolon. The specified columns don't need to be indexed. Set IndexFieldNames to an empty string to reset the recordset to the sort order originally used when the recordset's data was first retrieved.
Each field may optionally be followed by the keyword ASC / DESC or CIS / CS / BIN.
Use ASC, DESC keywords to specify a sort direction for the field. If one of these keywords is not used, the default sort direction for the field is ascending.
Use CIS, CS or BIN keywords to specify a sort type for string fields:
CIS - compare without case sensitivity;
CS - compare with case sensitivity;
BIN - compare by character ordinal values (this comparison is also case sensitive).
If a dataset uses a TCustomDAConnection component, the default value of sort type depends on the TCustomDAConnection.Options option of the connection. If a dataset does not use a connection (TVirtualTable dataset), the default is CS.
Read IndexFieldNames to determine the field (or fields) on which the recordset is sorted.
Ordering is processed locally.
Note: You cannot process ordering by BLOB fields.


Wenn man eine Komponente erwirbt, ist es meist nicht verkehrt, sich die Dokumentation dazu anzuschauen, bevor man sie einsetzt.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 07:36
Bei ADO geht das auch (in-Memory sorting),indem Du die Eigenschaft 'IndexFieldNames' belegst (Feldnamen durch Semikolon getrennt).

Allgemein gesehen ist es ziemlicher Blödsinn, die Daten vom Server sortieren zu lassen. Sortieren ist doch ein wenig Ressourcenfressend und so ein DB-Server ist dafür eigentlich zu schade. Und wenn Du nun mal nicht eine SQLite-DB hast, sondern später mal eine richtige DB, bei der mehrere Leute dran sitzen und die klicken munter auf die Sortierspalten, dann ist der Server so mit Sortieren beschäftigt, das er andere Sachen nicht mehr zeitnah hinbekommt.
Lieber heute richtig anfangen, als sich morgen falsche Sachen angewöhnt haben. Nur in sehr seltenen Fällen, nämlich wenn die anzuzeigende Tabelle soviele Daten enthält, das Du die gar nicht alle in den lokalen Speicher bekommst, sollte man das dem Server überlassen. Dann aber auch nur mit Index auf jeder Spalte, was auch wieder behämmtert ist (Stichwort: Index-Shotgun).

Richtig ist, ein Grid oder ein in-Memory Dataset zu verwenden, das das Sortieren eben lokal erledigt. Warum auch nicht, denn die Daten sind doch eh schon da. Nur das dämliche TDBGrid kann das eben nicht.

Wenn deine TDataset-Komponente das nicht kann, dann kopiere die Daten in ein TClientDataset, das kann -glaube ich zumindest- sortieren.

Edit: Hab gerade 'UniDac' gelesen.. Na dann gehts ja.
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.254 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 10:56
ADO : xxx.Sort='FELDDNAME';

TClientDataSet: xxx.IndexName:='Feldname';

Dac: keine Ahnung, das will noch entdeckt werden!
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 11:17
Vielen Dank für die Tipps.

Das mit den IndexFieldNames habe ich ausprobiert und funktioniert einwandfrei!

Ich hab nur noch eine Verständnisfrage...
Wenn ich im SQL eine Ordre By Klausel hab, werden meine Daten sobald ich sie im DBGrid hab ja erst mal nach diesen Kriterien sortiert.

Wie verhält sich das wenn ich dann über IndexFieldNames sortiere?
Die Order By Klausel wird dann ja ausser Kraft gesetzt oder nicht?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#7

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 11:20
Vereinfacht ausgedrückt: das ORDER BY legt die Reihenfolge fest, in der der Server die Datensätze zum Client schickt. Wenn Letzterer sie aber einmal lokal zwischengespeichert hat, kann er sie wieder umsortieren, wie er lustig ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.254 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 11:51
Order By , hier muss eine SQL Abfrage Neu gemacht werden (Daten kommen sortiert vom Server)

IndexName, das Betrift die Daten, die sich nach dem laden im ClientDataSet befinden, die werden in der Komponente sortiert und Betrift nur die Daten, die dort drin sind unabhängig vom SQL Server!
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 11:58
Ok, dann wäre es so wie ich es haben möchte...

Noch ne andere Frage...
Meine Tests habe ich in einem Testprogramm gemacht wo ich ein DBGrid verwendet hab wo an den Einstellungen nichts verändert wurde...
Jetzt versuch ich das ganze in mein bestehendes Programm einzubauen und auf einmal kommt mein Programm nicht mehr ins "OnColumnTitleClick" Ereignis...

Gibt es Einstellungen die das verhinden können?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: SQLite + DBGrid + Sortieren über Spalten Click

  Alt 17. Jan 2014, 12:00
Ich vermute mal das durch das rüberkopieren von Codezeilen ist das Event des Grids noch nicht mit dem Code verknüpft oder die Komponenten heißen anders o.ä.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 19:04 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