Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ASP - AFFICHAGE EN TABLEAU :


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 26/08/2008 17:20:44 Vu : 1 609 fois

Note :
Aucune note

Commentaire sur cette source (0)
Ajouter un commentaire et/ou une note

Description

Création d'un tableau "à la volée" pour afficher ses données, provenant d'un array() ou d'une base de données.

Affichage "en ligne" ou "en colonne".

Tutorial

Mon tutorial original se trouve ici :
http://www.asp-php.net/tutorial/asp-php/tableaux.php

Tables simples 

Structure d'un tableau (table) :

affiche

<table>
   <tr>
      <td>ligne1 colonne1</td>
      <td>ligne1 colonne2</td>
      <td>ligne1 colonne3</td>
      <td>ligne1 colonne4</td>
   </tr>
   <tr>
      <td>ligne2 colonne1</td>
      <td>ligne2 colonne2</td>
      <td>ligne2 colonne3</td>
      <td>ligne2 colonne4</td>
   </tr>
...
</table>

ligne1 colonne1

ligne1 colonne2

ligne1 colonne3

ligne1 colonne4

ligne2 colonne1

ligne2 colonne2

ligne2 colonne3

ligne2 colonne4

...

 

 

 

a- Tableau de NbrCol colonnes par NbrLigne lignes :

<html><body>
<%
' NbrCol : le nombre de colonnes
' NbrLigne : le nombre de lignes
' --------------------------------------------------------
response.write "<table>"
for i=1 to NbrLigne step 1
   response.write "<tr>"
   for j=1 to NbrCol step 1
         response.write "<td>"
         
' ------------------------------------------
          ' AFFICHAGE ligne i, colonne j
         response.write affichage
         
' ------------------------------------------
         response.write "</td>"
   next
   response.write "</tr>"
   j=1
next
response.write "</table>"
%>

</body></html>

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

 

<html><body>
<%
' 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 "<tr>"
   response.write "<td bgcolor=""#CCCCCC"">"
   response.write "i X j</td>"
   for j=1 to NbrCol step 1
      response.write "<td bgcolor=""#FFFF66"">"
      response.write j & "</td>"
   next   
   response.write "</tr>"
' --------------------------------------------------------
' lignes suivantes
for i=1 to NbrLigne step 1
   response.write "<tr>"
   for j=1 to NbrCol step 1
      
' 1ere colonne (colonne 0)
      if (j=1) then
         response.write "<td bgcolor=""#FFFF66"">"
         response.write i & "</td>"
      end if
      
' colonnes suivantes
      if (i=j) then
         response.write "<td bgcolor=""#FFCC66"">"
      else
         response.write "<td>"
      end if
      
' ------------------------------------------
       ' AFFICHAGE ligne i, colonne j
      response.write i*j
      
' ------------------------------------------
      response.write "</td>"
   next
   response.write "</tr>"
   j=1
next
response.write "</table>"
%>

</body></html>

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

L'exemple ci-dessous affiche :

le code généré :

elt0

elt1

elt2

elt3

elt4

elt5

 

 

<table border="1">
   <tr>
      <td>elt0</td>
      <td>elt1</td>
      <td>elt2</td>
      <td>elt3</td>
   </tr>
   <tr>
      <td>elt4</td>
      <td>elt5</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
   </tr>
</table>

 

<html><body>
<%
' 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
response.write "<table border=""1"">"
for i=1 to NbrLigne step 1
   response.write "<tr>"
   for j=1 to NbrCol step 1
      if (k<NbreData) then
         response.write "<td>"
         
' ------------------------------------------
          ' AFFICHAGE de l'element
         response.write tableau(k)
         
' ------------------------------------------
         response.write "</td>"
         k=k+1
      else   
' case vide
         response.write "<td>&nbsp;</td>"
      end if
   next
   response.write "<tr>"
   j=1
next
response.write "</table>"
else
response.write "pas de données à afficher"
end if
%>

</body></html>

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 LA FIN. éventuellement
- ou on l'intercepte en cours de route (pour pagination)

L'exemple ci-dessous affiche :

le code généré :

elt0

elt1

elt2

elt3

elt4

