Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/08/2012, 03:20
pcid
Usuario no validado
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 16
Respuesta: Consulta iterativa

Pensando en que sufra el programador antes que el servidor y la base de datos -con consultas recursivas-, podrías hacer algo así:

Tabla para registro de carpetas:
Id_Item int (PK)
Descripcion varchar
Nivel int
Correlativo int
CodGeneral varchar(200)
Id_Item_Ref int (FK a Tabla.Id_Item)

Datos
Código SQL:
Ver original
  1. Id_Item     Descripcion     Nivel   Correlativo CodGeneral      Id_Item_Ref
  2. ----------  --------------- ------- ----------------------      -----------
  3. 1           Madre 1         1       1           001             NULL
  4. 2           Hija 1          2       1           001001          1
  5. 3           Hija 2          2       2           001002          1
  6. 4           Nieta 1 x Hij1  3       1           001001001       2
  7. 5           Nieta 2 x Hij2  3       2           001002002       3
  8. 6           Madre 2         1       2           002             NULL

Ese campo "CodGeneral" lleva en 3 dígitos forzados por nivel el número de correlativo correspondiente.

Por ejemplo, "Nieta 1 x Hij2" en el nivel 3 tiene correlativo 2. Así que le corresponde "002". A esto le concatenas a la izquierda el CodGeneral de su ancestro inmediato "Hija 2" que es "001002" y te quedará "001002002".

Si haces un "select * from TABLA order by CodGeneral" tendrás la lista de carpetas y sub carpetas y sub sub..n carpetas en orden.

La cosa se complica cuando quieras mover una carpeta de lugar... Toca re-calcular todos los CodGeneral afectados.

Esto lo tengo ya implementado en más de un sitio web, así que te puedo garantizar que funciona ;)

OJO:
Ese CodGeneral debes ponerle una longitud suficiente para que no se "pase" de cierta cantidad de subniveles de carpeta. Y/o pararle los pies al usuario cuando intente agregar un tataranieto cuyo CodGeneral no quepa en el campo correspondiente.

También tenes que considerar que si "999" carpetas por carpeta no bastan, entonces en lugar de "a 3", los pones de "a 4" los pedazos de texto por nivel en cada CodGeneral.

De igual forma, si con "99" carpetas por carpeta vas sobrado, pues en lugar de "a 3" los pones de "a 2".