Combos dependientes

Te describo mi situación:
1.- Tengo Dos combos, el combo1, contiene las fases, esta relacionadao con la tabla Fases, y me muestra la lista de fases que se encuentran el la base de datos
2-. El combo 2 deben aparecer las Subfases, de la tabla subfases, cuyas subfases están relacionadas con la fase.
3-. La tabla Subfases contiene los siguientes campos:
Id, Nombre y Fase, el campo Fase es el que se relaciona con la Fase, si el campo Fase es Igual a Cero (0), debe aparecer en todas las fases, si no debe solo mostrarse en la fase a la que pertenece

1 Respuesta

Respuesta
1
¿Hay algún problema en que se recargue la pagauna cada que selecciones algo del 1 combo?
Otro detalle, el código debe ser en Php y la base de datos esta en MySql
Si hay problemas, porque se perderán los demás valores que están contenidos en otro text, son como 7 tex a parte de eso dos combos.
Ok entonces tienes que usar php y javascript, te mano este código a ver si es lo que necesitas:
Utilizo una clase para accesar los datos de un DB pero tu lo puedes cambiar por la forma tradconal de accesar a la DB, la idea es qveas como se arva el javascript, solo debes de saber que si tienes muchos datos... la pag tardara un poco en cargarse, pues en el archivo que genera php se incluran todas las opciones que tienes en esas dos tablas.
if ($row = $db->getRow())
{
echo '<select name= "auto" onchange="cambia()" >';
echo '<option class = "dos" value= 0> - Todas - </option>';
$tot = 0;
do {
echo '<option class = "dos" value= "'.$row["id"].'">'.$row["01_descripciontipo"].'</option>';
$id_select[++$tot] = $row["id"];
//} while ($row = mysql_fetch_array($resultT));
} while ($row = $db->getRow());
echo '</select>';
}
?>
</td>
</tr>
<tr>
<td>Marca:</td>
</tr>
<tr>
<td>
<select name=segundo onchange="submit();">
<option value="0">- Todas - </select>
</form>
</td>
</tr>
<tr>
<td colspan="2"><? despliega_datos();?></td>
</tr>
</table>
<script>
//defino una serie de varibles Array para cada opcion del 1 select
<?
for ($i = 1; $i<= $tot; $i++)
{
$cadopc = "";
$cadval = "";
$query_Marca = "SELECT M.id, M.06_marca FROM 06_marcas as M Where 01_tipovehiculo = ".$id_select[$i];
//$resultM = mysql_query($query_Marca, $showautos) or die(mysql_error());
$resultM = $db->query($query_Marca);
// if ($row = @mysql_fetch_array($resultM)){
if ($row = $db->getRow()){
$cadopc = "var opc_seg_sel_".$i."=new Array('- Todas -' ";
$cadval = "var val_seg_sel_".$i."=new Array('0' ";
do {
//echo '<option value= "'.$row["id"].'">'.$row["06_marca"].'</option>';
$cadopc .= ",'". $row["06_marca"]."'";
$cadval .= ",'". $row["id"]."'";
// } while ($row = mysql_fetch_array($resultM));
} while ($row = $db->getRow());
$cadopc .= ") \n";
$cadval .= ") \n";
}else
{ $cadopc = "var opc_seg_sel_".$i."=new Array('- No Disponibles -' ) \n";
$cadval = "var val_seg_sel_".$i."=new Array('0' )\n";
}
echo $cadopc;
echo $cadval;
}
?>
function cambia(){
//tomo el valor del select del auto elegido
var auto
auto = document.f1.auto[document.f1.auto.selectedIndex].value
//veo si el auto está definido
if (auto != 0) {
//si estaba definido, entonces coloco las opciones del segundo correspondiente.
//selecciono el array de segundo adecuado
mis_opciones=eval("opc_seg_sel_" + auto)
mis_valores =eval("val_seg_sel_" + auto)
//calculo el numero de opciones
num_opciones = mis_opciones.length
//marco el número de provincias en el select
document.f1.segundo.length = num_opciones
//para cada segundo del array, la introduzco en el select
for(i=0;i<num_opciones;i++){
document.f1.segundo.options.value=mis_valores
document.f1.segundo.options.text=mis_opciones
}
}else{
//si no había segundo seleccionada, elimino las opcones del select
document.f1.segundo.length = 1
//coloco un guión en la única opción que he dejado
document.f1.segundo.options[0].value = "- Todas -"
document.f1.segundo.options[0].text = "- Todas -"
}
//marco como seleccionada la opción primera de segundo
document.f1.segundo.options[0].selected = true
}
</script>
No falktan algunas lineas antes del If, disculpa mis pregunytas pero realmente estoy aprendiendo a trabajar en este lenguaje
Anted del if van la parte donde hago los querys:
<?
$query_Tipo = "SELECT T.id, T.01_descripciontipo FROM 01_tipovehiculo as T";
$result = $db->query($query_Tipo);
$query_TipoVe = "SELECT TV.id, TV.01_descripciontipo FROM 01_tipovehiculo as TV";
$query_Marca = "SELECT M.id, M.06_marca FROM 06_marcas as M";
//$resultT = mysql_query($query_TipoVe, $showautos) or die(mysql_error());
$resultT = $db->query($query_TipoVe);
Disculpa me podrías decir cual es la Tabla princiupal y cual es la secundaria. Es decir. ¿Quién llena al primer combo y cual llena al segundo combo?
El primer combo se llena con los Tipos de Autos, y el Segundo combo muestra las MArcas según el tipo de Auto que se haya seleccionado en el primer combo...
Indicame si es así... Disculpa preguntarte tanto.
Sip asi es exactametn como se llenan.
El código lo he modificado pero me da error en la linea que esta en negrita
Fatal error: Call to undefined function despliega_datos() in C:\...\paginas_operaciones\combo2.php on line 53
Creo que el error es que no me pasaste la función despliega_datos, no la veo en el código fuente.
<?
include("../clases/database.class");
$db = new database("../ini/bd.ini");
$query_Fases = "SELECT FAS.fas_id, FAS.fas_nombre FROM oplk_mi_fases as FAS";
$resultT=$db->ejecutar_sql($query_Fases);
$c=mysql_num_rows($resultT);
$row=mysql_fetch_array($resultT);
$query_SubFases = "SELECT SUBF.subf_id, SUBF.subf_nombre FROM oplk_mi_subfases as SUBF";
if ($row > 0 )
{
echo '<select name= "auto" onchange="cambia()" >';
echo '<option class = "dos" value= 0> - Todas - </option>';
$tot = 0;
do {
echo '<option class = "dos" value= "'.$row["fas_id"].'">'.$row["fas_nombre"].'</option>';
$id_select[++$tot] = $row["fas_id"];
} while ($row > mysql_fetch_array($resultT));
echo '</select>';
}
?>
</td>
</tr>
<tr>
<td>Marca:</td>
</tr>
<tr>
<td>
<select name=segundo onchange="submit();">
<option value="0">- Todas - </select>
</form>
</td>
</tr>
<tr>

