Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Suche erweiterten DBNavigator!!! (https://www.delphipraxis.net/130399-suche-erweiterten-dbnavigator.html)

romber 7. Mär 2009 18:59

Datenbank: MS SQL Server • Version: 2005 • Zugriff über: ADO

Suche erweiterten DBNavigator!!!
 
Hallo!

Wenn man auf irgendeiner Suchseite nach irgendetwas sucht und viele Suchergebnisse gefunden wurden, werden meistens nicht alle Ergebnisse auf einmal angezeigt sondern auf mehrere Seiten aufgeteilt. Etwa so:

< 1 2 3 4 5 6 7 8 9 ... 100 >

So etwas möchte ich auch in meinem Programm machen. Gibt es eine fertige Komponente dafür?
Wenn nicht, wie mache ich das am besten? Bestimmt hat das jemand schon gemacht.

Wür jeden Tipp werde ich sehr dankbar.

Joe_the_Junkie 8. Mär 2009 08:44

Re: Suche erweiterten DBNavigator!!!
 
Eine Möglichkeit wäre wenn du über SQL-Befehle gehst:

Als erstes erhälst du mit "SELECT COUNT(*) FROM [Tabelle]" Die Anzahl der Zeilen in deiner Tabelle.
Bzw. kannst Du auch schreiben "SELECT COUNT(*) FROM [Tabelle] WHERE {Bedingung}";

Damit erhälst du die Anzahl der Einträge, die deiner Bedingung entsprechen.
Jetzt nimmst du die Anzahl der Lösungen, die du pro Seite zeigen möchtest und erhälst damit die Anzahl der Seiten
die Du brauchst. => Erstes Problem gelöst.

Wenn du jetzt nur eine gewisse Menge anzeigen lassen möchtest kannst du das hiermit machen.

"SELECT * FROM [Tabelle] LIMIT a,b"

Dabei sagt dir "a" wo dein Select anfangen soll.

Wenn "a" z.B. 0 ist fängt er ganz am Anfang an.
Wenn es z. B. 5 ist, fängt er erst ab der 6 Zeile an die Zeilen aus der Datenbank zu holen.

Mit "b" gibst du dann an wieviele Einträge Du aus der Datenbank ziehen möchtest.

Kleines Beipsiel:

"SELECT * FROM [Tabelle] LIMIT 5,10" nimmt die Zeile ab dem 6. Eintrag und gibt von da an die nächsten 10 Einträhe aus.

Am besten ist, alle Einträge haben eine id (Was meistens einegntlich Standart ist).
Dann schreibst du in deine SELECT-Abfrage noch "ORDER BY id ASC, bzw DESC"

ASC bedeutet hier aufsteigend und DESC absteigend.

Wenn man jetzt auf eine Seitenzahl klickt, dann kann man ausrechnen ab welcher Zeile die Datenbank die Daten ausgeben soll.

Sagen wir du willst pro Seite 10 Zeilen Ausgeben:

Als erstes erhälst du als Ergebnis 40 Zeilen. D. h. du hast 4 Seiten.
Klickt man nun auf Seite 2 musst du ja die Einträge von 11 bis 20 ausgeben.

Also "SELECT * FROM [Tabelle] ORDER BY id ASC LIMIT (SEITE -1)*10,10" (SEITE stelle hier eine Variable dar, für die Seite, die angeklickt wurde)

Somit erhälst du die passenden Einträge für deine angeklcikte Seite.


Sry, war garde im schriebrausch, hoffe, hab das nicht zu kompliziert erklärt.

Mfg Joe the Junkie

Codewalker 8. Mär 2009 09:43

Re: Suche erweiterten DBNavigator!!!
 
MSSQL kennt den Befehl LIMIT nicht - der ist von MySQL und nicht SQL-Standard. Mit TOP ist so etwas ähnliches vorhanden, aber man kann halt nur die TOP 10 oder TOP 20 bekommen und halt nicht zwei Grenzen angeben. Dafür muss man schon etwas mehr tun: Mehr Info hier

sniper_w 8. Mär 2009 10:32

Re: Suche erweiterten DBNavigator!!!
 
Was du eingentlich suchst ist "Paging". Wie schon erwähnt kennt mssql kein LIMIT. Hier ein Beispiel für MSSQL:
SQL-Code:
DECLARE @PageNum AS INT;
DECLARE @PageSize AS INT;
SET @PageNum = 2;
SET @PageSize = 10;

WITH OrdersRN AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
          ,OrderID
          ,OrderDate
          ,CustomerID
          ,EmployeeID
      FROM dbo.Orders
      -- hier kommen zusätzlichn Bedingungen, z.B.
      -- Where OrderDate < '1.1.2009'
)

SELECT * 
  FROM OrdersRN
 WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 
                  AND @PageNum * @PageSize
 ORDER BY OrderDate
         ,OrderID;
Quelle: http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx( "gegoogelt" in 15 sec )

romber 9. Mär 2009 17:53

Re: Suche erweiterten DBNavigator!!!
 
Vielen Dank! Es klappt!


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