18 messaggi dal 31 luglio 2002
Per la "paginazione" del recordset e per lo scorrimento delle pagine non ci sono problemi.
Il problema sorge esclusivamente nel momento in cui seleziono una lettera e, di conseguenza, viene eseguita la SELECT utilizzando il metodo .find().
Il recordset paginato che ottengo è "sfogliabile" con i tasti avanti/indietro soltanto in avanti. Ad esempio, se immetto nel .find il parametro "C", vengono visualizzati tutti i record a partire da quelli che iniziano per "C", e posso scorrere i dati fino alla lettera "Z"; ma non posso andare all'indietro, cioè non posso visualizzare gli ultimi record di "B", poi i penultimi di "B" ecc. fino ad "A".
Quello che non ho capito è se utilizzando il metodo .find() in una SELECT posso, in qualche modo, raggiungere questo risultato o se invece i record precedenti quelli ricercati non vengono memorizzati nel recordset.
Non so se sono riuscito a spiegarmi.
Grazie mille comunque per l'aiuto.
11.886 messaggi dal 09 febbraio 2002
Contributi
no, aspetta, tutto è basato sui numeri di pagina.

nel momento in cui una lettera è stata cliccata, es. C, tu col metodo find vai ad un certo record e su quel record devi calcolare la pagina.

I tasti lettera sono praticamente simili ai tasti avanti/indietro, solo che ti permettono di scorrere velocemente più pagine.

Se clicco la lettera T, e il primo record con la T si trova a pagina 50, è come se avessi cliccato 50 volte il tasto "avanti".

Dopo aver cliccato una lettera, se voglio tornare indietro, mi basta cliccare il tasto indietro.

in logica, dovresti procedere così:

1) leggi dalla querystring il numero di pagina e mettilo in una variabile
2) apri il recordset.
3) è stata passata una lettera via querystring?
se si, usa il metodo find, calcola il numero di pagina di questo record e sovrascrivi la variabile che contiene il numero di pagina
se no, valorizza le proprietà .absolutepage e .pagesize (insomma quelle che ti permettono la paginazione veloce)
4) in fondo alla pagina scrivi il numero di pagina corrente e i tasti avanti/indietro.

Se uno non clicca esplicitamente su una lettera, NON passare la lettera via querystring.
Cioè i tasti avanti/indietro devono avere un codice del genere:

pagina corrente: 4
<a href="elenco.asp?pagina=3">avanti</a>
<a href="elenco.asp?pagina=5">indietro</a>

ciao

Enjoy learning and just keep making
18 messaggi dal 31 luglio 2002
Quando applico il metodo .find ottengo con .AbsolutePage sempre il valore " -1 ".
Dove sbaglio?

Posto il nuovo codice:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="adovbs.inc" -->
<!--#include file="../Connections/scuola.asp" -->
<%
dim pagina
dim lettera
pagina = Request.QueryString("pagina")
lettera = Request.QueryString("lettera")

Dim RsLettere_in_DB
Dim RsLettere_in_DB_numRows

Set RsLettere_in_DB = Server.CreateObject("ADODB.Recordset")
RsLettere_in_DB.ActiveConnection = MM_scuola_STRING
RsLettere_in_DB.Source = "SELECT DISTINCT LETTERA_PAGINAZIONE FROM Insegnamenti"
RsLettere_in_DB.CursorType = 0
RsLettere_in_DB.CursorLocation = 2
RsLettere_in_DB.LockType = 1
RsLettere_in_DB.Open()

RsLettere_in_DB_numRows = 0
%>
<%
Dim Repeat2__numRows
Dim Repeat2__index

Repeat2__numRows = -1
Repeat2__index = 0
RsLettere_in_DB_numRows = RsLettere_in_DB_numRows + Repeat2__numRows
%>
<%

RecordsPerPagina = 3

if pagina = "" then
pagina = 1
end if
Set rs = Server.CreateObject( "ADODB.Recordset" )
rs.ActiveConnection = MM_scuola_STRING
rs.CursorType = adOpenStatic
' STRINGA SQL

