Newsgroup: it.comp.www.asp
Titolo: Messaggio lungo: Paginazione e collegamenti

Ciao, non riesco a capire perchè vengono persi i risultati (o i
parametri?) della mia query quando li divido su più pagine.
Mettiamo che voglia 3 record per pagina: se la query ne trova 8, la
prima pagina, sarà PAGINA 1 DI 3, e fin qui funziona. Se vado sulla
pagina successiva però, mi trovo di fronte a un  PAGINA 2 DI 5, e a
gruppi di tre (PAG. 3 DI 5 ecc.) mi vengono dati tutti i record (è un
DB di prova con 14 record), a partire dal quarto del DB (perchè si
ricorda che tre li ha già estratti). Questo è il listato, sperando che
qualcuno abbia la pazienza di leggerlo e la voglia di suggerirmi una
soluzione.
<%    Response.Expires = 0  %>
<html><head><title>Ricerca</title></head>
<body>
<% 
Select Case Request.QueryString("Direction")
	Case ""
		Session("CurrentPage") = 1
	Case "Next"
		Session("CurrentPage") = Session("CurrentPage") + 1
	Case "Previous"
		Session("CurrentPage") = Session("CurrentPage") - 1
End Select
Const adOpenKeyset = 1
Dim conn
Dim objRecordset
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("Immobili") 
Dim strSQL
strSQL = "SELECT * FROM Tabella"
strSQL = strSQL & " WHERE (zona LIKE '%" & Request.Form("zona")&"%')"
& _ 
         "AND (piano LIKE '%" & Request("piano") & "%')"
& _
         "AND (locali LIKE '%" & Request("locali") & "%')"
 
If Request.Form("prezzo") = "Sotto i cento" Then
   strSQL = strSQL & " AND(prezzo < 100)"
Else If Request.Form("prezzo") = "Da 100 a 200" Then
  strSQL = strSQL & " AND(prezzo >= 100 AND prezzo < 200)"
Else If Request.Form("prezzo") = "Oltre 200" Then
 
   strSQL = strSQL & " AND(prezzo >= 200)"
End If
End If
End If  
Set objRecordset = Server.CreateObject("ADODB.Recordset")
objRecordset.PageSize= 3
objRecordset.Open strSQL, conn, adOpenKeyset
objRecordset.AbsolutePage = CLng(Session("CurrentPage"))  %>
<% If objRecordset.BOF and objRecordset.EOF Then %>
 
              <h1>Sorry, no results</h1>
<%Else%>
<%If Not objRecordset.EOF Then%> 
<p><h1>Pagina <%=Session("CurrentPage")%> di
<%=objRecordset.PageCount%></h1></p> 
    <h2>Risultati della ricerca:</h2>
<table>
<tr>
<th>Indirizzo</th>
<th>Zona</th>
<th>Prezzo</th>
<th>Metri quadri</th>
<th>Piano</th>
<th>Locali</th>
</tr>
<%
	Dim i
	For i = 1 To objRecordset.PageSize
	If objRecordset.EOF Then
	Exit For
	End If
%>
<tr>
 <td><%=objRecordset("indirizzo")%></td>
 <td><%=objRecordset("zona")%></td>
 <td><%=objRecordset("prezzo")%></td>
 <td><%=objRecordset("metri quadri")%></td>
 <td><%=objRecordset("piano")%></td>
 <td><%=objRecordset("locali")%></td>
</tr>
	<%
	objRecordset.MoveNext
	Next
	%>
</table>
<%If CLng(Session("CurrentPage")) < objRecordset.PageCount Then %>
<br>
<br>
<p><a href="esperimento.asp?Direction=Next">Pagina successiva</a>
</p><%End If%>
<%If CLng(Session("CurrentPage")) > 1 Then %>
<p><a href="esperimento.asp?Direction=Previous">Pagina
precedente</a></p>
<%End If%>
<%
     End If
     End If
     objRecordset.Close
     conn.Close
     Set objRecordset = Nothing
     Set conn = Nothing    %>
</body></html>
Grazie comunque

