Listas dependientes con ASP y Access (I)
A continuación deberemos colocar las líneas de código que definan los contenidos de cada una de las listas dependientes. Esto es lo que vamos a escribir en el servidor usando ASP sacando los datos desde la base de datos.
Asumo que ya sabes realizar la conexión con la base de datos o no estarías leyendo este tutorial, de manera que nos saltaremos esa parte.
Realizamos una consulta a la base de datos pidiendo todas las categorías
existentes en la tabla categorias_productos y las ordenamos
por el id de su categoría padre.
query = "select * from categorias_productos order by id_categoria_padre"
set rc = conec.execute(query)
Creamos un bucle para pasar por cada uno de los registros devueltos por la consulta a la base de datos
do while not rc.eof
A continuación escribimos los arrays javascript;
En el script Javascript de las listas dependientes se crean arrays para guardar las opciones que se cargarán en los selectores. En la configuración del script se indica que:
" Crear un Array que lleve por nombre el valor enviado por el selector que llamó a la función:
por ejemplo, si se escoge en el primer selector la opción "herramientas" que lleva también "herramientas" por value llamará al Array (lista) del mismo nombre."
Como los nombres de las categorías pueden llevar acentos u otros
caracteres extraños y nos daría entonces problemas con Javascript
vamos a usar, como nombre de estos arrays, el identificador en la base de
datos de la categoría. Como los nombres de las variables no pueden
comenzar por un número vamos a anteponer cat_ al nombre
de estas variables, de forma que cada array lleve por nombre cat_1,
cat_2, cat_3, etc.
var cat_<%=rc("id_categoria") %>=new Array()
ok, ahora deberemos escribir cada uno de los elementos del array asignando un índice de posición correlativo. Para ellos creamos una variable contador que inicializamos a cero
contador = 0;
y escribimos la primera opción de la lista que siempre será el nombre de la categoría
cat_el id de la categoría[el
valor de la variable $contador inicializada a cero] =
new slctr('-- el nombre de la categoría --')
cat_<%=rc("id_categoria") & "[" &
contador %>] = new slctr('- -<%= rc("nombre_categoria")
%>- -')
Si el primer registro devuelto por la base de datos fuera
id_categoria: 1
nombre_categoria: Herramientas
id_categoria_padre: 0
Lo que se escribiría en el documento sería
var cat_1=new Array()
cat_1[0] = new slctr('- -Herramientas- -')
A continuación escribiremos los elementos asociados a ese registro. En caso de ser una categoría principal lo que se escribirá serán las subcategorías asociadas; en el caso de ser una subcategoría lo que se escribirá serán los productos asociados a esa subcategoría.
Para ello necesitamos realizar otra consulta a la base de datos pero esta consulta deberemos hacerla a una u otra tabla dependiendo de si lo que debemos buscar son subcategorías (en el caso de estar escribiendo una lista de una categoría principal) o de si lo que debemos buscar son ya los productos asociados a una subcategoría (en el caso de que estemos escribiendo una lista de una subcategoría)
Lo primero que haremos al respecto será verificar si estamos con
una lista de categoría principal o de subcategoría. El patrón
común que las distingue es el campo id_categoria_padre
que si es una categoría principal tendrá siempre un valor
de 0 (cero) y si es una subcategoría tendrá siempre un valor
superior a cero.
if rc("id_categoria_padre") = 0 then
Si la condición es cierta realizaremos la consulta a la tabla categorias_productos
pidiendo las subcategorías cuyo id_categoria_padre sea
igual al identificador del registro con el cual estamos actuando.
En el ejemplo anterior del registro 1 Herramientas pediríamos
lo siguiente:
Select *_categoria from categorias_productos where id_categoria_padre
= 1 order by nombre_categoria
Tanto si la consulta se realiza a la tabla de categorías como si
se realiza a la tabla de productos necesitaremos averiguar su nombre descriptivo.
En el ejemplo que estamos usando los nombres de los campos son distintos
de una tabla a la otra: nombre_categoria y nombre_producto.
Usaremos una variable sufijo que guarde el valor necesario. Si
consultamos a la tabla de categorías la variable sufijo
tomará el valor de 'categoria'; si consultamos a la tabla
de productos tomará el valor de 'producto'.
Finalmente debemos usar el valor del id de la categoría padre del registro con el que estamos trabajando. La petición a la base de datos nos queda como sigue:
query2 ="select * from categorias_productos where id_categoria_padre
= " & rc("id_categoria") & " order by nombre_"
& sufijo
sufijo = "categoria"
Ahora bien, en el caso de que la categoría padre sea distinta a cero, es decir, que estemos escribiendo los datos de una subcategoría, la tabla a la que deberemos consultar será la de productos.
query2 = "select * from productos where id_categoria = "
& rc("id_categoria") & " order by nombre_" &
sufijo
sufijo = "producto"
Bien, una vez tengamos una u otra petición a la base de datos (a la tabla de categorías o a la tabla de productos) y asingnado el valor de sufijo ya podemos ejecutar la petición y crear un bucle que pase por cada uno de los registros devueltos
set rc2 = conec.execute(query2)
do while not rc2.eof
contador = contador + 1
%>
cat_<%= rc("id_categoria") & "[" & contador %>] = new slctr("<%=rc2("nombre_" & sufijo)%>",'cat_<%=rc2("id_categoria")%>')
<%
rc2.moveNext
Loop
El bloque entero quedaría de la siguiente forma:
<%
query = "select * from categorias_productos order by id_categoria_padre"
set rc = conec.execute(query)
do while not rc.eof
contador = 0
%>
var cat_<%=rc("id_categoria") %>=new Array()
cat_<%=rc("id_categoria") & "[" & contador %>] = new slctr('- -<%= rc("nombre_categoria") %>- -')
<%
if rc("id_categoria_padre") = 0 then
sufijo = "categoria"
query2 ="select * from categorias_productos where id_categoria_padre = " & rc("id_categoria") & " order by nombre_" & sufijo
else
sufijo = "producto"
query2 = "select * from productos where id_categoria = " & rc("id_categoria") & " order by nombre_" & sufijo
end if
set rc2 = conec.execute(query2)
do while not rc2.eof
contador = contador + 1
%>
cat_<%= rc("id_categoria") & "[" & contador %>] = new slctr("<%=rc2("nombre_" & sufijo)%>",'cat_<%=rc2("id_categoria")%>')
<%
rc2.moveNext
Loop
rc.moveNext
Loop
set rc = nothing
set rc2 = nothing
%>
//-->
</script>
Listas dependientes con ASP y Access (III) - Escribiendo el HTML