SQL = "SELECT * FROM INSEGNAMENTI ORDER BY INSEGNAMENTO ASC"

rs.open sql
rs.PageSize = RecordsPerPagina
'Controllo che sia stata passata una lettera

if lettera <> "" then
'e se si, usi il .Find() per spostare il cursore del recordset sul primo record trovato con quella lettera
rs.Find("LETTERA_PAGINAZIONE ='" & lettera & "'")
pagina = rs.AbsolutePage
else
rs.AbsolutePage = pagina
end if
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento senza titolo</title>
</head>

<body><br>
<br>
<table border="0" cellpadding="5" cellspacing="3">
<tr>
<% While ((Repeat2__numRows <> 0) AND (NOT RsLettere_in_DB.EOF)) %>
<td><a href="prova_orario_lez3.asp?lettera=<%=(RsLettere_in_DB.Fields.Item("LETTERA_PAGINAZIONE").Value)%>"><%=UCase(RsLettere_in_DB.Fields.Item("LETTERA_PAGINAZIONE").Value)%></a></td>
<%
Repeat2__index=Repeat2__index+1
Repeat2__numRows=Repeat2__numRows-1
RsLettere_in_DB.MoveNext()
Wend
%>
</tr>
</table>
Elenco: <strong><%=UCase(lettera)%></strong><br><br>
<br>

<%
If rs.Eof=True or rs.Bof=True then
Response.Write "<P>Nessun risultato trovato</P>"
Else

For i=1 to RecordsPerPagina

if Not rs.EOF then
%>
<table width="60%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><%=(rs.Fields.Item("INSEGNAMENTO").Value)%></td>
</tr>
</table>


<%

rs.MoveNext
end if

Next

End if

%><br>
<br>
<%
Response.Write("Pagina corrente = " & pagina & "<br><br>")
Response.Write("Pagine totali = " & rs.PageCount & "<br><br>")
%>
<br>
<br><a href="prova_orario_lez3.asp?pagina=<%=pagina - 1%>">indietro</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="prova_orario_lez3.asp?pagina=<%=pagina + 1%>">avanti</a>

</body>
</html>
<%
RsLettere_in_DB.Close()
Set RsLettere_in_DB = Nothing
%>
<%
rs.Close()
Set rs = Nothing
%>
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
consideriamo la clausola che hai messo nel .find()

rs.Find("LETTERA_PAGINAZIONE ='" & lettera & "'")

in questo modo imponi che il campo LETTERA_PAGINAZIONE sia esattamente uguale alla lettera selezionata.
Nel tuo database questo campo è sempre e solo valorizzato con una lettera? Se si, va bene quello che hai scritto.

Altrimenti per il resto il codice sembra giusto, forse è solo che .AbsolutePage non viene valorizzato automaticamente dopo aver usato il .Find()

Prova un po' con l'usare la proprietà .AbsolutePosition.
anzichè il numero di pagina questo dovrebbe restituirti l'indice del record (che è un numero che può variare da 1 a rs.RecordCount). A questo punto dovresti calcolarti tu la pagina in questo modo:

'e se si, usi il .Find() per spostare il cursore del recordset sul primo record trovato con quella lettera
rs.Find("LETTERA_PAGINAZIONE ='" & lettera & "'")
indice = rs.AbsolutePosition
if indice mod RecordsPerPagina = 0 then
pagina = Int(indice/RecordsPerPagina)
else
pagina = Int(indice/RecordsPerPagina)+1
end if


oppure, se neanche questo dovesse funzionare, tralascia l'uso del .Find e scorri manualmente i record finchè non ne trovi uno con la tua lettera. Esempio:

'e se si, usi il .Find() per spostare il cursore del recordset sul primo record trovato con quella lettera
trovato = false
indice = 0
while (not trovato) AND (not rs.Eof)
indice = indice + 1
if Lcase(rs("LETTERA_PAGINAZIONE")) = Lcase(lettera) then
trovato = true
else
rs.Movenext
end if
wend