elt5

 

 

<table border="1">
   <tr>
      <td>elt0</td>
      <td>elt1</td>
      <td>elt2</td>
      <td>elt3</td>
   </tr>
   <tr>
      <td>elt4</td>
      <td>elt5</td>
   </tr>
</table>

<html><body>
<%
' 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
response.write "<table border=""1"">"
while (k < NbreData)
   if (j Mod NbrCol = 1) then
      NbrLigne = NbrLigne + 1
      response.write "<tr>"
      fintr = 0
   end if
   response.write "<td>"
   
' ------------------------------------------
    ' AFFICHAGE de l'element
   response.write tableau(k)
   
' ------------------------------------------
   response.write "</td>"
   k=k+1
   if (j Mod NbrCol = 0) then
      response.write "</tr>"
      fintr = 1
   end if
   j=j+1
wend
if (fintr<>1) then response.write "</tr>" end if
response.write "</table>"
else
response.write "pas de données à afficher"
end if
%>

</body></html>

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.

L'exemple ci-dessous affiche :

le code généré :

baie
fruit

ballon
jouet

banane
fruit

betterave
legume

bille
jouet

bonbon
douceur

boule
jouet

 

<table border="1">
   <tr>
      <td>baie<br><i>fruit</i></td>
      <td>ballon<br><i>jouet</i></td>
      <td>banane<br><i>fruit</i></td>
      <td>betterave<br><i>legume</i></td>
   </tr>
   <tr>
      <td>bille<br><i>jouet</i></td>
      <td>bonbon<br><i>douceur</i></td>
      <td>boule<br><i>jouet</i></td>
   </tr>
</table>

 

<!-- #include file="_Connexion.asp"-->
<html><body>
<%
' 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")
RS.Open SQL,Conn , 3, 3
' --------------------------------------------------------
NbreData = RS.recordcount
' --------------------------------------------------------
' affichage
NbrLigne = 0
if (NbreData <> 0) then
j = 1
response.write "<table border=""1"">"
while not RS.eof
   if (j Mod NbrCol = 1) then
      NbrLigne = NbrLigne + 1
      response.write "<tr>"
      fintr = 0
   end if
   response.write "<td>"
   
' ------------------------------------------
    ' AFFICHAGE des DONNEES de la fiche
   response.write RS.fields("DONNEE")
   response.write "<br>"
   response.write "<i>" & RS.fields("TYPE") & "</i>"
   
' ------------------------------------------
   response.write "</td>"
   if (j Mod NbrCol = 0) then
      response.write "</tr>"
      fintr = 1
   end if
   j=j+1
RS.movenext
wend
if (fintr<>1) then response.write "</tr>" end if
response.write "</table>"
else
response.write "pas de données à afficher"
end if
%>

</body></html>
<%
' deconnexion de la base
Conn.close : Set Conn=nothing
%>

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 ..."

L'exemple ci-dessous affiche :

le code généré :

elt0

elt1

elt2

elt3

elt4

elt5

elt6

elt7

elt8

elt9

<table><tr>
   <td valign="top">
      <table border="1">
      <tr><td>elt0</td></tr>
      <tr><td>elt1</td></tr>
      <tr><td>elt2</td></tr>
      </table>
   </td>
   <td valign="top">
      <table border="1">
      <tr><td>elt3</td></tr>
      <tr><td>elt4</td></tr>
      <tr><td>elt5</td></tr>
      </table>
   </td>
   <td valign="top">
      <table border="1">
      <tr><td>elt6</td></tr>
      <tr><td>elt7</td></tr>
      <tr><td>elt8</td></tr>
      </table>
   </td>
   <td valign="top">
      <table border="1">
      <tr><td>elt9</td></tr>
      </table>
   </td>
</tr></table>

 

html><body>
<%
' 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
response.write "<table><tr>"
while (k < NbreData)
   response.write "<td valign=""top"">"
   response.write "<table border=""1"">"
   for i=1 to NbrLigne step 1
      if (k < NbreData) then
         response.write "<tr><td>"
         
' ---------------------------------------
          ' AFFICHAGE de l'element
         response.write tableau(k)
         
