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

Borrado en cascada dentro de una misma tabla

Estas en el tema de Borrado en cascada dentro de una misma tabla en el foro de ASP Clásico en Foros del Web. Hola a todos lo que voy a preguntar lo siento un tanto complejo y no veo forma de atacar el problema por ello solo pongo ...

  #1 (permalink)  
Antiguo 09/07/2005, 18:52
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Borrado en cascada dentro de una misma tabla

Hola a todos lo que voy a preguntar lo siento un tanto complejo y no veo forma de atacar el problema por ello solo pongo lo basico y nada mas, se bien que debo de preguntar despues de que ya investige aqui y alla pero la verdad no veo como hacerle , gracias por sus comentarios y paciencia.

Tengo una tabla como la siguiente:



En esta tabla conviven categorias, subcategorias, subsubcategorias y asi hasta n de sub categorias

Por ejemplo tenemos a Medicos y Enfermeras, estos su categoria madre es consultorios y la categoria madre de estos es: Hospitales y su categoria madre de esta es: Salud

Utilizo esto para borrar los registros:

Código:
SQLDeleteIdCategoria = "Delete * FROM categorias WHERE IdCategoria="&IdCategoria&""
rs.Open SQLDeleteIdCategoria, adoCon,3,3
Pero como podria borrar en cascada? para no dejar basura en la tabla Gracias por sus comentarios nuevamente y saludos.
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #2 (permalink)  
Antiguo 09/07/2005, 23:02
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 7 meses
Puntos: 16
Código:
SQL = "DELETE * FROM categorias WHERE IdCategoria = " & IdCategoria & " AND IdCategoriaMadre = " & IdCategoria & ""
creo que asi... prueba y avisame.... saludos y suerte
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!

Última edición por El_Metallick; 11/07/2005 a las 09:06 Razón: porque creo que ya entendi mejor lo que me estabas preguntando saludos
  #3 (permalink)  
Antiguo 11/07/2005, 08:46
Avatar de speedy  
Fecha de Ingreso: octubre-2004
Ubicación: México
Mensajes: 127
Antigüedad: 19 años, 8 meses
Puntos: 0
Hola El_Metallick gracias por contestarme, ya probe como me dijiste y no pasa lo mismo que con:

Código:
SQL = "Delete * FROM categorias WHERE IdCategoria="&IdCategoria&""
Otra forma?...
__________________
Saludos :cool: y Suerte :arriba:
valle del mezquital en el Estado de Hidalgo
  #4 (permalink)  
Antiguo 11/07/2005, 09:46
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Cita:
Iniciado por speedy
Pero como podria borrar en cascada? para no dejar basura en la tabla Gracias por sus comentarios nuevamente y saludos.
Te refieres a que borras una categoria y quisieras borrar a su vez los hijos?
Regularmente lo que quisieras hacer para no meterte en complicaciones es que desde tu interfaz grafica no permitas borrar una categoria si tiene hijos, esto por todo lo que implica, ahora a lo mejor no, pero mas adelante si estas categorias estan relacionadas con otras entidades, se vuelve una complicacion...

Ahora si es totalmente necesario, lo que yo haria, seria crearme un arreglo con todos los descendientes de una categoria, implementa ese ente extrano y maligno llamado recursividad para esta tarea, despues solamente tienes que recorrer el arreglo y borrar cada categoria.

Utiliza el buscador para encontrar unos de mis mensajes, en los que AZ me dio una rutina que escribia una estructura de arbol, con esa rutina seguro puedes implementar el arreglo, incluso podrias hacer el borrado de los datos desde ahi mismo, pero una funcion recursiva que trabaje con 2 recordsets, se me hace que quizas "achancharia" demasiado el sistema, cuestion de probar

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

Bueno, si lo qe quieres hacer es lo que u_goldman dice, lo que necesitas es basarte solamente en la categoría Madre, como:

"El Metallik"

Eso te borra solamente una SUBCATEGORIA ó CATEGORIA especifica...

SQL = "DELETE * FROM categorias WHERE IdCategoria = " & IdCategoria & " AND IdCategoriaMadre = " & IdCategoria & ""

Esta hace lo que quieres para una subcategoria:

SQL = "DELETE FROM categorias WHERE IdCategoriaMadre = " & IdCategoriaMadre_QUE_QUIERAS

Así todas las subcategorias de esa madre van a ser eliminadas, esto funciona a 1 nivel solamente, si tienes varios niveles, necesitas algo mas completo:

Ejemplo:

Doctores (1 - Madre = 0)
- Enfermeros (2 - Madre = 1)
-- Internos (3 - Madre = 2)
-- Independientes (4 - Madre = 2)
- Enfermeras (5 - Madre = 1)

Si quieres borrar todo bajo Doctores, entonces la consulta que te puse arriba funciona para borrar Enfermeros y Enfermeras, pero no borrara Internos e Independientes.

Pero igual, lo que necesitas es basarte en la categoria madre para este borrado, como:

SQL = "DELETE FROM categorias WHERE IdCategoriaMadre in (1,2)

Por ahí puedes empezar, ahora lo que te falta es como lograr eso...

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #6 (permalink)  
Antiguo 11/07/2005, 09:59
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Por eso apuntaba que necesita implementar recursividad, como generalmente en estas estructuras no se sabe el numero de hijos debajo, se necesita iterar en cada hijo para saber si tiene hijos, y si tiene hijos iterarlos a su vez, la solucion es muy similar al post que ya referi donde AZ me paso una Sub recursiva para imprimir una estructura de arbol.

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/07/2005, 10:52
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

De acuerdo, pero no solo la estructura de arbol, etc, es la unica solucion, otra solucion es un simple for, claro, no me gusta que son varias consultas, pero para una tabla tan pequeña como esta, pues no hay problema, creo...


blnSeguir = True
strID = "CategoriaMadreOriginal" = "0"

do while (blnSeguir = True)


1. seleccionar los hijos de la categoria que queremos.

select IdCategoria,
from categorias
where IdCategoriaMadre in ( strID )

2. crear una cadena de ID's a borrar == claro, en un for
if not objRs.Eof

do while not objRs.Eof

strID = objRs("ID") & ", "
objRs.MoveNext

loop

3. Hay Resultados, entonces borramos las categorias que coincidan.

delete form categorias
where IdCategoriaMadre in ( strID )


else

//No hay mas hijos
blnSeguir = False

end if

loop

Creo que con algo así hace el borrado en cascada, sin necesidad de hacer algo mas complicado, repito, si con la estructura de arbol logras tener algo como:

SQL = "DELETE FROM categorias WHERE IdCategoriaMadre in (1,2)

Pues es la mejor opcion en cuestion de eficiencia, pero si var a mantener un recordset, un cursor, etc para lograrlo, pues igual, puede ser algo muy pesado al final de cuentas, entonces quizas esta opcion no es tan mala.

Tambien, a esta estructura se le puede implementar un cambio para que el delete no se ejecute sino hasta el final, asi la cadena strID se forma mediante el while(blnSeguir), hasta que no tenga resultados, y al final se corre el delete como :

DELETE FROM categorias WHERE IdCategoriaMadre in ( strID )

Lo cual seria realmente lo mas eficiente, y por los select creo que no son para nada pesados porque son sobre un index, claro, si definiste un index adecuado.

Por eso decia, que la idea era basarse en la Madre, para empezar, el metodo que eligas para hacer esa busqueda ya son un chorro de opciones

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #8 (permalink)  
Antiguo 11/07/2005, 11:03
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Si, pero necesitas si o si conocer la profundidad de los hijos, finalmente si generas una consulta dinamica y preguntas si es EOF, y pasas a la siguiente categoria, y llamas de nuevo a la funcion, el planteamiento es nuevamente recursividad.

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/07/2005, 11:16
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
En realidad, tanto una funsión recursiva comno la solución que plantea Neurón, es prácticamente lo mismo. Lo interesante, y no se me hubiera ocurrido :D, es concatenar todos los id's de IdCategoria para hacer sólo 1 DELETE (yo hubiera hecho tantos DELETE's como fueran necesarios)
__________________
...___...
  #10 (permalink)  
Antiguo 11/07/2005, 11:17
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
De acuerdo...

Si es el principio general de recursividad, pero aplicado en algo más sencillo y más fácil de generar, según mi punto de vista.