finito il ciclo sei posizionato sul primo record da visualizzare. Hai anche una variabile indice che ti fa trovare il numero di pagina, proprio come era stato fatto nell'esempio precedente.

if indice mod RecordsPerPagina = 0 then
pagina = Int(indice/RecordsPerPagina)
else
pagina = Int(indice/RecordsPerPagina)+1
end if


ciao

Enjoy learning and just keep making
18 messaggi dal 31 luglio 2002
Sembra proprio che sia .AbsolutePosition sia .AbsolutePage non funzionino correttamente dopo il metodo .find.

Il ciclo che hai proposto funziona benissimo per quanto riguarda la ricerca della lettera mentre i numeri di pagina che vengono generati non sono esatti. Nel db di prova ho un record con la lettera A, uno con la B, 6 con la C ecc.
Quando clicco su A,B,C il n° di pagina è sempre 1, perciò la navigazione con i tasti avanti/indietro è sballata. Infatti, la prima pagina deve contenere A,B,C la seconda B,C,C la terza C,C,C.
Se vado alla D, il n° di pagina è 3 e tornando indietro con il tasto riesco ad arrivare all'inizio del recordset ma vengono saltati (non visualizzati) gli ultimi due record di C.
Ancora grazie.

<%
dim pagina
dim lettera
pagina = Request.QueryString("pagina")
lettera = Request.QueryString("lettera")

Dim RsLettere_in_DB
Dim RsLettere_in_DB_numRows

Set RsLettere_in_DB = Server.CreateObject("ADODB.Recordset")
RsLettere_in_DB.ActiveConnection = MM_scuola_STRING
RsLettere_in_DB.Source = "SELECT DISTINCT LETTERA_PAGINAZIONE FROM Insegnamenti"
RsLettere_in_DB.CursorType = 0
RsLettere_in_DB.CursorLocation = 2
RsLettere_in_DB.LockType = 1
RsLettere_in_DB.Open()

RsLettere_in_DB_numRows = 0
%>
<%
Dim Repeat2__numRows
Dim Repeat2__index

Repeat2__numRows = -1
Repeat2__index = 0
RsLettere_in_DB_numRows = RsLettere_in_DB_numRows + Repeat2__numRows
%>
<%

RecordsPerPagina = 3

if pagina = "" then
pagina = 1
end if
Set rs = Server.CreateObject( "ADODB.Recordset" )
rs.ActiveConnection = MM_scuola_STRING
rs.CursorType = adOpenStatic
' STRINGA SQL
SQL = "SELECT * FROM INSEGNAMENTI ORDER BY INSEGNAMENTO ASC"

rs.open sql
rs.PageSize = RecordsPerPagina
'Controllo che sia stata passata una lettera

if lettera <> "" then
trovato = false
indice = 0
while (not trovato) AND (not rs.Eof)
indice = indice + 1
if Lcase(rs("LETTERA_PAGINAZIONE")) = Lcase(lettera) then
trovato = true
else
rs.Movenext
end if
wend

if indice mod RecordsPerPagina = 0 then
pagina = Int(indice/RecordsPerPagina)
else
pagina = Int(indice/RecordsPerPagina)+1
end if
else
rs.AbsolutePage = pagina
end if


%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento senza titolo</title>
</head>

<body><br>
<br>
<table border="0" cellpadding="5" cellspacing="3">
<tr>
<% While ((Repeat2__numRows <> 0) AND (NOT RsLettere_in_DB.EOF)) %>
<td><a href="prova_orario_lez2.asp?lettera=<%=(RsLettere_in_DB.Fields.Item("LETTERA_PAGINAZIONE").Value)%>"><%=UCase(RsLettere_in_DB.Fields.Item("LETTERA_PAGINAZIONE").Value)%></a></td>
<%
Repeat2__index=Repeat2__index+1
Repeat2__numRows=Repeat2__numRows-1
RsLettere_in_DB.MoveNext()
Wend
%>
</tr>
</table>
Elenco: <strong><%=UCase(lettera)%></strong><br><br>
<br>

<%
If rs.Eof=True or rs.Bof=True then
Response.Write "<P>Nessun risultato trovato</P>"
Else

