Tablas dependientes

Estoy diseñando una base de datos con access y de enlace estoy utilizando el coldfusion MX. He creado 2 list/menu dependiente. Osea en access he creado 2 tablas relacionadas, 1 de productos y la otra Categorías relacionada con esta y quiero que en la página haya 2 menu que se actualicen de la base de datos y sean dependientes.
He creado ya el código, pero tengo algún error y no lo veo. ¿Puedes echarle 1 vistazo?
Básicamente el problema es que las arrays me las crea bien, pero no me las coge los list/menu. A parte el Coldfusion studio 5, con el que trabajo el código me da los siguientes errores
134 The tag name: "arr2.length;i=i+1)" not found in currently active versions
143 No starting tag found for: "script", or it was closed too many times
Llevo días dándole vueltas y no encuentro el error. Ojalá puedas echarme una mano. Te pongo el código
<cfsetting enablecfoutputonly="yes">
<cfquery name="get_produ" datasource="NISC">
SELECT distinct Productos.IdProducto,
Productos.NombreProducto,
Categoría.IdCategoría,
Categoría.Tipo
FROM Productos LEFT JOIN Categoría ON Categoría.IdProducto=Productos.IdProducto
ORDER BY Productos.NombreProducto,Categoría.Tipo
</cfquery>
<!--- ============= Genero los arrays de Producto ============--->
<cfset producto="">
<cfloop query="get_produ">
<!--- Hago el Corte por Producto --->
<cfif get_produ.IdProducto neq producto>
<cfset producto=get_produ.IdProducto>
<cfif get_produ.CurrentRow EQ 1>
<!--- Pongo la inicializacion del array --->
<cfoutput>#chr(13)#b = new Array(</cfoutput>
<cfelse>
<cfoutput>,</cfoutput>
</cfif>
<!--- Agrego Producto --->
<cfoutput>"#get_produ.NombreProducto#,#get_produ.IdProducto#"</cfoutput>
</cfif>
</cfloop>
<cfoutput>);</cfoutput>
<!--- ============= Genero los arrays de Tipo ============--->
<cfset producto="">
<cfloop query="get_produ">
<!--- Hago el Corte por Producto --->
<cfif get_produ.IdProducto neq producto>
<cfif NOT get_produ.CurrentRow EQ 1>
<!--- Salvo que sea el primero, cierro al parentesis anterior --->
<cfoutput>);</cfoutput>
</cfif>
<cfset producto=get_produ.IdProducto>
<cfset corte=1>
<!--- Pongo la inicializacion del array --->
<cfoutput>#chr(13)#b_#producto# = new Array(</cfoutput>
</cfif>
<cfif corte EQ 1>
<cfset corte=0>
<cfelse>
<!--- Si no hay cambio de producto (sigo en comod) pongo la coma separando --->
<cfoutput>,</cfoutput>
</cfif>
<!--- Agrego la Provincia --->
<cfoutput>"#get_produ.tipo#,#get_produ.IdProducto#"</cfoutput>
</cfloop>
<cfoutput>);</cfoutput>
<cfsetting enablecfoutputonly="no">
function getprodu()
{
arr = "b" ;
inic="Seleccione";
llenaSelect( arr, fprodu, inic );
vaciaSelect( fcomod );
}
function getcomod()
{
arr = "b_" + fprodu.options[fprodu.selectedIndex].value;
inic= "Todos";
llenaSelect( arr, fcomod, inic );
}
function llenaSelect(arr,obj,inic) {
//
if( eval("typeof(" + arr + ")") == 'undefined' ) {
obj.options.length=0;
obj.options[0]=new Option(" ","");
return true;
}
arr2 = eval(arr);
obj.options.length=0;
obj.options[0]=new Option(inic,"0");
for (i=0;i<arr2.length;i=i+1)
{
subp=arr2.split(",");
obj.options[i+1]=new Option(subp[0] + " ",subp[1]);
}
if (navigator.appName != 'Netscape') {
if(document.all["ciu_bar"].style.visibility == "visible"){
obj.focus();
}
}else{
obj.focus();
}
return true;
}
function vaciaSelect(obj) {
obj.options.length=0;
obj.options[0]=new Option(" ","0");
obj.blur();
}
function formCheck(){
if(document.f.OPERACION.value == ""){
alert("Seleccione el tipo de operación");
document.f.OPERACION.focus();
return false;
}
if(fprodu.value == 0){
alert("Seleccione el producto");
fprodu.focus();
return false;
}
}
function ir(){
if (fprodu.value == 0){
alert("Seleccione el Producto");
fprodu.focus();
}else{
location.href="bus_avan_"+ fprodu.value +".cfm"
}
}
function ciu_bar(){
if (navigator.appName != 'Netscape')
{
if(fbarri.options.length > 1)
{
document.all["ciu_bar"].style.visibility = "visible";
}else{
document.all["ciu_bar"].style.visibility = "hidden";
}
}
}
</script>
<FORM METHOD="GET" action="" NAME="f">
<table border="0" cellspacing="0" cellpadding="3" width="100%">
<tr>
<TD VALIGN="middle" class="descripresult" nowrap colspan="1" width="1%"> </TD>
<TD VALIGN="middle" class="descripresult" nowrap colspan="1" width="16%">Producto</TD>
<TD COLSPAN="3">
<SELECT NAME="produ" onchange="getcomod()">
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
</SELECT>
</TD>
</TR>
<tr>
<TD VALIGN="middle" class="descripresult" colspan="1" nowrap width="1%"> </TD>
<TD VALIGN="middle" class="descripresult" colspan="1" nowrap width="16%">Tipo</TD>
<TD COLSPAN="3">
<SELECT NAME="tipo">
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
</SELECT>
</TD>
</TR>
</table>
</FORM>
<script language="javascript">
fprodu = document.f.produ;
ftipo = document.f.tipo;
getprodu();
fprodu.selectedIndex=1;
getcomod();
window.focus()
</script>

