Dans cette fiche...

<Retour ASP>

Début de page Principe

4 améliorations intéressantes du listing précédent :

Début de page Listing de la page ASP

<%@ LANGUAGE="VBSCRIPT" %>
<HTML>

<HEAD>
<TITLE>Exemple</TITLE>
</HEAD>

<BODY>
<%
	dim objConnect
	dim objRecordset, objRecordset2

	set objConnect = Server.CreateObject("ADODB.Connection")
	objConnect.Open "WebDB"
	set objRecordset = Server.CreateObject("ADODB.Recordset")
	strSQL = "SELECT * FROM [rqt Sites+Catégorie] ORDER BY DateEnreg DESC;"
	objRecordset.Open strSQL, objConnect, 3
%>

<P><FONT FACE="Verdana" COLOR="#004080"><BIG><BIG><STRONG>
Liste des sites
</STRONG></BIG></BIG></FONT></P>
<FONT FACE="Verdana" SIZE="3">
<%=objRecordset.RecordCount %> sites...
</FONT>

<P>
<FONT FACE="Verdana" SIZE="2">
<%
	intSite = 1
	Do While not objRecordset.eof
%>

<!-- Un site -->
<DIV ALIGN="center"><CENTER>

<TABLE border="0" width="80%" cellspacing="1" cellpadding="2">
  <tr>
    <td width="50%" colspan="2" bgcolor="#004080"><img src="icoTriangleRouge.gif"
    width="10" height="10"> <font color="#FFFFFF"><strong>
    <%=intSite & " - " & objRecordset("NomSite")%>
    </strong></font></td>

    <td width="50%" colspan="2" bgcolor="#ECECF4"><p align="right">
<% if objRecordset("WebMaster") <> "" then 
	Response.Write("WebMaster : " & objRecordset("WebMaster"))
   end if
%>
</td>

  </tr>
  <tr>
    <td width="100%" colspan="4" bgcolor="#ECECF4">
    <%
	' Supprimer les dièses et les portions d'URL inutiles
	strURL = objRecordset("URL")
	i = InStr(strURL, "#")
	if i > 0 then strURL = mid(strURL, i)
	strURL = Replace(strURL, "#", "")
	
	' Créer un lien hypertexte en HTML
	Response.Write("<A HREF=" & chr(34) & strURL & chr(34) & ">" & strURL & "</A>")
    %>
  </td>
  </tr>

  <tr>
    <td width="25%" bgcolor="#ECECF4" align="center"><%=objRecordset("Catégorie")%></td>
    <td width="25%" bgcolor="#ECECF4" align="center"><%=objRecordset("Langue")%></td>
    <td width="25%" bgcolor="#ECECF4" align="center"><%=objRecordset("DateEnreg")%></td>
    <td width="25%" bgcolor="#ECECF4" align="center">
    <%
	n = objRecordset("Note")
	for i = 1 to n
		Response.Write( "<IMG SRC=" & chr(34) & "icoBouleOrange.gif" & chr(34)&">" )
	next
    %>
  </td>
  </tr>

  <tr>
    <td width="100%" colspan="4" bgcolor="#D5EAFF"><font color="#000000">
	<% if Isnull(objRecordset("Description")) then
		Response.Write("&nbsp;")
	   else
		Response.Write(objRecordset("Description"))
	   end if
	%>
    </font></td>
  </tr>

</TABLE>
</CENTER></DIV>

&nbsp;

<%		
	objRecordset.MoveNext
	intSite = intSite + 1
	loop

	set objRecordset=nothing
	set objRecordset2=nothing
	set objConnect=nothing
%>
</FONT>
</P>
</BODY>
</HTML>

 

Début de page Le listing en détail...

Seules les nouveautés sont commentées, et pour faciliter la compréhension, les parties de code VBScript ont été regroupées de façon logique.

objRecordset.Open strSQL, objConnect, 3
...
<%=objRecordset.RecordCount%> sites...
Ce sont ces lignes qui gèrent l'affichage du nombre de sites.
Une première différence à l'ouverture de la requête : la valeur 3 (jamais utilisée auparavant) permet d'indiquer qu'il s'agit d'une requête statique (ou curseur statique). Sans entrer dans les détails ici, sachez que :
  • il existe 4 types de requêtes (ou curseurs)
  • si vous omettez le type, c'est la valeur 0 qui est prise en compte. Ce type de requête autorise seulement une lecture de la 1ère ligne à la dernière, mais pas de retour en arrière, ni de décompte.
  • la valeur 3, au contraire permet tout type de déplacement, et le décompte de valeurs.

