Modifier une liste déroulante "fille" en fonction du choix d'une liste déroulant

cs_madhatterx Messages postés 11 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 21 juin 2012 - 7 juil. 2010 à 17:08
cs_madhatterx Messages postés 11 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 21 juin 2012 - 20 juil. 2010 à 16:55
Bonjour,

Avant de commencer, je tiens à signaler que mes compétences en matière de codage relèvent de l'amateurisme (je suis en première année de BTS IG), donc bonne connaissance en HTML, CSS, ainsi que quelques notions de PHP, ASP, Javascript et C#.

Mon problème est que je souhaite créer un formulaire avec des listes déroulantes (=LD) dynamiques.

Voici, en gros, la base de données que je vais utiliser pour mes listes déroulantes:

idBat | soustype | type | catégorie
1 | école | scolaire | batiment
2 | creche | scolaire | batiment
3 | bureaux | administratif| batiment
4 | clinique | hospitalier | batiment
5 | null | sculpture | ouvrage d'art
...

Je veux donc avoir dans ma première LD, la catégorie; dans la deuxième, le type en fonction de la catégorie; et dans la troisième, le sous-type en fonction du type.

Ex: quand je sélectionne Batiment dans la 1ere LD, je ne verrais pas apparaitre de type Sculpture (si on suit la base de données ci-dessus), je verrais Administratif, Scolaire, Hospitalier. Et si je sélectionne Scolaire dans ma 2eme LD, j'aurais le choix entre école ou crèche.

Donc, le problème est posé. Comment codé tout ça? Ma base de données est sur SQL Server 2008, ma page web est en HTML/ASP/Javascript.

Ci-dessous, je vous montre le premier jet de mon code , cela donne mes 3 LD mais la 2ème ne varie pas selon la première (elle donne tous les "type"), idem pour la troisième, elle donne tous les "soustype".

<%' Ouverture d'une connexion avec la base affaire
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "mon_dns", "", ""
' Ouverture de l'espace memoire du recordset
Set Rs2 = Server.CreateObject("ADODB.Recordset")
varSQL = "SELECT DISTINCT catégorie FROM typeouvrage"
Rs2.Open varSQL, Conn
' Ouverture de l'espace memoire du recordset
Set Rs3 = Server.CreateObject("ADODB.Recordset")
varSQL = "SELECT DISTINCT type FROM typeouvrage"
Rs3.Open varSQL, Conn
' Ouverture de l'espace memoire du recordset
Set Rs4 = Server.CreateObject("ADODB.Recordset")
varSQL = "SELECT soustype FROM typeouvrage"
Rs4.Open varSQL, Conn
%>

<td>
<select size="1" name="formcatbat">
<option value="prem?" selected> ? </option>
<%Do while Not Rs2.EOF%>
<option value="<%=Rs2("catégorie")%>"><%=Rs2("catégorie")%></option>
<%Rs2.MoveNext
Loop%>
</select>

<select size="1" name="formtypebat">
<option value="deux?" selected> ? </option>
<%Do while Not Rs3.EOF%>
<option value="<%=Rs3("type")%>"><%=Rs3("type")%></option>
<%Rs3.MoveNext
Loop%>
</select>

<select size="1" name="formsoustype">
<option value="trois?" selected>?</option>
<%Do while Not Rs4.EOF%>
<option value="<%=Rs4("soustype")%>"><%=Rs4("soustype")%></option>
<%Rs4.MoveNext
Loop%>
</select>
</td>


<% Conn.Close
Rs1.Close
Rs2.Close
Rs3.Close
Rs4.Close
%>



merci d'avance à ceux qui peuvent aider le pauvre novice que je suis, n'hésitez pas si vous avez besoin de plus de précisions.

3 réponses

cs_madhatterx Messages postés 11 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 21 juin 2012
13 juil. 2010 à 11:11
J'ai continué mes recherches pour résoudre le problème ci-dessus, j'ai trouvé un bout de code sur ce

lien: http://www.plus2net.com/asp-tutorial/db-dropdown.php

Celà permet de recharger (reload)le formulaire quand la première LD est modifier (onchange).

Après avoir adapté le code, celà donne:

<script language="javascript">
<!--
function reload(form)
{
var val=form.categorie.options[form.categorie.options.selectedIndex].value;
self.location='afficher.asp?categorie=' + val ;
}
-->
</script>

<% Dim Conn,objRS,strSQL,categorie


' Ouverture d'une connexion avec la base affaire
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "itcaff", "", ""

Set objRs = Server.CreateObject("ADODB.Recordset")

'''''First drop down list starts here'''''

strSQL = "SELECT distinct catégorie from typeouvrage"
objRS.Open strSQL, Conn
Response.Write "<form method=post name=f1 action=''><select name=categorie onchange='reload

