Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Order By stimmt nicht im ClientDataSet (https://www.delphipraxis.net/208016-order-stimmt-nicht-im-clientdataset.html)

Maliko 28. Mai 2021 11:16

Datenbank: Oracle • Version: 11 • Zugriff über: TClientDataSet + Query

Order By stimmt nicht im ClientDataSet
 
Moin,

ich habe momentan ein absolut Merkwürdiges Verhalten bei einem meiner ClientDataSets. Und zwar habe ich ein Query, welches ein entsprechendes Order-By hat. Wenn ich dieses Query direkt auf der Datenbank ausführe, stimmt die Sortierung auch (sie ist genauso wie sie sein soll). Doch wenn ich das Query im Programm ausführe dann stimmt die Sortierung nicht mehr. Normalerweise müsste ich nach dem Order By die Einträge in der Folge 1, 2, 3, 4 bekommen. In der Datenbank tut es das auch. Doch das selbe Statement gibt mir die Einträge im ClientDataSet in der Reihenfolge 1, 3, 2, 4 aus.

Könnte es daran liegen, dass der order by auf zwei Spalten von 2 Tabellen liegt, die gleich heißen? Weil dann würde das nämlich hinhauen. Wenn er den ersten gleichnamigen Parameter ignoriert und nur den 2. Berücksichtigt, dann würde das nämlich stimmen. Was anderes würde mir nämlich nicht einfallen. Hat da von euch vielleicht jemand ne Ahnung was da schief läuft. Das Query selbst poste ich jetzt mal nicht, weil es verdammt lang ist und ich es vorher anonymisieren müsste.

Hier aber mal eben das Order By
Code:
ORDER BY kundennummer, referenz, t1.position, t2.position
Danke schon mal im Voraus.

Viele Grüße
Maliko

EDIT: Meine Vermutung dass er den zweiten Parameter ignoriert passt leider auch nicht. Wenn ich den ersten Weglasse sortiert er trotzdem falsch.

TigerLilly 28. Mai 2021 13:41

AW: Order By stimmt nicht im ClientDataSet
 
Clientdataset oder Query? Der Query holt die Daten so wie sie aus der DB gelifert werden. Das Clientdataset holt die Daten, befüllt sich und sortiert sie uU anders.
Schau mal, ob dein CDS einen Index hat bzw ob die Feld-Eigenschaften da etwas anders enthalten, als du erwartest.

Maliko 21. Jun 2021 09:56

AW: Order By stimmt nicht im ClientDataSet
 
Es lag scheinbar wirklich am Index des ClientDataSet. Das Problem konnte ich beheben, indem ich das ClientDataSet durch ein OracleDataSet ersetzt habe.

Nun habe ich ein ähnliches Ergebnis. Leider kommt es diesmal aufgrund der Architektur der Unit nicht in Frage das ClientDataSet auszutauschen. Und wieder habe ich das Problem, dass die Sortierung im ClientDataSet eine andere ist als in der Datenbank. Wenn ich das Query im SQL-Developer ausführe, dann steht ein bestimmter Datensatz an Position 3202. Im ClientDataSet steht dieser allerdings an Position 3204.

Das ClientDataSet hat lediglich einen Index, nämlich den PRIMARY_KEY Index, welcher nach der Standartsortierung sortiert. In der Datenbank ist das folgender ORDER BY:

Code:
order by a.kundennummer, a.vorgang, a.unterkonto, a.version
Er soll allerdings über eine Option im Programm nach folgendem Order by sortieren:

Code:
order by to_number(regexp_substr(sammelreferenz, '^[[:digit:]]*')), sammelreferenz, to_number(a.kundennummer), referenz
Ich vermute dass das irgendwas mit den Indizes des ClientDataSets zu tun hat. Kann mir da jemand nen Tipp geben, wie ich endweder das Order by in einen Index umgewandelt bekomme, oder wie ich dem ClientDataSet sage, dass es die Finger von der Sortierung lassen soll?

TigerLilly 21. Jun 2021 10:01

AW: Order By stimmt nicht im ClientDataSet
 
Warum muss das SORT der DB und die Sortierung im Clientdataset ident sein? Bzw wenn es das sein muss, warum baust du den Index im CDS nicht genau so auf, wie du ihn brauchst?

Ich würde mir überlegen, wie das CDS sortiert sein soll + dem entsprechend einen Index im CDS aufbauen.
Aber Achtung: Das CDS kann NICHT nach berechneten Feldern sortieren. Als Workaround kannst du "internal calc" als Feldtyp nehmen. Die können berechnet werden, landen aber nicht in der DB.

Maliko 21. Jun 2021 10:05

AW: Order By stimmt nicht im ClientDataSet
 
Das ist das Problem. Es gibt nicht eine einzige Sortierung. Der Benutzer kann zwischen 5 verschiedenen Sortierreihenfolgen wählen, die jeweils eine SQL-Abfrage mit einem anderen ORDER BY starten.

Durch die Indizes steige ich ehrlich gesagt nicht durch, bzw. finde sie so wie ich sie verstanden habe reichlich schwachsinnig, da man nur nach bestimmten Feldern in einer bestimmten Reihenfolge sortieren kann, allerdings z.B. nicht nach einem Regex wie in meinem Beispiel. Darum will ich einfach nur dass das ClientDataSet die Daten so nimmt wie es die bekommt und da nicht noch weiter dran rumsortiert.

EDIT: Und identisch muss es daher sein, da der Mitarbeiter nach der Position des Datensatzes schaut. Diese bekommt er aus einem anderen Teil des Programmes und die Stimmen trotz des selben Querys nicht überein. Nur ist es bei dem einem Teil einfach nur ein Query welches in eine Liste gedumpt wird und beim zweiten um ein ClientDataSet, welches über eine DataSource an eine Tabelle gebunden ist.

TigerLilly 21. Jun 2021 10:11

AW: Order By stimmt nicht im ClientDataSet
 
1) Wenn du keinen Index machst, werden die Daten in der Reihenfolge abgerufen, in der sie die DB liefert. Also das ORDER BY in die Query + CDFS hat keinen Index.
2) Mach je Abfrage einen anderen Index, ein CDS kann ja mehrere davon haben.
3) Mach in dein SQL ein Feld, nach dem du mit ORDER BY sortierst und auf das du im CDS einen Index setzt.
Beispiel: Statt select a,b,c from x order by 2,3 machst du select c+b as idx,a,b,c from x order by 1 und im CDS hast du idx als Feld vorliegen + kannst danach sortieren.

