Bonjour à tous,
Voilà, je ne sais absolument pas comment résoudre le problème ci-dessous. La solution passe-t-elle par de l’AJAX ou peut-elle être générée que par du JS ?
Mais quel est le problème ?
Voilà, j’ai une application qui fonctionne comme décrite ci-dessous :
L’application permet de dresser une liste de prestations qui seront facturées à un client. Pour chaque prestation, l’utilisateur doit préciser son fournisseur.
L’utilisateur peut ajouter autant de ligne qu’il le souhaite. Par défaut, toute nouvelle ligne de prestation créée est supposée être le fait du fournisseur numéro 1. Ce fournisseur a été défini auparavant.
Évidemment, une prestation donnée peut être fourni par un autre fournisseur. Dans ce cas, il précise dans la colonne Supplier num, un autre nombre. Imaginons, qu’on rajoute une assurance. La logique veut qu’il mette 2 pour le second fournisseur, mais s’il veut mettre 45 ou un autre nombre, il peut. Cette numérotation est propre à l’utilisateur.
Lorsqu’il saisit 2 pour la première fois, l’application crée automatiquement une seconde ligne dans le tableau des fournisseurs (suppliers). L’utilisateur doit alors préciser de quel fournisseur il s’agit via un menu déroulant.
A ce stade, on sait que l’assurance coûte 300 unités, mais on ne connait pas la devise, car on ne connait pas le fournisseur. Une fois sélectionné le fournisseur dans le menu déroulant, l’application met à jour la devise dans tous les tableaux (via l’utilisation d’AJAX) et met à jour les totaux.
Précision : on affiche une liste de fournisseurs classés par catégorie. Un même fournisseur peut appartenir à différentes catégories. Le fait que Fournisseur A apparaisse dans les catégories « delivery » et « Insurances » est donc tout à fait possible.
Ainsi si on créé une autre ligne : Moteur , nous avons au début ceci
On renseigne, les montants :
L’application se charge de mettre à jour les montants totaux (par fournisseur) via des fonctions JS.
Si on décide que Moteur est fourni par le fournisseur num = 2, on met 2 et (en toute logique) aucune nouvelle ligne « suppliers » n’est créée, puisqu’on sait déjà que 2 = Fournisseur A. Par contre en mettant 2, l’application met bien jour les montants.
Jusque là pas de problème.
Imaginons, maintenant qu‘on créer une autre ligne de presation: « Nourriture » et que l’utilisateur décide de mettre 12 dans Supplier_num. L’application va donc créer une nouvelle ligne fournisseur .
L’utilisateur peut actuellement décider que 12 est le fournisseur A. Actuellement, l’application ne l’interdit pas. Notez qu’on a mit 12, mais on aurait aussi pu mettre logiquement 3 comme numéro. Le problème n'est pas d'interdire de mettre 12, mais on doit interdire le choix Fournisseur A.
Eh c’est là le problème !
Il est impératif que ce choix ne soit pas possible. Lorsque l’utilisateur saisit 12 et quitte le champ « supplier num », l’application doit en toute logique créer une nouvelle ligne dans le tableau « Suppliers » , mais dans le menu déroulant proposé, il ne devrait pas apparaître le nom du fournisseur A, puisque déjà utilisé.
Et là je ne sais pas comment faire.
Ce que je souhaiterais donc c’est que n’apparaissent que les fournisseurs non encore utilisés au fur est à mesure.
Exemple : au départ : le menu déroulant propose tous les fournisseurs.
Puis ensuite tous les fournisseurs sauf le fournisseur A (car déjà utilisé)
Donc le 1er menu déroulant correspondant au choix du fournisseur 2 affiche tous les fournisseurs possibles.
Le 2nd menu déroulant correspondant au choix du second fournisseur (ici numéroté 12) affiche tous les fournisseurs moins le Fournisseur A , car déjà choisi.
Etc, etc.
Donc si il y a avait un autre fournisseur :
Avant que vous puissiez m’aider, encore faudrait-il que je vous explique comment fonctionne techniquement l’application. Alors voilà autant que je m’en souvienne … j’ai fait cela il y a plus d’un an !
Comment fait l’application pour savoir si il faut ou pas créer voire supprimer une ligne de fournisseur ?
L’application utilise en autre la fonction function ajoutLigneAuTableauFournisseur(num_fournisseur)
On gère une notion de champ caché où on stocke les num_fournisseur utilisés. Lorsqu’on crée une ligne avec un numéro de fournisseur, l’application analyse si ce numéro a déjà été utilisé ou non. Si le numéro en question a déjà été utilisé, on ne créé pas de nouvelle ligne dans le tableau Supplier. Si on créé un nouveau numéro de fournisseur, l’application crée une nouvelle ligne dans le tableau et enfin au cas où on supprimerait un numéro, l’application supprime du tableau la ligne fournisseur concernée. Aucun bug à ce niveau là.
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 /* ----------- Début de la Fonction qui permet de mettre à jour le tableau fournisseur -------------------- */ function ajoutLigneAuTableauFournisseur(num_fournisseur) { //this.num_fournisseur = num_fournisseur; //num_fournisseur = parseInt(this.num_fournisseur); var array_numfournisseur = new Array('1'); if (!in_array (num_fournisseur,array_histo_numfournisseur)) { // on met à jour l'array histo avec le nouveau numero de fournisseur array_histo_numfournisseur.push(num_fournisseur); var tbl = document.getElementById('tabfournisseur'); var num_founisseur = num_fournisseur; // ajout d'une ligne var row = tbl.tBodies[0].insertRow(-1); // céation de la cellule 0 avec dedans le numéro de fournisseur var newCell0 = row.insertCell(0); var textNode0 = document.createTextNode(num_founisseur); newCell0.appendChild(textNode0); var newCell1 = row.insertCell(1); listefournisseurs = document.getElementById("id_fournisseur"); copie_listefournisseurs = listefournisseurs.cloneNode(true); copie_listefournisseurs.setAttribute('id','id_fournisseur'+num_fournisseur); copie_listefournisseurs.setAttribute('name','id_fournisseur'+num_fournisseur); //copie_listefournisseurs.onchange = function () {'demandeServeurDevise('+num_fournisseur+')'}; newCell1.appendChild(copie_listefournisseurs); var champDevise = document.createElement('input'); champDevise.setAttribute('type','hidden'); champDevise.setAttribute('size','2'); champDevise.setAttribute('name','devise_fournisseur'+num_fournisseur); champDevise.setAttribute('value',''); champDevise.setAttribute('id','devise_fournisseur'+num_fournisseur); newCell1.appendChild(champDevise); var newCell2 = row.insertCell(2); var montantAchat = document.createElement('input'); montantAchat.setAttribute('type','text'); montantAchat.setAttribute('size','14'); montantAchat.setAttribute('name','montantAchatFournisseur'+num_fournisseur); montantAchat.setAttribute('value','0'); montantAchat.setAttribute('id','montantAchatFournisseur'+num_fournisseur); montantAchat.className='tab_input_nombre_monnetaire_gris'; montantAchat.setAttribute('readOnly',true); newCell2.appendChild(montantAchat); var champtab_num_fournisseur = document.createElement('input'); champtab_num_fournisseur.setAttribute('type','hidden'); champtab_num_fournisseur.setAttribute('size','6'); champtab_num_fournisseur.setAttribute('name','tab_num_fournisseur'); champtab_num_fournisseur.setAttribute('id','tab_num_fournisseur'); champtab_num_fournisseur.setAttribute('value',''); newCell2.appendChild(champtab_num_fournisseur); var champid_fourniture_services = document.createElement('input'); champid_fourniture_services.setAttribute('type','hidden'); champid_fourniture_services.setAttribute('size','6'); champid_fourniture_services.setAttribute('name','id_fourniture_services'); champid_fourniture_services.setAttribute('value',''); newCell2.appendChild(champid_fourniture_services); for (var i = 0 ; i < array_histo_numfournisseur.length ; i++){ tbl.tBodies[0].rows[i].className = 'bleu'+(i%2); } } // initialisation des array à 0 pour tous les numéros de fournisseur utilisés for (var f=0; f<(1+nbLignesInclus+nbLignesOptions+nbLignesRemises+nbLignesCommission);f++) { var numerofournisseur = document.getElementById("num_fournisseur"+f).value; //var numerofournisseur_numeric = parseInt(numerofournisseur); if (!in_array (numerofournisseur,array_numfournisseur)) { array_numfournisseur.push(numerofournisseur); } } //alert('array_numfournisseur :' +array_numfournisseur.join(" - ") ); //alert('array_histo_numfournisseur :' +array_histo_numfournisseur.join(" - ") ); for (var z=0; z< array_histo_numfournisseur.length; z++) { if (!in_array (array_histo_numfournisseur[z],array_numfournisseur)) { // suprresion de la ligne dans le tableau fournisseur vu que le numéro du fournisseur n'est plus utilisé supprimerFournisseur(array_histo_numfournisseur[z]); // mise à jour de l'array histo array_histo_numfournisseur.splice(z,1); } } CalculMontantFournisseur(); } /* ----------- fin de la fonction -------------------- */ /* ----------- IN_ARRAY -------------------- */ function in_array(myValue,myArray) { function equals(a,b) { return (a === b); } for (var i in myArray) { if (equals(myArray[i],myValue)) return true; } return false; }
Le problème vient de là :
Lorsqu’on créer un nouveau num_fournisseur, l’application créer en toute logique une nouvelle ligne dans le tableau « suppliers ».
Pour ce faire je fais :
le seul moyen que j’ai trouvé à l’époque pour créer le champ select est de faire une copie d’un champ select caché.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 var newCell1 = row.insertCell(1); listefournisseurs = document.getElementById("id_fournisseur"); copie_listefournisseurs = listefournisseurs.cloneNode(true); copie_listefournisseurs.setAttribute('id','id_fournisseur'+num_fournisseur); copie_listefournisseurs.setAttribute('name','id_fournisseur'+num_fournisseur); //copie_listefournisseurs.onchange = function () {'demandeServeurDevise('+num_fournisseur+')'}; newCell1.appendChild(copie_listefournisseurs);
En d’autres termes, lorsque la page se charge, ce champ select (id="id_fournisseur") est connu. Quelque soient les fournisseurs utilisés ou pas, ce menu déroulant reste invariable. Et c’est bien là où est le problème !
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 <div style='display:none;'> <select name="id_fournisseur" tabindex="1" id="id_fournisseur" onchange='demandeServeurDevise(this)' onFocus="this.className='focus';" onBlur="this.className='normal';"> <option value="0">Select a supplier</option> <? $req_categorie_fournisseur = "SELECT id_categorie_fournisseur, categorie_fournisseur_lib_anglais FROM fournisseur f LEFT JOIN fournisseur_categorie_fournisseur fcf ON f.id_fournisseur = fcf.fournisseur_id LEFT JOIN categorie_fournisseur cf ON fcf.categorie_fournisseur_id = cf.id_categorie_fournisseur WHERE fcf.categorie_fournisseur_id != '1' AND f.groupe_id = '0' AND f.f_actif = 'Y' GROUP BY categorie_fournisseur_lib_anglais"; $categorie_fournisseur = ExecRequete($req_categorie_fournisseur, $connexion); while ($listecategoriefournisseur = mysql_fetch_object($categorie_fournisseur)){ print("<optgroup label=".$listecategoriefournisseur->categorie_fournisseur_lib_anglais.">"); $req_fournisseur= "SELECT id_fournisseur, nom_fournisseur FROM fournisseur f LEFT JOIN fournisseur_categorie_fournisseur fcf on f.id_fournisseur=fcf.fournisseur_id LEFT JOIN categorie_fournisseur cf on fcf.categorie_fournisseur_id =cf.id_categorie_fournisseur WHERE fcf.categorie_fournisseur_id !='1' AND f.f_actif='Y' AND fcf.categorie_fournisseur_id =".$listecategoriefournisseur->id_categorie_fournisseur." ORDER BY 'nom_fournisseur'"; $fournisseur_dela_categorie = ExecRequete($req_fournisseur, $connexion); while ($listefournisseur = mysql_fetch_object($fournisseur_dela_categorie)){ if($listefournisseur->id_fournisseur==$_POST['id_fournisseur1']){$ct1="selected";} print("<option ".$ct1." value=".$listefournisseur->id_fournisseur.">".$listefournisseur->nom_fournisseur."</option>"); unset($ct1); } print("</optgroup>"); }?> </select> </div>
Je ne sais absolument pas comment m’y prendre.
Partager