Cambias un arreglo por una cadena, no tienes que recorrer ese arreglo 1 a 1 para sacar el CID a borrar, simplemente un solo delete apoyado con el IN, tampoco usas recordset, etc.

Me parece una solución sencilla y eficaz.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #11 (permalink)  
Antiguo 11/07/2005, 11:21
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Finalmente puedes hacer algo asi:

DELETE FROM tabla WHERE id in("&join(arreglo, ",")&")

Y tu arreglo sigue alli por si quieres hacer algo mas con el, finalmente es lo mismo. Por eso decia que a lo mejor en lugar de eso, puedes mediante la funcion recursiva borrar de una vez, cuestion de hacer pruebas de performance.

Otra alternativa si estas trabajando con SQL, seria generar un stored procedure que creara una tabla temporal con todos estos ids, asi mantienes la recursividad dentro del SQL.

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

Cita:
Iniciado por Neuron_376
Por eso decia, que la idea era basarse en la Madre, para empezar, el metodo que eligas para hacer esa busqueda ya son un chorro de opciones
Estoy de acuerdo con que existen muchisimos metodos, y no digo que el que proponias era malo o bueno, solo que al principio solo quice dar la idea principal para el borrado y dejar a speddy buscar su mejor solucion, porque en los mensajes anteriores se estaba basando en los campos equivocados.

Y bueno, ya basado en metodos, el SP o un cursor, no lo recomende porque no es un metodo que aplique a todas las bases de datos, es decir, no todos los motores lo soportan, y si puedes lograr eso con un for muy sencillo, pues es mejor, como dije, no digo que seria la 100% mejor solucion, pero si la mas facil y sencilla de implementar.



Un saludo.
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #13 (permalink)  
Antiguo 11/07/2005, 11:40
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Referer II



Cita:
si puedes lograr eso con un for muy sencillo
Código:
tabla categorias
|  id  | id_padre  |
   1         0
   2         1
   3         2
   4         1
   5         3
   6         4
Quiero borrar todas las categorias cuyo padre sea 1, pero a su vez a todos los descendientes de uno.

Tu dices que con un for muy sencillo lo lograrias, yo quiero saber, exactamente como lo harias?
La discusion no es que metodo utilizar para borrar, un IN o un ciclo con la sentencia N veces, sino como obtener la densidad de estas categorias y sabes que borrar...

Cita:
ya basado en metodos, el SP o un cursor, no lo recomende porque no es un metodo que aplique a todas las bases de datos
Cita:
Otra alternativa si estas trabajando con SQL
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #14 (permalink)  
Antiguo 11/07/2005, 11:55
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Jajajaja

Refer II nooooooo ... bueno, pero quedo comprobado que referer no es confiable verdad ??? jajaja

Te dije que habria momento para otro debate heee.... Jajajaja...

Tendria que cobrarte para darte el sistema completo u_goldman...

Ese algoritmo lo logra, si quieres borrar todo bajo la categoria 1, lo borrara, pruebalo, yo tengo para categorias algo muy parecido a lo que sppedy tiene en su tabla, nunca he ocupado borrar en cascada, tal como mencionaste arriba, no debería ser posible o necesario, yo simplemente pongo un estatus, de activo - inactivo a la categoria, pero no la borro, cuestion de gustos...

Pero ese algoritmo funciona, tal vez tengo algo mal, o x, pero el select dentro del for, te traera a todos los hijos bajo esa categoria, al final, ya tienes la cadena strID formada, y con un delete hasta el ultimo lograra el efecto

Si fucniona

Y para el delete de la categoria principal... solamente agregas un OR, o corres un delete inicial que lo haga (NO ANTES DE QUE OBTUVISTE LOS PRIMEROS HIJOS)

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #15 (permalink)  
Antiguo 11/07/2005, 12:02
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Cita:
Refer II nooooooo ... bueno, pero quedo comprobado que referer no es confiable verdad ??? jaja
No, lo que quedo comprobado es que no se sabe aplicar, en tanto sepas los usos y costumbres de referer, funciona, y debe ser meramente por cuestion de seguridad que lo hicieron de esa manera, si deseas podemos regresar al topico.

