Affichage par page du résultat d'une requête

Description

Lorsque que le résultat d'une requête retourne beaucoup d'enregistrements, il peut être utile de l'afficher sur plusieurs pages. Cette source le fait pour des photos. Le détails des photos (chemin, width, height, titre, description, etc) est entreposé dans une table SQL.

Source / Exemple :


<!-- #include file="include/constantes.asp" -->
<html>
<head>
  <title>Result</title>
</head>
<%
'---------------------------------------------------------------
'-------------------Déclaration des variables-------------------
'---------------------------------------------------------------
Dim I                'As Integer
Dim strHTLM          'As String
Dim strPage          'As String
Dim intNbrEnregis    'As Integer
Dim intPhotoAffiche  'As Integer
Dim intPhotoTotal    'As Integer
Dim boFinPhoto       'As Boolean
Dim intNbrPage       'As Integer
Dim intNbrCol        'As Integer 

'---------------------------------------------------------------
'-----------Création de la connection et du recordset-----------
'---------------------------------------------------------------
Set Conn = Server.CreateObject("ADODB.Connection")	
Conn.Open DB_CONNECTION_STRING 'Définit dans le #Include File
set rs = server.CreateObject("ADODB.RECORDSET")

'---------------------------------------------------------------
'------------------Définition des Variables---------------------
'---------------------------------------------------------------
'Variables pour la pagination
intNbrEnregis   = 25		'Nombre de photos par pages
intPhotoAffiche = 0     'Nombre de photos affichées sur la page en cours
intPhotoTotal   = 0     'Nombre de photo au total
intNbrCol       = 5     'Nombre de photos par rangée
strPage         = TRIM(Request.QueryString("page")) 'la page que l'on veut afficher

IF strPage = "" THEN 
  strPage = 0
END IF

'Variables pour la requête
ReqSql = "SELECT * FROM Photo"
ReqSql = ReqSql & " Where Ce_que_vous_voulez"
ReqSql = ReqSql & " ORDER BY PhotoId" 'C'est important de définir un ordre immuable, surtout si vous utiliser SQL

'---------------------------------------------------------------
'-------------------Exécution de la requête---------------------
'---------------------------------------------------------------
Rs.Open ReqSql, Conn
Rs.MoveFirst

'---------------------------------------------------------------
'-------------------Affichage des résultats---------------------
'---------------------------------------------------------------
do While Not Rs.EOF
  intPhotoTotal = intPhotoTotal + 1
	Rs.MoveNext
Loop

Response.Write "Il y a " & intPhotoTotal & " photo(s)."

IF Rs.EOF AND Rs.BOF THEN
  Response.Write "<FONT SIZE=+3 COLOR=""#357A95""><DIV ALIGN=""center"">Il n'y a de photos pour cette requête</DIV></FONT>"
ELSE
  Rs.MoveFirst
  Rs.Move (strPage * intNbrEnregis)
  
  on error resume next
  
  Do While Not Rs.EOF
    For I = 1 to intNbrCol
      intPhotoAffiche = intPhotoAffiche + 1      
      If I = 1 then 'prépare une nouvelle rangée
        Response.Write "<tr>"
      End If
      
	    strHTML = "<td><A HREF=""model.asp?Id=" & Rs.Fields("PhotoId") &""" alt="""" border=""0""></a></td>"
      Response.Write (strHTML) 'En cliquant sur la photo, celle-ci s'agrandit selon les paramêtres recueillit dans la BD
      
      If I = intNbrCol then 'Ferme la rangée
        Response.Write "</tr>"
      End If
  	  Rs.MoveNext
 	  
 	    If Rs.EOF then
        If I <> intNbrCol then 'Ferme la rangée si le recordset est terminé mais que la rangé ne l'est pas
	        Response.Write "</tr>"
	      End If
	      Exit For 'Il n'y a plus de photos à afficher
	    End If
	    
    Next
    
    If intPhotoAffiche = intNbrEnregis Then 'On arrête l'affichage
      Exit Do
    End If
    
  Loop
END IF
%>
</table>
<br>
<font face="Arial, Helvetica, sans-serif" size="2"> 
<%If intPhotoTotal > intNbrEnregis Then 's'il y a plus de photos que permis sur une page
    'définir le nombre de pages requises
		If intPhotoTotal mod intNbrEnregis > 0 then 
		  intNbrPage = 1
		Else
		  intNbrPage = 0
		End if 
		intNbrPage = IntNbrPage + (intPhotoTotal \ intNbrEnregis) 

    'définir le nom des pages (De quelle photos à quelle photos) ex: | 1-25 | 26-43 |
		Response.Write "| "
		For I = 0 to intNbrPage -1 
		  If I <> IntNbrPage - 1 then
		    Response.Write "<a href=""Result_By_Page.asp?page="& I &""">" & 1 + (I * intNbrEnregis) & "-" & intNbrEnregis + (I * intNbrEnregis) & "</a>"
		  Else
		    Response.Write "<a href=""Result_By_Page.asp?page="& I &""">" & 1 + (I * intNbrEnregis) & "-" & (I * intNbrEnregis) + (intPhotoTotal - (I * intNbrEnregis)) & "</a>"
		  End If
		  Response.Write " | "
		Next
	End If%>
</font> 
</body>
</html>
<%
Rs.Close
Conn.close
Set Rs = nothing
set Conn = nothing
%>

Conclusion :


1- DB_CONNECTION_STRING est définit dans un le #Include File. Voyez les codes sources sur ce site pour savoir comment faire.

2- Assurez vous de bien définir la clause ORDER BY sur un champ Identity si vous voulez que le résultat s'affiche toujours dans le même ordre.

3- Évitez de faire plusieurs Response.Write comme j'ai fait. Mettez-les plutôt dans une variable que vous imprimez à la toute fin de la procédure. Cela sauvera beaucoup de requête aux serveurs.

4- Visitez http://www.lesetoiles.com sous la rubrique "Galerie de photos". Vous y trouverez un exemple fonctionel.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.