Forum de discussion
Forum « Programmation Javascript » (archives)
Re: matrice ou array relationnelle avec jointure
Envoyé: 18 avril 2004, 9h24 par Oznog
Ok, je vois. Prend l'habitude de décrire tes besoins. Bien avant de débogguer une solution faut s'assurer que la solution est réellement celle souhaitée.
Ton cas est une "relation de 1 à plusieurs" ! De gros mots mais un classique en programmation. Tellement classique qu'aucun langage ne permet de faire ça tout simplement parceque c'est du domaine des base de données, enfin idéallement.
1. Tu as une base de données.
2. Tu as d'un côté une "table" d'album. (table au sens d'une entité et non pas d'une matrice ou array).
3. De l'autre côté une "table" de titres.
4. Les deux tables sont en relation, lié à partir d'un l'ID unique à chaque album. On appelle ça une jointure à partir d'une clé primaire.
Malheureusement le Javascript ne permet pas (généralement) d'interroger une base de données. Tu dois utiliser une base de données installée sur le serveur et donc jumelée à un langage serveur comme le ASP ou le PHP tous deux munis du langage SQL pour interroger la base. Tu peux lire plusieurs tutoriel sur la question dans la section ASP "Introduction aux SGBD" (http://www.trucsweb.com/ASP/trucs.asp?no=231&type=7) et "Tables relationnelles" (http://www.trucsweb.com/ASP/trucs.asp?no=237&type=7) ou plus techniquement "ActiveX® Data Objects (ADO)" (http://www.trucsweb.com/ASP/trucs.asp?no=176&type=7) et "Jointures et relations INNER, LEFT, RIGHT, UNION..." (http://www.trucsweb.com/ASP/trucs.asp?no=104&type=7).
SOLUTION Javascript
Ensuite, bien que "idéallement" l'usage d'une base de données soit de mise, le principe de table relationnel peut être simulé avec des matrices (array) et l'usage d'index. C'est tout un travail en perspective, bien qu'intéressant. Mais tu n'y arrivera pas en quelques copier/coller !
1. Dans la matrice (array) des pièces, tu as le nom, la durée, et l'ID de l'album peut tout simplement être la position dans la matrice.
Ex:
<html>
<script type="text/javascript" language="javascript">
<!--
function fait_Album(_titre,_description,_jaquette) {
this.titre = _titre;
this.description = _description;
this.jaquette = _jaquette;
}
aAlbums = new Array(7)
aAlbums[0] = new fait_Album("Album 1","Bla bla bla...","image0.gif");
aAlbums[1] = new fait_Album("Album 2","Bla bla bla...","image1.gif");
aAlbums[2] = new fait_Album("Album 3","Bla bla bla...","image2.gif");
aAlbums[3] = new fait_Album("Album 4","Bla bla bla...","image3.gif");
aAlbums[4] = new fait_Album("Album 5","Bla bla bla...","image4.gif");
aAlbums[5] = new fait_Album("Album 6","Bla bla bla...","image5.gif");
aAlbums[6] = new fait_Album("Album 7","Bla bla bla...","image6.gif");
// -->
</script>
</html>
Tu peux ainsi récupérer l'album 6 de cette façon. (tel que vu dans le tutoriel "Tableaux (Array) à deux dimensions" (http://www.trucsweb.com/Javascript/trucs.asp?no=336&type=5))
aAlbums[5].titre;
2. Tu as aussi la matrice des pièces MAIS ATTENTION, tu dois pour chaque pièce garder l'id de l'album associé. Ce sera la jointure pour ou bine récupérer l'album d'une pièce ou bien récupérer LES PIÈCES d,un album :
<html>
<script type="text/javascript" language="javascript">
<!--
function fait_Album(_titre,_description,_jaquette) {
this.titre = _titre;
this.description = _description;
this.jaquette = _jaquette;
}
function fait_piece(_titre,_duree,_idAlbum) {
this.titre = _titre;
this.duree = _duree;
this.idalbum = _idAlbum;
}
aAlbums = new Array(1)
aPieces = new Array(5)
aAlbums[0] = new fait_Album("Album 1","Bla bla bla...","image0.gif");
aPieces[0] = new fait_piece("Piece 1 album 1","5:03",0);
aPieces[1] = new fait_piece("Piece 2 album 1","4:03",0);
aPieces[2] = new fait_piece("Piece 3 album 1","3:03",0);
aAlbums[1] = new fait_Album("Album 2","Bla bla bla...","image1.gif");
aPieces[3] = new fait_piece("Piece 1 album 2","5:03",1);
aPieces[4] = new fait_piece("Piece 2 album 2","4:03",1);
// -->
</script>
</html>
3. Maintenant pour mettre en relation les deux tables...
- Récupérer l'album d'une pièce tu fais :
document.write(aPieces[3].titre + ' (' + aAlbums[aPieces[3].idalbum].titre + ')');
Comme tu peux le voir 'aPieces[3].idalbum' est tout simplement la position du bon album dans la matrice des albums.
- Récupérer TOUTES les pièces d'un album. tu dois boucler la matrice des pièces MASI N'AFFICHER QUE LES PIÈCES DONT L'IDI est celui de l'album. Pour bopucler une matrice, c'est à dire passer du premier élément au dernier tu utiluise une boucle FOR de 0 à la grandeur de la matrice ( length ). Voir "Introduction aux tableaux (Array)" (http://www.trucsweb.com/Javascript/trucs.asp?no=335&type=5) pour plus de détails :
// Pour l'album 2 (position 1) :
var pourLalbum2 = 1;
for (i=0; i<aPieces.length; i++) {
if (aPieces[i].idalbum==pourLalbum2) {
document.write(aPieces[i].titre + ' (' + aPieces[i].duree + ')<br >');
}
}
CODE COMPLET
=============
<html>
<script type="text/javascript" language="javascript">
<!--
function twAlbum(_titre,_description,_jaquette) {
this.titre = _titre;
this.description = _description;
this.jaquette = _jaquette;
}
function twPiece(_titre,_duree,_idAlbum) {
this.titre = _titre;
this.duree = _duree;
this.idalbum = _idAlbum;
}
aAlbums = new Array(1)
aPieces = new Array(5)
aAlbums[0] = new twAlbum("Album 1","Bla bla bla...","image0.gif");
aPieces[0] = new twPiece("Piece 1 album 1","5:03",0);
aPieces[1] = new twPiece("Piece 2 album 1","4:03",0);
aPieces[2] = new twPiece("Piece 3 album 1","3:03",0);
aAlbums[1] = new twAlbum("Album 2","Bla bla bla...","image1.gif");
aPieces[3] = new twPiece("Piece 1 album 2","5:03",1);
aPieces[4] = new twPiece("Piece 2 album 2","4:03",1);
for (i=0; i<aAlbums.length; i++) {
document.write('<p><b>'+aAlbums[i].titre + '</b><br >' + aAlbums[i].description + '<br >');
for (l=0; l<aPieces.length; l++) {
if (aPieces[l].idalbum==i) {
document.write(' - ' + aPieces[l].titre + ' (' + aPieces[l].duree + ')<br >');
}
}
document.write('</p>');
}
// -->
</script>
</html>
Voilà, c'est le principe.
Bonne chance.
Oznog
Réponses
|