(this.form)'><option value=''>Select catégorie</option>"
Do While Not objRS.EOF
Response.Write "<option value=" & objRs("catégorie") & ">" & objRs("catégorie") & "</option>"
objRS.MoveNext
Loop
objRs.Close
Response.Write "</select>"
Response.Write "
----
"
categorie=Request.QueryString("categorie")
''' Second drop down list starts here ''''

If len(categorie) > 1 Then

strSQL = "SELECT DISTINCT type FROM typeouvrage where catégorie='" & categorie &"'"
objRS.Open strSQL, Conn
Response.Write "<select name=type><option value=''>Select type</option>"
Do While Not objRS.EOF
Response.Write "<option value=" & objRs("type") & ">" & objRs("type") & "</option>"
objRS.MoveNext
Loop
Response.Write "</select>"
Response.Write "</form>"
objRs.Close

end if
%>

La première LD me propose bien les catégories, puis une fois sélectionnée, la deuxième LD propose bien les types en fonction de la catégorie choisie.
Cependant, il ne maintient pas la valeur de la catégorie choisie dans la première LD, et je n'ai pas réussi à adapter plus loin pour obtenir ma 3ème LD, j'ai qd même essayé avec une autre fonction reload2 (qui reprend les paramètres catégories et types), mais ça ne marche pas, quelqu'un pourrait compléter et m'expliquer ce qui manque?

Merci.
0
cs_madhatterx Messages postés 11 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 21 juin 2012
20 juil. 2010 à 16:31
J'ai trouvé une solution que j'ai bricolé.

function reload(form)
{
var val=form.formcatbat.options[form.formcatbat.options.selectedIndex].value;
self.location="ajouter.asp?categorie=" + val ;
}
function reload2(form)
{
var val=form.formcatbat.options[form.formcatbat.options.selectedIndex].value;
var val2=form.formtypebat.options[form.formtypebat.options.selectedIndex].value;
self.location="ajouter.asp?categorie=" + val+"&type="+val2 ;

}

<%
Set objRs = Server.CreateObject("ADODB.Recordset")

'''''Première Liste déroulante'''''

strSQL = "SELECT distinct catégorie from typeouvrage"
objRS.Open strSQL, Conn
Response.Write "<select name=formcatbat onchange='reload(this.form)'><option value='?'>?</option>"
Do While Not objRS.EOF 
newcat=replace(objRs("catégorie"),"_"," ")
Response.Write "<option value=" & objRs("catégorie") & ">" & newcat & "</option>"
     objRS.MoveNext
 Loop
objRs.Close
categorie=Request.QueryString("categorie")
newcat=replace(categorie,"_"," ")
Response.Write "<option value='"&categorie&"' selected>"&newcat&"</option>"
Response.Write "</select>
"
Response.Write categorie

''' Seconde liste déroulante ''''

strSQL = "SELECT  DISTINCT type FROM typeouvrage where catégorie='" & categorie &"'"
objRS.Open strSQL, Conn
Response.Write "<select name=formtypebat onchange='reload2(this.form)'><option value='?'>?</option>"
Do While Not objRS.EOF 
newtype=replace(objRs("type"),"_"," ")
Response.Write "<option value=" & objRs("type") & ">" & newtype & "</option>"
     objRS.MoveNext
 Loop
typeo=Request.QueryString("type") 
newtype=replace(typeo,"_"," ")
Response.Write "<option value='"&typeo&"' selected>"&newtype&"</option>"
Response.Write "</select>
"
objRs.Close

''' Troisième liste déroulant ''''

strSQL = "SELECT  DISTINCT soustype FROM typeouvrage where type='" & typeo &"'"
objRS.Open strSQL, Conn
Response.Write "<select name=formsoustypebat><option value='?' selected>?</option>"
Do While Not objRS.EOF 
Response.Write "<option value=" & objRs("soustype") & ">" & objRs("soustype") & "</option>"
     objRS.MoveNext
 Loop
Response.Write "</select>"
objRs.Close
%>


Si vous avez de meilleures propositions, n'hésitez surtout pas, je pense qu'on peut faire plus propre.
0
cs_madhatterx Messages postés 11 Date d'inscription samedi 28 novembre 2009 Statut Membre Dernière intervention 21 juin 2012
20 juil. 2010 à 16:55
Un nouveau problème se pose avec le code ci-dessus:

I) Quand je dois créer une référence, cela se passe en 2 étapes:
1) je remplis un formulaire
2) je fais passer les données du formulaire vers la base de données

II) mais quand je dois modifier une référence, cela se passe en 3 étapes:
1) je choisis la référence à modifier
2) je remplis un formulaire avec les anciennes valeurs de la référence
3) je fais passer les données du formulaire vers la base de données

Mes 3 listes déroulantes fonctionnent bien dans le I), mais pas dans le II).