Une fois la requête ouverte en mode 3, on peut utiliser sa propriété RecordCount qui donne le nombre d'enregistrements (ici, le nombre de sites).

Essayez de supprimer la valeur 3 et relancez la page Asp, pour voir...

 
<%
	intSite = 1
	Do While not objRecordset.eof
%>
...
<%=intSite & " - " & objRecordset("NomSite")%>
...
<%		
	objRecordset.MoveNext
	intSite = intSite + 1
	loop
%>
Pour numéroter chaque site, on utilise une variable intSite, qui est initialisée à 1 avant la boucle.
Ensuite, à chaque fois qu'on affiche un nom de site, il suffit d'afficher également la valeur actuelle de intSite.
En fin de boucle, lorsqu'on passe au site suivant par MoveNext, il ne faut pas oublier d'augmenter aussi la valeur de intSite. Et hop !
 
<%
	n = objRecordset("Note")
	for i = 1 to n
		Response.Write( "<IMG SRC=" & chr(34) & "icoBouleOrange.gif" & chr(34)&">" )
	next
%>
Auparavant, la note était affichée via <% =objRecordset("Note") %>
Pour attirer l'attention, nous avons décidé d'afficher une image à la place. En fait, 1 image pour une note de 1, 2 images pour une note de 2, et ainsi de suite jusqu'à 5.

En HTML, l'insertion directe de l'image icoBouleOrange.gif se ferait par :
<IMG SRC="icoBouleOrange.gif">
Et pour placer plusieurs images, il faudrait dupliquer ce code n fois.

C'est ce que fait notre boucle FOR/NEXT : elle répète n fois l'insertion d'une image, mais de façon dynamique.
Pour ce qui est du code HTML d'image, on aurait pu écrire plus simplement :
Response.Write( "<IMG SRC=icoBouleOrange.gif>" )
... ce qui fonctionne aussi bien. Par contre, le code HTML final ne comporte pas les guillemets (moins standard ?)

Comme le Response.Write comporte déjà des guillemets, il est impossible de taper :
Response.Write( "<IMG SRC="icoBouleOrange.gif">" )
On est donc obligé de tronçonner la chaîne au niveau des guillemets, et de refaire un collage via l'opérateur &.
Le code des guillemets sera remplacé par Chr(34) (sous-entendu : le caractère numéro 34).

 
<%
	' Supprimer les dièses et les portions d'URL inutiles
	strURL = objRecordset("URL")
	i = InStr(strURL, "#")
	if i > 0 then strURL = mid(strURL, i)
	strURL = Replace(strURL, "#", "")
	
	' Créer un lien hypertexte en HTML
	Response.Write("<A HREF=" & chr(34) & strURL & chr(34) & ">" & strURL & "</A>")
%>
Autre difficulté : comment rendre l'URL du site cliquable ?

En théorie, en combinant un lien HTML et ce que vous avez vu sur les images (plus haut), il suffirait de produire le code HTML suivant : <A HREF="http://www.unsite.com">www.unsite.com</A>
En bleu : le code HTML gérant le lien, en noir : ce que voit le visiteur.
C'est ce que fait la ligne :
Response.Write("<A HREF=" & chr(34) & strURL & chr(34) & ">" & strURL & "</A>")
en gérant les guillemets et en plaçant l'adresse du site dans une variable strURL.

L'autre problème, vu dans les listings précédents, est que nous avons eu la mauvaise idée de gérer l'URL dans Access sous forme de champ "Lien hypertexte", et que ce #?+%& d'Access nous donne l'URL sous la forme suivante : www.unsite.com#http://www.unsite.com#

On obtiendrait un lien HTML du style :
<A HREF="www.unsite.com#http://www.unsite.com#">www.unsite.com#http://www.unsite.com#</A>
qui ne fonctionnerait pas.

Voilà comment rectifier le tir :

  • L'idée est de trouver le 1er signe #, puisque l'adresse réelle commence à ce niveau. La fonction InStr(strURL, "#") permet cette recherche. Elle donne la position du 1er dièse trouvé (ou 0 sinon).
  • Si un # a été trouvé, on extrait la portion d'URL qui démarre à ce niveau, grâce à Mid(strURL, i). Mid() extrait une portion de chaîne à partir d'un caractère donné. On obtient #http://www.unsite.com#, ce qui est quand même mieux !
  • Enfin, pour supprimer les #, on fait appel à la fonction Replace(strURL, "#", "") qui remplace dans strURL tous les # par une chaîne vide. Ouf !

Faites comme moi, allez faire un tour, ça ira mieux après :o) !