Tobi: paging through getrows

Hallo,
vorab: ich bin immernoch ein ASP-Anfaenger, also habt bitte Geduld mit mir...;o)...

Folgendes Problem habe ich: Eine Access-DB auf einem Windows Server (noch nicht das ganze Problem! ;). Habe in Tutorials herausgefunden, das getrows die beste Methode zum ausgeben der recordsets ist, baue gerade die Seite um.

Aber ich moechte gerne, dass der User durch die results blaettern kann...wie mache ich das dann mit dem array?

Vorher habe ich mit do ... while schleife gearbeitet nach dem motto:
do while not rs.eof and rs.gesamteanzahlderseiten = rs.aktuelleseite und gesetzter rs.pagesize.

Jetzt sieht mein Code so aus:

<% if rs.EOF OR rs.BOF then %>
<br>
Fehlermeldung
<br>
<%
 Call CloseAll
 response.end
%>
<% end if %>

<%
 ' get all records with getrows and write to array
  Dim alldata
   alldata = rs.getrows
 ' close rs and con
  Call CloseAll
 ' get number of rows
  Dim numrows
   numrows = ubound(alldata,2)
 ' define field names according to rows
  Dim rs_stanag_number, rs_english_title
   rs_stanag_number = 8
   rs_english_title = 20
%>
Number of records:<%= numrows %>
<br>
<%
 ' loop through array
  Dim rowcounter, stanag_number, english_title
   for rowcounter = 0 to numrows
      stanag_number = alldata(rs_stanag_number,rowcounter)
      stanag_number = cleanfield(stanag_number)
      english_title = alldata(rs_english_title,rowcounter)
      english_title = cleanfield(english_title)

'write results
      response.write stanag_number
      response.write english_title
      response.write "<br>"
   next
 ' loop through array end
%>

<%
 ' sub close rs and con
  sub CloseAll
   rs.close
   set rs=nothing
   con.close
   set con=nothing
  end sub

' function clean fields
  function CleanField(rs_value)
   cleanfield=rs_value
   if isnull(rs_value) then
    cleanfield=" "
   end if
   if trim(rs_value)="" then
    cleanfield=" "
   end if
  end function
%>

Weitere Fragen:
1. Warum gibt numrows einen um 1 kleineren Wert als die Anzahl der records zurueck? Weil der Array bei 0 anfaengt?
2. Bei der Fehlerschleife wird mit response.end abgebrochen. Dadurch werden im HTML dann z.B. die tags body und html nicht geschlossen. ist das schlimm? Ist dann immerhin nicht valider Code....

Bin Euch fuer Anregungen dankbar.

