![]() |
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? |
Re: TDataSet natürlich sortieren
Schreib ne eigene collation :mrgreen:
Oder ne UDF. |
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... |
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 |
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: |
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:
5.) jetzt folgende SQL-Abfrage benützen:
UPDATE Tabelle SET SortNum=:Index WHERE Keyfeld=:ItemString
SQL-Code:
Die Schritte 1.) bis 4.) müssen nur dann ausgeführt werden, wenn sich die Persnummern ändern.
SELECT * FROM Tabelle ORDER BY SortNum
Neu Datensätze würden ganz oben einsortiert werden, da "SortNum" eines neuen Datensatz erstmal mit 0 vorbelegt wird. |
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... |
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