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 :

Vérification de champs dans tableau complexe avant enregistrement


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut Vérification de champs dans tableau complexe avant enregistrement
    Bonjour,

    J'éprouve de nouveau une grande difficulté à réaliser la fin d'une page d'un site de gestion de fournitures.

    J'ai fait appel à votre aide ce week-end pour réussir à faire un calcul de valeur ligne par ligne.

    La réponse de Bovino Calcul valeur champ input à très bien fonctionné, mais maintenant je suis passé à l'étape d'après qui consiste à vérifier avant enregistrement dans la bdd.

    Comme expliqué dans mon précédent message la page en question affiche un tableau de fournitures dont le nombre de ligne n'est pas fixe. Il y a dans ce tableau 16 colonnes correspondant aux différents services pouvant accueillir des champs input si une demandes faite par ce service à été enregistrer via une autre page.
    Page accessible a cette adresse :

    Chaque champ input possède un id unique composé ainsi :
    id="fournXX_servYY"
    XX étant le n° de la fourniture
    YY étant le n° du service

    Avant de pouvoir enregistrer les informations de la bdd je souhaite faire quelques vérifications.

    Je rappel que la validation se fait ligne par ligne.

    Au bout de chaque ligne du tableau se trouve un bouton (pour le moment ce n'est qu'une image) qui une fois cliqué devra calculer la somme des valeurs des champs input de la ligne et uniquement de la ligne et les comparer à des valeurs issues de ma bdd.

    Scénario
    Affecter au bouton d'enregistrement de chaque ligne, le n° de fourniture
    Lorsque je clique sur le bouton la somme des champs input de la ligne est vérifié.
    Si la somme est supérieur à l'état du stock => ALERT
    Si la somme est supérieur au total des demandes => ALERT
    Sinon pour chaque champ input de la ligne, boucle d'enregistrement dans la base de donnée.
    Je vous joint le code complet de la page au cas ou mes explications ne soient pas clair.

    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
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
    <link rel="stylesheet" href="./style.css" type="text/css">
    <script type="text/javascript">
    function numbersOnly(e) {
        var evt = (e) ? e : window.event;
        var key = (evt.keyCode) ? evt.keyCode : evt.which;
     
        if(key != null) {
           key = parseInt(key, 10);
     
        if((key < 48 || key > 57) && (key < 96 || key > 105)) {
            if(!isUserFriendlyChar(key))
              return false;
            }
            else {
              if(evt.shiftKey)
                return false;
            }
          }
     
          return true;
    }
     
    function isUserFriendlyChar(val) {
        // Backspace, Tab, Enter (13 désactivé), Insert, and Delete
        if(val == 8 || val == 9 || val == 45 || val == 46)
           return true;
     
        // Ctrl, Alt, CapsLock, Home, End, and Arrows
        if((val > 16 && val < 21) || (val > 34 && val < 41))
          return true;
     
    	// The rest
        return false;
    }
     
    function compte(ref){
        while(ref.tagName != "TR"){
            ref = ref.parentNode;
        }
        var total = 0, count = ref.getElementsByTagName('input'), i = count.length;
        while(i){
            i--;
            total += parseInt(count[i].value,10);
        }
        ref.getElementsByTagName('td')[2].innerHTML = total;
    }
    </script>
    </head>
     
    <body>
     
    <?php
    // Connexion à la base mysql
    include('../connexion.php');
     
    unset($rub);
    unset($srub);
     
     // Début du formulaire
     echo '<form name="form_enregistrement" action="valid_demandes.php" method="POST">';
     
     // Titre de la page
     echo '<div style="text-align:center;"><img src="./images/admin_titre_demande.png"></div>';
     
     // Tableau des fournitures
     echo '<table id="table_fournitures" cellspacing="2">';
     echo '<tr height="50">';
     
     // Titre des colonnes
     echo '<th class="titre" width="320"></th>';
     echo '<th class="titre2" width="43">ETAT stock</th>';
     echo '<th class="titre_total" width="52">TOTAL demande</th>';
     
     // Requête SQL permettant de récupérer les noms des services
     $req_titre_services = mysql_query ("
    	SELECT *
    	FROM services
    	ORDER BY serv_id");
     while ($sql_titre_services = mysql_fetch_array($req_titre_services)){
    	echo '<th class="titre2" width="30" alt="'.$sql_titre_services['serv_nom '].'" title="'.$sql_titre_services['serv_nom '].'">'.$sql_titre_services['serv_initiale'].'</th>';
     }
     echo '<th class="titre3" width="18"></th>';
     echo '</tr>';
     
     // Requête SQL de sélection des fournitures dans la table sql
     $req_fournitures = mysql_query ("
    	SELECT *
    	FROM rubriques
    	JOIN srubriques ON rubriques.rub_id=srubriques.rub_id
    	JOIN fournitures ON srubriques.srub_id=fournitures.srub_id
    	ORDER BY rubriques.rub_ordre ASC, srubriques.srub_ordre ASC, fournitures.fourn_ordre ASC");
     while ($sql_result = mysql_fetch_array($req_fournitures)){
     
    	// Requête SQL du calcul de la somme total des demandes par fourniture
    	$req_sum_dem_total = mysql_query ("
    	SELECT SUM(dfourn_quantite) as sum_dem_total
    	FROM dem_fournitures
    	WHERE dem_fournitures.fourn_id=".$sql_result['fourn_id']."
    	GROUP BY dem_fournitures.fourn_id
    	LIMIT 1");
    	$sql_sum_dem_total = mysql_fetch_array($req_sum_dem_total);
     
    	// Requête SQL du calcul de la somme total des livraisons par fourniture
    	$req_sum_livr_total = mysql_query ("
    	SELECT SUM(lfourn_quantite) as sum_livr_total
    	FROM livr_fournitures
    	WHERE livr_fournitures.fourn_id=".$sql_result['fourn_id']."
    	GROUP BY livr_fournitures.fourn_id
    	LIMIT 1");
    	$sql_sum_livr_total = mysql_fetch_array($req_sum_livr_total);
     
    	// Variable égale au nombre réel de fourniture non livré. (somme total des demandes - somme total des livraisons)
    	$somme_demandes = ($sql_sum_dem_total['sum_dem_total']-$sql_sum_livr_total['sum_livr_total']);
     
    	// Affichage d'une ligne vide si nouvelle rubrique
    	if ($sql_result['srub_nom']<>$srubrique and $rubrique<>null and $somme_demandes<>0) {
    		echo '<tr><td class="td_vide" height="10" colspan="20"></td></tr>';
    	}
    	// Affichage du nom de la rubrique
    	if ($sql_result['rub_nom']<>$rubrique and $somme_demandes<>0) {
    		$rubrique = $sql_result['rub_nom'];
    		echo '<tr><td class="td_admin_rubrique" colspan="20">'.$sql_result['rub_nom'].'</td></tr>';
    	}
    	// Affichage du nom de la sous-rubrique
    	if ($sql_result['srub_nom']<>$srubrique and $somme_demandes<>0) {
    		$srubrique = $sql_result['srub_nom'];
    		echo '<tr><td class="td_srubrique" colspan="20">'.$sql_result['srub_nom'].'</td></tr>';
    	}
    	// Affichage d'une ligne vide si fourniture est = à espace
    	if ($sql_result['fourn_nom']=='espace' and $somme_demandes<>0) {
    		echo '<tr><td class="td_vide" height="10" colspan="20"></td></tr>';
    	} else {
     
    	//Condition : si la somme des demandes est différente de 0 la ligne s'affiche
    	if ($somme_demandes<>0) {
     
    		// Requête SQL du calcul de la somme total des commandes de fournitures par fourniture
    		$req_sum_com = mysql_query ("
    		SELECT SUM(cfourn_quantite) as sum_com
    		FROM com_fournitures
    		WHERE com_fournitures.fourn_id=".$sql_result['fourn_id']."
    		GROUP BY com_fournitures.fourn_id
    		LIMIT 1");
    		$sql_sum_com = mysql_fetch_array($req_sum_com);
     
    		// Requête SQL permettant de récupérer la valeur moyenne des commandes par fourniture
    		$req_avg_com = mysql_query ("
    		SELECT avg(cfourn_quantite) as avg_com
    		FROM com_fournitures
    		WHERE com_fournitures.fourn_id=".$sql_result['fourn_id']."
    		LIMIT 1");
    		$sql_avg_com = mysql_fetch_array($req_avg_com);
     
    		// Variable égale au stock réel (somme total des commandes moins la somme total des livraisons)
    		$stock = $sql_sum_com['sum_com']-$sql_sum_livr_total['sum_livr_total']; 
     
    		// Variable égale à l'état du stock en pourcentage par rapport à la valeur la plus importante des commandes pour chaque fourniture
    		if ($stock>0) {
    			$coul_etat_stock = ($stock/$sql_avg_com['avg_com'])*100;
    			// Condition : si l'état est égale a 20 ou mois la couleur est rouge, si égale ou moins de 50 la couleur est orange et si supérieur à 50 la couleur est verte
    			if ($coul_etat_stock<=20) { $coul_etat_stock = 'td_fourniture3'; $alt_etat_stock ='Stock faible (- de 20%)';}
    			if ($coul_etat_stock>21 and $coul_etat_stock<=50) { $coul_etat_stock = 'td_fourniture2'; $alt_etat_stock ='Stock moyen (>20% et <50%)';}
    			if ($coul_etat_stock>51) { $coul_etat_stock = 'td_fourniture1'; $alt_etat_stock ='Stock bon (> à 50%)';}
    		} else { $coul_etat_stock = 'td_fourniture'; $alt_etat_stock='Stock';}
     
    		// Affichage des fournitures
    		echo '<tr class="tr_fourniture">';
    		echo '<td class="td_fourniture" style="text-align:left;">'.ucfirst($sql_result['fourn_nom']).' - <span style="color:#FF0000">'.$sql_result['fourn_cond'].'</span> (<span style="font-weight:bold;">'.$sql_result['fourn_format'].'</span>) '.$sql_result['fourn_nuance'].'</td>';
    		echo '<td class="'.$coul_etat_stock.'" alt="'.$alt_etat_stock.'" title="'.$alt_etat_stock.'">'.$stock.'</td>';
     
    		// Affichage de la somme total des demandes moins le total des livraisons répartie pour chaque fourniture
    		echo '<td class="td_admin_rubrique2" alt="Total demande" title="Total demande">'.$somme_demandes.'</td>';
     
    		// Requête SQL permettant de récupérer les informations de chaque service
    		$req_services = mysql_query ("
    		SELECT *
    		FROM services");
    		while ($sql_services = mysql_fetch_array($req_services)){
     
    			// Requête SQL permettant de calculer la somme des demandes de fourniture repartie par fourniture et par service
    			$req_sum_dem = mysql_query ("
    			SELECT SUM(dfourn_quantite) as sum_dem
    			FROM dem_fournitures
    			WHERE dem_fournitures.fourn_id=".$sql_result['fourn_id']." AND dem_fournitures.serv_id=".$sql_services['serv_id']."
    			GROUP BY dem_fournitures.fourn_id, dem_fournitures.serv_id
    			LIMIT 1");
    			$sql_sum_dem = mysql_fetch_array($req_sum_dem);
     
    			// Requête SQL permettant de calculer la somme des livraisons de fourniture repartie par fourniture et par service
    			$req_sum_livr = mysql_query ("
    			SELECT SUM(lfourn_quantite) as sum_livr
    			FROM livr_fournitures
    			WHERE livr_fournitures.fourn_id=".$sql_result['fourn_id']." AND livr_fournitures.serv_id=".$sql_services['serv_id']."
    			GROUP BY livr_fournitures.fourn_id, livr_fournitures.serv_id
    			LIMIT 1");
    			$sql_sum_livr = mysql_fetch_array($req_sum_livr);
     
    			// Variable égale au nombre réel de fourniture non livré repartie par fourniture et par service (somme total des demandes - somme total des livraisons)
    			$somme = ($sql_sum_dem['sum_dem']-$sql_sum_livr['sum_livr']);
     
    			// Affichage de la somme total des demandes - le total des livraisons répartie par fourniture et par service 
    			echo '<td class="td_fourniture" alt="'.$sql_services['serv_initiale'].'" title="'.$sql_services['serv_initiale'].'">';
    			// Condition : si la somme est suppérieur à 0 un champ input est affiché avec la valeur de $somme
    			if ($somme>0) {
    				echo '<input type="texte" id="fourn'.$sql_result['fourn_id'].'_serv'.$sql_services['serv_id'].'" maxlength="3" style="width: 19px" class="input_affichage" value="'.$somme.'" onkeydown="return numbersOnly(event);" onpaste="return false;"></td>';
    			} else { echo '</td>'; }
    		}
    	echo '<td class="td_admin_rubrique3"><img src="./images/admin_valider.png" align="absmiddle" style="cursor:pointer"; onmouseover="this.src=\'./images/admin_valider_hoover.png\';" onmouseout="this.src=\'./images/admin_valider.png\';" onclick="if($somme<=$stock) then submit(); else alert("pouet");"></td>';
    	echo '</tr>';
    	}
     
    	}
     }
     echo '</table>'; 
    ?>
     
    <script type="text/javascript">
    var base = document.getElementById("table_fournitures").getElementsByTagName('input');
    var compteur = base.length;
    	while(compteur){
    		compteur--;
    		base[compteur].onkeyup = function(){compte(this)};
    	}
    </script>
     
    </body>
    </html>
    Merci d'avance les amis.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut
    Exemple concret avec la première ligne du tableau.

    Si je clique sur le bouton valider de la première ligne :

    Je vérifie que la somme des chiffres écrit dans les champs input a savoir 3+407 soit inférieur à la valeur de $stock (valeur du stock calculé via la base de donnée) qui est de 133 et que 3+407 soit bien inférieur ou égale à $somme (valeur total des demandes calculé via la base de donnée).
    => Dans ce cas ce n'est pas bon donc Alert

    Autre exemple, si après modification manuelle la somme de mes champs sont égale a 100 et donc inférieur à la valeur de $stock et de $somme.
    => Dans ce cas c'est bon et mon enregistrement dans ma base peut se faire.

    Une des difficultés, est que via du javascript je peu faire évoluer la valeur du total de demande si j'ai changé des chiffres dans les champs input.
    Je dois donc comparer des valeurs issues de calculs de valeur de ma base de données mais également de valeurs que j'aurais pu modifier pour répondre à la condition d'enregistrement.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Qu'est-ce que tu n'arrives pas à faire, exactement ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut
    A mettre en place les vérifications.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Je reformule :

    Quand tu as essayé qu'est-ce qui t'a posé problème ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut
    Je viens de réussir à passer la première vérification.

    Celle où je devais contrôler que le total des demandes était bien inférieur à mon stock pour pouvoir valider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function verif_total(ref){ 
        while(ref.tagName != "TR"){ 
            ref = ref.parentNode; 
        } 
       var td1 = parseInt(ref.getElementsByTagName('td')[1].innerHTML); 
       var td2 = parseInt(ref.getElementsByTagName('td')[2].innerHTML); 
     
       if (td2 > td1){ 
          alert("Attention : vous n'avez pas assez de fournitures en stock.\n Demandes="+td2+" et Stock="+td1) 
          return false; 
       } 
    }
    Il me reste donc une dernière vérification à faire mais je n'arrive pas trouver la solution.

    Il me faut contrôler la valeur d'un champ input apr-s la modification par l'utilisateur.
    Ex : lors du chargement de la page le champ inputxxx = 35
    Si l'utilisateur écrit une valeur <=35 dans le champ c'est BON rien ne se passe.
    Par contre si la valeur et supérieur alors "Alert".

    Comment dois-je procéder selon vous ?
    Créer un champ input hidden avec la valeur d'origine ?

    Merci d'avance.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut
    Existe t'il un moyen d'empêcher dynamiquement la saisie d'un chiffre en dehors d'une plage définit (dans un champ input) ?

    En gros dans ce champ input n'est authorisé que les chiffres compris entre 0 et 35.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut
    Je verrais bien un onkeyup ou autre onkey avec un petit java qui compare la valeur saisie dans le champ input avec la valeur qui était placé à l'origine.
    Si la valeur modifié est supérieur il fait une alert sinon il ne dis rien.

    Bon je dis je verrais bien, mais je ne sais pas du tout si c'est quelque chose de possible.

    Merci.

    --

    Après lecture d'un message de réponse de Bovino j'ai peut être un début de réponse.

    il faudrait que je rajoute dans mon champ input un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onfocus="this.defaultValue = this.value"
    ainsi qu'un Maintenant la difficulté est de faire la comparaison avec "this.value".

    Si this.value>this.defaultValue alors Alert

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 32
    Points : 13
    Points
    13
    Par défaut
    Je pense me rapprocher de la solution avec ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onfocus="this.defaultValue = this.value" onchange="if(this.value > this.defaultValue) { alert('Erreur') }"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Regroupement champs dans tableau croisé dynamique
    Par Boubas1 dans le forum Excel
    Réponses: 4
    Dernier message: 02/01/2009, 20h39
  2. vérification de champ dans un formulaire
    Par didierledid dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 26/12/2007, 09h26
  3. Vérification de champ dans un formulaire
    Par akara dans le forum Langage
    Réponses: 2
    Dernier message: 16/07/2007, 15h24
  4. vérification des champs d'un formulaire avant envoi
    Par fey dans le forum Général JavaScript
    Réponses: 28
    Dernier message: 18/05/2007, 17h34
  5. Réponses: 4
    Dernier message: 09/01/2007, 22h28

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