AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi 10Records vor- und zurückblättern (Paging)

10Records vor- und zurückblättern (Paging)

Ein Thema von heri · begonnen am 27. Mai 2008 · letzter Beitrag vom 28. Mai 2008
Antwort Antwort
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#1

10Records vor- und zurückblättern (Paging)

  Alt 27. Mai 2008, 10:09
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO
ich habe dummerweise sehr viel Zeit verbracht ein "10Records vor- und zurückblättern" mit einem SQLCursor zu lösen
(war leider sehr kompliziert und die Performance schlecht)

tja - heute habe ich folgendes in MS Technet gefunden:

SQL-Code:
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
Link:
http://<br /> <img src="styles/elis....NET</a><br />

so einfach und so schnell und
da dies vllcht noch nicht alle im DP kennen wollt ichs hier noch posten
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: 10Records vor- und zurückblättern

  Alt 27. Mai 2008, 16:51
zufrüh gefreut... sooo ein shit...

ADO versteht kein WITH Statement...

oder kennt bitte jemand einen Trick?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: 10Records vor- und zurückblättern

  Alt 27. Mai 2008, 18:54
Wieso soll ADO das verstehen? Ich kann doch 'Halmackenreuther' zum SQL-Server schicken ...
Egal, mach ne UDF draus
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.568 Beiträge
 
Delphi 12 Athens
 
#4

Re: 10Records vor- und zurückblättern

  Alt 27. Mai 2008, 19:19
Hier hab ich noch was dazu gefunden: Klick
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: 10Records vor- und zurückblättern

  Alt 28. Mai 2008, 07:03
Vielen Dank für die Tipps!

leider ist das von mir aufgeführte SQLBeispiel nur ein stark vereinfachtes Beispiel und sollte einen Ansatz bieten

Mein SQL Statement ist sehr viel komplexer - meine Tabelle (> 100'000 Records und stark wachsend) viel grösser und deshalb:
- geht eine UserDefinierteFunction (UDF) als auch eine Procedures auf dem SQL Server nicht (war mein erster Ansatz mit dem ich sehr viel Zeit verbraten habe)
- das Beispiel der mehrstufigen Begrenzung auch nicht möglich
SQL-Code:
 
SELECT TOP 50 name, value
FROM ( SELECT TOP 100 name, value
       FROM tab
       ORDER BY value DESC)
ORDER BY value ASC;
PS: geht bei mir ehh nicht

ABER - ich habe einen naja "eleganten" Umweg
(und vllcht wird der ja noch ein paar anderen dienen,
ich profitiere oft von den Ideen hier in der DP, so möcht ich
auch wieder mal was beitragen - mein Tipp

man erstelle auf dem SQLServer folgende Procedure:

SQL-Code:
CREATE PROCEDURE [ExecSQLDirect]
      @SQLStatement varchar(MAX)
AS
BEGIN

   -- SET NOCOUNT ON added to prevent extra result sets from
   -- interfering with SELECT statements.
   SET NOCOUNT ON;
 
   exec(@SQLStatement)

END
und anschliessen kann man die Procedure EXECSQLDirect mit dem ersten Beispielcode als Parameter @SQLStatement übergeben...
cool oder? tja - wer lange sucht... wird langsam schlau...

PS:
und so kann übrigens jedes für den SQLServer gültige SQLStatement, bei welchem die ADO's eine exception auslösen würden, ausgeführt werden
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: 10Records vor- und zurückblättern (Paging)

  Alt 28. Mai 2008, 09:54
Also, wenn Du durch eine lange Tabelle blättern willst, dann :
Erstelle einen CLUSTERED(!!!) INDEX auf der Spalte, nach der sortiert werden soll. Wir nennen die jetzt mal 'SEQ' (für Sequenz).

Dann:
In Delphi deklarierst du zwei Variablen: 'TopSeq' und 'BottomSeq'.

So, jetzt der Code:
Init:
'Select Top 10 * from MyTable Order by SEQ'
Du bekommst maximal 10 Zeilen. Der Wert 'SEQ' der 1.Zeile kommt in TopSeq, der der letzten Zeile in 'BottomSeq'

Nächste Seite laden:
'Select Top 10 * from MyTable Where SEQ > :BottomSeq order by SEQ'
Du bekommst maximal 10 Zeilen. Der Wert 'SEQ' der 1.Zeile kommt in TopSeq, der der letzten Zeile in 'BottomSeq'

Vorherige Seite laden:
'select * from (Select Top 10 * from MyTable Where SEQ > :TopSeq order by SEQ Desc) x order by SEQ'
Du bekommst maximal 10 Zeilen. Der Wert 'SEQ' der 1.Zeile kommt in TopSeq, der der letzten Zeile in 'BottomSeq'

Der Trick ist der Clustered Index, denn dann verbraucht die Sortierung keine Zeit (die Daten sind bereits sortiert abgelegt). Du wirst bei dieser Lösung keine Verzögerung bemerken, egal wie groß die Tabelle ist.

Unter SQL 2005 gehts vielleicht auch noch einfacher, aber so hab ich mir seit 10 Jahren beholfen und es funzt sehr gut.

Die Frage, die Du dir stellen solltest, lautet aber:
Zitat von Die Frage:
"Wieso soll jemand durch unmengen von Daten scrollen wollen ?"
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
heri

Registriert seit: 20. Mär 2006
81 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: 10Records vor- und zurückblättern (Paging)

  Alt 28. Mai 2008, 11:40
thx to alzaimar

aufgrund von deinem bsp weiss ich dödel jetzt endlich wieso folgendes NICHT geht:
SQL-Code:
SELECT TOP 50 name, value
FROM ( SELECT TOP 100 name, value
       FROM tab
       ORDER BY value DESC)
ORDER BY value ASC;
see:
http://www.sql-tips.de/index.php/Aus...chr%C3%A4nkung

sondern man muss "aliasen" (oder wie hiess das schonwieder)!
so muss es heissen:

SQL-Code:
SELECT TOP 50 name, value
FROM ( SELECT TOP 100 name, value
       FROM tab
       ORDER BY value DESC) MYALIAS
ORDER BY value ASC;
dein tipp vom clustered index kann ich (glaub ich) nicht anwenden, denn ich habe für die tabelle schon einen clustered index für den PK und
leider weiss nicht wie ich einen zweiten gruppierten clustered index machen kann

ich erhalte immer
Zitat:
Für 'tTableX' (Tabelle) kann höchstens ein gruppierter Index erstellt werden. Löschen Sie den bestehenden gruppierten 'PK_tTablePK'-Index, bevor Sie einen weiteren gruppierten Index erstellen.
thx anyway
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: 10Records vor- und zurückblättern (Paging)

  Alt 28. Mai 2008, 13:00
Hallo,

weil die Daten bei einem clustered index physisch sequentiell abgespeichert werden, kannst du natürlich nur einen solchen Index pro Tabelle haben. In der Regel ist der PK ein mieser Kandidat für den clustered index.

Die eingedeutschte Fehlermeldung ist insofern irreführend, als es einen weiteren clustered index nie geben kann. Die vorgeschlagene Maßnahme ist aber richtig: Erstelle den Index über den PK neu als non-clustered, dann kannst du einen clustered index über ein Feld legen, das besser geeignet ist.

Grüße vom marabu
  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 10: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