Fossi: Datenbankabfrage über mehrere Seiten ausgeben

Hallo erstmal!

Ich hoffe ihr könnt mir hier weiterhelfen.

Also ich habe ein Suchformular das Werte an eine serverseitige ASP übergibt und per VBscript die Datenbankabfrage erledigt.

Nun möchte ich aber daß das Ergebnis (max. 500 DS) über mehrere Seiten,wegen besserer Übersichtlichkeit und schnelligkeit,aufgeteilt wird.

Mein Problem dabei ist daß ich zwar z.B. die ersten 30 Datensätze
anzeigen lassen kann und darunter dann (DS/30) Verweise(mit Werten zur Übergabe an das serverseitige Script) auf die nächsten Seiten legen kann, aber was ist wenn sich in der Zeit in der sich der Nutzer die ersten 30 DS anschaut Datensätze hinzukommen oder gelöscht werden.
Dann sind die Werte die in den Verweisen hinterlegt sind im Zweifelsfall falsch.

Ich würde mich sehr freuen wenn ihr mir dazu ein paar Lösungsansätze liefern könntet.

Schon mal vielen Dank im voraus

FOSSI

  1. Also ich habe ein Suchformular das Werte an eine serverseitige ASP übergibt und per VBscript die Datenbankabfrage erledigt.

    Nun möchte ich aber daß das Ergebnis (max. 500 DS) über mehrere Seiten,wegen besserer Übersichtlichkeit und schnelligkeit,aufgeteilt wird.

    Mein Problem dabei ist daß ich zwar z.B. die ersten 30 Datensätze
    anzeigen lassen kann und darunter dann (DS/30) Verweise(mit Werten zur Übergabe an das serverseitige Script) auf die nächsten Seiten legen kann, aber was ist wenn sich in der Zeit in der sich der Nutzer die ersten 30 DS anschaut Datensätze hinzukommen oder gelöscht werden.
    Dann sind die Werte die in den Verweisen hinterlegt sind im Zweifelsfall falsch.

    Hallo,

    also im Normalfall wird eine Seitenzahl mitgegeben, die du auf der
    empfangsseite ausliest. Etwa so:
    <a href="seite.asp?PN=3">Seite 3</a>

    Auf der Empfangsseite wird die übergebene Seitenzahl ausgelesen:
    <%
    Dim intPageSize
        intPageSize    = 30
    Dim intCounter
        intCounter     = 0
    Dim intCurrentPage
        intCurrentPage = Fix(Request("PN"))
    %>

    Dein Recordset-objekt wird mit der Seitengröße 30 geöffnet
    und es erfolgt dann eine Prüfung, ob es die angeforderte Seite
    auch gibt (Rechnung: objRS.RecordCount / intPageSize)
    <%
    Set objRS = Server.CreateObject("ADODB.Recordset")
        objRS.PageSize = intPageSize
        objRS.Open ...
        If Not objRS.EOF Then
        ' --- Hier erfolgt die Prüfung, ob die angeforderte Seite größer der Seitenanzahl gesamt ist
            intPageCount = objRS.PageCount
            If intCurrentPage > intPageCount Then
                objRS.AbsolutePage = 1
            Else
                objRS.AbsolutePage = intCurrentPage
            End if
            Do While Not objRS.EOF And intCounter < intPageSize
                ....
                objRS.MoveNext
            Loop
        End if
        objRS.Close
    Set objRS = Nothing
    %>

    Danach kannst Du mit folgendem Skript die Links zu den weiteren Seiten ausgeben:
    <% For intCounter = 1 To intPageCount %><a href="seite.asp?PN=<%=intCounter%>">Seite <%=intCounter %></a><% Next %>

    Auf diese Weise kann es dir ziemlich egal sein, ob in der Zwischenzeit
    Sätze hinzugekommen oder gelöscht werden, da die Seiten immer
    dynamisch neu aufgebaut werden.

    Ich hoffe, Dir damit geholfen zu haben.

    Tschau, Stefan

    1. Hallo Stefan

      Deine Lösung ist auf jeden Fall praktikabel, aber nur solange die Anzahl der gefundenen Datensätze auf der ersten Seite nicht ausgegeben wurden.
      Daß war eigentlich der Hintergrund meiner Frage.
      Gebe ich z.B. "250 DS aufgrund ihrer Kriterien gefunden" auf der 1.Seite aus( Datensätze werden nummeriert ausgegeben), und ich komme auf die letze Seite stimmt die Anzahl im Zweifelsfall nicht mehr überein.
      Und eine solche Lösung fände ich sehr unschön.
      Es sollte irgendwas in der Art von Transaktionen sein nur nicht so kompliziert, und immer unter Berücksichtigung der Serverlast(vielleicht irgendwie die DS_ID'S irgendwo speichern oder so ?!?)
      Vielleicht fällt dir ja doch noch was dazu ein.

      Aber trotzdem vielen Dank für dein Lösungsansatz.

      Bis dann

      FOSSI

  2. Nun möchte ich aber daß das Ergebnis (max. 500 DS) über mehrere Seiten,wegen besserer Übersichtlichkeit und schnelligkeit,aufgeteilt wird.
    Mein Problem dabei ist daß ich zwar z.B. die ersten 30 Datensätze
    anzeigen lassen kann und darunter dann (DS/30) Verweise(mit Werten zur Übergabe an das serverseitige Script) auf die nächsten Seiten legen kann, aber was ist wenn sich in der Zeit in der sich der Nutzer die ersten 30 DS anschaut Datensätze hinzukommen oder gelöscht werden.
    Dann sind die Werte die in den Verweisen hinterlegt sind im Zweifelsfall falsch.
    Ich würde mich sehr freuen wenn ihr mir dazu ein paar Lösungsansätze liefern könntet.

    Ich denke, ich wüßte eine Architektur, die Dein Problem lösen könnte. Es wird aber keineswegs billig.

    Was Du willst, ist eine Lebensdauer des Ergebnisses eines SELECT-Vorgangs über einen HTTP-Call hinaus.
    Dabei darf es nicht der Handler des HTTP-Calls selbst sein, der das SELECT durchführt (denn der stirbt zu schnell), sondern ein separater SQL-cache-daemon.
    Du bräuchtest also ein Session-Konzept - etwas, das mehrere Calls als zusammengehörig identifiziert.

    Dein ASP-Skript verbindet sich also nicht mit der Datenbank, sondern mit dem daemon.
    Beim ersten Mal hat es noch keine Session-Kennung; deshalb bekommt es eine vom daemon und muß diese bei allen folgenden Anforderungen angeben, sofern es die Vorteile der Session in Anspruch nehmen will (in Deinem Falle also innerhalb derselben Query blättert).
    Beim nächsten Mal gibt das Skript seine Session-Kennung an, und der daemon erkennt es daran wieder.
    Bei jedem Aufruf kann dsa Skript ein SQL-statement und weitere Parameter angeben (in Deinem Fall z. B. einen Offset). Der daemon ist es, der die Query ausführt und das Ergebnis lokal speichert. Trifft dieselbe Query für eine bekannte Session-Nummer ein, wird sie nicht neu ausgeführt, sondern die gespeicherten Ergebnisse werden verwendet. Will das Skript neue Ergebnisse, dann muß es eine neue Session anfordern.

    Das Problem - wie bei vielen HTTP-artigen Problemen - ist, daß der Anwender sich selten explizit abmeldet. Es sind also Aufräumarbeiten erforderlich, damit der daemon nicht unter der Last seiner Cacheing-Daten zusammenbricht. Vielleicht kann man mit JavaScript (onUnload?) eine Abmeldung erzwingen, aber die Folgeprobleme zu beschreiben erspare ich mir (auch mangels detaillierter eigener Kenntnisse) lieber.
    HTTP ist halt nicht wirklich geeignet für ein Transaktionssystem, und genau das brauchst Du: Eine Transaktion über mehrere Dialogschritte hinweg.