Si tu algoritmo implica recursividad, que es lo que no ha quedado claro, por supuesto que lo logra, pero insisto, no es de ninguna manera un for sencillo, tienes que llamar a todo lo que hay debajo de cierta categoria, eso implica recordsets dinamicos, y por cada pasada guardar los valores, o sea, lo importante es implementar la rutina recursiva, despues hay n metodos para borrar tus valores.

No importa si son primeros segundos, terceros o n generacion, si no lo haces con recursividad(al menos que desde el principio delimites el numero de profundidad), no hay manera de hacerlo.

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

Bueno...

1. Es el principio general de recursividad, pero no es una funcion recursiva, lo cual es siempre mas facil de entender...

2. No hay recordset dinamicos, no son necesarios, un simple set Rs=conn.execute("x") es suficiente, lo cual lo hace mucho menos pesado y rápido.

3. No implica crear una estructura de arbol, etc., es una simple cadena, lo cual es más sencillo.

Repito, es un método muy sencillo y muy ligero de implementar.

Será casi lo mismo, pero es algo como aquello que hablamos del Recordset de ADO y un set normal, casi lo mismo, pero con muchas diferencias que al final... hacen la diferencia.



Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #17 (permalink)  
Antiguo 11/07/2005, 13:01
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
El modelo que propones es mas o menos asi...

Código:
blnSeguir = true
strID = "0"
do while blnsegur
	strSQL = "SELECT loquesea FROM tabla WHERE padre = "&strID
	Set rs = ObjConn.Execute(strSQL)
	strID = ""
	if not rs.eof then
		do while not rs.EOF
			strID = strID & rs(0) & ","
		loop
		'una correcion aqui
		if len(strID) > 0 then
			strID = left(strID, len(strID) - 1)
		end if
	else
		'fin
	end if
loop
y vuelvo y digo, no funciona,

1. Donde reasignas el valor a blnseguir?
2. De esta manera iterara solo para el primer nivel.
3. Este es un recordset dinamico
Código:
	strSQL = "SELECT loquesea FROM tabla WHERE padre = "&strID
	Set rs = ObjConn.Execute(strSQL)
4. No veo recursividad por ningun lado.

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

Creo que te falta estudiar el modelo un poco mas...

NO ES DONDE LO REASIGNO, es DONDE LO PARO, justo donde pusiste 'fin, ahi es blnSeguir = False, lo que pusiste es un ciclo eterno, no tiene donde pararse, en lo que yo puse, hay donde y porque pararse, que es cuando termina, justamente cuando no encuentra mas hijos...

Repito, tal vez tengo algo mal, no esta probado, como el detalle de la "," extra que ya corregite, etc., falta las validaciones, pero el MODELO, LA IDEA, es correcta, es decir, asi funciona bien.

Bueno, sera cosa de irlo probando para depurarlo

Gracias por hacerlo, a speedy le va a servir...

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #19 (permalink)  
Antiguo 11/07/2005, 13:40
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Vamos "muchachos" , como se enfrascan en polémicas por cosas "triviales"
  #20 (permalink)  
Antiguo 11/07/2005, 13:43
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Entonces volvemos a lo mismo...hay que acostumbrarse a nombrar las cosas de manera adecuada, si tu modelo se llama una y otra vez a si mismo, es recursivo, aunque el algoritmo no lo refleje , y por ultimo, utiliza rs dinamicos, volviendo al tema central, no hay manera de hacer esto si no se recurre a un modelo recursivo a menos que especifiques la densidad de hijos

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

Jamas mencione en mi primer mensaje acerca de que si este algoritmo era recursivo o no lo era... solo que tu dijiste que es recursivo, hace como 4 post te dije que SIII, sigue el principo general de la recursividad, que es ejecutar lo mismo repetidas veces, pero OJO... no es lo mismo usar una funcion recursiva que una funcion normal, entonces diriamos que cualquier for, while, etc., es una funcion recursiva, pues claro que no, una cosa son las funciones recursivas y otra cosa los ciclos, y la recursividad es que algo se llame ASI MISMO n veces, un for, while, etc., EJECUTA lo mismo n veces...

El principio es el mismo... pero no es exactamente igual... bueno, segun mi punto de vista claro...

Otra cosa, tu mismo en otro post dijiste que esto:

Set rs = ObjConn.Execute(strSQL)

Era un recordset, pero que realmente era un vector creado a partir de un recordset, con un cursor ESTATICO, tu lo explicaste de esa manera... entonces ??? porque dices ahora que es dinamico

Entonces, el que le viene poniendo nombre al metodo eres tu, y yo he dicho.... De acuerdo..., en varias ocaciones

Creo que ya estamos de acuerdo u_goldman, si funciona o no el metodo que puse, el que lo use tiene que depurarlo, faltan otras cosas, como, que strID no va a funcionar, necesitas strIDFin, y strIDTemp, etc... pero no acostumbro poner todo el código

Y bueno, creo que estamos de acuerdo.

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #22 (permalink)  
Antiguo 11/07/2005, 16:01
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Nooooooooooooooooooooo


Cita:
Era un recordset, pero que realmente era un vector creado a partir de un recordset, con un cursor ESTATICO, tu lo explicaste de esa manera... entonces ??? porque dices ahora que es dinamico
De ninguna manera, lo que yo dije es que el recordset tiene un cursor estatico, cuando se instancia de la sig. manera:

Set rs = ObjConn.Execute(strSQL)

Pero sigue siendo y seguira siendo un recordset...

El que dije que era un vector pues asi es, es algo como esto:

ds = rs.GetRows()

Ahora, lo que dije es que obviamente al hacer una llamada recursiva para saber la densidad de x categoria, estas generando recordsets de manera dinamica, independientemente del cursor que ocupes para abrirlos. Por ende la acotacion de que posiblemente seria mejor borrar los registros como van saliendo en la llamada recursiva sin almacenarlos en ningun arreglo o cadena de caracteres.

Y lo que se dijo desde el principio:
Finalmente tienes si o si que implementar recursividad, independientemente del metodo que ocupes para borrar tus registros.

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #23 (permalink)  
Antiguo 11/07/2005, 16:21
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Ves.... ??

Todo es culpa tuya, porque no explicas bien desde el principio pues ??? jajajaja... es broma, pero en ningun momento estoy usando recordset dinamicos.

Bueno, de hecho mi idea no es mantener los recordset, para nada... repitiendo, falta tanto que depurar, que bueno, de hecho tal como lo escribi hace n delete, ahi mismo mencione un cambio, dejar el delete al final, etc.

Entonces bueno, depurando un poco....

Código PHP:

strCatOriginal 
"0"
blnSeguir true
strID 
strCatOriginal
strFin 
""
do while blnsegur
    strSQL 
"SELECT loquesea FROM tabla WHERE padre in (" strID  ")"
    
Set rs ObjConn.Execute(strSQL)
    
strID ""
    
if not rs.eof then
        
do while not rs.EOF
            strID 
strID rs(0) & ","
        
loop
                     
                         strFin 
strFin strID
          
                        
'Cierras el RS, no se necesita guardar para nada
                        rs.close
    else
        '
fin
                         blnSeguir 
False
    end 
if

            
'Liberar RS, no se necesita guardar para nada
            set rs = nothing
loop

'
Correcion de la coma
if len(strFin) > 0 then
  strFin 
left(strFinlen(strFin) - 1)
end if

delete from tabla where padre in strFin ) or CatID strCatOriginal
strSQL 
"delete FROM tabla WHERE padre in (" strFin ") or CatID = " strCatOriginal

set rs 
ObjConn.Execute(strSQL)
set rs nothing 
Así sería más o menos ya depurado, no guardas los rs, y en una cadena vas guardando solamente la coleccion de hijos de una categoria original.

Revisando el algoritmo que pusiste, lo que habias cambiado, es esto:

strSQL = "SELECT loquesea FROM tabla WHERE padre = "& strID

Y de acuerdo a lo que yo puse es:

strSQL = "SELECT loquesea FROM tabla WHERE padre in (" & strID & ")"

Así que ya veo porque decias que solamente lo hacía a un nivel, por la falta del IN, ademas que hubiera dado error claro, pruebalo ahora con el IN, el IN es necesario, y de esa forma si funciona.

Bueno, ya estamos de acuerdo, espero...

Suerte!!
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #24 (permalink)  
Antiguo 11/07/2005, 16:42
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Y dale...