Maliko 21. Jun 2021 10:22

AW: Order By stimmt nicht im ClientDataSet
 
2. würde ich gerne machen, habe aber wie bereits 2 mal geschrieben keine Ahnung wie das gehen soll. Vor allem da es auch möglich sein muss descendent zu sortieren. Da liegt dann auf dem Order by beim Regex und der sammelreferenz noch ein DESC drauf. Und zwar nur auf den beiden. Das kann man nicht über die 3. möglickeit abdecken. Und Möglichkeit 1 funktioniert nicht. Ich habe gerade jeden einzelnen Index aus der FieldDefs gelöscht und er sortiert trotzdem anders.

Wie schon gesagt. 2. Möglichkeit wäre mir persönlich am liebsten, weil dann müsste ich auch nicht mehr jedes mal ein neues Query abschießen, was natürlich auch die Geschwindigkeit des ganzen Erhöhen würde (die Abfrage dauert nämlich fast ne Minute jedes mal).

hoika 21. Jun 2021 10:48

AW: Order By stimmt nicht im ClientDataSet
 
Hallo,
vielleicht hilft dir das?

https://www.delphipraxis.net/161193-...sortieren.html

Du kannst das CS also anders sortieren wie das darunterliegende DataSet (bei dir eine Query).
Wenn du das CS in Ruhe läßt (kein IndexName/IndexFieldName usw.) müsste die Sortierung wie die Original-Query sein.

Das Ändern der Sortierung über die Query dauert dann aber halt deine eine Minute.

Wenn du die Sortierung über das CS machst, musst du halt das genauso setzen, wie du es haben willst.

Maliko 21. Jun 2021 10:53

AW: Order By stimmt nicht im ClientDataSet
 
Den Post hab ich selbst schon gefunden. Nur existiert die Seite, auf die in dem Verlinkten Beitrag verlinkt wurde nicht mehr. Über den von dir Verlinkten Thread weiß ich überhaupt wie das ganze überhaupt funktioniert.

Maliko 21. Jun 2021 12:56

AW: Order By stimmt nicht im ClientDataSet
 
So. Problem hat sich erledigt. Ich bin jetzt doch das Risiko eingegangen die Komponente auszutauschen. Glücklicherweise heißen die meisten Bestandteile vom OracleDataSet genauso wie beim ClientDataSet, daher musste ich nur die Quellunit bearbeiten und nicht die Units die mit den Daten dann arbeiten. Mit einem OracleDataSet funktioniert es einwandfrei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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