' ---------------------------------------
         response.write "</td></tr>"
         k=k+1
      end if
      if (i = NbrLigne) then
         response.write "</table>"
         response.write "</td>"
      end if
   next
   NbrCol = NbrCol + 1
wend
response.write "</tr></table>"
else
response.write "pas de données à afficher"
end if
%>

</body></html>

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 :

elt0 - elt3 - elt6 - elt9

0 Mod 3 = 3 Mod 3 = 6 Mod 3 = 9 Mod 3 = 0

ligne 1 :

elt1 - elt4 - elt7

1 Mod 3 = 4 Mod 3 = 7 Mod 3 = ... = 1

ligne 2 :

elt2 - elt5 - elt8

2 Mod 3 = 5 Mod 3 = 8 Mod 3 = ... = 2

 

L'exemple ci-dessous affiche :

le code généré :

elt0

elt3

elt6

elt9

elt1

elt4

elt7

 

elt2

elt5

elt8

 

<table border="1">
   <tr>
      <td>elt0</td>
      <td>elt3</td>
      <td>elt6</td>
      <td>elt9</td>
   </tr>
   <tr>
      <td>elt1</td>
      <td>elt4</td>
      <td>elt7</td>
   </tr>
   <tr>
      <td>elt2</td>
      <td>elt5</td>
      <td>elt8</td>
   </tr>
</table>

 

<html><body>
<%
' 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
response.write "<table border=""1"">"
   for i=0 to NbrLigne-1 step 1
      response.write "<tr>"
      j = 0
      while ((i+(j*NbrLigne)) Mod NbrLigne=i and (i+(j*NbrLigne))<NbreData)
         response.write "<td>"
         
' ---------------------------------------
          ' AFFICHAGE de l'element
         k = i+(j*NbrLigne)
         response.write tableau(k)
         
' ---------------------------------------
         response.write "</td>"
         j=j+1
         if (NbrCol < j) then NbrCol = j end if
      wend
   response.write "</tr>"
   next
response.write "</table>"
else
response.write "pas de données à afficher"
end if
%>

</body></html>

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.

L'exemple ci-dessous affiche :

le code généré :

baie
fruit

bille
jouet

ballon
jouet

bonbon
douceur

banane
fruit

boule
jouet

betterave
legume

 

<table border="1">
   <tr>
      <td>baie<br><i>fruit</i></td>
      <td>bille<br><i>jouet</i></td>
   </tr>
   <tr>
      <td>ballon<br><i>jouet</i></td>
      <td>bonbon<br><i>douceur</i></td>
   </tr>
   <tr>
      <td>banane<br><i>fruit</i></td>
      <td>boule<br><i>jouet</i></td>
   </tr>
   <tr>
      <td>betterave<br><i>legume</i></td>
   </tr>
</table>

<!-- #include file="_Connexion.asp"-->
<html><body>
<%
' 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")
RS.Open SQL,Conn , 3, 3
' --------------------------------------------------------
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
RS.movenext
wend
' --------------------------------------------------------
' affichage
if (NbreData <> 0) then
i=0
NbrCol=0
response.write "<table border=""1"">"
   for i=0 to NbrLigne-1 step 1
      response.write "<tr>"
      j=0
      while ((i+(j*NbrLigne)) Mod NbrLigne=i and (i+(j*NbrLigne))<NbreData)
         response.write "<td>"
         
' ---------------------------------------
          ' AFFICHAGE de l'element
         k = i+(j*NbrLigne)
         response.write tableau1(k)
         response.write "<br>"
         response.write "<i>"&tableau2(k)&"</i>"
         
' ---------------------------------------
         response.write "</td>"
         j=j+1
         if (NbrCol < j) then NbrCol = j end if
      wend
   response.write "</tr>"
   next
response.write "</table>"
else
response.write "pas de données à afficher"
end if
%>

</body></html>
<%
Conn.close : Set Conn=nothing
%>

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 "<br>"
         response.write "<i>"&tableau(1,k)&"</i>"
         
' ---------------------------------------
' ...
%>

26 août 2008 17:30:10 :
mise en page
Aucun commentaire pour le moment.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,016 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.