Torre de Babel

Cómo usar el nuevo Diseñador de módulos de datos de Delphi 5

by Francisco Charte.

Una de las tareas más tediosas que los programadores tenemos que efectuar al trabajar con componentes de accesos de datos, es el establecimiento de las necesarias conexiones entre dichos componentes. La base de datos se enlaza con la sesión, lo mismo que las tablas y consultas. Cuando existen relaciones maestro/detalle hay que realizar más enlaces, y lo mismo ocurre cuando una columna de un conjunto de datos debe tomar valores almacenados en otra tabla. Si alguna vez has desarrollado una aplicación de las llamadas de gestión, seguro que todo esto no te es ajeno.

Casi desde sus inicios, Delphi ha facilitado la separación de los elementos de interfaz, alojados en formularios, de aquellos pensados para efectuar el acceso a los datos. Con este fin existen los módulos de datos que, posiblemente, hayas usado en infinidad de ocasiones. Un módulo de datos, tal y como lo conocíamos hasta Delphi 4, era un simple contenedor, un depósito en el que ir alojando nuestros componentes de acceso a datos.

Establecer las relaciones entre los diversos componentes, no obstante, no es el único problema con el que nos enfrentamos habitualmente. Tanto o más importante, es contar con la documentación apropiada para conocer, durante la fase de desarrollo, todas esas relaciones. Salvo que utilicemos una herramienta de diseño o planificación previamente, lo más usual es que acabemos dibujando, ya sea en pantalla o en papel, una representación de los datos y sus enlaces.

Con Delphi 5, como tendrás ocasión de ver en este artículo, las tareas descritas se han automatizado en su mayor parte. Los módulos de datos, aparte de para almacenar componentes, ahora cuentan con otros elementos que le han convertido en un diseñador, facilitando el establecimiento de relaciones entre los componentes. También es más simple la documentación de los enlaces, ya que en el diseñador es posible trazar un diagrama de bloques representando tablas, consultas, columnas, propiedades y otros elementos.

Elementos del nuevo módulo de datos

Al añadir un módulo de datos a un proyecto en Delphi 5, lo primero que advertirás es que la ventana ahora tiene dos secciones, a izquierda y derecha, y que ésta última cuenta con dos páginas. La visible por defecto, según puede verse en la Figura 1, es la equivalente a la de los módulos de datos de versiones previas. En ella, por tanto, puedes insertar los componentes de acceso a datos que necesites, como has hecho hasta ahora.

El panel que ocupa la parte izquierda es una lista jerárquica, en la que irán apareciendo todos los componentes alojados en el módulo de datos. Las dependencias entre esos componentes se mostrarán gráficamente, mediante niveles, como ocurre en un componente TTreeView. Cada vez que añadas un componente en el panel derecho, automáticamente en la lista jerárquica aparecerá su nombre entre paréntesis, precedido del nombre de la base de datos, tabla, sesión, etc. A medida que vayan estableciéndose propiedades, por ejemplo relacionando una tabla con una base de datos o una sesión, los elementos en la lista jerárquica irán cambiando de posición para mostrar la configuración actual.

Además de los elementos creados explícitamente, al insertarlos en el módulo de datos, en la lista jerárquica también aparecen aquellos usados por defecto por Delphi cuando no se indica lo contrario. Al insertar un TTable, por ejemplo, podrás ver cómo automáticamente se asocia a una base de datos y una sesión por defecto. Algo similar ocurrirá si añades al módulo un componente ADO, como un TADOTable, creándose una conexión implícita para él.

La segunda página del panel derecho, llamada Data Diagram, inicialmente está vacía. A pesar de que en la página de componentes hayas insertado algunos objetos de acceso a datos, éstos no se reflejan automáticamente en ésta segunda página. Fíjate en la existencia, en la parte central del módulo de datos, de una barra de botones. En principio la mayor parte de ellos están desactivados. Después veremos para qué sirven y cómo utilizar esta página para crear nuestro modelo de datos.

El antiguo método de trabajo

Si para diseñar una aplicación con acceso a datos, usando Delphi 5, creas un módulo de datos e insertas directamente los componentes en la página Components, estarás trabajando como habías hecho hasta ahora, con versiones previas. No estás aprovechando las nuevas posibilidades del diseñador de módulos de datos, algunas de las cuales pueden ahorrarte muchos pasos que, aunque simples, consumen su tiempo.

Para ver claramente cuáles son las diferencias entre el antiguo y el nuevo método de trabajo, vamos a servirnos de un hipotético programa de ejemplo, en el que necesitamos acceder a una de las tablas de la base de datos de ejemplo que acompaña a Delphi. Añadiríamos un módulo de datos al proyecto y, a continuación, insertaríamos en él un componente TDatabase, un TSession, un TTable y un TDataSource. Aunque vamos a asumir que trabajamos con los componentes BDE, el caso sería prácticamente idéntico para los componentes ADO o IBX.

Tras insertar los cuatro componentes, sin modificar aún propiedad alguna, en el módulo de datos tendríamos algo parecido a lo que puede verse en la Figura 2. Observa, en la lista jerárquica, que prácticamente no existe relación alguna entre los cuatro componentes insertados. Colgando directamente del módulo de datos tenemos al TSession y el TDataSource, así como una sesión creada por defecto. Dependiendo de ésta tenemos el TDatabase insertado por nosotros y otro también creado por defecto, del cual, a su vez, pende el componente TTable.

Lo siguiente que haríamos sería establecer las propiedades necesarias del TDatabase para acceder a la citada base de datos. Puesto que deseamos usar nuestra propia sesión, enlazaríamos el TDatabase con el TSession, haciendo lo mismo con el TTable. Éste último, deberíamos asociarlo al TDatabase, eligiendo a continuación cualquiera de las tablas disponibles. Por último, enlazaríamos el TDataSource con el TTable, finalizando el proceso.

Dados todos los pasos descritos, el aspecto del módulo de datos será ahora el de la Figura 3. En el panel derecho no hay diferencia alguna. Todos los cambios se han reflejado, sin embargo, en la lista jerárquica. Podemos ver claramente que hay una sesión, con una base de datos y una tabla que, a su vez, tiene enlazado un TDataSource. Fíjate en que las marcas rojas que existían antes, en la Figura 2, ahora han desaparecido, indicando que todos los componentes están correctamente enlazados.

Para finalizar, haríamos doble clic sobre el TTable a fin de abrir el editor de columnas. Usando el menú emergente, o bien la combinación Control+F, añadiríamos todas las columnas de la tabla. De esta forma podremos hacer referencia directa a los objetos que representan a las columnas, sin necesidad de usar la propiedad Fields o el método FieldByName().

El nuevo método de trabajo

La lista jerárquica que ocupa la parte izquierda de los módulos de datos, no es simplemente una visualización de las relaciones entre los componentes. Es, en realidad, un panel de trabajo, en el que también podemos arrastrar y soltar componentes, desde el que podemos acceder a las propiedades y a las opciones de cada componente. En la página Components los componentes se sueltan sobre el fondo de un contenedor. En la lista jerárquica, por el contrario, los componentes pueden soltarse unos sobre otros, fijando directamente las relaciones entre ellos.

Para apreciar claramente las diferencias entre el anterior método de trabajo y el nuevo, lo mejor es añadir un nuevo módulo de datos al proyecto, dando a continuación los pasos necesarios para llegar al mismo resultado.

En este caso comenzaríamos insertando el componente TSession, en la lista jerárquica o en la página Components de manera indistinta. Si lo sueltas en la lista, verás que el componente aparece también aproximadamente en el centro del panel derecho. Establecemos el nombre de la sesión, que de manera inmediata aparecerá en la lista jerárquica.

El siguiente paso sería la inserción del componente TDatabase, pero no sobre el panel derecho, sino en la lista jerárquica, concretamente sobre el elemento que representa a la sesión, tal y como se indica gráficamente en la Figura 4. De esta forma asociaremos directamente la base de datos con su sesión, sin necesidad de establecer propiedades manualmente.

Como puedes imaginar, el componente TTable lo soltaríamos sobre la base de datos. De esta forma lo enlazaríamos con su sesión y base de datos. El TDataSource, por último, lo soltaríamos sobre el TTable. En caso de que intentes soltar un componente sobre otro que no le corresponde, por ejemplo el TDataSource sobre el TDatabase, observarás que el cursor cambia de aspecto, indicando que esa operación no es posible.

Tan sólo nos falta un paso: añadir todas las columnas de la tabla para que los objetos TField sean creados estáticamente. No es necesario abrir el editor de columnas para realizar esta tarea, basta con pulsar el botón secundario del ratón sobre el elemento Fields en la lista jerárquica, eligiendo la opción Add fields, como se muestra en la Figura 5. Ese elemento representa, en realidad, a la propiedad Fields del TTable al que pertenece.

Finalizado el proceso, tenemos exactamente el mismo resultado que obtuvimos en el punto anterior. La diferencia es que todos los enlaces se han establecido automáticamente, al soltar unos componentes sobre otros, en lugar de manualmente, estableciendo propiedades. ¿No te parece mucho más cómodo e intuitivo?