1 respuesta

Respuesta
1
La verdad es que nunca he utilizado el coldfusion y tampoco lo conozco, pero bueno, a ver si lo que te digo te sirve.
He visto que uno de los errores que te da, es cuando evalúa en el for arr2. Length, puede que sea porque arr2 no tenga valor, ya que no entiendo muy bien porque evalúas arr2=eval(arr), que por lo que veo de tu código, arr tiene una cadena de caracteres, por tanto, a no ser que fuera una expresión no necesita evaluarse.
Y en cuanto al segundo error, ni idea, a no ser que no me hayas enviado todo el codigo, ya que he observado que en el codigo que me has enviado, se cierra hay un </script> pero no hay antes de ese un tag <script>.
Bueno, es lo que he visto.
Muchas gracias. Lo he solucionado el problema haciendo lo que dices. Ahora funciona casi perfectamente. En el programa definí "Todos" para que seleccione todos los tipos de ese producto en concreto. Con lo que lo puedo solucionar dándole el valor '%' a 'Todos·, porque por defecto me da el valor '0'.
Te pongo el javascript, con los arrays ya creados, para que puedas hacerte 1 mejor idea. Otrra cosa que no consigo arreglar es que cuando se me carga la página siempre me sale en productos: 'accesorios' en vez de 'Seleccione' el cual he puesto como 1er valor.
Mi servidor es éste:
http://62.43.67.16/basesDatos/productos.cfm
aquí puedes ver lo q te digo
<SCRIPT language=javascript>
b = new Array("accesorios,1","acondicionadores,2","acopladores,3","acoplamientos,4","actuadores,5","acumuladores,6","adaptadores,7","aerotermos,9","amortiguadores,17","automatas,18");
b_1 = new Array("automatas programables,1","herramientas cableados,1","herramientas varias,1","rodamientos,1","válvulas,1");
b_2 = new Array("aire,2","raiz cuadrada,2","red,2","señal A/A,2");
b_3 = new Array("acústicos,3");
b_4 = new Array("sentido único y elementos,4");
b_5 = new Array("lineales eléctricos,5","neumáticos,5");
b_6 = new Array("oleohidraúlicos,6");
b_7 = new Array("conversores de protocolo,7","reguladores del fator de potencia,7");
b_9 = new Array("eléctricos,9");
b_17 = new Array("conversores de protocolo,17");
b_18 = new Array("para grupos electrógenos,18","programables,18");
function getprodu()
{
arr = "b" ;
inic="Seleccione";
llenaSelect( arr, fprodu, inic );
vaciaSelect( ftipo );
}
function gettipo(){
arr = "b_" + fprodu.options[fprodu.selectedIndex].value;
inic= "Todos";
llenaSelect( arr, ftipo, inic );
}
function llenaSelect(arr,obj,inic) {
//
if( eval("typeof(" + arr + ")") == 'undefined' ) {
obj.options.length=0;
obj.options[0]=new Option(" ","");
return true;
}
arr2 = eval(arr);
obj.options.length=0;
obj.options[0]=new Option(inic,"0");
for (i=0;i<arr2.length;i=i+1)
{
subp=arr2.split(",");
obj.options[i+1]=new Option(subp[0] + " ",subp[1]);
}
obj.focus();
return true;
}
function vaciaSelect(obj) {
obj.options.length=0;
obj.options[0]=new Option(" ","0");
obj.blur();
}
function formCheck(){
if(document.f.OPERACION.value == ""){
alert("Seleccione el tipo de operación");
document.f.OPERACION.focus();
return false;
}
if(fprodu.value == 0){
alert("Seleccione el producto");
fprodu.focus();
return false;
}
function ir(){
if (fprodu.value == 0){
alert("Seleccione el Producto");
fprodu.focus();
}else{
location.href="bus_avan_"+ fprodu.value +".cfm"
}
}
}
</SCRIPT>
<FORM name=f action="" method=get>
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=3 width="100%" border=0>
<TBODY>
<TR>
<TD class=descripresult vAlign=center width="23%">Producto</TD>
<TD colSpan=3><SELECT onchange=gettipo() name=produ> <OPTION
selected>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION></SELECT> </TD></TR>
<TR>
<TD class=descripresult vAlign=center width="23%">Tipo</TD>
<TD><SELECT name=tipo> <OPTION selected>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION>
<OPTION>aaaaaaaaaaaaaaaaaaaa</OPTION></SELECT> </TD></TR></TBODY></TABLE></FORM>
<SCRIPT language=JavaScript>
fprodu = document.f.produ;
ftipo = document.f.tipo;
getprodu();
fprodu.selectedIndex=1;
gettipo();
</SCRIPT>
1 saludo
Creo que tu duda ahora es que en el campo select de productos te aparece como campo seleccionado accesorios, ¿no?
Creo que si en la línea donde tienes:
fprodu.selectedIndex=1;
lo pones como:
fprodu.selectedIndex=0;
Puede que te funcione bien ya.
Sino dentro de la función llenaSelect después de la sentencia:
obj.options[0]=new Option(inic,"0");
pones:
obj.options[0].selected = true;
Te pondrá la primera posición del select como seleccionada.
Ya lo tengo arreglado. He cambiadolalínea que me has comentado por esta
fprodu.selectedIndex=0;
Lo que pasa es que he cambiado en la function llenaSelect, la línea:
obj.options[0]=new Option(inic,"%"); dándole el valor '%', en vez de '0'. Para que mande el valor '%' cuando se mande 'Seleccione' o 'Todos', para que muestre todos, y realmente lo hace,pero me sale un error en la página.
Concretamente en esta línea:
if( eval("typeof(" + arr + ")") == 'undefined' ) {
Car:2, Error:Error de sintaxis, Código 0
Lo puedes ver, directamente en mi página:
http://62.43.67.16/basesDatos/productos.cfm
Muchas gracias por tu ayuda, sólo me queda este detalle por solucionar.
1 saludo
Me ha costado, pero al final he sacado de donde viene tu error, y es que por lo visto cuando llega a la función gettipo() y evalúa el valor de arr, lo que evalúa es:
b_%
Y % creo que no puedes utilizarla como parte del nombre de una variable, además que tampoco está definida.
Este tipo de cosas las lees, pero siempre se olvidan.
Pon como valor de todos otro tipo de carácter, por ejemplo una letra.
De esa forma cuando tengas seleccione, no te encontrara la variable (u objeto) b_letra y será undefined y por tanto te dejara el campo vacío.
Yo lo he probado y ha funcionado.
Gracias de nuevo por la respuesta. Pero tengo un problemilla con esto. Si le pongo '%' cuando los campos están por defecto en Seleccione, osea que no seleccionas nada, o seleccionas en Tipo 'Todos', en la url necesaria para la página de resultados, manda ese '%', con lo que me funciona correctamente la búsqueda, aunque me de ese error en la página.
Necesito que ese valor sea '%', ya que si le doy otro valor, como los campos que utiliza la tabla dependiente, son numéricos, no me coge todos, osea en estos casos concretos. No se si me explico
http://62.43.67.16/basesDatos/productos.cfm
¿Me sugieres alguna cosa? O lo dejo así que es como me funciona. Lo malo es que salga ese error en la página es un fastidio
1 saludo
Creo que con esto te soluciona el problema para que no te salga el error de javascript, que hay que quitar porque no queda muy bien, ¿no?
Así que te sugiero, que, como el error te da cuando en la variable arr se envía a llenaSelect y esta contiene b_%, lo mejor que puedes hacer es escapar este caso, es decir, preguntar al principio de la función:
function llenaSelect(arr,obj,inic) {
if (arr != "b_%"){
//Todo el código de la función
}
}
Con esto no se evalúa la expresión b_%, que es la que da el error.
Gracias por tu ayuda. Me funciona perfectamente. La verdad que no se me había ocurrido insertarle otro bucle. Cuando miras muchas veces 1 problema, se te satura la solución. 1 saludo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas