Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Como creo una función recursiva para SQL Server 2005 y ASP

Estas en el tema de Como creo una función recursiva para SQL Server 2005 y ASP en el foro de SQL Server en Foros del Web. Me he dado cuenta de que cuando quiero hacer una función recursiva en SQL Server 2005 y ASP, y no me deja: Código PHP: <% ...
  #1 (permalink)  
Antiguo 05/10/2007, 08:12
Avatar de oabareload  
Fecha de Ingreso: junio-2006
Ubicación: Distrito Federal, México
Mensajes: 57
Antigüedad: 17 años, 10 meses
Puntos: 0
Como creo una función recursiva para SQL Server 2005 y ASP

Me he dado cuenta de que cuando quiero hacer una función recursiva en SQL Server 2005 y ASP, y no me deja:

Código PHP:
<%
Function 
buscarArea(id_area,mas)

    
qry="SELECT * FROM AREAS WHERE prearea = '"&id_area&"' ORDER BY nombre ASC"
    
set rsAREAS conn.Execute(qry)
    Do While 
not rsAREAS.EOF
        response
.write rsAREAS("id_area") &" - "rsAREAS("nombre")
        
qry="SELECT * FROM AREAS WHERE prearea = '"&rsAREAS("id_area")&"' ORDER BY nombre ASC"
        
set rsEXISTE=conn.Execute(qry)
        if 
not rsEXISTE.EOF then
            mas
=mas&"-"
            
Call buscarArea(rsAREAS("id_area"),mas)
        
end if
        
rsAREAS.MoveNext
    Loop

End 
Function
%> 
Se supone que mi tabla esta hecha de la siguiente manera:

Id_area = Identificador principal
nombre = Nombre del Área
prearea = Nombre del Área padre

Y esta función la llamo haciendo primero una búsqueda de las Áreas padres:

Código PHP:
<%
    
'Aqui busco las que no tienen padre, osea las que son las de hasta arriba'
    
qry="SELECT * FROM AREAS WHERE prearea = '' ORDER BY nombre ASC"
    
set rsAREAS conn.Execute(qry)
    Do While 
not rsAREAS.EOF
        response
.write rsAREAS("id_area") &" - "rsAREAS("nombre")
        
qry="SELECT * FROM AREAS WHERE prearea = '"&rsAREAS("id_area")&"' ORDER BY nombre ASC"
        
set rsEXISTE=conn.Execute(qry)
        if 
not rsEXISTE.EOF then
            mas
=mas&"-"
            'Aqui comienzo a usar la función recursiva'
            
Call buscarArea(rsAREAS("id_area"),mas)
        
end if
        
rsAREAS.MoveNext
    Loop
%> 
Si alguien tiene idea de porque no pifa esto, por favor diganme como puedo solucionar este dilema.

Nota: Esta lista de árbol puede llegar a ser infinita (por eso uso recursividad)
  #2 (permalink)  
Antiguo 05/10/2007, 09:05
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
De acuerdo Utilizando CTE en SP en 2005

La seleccion recursiva de informacion en SQL 2005 se puede realizar utilizando Common Table Expressions.... aunque no se retornan en orden jerarquico...

Código:
------------------------------------------------------
-- Generacion de informacion de prueba del ejemplo
------------------------------------------------------

if object_id('tempdb..#tmpTempo') is not null Drop table #tmpTempo

create table #tmpTempo (Id_area int, nombre varchar(20), prearea int)

Insert into #tmpTempo values (1, 'papa uno', null)
Insert into #tmpTempo values (2, 'papa dos', null)
Insert into #tmpTempo values (3, 'papa tres', null)

Insert into #tmpTempo values (4, 'hijo uno', 1)
Insert into #tmpTempo values (5, 'hijo dos', 2)
Insert into #tmpTempo values (6, 'hijo tres', 3)

Insert into #tmpTempo values (7, 'U1', 4)
Insert into #tmpTempo values (8, 'U11', 7)
Insert into #tmpTempo values (9, 'U21', 8)

------------------------------------------------------
-- Inicia seleccion recursiva utilizando CTE.
------------------------------------------------------
Declare @IdNum int

Set @IdNum = 1;   -- Seleccionar los hijos del registro 1

With Areas (Id_area, nombre, prearea)
AS
(
	Select Id_area, nombre, prearea
	from  #tmpTempo 
	Where prearea = @IdNum
	Union all
	Select T.Id_area, T.nombre, T.prearea
	From   #tmpTempo T
    Inner join Areas  A
    On    T.prearea = A.Id_area
)

