Un affichage multi-pages, fonctionnalité parfaite d'un site internet qui se respecte !!
Non pas que le tutorial de Didier sur la pagination ne soit pas bon, bien au contraire, mais il a malheureusement ses limites ...
Posons plus sérieusement le problème :
Que fait le Script de Pagination :
Dans le tutorial, on ouvre la base de données et on loop sur les résultats en affichant que ceux qui nous intéressent.
Et c'est malheureusement la que se trouve la limite, j'utilisai ce genre de scripts jusqu'au jour ou ma table a passée le million d'enregistrements. Le temps d'affichage de la page devenait de plus en plus long au fur et à mesure que j'avancais dans mes pages.
Utiliser les propriétés de l'objet ADO pour ne ressortir que les enregistrements nécessaire et ne plus faire de loop sur tous les résultats au moyen d'une seule et unique fonction VBScript.
La page ASP :
Cette page affiche les résultats de la requete SQL
<% ' On recupere la page a afficher ' La premiere page en ADO est la page 0 if Request("f_laPage").Count > 0 then laPage = Request("f_laPage") else laPage = 0 end if ' On declare le Nombre par de résultats Page nbParPage = 10 ' On cree sa requete SQL SQL = "SELECT LogDate, FullName FROM dbo_kmTopicLog ORDER BY LogDate;" ' On appelle la fonction dbSelectPage tempPage = dbSelectPage(SQL, laPage, nbParPage) %> <html> <head> <title>Multi-Pages</title> </head>
<body> <form name="maForm" action="?" method="post"> <blockquote> <% If IsArray(tempPage) Then ' Si la fonction a renvoyé au moins un résultat, on affiche ' On recupere le String de Gestion des Pages leString = tempPage(0) ' On recupere l'Array Multi-Dimensionnel ' contenant les résultats de la requete SQL tempArray = tempPage(1) ' On affiche les résultats For i = 0 to UBound(tempArray, 2) %> - <%response.write tempArray(1, i)%> <br> <% Next Else ' La fonction ne renvoie pas de résultat %> Il n'y a pas de résultats <% End If %> <br> <% ' On affiche le String de Gestion des Pages Response.Write leString %> </blockquote> </form> </body> </html>
Fonction dbSelectPage :
Cette fonction VBScript recupere les résultats de la requete SQL et construit un String pour la Gestion des Pages
Public Function dbSelectPage(cmdSQL, laPage, nbParPage) ' Cette fonction permet l'execution d'une commande SQL sur la base en lecture ' Et retourne un nombre désiré d'enregistrement pour un affichage multi-pages ' Le resultat est renvoyé via un Array Mutli-dimensionnel ' Gestion des Erreurs : ' - Code Erreur -1 : cmdSQL vide ' - Code Erreur -2 : RecordSet vide ' Parametres de la fonction ' - cmdSQL : requete SQL ' - laPage : page a afficher ' - nbParPage : nombre de résultats par page Const adOpenStatic = 3 Const adLockReadOnly = 1 Const adCmdText = 1 If Trim(cmdSQL) <> "" Then ' Si la requete n'est pas vide Set rst = Server.CreateObject("ADODB.RecordSet") ' On ouvre le RecordSet en lecture seule ' dbOpen() etant une fonction de connexion a la base de données rst.Open cmdSQL, dbOpen(), adOpenStatic, adLockReadOnly, adCmdText If rst.RecordCount > 0 Then ' On verifie la presence d'au moins un resultat ' On recupere le nombre total de résultats leTotal = rst.RecordCount ' On determine le Premier résultat qui nous interesse ' en fonction de la page a afficher et du nombre de resultats par page lePremier = laPage * nbParPage + 1 ' On determine le Dernier résultat qui nous interesse leDernier = laPage * nbParPage + nbParPage ' On determine l'index du Premier résutlat dans le RecordSet leMove = nbParPage * laPage If leDernier > rst.RecordCount Then ' Si le Dernier résulat est supérieur au nombre total leDernier = rst.RecordCount End If ' On affecte le nombre de resultats par page a la propriete ADO PageSize rst.PageSize = nbParPage ' Cela nous permet de récuperer le nombre total de Pages leNbPages = rst.PageCount - 1 ' On se deplace dans le RecordSet pour pointer ' le Premier enregistrement de la page a afficher rst.Move leMove ' On stock dans un Array multi-dimensionnel ' le nombre de résultats désirés ce qui évite de ' de ressortir un million de résultats pour n'en ' afficher que 10 par exemple tempArray = rst.GetRows(nbParPage) Else ' Gestion erreur RecordSet vide leTemp = -2 End If ' On ferme la connexion a la base ' dbClose etant une subroutine fermant ' les objets de connexion dbClose ' On construit le String de Gestion des Pages imgOpt = " border=""0"" width=""21"" height=""15"" align=""bottom""" ' On insere un Hidden field pour la fonction Javascript ' de déplacement inter-pages leString = "<input type=""hidden"" name=""f_laPage"" value=""" & laPage & """>" & vbCrLf ' On insere la fonction Javascript de déplacement inter-pages leString = leString & "<script language=""JavaScript"">" & vbCrLf leString = leString & "function goToPage(unePage) {" & vbCrLf leString = leString & " document.forms[0].f_laPage.value = unePage;" & vbCrLf leString = leString & " document.forms[0].action = ""?"";" & vbCrLf leString = leString & " document.forms[0].submit();" & vbCrLf leString = leString & "};" & vbCrLf leString = leString & "</script>" & vbCrLf ' On insere les résultats en cours (ex: 1 à 10 sur 20) leString = leString & "Résultats " & lePremier & " à " & leDernier & " sur " & leTotal & vbCrLf leString = leString & "<br>" & vbCrLf leString = leString & "<br>" & vbCrLf ' On insere le bouton de Première page leString = leString & "<a href=""javascript:goToPage(0);"" border=""0"">" leString = leString & "<img src=""http://www.efrance.fr/moussland/arrow_le.gif""" & imgOpt & ">" leString = leString & "</a>" & vbCrLf If CInt(laPage) = 0 Then ' Si on est en Page 0, page précedente = 0 leString = leString & "<a href=""javascript:goToPage(0);"" border=""0"">" leString = leString & "<img src=""http://www.efrance.fr/moussland/arrow_lo.gif" & imgOpt & ">" leString = leString & "</a> " & vbCrLf Else leString = leString & "<a href=""javascript:goToPage(" & laPage - 1 & ");"" border=""0"">" leString = leString & "<img src=""http://www.efrance.fr/moussland/arrow_lo.gif" & imgOpt & ">" leString = leString & "</a> " & vbCrLf End If ' On affiche la page en cours leString = leString & " " & laPage + 1 & " " & vbCrLf If CInt(laPage) = CInt(leNbPages) Then ' Si on est en derniere Page, page suivante = derniere page leString = leString & "<a href=""javascript:goToPage(" & leNbPages & ");"" border=""0"">" leString = leString & "<img src=""http://www.efrance.fr/moussland/arrow_ro.gif" & imgOpt & ">" leString = leString & "</a>" & vbCrLf Else leString = leString & "<a href=""javascript:goToPage(" & laPage + 1 & ");"" border=""0"">" leString = leString & "<img src=""http://www.efrance.fr/moussland/arrow_ro.gif" & imgOpt & ">" leString = leString & "</a>" & vbCrLf End If ' On insere le bouton de Dernière page leString = leString & "<a href=""javascript:goToPage(" & leNbPages & ");"" border=""0"">" leString = leString & "<img src=""http://www.efrance.fr/moussland/arrow_re.gif" & imgOpt & ">" leString = leString & "</a> " & vbCrLf ' On affiche le nb total de pages leString = leString & " sur " & leNbPages + 1 & " Pages" & vbCrLf ' On declare un array mutli-dimensionnel ReDim leTemp(2) ' On stock le String Gestion des Pages leTemp(0) = leString ' On stock l'array de résultats leTemp(1) = tempArray Else ' Gestion erreur commande SQL vide leTemp = -1 End If ' On retourne le resultat dbSelectPage = leTemp End Function
En esperant que tout ceci vous aide dans vos développements futurs ...