Mon tutorial original se trouve ici :
http://www.asp-php.net/tutorial/asp-php/tableaux.php
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
Tables simples
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<table>
|-
| ligne1 colonne1
| ligne1 colonne2
| ligne1 colonne3
| ligne1 colonne4
|-
| ligne2 colonne1
| ligne2 colonne2
| ligne2 colonne3
| ligne2 colonne4
...
Structure d'un tableau (table) : |
affiche |
|
</td> </tr> </tbody> </table>
</td> <td width="50%">
ligne1 colonne1 |
ligne1 colonne2 |
ligne1 colonne3 |
ligne1 colonne4 |
ligne2 colonne1 |
ligne2 colonne2 |
ligne2 colonne3 |
ligne2 colonne4 |
... |
|
|
|
</td> </tr> </tbody> </table>
a- Tableau de NbrCol colonnes par NbrLigne lignes :
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<html>
<%
' NbrCol : le nombre de colonnes
' NbrLigne : le nombre de lignes
' --------------------------------------------------------
response.write \\"<table>\\"
for i=1 to NbrLigne step 1
response.write \\"|-
\\"
for j=1 to NbrCol step 1
response.write \\"| \"
' ------------------------------------------
' AFFICHAGE ligne i, colonne j
response.write affichage
' ------------------------------------------
response.write \"
\\"
next
response.write \\"\\"
j=1
next
write "
"
%>
</html>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
b- Table de multiplication :
exemple amélioré
i X j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
1 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
2 |
2 |
4 |
6 |
8 |
10 |
12 |
14 |
16 |
18 |
3 |
3 |
6 |
9 |
12 |
15 |
18 |
21 |
24 |
27 |
4 |
4 |
8 |
12 |
16 |
20 |
24 |
28 |
32 |
36 |
5 |
5 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
6 |
6 |
12 |
18 |
24 |
30 |
36 |
42 |
48 |
54 |
7 |
7 |
14 |
21 |
28 |
35 |
42 |
49 |
56 |
63 |
8 |
8 |
16 |
24 |
32 |
40 |
48 |
56 |
64 |
72 |
9 |
9 |
18 |
27 |
36 |
45 |
54 |
63 |
72 |
81 |
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<html>
<%
' NbrCol : le nombre de colonnes
' NbrLigne : le nombre de lignes
NbrCol = 9
NbrLigne = 9
' --------------------------------------------------------
' on affiche en plus sur les 1ere ligne et 1ere colonne
' les valeurs a multiplier (dans des cases en couleur)
' le tableau fera donc 10 x 10
' --------------------------------------------------------
response.write \\"<table border=\\"\\"1\\"\\" width=\\"\\"400\\"\\">\\"
' 1ere ligne (ligne 0)
response.write \\"|-
\\"
response.write \\"| \"
response.write \"i X j
\\"
for j=1 to NbrCol step 1
response.write \\"| \"
response.write j & \"
\\"
next
response.write \\"\\"
' --------------------------------------------------------
' lignes suivantes
for i=1 to NbrLigne step 1
response.write \\"|-
\\"
for j=1 to NbrCol step 1
' 1ere colonne (colonne 0)
if (j=1) then
response.write \\"| \"
response.write i & \"
\\"
end if
' colonnes suivantes
if (i=j) then
response.write \\"| \"
else
response.write \"
\\"
end if
' ------------------------------------------
' AFFICHAGE ligne i, colonne j
response.write i*j
' ------------------------------------------
response.write \\"</td>\\"
next
response.write \\"\\"
j=1
next
write "
"
%>
</html>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
Affichage "en ligne" avec array()
Affichage d'un certains nombres de données dans un tableau :
- On veut que le tableau fasse un nombre déterminé de colonnes.
Mais on ne connait pas à l'avance le nombre de données récupérées :
- il faut donc pouvoir afficher (automatiquement) autant de lignes que nécessaire.
Récupération des éléments d'un tableau Array()
A noter : le premier indice d'un array() est 0 (zéro)
a- AVEC calcul du nombre de lignes AVANT affichage
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
elt0
</td> | elt1
L'exemple ci-dessous affiche : |
le code généré : |
|
elt2 |
elt3 |
elt4 |
elt5 |
|
|
</td> <td width="50%">
| <table border=\"1\">
|-
elt0</td>
| elt1
| elt2
| elt3
|-
| elt4
| elt5
|
|
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<html>
<%
' NbreData : le nombre de données a afficher
' NbrCol : le nombre de colonnes
' NbrLigne : calcul automatique AVANT affichage
' --------------------------------------------------------
' (exemple)
NbrCol = 4
tableau = array(\\"elt0\\",\\"elt1\\",\\"elt2\\",\\"elt3\\",\\"elt4\\",\\"elt5\\")
' --------------------------------------------------------
NbreData = ubound(tableau)+1
' --------------------------------------------------------
' calcul du nombre de lignes
if (round(NbreData/NbrCol)<>(NbreData/NbrCol)) then
NbrLigne = round((NbreData/NbrCol)+0.5)
else
NbrLigne = NbreData/NbrCol
end if
' --------------------------------------------------------
' affichage
if (NbreData <> 0) then
k = 0
==write "<table border=""1"">"==
for i=1 to NbrLigne step 1
response.write \\"|-
\\"
for j=1 to NbrCol step 1
if (k<NbreData) then
response.write \\"| \"
' ------------------------------------------
' AFFICHAGE de l'element
response.write tableau(k)
' ------------------------------------------
response.write \"
\\"
k=k+1
else ' case vide
response.write \\"|
\\"
end if
next
response.write \\"|-
\\"
j=1
next
write "
"
else
write "pas de données à afficher"
end if
%>
</html>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table> b- SANS calcul du nombre de lignes
C'est une façon différente d'aborder le problème :
- affichage "tant qu'il y a des données ..." (while ...)
- L'astuce : on utilise la propriété "modulo" (Mod en ASP)
qui renvoie le reste de la division entière du 1er chiffre par le 2ème
Exemple :
1 Mod 4 = 1 |
2 Mod 4 = 2 |
3 Mod 4 = 3 |
4 Mod 4 = 0 |
5 Mod 4 = 1 |
6 Mod 4 = 2 |
7 Mod 4 = 3 |
8 Mod 4 = 0 |
9 Mod 4 = 1 |
... |
|
|
Donc :
- quand le modulo = 1 : première colonne
- quand le modulo = 0 : dernière colonne
Le nombre de lignes (NbrLigne) est incrémenté au fur et à mesure :- on le récupère A <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /?><st1:personname w:st="on" productid="LA FIN.">LA FIN.</st1:personname> éventuellement
- ou on l'intercepte en cours de route (pour pagination)
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
elt0
</td> | elt1
L'exemple ci-dessous affiche : |
le code généré : |
|
elt2 |
elt3 |
elt4 |
elt5 |
|
|
</td> <td width="50%">
| <table border=\"1\">
|-
elt0</td>
| elt1
| elt2
| elt3
|-
| elt4
| elt5
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<html>
<%
' NbreData : le nombre de données a afficher
' NbrCol : le nombre de colonnes
' NbrLigne : calcul automatique a la FIN
' --------------------------------------------------------
' (exemple)
NbrCol = 4
tableau = array(\\"elt0\\",\\"elt1\\",\\"elt2\\",\\"elt3\\",\\"elt4\\",\\"elt5\\")
' --------------------------------------------------------
NbreData = ubound(tableau)+1
' --------------------------------------------------------
' affichage
NbrLigne = 0
if (NbreData <> 0) then
k = 0
j = 1
==write "<table border=""1"">"==
while (k < NbreData)
if (j Mod NbrCol = 1) then
NbrLigne = NbrLigne + 1
response.write \\"|-
\\"
fintr = 0
end if
response.write \\"| \"
' ------------------------------------------
' AFFICHAGE de l'element
response.write tableau(k)
' ------------------------------------------
response.write \"
\\"
k=k+1
if (j Mod NbrCol = 0) then
response.write \\"\\"
fintr = 1
end if
j=j+1
wend
if (fintr<>1) then response.write \\"\\" end if
write "
"
else
write "pas de données à afficher"
end if
%>
</html>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
Affichage "en ligne" avec base de données
Affichage de données récupérées par une requête dans une base de données.
- On veut afficher dans chaque case les données provenant d'un enregistrement
- On veut que le tableau fasse un nombre déterminé de colonnes.
Mais on ne connait pas à l'avance le nombre de données récupérées :
- il faut donc pouvoir afficher (automatiquement) autant de lignes que nécessaire.
Dans la partie "AFFICHAGE des DONNEES de la fiche" : Tout est possible !
- afficher plusieurs données,
- afficher des images,
- les organiser dans un tableau,
- ajouter des liens hypertext,
- ...
Même principe que "b- SANS calcul du nombre de lignes" :
- affichage "tant qu'il y a des données ..." while ...
- L'astuce : on utilise la propriété "modulo"
Exemple
La table MATABLE :
champs |
valeurs |
NUM |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
DONNEE |
banane |
betterave |
boule |
pomme |
ananas |
baie |
bille |
citron |
bonbon |
ballon |
TYPE |
fruit |
legume |
jouet |
fruit |
fruit |
fruit |
jouet |
fruit |
douceur |
jouet |
La requête : toutes les données commençant par un "b", classées par ordre alphabétique.
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
baie
fruit
</td> | ballon
jouet
L'exemple ci-dessous affiche : |
le code généré : |
|
banane
fruit |
betterave
legume |
bille
jouet |
bonbon
douceur |
boule
jouet |
|
</td> <td width="50%">
| <table border=\"1\">
|-
baie
fruit </td>
| ballon
jouet
| banane
fruit
| betterave
legume
|-
| bille
jouet
| bonbon
douceur
| boule
jouet
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
| <table class= \"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<!-- #include file=\\"_Connexion.asp\\"-->
<html>
<%
' NbreData : le nombre de données a afficher
' NbrCol : le nombre de colonnes
' NbrLigne : calcul automatique a la FIN
' --------------------------------------------------------
' (exemple)
NbrCol = 4
' requete
latable = \\"MATABLE\\"
condition = \\" WHERE DONNEE LIKE 'b% ' ORDER BY DONNEE ASC\\"
SQL = \\"SELECT * FROM \\"& latable & condition &\\";\\"
Set RS = server.createobject(\\"ADODB.Recordset\\")
====
' --------------------------------------------------------
NbreData = RS.recordcount
' --------------------------------------------------------
' affichage
NbrLigne = 0
if (NbreData <> 0) then
j = 1
==write "<table border=""1"">"==
while not RS.eof
if (j Mod NbrCol = 1) then
NbrLigne = NbrLigne + 1
response.write \\"|-
\\"
fintr = 0
end if
response.write \\"| \"
' ------------------------------------------
' AFFICHAGE des DONNEES de la fiche
response.write RS.fields(\"DONNEE\")
response.write \"
\"
response.write \"\" & RS.fields(\"TYPE\") & \"\"
' ------------------------------------------
response.write \"
\\"
if (j Mod NbrCol = 0) then
response.write \\"\\"
fintr = 1
end if
j=j+1
====
wend
if (fintr<>1) then response.write \\"\\" end if
write "
"
else
write "pas de données à afficher"
end if
%>
</html>
<%
' deconnexion de la base
Conn.close : Set Conn=nothing
%>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
Affichage "en Colonne"
Les scripts précédents affichent les données "en ligne".
Affichage des résultats "en colonne" :
- pour un nombre de lignes (NbreLigne) défini,
- il faut pouvoir afficher (automatiquement) autant de colonnes que nécessaire.
a- Solution 1
(la plus simple)
Exemple avec Array() (même principe avec Base de données)
Principe :
- une table d'une ligne (invisible),
- dans chaque cellule : création d'une table d'1 colonne et NbreLigne lignes,
- ajout de cellules supplémentaires "tant qu'on a des données ..."
| <table class= \"MsoNormalTable\" cellpadding=\"0\" border=\"0\"> |-
<table class=\\"MsoNormalTable\\" cellpadding=\\"0\\" border=\\"1\\"> |-
L'exemple ci-dessous affiche : |
le code généré : |
|
elt0 |
elt1 |
elt2 |
</td> <td valign="top">
</td> <td valign="top">
</td> <td valign="top">
</td> </tr> </tbody> </table>
</td> <td width="50%">
| <table>|-
<table border=\\"1\\">
|-
| elt0
|-
| elt1
|-
</td>
<td valign="top">
| elt3
|-
| elt4
|-
</td>
<td valign="top">
| elt6
|-
| elt7
|-
</td>
<td valign="top">
</td>
</tr></table>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
html>
<%
' NbreData : le nombre de données a afficher
' NbrLigne : le nombre de lignes
' NbrCol : le nombre de colonnes : calcul automatique
' --------------------------------------------------------
' (exemple)
NbrLigne = 3
tableau = array(\\"elt0\\",\\"elt1\\",\\"elt2\\",\\"elt3\\",\\"elt4\\",\\"elt5\\" ,\\"elt6\\",\\"elt7\\",\\"elt8\\",\\"elt9\\")
' --------------------------------------------------------
NbreData = ubound(tableau)+1
' --------------------------------------------------------
NbrCol = 0
' affichage
if (NbreData <> 0) then
k = 0
write "<table>|-
\\"
while (k < NbreData)
response.write \\"| \"
response.write \"<table border=\"\"1\"\">\"
for i=1 to NbrLigne step 1
if (k < NbreData) then
response.write \"|-
\\"
' ---------------------------------------
' AFFICHAGE de l'element
response.write tableau(k)
' ---------------------------------------
response.write \\"</td>\\"
k=k+1
end if
if (i = NbrLigne) then
response.write \"
"
response.write "</td>"
end if
next
NbrCol = NbrCol + 1
wend
write "</tr></table>"
else
write "pas de données à afficher"
end if
%>
</html>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
b- Solution 2, avec Array()
La solution 1 est efficace, mais pas satisfaisante si on souhaite bien aligner toutes les cellules.
Principe :
- une seule table,
- le remplissage se fait ligne par ligne en testant le "modulo" :
Exemple
10 éléments (elt0 à elt9) sur 3 lignes.
On doit les afficher dans cet ordre : (voir le code généré)
ligne 0 : |
0 Mod 3 3 Mod 3 6 Mod 3 = 9 Mod 3 = 0 |
ligne 1 : |
1 Mod 3 4 Mod 3 7 Mod 3 = ... = 1 |
ligne 2 : |
2 Mod 3 5 Mod 3 8 Mod 3 = ... = 2 |
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
elt0
</td> | elt3
L'exemple ci-dessous affiche : |
le code généré : |
|
elt6 |
elt9 |
elt1 |
elt4 |
elt7 |
|
elt2 |
elt5 |
elt8 |
|
</td> <td width="50%">
| <table border=\"1\">
|-
elt0</td>
| elt3
| elt6
| elt9
|-
| elt1
| elt4
| elt7
|-
| elt2
| elt5
| elt8
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<html>
<%
' NbreData : le nombre de données a afficher
' NbrLigne : le nombre de lignes
' NbrCol : le nombre de colonnes : calcul automatique
' --------------------------------------------------------
' (exemple)
NbrLigne = 3
tableau = array(\\"elt0\\",\\"elt1\\",\\"elt2\\",\\"elt3\\",\\"elt4\\",\\"elt5\\",\\"elt6\\",\\"elt7\\",\\"elt8\\",\\"elt9\\")
' --------------------------------------------------------
NbreData = ubound(tableau)+1
' --------------------------------------------------------
' affichage
if (NbreData <> 0) then
i = 0
NbrCol = 0
==write "<table border=""1"">"==
for i=0 to NbrLigne-1 step 1
response.write \\"|-
\\"
j = 0
while ((i+(j*NbrLigne)) Mod NbrLigne=i and (i+(j*NbrLigne))<NbreData)
response.write \\"| \"
' ---------------------------------------
' AFFICHAGE de l'element
k = i+(j*NbrLigne)
response.write tableau(k)
' ---------------------------------------
response.write \"
\\"
j=j+1
if (NbrCol < j) then NbrCol = j end if
wend
response.write \\"\\"
next
write "
"
else
write "pas de données à afficher"
end if
%>
</html>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table> c- Solution 2, avec base de données
Le script utilisant les indices de tableau :
- création d'un tableau array() contenant les données récupérées.
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
baie
fruit
</td> | bille
jouet
L'exemple ci-dessous affiche : |
le code généré : |
|
ballon
jouet |
bonbon
douceur |
banane
fruit |
boule
jouet |
betterave
legume |
|
</td> <td width="50%">
| <table border=\"1\">
|-
baie
fruit </td>
| bille
jouet
|-
| ballon
jouet
| bonbon
douceur
|-
| banane
fruit
| boule
jouet
|-
| betterave
legume
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table>
| <table class=\"MsoNormalTable\" cellpadding=\"0\" border=\"1\"> |-
<!-- #include file=\\"_Connexion.asp\\"-->
<html>
<%
' NbreData : le nombre de données a afficher
' NbrLigne : le nombre de lignes
' NbrCol : calcul automatique
' --------------------------------------------------------
' (exemple)
NbrLigne = 4
' requete
latable = \\"MATABLE\\"
condition =
\\" WHERE DONNEE LIKE 'b% ' ORDER BY DONNEE ASC\\"
SQL = \\"SELECT * FROM \\"& latable & condition &\\";\\"
Set RS = server.createobject(\\"ADODB.Recordset\\")
====
' --------------------------------------------------------
NbreData = RS.recordcount
' --------------------------------------------------------
' creation d'un tableau array() par donnees
dim tableau1() : redim tableau1(NbreData-1)
dim tableau2() : redim tableau2(NbreData-1)
k=0
while not RS.eof
tableau1(k) = RS.fields(\\"DONNEE\\")
tableau2(k) = RS.fields(\\"TYPE\\")
k=k+1
====
wend
' --------------------------------------------------------
' affichage
if (NbreData <> 0) then
i=0
NbrCol=0
==write "<table border=""1"">"==
for i=0 to NbrLigne-1 step 1
response.write \\"|-
\\"
j=0
while ((i+(j*NbrLigne)) Mod NbrLigne=i and (i+(j*NbrLigne))<NbreData)
response.write \\"| \"
' ---------------------------------------
' AFFICHAGE de l'element
k = i+(j*NbrLigne)
response.write tableau1(k)
response.write \"
\"
response.write \"\"&tableau2(k)&\"\"
' ---------------------------------------
response.write \"
\\"
j=j+1
if (NbrCol < j) then NbrCol = j end if
wend
response.write \\"\\"
next
write "
"
else
write "pas de données à afficher"
end if
%>
</html>
<%
==close : Set Conn=nothing==
%>
</td> </tr> </tbody> </table>
</td> </tr> </tbody> </table> Astuce :
Au lieu de créer un tableau array() pour chaque donnée récupérée (tableau1, tableau2, ...),
il est possible de créer un seul tableau array() :
- en PHP, c'est très simple et très pratique.
- en ASP, c'est plus délicat : il faut définir le nom des champs au moment de créer l'array().
(en savoir plus sur GetRows() : L'objet RecordSet - ADO GetRows Method )
-
<%
' ...
' --------------------------------------------------------
' creation d'un seul array avec toutes les donnees
' il faut indiquer ici le tableau des champs a recuperer
tableau = RS.GetRows(,,array(\"DONNEE\",\"TYPE\"))
' ici, l indice de \"DONNEE\" est 0, celui de \"TYPE\" est 1
' --------------------------------------------------------
' affichage
' ...
' ---------------------------------------
' AFFICHAGE de l'element
k = i+(j*NbrLigne)
response.write tableau(0,k)
response.write \"
\"
response.write \"\"&tableau(1,k)&\"\"
' ---------------------------------------
' ...
%>
</td>
|
</td> </tr> </tbody> </table>
Adresse d'origine