Select * from Areas
El formato se podria aplicar utilizando XML o bien haciendo un ciclo en la aplicacion (ASP), aunque ya seria tema de otro foro...
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 05/10/2007, 10:11
Avatar de oabareload  
Fecha de Ingreso: junio-2006
Ubicación: Distrito Federal, México
Mensajes: 57
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: Como creo una función recursiva para SQL Server 2005 y ASP

Pues esta muy interesante, de hecho ya había visto algo así en otros lados (pues anduve buscando) pero desafortunadamente no entendí nada (igual ahorita).

Pero creo que sería bueno que buscara más acerca de esto puesto que creo llegar a necesitarlo más (espero no). Y mientras tendré que hacerlo de otra manera no muy ortodoxa pero tal vez más eficaz.

De una vez les digo como:

En el campo "prearea" tendre que poner todos los padres de esa Área:

padremayor,padremayor-1,.....,padremayor-n

Area 1 (id=1,prearea=' ')
Area 2 (id=2,prearea= ,1)
Area 3 (id=3,prearea= ,1,2)
Area 4 (id=4, prearea= ,1)
Area 5 (id=5,prearea='')
Area 6 (id=6,prearea= ,5)
Area 7 (id=7,prearea= ,5,6)
Area 8 (id=8,prearea= ,5,6,7)
Osea tomare el prearea anterior y le añadire el id_area padre de la nueva que este poniendo, por eso la coma y el espacio al inicio. De tal manera que al dividirlo en un split podre ubicar desde el inicio hasta el final a los padres.

Código PHP:
<%
qry="SELECT * FROM AREAS ORDER BY prearea ASC"
set rsAREAS conn.Execute(qry)
Do while 
not rsAREAS.EOF
 padres
=split(rsAREAS("prearea"),",")
 For 
0 to ubound(padres)-1
  qry
="SELECT * FROM AREAS WHERE id_area=' " padres[i] & " ' "
  
set rsEXISTE conn.Execute(qry)
  if 
not rsEXISTE.EOF then
   response
.write rsEXISTE("nombre") & " - "
  
End if
 
Next i
 rsAREAS
.MoveNext
Loop
%> 
De hecho me parece más ligero en cuanto al código, pero más lento, y esta lentitud se va ver clara cuando lleguen a ser miles de registros y árboles de hasta 5 o 6 ramas.

Pero aun así si alguien tiene otra solución la tomare en cuenta, de hecho no are ningún cambio todavía sino hasta el lunes, en caso de que se presente una mejor solución, y/o una más sencilla de aplicar.

Pero aun así MIL GRACIAS!!!
  #4 (permalink)  
Antiguo 05/10/2007, 13:11
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Como creo una función recursiva para SQL Server 2005 y ASP

Un consejo a todos los desarrolladores, siempre codifiquen CLIENTE-SERVIDOR, traducido, CERO CODIGO T-SQL en el front, ejecuten siempre STORE PROCEDURE, quitense de dolores de cabeza.
  #5 (permalink)  
Antiguo 06/10/2007, 13:23
Avatar de oabareload  
Fecha de Ingreso: junio-2006
Ubicación: Distrito Federal, México
Mensajes: 57
Antigüedad: 17 años, 10 meses
Puntos: 0
Pregunta Re: Como creo una función recursiva para SQL Server 2005 y ASP

Cita:
Iniciado por iislas Ver Mensaje
Un consejo a todos los desarrolladores, siempre codifiquen CLIENTE-SERVIDOR, traducido, CERO CODIGO T-SQL en el front, ejecuten siempre STORE PROCEDURE, quitense de dolores de cabeza.
NO ENTENDÍ... CON UN EJEMPLO ME QUEDARÍA MÁS CLARO (CREO)
  #6 (permalink)  
Antiguo 08/10/2007, 10:08
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Como creo una función recursiva para SQL Server 2005 y ASP

Debes crear solamente STORE PROCEDURE, para interactuar con tu base de datos y no meter codigo SQL en tu front, asi de simple.
  #7 (permalink)  
Antiguo 12/10/2007, 09:55
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Como creo una función recursiva para SQL Server 2005 y ASP

Una Decente Forma De Prevenir...... (no De Evitar) El Sql Injection....


Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
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 03:11.