paging through getrows
Tobi
- vb-script
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
Nachtrag:
Oder sollte ich da blaettern mit variablenuebergabe und LIMIT im SQL Statement machen?
Gruss Tobi
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
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
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:
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
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 ifrs.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
Hi, hallo
zur Messmethode:
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
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
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