Il se trouve que je dois conserver le numéro de la référence dans le II) 1) pour l'utiliser dans le II) 2), pour faire appel aux anciennes valeurs... j'ai donc essayé dans un premier temps de le récupérer par un "Request.Form("formNumRef")", et dans un second temps avec un "Request.QueryString("numref")".

Ni l'un ni l'autre ne fonctionnent, mes listes déroulantes sont figées sur les anciennes valeurs, et dès que je veux sélectionner une autre catégorie, il perd mon numéro de référence dans le "onchange".
J'ai donc testé de mettre le numéro de référence dans les paramètres de l'URL, et il ne me renvoit jamais la bonne valeur (il me renvoit la première valeur de mon numRef dans ma base de données).

Il faut donc que je sache:
a) comment ajouter des paramètres dans une URL?
b) comment les récupérer quand il y a un "onchange" qui remet pas mal de choses à zéro?
c) pourquoi ma "Request.QueryString("numref")" me renvoit la première valeur de ma base de données?

Votre défi sera de me répondre avant que je trouve la solution .
Ci-dessous le code de mon II) 2).

function reload(form)
{

var val= form.formcatbat.options[form.formcatbat.options.selectedIndex].value;
self.location="modif_ref.asp?categorie=" + val;
}
function reload2(form)
{
var val=form.formcatbat.options[form.formcatbat.options.selectedIndex].value;
var val2=form.formtypebat.options[form.formtypebat.options.selectedIndex].value;

self.location="modif_ref.asp?categorie=" + val+"&type="+val2 ;

}

-->
</script>




<%
dim numRef
numRef=Request.Form("modif")
Response.Write numRef
' Ouverture d'une connexion avec la base affaire
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "itcaff", "", ""

Set Rs = Server.CreateObject("ADODB.Recordset")
varSQL = "SELECT NUMAFF from AFFAIRE ORDER BY NUMAFF"
Rs.Open varSQL, Conn

mon_chemin = "C:\Inetpub\wwwroot\itcinfo\REFERENCES\PDF"

Set Rsref = Server.CreateObject("ADODB.Recordset")
varSQLref = "SELECT * from REFERENCE,typeouvrage WHERE idBat=idBatRef AND numRef="&numRef&""
Rsref.Open varSQLref, Conn


%>

 Modification de références
 



<form name ="formmodif" method= "POST" action="./maj_ref.asp" onsubmit="return submitforms_mo()">
            <table class="test">
<tr>
<td width="30%" height="23" align="right">
                       Type Référence  :</td>
        <td width ="70%" height="23">
<%
Set objRs = Server.CreateObject("ADODB.Recordset")

'''''First drop down list starts here'''''

strSQL = "SELECT distinct catégorie from typeouvrage"
objRS.Open strSQL, Conn
Response.Write "<select name=formcatbat onchange='reload(this.form,"&numRef&")'><option value='"&Rsref("catégorie")&"' selected>"&Rsref("catégorie")&"</option>"
Do While Not objRS.EOF 
newcat=replace(objRs("catégorie"),"_"," ")
Response.Write "<option value=" & objRs("catégorie") & ">" & newcat & "</option>"
objRS.MoveNext
Loop
objRs.Close
categorie=Request.QueryString("categorie")
'numRef=Request.QueryString("numRef")'Permet de récupérer mon numRef après le rechargement du formulaire
newcat=replace(categorie,"_"," ")
Response.Write "</select>
"

Response.Write categorie
''' Second drop down list starts here ''''


strSQL = "SELECT  DISTINCT type FROM typeouvrage where catégorie='" & categorie &"'"
objRS.Open strSQL, Conn
Response.Write "<select name=formtypebat onchange='reload2(this.form,"&numRef&")'><option value='"&Rsref("type")&"'  selected>"&Rsref("type")&"</option>"
Do While Not objRS.EOF 
newtype=replace(objRs("type"),"_"," ")
Response.Write "<option value=" & objRs("type") & ">" & newtype & "</option>"
objRS.MoveNext
Loop
'numRef=Request.QueryString("numRef")'Permet de récupérer mon numRef après le rechargement du formulaire
typeo=Request.QueryString("type") 
newtype=replace(typeo,"_"," ")
Response.Write "</select>
"
objRs.Close


''' Third drop down list starts here ''''


strSQL = "SELECT  DISTINCT soustype FROM typeouvrage where type='" & typeo &"'"
objRS.Open strSQL, Conn
Response.Write "<select name=formsoustypebat><option value='"&Rsref("soustype")&"' selected>"&Rsref("soustype")&"</option>"
Do While Not objRS.EOF 
Response.Write "<option value=" & objRs("soustype") & ">" & objRs("soustype") & "</option>"
objRS.MoveNext
Loop
Response.Write "</select>"
objRs.Close


%>
0
Rejoignez-nous