For i=1 to RecordsPerPagina

if Not rs.EOF then
%>
<table width="60%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td><%=(rs.Fields.Item("INSEGNAMENTO").Value)%></td>
</tr>
</table>


<%

rs.MoveNext
end if

Next

End if

%><br>
<br>
<%
Response.Write("indice = " & indice & "<br><br>")
Response.Write("Pagina corrente = " & pagina & "<br><br>")
Response.Write("Pagine totali = " & rs.PageCount & "<br><br>")
%>
<br>
<br><a href="prova_orario_lez2.asp?pagina=<%=pagina - 1%>">indietro</a> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="prova_orario_lez2.asp?pagina=<%=pagina + 1%>">avanti</a>

</body>
</html>
<%
RsLettere_in_DB.Close()
Set RsLettere_in_DB = Nothing
%>
<%
rs.Close()
Set rs = Nothing
%>
Modificato da maxalp il 23 settembre 2004 19.38 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ah ok, credo di aver capito.
Se nel db hai:

A,B,C,C,C

cliccando su c la cosa che deve venir fuori è:
pagina:1
A,B,C

mentre adesso la cosa che viene fuori è:
pagina:1
C,C,C

è così?
allora, nel ciclo while aggiungi la parte in grassetto che si trova subito dopo la linea
trovato = true

while (not trovato) AND (not rs.Eof) 
indice = indice + 1 
if Lcase(rs("LETTERA_PAGINAZIONE")) = Lcase(lettera) then 
trovato = true
<b>risali = (indice-1) mod RecordsPerPage
while risali > 0
rs.MovePrevious
risali = risali - 1
wend</b>
else
rs.Movenext 
end if 
wend 


questo dovrebbe servire a risolvere il problema.
ciao
Modificato da BrightSoul il 24 settembre 2004 11.52 -

Enjoy learning and just keep making
18 messaggi dal 31 luglio 2002
Ebbene no..:-)
Quello che sto cercando di fare è:
se nel db ho A,B,C,C,C,C,C,C,D,E,E,E,F,G,G ECC.
Vorrei:
cliccando su A: ABC
cliccando su B: BCC
"" su C: CCC
"" su D: DCC
Ad ottenere questo risulatto ci sono riuscito, ad esempio anche impostando a 2 la variabile "risali"; il problema sono poi i tasti avanti/indietro. Cliccando sulla C riesco ad ottenere una pagina CCC ma viene considerata sempre pag.1 e quindi non posso scorrere all'indietro con i tasti. E ancora, cliccando su D il tasto indietro mi salta gli ultimi record di C.
Ho pubblicato l'esempio su cui sto lavorando:
http://www.ambrajovinelli.com/temp/orario_lezioni.asp
Modificato da maxalp il 24 settembre 2004 16.26 -
11.886 messaggi dal 09 febbraio 2002
Contributi
mmhh... riusciranno i nostri eroi...??

allora cancella la parte in grassetto del post precedente. Si tratta ora di cambiare solamente il criterio con cui vengono calcolate le pagine.

I criteri saranno due: il primo se si usa la lettera, il secondo se si usando i tasti avanti/dietro.

Sposta questo codice:

if indice mod RecordsPerPagina = 0 then
pagina = Int(indice/RecordsPerPagina)
else
pagina = Int(indice/RecordsPerPagina)+1
end if

e mettilo sopra a rs.AbsolutePage = pagina


ora modifica il ciclo while come segue:
while (not trovato) AND (not rs.Eof) 
indice = indice + 1 
if Lcase(rs("LETTERA_PAGINAZIONE")) = Lcase(lettera) then 
trovato = true
if indice mod RecordsPerPagina = 1 then  
pagina = Int(indice/RecordsPerPagina)+1 
else 
pagina = Int(indice/RecordsPerPagina)+2 
end if 
else 
rs.Movenext 
end if 
wend 


attento però perchè il numero totale di pagine potrebbe aumentare di 1 quando usi la ricerca con la lettera.

ciao

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.