Einzelnen Beitrag anzeigen

raller09

Registriert seit: 7. Nov 2005
38 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

TClientDataSet mit NaturalSort-Spalte oder Alternative (Firedac TFDMemTable?)

  Alt 15. Jul 2020, 08:36
Datenbank: In_Memory • Version: 10.4 • Zugriff über: TClientDataSet
Moin,

wie bekomme ich es hin, dass ich eine Spalte, die bis jetzt "ftInteger" war und auf "ftWideString, 15" umgestellt wurde nach einem NaturalSort sortiert wird?


Es ist so, dass in Zukunft kein zwingendes Schema auf diesem Feld liegt (z.b. ersten Zwei + 7+8 Zeichen immer "xx" -> xx0000xx00). Die Werte haben auch eine unterschiedliche länge (zwischen 1-15)...


Wir nutzen Firebird als DB, dort kann über eine collation mit "NUMERIC-SORT" für eine Spalte die gewünschte Sortierung erreicht werden.

wir kopieren aber häufig die Daten aus der Datenbank für die Anzeige und Bearbeitung in TClientDataSet und schreiben sie danach wieder in die Datenbank ab.


Zur Anzeige nutzen wir an vielen Stellen das DevExpress-Grid, welches auch eine Möglichkeit für ein "custom sort" bietet.


Wir bieten über Einstellungen oder OnTitelClick dem Benutzer die Möglichkeit, die Daten entsprechend seinen wünschen zu sortieren.

Leider haben wir auch noch viele Stellen, die die das Delphi Standard Grid nutzen bzw.
drucken die TClientDataSets ohne eine Grid-Zwischenschicht.

Wie bekomme ich dort eine Sortierung nach NaturalSort (1,2,11,12, nicht 1,11,12,2; Nummerblöcke werden zusammengefasst) hin?


Wenn ich das richtig sehe, bietet das TClientDataSet hierfür keine Unterstützung.

Mir fällt auch keine Regel ein, wie ich das Feld für ein computed by aufbereiten könne, nach dem dann sortiert wird (hat jemand von euch eine Idee?).


Alternativ scheint die FireDac TFDMemTable ggf. eine Lösung zu bieten:
http://docwiki.appmethod.com/appmeth...ions_(FireDAC)
Zitat:
Q6:
  • Assign LCID to TFDMemTable.Table.Locale. FireDAC uses CompareStringA and CompareStringW with SORT_STRINGSORT flag. The default collation is DBMS independent. It is LOCALE_USER_DEFAULT. See Win API documents for details.
  • Change the source code - FireDAC.DatS.pas, TFDDatSRow.CompareData and implement your own comparison algorithm.
  • Register a custom function with an expression evaluator. See FireDAC.Stan.Expr.pas for registration details. Then you can use this function at TFDMemTable.Indexes[..].Expression. For example: Expression := 'MySort(Name)'.
In the future we will implement custom collations. That will be useful for SQLite driver cases, like yours.

Macht es Sinn auf dieses DataSet umzubauen? Das wird ja von Emparcadero als "Nachfolger" angesehen -> https://www.youtube.com/watch?v=iNgHJakYWkU


1. gibt das eine Locale mit "SORT_DIGITSASNUMBERS" oder kann ich das selber setzen?
2. Den Delphi eigenen SourceCode möchte ich eigentlich nicht ändern...
3. Eine eigene Funktion für die Expression hab ich angelegt. aber auch hier hab ich doch wieder das Problem wie mit der "computed by" Spalte -> was muss die Funktion zurückgeben?

Zitat:
In the future we will implement custom collations.
Ist diese Zukunft eingetreten? kann ich einen eigenen custom comparer angeben, der dann passend Left/Right mit -1,0,+1 zurückgibt? Wie mache ich das?

Ich hab in der dürftigen Dokumentation jetzt nichts gefunden...

Winapi.ShLwApi.StrCmpLogical liefert z.B. die gewünschte Sortierung...


Oder ist mein Ansatz komplett falsch.

Ich bin auf eure Ideen und Ansätze gespannt.

Vielen Dank,

raller09
  Mit Zitat antworten Zitat