Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TDataSet natürlich sortieren (https://www.delphipraxis.net/83970-tdataset-natuerlich-sortieren.html)

trashcandesign 9. Jan 2007 16:03

Datenbank: FireBird • Version: 1.5 • Zugriff über: ZeosLib

TDataSet natürlich sortieren
 
Moin,

ich hab hier ein TJvDBGrid an dem eine TZQuery hängt.
Mit Klick auf den Titel des Grid soll die Spalte sortiert werden.

Im Moment mache ich das per SQL, also mit ORDER BY.

Ich habe jetzt ein VARCHAR-Feld, das sortiert werden soll.
In dem Feld steht zum Beispiel: 1,2,3,10,1a,1a...

Wenn ich das per ORDER BY sortiere erhalte ich folgende Reihenfolge:

1
10
1a
1b
2
3

Ich bräuchte das ganze aber natürlich sortiert, also:

1
2
3
10
1a
1b


Hat jemand ne Idee, wie ich das realisieren könnte?
Oder wisst Ihr vielleicht ne möglichkeit in einem TDataSet die einzelnen Records zu verschieben, dass ich mir so eine Sortierung selbst schreiben könnte?

mkinzler 9. Jan 2007 16:21

Re: TDataSet natürlich sortieren
 
Schreib ne eigene collation :mrgreen:
Oder ne UDF.

trashcandesign 9. Jan 2007 16:28

Re: TDataSet natürlich sortieren
 
Danke dir *g*

Nachdem ich aber unseren Kunden die Möglichkeit geben muss anstatt FireBird auch Access oder MSSql einzusetzen wollte ich dann doch lieber auf eine Datenbankseitige Lösung verzichten.

Mal ganz abgesehen davon, das ich nich die leiseste Ahnung davon habe, wie so eine UDF auszusehen hätte...

marabu 9. Jan 2007 19:03

Re: TDataSet natürlich sortieren
 
Hallo,

die einfachste Lösung ist doch sicher den numerischen und den alphabetischen Teil in zwei getrennten Spalten zu speichern. Für die Anzeige ist FB sehr gut gerüstet - CAST(NUM AS VARCHAR(10)) || ALPHA. Das ständige Zerlegen per SQL oder UDF ist deutlich teurer. Sollten die Daten wirklich bereits alphanumerisch vorliegen, dann würde ich sie einmal mit einem Delphi-Programm zerlegen und gut ist.

Grüße vom marabu

trashcandesign 10. Jan 2007 10:00

Re: TDataSet natürlich sortieren
 
Hallo Marabu,

das aufteilen in zwei Spalten ist so leider auch nicht möglich, da der Kunde in dieses Feld die Werte frei eingeben kann, also auch 1b10a
2b3cd59e
2b10oke
usw.

Und da kann ich dann schlecht auf mehrere Spalten aufteilen.

Zur Verdeutlichung meines Problems:
Bei den/dem Feld(ern) handelt es sich zum Beispiel um frei vergebbare Personalnummern. Da wir das Programm aber nicht nur für einen Kunden schreiben können wir ihm leider auch keine bestimmte formatierung vorgeben. Bisher geben wir dem/den Kunden nur die möglichkeit numerische Werte einzutragen, da funktioniert die sortierung ja so, wie wir es gerne hätten, allerdings halte ich das für nicht ganz komfortabel.

Am geschicktesten wäre es wohl das DataSet selbst, bzw. die Records darin, zu sortieren, aber dazu habe ich keine Möglichkeit gefunden.

:coder2:

shmia 10. Jan 2007 10:26

Re: TDataSet natürlich sortieren
 
1.) alle Records aus dem zu sortierenden Feld in eine Stringliste füllen
2.) Stringliste in "natürlicher Reihenfolge" sortieren
3.) die Tabelle erhält ein neues Feld namens "SortNum" vom Typ integer
4.) Schleife über die sortierte Stringliste und entsprechend viele SQL Update ausfühen
SQL-Code:
UPDATE Tabelle SET SortNum=:Index WHERE Keyfeld=:ItemString
5.) jetzt folgende SQL-Abfrage benützen:
SQL-Code:
SELECT * FROM Tabelle ORDER BY SortNum
Die Schritte 1.) bis 4.) müssen nur dann ausgeführt werden, wenn sich die Persnummern ändern.
Neu Datensätze würden ganz oben einsortiert werden, da "SortNum" eines neuen Datensatz erstmal mit 0 vorbelegt wird.

Elvis 10. Jan 2007 10:33

Re: TDataSet natürlich sortieren
 
Warum nicht einfach lokal sortieren?
Ich finde diese doch sehr krassen Auswüchse hier, nur um beim DataSet zu bleiben, ein bisschen zu krass für meinen Geschmack...

Udontknow 10. Jan 2007 11:25

Re: TDataSet natürlich sortieren
 
Ein nicht so sauberer Trick wäre es, die Zahlen links mit 0 aufzufüllen, bis eine entsprechende Anzahl an Ziffern vorhanden ist (aus 1 also 001 zumachen, aus 1a 001a und aus 44 dann 044). Somit bleibt die Sortierung so, wie du sie gerne hättest, allerdings musst du dann bei der Ausgabe der Zahlen die führenden Nullen wieder entfernen.

Edit: Ach vergesst es, ich schreibe, ohne zu lesen... :oops:

Cu,
Udontknow


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.

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