Benutzerdefinierte Sortierreihenfolge für Datensatz nach der Ausführung der Abfrage?
Ich möchte die Ergebnismenge einer Datenbankabfrage, um eine gewisse Ordnung. Die Informationen, die ich bestellen möchte, ist in der Datenbank nicht enthalten sind, sondern dynamisch generiert-code (so kann ich nicht verwenden ORDER BY
).
Gibt es eine Möglichkeit zum Sortieren dataset nach ausführen der Datenbank-Abfrage? (Ich brauche nicht indizierten Zugriff, sondern wollen nur das iterieren über alle Datensätze.)
- Welche Art von dataset verwenden Sie?
- TAdsQuery
- Die Spalte, die Sie verwenden möchten, um zu bestellen berechnet? (mit OnCalcFields)
- Derzeit gibt es keine Spalte, sondern nur ein Algorithmus, der berechnen kann, ein "Gewicht" pro Datensatz basierend auf anderen Daten in der Anwendung. Dieses Gewicht ist das Sortierkriterium.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine Möglichkeit, dass die Aktien ähnlichkeiten mit Jens' Antwort (+1), sondern bekommt das Ergebnis in einer etwas anderen Weise.
Angesichts einer vorhandenen Tabelle:
Wenn Sie wissen, die gewünschte short order (entweder durch Bearbeitung der Tabelle oder einige Abfrage-Ergebnis es), erstellen Sie eine temporäre Tabelle, dass einige Schlüssel-Wert entsprechend der gewünschten Zeilen aus der ursprünglichen Tabelle und dann die Sortierreihenfolge der Daten:
Legen Sie die
sortvalue
Feld in der temp-Tabelle zu enthalten, die der gewünschten Reihenfolge (es könnte einer zu sortierenden Datentyp nicht integer):Erzeugen dann die Ergebnisse mit einem join gegen die Tabelle sieht vor, dass die Sortierreihenfolge:
Mit einem ClientDataset Sie sind in der Lage, ändern der Reihenfolge nach ausführen.
Einstellungen IndexFieldNames sortiert die dataset.
Finden Sie Informationen hier herstellen einer Verbindung mit einem clientdataset zu einem anderen Datensatz in der gleichen Anwendung.
AFAIK die einzige zuverlässige Methode zum Sortieren eines Datensatzes zu verwenden
ORDER BY
.Ich würde:
order_tag
- Feld zur Abfrage.order_tag
mit Ihrer eigenen Logik undUPDATE #temp_table
Aussagen.Der wichtigste trick hier wäre die Verwendung eines Internen calc-Feld (FieldKind = fkInternalCalc), wenn Sie unterstützt durch Ihre TDataset sub-Klasse. Wenn Sie nicht, verwenden Sie eine TClientDataset als Zwischenprodukt.
DFM:
pas: