Se trata de la creación de estructuras de jerarquía —propio de carpetas o del lenguaje XML— utilizando una base de datos relacional.
El núcleo de la aplicación es una única tabla que se relaciona consigo misma. Para que la aplicación sea más flexible y potente he creado una serie de tablas auxiliares que acompañan a la tabla principal. El código fuente se encarga de mantener y gestionar adecuadamente todo este sistema.
En este caso concreto he utilizado la base de datos Microsoft Access y su lenguaje de programación Visual Basic.
Código SQL para crear las tablas con datos de ejemplo: jerarquia.sql
Filas de la tabla
jerarquias dónde se almacena el
árbol de tipos de personajes
.
La tabla jerarquías_tipos se utiliza para poder almacenar distintos árboles de jerarquía dentro de la tabla jerarquías.
La tabla jerarquías_niveles se utiliza para realizar una descripción de cada nivel de profundidad del árbol.

Hay una serie de caracteres Unicode denominados Box
drawings
characters
que sirven para dibujar líneas horizontales y
verticales
unidas de todas las formas posibles. Esto era propio del juego de
caracteres ASCII que ahora con Unicode se puede volver a recuperar.
| Caracter | Código Unicode | Descripción |
|---|---|---|
─ |
U+2500 | Box drawings light horizontal |
│ |
U+2502 | Box drawings light vertical |
└ |
U+2514 | Box drawings light up and right |
├ |
U+251C | Box drawings light vertical and right |
┬ |
U+252C | Box drawings light down and horizontal |
Los tres árboles introducidos en la base de datos:
|
Personajes:
├─ Animal
Lugares:
├─ Júpiter
|
Empresas:
├┬ Aplicación
|
Para la gestión de las jerarquías se puede utilizar el siguiente formulario:

Forma de utilización:
Cuando se selecciona un hijo este paso automáticamente a la lista Elementos. Esto va bien para añadir los hijos de los hijos.
Pulsando el botón Atrás se selecciona el elemento padre del elemento actual, el cual pasará a la lista Hijos.
Arriba se muestra la ruta completa desde el primer ancestro hasta el elemento actual. Si la información mostrada fuese incorrecta habría que pulsar el botón Recalcular ruta para actualizarla.
Desde este formulario se puede mostrar un informe o un texto del árbol de jerarquía indicado en la lista Tipos. Hay la opción de que, en el informe o en el texto, se muestren las ramas mediante el uso de caracteres Unicode especiales.
Las tablas que se editan con este formulario son: jerarquias_tipos, jerarquias_niveles y jerarquias.
Una tabla —como es el caso de la tabla personajes— que quiera hacer uso de un árbol de jerarquía, ha de usar consultas que filtren los datos de la tabla jerarquias para un valor determinado del campo tipo_id. El campo tipo_id identifica cada uno de los árboles de jerarquía introducidos en la tabla jerarquías.
Para seleccionar un nodo del árbol, lo ideal sería utilizar un control de tipo árbol. En el presente ejemplo se utiliza únicamente cuadros combinados ya que Microsoft Access carece de dicho control. Los cuadros combinados pueden mostrar la información combinando campos de la tabla jerarquias de varias formas distintas:
id, rutaid, ruta_unixid, rama + jerarquiaid, numeracion + jerarquiaEn el formulario personajes_tabular se muestran algunos ejemplos.
Para facilitar la introducción de un determinado nodo lo ideal sería mostrar sólo parte del árbol en vez de mostrar todo el árbol completo. La técnica es la siguiente:
Ancestro unoAncestro dos/abuelo/padre/nodo/abuelo/padre/abuelo/Primer hijoSegundo hijoLos ancestros sirven para dar marcha atrás y los hijos para ir detallando más la selección. Para realizar una selección completa habrá que desplegar la lista tantas veces cómo sea necesario.
Podemos ver a una secuencia animada que ilustra como utilizar esta técnica. En el formulario personajes_ficha hay una implementación de la misma.
Crear un cuadro combinado llamado por ejemplo jerarquia_id con las siguientes propiedades:
| Origen de la fila: | select * from temp_jerarquias where
clave='combo1' |
|---|---|
| Número de columnas: | 2 |
| Ancho de columnas: | 0 cm; |
Hay que añadir código para el evento Al hacer clic del cuadro combinado y el evento Al activar registro del formulario.
Private Sub Form_Current()
Call jerarquia_id_Click
End Sub
Private Sub jerarquia_id_Click()
If jerarquiaListaProgresiva(Nz(Me.jerarquia_id, 0), 1, "combo1") Then
Me.jerarquia_id.Requery
End If
End Sub
Parámetros utilizados en la función jerarquiaListaProgresiva:
NZ porque es necesario que un posible valor NULL se convierta en 0.
Se trata de un formulario de ejemplo que filtra los personajes utilizando la técnica del cuadro combinado progresivo pero con una lista. Se navega por la lista de jerarquía y se van mostrando en una segunda lista los personajes de la jerarquía indicada. Además hay un informe del árbol de personajes.
jerarquiaCalcular()jerarquiaInformeEnTexto(tipo_id,
[conRamas])jerarquiaBuscarProgenitor(elemento_id,
nivel_id)jerarquiaDesplazarNivel(nivel_id,
nivel_desplaz)jerarquiaPrimerNivel(tipo_id)jerarquiaTieneHijos(elemento_id)jerarquiaPadre(elemento_id)jerarquiaNivel(elemento_id)jerarquiaElemento(elemento_id)jerarquiaRuta(elemento_id)jerarquiaListaProgresiva(elemento_id,
tipo_id, clave)Sería interesante adaptar este ejemplo a MySQL y utilizar como lenguaje de programación Java, PHP o Ruby on Rails.
La funcionalidad del cuadro combinado progresivo se podría ampliar para permitir añadir dinámicamente nuevos elementos.

Un comentario:
Lo he actualizado a la versión 1.1
He mejorado la lista progresiva y he añadido un formulario e informe de ejemplos sobre el árbol de personajes.