Danke und Gruss,
Tobi

  1. Nachtrag:

    Oder sollte ich da blaettern mit variablenuebergabe und LIMIT im SQL Statement machen?

    Gruss Tobi

  2. Hi, hallo

    okay ... zu deiner Frage 1:

    Arrays sind in VBS immer 0-basiert

    zu Frage 2:

    warum brichst du die Ausgabe ab? lass sie doch auslaufen. Du solltest die Prozeduren so anlegen, dass sie vom korrekten HTML eingerahmt werden
    <html>
    <head/>
    <body>
    <% anzeige_datensätze %>
    </body>
    </html>

    ausserdem handelt es sich bei .eof nicht um einen Fehler sondern um einen Zustand, der behandelt wird.

    Habe in Tutorials herausgefunden, das getrows die beste Methode zum ausgeben der recordsets ist,...

    Was liest du denn für Tutorials ? ;-)

    ich verstehe nicht, warum geraten wird, aus schönen Recordsets, die man ja hervorragend navigieren kann, erst mehrdimensionale Arrays zu machen und die dann zu iterieren?

    Wie meinst du das mit dem Blättern?  (1) Soll der Surfer clientseitig hin und her springen können zwischen den Records oder (2) willst du ihm nur immer seitenweise eine Menge an Recordsets anzeigen, wo er seitenweise weiter/zurückschalten kann.

    (1) dann mußt du dem Browser alle Datensätze mit einem Mal schicken und die Blätterung mit DHTML / JS machen

    (2) du mußt mit ASP/VBS auf dem Server festlegen, wieviele und welche Datensätze (Offset + Menge) ausgeliefert werden

    ??

    Tschau, tschüß,
    Frank

    1. Hallo Frank, (aus Ulm?)

      Arrays sind in VBS immer 0-basiert

      hab ich mir gedacht.

      zu Frage 2:

      warum brichst du die Ausgabe ab?

      OK. dann besser mit if - else schleife....

      ausserdem handelt es sich bei .eof nicht um einen Fehler sondern um einen Zustand, der behandelt wird.

      okok...hast ja recht.

      Was liest du denn für Tutorials ? ;-)

      ich verstehe nicht, warum geraten wird, aus schönen Recordsets, die man ja hervorragend navigieren kann, erst mehrdimensionale Arrays zu machen und die dann zu iterieren?

      Angeblich sei diese methode schneller und wuerde die Systemressourcen (server) weniger beanspruchen, v.a. bei grosser anzahl von anfragen (google mal nach getrows, da wirst du das ueberall lesen koennen...). Ist das Deiner erfahrung nach nicht so?

      Wie meinst du das mit dem Blättern?  (1) Soll der Surfer clientseitig hin und her springen können zwischen den Records oder (2) willst du ihm nur immer seitenweise eine Menge an Recordsets anzeigen, wo er seitenweise weiter/zurückschalten kann.

      Wenn ich Dich richtig verstanden habe, die zweite variante.

      (2) du mußt mit ASP/VBS auf dem Server festlegen, wieviele und welche Datensätze (Offset + Menge) ausgeliefert werden

      Ja, genau. Muss ich dann also z.B. rechnen:
      gesamtzahl der seiten = numrows+1 / pagesize (Anzahl der records, die per Seite angezeigt werden sollen)

      currentpage = request currentpage -> else currentpage = 1

      Links zum blaettern dann mit ...url.asp?currentpage=<%=currentpage +1%> ???

      Aber wie baue ich das dann in die for each schleife ein? Mit Do while waere es ja einfach....

      Gruss aus Amerika,
      Tobi

      1. Hi, hallo

        Hallo Frank, (aus Ulm?)

        ja! :-)  "aus Ulm" ist zwar nicht mein Nachname aber stimmt :-)

        OK. dann besser mit if - else schleife....

        packe deine Ausführungs/Anzeige Routine einfach zwischen

        if not rs.eof then
          ....
        end if

        rs.bof habe ich noch nie gebraucht

        ausserdem handelt es sich bei .eof nicht um einen Fehler sondern um einen Zustand, der behandelt wird.

        okok...hast ja recht.

        war ja als weiterführende Info gedacht ;-)

        Was liest du denn für Tutorials ? ;-)

        ich verstehe nicht, warum geraten wird, aus schönen Recordsets, die man ja hervorragend navigieren kann, erst mehrdimensionale Arrays zu machen und die dann zu iterieren?

        Angeblich sei diese methode schneller und wuerde die Systemressourcen (server) weniger beanspruchen, v.a. bei grosser anzahl von anfragen (google mal nach getrows, da wirst du das ueberall lesen koennen...). Ist das Deiner erfahrung nach nicht so?

        okay, hab mal etwas gegoogelt und rausgefunden, dass es halt den Vorteil bringt:

        • query ausführen
        • recordset ab in ein Array
        • recordset wieder killen und nur mit dem Array arbeiten

        dadurch brauchen bei breitem Massenzugriff nicht gleichzeitig viele ADO-Recordsets geöffnet im Speicher bleiben ...

        das ist mir bislang neu gewesen, danke für den Hinweis. Ich würde das gern mal messen ... was das an vorteilen bringt.

        .... Aber wie baue ich das dann in die for each schleife ein? Mit Do while waere es ja einfach....

        siehe http://www.15seconds.com/issue/010308.htm

        da gibts drei verschiedene Varianten ...

        viel spass :-)

        Tschau, tschüß,
        Frank

        1. Hallo Frank,

          ja! :-)  "aus Ulm" ist zwar nicht mein Nachname aber stimmt :-)

          ..und ich hatte gedacht, es ist der nachname...;)

          OK. dann besser mit if - else schleife....

          packe deine Ausführungs/Anzeige Routine einfach zwischen

          if not rs.eof then
            ....
          end if

          rs.bof habe ich noch nie gebraucht

          Jep, genau so.

          ausserdem handelt es sich bei .eof nicht um einen Fehler sondern um einen Zustand, der behandelt wird.

          okok...hast ja recht.

          war ja als weiterführende Info gedacht ;-)

          Ja, habe ich auch so verstanden, danke fuer die info. ;)

          okay, hab mal etwas gegoogelt und rausgefunden, dass es halt den Vorteil bringt:

          • query ausführen
          • recordset ab in ein Array
          • recordset wieder killen und nur mit dem Array arbeiten

          dadurch brauchen bei breitem Massenzugriff nicht gleichzeitig viele ADO-Recordsets geöffnet im Speicher bleiben ...

          das ist mir bislang neu gewesen, danke für den Hinweis. Ich würde das gern mal messen ... was das an vorteilen bringt.

          Ja genau. Wenn Du das messen solltest - ich waere sehr gerne an der messmethode und deinen ergebnissen interessiert!

          .... Aber wie baue ich das dann in die for each schleife ein? Mit Do while waere es ja einfach....

          siehe http://www.15seconds.com/issue/010308.htm

          da gibts drei verschiedene Varianten ...

          Perfekter Link! Genau das, was ich suchte. Hmm...aber sollte ich jetzt auch auf stored procedures umsteigen...lass kurz ueberlegen...noe. ;) Angeblich soll das aber echt am performatesten sein....

          viel spass :-)

          Habe immer viel spass...besonders nach so konstruktiven threads im selfforum!

          Danke & Gruss aus Amerika,
          Tobi

          1. Hi, hallo

            zur Messmethode:

            • formuliere ein SQL statement
            • öffne die DB-Verbindung
            • setze eine Variable (startTime) vom typ Decimal oder Single auf = timer
            • öffne das Recordset
            • laufe alle Recordsets hab und weise von jedem Recordset einer/mehreren Variablen einen Wert aus dem Datensatz zu (irgendeine existierende Spalte)
            • schließe recordset
            • setze eine zweite Variable (endTime) vom typ Decimal oder single wieder auf = timer
            • subtrahiere startTime von endTime und laß dir die Variable anzeigen.

            mache dasselbe in dem du nachdem ausführen des SQLs gleich das Recordset ins Array schiebst und gleich wieder zumachst.

            evt. mußt du zwischen die Timer-Zeitnahmen mehrere Durchläufe setzen um aussagekräftige Timerdifferenzen zu erhalten. Oder halt entsprechend große Tabellen nehmen (30.000 Einträge und mehr)

            das zu programmieren sollte nicht allzuschwer sein :-)

            zu den 3 Vorschlägen auf der Website da, Stored Procedures müssen nicht immer sein. :-)

            Tschau, tschüß,
            Frank

            1. Hallo Frank,

              zur Messmethode:

              [...]

              das zu programmieren sollte nicht allzuschwer sein :-)

              Hmmm...wahrscheinlich nicht zu schwer, aber zu aufwaendig...;o)

              zu den 3 Vorschlägen auf der Website da, Stored Procedures müssen nicht immer sein. :-)

              Ich bin so gluecklich, dass Du mich in meiner Ansicht bestaetigst! ;o)

              Danke & Gruss
              Tobi

              1. Hi, hallo

                Hmmm...wahrscheinlich nicht zu schwer, aber zu aufwaendig...;o)

                naja ... das auch nicht unbedingt, aber zeit kostet es schon ein wenig und die passenden Scripts hab ich grad nicht parat

                Tschau, tschüß,
                Frank