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.