Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SELECT TOP ... DESC umsortieren (https://www.delphipraxis.net/178452-select-top-desc-umsortieren.html)

süden 8. Jan 2014 23:10

Datenbank: Access / SQL Server • Version: 2010 • Zugriff über: ADO

SELECT TOP ... DESC umsortieren
 
Hallo,

ich habe eine Stundenliste mit Datum.
Damit der Nutzer nicht alle Daten laden muß und ich nicht weiss, wann die letzten Einträge ware,
habe ich SELECT TOP 20 gewählt.

Ich benutze ein cxGrid von DEVEX im Gridmode, sonst wird das Ding bocklangsam wenn der Nutzer > 500 Datensätze abruft.

Im Gridmode sortiert das Grid nicht selbst, sondern ich über SQL.
Wenn ich jetzt von DESC auf ASC umschalte dann holt die Abfage die daten von 1965 (oder so).

Wie kann ich das verhindern?
Hat jemand einen Rat?

süden 8. Jan 2014 23:19

AW: SELECT TOP ... DESC umsortieren
 
Mann, da grübel ich rum wie blöd, kaum hab ichs hier geschrieben, habe ich die Lösung.

Soll ich schreiben wie? Oder wisst ihr das alle?
Na gut.

Code:
SELECT * FROM tStunden
WHERE [Datum] IN (SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC)
ORDER BY [Date]

Furtbichler 9. Jan 2014 06:20

AW: SELECT TOP ... DESC umsortieren
 
Wenn dein cxGrid schon bei 500 Records lahm wird, liegt der Fehler bei Dir. Das Teil wird erst bei >5000 Recs etwas behäbig. Ich hab bis zu 2000 im Grid (150 Spalten) und der Anwender merkt nix.

Edit: Sollte nicht auch das gehen:
Code:
select top 20 * from Tabelle order by Feld

jobo 9. Jan 2014 07:27

AW: SELECT TOP ... DESC umsortieren
 
Es geht ja wohl um die absteigende Sortierung.
Das in kann man sich sparen, man muss die Top Menge nur umdrehen.

Code:
Select * from
  (SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC)
order by [Datum]
Bezüglich Performance die Standardfrage:
Wie sieht es mit Indizierung aus?

süden 9. Jan 2014 10:50

AW: SELECT TOP ... DESC umsortieren
 
Zitat:

Das in kann man sich sparen, man muss die Top Menge nur umdrehen.
Hat Du das mal probiert?


Index ist da, aer im Hintergrund läuft noch ne Menge Zeug - kann ich sicher noch optimieren.

Es geht eigentlich nicht um die 500, da ist nur eine leichte Verzögerung zu spüren,
sondern um das Angebot an den Nutzer, sich auch mal einen größeren Zeitraum anzuschauen.
Das können dann 10-tausende sein.
JA, ich weiß. bei vielen träuben sich die Nackenhaare.
Aber, ich bin selbst Nutzer, habe das Programm programmiert, weil ich genau das wollte (u.A.).

Bummi 9. Jan 2014 10:55

AW: SELECT TOP ... DESC umsortieren
 
Für Access nicht zu gebrauchen da hier üblicherweise mit clServer gearbeitet wird, aber für SQL-Server mit Datenmengen die den Gridmode benötigen (~>5000) verwende ich ein Event in meinem Template welches den Views zugeordnet wird um die Daten entsprechend der über dass Grid zu definierenden Sortierungen clientzseitig über ADO-Sort abfackelt.

Delphi-Quellcode:
Const
C_SORTTYPE:Array[TcxDataSortOrder] of String=('ASC','ASC','DESC');

procedure TTemplate.AllGridDataControllerSortingChanged(Sender: TObject);
var
 i:Integer;
 sl:TStringList;
begin
   if TcxGridDBDataController(Sender).DataModeController.GridMode then
      begin
       sl:=TStringList.Create;
       sl.Delimiter := ',';
       sl.StrictDelimiter :=true;
       for I := 0 to TcxGridDBDataController(Sender).GridView.SortedItemCount - 1 do
          begin
            if TcxGridItemDBDataBinding(TcxGridDBDataController(Sender).GridView.SortedItems[i].DataBinding).Field.FieldKind=fkData then
            sl.Add(TcxGridItemDBDataBinding(TcxGridDBDataController(Sender).GridView.SortedItems[i].DataBinding).FieldName + ' '
                   +  C_SORTTYPE[TcxGridDBDataController(Sender).GridView.SortedItems[i].SortOrder])
          end;
       TAdodataset(TcxGridDBDataController(Sender).Datasource.DataSet).Sort
       := sl.DelimitedText;
       sl.Free;
      end;
end;

jobo 9. Jan 2014 11:11

AW: SELECT TOP ... DESC umsortieren
 
Zitat:

Zitat von süden (Beitrag 1242845)
Zitat:

Das in kann man sich sparen, man muss die Top Menge nur umdrehen.
Hat Du das mal probiert?

Nein, hab ich nicht, es ist ja Dein Problem :)
Es macht einfach keinen Sinn das Datum noch mal mit "in" abzugleichen, wenn die Menge selbst schon richtig ist.
Geht es nicht?

Zu den großem Mengen:
Warum muss es unbedingt per TOP gemacht werden?
Wieso lässt Du den Nutzer nicht gleich die untere Datumsgrenze selbst wählen?
Ob es nun TOP 500, TOP 1000 oder TOP 10000 sind, dürfte relativ schnuppe sein.
Als Nutzer würde ich eine konkrete Datumsgrenze ala:
alles von letzter Woche, letztem Monat, letzten 12 Monaten
vermutlich bevorzugen.

Furtbichler 9. Jan 2014 11:50

AW: SELECT TOP ... DESC umsortieren
 
'ORDER BY' ist nur dann schnell bzw. dauert gar nicht, wenn auf dem zu sortierenden Feld ein 'clustered index' liegt.

Haben die neueren DevExpress-Teile nicht 'Paging' eingebaut, oder hast Du auch 'nur' das alte?

süden 9. Jan 2014 12:24

AW: SELECT TOP ... DESC umsortieren
 
TOP:
Wenn das Form startet und ein Datumsbereich angegeben ist, kann es sein, dass die Tabelle leer ist.
Kein schöber Effekt. Der Nutzer muß sich einen Bereich suchen, in dem er Daten findet. Nicht gut.
Besser, er bekommt die letzten eingegebenen Daten zu sehen und kann sich orientieren. Also TOP.
Oder nicht?

Bummi, genau das Template verwende ich auch.

jobo, ich finde, wenn Du Vorschläge machst - danke dafür - solltest Du es auch probiert haben.

Furtbichler, ich habe die 5er, Paging ist aber drin, deshalb geht es sehr schnell bei 50.000 DS, aber nur bei Gridmode. Oder habe ich da was nicht verstanden?

Ich WILL die TOP 20, also nehme ich sie.
Dabei werden je nach Sortierrichtung entweder die vo 2014 oder die von 1936 genommen.
Also isoliere ich die TOP 20 mit IN und kann dann ganz in Ruhe mit arbeiten.
Das läuft schnell und Problemlos, oder gibt's was besseres?

nahpets 9. Jan 2014 13:22

AW: SELECT TOP ... DESC umsortieren
 
Code:
Select * from
  (SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC)
order by [Datum]
Das funktioniert nicht bei jeder Datenbank, Oracle kann's so, SQL-Server (versionsabhängig?) und Access benötigen eine kleine Abwandlung:
Code:
Select * from
  (SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC) IrgendEinName
order by [Datum]


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 Uhr.
Seite 1 von 2  1 2      

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