objRecordset.AbsolutePage = CLng(Session("CurrentPage"))  %>
Non so se causa il tuo problema, ma c'e' qualcosa che non mi quadra: visto
che ogni volta che chiami la pagina ricostruisci l'sql e non usi variabili
di sessione, mi chiedo se request.form sia ancora in grado di restituirti i
valori iniziali o se invece non ti dia campi vuoti costruendoti cosi'
recordset con selezioni diverse.
Giorgio Leonardi

Il problema sta nel fatto che ad ogni richiesta di una nuova pagina, lo
script usa le variabili Request.Form("zona"), Request.Form("piano"),
Request.Form("locali"), ecc. per ricostruire la query. Queste variabili,
pero' non vengono rispedite tutte le volte, e quindi, a partire dalla
seconda volta, la query viene creata come se il form iniziale fosse stato
vuoto (estraendo  quindi tutti i record).
Soluzioni:
1. Rispedisci ogni volta i dati del form
2. La prima volta salva i dati del form, o meglio la query sql, in una
variabile Session per riutilizzarli poi in seguito.
3. Esegui la query solo una volta e memorizzi l'intero recordset in una
variabile Session
Ciao
Stefano

 variabile Session
Ciao !!
Avendo anch'io un problema di paginazione di x record, ti chiedo di
spiegarmi meglio cosa intendi per Sesson (scusa se la domanda č stupida, ma
sono neofita in questa materia e mi sto avvicinando ora all'ASP)
Mailto:
dcar...@intrasystem.com

sono neofita in questa materia e mi sto avvicinando ora all'ASP)
In asp esiste un oggetto globale chiamato Session, la cui utilita'
principale e' quella di mantenere il valore di alcune variabili per tutta la
durata della sessione utente. Senza tale oggetto, infatti le variabili
"muoiono" al termine dell'elaborazione della singola pagina.
A questo scopo e' sufficiente scrivere
Session("nomevar") = valorevar
per creare una variabile session chiamata nomevar e per assegnargli il
valore valorevar
Per utilizzare il contenuto della variabile session e' sufficente indicarla
con
Session("nomevar")
All'interno di una qualunque istruzione, proprio come se fosse una variabile
normale.
Ciao
stefano

pagina successiva però, mi trovo di fronte a un  PAGINA 2 DI 5, e a
Riassumo il mio post precedente in una domanda:
come faccio a non perdere il dato (o i dati) che è stato inserito nel
form quando rieseguo la pagina ASP...perchè è proprio questo il
problema. Non so però come tradurlo, cioè come codificarlo.
 Infatti se:
A) inserisco un controllo del tipo:
 "se tutti i request.form sono vuoti"
 mostrami un "sorry no results"
B)passo alla select (dal form.html) una o due stringhe
allora:
A)nella prima pagina la query che deriva dai criteri immessi nel form
viene eseguita correttamente e vengon estratti i primi record.
B)la pagina successiva mi da' un  "sorry no results" (perchè non si
"ricorda" più cosa è stato inserito nel form) 
Grazie per gli eventuali suggerimenti
PRINTF...@iol.it
Per rispondere togliere printf dall'indirizzo


Mi sa che hai visto giusto, infatti č quello il problema (request.form
NON mi restituisce i valori iniziali, non č piů in grado di farlo).
Come si utilizzano perň le variabili di sessione?
ciao


problema. Non so però come tradurlo, cioè come codificarlo.
Invece del blocco di istruzioni che costruisce la query metti qualcosa del
tipo
....
if (Session("miaquery") = "") then
    ...
    Costruisci la query nella variabile strSQL (come nell esempio che hai
postato)
    ...
    Session("miaquery") = strSQL
else
    strSQL = Session("miaquery")
end if
...
Ciao
Stefano

Come si utilizzano perň le variabili di sessione?
Semplicemente scrivendo:
session("nomevariabile")
ad es.:
session("campo1")=request.querystring("campo1_del_form1")
Nel tuo caso potresti mettere in sessione anche il recordset sostituendo
session("rs") ad ogni riferimento di rs: ovviamente devi pero' modificare
l'asp in modo che soltanto la prima volta componga l'sql ed effettui l'open
del recordset.
Per fare questo ci sono vari metodi, uno per es. e' quello di passare un
parametro che, se compilato, vuol dire che deve comporre l'sql.
Giorgio Leonardi