Desde el principio te dije que si tu algoritmo era recursivo, por supuesto que funcionaria, el principio es el mismo, tu procedimiento se llama a si mismo N veces, hasta que finaliza, ya sea que lo hagas asi o lo encapsules en una funcion o en una subrutina o en un metodo dentro de una clase, es lo mismo.

Estas creando recordsets de manera dinamica cada vez que tu procedimiento se llama a si mismo, en ningun momento hable de recordsets con cursores dinamicos, solamente de recordsets creados dinamicamente, por eso vuelvo a lo mismo, utlimadamente se podrian borrar esos ids por cada pasada que haga el procedimiento, y finalmente (espero), esto es imposible de hacer si no implementas la recursividad...

Salu2,
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #25 (permalink)  
Antiguo 11/07/2005, 16:59
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
De acuerdo...

Si, de acuerdo... ahi voy de nuevo... si utiliza el principio de la recursividad... vengo escribiendo esto desde no se cuantos post arriva u_goldman, ese era el detalle ???, bueno, pues resuelto y estamos de acuerdo.

Pero por otra parte, a mi me enseñaron así... for = ciclo que sepite algo... funcion que se llama asi misma es una funcion recursiva, de hecho asi te lo enseñan en cualquier escuela, ambos siguen el mismo concepto, pero no son exactamente lo mismo.

Bueno, pues ya estamos de acuerdo

P.D: El concepto si... pero no es una funcion ni rutina recursiva... jajajajaja

Suerte, y es todo por mi parte... un saludo.
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
  #26 (permalink)  
Antiguo 11/07/2005, 17:16
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Eso es cierto

En realidad si, la recursividad es un concepto diferente y al menos mas abstracto, por eso es que existen los ciclos, si los desarrolladores pudieramos contemplar y entender la recursividad, los ciclos quedarian en el olvido, no se necesitarian.

Salu2, y hasta la proxima

P.D. Tu script no funciona
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway

Última edición por u_goldman; 11/07/2005 a las 17:23
  #27 (permalink)  
Antiguo 11/07/2005, 19:01
Avatar de El_Metallick  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago, Chile
Mensajes: 1.718
Antigüedad: 21 años, 7 meses
Puntos: 16
Myaquire... dejad que esta buena la cosa.... jajajajaj no pero la verdad es que las cotidianas discuciones entre U_G y Neuron sirven mucho.... siempre saco algo nuevo para aplicar a mi forma de programar... digamos que enrriquecen el foro... eso saludos y que gane el mejor jajajajajajajajjajaja :P
__________________
Haz la guerra en la cama y el amor donde se te de la gana...
El tiempo es el mejor maestro, lo único malo es que te mata...¡¡Aprovecha tu tiempo!!
  #28 (permalink)  
Antiguo 12/07/2005, 07:28
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Pues si...pero que discutan por cosas importantes como por ejemplo por que la Gallina cruzó la calle , o por que la fila del supermercado que no elegimos siempre avanza más rápido , no por cosas tan "faciles" como un saber si un borrado en cascada es recursivo o no aplicando las bases de los algorítmos genéticos evolutivos

naaaahhh, es broma ..... que sigan "deschongándose" como dicen por acá

saludos a los tres
  #29 (permalink)  
Antiguo 12/07/2005, 10:18
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Nah, creo que aunque sea todos nos reimos un poco, no se trata del mejor, yo no tengo mas que respeto por el master de la idea correcta, solo que a veces no coincidimos...
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #30 (permalink)  
Antiguo 12/07/2005, 10:31
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola:

Yo tambien siento gran respeto por los miembros de este foro, si no fuera porque son muy buenos sus integrantes, este foro no sería lo que es, y yo no perderia mi tiempo entrando aqui , pero porque todos aqui son muy respetables, es que me hecho mis vueltas.

Y dicen por ahi en las reglas de negocio

"Cuando 2 personas estan de acuerdo en todo... una de ellas no es necesaria"

Sin polémica no existe lluvia de ideas, sin lluvia de ideas no existe realmente "la idea correcta"

Suerte a todos!!

P.D: Mi algoritmo si funciona, jajajajaja
__________________
NeuronaNet.com... la idea correcta.
http://www.NeuronaNet.com
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 23:05.