AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Order By stimmt nicht im ClientDataSet

Order By stimmt nicht im ClientDataSet

Ein Thema von Maliko · begonnen am 28. Mai 2021 · letzter Beitrag vom 21. Jun 2021
Antwort Antwort
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#1

Order By stimmt nicht im ClientDataSet

  Alt 28. Mai 2021, 12:16
Datenbank: Oracle • Version: 11 • Zugriff über: TClientDataSet + Query
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.

Geändert von Maliko (28. Mai 2021 um 12:59 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.172 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Order By stimmt nicht im ClientDataSet

  Alt 28. Mai 2021, 14:41
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.
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 10:56
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?
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.172 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 11:01
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.
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 11:05
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.

Geändert von Maliko (21. Jun 2021 um 11:10 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.172 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 11:11
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.
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 11:22
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).
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 11:48
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.
Heiko
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 11:53
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.
  Mit Zitat antworten Zitat
Maliko

Registriert seit: 20. Jun 2019
89 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Order By stimmt nicht im ClientDataSet

  Alt 21. Jun 2021, 13:56
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 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