IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Animation et ordre d'ex�cution [API HTML5]


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2014
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2014
    Messages : 3
    Par d�faut Animation et ordre d'ex�cution
    Bonjour � tous,

    Je ne sais pas vraiment si mon probl�me est un probl�me d'ordre d'ex�cution et suis d�butant en javascript.
    J'ai cod� une petite animation (apparition d'hexagones fa�on ruche) sur un canvas et j'ai besoin de votre aide pour le corriger.
    L'animation est visible ici : http://codepen.io/anon/pen/HjCGp

    Le probl�me est que certains hexagones se superposent. On le voit dans la d�mo car certains sont noirs (deux noirs opacit� 0.5 superpos�s) et d'autres gris (un seul noir opacit� 0.5, comme d�sir� partout).
    Je veux �viter ce probl�me en enregistrant, dans un tableau posTable, l'origine de l'hexagone (le coin sup�rieure gauche).
    A chaque fois que je veux dessiner un hexagone je v�rifie que son origine n'est pas pr�sente dans le tableau.

    Le script que je poste ci-dessous est long (je m'en excuse) mais les quelques lignes d'explications qui le suivent devraient lever le voile sur ce qui ne va pas.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    document.addEventListener('DOMContentLoaded', function(){
     
      var canvas = document.getElementById('bgCanvas');
      var context = canvas.getContext('2d');
      canvas.width = document.body.clientWidth;
      canvas.height = Math.max( window.innerHeight, document.body.clientHeight );
     
      function initPosTable( nbTot ){
        posTable = new Array(nbTot);
        for (var i = nbTot - 1; i >= 0; i--) {
          posTable[i] = new Array(2);
        }; 
      }
     
      function drawHexagon( x, y, unit ){
     
        var sin_unit = unit * Math.sin(Math.PI/6); 
        var cos_unit = unit * Math.cos(Math.PI/6);
     
        context.strokeStyle = 'rgba(150,150,150,1)';//+ (0.8 - nbDrawn/nbTot )+')';
        context.shadowBlur = 10;
        context.shadowColor = 'rgba(150, 150, 150, 0.2 )';
        context.lineWidth = 2;
        context.beginPath();
        context.moveTo(x                  , y);
        context.lineTo(x + unit           , y);
        context.lineTo(x + unit + sin_unit, y + cos_unit);
        context.lineTo(x + unit           , y + 2 * cos_unit);
        context.lineTo(x                  , y + 2 * cos_unit);
        context.lineTo(x - sin_unit       , y + cos_unit);
        context.lineTo(x                  , y);
        context.stroke();
        context.fillStyle = 'rgba(0,0,0,0.5)';//+ (0.4 - nbDrawn/nbTot )+')';
        context.fill();
     
     
      }
     
      function drawBrother( x, y, unit ){
     
        //Don't draw what we can't see.
        //Maybe useless. Just to be sure it stops process out of canvas boundaries.
        if ( x < 0 || y < 0 || x > canvas.width || y > canvas.height ) return;
     
        drawHexagon(x,y,unit);
        posTable[nbDrawn][0] = Math.floor(x);
        posTable[nbDrawn][1] = Math.floor(y);
        ++nbDrawn;
     
        setTimeout(function() {
     
          drawSomeBrothers(x, y, unit );
        }, 30);
      }
     
      function checkExist(x, y){
        for ( var i = 0; i < nbDrawn; ++i){
          //Strict position equality not match very well
          if ( ( Math.abs(posTable[i][0] - Math.floor(x)) < 10) 
            && ( Math.abs(posTable[i][1] - Math.floor(y)) < 10) ) {
            return true;
          }
        }
        return false;
      }
     
      function drawSomeBrothers(x, y, unit){
     
        if (nbDrawn < nbTot -1){
          /*At least 2 (direct) brothers per hexagon. More compact. More beautiful.*/
          for (var i = 0; i < 2; ++i ){
            var nextCoo = chooseRandomBrotherToDraw(x,y,unit);
            if (nextCoo[0] || nextCoo[1])
              drawBrother(nextCoo[0], nextCoo[1], unit);
          }
        }
        return;
      }
     
      function shuffle(o){
        for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
        return o;
      }
     
      function chooseRandomBrotherToDraw(x,y,unit){
     
        var randomIds = [1,2,3,4,5,6];
        randomIds = shuffle(randomIds);
     
        var sin_unit = unit * Math.sin(Math.PI/6); 
        var cos_unit = unit * Math.cos(Math.PI/6);
     
        var newX = x;
        var newY = y;
     
     
        for ( var i = 0; 
              i < 6 && checkExist(newX, newY); 
              ++i) 
        {
          switch(randomIds[i]){
          case 1: //top left
            newX = x - sin_unit - unit;
            newY = y - cos_unit ;
            break;
          case 2: //top
            newX = x;
            newY = y - 2 * cos_unit;
            break;
          case 3: //top right
            newX = x + sin_unit + unit ;
            newY =  y - cos_unit ;
            break;
          case 4: //bottom right
            newX = x + sin_unit + unit ;
            newY = y + cos_unit ;
            break;
          case 5://bottom
            newX = x;
            newY = y + 2*cos_unit;
            break;
          case 6://bottom left
            newX = x - sin_unit - unit;
            newY = y + cos_unit;
            break;
          default:
            newX = 0;
            newY = 0;
            return;
          }
        };
     
        nextPositionToDraw = new Array(2);
        nextPositionToDraw[0] = newX;
        nextPositionToDraw[1] = newY;
     
        return nextPositionToDraw;
     
      }
     
      function printPos(x,y){
        console.log(Math.floor(x)+","+Math.floor(y)+" n'est pas dans :");
        for(var i = 0; i < nbDrawn; ++i){
          console.log(posTable[i][0]+","+posTable[i][1]);
        }
      }
     
      function main(){
        var nbMin = 50;
        var nbMax = 200;
        nbTot = nbMin + (nbMax - nbMin) * Math.random();
        nbTot = 100//Math.round(nbTot);
        initPosTable(nbTot);
     
        var xFirst = Math.random() * canvas.width;
        var yFirst = Math.random() * canvas.height;    
        var unit = 20 + 40 * Math.random();
     
        nbDrawn = 0;
        drawBrother(xFirst, yFirst, unit);
      }
     
      document.getElementById("trigger").addEventListener( 'mouseover', function(){
        context.clearRect(0, 0, canvas.width, canvas.height);
        main();
      });
    });
    Un premier hexagone est dessin�, puis je calcule les coordonn�es de 2 voisins que je dessine s'ils n'existent pas (et c'est l� le probl�me, ma v�rification ne marche pas comme elle devrait), et ainsi de suite jusqu'� ce qu'il y en ait assez. Je pense que le probl�me peut se situer au moment de l'incr�mentation de nbDrawn, comme 2 �critures dans la m�me case du tableau posTable.

    Merci de m'avoir lu,
    Coridalement

  2. #2
    R�dacteur/Mod�rateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par d�faut
    J'ai bricol� autour de ton code pendant un quart d'heure sans trouver d'o� pouvait venir le bogue. Le point d�licat c'est cette approximation sur les coordonn�es de chaque hexagone. Ce n'est pas tr�s rigoureux et source potentielle de bogues.

    Ce que je peux te sugg�rer, c'est de consid�rer que ta grille hexagonale est en fait un tableau en deux dimensions dont une ligne sur deux est d�cal�e d'un demi-cran vers la droite. De la sorte, les coordonn�es se r�sument � un couple d'entier (x,y) et la fonction de dessin se charge de les transformer en coordonn�es r�elles avec les calculs d'angle. Le code et son d�bogage en devrait �tre nettement facilit�s.

    C'est l'approche que j'avais choisi pour un de mes essais : http://syllab.fr/projets/games/warchess/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2014
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2014
    Messages : 3
    Par d�faut
    Merci de vous �tre pench� sur mon soucis .
    Oui en effet la solution du tableau de coordonn�es n'est pas tr�s rigoureuse, mais �a devrait marcher m�me sans l'approximation en th�orie. J'ai ajout� l'approximation suite au constat que �a ne marchait pas en enregistrant les coordonn�es exactes (int). Mais m�me prenant cette marge de s�curit� (une approximation de 10x10 pixel sur l'emplacement de l'origine) il y a superposition (semble-t'il exacte). Je pense donc que le probl�me n'est pas l�, d'ou mon interrogation quand � l'ordre d'ex�cution.

    Votre suggestion de placer les hexagones dans un tableau est judicieuse mais "l'objectif" du script est de choisir une position al�atoire est de g�n�rer les voisins al�atoirement pour cr�er un pattern al�atoire... La taille aussi est al�atoire... Il est bien sur possible de calculer une grille suite � l'�tablissement de ces param�tres mais le script passerait de r�cursif � it�ratif. Je vais surement r�ussir � obtenir un r�sultat sans superposition avec votre solution, mais je n'aurai pas comrpris ce qui ne vas pas avec la mienne .

    Merci !

  4. #4
    Expert confirm�
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par d�faut
    Hover me !
    Come together
    Right nooow�




    Edit: Bon soyons s�rieux. J'ai concentr� mon attention sur cette boucle :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    for ( var i = 0; 
              i < 6 && checkExist(newX, newY); 
              ++i) 
        {
          switch(randomIds[i]){
          case 1: //top left
            newX = x - sin_unit - unit;
            newY = y - cos_unit ;
            break;
          case 2: //top
            newX = x;
            newY = y - 2 * cos_unit;
            break;
          case 3: //top right
            newX = x + sin_unit + unit ;
            newY =  y - cos_unit ;
            break;
          case 4: //bottom right
            newX = x + sin_unit + unit ;
            newY = y + cos_unit ;
            break;
          case 5://bottom
            newX = x;
            newY = y + 2*cos_unit;
            break;
          case 6://bottom left
            newX = x - sin_unit - unit;
            newY = y + cos_unit;
            break;
          default:
            newX = 0;
            newY = 0;
            return;
          }
        };
    Et je me suis pos� la question : que se passe-t-il quand les six voisins existent d�j� ? � la fin de la boucle (quand i == 6) on a des valeurs newX et newY qui ne sont pas contr�l�es. Corrige �a, et je pense que ton probl�me sera r�solu

    Edit2: Un dernier conseil car tu as quelques variables non d�clar�es : utilise le mode strict et tu les verras tout de suite. Pour passer en mode strict, ajoute simplement la cha�ne "use strict"; au d�but de ton code.
    La FAQ JavaScript � Les cours JavaScript
    Touche F12 = la console → l�outil indispensable pour d�velopper en JavaScript !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2014
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2014
    Messages : 3
    Par d�faut
    Ooooh oui !!! C'etait en effet cette grossi�re erreur de programmation � l'origine du probl�me. Je suis navr� . Moi qui avait peur de ne pas pouvoir utiliser la r�cursivit� comme ceci � cause de l'aspect non-bloquant de javascript ! N'importe quoi, �a marche super bien. J'ai corrig� le script qui tourne maintenant comme je l'ai toujours voulu. Merci pour votre aide.

    Je poste ci dessous le script corrig�, ainsi qu'un nouveau lien le mettant en sc�ne (j'ai ajout� un num�rotage pour le fun h�h�).
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    document.addEventListener('DOMContentLoaded', function(){
     
      var canvas = document.getElementById('bgCanvas');
      var context = canvas.getContext('2d');
      var posTable;
     
      var nbTot = 100;
      var nbDrawn = 0;
     
      canvas.width = document.body.clientWidth;
      canvas.height = Math.max( window.innerHeight, document.body.clientHeight );
     
      function initPosTable( nbTot ){
        posTable = new Array(nbTot);
        for (var i = nbTot - 1; i >= 0; i--) {
          posTable[i] = new Array(2);
        }; 
      }
     
      function drawHexagon( x, y, unit ){
     
        var sin_unit = unit * Math.sin(Math.PI/6); 
        var cos_unit = unit * Math.cos(Math.PI/6);
     
        context.strokeStyle = 'rgba(150,150,150,'+ (0.8 - nbDrawn/nbTot )+')';
        context.shadowBlur = 10;
        context.shadowColor = 'rgba(150, 150, 150, 0.2 )';
        context.lineWidth = 2;
        context.beginPath();
        context.moveTo(x                  , y);
        context.lineTo(x + unit           , y);
        context.lineTo(x + unit + sin_unit, y + cos_unit);
        context.lineTo(x + unit           , y + 2 * cos_unit);
        context.lineTo(x                  , y + 2 * cos_unit);
        context.lineTo(x - sin_unit       , y + cos_unit);
        context.lineTo(x                  , y);
        context.stroke();
        context.fillStyle = 'rgba(200,0,0,'+(1 - nbDrawn/(nbTot*1.2) )+')';
        context.fill();
     
        context.font = "12pt Calibri,Geneva,Arial";
        context.fillStyle = 'rgba(0,20,20,1)';
        context.fillText(""+nbDrawn, x+15, y+30);
     
     
      }
     
      function drawBrother( x, y, unit ){
     
        //Don't draw what we can't see.
        //Maybe useless. Just to be sure it stops process out of canvas boundaries.
        if ( x < 0 || y < 0 || x > canvas.width || y > canvas.height ) return;
     
        drawHexagon(x,y,unit);
     
     
        posTable[nbDrawn][0] = Math.floor(x);
        posTable[nbDrawn][1] = Math.floor(y);
        ++nbDrawn;
     
        setTimeout(function() {
          drawSomeBrothers(x, y, unit );
        }, 30);
      }
     
      function checkExist(x, y){
     
        for ( var i = 0; i < posTable.length; ++i){
          //Strict position equality not match very well
          if ( ( Math.abs(posTable[i][0] == Math.floor(x))) 
            && ( Math.abs(posTable[i][1] == Math.floor(y))) ) {
            return true;
          }
        }
        return false;
      }
     
      function checkVisible(x, y){
        return !( x < 0 || y < 0 || x > canvas.width || y > canvas.height );
      }
     
      function drawSomeBrothers(x, y, unit){
     
        if (nbDrawn >= nbTot-1 ) return;
     
          /*At least 2 (direct) brothers per hexagon. More compact. More beautiful.*/
        for (var i = 0; i < 2; ++i ){
     
          var nextCoo = chooseRandomBrotherToDraw(x,y,unit);
          if (nextCoo[0] || nextCoo[1])
            drawBrother(nextCoo[0], nextCoo[1], unit);
     
        }
        return;
      }
     
      function shuffle(o){
        for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
        return o;
      }
     
      function chooseRandomBrotherToDraw(x,y,unit){
     
        var randomIds = [1,2,3,4,5,6];
        randomIds = shuffle(randomIds);
     
        var sin_unit = unit * Math.sin(Math.PI/6); 
        var cos_unit = unit * Math.cos(Math.PI/6);
     
        var newX = x;
        var newY = y;
     
     
        for ( var i = 0; 
              i < 6 && checkExist(newX, newY); 
              ++i) 
        {
          switch(randomIds[i]){
          case 1: //top left
            newX = x - sin_unit - unit;
            newY = y - cos_unit ;
            break;
          case 2: //top
            newX = x;
            newY = y - 2 * cos_unit;
            break;
          case 3: //top right
            newX = x + sin_unit + unit ;
            newY =  y - cos_unit ;
            break;
          case 4: //bottom right
            newX = x + sin_unit + unit ;
            newY = y + cos_unit ;
            break;
          case 5://bottom
            newX = x;
            newY = y + 2*cos_unit;
            break;
          case 6://bottom left
            newX = x - sin_unit - unit;
            newY = y + cos_unit;
            break;
          default:
            newX = 0;
            newY = 0;
            break;
          }
     
          if (!checkVisible(newX, newY)) {newX = x; newY = y;}
        };
     
        if (checkExist(newX, newY)) {newX = 0; newY = 0;}
     
        var nextPositionToDraw = new Array(2);
        nextPositionToDraw[0] = newX;
        nextPositionToDraw[1] = newY;
     
        return nextPositionToDraw;
     
      }
     
      function printPos(){
        for(var i = 0; i < posTable.length; ++i){
          console.log(posTable[i]);
        }
      }
     
      function main(){
        initPosTable(nbTot);
        nbDrawn = 0;
     
        var xFirst = Math.random() * canvas.width;
        var yFirst = Math.random() * canvas.height;    
        var unit = 40;
     
        drawBrother(xFirst, yFirst, unit);
      }
     
      document.getElementById("trigger").addEventListener( 'mouseover', function(){
        context.clearRect(0, 0, canvas.width, canvas.height);
        main();
      });
    });
    Et le lien de d�mo : http://codepen.io/anon/pen/Adsox

    EDIT : Les diff�rentes nuances de rouge ne sont cette fois-ci pas dues � une superposition mais � un d�grad� volontaire montrant la progression du pattern (au m�me titre que la num�rotation...).

    Pour ce qui est de la d�claration des variables, est-ce vraiment un probl�me ? Je ne vois pas d'erreur dans les logs d'ex�cution du script. J'ai justement essay� de tirer profit de ce que je crois savoir : si je ne mets pas le mot cl� var en d�clarant une variable alors celle-ci pourra �tre visible dans les blocs parents. Il vaut mieux �viter ce type de variable � grande port�e c'est �a ?
    Toujours est-il que j'ai modifi� le script pour qu'il s'ex�cute m�me avec la ligne "use strict" ; merci du conseil.

    Je passe en r�solu ; ce n'�tait pas un probl�me d'ordre d'ex�cution.

  6. #6
    Expert confirm�
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 100
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 100
    Par d�faut
    Les num�ros �a aurait p� t'aider si tu les avais mis plus t�t

    Le probl�me des variables sans var, pour moi c'est surtout un probl�me de maintenance. En mettant var, m�me au niveau global, tu expliques au lecteur du code (potentiellement toi dans le futur, apr�s plusieurs semaines sans toucher au projet) que ce n'est pas un oubli, que c'est ben �a que tu as voulu faire.

    Sinon tu as raison, les variables � grande port�e, il vaut mieux �viter car si ton script est inclus dans une page avec d'autres scripts qui d�clarent aussi des globales, il peut y a voir conflit de nom. Il y a aussi une question de performance (m�me si personnellement, je pense que c'est n�gligeable) : depuis une fonction, aller chercher une variable � loin � dans le scope demandera plus d'efforts. C'est une histoire de lookup : l'interpr�teur regarde d'abord dans le scope courant, puis dans le scope parent, et ainsi de suite jusqu'au niveau global.

    C'est bien comme tu as fait : au niveau de la fonction du "DOMContentLoaded", c'est le niveau le plus g�n�ral, sans �tre global. Au passage, note que �a repose sur le principe des closures.
    La FAQ JavaScript � Les cours JavaScript
    Touche F12 = la console → l�outil indispensable pour d�velopper en JavaScript !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [JSTL] taglibs imbriqu�s : ordre d'ex�cution
    Par cedricmenou dans le forum Taglibs
    R�ponses: 6
    Dernier message: 27/04/2007, 15h20
  2. [URL Rewriting] ordre d'ex�cution des r�gles
    Par safisafi dans le forum Apache
    R�ponses: 1
    Dernier message: 21/11/2006, 18h52
  3. ordre d'ex�cution des �v�nements onblur et onfocus
    Par letycaf dans le forum G�n�ral JavaScript
    R�ponses: 5
    Dernier message: 23/05/2006, 15h30
  4. Ordre d'ex�cution de la requ�te
    Par raf_gug dans le forum Requ�tes
    R�ponses: 4
    Dernier message: 19/04/2006, 10h30
  5. Ordre d'ex�cution dans une jointure externe
    Par Pero dans le forum Langage SQL
    R�ponses: 17
    Dernier message: 20/09/2005, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo