Foros del Web » Programando para Internet » ASP Clásico »

Extraer categorias y subcategorias

Estas en el tema de Extraer categorias y subcategorias en el foro de ASP Clásico en Foros del Web. Hola a todo foros del web, tengo la estructura de una tabla como la que una vez se posteó acá, con un campo que identifique ...
  #1 (permalink)  
Antiguo 10/08/2005, 18:29
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Extraer categorias y subcategorias

Hola a todo foros del web, tengo la estructura de una tabla como la que una vez se posteó acá, con un campo que identifique el id de la categoría (CAT_ID), otro campo que identifica la categoría dependiente (CAT_IDDEP) y otro campo que es el nombre de la categoría (CAT_NOMBRE). Mi problema es el siguiente: a la vez que el usuario va navegando, a través de las categorías, me gustaría como normalmente se hace, que salga la jerarquia de categorías que está visitando. Sería muy similar a foros del web, cuando nos marca en que foro estamos. Por ejemplo Electrónica --> Equipos de audio y video --> Minicomponentes

Mi pregunta es si puedo hacer esa jerarquía con una sola sentencia sql, teniendo en cuenta que todas las categorías, subcategorías y sub-subcategorias conviven en la misma tabla.
Un saludo para todos.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 10/08/2005, 18:38
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Hola Mariano, nuevamente, lo que yo haria seria una funcion recursiva que te regrese los padres de cierta categoria ID, nombre

strParents = "1;Depto 1:.5;Depto 2"

Despues puedes hacerte otra funcion que llame a esta funcion y mediante dos splits crees un arreglo bidimensional para guardar ID, Nombre, y regrese este arreglo, al final iteras el arreglo y listo.

Puedes valerte de la misma sub recursiva de la cual se ha discutido ampliamente que generaba la estructura de arbol, solo que cambiaras los delimitadores.


Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #3 (permalink)  
Antiguo 10/08/2005, 18:44
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola

Creo que debes buscar un post de Speedy, donde queria lo mismo, bueno, lo que pidio te serviria mucho, ahi hay ejemplos, etc...

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #4 (permalink)  
Antiguo 11/08/2005, 08:55
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Hola, antes que nada gracias por responder. Quería comentarles que leí el post de speedy, de hecho de ahí saqué la estructura de la tabla que tengo ahora y también saqué la función recursiva para dibujar el árbol de categorías. El problema que le encontré es que crea demasiados rs y demasiadas conexiones a la base de datos, por eso estaba buscando una solución algo más óptima, aunque dudo que exista.
Por otra parte también visité el otro post de speedy que logró solucionarlo con la consulta left join, pero utilizando una tabla intermedia. Yo tengo todo en la misma tabla, ahí es donde está el problema pienso. Piensan que sería mejor crear otras tablas para facilitar este tema?
Muchas gracias por sus comentarios.
Saludos!.
__________________
Add, never Remove
  #5 (permalink)  
Antiguo 11/08/2005, 09:33
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Hice este procedimiento recursivo que por el momento me guarda los nombres de la categoría en un array, y luego lo muestro. El tema es que cuando intento sacar la conexión fuera de este procedimiento me da el siguiente error:

No se puede utilizar la conexión para realizar esta operación. Está cerrada o no es válida en este contexto.

Por que me sale ese error?

Acá les dejo el código haber si me pueden dar una mano:

Código:
dim categories(2)
sub getParents(param_id, element)
 
sql = "SELECT CAT_IDDEP, CAT_NOMBRE FROM CAT_CATEGORIAS WHERE 
 
CAT_ID = " & param_id 
	  set conn = server.createObject("ADODB.connection")
		  conn.open application("conexion")
			 set rs = server.createObject("ADODB.recordSet")
			  rs.open sql, conn
				if not rs.eof then 
				   categories(element) = rs("CAT_NOMBRE") 
							element = element + 1
				   getParents rs("CAT_IDDEP"), element 
				end if	
		   rs.close()		
		  set rs = nothing  
	  conn.close()
	 set conn = nothing
 
end sub
Muchas gracias.
Suerte!!.
__________________
Add, never Remove
  #6 (permalink)  
Antiguo 11/08/2005, 10:31
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Pero para que quieres sacar la conexion?
Obviamente la conexion vive encapsulada dentro de esta subrutina y veo que al final de ella la cierras por eso es que no la puedes utilizar afuera, aunque volvemos al tema de que no es necesario sacar la conexion de un procedimiento, por ejemplo en aquel post en el que se hacia la conexion desde una funcion...no tiene mucho caso.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #7 (permalink)  
Antiguo 11/08/2005, 11:27
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Me gustaría sacar la conexión para que no se conecte a la base de datos cada vez que llamo al procedimiento. Como es eso de que vive encapsulada dentro de la subrutina? que significa que esté encapsulada dentro de esta subrutina?. Me podrías explicar? obviamente si no existe inconveniente en que lo hagas, ya que me has ayudado un montón en este tema y en todos los temas que pregunto.
Gracias master!.
__________________
Add, never Remove
  #8 (permalink)  
Antiguo 11/08/2005, 11:45
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Perdon, pense que la tratabas de utilizar desde afuera de la Sub...ya veo lo que quieres ahora si, en teoria no deberias tener problemas con eso, a lo mejor se me ocurre que le puedes mandar como un argumento mas la conexion, ve si asi te funciona.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #9 (permalink)  
Antiguo 11/08/2005, 11:57
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Ahora sí...

Excelente U_Goldman!, ahora sí me gusta más, si bien me gustaría evitar crear tres RS para sacar de cada uno un par de valores únicamente, al menos no se me va a conectar a la base de datos cada vez que se llame al procedimiento.
Muchas gracias maestro!.
__________________
Add, never Remove
  #10 (permalink)  
Antiguo 11/08/2005, 12:30
Avatar de sjam7  
Fecha de Ingreso: diciembre-2001
Ubicación: Guadalajara, Mexico
Mensajes: 3.672
Antigüedad: 22 años, 5 meses
Puntos: 16
bueno, si tuvieras muchisimas categorias y subcategorias quizas si seria bueno otra forma, pero que tantas puedes tener?
  #11 (permalink)  
Antiguo 11/08/2005, 17:57
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
si, es verdad eso que comentas sjam7, para el problema que hice el post, solamente serían tres RS, porque ese es el máximo de hijos que puede haber en la estructura. Ahora, cuando necesito mostrar todas las categorías y subcategorías y sub-subcategorías, entonces ahí es en donde no me convence esta forma de lograrlo. De todas formas, pude modificar el procedimiento para uqe me cree menos objetos RS y utilice una sola conexion a la base de datos, lo acabo de poner en la librería de clases. Pero me sigue pareciendo una barbaridad crear tantos rs. De la forma que lo modifique, me estaría creando un RS por cada familia de hijos. Para generar el arbol de una sola categoría entera (incluyendo sub-categorias, etc...) lo máximo que utilizo son entre 8 y 9 RS. Lo cual, como dije antes, me sigue pareciendo demasiado, pero creo que es la única forma de lograrlo.
Vos conocés alguna otra manera sjam7 que me puedas comentar?
Un saludo para todos!.
Suerte!.
__________________
Add, never Remove
  #12 (permalink)  
Antiguo 11/08/2005, 21:33
Avatar de sjam7  
Fecha de Ingreso: diciembre-2001
Ubicación: Guadalajara, Mexico
Mensajes: 3.672
Antigüedad: 22 años, 5 meses
Puntos: 16
bueno, yo he usado esa forma con mas de 15 categorias y unas 50 subs y sin problemas

usando solo 3 campos
idcategoria el id como identificador
categoria el nombre de la categoria
parentid el padre de la categoria, si es >0 entonces es sub

Otra forma? no se, quizas getrows pero nunca las he usado ni se si serviria, seria cosa de checar, aqui un buen link para aprender un poco de como se usa el getrows
http://www.aspfacil.com/articulos/110201.asp
  #13 (permalink)  
Antiguo 12/08/2005, 08:22
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 2 meses
Puntos: 9
Buen dato el que me aportas sjam7, en un principio mi sitio no va a haber manera que llegue a esa cantidad, después, si funciona como espero, quizás lo sobrepase y será cuestión de cambiar la forma de hacerlo, pero entonces por el momento me puedo quedar tranquilo con eso que decís.
GetRows yo siempre lo tome como una forma alternativa, más efectiva por cierto, para mostrar los registros que sacas de la BD. No se si con este método se podrá encontrar una mejor forma de hacer esto.
Y me gustaría plantear un nuevo problema que me apareció, para no abrir otro post, ya uqe es de una temática similar. Esepro que alguien me pueda dar una mano.
Tengo el producto X, que pertenece a esta estructura de categorías (como ejemplo) Computación --> Insumos --> Insumos de oficina. Ahora bien, este producto tiene un campo cuyo nombre es CAT_ID, que guarda el Id de la categoría más chica a la que pertenece, en este caso sería Insumos de oficina. Esto hace que se me complique, por ejemplo, a la hora de tener que seleccionar todos los productos que pertenecen a la categoría Computacion, o a la categoría Insumos, ya que no tengo en los productos un identificador de la categoría más amplia a la que pertenece, sino de la más pequeña. Mi pregunta es la siguiente: comunmente, ¿esto se soluciona agregando nuevos campos identificadores de categorías en la tabla de productos? o ¿se puede solucionar de una forma alternativa a esta?. Con respecto a la primer pregunta, a lo que me refiero es tener un campo CAT_ID_A, CAT_ID_B, CAT_ID_C. En el primero guardaría el Id de la categoría Computación, en el segundo el Id de la categoría Insumo y el tercero sería el campo que actualmente tengo, que guardaría la categoría más pequeña. Eso es una buena solución?
Como siempre, estaré muy agradecido por sus comentarios.
Saludos!.
__________________
Add, never Remove
  #14 (permalink)  
Antiguo 12/08/2005, 10:53
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
En realidad para este tipo de estructura, la solucion es la que plantea sjam,

Código:
|  cat_id  |  cat_nombre  |  parent_id
Donde las categorias raiz tendran un parent_id de 0 y de ahi para adelante, esto te permite tener una perfecta jerarquia.

Por lo de GetRows, en realidad solamente es para no trabajar con datos conectados, no seria alternativa para el modelado de estos datos, aunque probablemente si te ayudaria al performace si es que tu arbol jerarquico se vuelve inmenso.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:05.