Diagramas de datos

La segunda página existente en el panel derecho del módulo de datos, llamada Data Diagram, permanecerá siempre vacía mientras no la usemos para algo. En ella podemos trazar visualmente las relaciones existentes entre nuestros datos. No ya entre sesiones, bases de datos, tablas y similares, sino, además, las relaciones entre columnas de diferentes tablas. De esta forma es posible, por ejemplo, establecer una relación maestro/detalle entre dos tablas sin preocuparse de propiedades como MasterSource, MasterFields, etc.

Al diagrama de datos puedes arrastrar cualquiera de los elementos disponibles en la lista jerárquica, desde una tabla completa hasta columnas simples. También puedes insertar en él comentarios, así como líneas de enlace o alusión, según lo precises. Los botones existentes en la parte central se usan para asociar propiedades, crear relaciones maestro/detalle, relaciones de búsqueda, crear bloques de comentarios y trazar líneas de enlace.

Todos los elementos que aparecen en el diagrama de datos cuentan con un menú emergente, mediante el cual es posible acceder a sus propiedades, cambiar las características de visualización, eliminarlos del diagrama, etc. El propio diagrama de datos, cuenta con un menú que, aunque mínimo, dispone de una opción muy interesante: Print. Con ella podemos obtener una copia impresa de todo el diagrama de datos, lo cual puede servirnos como referencia para la posterior codificación.

La mejor manera de aprender a utilizar el diagrama de datos es, precisamente, usándolo. Arrastra elementos de la lista jerárquica y suéltalos sobre el diagrama. Usa el menú emergente para ver las opciones disponibles, incluye comentarios, etc. Verás que es bastante intuitivo y muy útil. De todas las operaciones posibles, tan sólo existen tres que pueden implicar una cierta dificultad: la asociación de propiedades y la creación de relaciones maestro/detalle y de búsqueda. Veamos algunas de ellas de forma práctica.

Partiendo de cualquiera de los módulos de datos que ya teníamos creados, vamos a añadir sobre la página Components un componente TDataSource, lo que causará que inicialmente no esté asociado con ningún otro. Ahora abrimos la página del diagrama de datos, arrastrando sobre él una de las tablas disponibles y el mencionado TDataSource. Como verás, no aparece ninguna relación indicada entre ellos. Para establecerla, pulsaríamos el primer botón disponible, contando de arriba a abajo, pulsando sobre el recuadro que representa al TDataSource y arrastrando hasta la tabla. Verás que aparece una flecha indicando que la propiedad DataSet del primer componente apunta al segundo. También en la lista jerárquica se reflejará la relación de manera inmediata.

Para crear una relación maestro/detalle entre dos tablas, es necesario contar con tablas que guarden alguna relación entre sí. En la base de datos de ejemplo de Delphi encontramos las tablas Orders y Customer, que se prestan a una relación de este tipo. Tras añadir esas dos tablas a la lista jerárquica, las arrastramos al diagrama de datos. A continuación pinchamos sobre la tabla maestra, que sería la de clientes (customers) y arrastramos hasta la de pedidos (orders). Aparecerá una ventana similar a la de la Figura 6, en la que seleccionaremos las columnas con valor común entre las dos tablas. Hecho esto, verás que aparece una línea de enlace entre ellas, con unos terminadores asimétricos. El de mayor tamaño representa a la tabla maestra, y el más pequeño a la tabla de detalle.

De forma similar, podría crearse una relación de búsqueda, añadir comentarios y cualquier otro enlace. Si añades al diagrama objetos que ya tienen una relación, podrás ver que ésta se representa de forma inmediata. Puedes, por ejemplo, arrastrar sobre el diagrama cualquiera de las columnas de una de las tablas. En la Figura 7 puedes ver un diagrama de datos con los pasos descritos en este punto. En cualquier momento puedes modificar el diagrama, desplazando los elementos y estirando los enlaces para disponerlos según tus preferencias.

Merece la pena

Como has podido experimentar por ti mismo, si has seguido en tu ordenador todos los pasos descritos en este artículo, el nuevo diseñador con que cuentan los módulos de datos de Delphi 5 es una herramienta que, sin duda alguna, merece la pena conocer. Si sabemos aprovecharla, no sólo ahorraremos trabajo y tiempo sino que, además, dispondremos de una forma sencilla de documentar nuestros modelos de datos, todo ello sin necesidad de ninguna aplicación externa.