FAQ ASP
FAQ ASPConsultez toutes les FAQ
Nombre d'auteurs : 6, nombre de questions : 44, dernière mise à jour : 15 juin 2021
- Pourquoi j'ai le message "L'appel d'une fonction Sub n'admet pas de parenthèses" ?
- Comment commenter un bloc de code ASP/VBScript ?
- Comment déclare-t-on et/ou redimensionne-t on un tableau ?
- Peut-on effectuer une redirection dans un autre cadre (frame) ?
- Comment lancer un exécutable depuis une page ASP ?
- Comment créer un fichier Word sur le serveur ?
- Comment ajouter des headers qui désactivent le cache d'une page ?
- Comment retourner un objet depuis une fonction et l'utiliser ?
- Comment utiliser les cookies ?
- Comment arrondir un nombre décimal ?
Il existe deux types de fonctions : Dans le 1er cas, on utilise le mot-clé Function. Dans le 2ème cas, on peut utiliser indifférement le mot-clé Function ou le mot-clé Sub, même si par convention on utilise plutôt Sub. On parle alors de procédure. Et comme vous le signifie le message d'erreur, l'appel d'une procédure (i.e. d'une fonction sans valeur de retour) s'écrit sans parenthèses. Une alternative est d'utiliser l'instruction Call et dans ce cas alors il faut mettre des parenthèses.
- les fonctions avec valeur de retour.
- les fonctions sans valeur de retour.
<%
Sub
Ecrire_Texte_Nfois
(
texte, Nfois)
Dim
i
For
i=
1
To
Nfois
Response
.Write
"Le texte est "
&
texte &
"<br>"
Next
End
Sub
' 1ère méthode
Ecrire_Texte_Nfois "toto"
, 3
' 2ème méthode
Call
Ecrire_Texte_Nfois
(
"toto"
, 3
)
%>
L'un des grands manques de VBScript est la possibilité de commenter de façon simple plusieurs lignes de code. En effet, dans la majorité des langages, il existe des délimiteurs qui permettent de commenter un bloc de code, comme /* ... */ par exemple. En VBScript, il est nécéssaire de commenter chaque ligne avec le caractère ' ou l'instruction REM. Voici une astuce pour commenter malgré tout un bloc de code sans commenter chaque ligne, opération qui peut s'avérer fastidieuse. Il suffit d'encapsuler le code en question dans une procédure... et de ne pas appeler cette procédure.
<%
...
Sub
bloc_de_code_a_commenter
...
...
...
End
Sub
...
%>
Et lorsque l'on veut à nouveau tester le bloc de code, il suffit de commenter Sub et End Sub
<%
...
' Sub bloc_de_code_a_commenter
...
...
...
' End Sub
...
%>
Nota : Les explications suivantes concernent le langage vbscript.
Il y a deux cas de figure à considérer :
Les tableaux statiques :
On utilise l'instruction Dim en précisant le nombre de dimensions (jusqu'à 60 !) et l'indice maximum de chaque dimension. Comme l'indice du premier élément est 0, le nombre d'éléments d'une dimension est donc indice max + 1.
- les tableaux statiques : tableaux dont le nombre d'éléments n'évolue pas au cours du script.
- les tableaux dynamiques : tableaux redimensionnables.
<%
Dim
montableau_1
(
3
) ' déclaration d'un tableau statique à une dimension contenant 4 éléments
montableau_1
(
0
) =
"élément 0"
' définition de la valeur du 1er élément du tableau
montableau_1
(
1
) =
"élément 1"
montableau_1
(
2
) =
"élément 2"
montableau_1
(
3
) =
"élément 3"
Dim
montableau_2
(
3
,2
) ' déclaration d'un tableau statique à 2 dimensions : 4 lignes, 3 colonnes
montableau_2
(
0
,0
) =
"ligne0 - col0"
: montableau_2
(
0
,1
) =
"ligne0 - col1"
: montableau_2
(
0
,2
) =
"ligne0 - col2"
montableau_2
(
1
,0
) =
"ligne1 - col0"
: montableau_2
(
1
,1
) =
"ligne1 - col1"
: montableau_2
(
1
,2
) =
"ligne1 - col2"
montableau_2
(
2
,0
) =
"ligne2 - col0"
: montableau_2
(
2
,1
) =
"ligne2 - col1"
: montableau_2
(
2
,2
) =
"ligne2 - col2"
montableau_2
(
3
,0
) =
"ligne3 - col0"
: montableau_2
(
3
,1
) =
"ligne3 - col1"
: montableau_2
(
3
,2
) =
"ligne3 - col2"
%>
Les tableaux dynamiques :
Il est possible de déclarer un tableau dynamique de 2 façons : en le déclarant à l'aide de l'instruction Dim mais sans préciser le nombre d'éléments ni de dimensions, puis en lui donnant ses dimensions avec l'instruction Redim, ou bien en le déclarant directement avec l'instruction Redim.
<%
Dim
montableau_1
(
) ' déclaration d'un tableau dynamique
Redim
montableau_1
(
3
) ' redimensionnement du tableau
montableau_1
(
0
) =
"élément 0"
: montableau_1
(
1
) =
"élément 1"
: montableau_1
(
2
) =
"élément 2"
: montableau_1
(
3
) =
"élément 3"
Redim
montableau_2
(
3
,2
) ' déclaration d'un tableau dynamique à 2 dimensions : 4 lignes, 3 colonnes
For
l=
0
to
Ubound
(
montableau_2, 1
) ' Ubound(montableau_2, 1) =>Limite supérieure de la dimension 1 du tableau
For
c=
0
to
Ubound
(
montableau_2, 2
) ' Ubound(montableau_2, 2) =>Limite supérieure de la dimension 2 du tableau
montableau_2
(
l,c) =
"ligne"
&
l &
" - col"
&
c
Next
Next
' redimensionnement du tableau montableau_1 sans conserver ses valeurs actuelles
Redim
montableau_1
(
9
) ' montableau_1 est maintenant un tableau à une dimension de 10 éléments
' redimensionnement du tableau montableau_2 en conservant ses valeurs actuelles
Redim
Preserve
montableau_2
(
3
,3
) ' montableau_2 est maintenant un tableau à 2 dimensions : 4 lignes, 4 colonnes
%>
Plusieurs remarques concernant le redimensionnement : Une autre possibilité de déclarer un tableau dynamique est l'utilisation de la fonction Array() qui va retourner un Variant contenant un tableau, au lieu d'avoir un tableau de Variant. Pour bien appréhender cette nuance, comparez le code pour l'affichage avec celui que vous écririez pour le tableau montableau_2.
- Pour calculer la limite supérieure d'une dimension, on utilise la fonction Ubound(nomtableau, dimension) (ceci est vrai également pour les tableaux statiques).
- Le mot-clé Preserve permet lors du redimensionnement de conserver les valeurs actuelles du tableau.
- Si vous donnez un indice maximum inférieur à celui utilisé avant le redimensionnement, les valeurs contenues dans les éléments éliminés sont perdues.
- Lors de l'utilisation du mot-clé Preserve sur un tableau à plusieurs dimensions, seule la dernière dimension peut être redimensionnée.
- Si vous n'utilisez pas le mot-clé Preserve lors du redimensionnement, il est possible d'ajouter ou d'enlever des dimensions au tableau (passer par exemple d'un tableau à une dimension à un tableau à 2 dimensions).
- Il est possible d'utiliser l'instruction Redim dans une structure itérative, toutefois ce n'est pas conseillé.
<%
Dim
montableau
montableau =
array
(
array
(
"l1un"
, "l1deux"
, "l1trois"
), array
(
"l2un"
, "l2deux"
, "l2trois"
), array
(
"l3un"
, "l3deux"
, "l3trois"
))
' affichage du contenu de montableau
For
i=
0
to
Ubound
(
montableau,1
)
For
j=
0
to
Ubound
(
montableau
(
i),1
)
Response
.Write
"montableau("
&
i &
")("
&
j &
") : "
&
montableau
(
i)(
j) &
"<br>"
Next
Next
%>
En ASP, il n'est pas possible de choisir la cible (cadre/frame) dans laquelle effectuer une redirection avec la méthode Redirect de l'objet Response. La redirection va forcément s'effectuer dans celle dans laquelle se trouve le fichier qui contient cette instruction. Donc si l'on veut rediriger dans une autre frame, il faut soit charger la page qui contient l'instruction de redirection déjà dans la bonne frame, soit faire cela en javascript.
Une solution alternative apparue avec ASP 3.0 est d'utiliser la méthode Transfer de l'objet Server. Cette instruction va, comme son nom l'indique, suspendre l'exécution de la page en cours et transférer le contrôle à la page spécifiée.
<%
' du code de la page en cours
Server
.Transfer
(
"url_autre_page.asp"
)
' du code non exécuté
%>
Alternative : la méthode Execute de l'objet Server qui, contrairement à Transfer, va redonner la main à la page de départ. Voir un exemple de cette méthode ici .
Il faut pour cela utiliser les méthodes du composant WSH(Windows Scripting Host).
Voici un aperçu des différentes versions installées par défaut suivant le système d'exploitation utilisé
Système d'exploitation | 1.0 | 2.0 | 5.6 |
---|---|---|---|
Microsoft Windows 98 | X | ||
Microsoft Windows NT 4 Option Pack | X | ||
Microsoft Windows 2000 | X | ||
Microsoft Windows XP | X |
Vous pouvez toutefois installer la dernière version disponible dans les liens du post-it correspondant dans le forum ASP. Voici un exemple qui va lancer une instance de notepad sur le serveur
<%
Dim
WshShell
' déclaration d'un objet WshShell
Set
WshShell =
Server
.CreateObject
(
"Wscript.Shell"
)
' lancement de notepad sur le serveur
WshShell.Run
"%windir%\notepad "
' destruction de l'objet WshShell
Set
WshShell =
nothing
%>
Voici un autre exemple qui va lancer une instance de l'interpréteur de commande, changer le chemin pour qu'il pointe sur C, exécuter la commande DIR et envoyer le résultat dans le fichier ArboC.txt sur C
<%
Dim
WshShell
Set
WshShell =
Server
.CreateObject
(
"Wscript.Shell"
)
WshShell.Run
"cmd /C CD C:\ & DIR>ArboC.txt"
Set
WshShell=
nothing
%>
Attention, dans l'exemple avec notepad, vous ne verrez pas le bloc-note s'ouvrir. Il ne faut en effet pas oublier ici que tout se passe sur le serveur. Il faut donc bien savoir ce que vous faites avant d'utiliser ces instructions.
Il est toutefois possible d'exécuter ces instructions sur le client.
<script language
=
"vbscript"
>
Dim WshShell
' déclaration d'un objet WshShell
Set WshShell = CreateObject("Wscript.Shell")
' lancement de notepad sur le client
WshShell.Run "%windir%\notepad "
' destruction de l'objet WshShell
Set WshShell = nothing
</script>
Cependant vous devez savoir que ce code ne s'effectuera pas sur le client sans un message d'alerte de la part du navigateur, comme montré sur l'image suivante.
En effet, l'exécution de ce genre de code représente une agression qui peut engendrer de gros trous de sécurité. C'est pour cela que vous ne pouvez (devez) pas vous appuyer sur ce genre de code client, beaucoup d'utilisateurs étant susceptibles de désactiver purement et simplement l'exécution de code activeX dans leur navigateur. De plus, seul Internet Explorer sera capable d'interpréter ce code.
Une dernière remarque : les codes présentés sont écrits en vbscript, mais il est tout à fait possible d'utiliser le JScript pour obtenir les mêmes résultats.
Pour créer un fichier word :
<%
' CREATE WORD DOCUMENT
Set
WordApp =
CreateObject
(
"word.application"
)
Set
WordDoc =
WordApp.Documents.Add
(
)
WordApp.Application.Visible
=
False
Set
MyRange1 =
WordDoc.Paragraphs.Add.Range
MyRange1.InsertBefore
(
"Appraisal Form"
)
MyRange1.Style
=
"Heading 1"
Set
MyRange1 =
WordDoc.Paragraphs.Add.Range
MyRange1.InsertBefore
(
"Manager: "
&
Manager &
vbcrlf
&
"Appraisee: "
&
Appraisee)
MyRange1.Font.Bold
=
true
Set
MyRange1 =
WordDoc.Paragraphs.Add.Range
MyRange1.InsertBefore
(
vbcrlf
&
"Please fill in all the required sections and return to HR via the internal mail system."
)
' Set the directory location to store the generated documents
WordDocPath =
Server
.MapPath
(
"\alastair\appraisals\forms"
)
' Use the unique session ID as the filename.
WordDoc.SaveAs
WordDocPath &
"\"
&
session.sessionID
&
".doc"
WordDoc.Close
WordApp.Quit
Set
WordDoc =
Nothing
Set
WordApp =
Nothing
%>
Note : MS Word doit être installé sur le serveur.
Pour supprimer (ou ne pas garder) la page dans le cache du navigateur, on peut utiliser ceci :
Response.Expires = -1
Response.AddHeader "Pragma", "no-cache"
Response.AddHeader "cache-control", "no-store"
Pour affecter une variable avec un objet, on utilise le mot-clé SET.
On applique donc ce principe à notre fonction :
function retourneObjet()
...
set retourneObjet = objet
end function
Pour utiliser cet objet retourné par la fonction, on va utiliser une fois de plus le même principe
set objetretourne = retourneObjet()
Pour les créer :
<%
response
.cookies
(
"identite"
)(
"nom"
) =
"toto"
response
.cookies
(
"identite"
)(
"prenom"
) =
"bonptitgars"
response
.cookies
(
"identite"
).expires
=
DateAdd
(
"h"
, 1
, time
)%>
Pour les récupérer :
<%
nomcook =
request
.cookies
(
"identite"
)(
"nom"
)%>
<input type
=
"text"
name
=
"nom"
value
=
"
<%
=
nomcook%>
"
>
Pour arrondir un nombre, il existe la fonction Round :
Round(expression[, numdecimalplaces])
Pour formatter un nombre, il existe la fonction FormatNumber :
FormatNumber(Expression [,NumDigitsAfterDecimal])