Miércoles, 11 de Mayo de 2005

TreeView

Interesante solución la que presenta Jose Luis Sanchez Navarro en Avemundi para presentar un treeview a partir de datos almacenados en tablas.

Permidme presentar otra, algo más elaborada, que cumple con las reglas de la normalización.

Se trata de tener una tabla para cada nivel del árbol, así, para el caso presentado por Jose Luis, serían necesarias 5 tablas: Nivel1, Nivel2, Nivel3, Nivel4 y Nivel5 las llamaremos.

La tabla Nivel1, contendrá codigo y descripción, así CN1, DN1;

la tabla Nivel2, contendrá código del nivel 1, contador dentro del nivel 2 y descripción, así, CN1, CN2, DN2. La clave de esta tabla será CN1+CN2;

la tabla Nivel3, contendrá código del nivel 1, contador dentro del nivel 2, contador dentro del nivel 3 y descripción, así, CN1, CN2, CN3, DN3. La clave de esta tabla será CN1+CN2+CN3;

la tabla Nivel4, contendrá código del nivel 1, contador dentro del nivel 2, contador dentro del nivel 3, contador dentro del nivel 4 y descripción, así, CN1, CN2, CN3, CN4, DN4. La clave de esta tabla será CN1+CN2+CN3+CN4;

la tabla Nivel5, contendrá código del nivel 1, contador dentro del nivel 2, contador dentro del nivel 3, contador dentro del nivel 4, contador dentro del nivel 5 y descripción, así, CN1, CN2, CN3, CN4, CN5, DN5. La clave de esta tabla será CN1+CN2+CN3+CN4+CN5;

La forma de recorrer las tablas para crear el treeview será la sigiente:

Abrir todas las tablas.
Situarse en el primer registro de la tabla Nivel1.
Mientras no sea fin de fichero Nivel1

.....Añadir descripción DN1 al árbol
.....Establecer Scope en Nivel2 por CN1
.....Situarse en primer registro de Nivel2

.....Mientras no sea fin de fichero Nivel2

..........Añadir decripcion DN2 al arbol
..........Establecer Scope en Nivel3 por CN1 y CN2
..........Situarse en primer registro de Nivel3

..........Mientras no sea fin de fichero Nivel3

...............Añadir decripcion DN3 al arbol
...............Establecer Scope en Nivel4 por CN1, CN2 y CN3
...............Situarse en primer registro de Nivel4
...............Mientras no sea fin de fichero Nivel4

....................Añadir decripcion DN4 al arbol

....................Establecer Scope en Nivel5 por CN1, CN2, CN3 y CN4
....................Situarse en primer registro de Nivel5

....................Mientras no sea fin de fichero Nivel5

.........................Añadir decripcion DN5 al arbol
.........................Avanzar siguiente registro Nivel5

....................Fin mientras Nivel5

....................Avanzar siguiente registro Nivel4

...............Fin mientras Nivel4

...............Avanzar siguiente registro Nivel3

..........Fin mientras Nivel3

..........Avanzar siguiente registro Nivel2

.....Fin mientras Nivel2

.....Avanzar siguiente registro Nivel1

Fin mientras Nivel1

Cerrar tablas

A simple vista puede parecer un galimatías tremendo, pero con el tiempo esta solución ahorra mucho espacio en disco al no repetir las descripciones de todos los niveles para cada registro (aunque sea con espacios en blanco)y cumple la normalización de tablas en bases de datos (por si alguien decide en un futuro hacer estas cosas con bases de datos).

Siempre se puede trabajar más el sistema de identificación de registros para que permita insertar entre dos existentes, ordenar cada rama alfabéticamente, etc.

Jose A. Suárez   |  Comentarios [2]   |  TrackBack (0)

Comentarios

Trabajando con SQL no utilizo esa estructura sino una lista enlazada indicando quien es el superior de un elemento dado.

TABLA "CARPETAS"
ID -> Identificador único
ID_SUP -> Quien es el superior de este elemento
NOMBRE -> Descripción de la carpeta

Luego mediante un procedimiento de carga recupero los elementos que no tienen a nadie como superior ordenados por el NOMBRE, y llamo a otro procedimiento "recursivo" que se encarga de cargar cada "rama", pasandole al procedimiento quien es el superior que se está cargando. De esta forma no me limito a N profundidades, es realmente ilimitado.

No se si me he explicado... si eso mañana pongo un poco de código. :)

Comentado por Jose Alberto a Miércoles, 11 de Mayo de 2005

Creo que te entiendo.
Haces una sola TABLA, con un campo ID autoincremental, para que no haya duplicaciones de "carpetas"-"secciones"-"loquesea"
y a cada registro le asignas el un campo ID_SUP con el ID de la carpeta a la cual pertenece....

Una consulta si necesitas poner un orden en las carpetas que pertenecen a una carpeta superior, como lo harias?


Comentado por roberto a Viernes, 13 de Mayo de 2005