<td colspan="2"><? despliega_datos();?></td>
  Esta es la LInea donde da el Error
</tr>
</table>
<script>
//defino una serie de varibles Array para cada opcion del 1 select
<?
for ($i = 1; $i<= $tot; $i++)
{
$cadopc = "";
$cadval = "";
$query_Subfases = "SELECT FAS.subf_id, FAS.subf_nombre, FAS.subf_id_fase FROM oplk_mi_subfases as SUBF Where oplk_mi_fases = ".$id_select[$i];
//$resultM = mysql_query($query_Marca, $showautos) or die(mysql_error());
$resultM = $db->query($query_Subfases);
// if ($row = @mysql_fetch_array($resultM)){
if ($row > 0 ){
$cadopc = "var opc_seg_sel_".$i."=new Array('- Todas -' ";
$cadval = "var val_seg_sel_".$i."=new Array('0' ";
do {
//echo '<option value= "'.$row["id"].'">'.$row["06_marca"].'</option>';
$cadopc .= ",'". $row["subf_nombre"]."'";
$cadval .= ",'". $row["subf_id"]."'";
// } while ($row = mysql_fetch_array($resultM));
} while ($row = mysql_fetch_array($resultM));
$cadopc .= ") \n";
$cadval .= ") \n";
}else
{
$cadopc = "var opc_seg_sel_".$i."=new Array('- No Disponibles -' ) \n";
$cadval = "var val_seg_sel_".$i."=new Array('0' )\n";
}
echo $cadopc;
echo $cadval;
}
?>
function cambia(){
//tomo el valor del select del auto elegido
var auto
auto = document.f1.auto[document.f1.auto.selectedIndex].value
//veo si el auto está definido
if (auto != 0) {
//si estaba definido, entonces coloco las opciones del segundo correspondiente.
//selecciono el array de segundo adecuado
mis_opciones=eval("opc_seg_sel_" + auto)
mis_valores =eval("val_seg_sel_" + auto)
//calculo el numero de opciones
num_opciones = mis_opciones.length
//marco el número de provincias en el select
document.f1.segundo.length = num_opciones
//para cada segundo del array, la introduzco en el select
for(i=0;i<num_opciones;i++){
document.f1.segundo.options.value=mis_valores
document.f1.segundo.options.text=mis_opciones
}
}else{
//si no había segundo seleccionada, elimino las opcones del select
document.f1.segundo.length = 1
//coloco un guión en la única opción que he dejado
document.f1.segundo.options[0].value = "- Todas -"
document.f1.segundo.options[0].text = "- Todas -"
}
//marco como seleccionada la opción primera de segundo
document.f1.segundo.options[0].selected = true
}
</script>
<td colspan="2"> </td>
<!--espliega_datos()-->
<script type="text/javascript"><!--
//defino una serie de varibles Array para cada opcion del 1 select
function cambia(){
//tomo el valor del select del auto elegido
var auto
auto = document.f1.auto[document.f1.auto.selectedIndex].value
//veo si el auto está definido
if (auto != 0) {
//si estaba definido, entonces coloco las opciones del segundo correspondiente.
//selecciono el array de segundo adecuado
mis_opciones=eval("opc_seg_sel_" + auto)
mis_valores =eval("val_seg_sel_" + auto)
//calculo el numero de opciones
num_opciones = mis_opciones.length
//marco el número de provincias en el select
document.f1.segundo.length = num_opciones
//para cada segundo del array, la introduzco en el select
for(i=0;i<num_opciones;i++){
document.f1.segundo.options.value=mis_valores
document.f1.segundo.options.text=mis_opciones
}
}else{
//si no había segundo seleccionada, elimino las opcones del select
document.f1.segundo.length = 1
//coloco un guión en la única opción que he dejado
document.f1.segundo.options[0].value = "- Todas -"
document.f1.segundo.options[0].text = "- Todas -"
}
//marco como seleccionada la opción primera de segundo
document.f1.segundo.options[0].selected = true
}
// --></script>
De hecho puedes quitarla, es la parte donde despliego los datos de los registros que obtengo de las seleeciones del combo. Así es que puedes quitar
<? despliega_datos() ; ?>
Y lo demás te debe de funcionar.
Ya lo hice y no funciona, solo me llena el combo 1 con todas las fases, pero el combo dos no se llena con las subfases, solo me coloca la palaba ---Todas---. Este es el código como lo modifiqué, Todo el código lo coloque dentro del body:
<body>
<?
include("../clases/database.class");
$db = new database("../ini/bd.ini");
?>
<?
//$query_Tipo = "SELECT T.id, T.01_descripciontipo FROM 01_tipovehiculo as T";
//$result=$db->ejecutar_sql($query_Tipo);
//$c=mysql_num_rows($result);
//$row=mysql_fetch_array($result);
//$query_TipoVe = "SELECT TV.id, TV.01_descripciontipo FROM 01_tipovehiculo as TV";
$query_Fases = "SELECT FAS.fas_id, FAS.fas_nombre FROM oplk_mi_fases as FAS";
$resultT=$db->ejecutar_sql($query_Fases);
$c=mysql_num_rows($resultT);
$row=mysql_fetch_array($resultT);
$query_SubFases = "SELECT SUBF.subf_id, SUBF.subf_nombre FROM oplk_mi_subfases as SUBF";
//$resultT = $db->ejecutar_sql($query_Fases);
//$c=mysql_num_rows(resultT);
//$row=mysql_fetch_array(resultT);
if ($row > 0 )
{
echo '<select name= "auto" onchange="cambia()" >';
echo '<option class = "dos" value= 0> - Todas - </option>';
$tot = 0;
do {
echo '<option class = "dos" value= "'.$row[".fas_id"].'">'.$row["fas_nombre"].'</option>';
$id_select[++$tot] = $row["fas_id"];
//} while ($row = mysql_fetch_array($resultT));
} while ($row = mysql_fetch_array($resultT));
echo '</select>';
echo "Este es Dolar Total: ".$tot;
echo "Este es Dolar id_select: ".$id_select;
}
?>
</td>
</tr>
<tr>
<td>Subfases:</td>
</tr>
<tr>
<td>
<select name=segundo onchange="submit();">
<option value="0">- Todas - </select>
</form>
</td>
</tr>
<tr>
<td colspan="2"></td>
</tr>
</table>
<script type="text/JavaScript">
//defino una serie de varibles Array para cada opcion del 1 select
<?
for ($i = 1; $i<= $tot; $i++)
{
$cadopc = "";
$cadval = "";
$query_Subfases = "SELECT SUBF.subf_id, SUBF.subf_nombre, SUBF.subf_id_fase FROM oplk_mi_subfases as SUBF Where SUBF.subf_id_fase =".$id_select[$i];
$resultM=$db->ejecutar_sql($query_Subfases);
// if ($row = @mysql_fetch_array($resultM)){
if ($row = mysql_fetch_array($resultM)){
$cadopc = "var opc_seg_sel_".$i."=new Array('- Todas -' ";
$cadval = "var val_seg_sel_".$i."=new Array('0' ";
do {
//echo '<option value= "'.$row["id"].'">'.$row["06_marca"].'</option>';
$cadopc .= ",'". $row["subf_nombre"]."'";
$cadval .= ",'". $row["subf_id"]."'";
// } while ($row = mysql_fetch_array($resultM));
} while ($row = mysql_fetch_array($resultM));
$cadopc .= ") \n";
$cadval .= ") \n";
}else
{ $cadopc = "var opc_seg_sel_".$i."=new Array('- No Disponibles -' ) \n";
$cadval = "var val_seg_sel_".$i."=new Array('0' )\n";
}
echo $cadopc;
echo $cadval;
}
?>
function cambia(){
//tomo el valor del select del auto elegido
var auto
auto = document.f1.auto[document.f1.auto.selectedIndex].value
//veo si el auto está definido
if (auto != 0) {
//si estaba definido, entonces coloco las opciones del segundo correspondiente.
//selecciono el array de segundo adecuado
mis_opciones=eval("opc_seg_sel_" + auto)
mis_valores =eval("val_seg_sel_" + auto)
//calculo el numero de opciones
num_opciones = mis_opciones.length
//marco el número de provincias en el select
document.f1.segundo.length = num_opciones
//para cada segundo del array, la introduzco en el select
for(i=0;i<num_opciones;i++){
document.f1.segundo.options.value=mis_valores
document.f1.segundo.options.text=mis_opciones
}
}else{
//si no había segundo seleccionada, elimino las opcones del select
document.f1.segundo.length = 1
//coloco un guión en la única opción que he dejado
document.f1.segundo.options[0].value = "- Todas -"
document.f1.segundo.options[0].text = "- Todas -"
}
//marco como seleccionada la opción primera de segundo
document.f1.segundo.options[0].selected = true
}
</script>
</body>
mUCHAS gRACIAS POR TU AYUDA, CONSEGUÍ ESTE EJEMPLO Y ME FUE MUY ÚTIL, Bueno aquí va un ejemplo
1) Crear una base de datos (MYSQL) de nombre mibase
2)Ejecutar las instrucciones sql
3)Probar el archivo
*********SCRIPT SQL****************
# Tabla departamentos
CREATE TABLE `departamentos` (
`Id` int(6) unsigned NOT NULL auto_increment,
`Id_depto` int(4) NOT NULL default '0',
`nombre_depto` varchar(50) default NULL,
UNIQUE KEY `indice` (`Id`,`Id_depto`)
) TYPE=MyISAM;
INSERT INTO `departamentos` VALUES (1,1,'Contabilidad');
INSERT INTO `departamentos` VALUES (1,2,'Marketing');
INSERT INTO `departamentos` VALUES (1,3,'Bodega Central');
INSERT INTO `departamentos` VALUES (2,1,'Informatica');
INSERT INTO `departamentos` VALUES (2,2,'Ventas');
INSERT INTO `departamentos` VALUES (2,3,'Gerencia');
INSERT INTO `departamentos` VALUES (3,1,'Capacitacion');
INSERT INTO `departamentos` VALUES (3,2,'Abastecimiento');
INSERT INTO `departamentos` VALUES (3,3,'Recursos Humanos');
# Tabla empresas
CREATE TABLE `empresas` (
`Id` int(6) unsigned NOT NULL auto_increment,
`descripcion` varchar(10) default NULL,
PRIMARY KEY (`Id`)
) TYPE=MyISAM;
INSERT INTO `empresas` VALUES (1,'Empresa001');
INSERT INTO `empresas` VALUES (2,'Empresa002');
INSERT INTO `empresas` VALUES (3,'Empesa003');
*********FIN SCRIPT SQL*******************
***********PAGINA PHP********************
<?
$bd_host = "localhost";
$bd_usuario = "localhost";
$bd_password = "";
$bd_base = "mibase";
$con = mysql_connect($bd_host, $bd_usuario, $bd_password);
mysql_select_db($bd_base, $con);
$sql = "SELECT * from empresas";
$rs = mysql_query($sql, $con);
?>
<html>
<head>
<title>Documento sin título</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<p>Seleccion de un select y cambiar los valores de otro select sin tener que submitar (valido segun su uso)</p>
<form name="miformulario" method="get">
<table width="249" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Empresa</td>
<td>Departamento</td>
</tr>
<tr>
<td><select name="empresa" id="empresa" onChange="componer_Centros(this.value)">
<option value="">--Seleccione--</option>
<? if(mysql_num_rows($rs)>0)
{
while($row = mysql_fetch_assoc($rs))
{
?>
<option value="<?=$row["Id"]?>"><?=$row["descripcion"]?></option>
<?
}
}
?>
</select></td>
<td><select name="depto" id="depto">
<option>--seleccione--</option>
</select></td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</table>
</form>
</body>
</html>
<script>
function componer_Centros(cod_area)
{
//alert(cod_area);
document.miformulario.depto.length=0;
document.miformulario.depto.options[0] = new Option("-- Seleccione --","","defaultSelected","");
var indice=1;
<?
$sql_depto = "SELECT * from departamentos";
$rs_depto = mysql_query($sql_depto, $con);
if(mysql_num_rows($rs_depto)>0)
{
while($row_depto = mysql_fetch_assoc($rs_depto))
{
?>
if(cod_area=='<?=$row_depto["Id"]?>')
{
document.miformulario.depto.options[indice] = new Option("<?=$row_depto["nombre_depto"]?>","<?=$row_depto["Id_depto"]?>");
indice++;
}
<?
}
}
mysql_close($con);
?>
}
</script>
***********FIN PAGINA PHP*****************

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas