Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Temporary table order problem (https://www.delphipraxis.net/193357-temporary-table-order-problem.html)

EricMeyer 20. Jul 2017 18:49

Datenbank: Mysql • Version: ? • Zugriff über: ?

Temporary table order problem
 
Hi,
Ich habe folgendes Problem

Ich habe eine Uniquerry, ein DatasetProvider, ein Clientdataset, eine Datasouce und dann ein grid von defexpress, als auch einen report gekoppelt über frxdbdataset.
Also erstmal einen ganz normalen Aufbau. Ich greife jetzt auf eine mysql DB.
Im SQL führe ich folgendes aus
Ich erzeuge eine temporäre Tabelle (Temporary table) und Sortiere sie sagen wir mal nach Punkten, dazu führe ich ein @count := @count +1 as Ranking aus.
Ich habe jetzt also eine Tabelle mit einem Ranking und den Punkten, außerdem den Namen der Leute.
Jetzt rufe ich die Tabelle mit einem select auf und sortiere sie dort neu nach dem Alphabet. Ziel ist also eine Tabelle zu haben, die nach Namen sortiert ist, aber das Ranking drin hat.

Im Delphi wird aber das zweite sortieren nach den Namen ignoriert, sprich in meinem Grid, also auch in meinem Report wird nur das erste Sortieren durchgeführt, also das nach den Punkten. Das seltsame daran, ich habe einen dbMonitor und eine MySqlWorkbench. Mit dem dbMonitor sehe ich, welcher mysql-code ausgeführt wird. Kopiere ich den Code und führe diesen in der Workbench aus, ist das Ergebnis, wie ich es haben möchte.
Nehme ich den order befehl aus der ersten (temporären) Tabelle raus, sortiert er auch in der zweiten Tabelle, wie ich es möchte.

Hat jemand eine Idee für das Problem oder, wie ich es umgehen kann?

juergen 20. Jul 2017 21:06

AW: Temporary table order problem
 
Hallo,

so ganz verstehe ich deine Anforderung noch nicht.
Geht es um die Auswertung nur der temporären Tabelle? Soll dann erst nach Ranking und als zweites nach Name sortiert werden? (order by Ranking, Name)

Ist im cxDBGrid evtl. eine Spalte auf Sortierung voreingestellt?
Bei gedrückter Shift-Taste lässt sich das cxDBGrid auch nach mehreren Spalten sortieren, also erst Ranking, dann nach Name. Die Sortierung der Spalten lässt sich auch zur Laufzeit setzen.

Ansonsten zeig mal deine SQL-Statement.

EricMeyer 21. Jul 2017 08:34

AW: Temporary table order problem
 
Ich erstelle das Ranking erst in der ersten Tabelle in dem ich in die Tabelle @rank := @rank + 1 as Rank, schreibe. Dadurch gibt es neue Spalte mit Rank. Diese ist logischer weise abhängig von der Sortierung in dieser ersten temporären Tabelle. Somit ist das Ranking abhängig von den Punkten, wonach in der ersten Tabelle sortiert wird.
Anschließend wird es in der zweiten Tabelle dann mitsortiert.

Die Theorie mit der sortierten Spalte, macht in so fern kein Sinn, weil es sonst ja nicht funktionieren würde, würde ich das order in der ersten Spalte auskommentieren. Danach geht die Sortierung in der zweiten. Vorher nur die in der ersten Tabelle.
Beispiel

Frank 100
Klaus 110
Josef 90
Alf 120
Uwe 80

Tabelle plus Ranking (temporäre Tabelle order by ranking)
1 Alf 120
2 Klaus 110
3 Frank 100
4 Josef 90
5 Uwe 80

(select temp_tabele order by Name)
jetzt alphabetisch:
1 Alf 120
3 Frank 100
4 Josef 90
2 Klaus 100
5 Uwe 80

EricMeyer 21. Jul 2017 09:35

AW: Temporary table order problem
 
Okay, nach dem Gespräch mit dem Kollegen... Es liegt wohl daran, dass sich das Client ein falschen Index zieht. Ich mach deshalb die Sortierung jetzt über das ClientDataSet.
Dazu habe ich bei den Eigenschaften des ClientDatasets unter IndexDef so viele Indexe zugefügt, wie ich Sortierungen brauche, anschließend habe ich diesen dann Feldern zugeordnet, nach der Benennung in meinem SQL, sprich: Fields: Name und am Ende cdsPrint.IndexName := 'cdsIxName' eine Neusortierung ausgeführt.

p80286 21. Jul 2017 10:49

AW: Temporary table order problem
 
das klingt aber seltsam......
Falls Du den "rank" nicht benötigst, sollte ein
SQL-Code:
order by Name,Punkte
voll und ganz ausreichen.
Daß für eine Sortierung ein Index notwendig sein soll, ist mir doch recht neu. U.U. ist er hilfreich aber notwendig?

Das ist doch alles sehr obskur.

Gruß
K-H


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