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.
Citation:
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:
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.