08
Desarrollo
completo de
una aplicación
8.1
Tipos de tabla
Ya hemos visto cómo las tablas son los objetos que usamos para almace-nar la información de manera organizada. También hemos introducido las tablas de tipo maestro de clave numérica y las de tipo estático. A continua-ción vamos a ver el resto de tipos de tablas de datos con los que cuenta Velázquez Visual.
8.1.1. Tabla Submaestra
Son tablas que necesitan de una tabla padre para completarse, estando su código constituido por la unión del código del padre, o padres (no hay lími-te en el número de niveles) más el suyo propio. De esta forma la tabla sub-maestra tendrá un subcódigo propio por cada código padre. Pueden exis-tir dos fichas con el mismo subcódigo mientras la ficha de la tabla padre sea diferente.
Ejemplos de tablas submaestras pueden ser: PROVINCIA, siendo su padre PAIS. POBLACIÓN, siendo su padre PROVINCIA, etc.
Para crear una tabla submaestra debemos pulsar el botón Nueva tabla
sub-maestra , en la barra de herramientas situada a la derecha en la ventana
Esquema de tablas del Editor. Aparecerá la ventana correspondiente a las
propiedades de la tabla submaestra.
08
Desarrollo completo de una aplicaciónComo podemos ver, las propiedades son similares a las vistas para la tabla maestra, con el añadido de que debe indicarse cuál va a ser la tabla de
da-tos padre de la tabla submaestra.
La Longitud-rango que especificamos no es el número máximo de registros de la tabla, sino de registros por cada maestro de la tabla padre.
Ejemplo: creación de una tabla submaestra
En este ejemplo vamos a crear una tabla maestra y a continuación otra tabla, submaestra de la anterior. Para ello debemos seguir los siguientes pasos: Entramos en el Editor de proyectos y creamos un nuevo proyecto. Creamos una tabla maestra (desde el Editor de Esquemas pulsamos sobre el botón Nueva tabla maestra ) con las siguientes propiedades: nombre
plural: Países. Nombre singular: País. Pulsamos el botón Aceptar.
A continuación pulsamos el botón Nueva tabla submaestra y creamos una tabla submaestra con las siguientes propiedades: Tabla de datos padre: PAISES. Nombre plural: Provincias. Nombre singular: Provincia. Pulsamos el botón Aceptar.
VENTANA CREACIÓN DE MAESTRO e
Nueva tabla maestra Nueva tabla submaestra
Si observamos el Editor de Esquemas podremos ver cómo hay dos tablas: PAISES y PROVINCIAS. También se puede apreciar cómo Velázquez Visual ha enlazado directamente las tablas PAISES y PROVINCIAS. Esto siempre lo hace al crear una tabla submaestra, creándose automáticamente dicho enlace porque la relación que existe entre una tabla submaestra y su tabla padre es muy fuerte (recuerde que el código de la tabla submaestra está compuesto por el código de la tabla padre más el suyo propio).
08
Desarrollo completo de una aplicaciónCREACIÓN DE SUBMAESTRO
Se pueden crear tantos niveles de tablas submaestras como se quiera, es de-cir, en nuestro caso se podría crear otra tabla submaestra que tenga como bla padre a PROVINCIAS (por ejemplo una tabla CIUDADES), y a su vez la ta-bla submaestra creada ahora sería la tata-bla padre de otra submaestra y así in-definidamente. El índice CODIGO de cada una estaría formada como se pue-de suponer, por el campo CODIGO pue-de la tabla padre más el campo CODIGO de la propia tabla. Por lo general, a la hora de realizar un desarrollo con Veláz-quez Visual, no suelen realizarse más de dos niveles de tablas submaestras, no por limitación técnica ni de rendimiento, sino por simplificar la programación.
8.1.2. Tabla Arbolada
Las tablas arboladas son en realidad tablas maestras que se visualizan con una estructura arbolada (al estilo de un árbol de directorios), de modo que su campo CODIGO se abre en nuevas ramas por cada carácter o grupo de
ca-ÍNDICE CÓDIGO DE LA TABLA SUBMAESTRA
e
Cuestiones
1. Crear dos tablas: una de tipo maestro y otra submaestra de la ante-rior. Ver cómo el índice código de la tabla submaestra está com-puesto por el código propio y el de su tabla padre.
2. Crear una tabla de tipo maestro: PAISES, otra submaestra de PAI-SES: COMUNIDADES, y otra submaestra de COMUNIDADES: PRO-VINCIAS. Comprobar cómo Velázquez Visual no sólo enlaza PAISES con COMUNIDADES y COMUNIDADES con PROVINCIAS, sino que también enlaza PAISES con PROVINCIAS. Comprobar también có-mo el índice código de PROVINCIAS está compuesto por el código propio más el de COMUNIDADES y PAISES.
racteres que añadimos. Es el campo CODIGO el que determina la ramificación, representando cada carácter o grupo de caracteres un piso o nivel del árbol. Veámoslo con un ejemplo de Astronomía: en el Universo encontramos muchos tipos de objetos, por ejemplo galaxias. Pero las galaxias a su vez se clasifican en espirales, barradas, irregulares... y cada uno de estos grupos presenta más subdivisiones aún, y esto ocurre para casi todos los tipos de objeto del Uni-verso, sean galaxias, estrellas, nebulosas... Claramente, si queremos organizar los tipos de objeto del Universo en una tabla, ésta ha de ser de tipo arbolado. Para introducir un registro en la tabla arbolada hemos de especificar su có-digo y su nombre, lo que se hace en ejecución mediante un formulario.
Por ejemplo, para el registro “galaxia” especificamos “G”, y ya tenemos un tipo de objeto: un registro de la tabla.
Metamos ahora otro registro, por ejemplo, galaxia espiral. Las galaxias es-pirales son un subgrupo de las galaxias y esto queremos que se refleje en la estructura de la tabla. Para ello asignamos el código “GS” al tipo “gala-xia espiral”: ya tenemos dos registros, este último colgando del anterior, de modo que las galaxias espirales heredan todas las características de las ga-laxias. De igual modo, al registro “galaxia irregular” podríamos asignarle el código “GI”, reflejando así que las irregulares son un subgrupo de las gala-xias. Ya tenemos tres registros, colgando los dos últimos del primero. El árbol puede seguir creciendo (el límite está en la longitud del código de la tabla), por ejemplo, asociamos el código “GSA” a las “galaxias espirales de tipo A” (y ya tendríamos cuatro registros en la tabla).
08
Desarrollo completo de una aplicaciónHasta ahora hemos construido cada nivel con un solo carácter del campo código, pero también puede hacerse con más de uno, por ejemplo asig-nando GAL a las galaxias, ES a las espirales, A a las de tipo A...
Al igual que el resto de tablas, cada registro de una tabla arbolada está or-ganizado en campos. Por seguir con este ejemplo, los tipos de objeto del Universo podrían tener los campos Año de descubrimiento, Investigado ? (booleano), Naturaleza del objeto, etc.
Gracias a las tablas arboladas podemos definir el tipo al que pertenecen los registros de otra tabla, histórica de la arbolada. Por ejemplo, supongamos la tabla LIBROS, en la que cada registro se refiere a un volumen en particu-lar. En una tabla arbolada que llamaremos MATERIAS cada registro hará re-ferencia a una materia en particular (historia, historia del siglo XX, historia del siglo XIX, historia militar del siglo XX, historia de la monarquía del siglo XX... es decir, una estructura claramente arbolada). Estableciendo que LI-BROS sea histórica de MATERIAS, podemos capturar desde LILI-BROS la ma-teria a la que pertenece el libro (la mama-teria no es más que un registro de la arbolada MATERIAS).
Cuando presentamos los históricos de una tabla arbolada, podemos hacer que, dado un tipo o nivel de la arbolada, nos presente todos los históricos de todas las ramas contenidas en él. A esto se le denomina herencia
arbo-lada y se consigue activando el botón . Si desactivamos la herencia ar-bolada y pedimos que nos muestre los históricos a un nivel determinado, sólo nos mostrará los registros definidos con el tipo correspondiente a ese nivel (y no todos los contenidos en niveles inferiores).
Cuando introducimos un nuevo registro en una tabla arbolada hemos de te-ner cuidado a la hora de meter el código. Si un registro tiene por código A, y otro tiene AB, el de código AB se verá incluido en la rama iniciada por el de código A. Ahora bien, si usamos números tengamos cuidado, ya que to-dos los registros cuyo código empiece por 1 (10, 119, 1031...) se verán in-cluidos dentro de la rama iniciada por el de código 1, todos aquellos cuyo código comience por 2 se incluirán en la rama iniciada por el de código 2 y así sucesivamente. Lo más usual es definir el campo código como alfanu-mérico.
Se recomienda utilizar un Alfa40 para el campo código, con el fin de ahorrar espacio en disco.
TRUCO Herencia arbolada
Las propiedades de la tabla arbolada son las mismas que las de la tabla maestra. Especial mención merece el apartado Longitud-Rango: se refiere al número de niveles que va a tener la tabla arbolada. Por ejemplo, si una tabla arbolada tiene de longitud 2 bytes, el árbol tendrá 3 niveles, si tiene 4 bytes tendrá 6 niveles, etc.
Ejemplo: creación de una tabla arbolada
Vamos a crear una tabla arbolada a la que llamaremos FAMILIAS. Éste es un ejemplo clásico, ya que una familia está compuesta de subfamilias, que a su vez pueden presentar más subniveles.
Dentro del Editor de Esquemas, pulsamos el botón Nueva tabla arbolada . Aparecerá la ventana creación de maestro con clave arbolada, en la que es-cribimos Nombre plural: Familias. Nombre singular: Familia.
Según el número de pisos que vaya a tener el árbol seleccionamos la LON-GITUD-RANGO. En este caso marcamos el radio botón 8 bytes, lo que nos permite alcanzar hasta 12 subniveles.
Pulsamos el botón Aceptar.
En el Editor de Esquemas aparecerá el icono de la tabla arbolada FAMILIAS.
08
Desarrollo completo de una aplicaciónCREACIÓN DE MAESTRO CON CLAVE ARBOLADA
e
8.1.3. Tablas históricas
La característica principal de una tabla histórica es que no tiene campo CO-DIGO que permita apuntar a un registro concreto, pero sí puede tener otros índices de clave única. Se utilizan para almacenar las líneas de una tabla maestra. Las tablas históricas suelen tener un campo enlazado a una tabla maestra y un índice que será usado para declarar el enlace histórico de la tabla maestra.
Sus propiedades son fundamentalmente las vistas hasta ahora para el resto de tablas. Incorpora además la posibilidad de que Velázquez Visual cree automáticamente un campo llamado FECHA y su correspondiente ín-dice. También es posible indicar cuál o cuáles van a ser sus tablas maes-tras (lo normal es no enlazar la tabla a sus maestros desde esta ventana de propiedades).
El árbol, además del código, siempre presenta (y sólo presenta) el campo Nombre. Para incluir más datos definimos el campo Nombre como fórmula alfabética, o con un contenido inicial en función de otros campos, y así podremos mostrar lo que queramos.
TRUCO
Cuestiones
1. Encontrar distintos casos que presenten una estructura arbolada (clasificaciones biológicas, materias de libros, habitaciones de un hotel, estructura de los capítulos de un libro...).
2. Crear una tabla arbolada y construir el árbol de las galaxias espirales. 3. Crear una tabla histórica de la arbolada que hemos creado en la cuestión 2. Dar de alta una serie de registros con distintos tipos de-finidos en la tabla arbolada. Una vez hecho esto comprobar cómo funciona la herencia arbolada.
Ejemplo: creación de una tabla tipo histórico
Vamos a crear dos tablas: una maestra y otra de tipo histórico, y vamos a establecer un enlace entre ambas.
• En el Editor de Proyectos creamos una nueva tabla maestra con las siguientes propiedades: Nombre plural: Albaranes. Nombre singular: Al-barán.
• Dentro del Editor de Esquemas, pulsamos el botón Nueva tabla
histó-rica .
• Aparecerá la ventana Propiedades de la tabla histórica en la que añadi-mos las siguientes propiedades: Nombre plural: Líneas de Albaranes.
Nombre singular: Línea de Albarán. Pulsamos el botón Aceptar.
08
Desarrollo completo de una aplicacióne
Nueva tabla maestra Nueva tabla histórica
• Ya tenemos la tabla ALBARANES, que almacenará los datos correspon-dientes a la cabecera del Albarán (número de albarán, fecha, código de cliente, etc.) y la tabla LÍNEAS DE ALBARÁN que contendrá las líneas de un albarán (artículo, cantidad, precio, etc.). Hemos de enlazar ambas ta-blas mediante un enlace singular-plural. Con el ratón pinchamos sobre el enlazador (botón superior izquierdo) del maestro (ALBARANES) y arras-tramos hasta LÍNEAS DE ALBARAN.
Consideremos ahora la situación siguiente: queremos una aplicación con la que llevar el registro de los artículos que tenemos en varios almacenes, de modo que para un almacén sepamos todos los artículos que se guardan en él, mientras que para un artículo sepamos todos los almacenes en los que se guarda. Está claro que en nuestro diseño vamos a contar con dos tablas: ARTÍCULOS y ALMACENES. Ahora bien, ¿cómo las enlazamos? Ya sabe-mos que hesabe-mos de enunciar dos frases que nos ayuden, éstas son: “En un almacén podemos tener muchos artículos” y “un artículo podemos tenerlo en muchos almacenes”. Vemos que este caso difiere de los que nos había-mos encontrado hasta el momento, ahora tenehabía-mos un plural en los dos
sen-tidos o plural múltiple.
Para resolver estos casos hacemos uso de una tabla de tipo histórico que haga de intermediaria. Veámoslo con un ejemplo.
Ejemplo: resolución de un doble plural
El planteamiento es el siguiente: tenemos dos tablas, ALMACENES y ARTÍCU-LOS, que como ya hemos visto están relacionadas mediante un doble plural. Dado un almacén queremos saber todos los artículos que se guardan en él, y dado un artículo queremos saber todos los almacenes en los que está. Comenzamos el diseño de la aplicación creando dos tablas de tipo
maes-tro normal con clave numérica: ALMACENES y ARTÍCULOS. Nos es
sufi-e
ciente con los campos CODIGO y NOMBRE que Velázquez crea por defec-to en ellas. En ARTÍCULOS llevaremos recuendefec-to de defec-todos los artículos que tenemos, mientras que ALMACENES hará recuento de nuestros almacenes. A continuación vamos a crear una tabla de tipo histórico que resuelva el do-ble plural. Para ello pulsamos el botón Nueva tabla histórica , aparecien-do la ventana Creación de Histórico.
En Plural escribimos Existencias, mientras que en Singular escribimos Existen-cia. También quitamos el check Campo fecha y pulsamos el botón Aceptar. Ahora que ya tenemos creada la tabla de tipo histórico el siguiente paso es crear un enlace a histórico desde las dos tablas maestras creadas anterior-mente. Para ello pulsamos con el ratón sobre el enlazador en la tabla AL-MACENES y arrastramos hasta la tabla histórica. Repetimos el proceso con la tabla ARTÍCULOS.
Al establecer estos enlaces contra la tabla EXISTENCIAS, Velázquez ha creado en ella los campos Almacenes y Artículos, junto con sus correspon-dientes índices, es decir, los registros de la tabla histórica constan de dos campos: Almacenes y Artículos.
08
Desarrollo completo de una aplicacióne
Hacemos ahora doble clic sobre uno de los dos índices de la tabla EXIS-TENCIAS, hagámoslo sobre el índice Almacenes, por ejemplo. Le añadimos el componente Artículos y le damos el tipo Clave única. Así conseguimos que en esta tabla no se repitan registros (es decir, nunca se repite una mis-ma pareja almis-macén - artículo).
Este diseño ya nos resuelve el doble plural. Para verlo hemos dado de alta los siguientes registros de la tabla ARTÍCULOS:
También hemos dado de alta los siguientes registros de la tabla ALMACENES:
En EXISTENCIAS cada registro que damos de alta liga un binomio almacén-artículo, de modo que se registran, para cada almacén, todos los artículos que contiene (o visto de otro modo, para cada artículo, todos los almace-nes en los que éste se encuentra).
En nuestro ejemplo hemos creado un formulario para dar de alta los regis-tros de la tabla ALMACENES-ARTÍCULOS.
Supongamos entonces que en la tabla ARTÍCULOS elegimos un artículo determinado, por ejemplo “camisetas”. Podemos navegar hacia histórico con la opción Navegante/Históricos del menú del ejecutor.
08
Desarrollo completo de una aplicaciónAl pulsar sobre la opción del menú Navegante/Históricos, Velázquez mues-tra la ventana Navegante: Selección de Histórico. En ella hemos de especifi-car hacia qué histórico de la tabla ARTÍCULOS nos vamos a mover. En este caso sólo aparece EXISTENCIAS por ser su único histórico. A la derecha hemos de seleccionar la rejilla en la que vamos a ver los registros históricos.
Le damos al botón Aceptar y aparecerán en la rejilla todos los registros de la tabla EXISTENCIAS que son históricos del artículo.
Una vez obtengamos estos registros de histórico, podemos navegar hacia el maestro ALMACENES, obteniendo todos los almacenes en los que se en-cuentra el artículo. Para ello hemos de seleccionar la opción
Navegante/Maes-tros, apareciendo la ventana Navegante: Selección de Maestro, en la que
he-mos de indicar hacia qué maestro nos movehe-mos, en este caso Almacén.
Al aceptar obtendremos una lista de todos los almacenes en los que se en-cuentra el artículo. Ya tenemos uno de los sentidos del plural: los almace-nes del artículo.
Con el otro sentido del plural el proceso es idéntico: partimos ahora de un registro de la tabla ALMACENES, un almacén en concreto, y navegamos hacia histórico obteniendo todos los registros de la tabla EXISTENCIAS en los que aparece el almacén. Si navegamos hacia el maestro ARTÍCULOS obtendremos todos los artículos que se guardan en el almacén (éste es el otro sentido del plural, los artículos del almacén).
08
Desarrollo completo de una aplicacióne
Cuestiones
1. Sugerir distintos ejemplos en los que aparezca el doble plural (AUTO-RES-LIBROS, ALUMNOS-PROFESORES, LADRONES-ROBOS). 2. Siguiendo el ejemplo anterior resolver el doble plural
AUTORES-LI-BROS (caso particular de que un libro tenga más de un autor). Dar de alta registros en las tablas AUTORES, LIBROS y LIBROS-AUTO-RES. Moviéndose por las tablas encontrar todos los libros de un au-tor y todos los auau-tores de un libro.
8.1.4. Maestro de segundo nivel con clave numérica
Supongamos una aplicación en la que tenemos dos tablas: POBLACIONES y CLIENTES, ambas de tipo maestro normal con clave numérica, siendo CLIENTES histórica de POBLACIONES. A la tabla CLIENTES, que se en-cuentra jerárquicamente por debajo de la tabla POBLACIONES, se la deno-mina maestro de segundo nivel con clave numérica.
Podemos relacionar ambas tablas como es habitual: creando POBLACIO-NES y CLIENTES y enlazándolas a continuación, pulsando sobre el enlaza-dor de la maestra y llevando el puntero del ratón hasta la histórica. Pero Ve-lázquez nos ofrece otra posibilidad: si ya tenemos creada la tabla POBLA-CIONES y queremos crear CLIENTES, podemos usar el asistente para la creación de maestros de segundo nivel con clave numérica, para lo cual en la Galería de objetos seleccionamos tabla de datos, apareciendo la ventana
Asistente: Creación de una tabla de datos.
Seleccionamos Maestro 2º nivel con clave numérica y aparecerá la ventana de creación de maestro 2º nivel con clave numérica. Declaramos las pro-piedades de la tabla CLIENTES, así como las tablas maestras a las que apunta.
Pulsamos el botón Aceptar, creándose automáticamente la tabla CLIEN-TES, enlazada a su maestro POBLACIONES. En CLIENTES se ha creado un campo de enlace por cada una de las tablas maestras apuntadas, con su índice correspondiente (Poblaciones).
08
Desarrollo completo de una aplicaciónSi alguna de las tablas maestras enlazadas es submaestra de otra, Veláz-quez Visual genera un nuevo campo de enlace para completar el código de enlace. De hecho, generará tantos campos de enlace como sean necesa-rios, hasta llegar al padre de una relación Maestro - Submaestro multinivel. Veámoslo con un ejemplo:
Ejemplo: creación de un maestro de 2º nivel, histórico de una tabla submaestra
Supongamos una estructura en la que la tabla POBLACIONES es sub-maestra de PROVINCIAS y ésta, a su vez, es subsub-maestra de PAISES.
Si ahora añadimos la tabla CLIENTES, seleccionando como maestro de la misma POBLACIONES, en CLIENTES se creará automáticamente un campo enlazado a la tabla de PAISES, otro a la de PROVINCIAS y otro a la de POBLACIONES. Asimismo, se crea un índice de POBLACIONES, que estará compuesto por el código del país, el de la provincia y el de la población.
CREACIÓN DE MAESTRO DE 2º NIVEL
08
Desarrollo completo de una aplicaciónTambién quedan establecidos los enlaces históricos que relacionan cada una de las tablas maestras con el Maestro de 2º nivel recién creado. Si ahora redefinimos la tabla CLIENTES como submaestra de CIONES, se modificará su índice Código, añadiendo la clave de POBLA-CIONES.
También hemos de tener en cuenta la longitud del campo código de la ta-bla. Por ejemplo, si cambiamos el tipo de una tabla maestra por submaes-tra, ya que la longitud del código de las submaestras suele ser menor que el de las maestras.
Cuando cambiamos una tabla de un tipo a otro hemos de ser cuidadosos con las propiedades del campo código. Por ejemplo, al cambiar del tipo maestro arbolado (que tiene un código de tipo alfanumérico) a cualquier otro tipo de tabla (con código numérico), Velázquez no cambia automáticamente el tipo, sino que hemos de cambiarlo nosotros.
ADVERTENCIA
PROPIEDADES DEL ÍNDICE POBLACIONES e
8.1.5. Histórico doble
A la hora de diseñar una aplicación es habitual encontrarse con la estructu-ra cabeceestructu-ra-líneas. La llamamos así ya que un ejemplo representativo se da en aplicaciones de gestión, en las que las facturas se detallan en dos tablas: CABECERAS (de las facturas) y LINEAS (de una factura), LINEAS es histó-rica de CABECERAS. Cada registro de CABECERAS guarda datos genera-les acerca de una factura, siendo histórica de CLIENTES, mientras que en cada registro de LÍNEAS se hace referencia a un artículo, luego LINEAS es histórica de ARTICULOS.
08
Desarrollo completo de una aplicaciónEl asistente para la creación de maestros de 2º nivel sólo aparece cuando seleccionamos tabla de datos en la Galería de objetos. ADVERTENCIA e
Velázquez Visual cuenta con un asistente gracias al que podemos crear di-rectamente estructuras del tipo cabecera-líneas. Para acceder a él selec-cionamos tabla de datos en la Galería de objetos, apareciendo la ventana
Asistente: Creación de una tabla de datos. En ella seleccionamos Histórico doble-> Cabeceras y Líneas.
Aparecerá entonces la ventana Creación de histórico con cabeceras y
lí-neas, en la que hemos de declarar el nombre de la tabla que hace las
ve-ces de cabecera, en este caso FACTURAS. También hemos de seleccio-nar la tabla que hace las veces de maestro de la cabecera, en este caso CLIENTES, así como el maestro de las líneas de la cabecera, en este ca-so ARTÍCULOS.
El asistente para la creación de histórico con cabeceras y líneas sólo aparece cuando seleccionamos tabla de datos en la Galería de objetos.
Aceptamos y Velázquez nos crea el esquema que hemos presentado antes. El asistente ha creado automáticamente los campos de enlace entre las ta-blas FACTURAS y LINEAS DE FACTURA, así como los índices correspon-dientes. También genera los campos de enlace con los maestros.
8.1.6. Creación de una tabla igual a una base
8.1.6.
de datos externa
En un proyecto de Velázquez Visual es posible declarar Bases de datos externas, a las que podemos hacer referencia tanto para importar como
para exportar información. Además, podemos crear tablas de datos de Velázquez Visual con la misma estructura de campos y tipos de campos que esas bases de datos externas que hayamos declarado en el pro-yecto. Posteriormente, con ayuda de otro objeto, el Tubo de lista, po-dremos importar y exportar datos entre nuestra aplicación y la base de datos externa.
Como todavía no hemos visto las bases de datos externas ni los tubos, de-jaremos para más adelante la creación de tablas iguales a bases de datos externas.
Resumen
Las tablas submaestras necesitan de una tabla padre para completarse, es-tando su código constituido por la unión del código del padre más el suyo propio.
Las tablas arboladas se usan para guardar registros que presentan una es-tructura arbolada, como en las distintas materias de los libros en una bi-blioteca. Gracias a ellas podemos definir el tipo al que pertenecen los re-gistros de una tabla histórica de la arbolada.
Las tablas de tipo histórico no necesitan campo CODIGO, utilizándose pa-ra almacenar los registros históricos de una tabla maestpa-ra.
Al analizar un problema es frecuente encontrarse con tablas relaciona-das por un doble plural. Para resolverlo hacemos uso de tablas de tipo histórico.
Velázquez Visual cuenta con asistentes para la creación de tablas maestras de 2º nivel (tablas maestras que son históricas de otras tablas), y para la creación de históricos dobles (estructuras del tipo cabecera-líneas). En Velázquez Visual podemos declarar una tabla de datos igual a una base de datos externa que hayamos definido en el proyecto.
08
Desarrollo completo de una aplicaciónPara esquemas de facturas con líneas, albaranes con líneas, etc., se suele usar también la estructura Maestro-Submaestro, ya que posibilita la cuenta y ordenación de las líneas pertenecientes a una cabecera (Maestro).
8.2
Tipos de enlace
Hasta ahora hemos visto los enlaces más sencillos: el enlace a tabla de da-tos maestra (singular y plural) y el enlace a tabla de dada-tos estática. En este capítulo vamos a centrarnos en el resto de enlaces que podemos estable-cer en Velázquez Visual, y que son un poco más complejos que los vistos hasta ahora.
8.2.1. Asistentes para la creación de enlaces
Para facilitar la creación de enlaces el editor incorpora una serie de asis-tentes que podemos ejecutar desde el menú de contexto que se presenta al hacer clic con el ratón sobre el panel de estructura de datos de la
Venta-na principal del editor de proyectos.
En este caso la tabla que tomemos como referencia será sobre la que ha-yamos obtenido el menú de contexto.
También estará disponible en la Ventana de esquemas en el menú de con-texto que se presenta al pulsar el botón derecho del ratón sobre una tabla.
Otra posibilidad es seleccionar una tabla en el esquema y pulsar el botón
Crear punteros.
8.2.2. Enlace a hermano contiguo
Permite crear un enlace a un registro de la misma tabla de datos, de modo que podemos obtener los valores de sus campos o movernos por los re-gistros a través de un índice determinado. En ese índice no sólo podemos indicar los campos por los que queremos establecer el orden de movimien-to, sino que también podemos forzar a que sólo nos podamos mover por registros que contengan un valor determinado en un campo. Desde un re-gistro podemos obtener los valores de los campos del anterior o del si-guiente, lo que podemos usar para inicializar campos, cálculos a partir del valor del registro anterior, etc. Se trata de un puntero virtual, que no ocupa espacio en disco.
Veamos con un ejemplo cómo funciona este enlace:
08
Desarrollo completo de una aplicaciónEjemplo: Creación de un enlace a hermano contiguo
Supongamos una tabla en la que guardamos registros de personas, tenien-do cada registro los campos nombre, primer apellitenien-do y edad. Queremos que nuestra aplicación nos dé la posibilidad de fijar una edad y recorrer aque-llos registros cuyo campo edad coincida con el que nosotros hayamos fija-do. Además queremos que la ordenación se realice por apellido y nombre. Para ello seguimos los siguientes pasos:
Creamos otros dos campos en nuestra tabla de datos: anterior y siguiente, y creamos un índice en el que añadimos los campos edad, apellido y nom-bre en el cuadro Fórmula partes. El índice podemos definirlo de tipo
acep-ta repetidas, por si hay más de una persona en la que coincidan los tres
campos. Al índice lo hemos llamado Hermano.
Pinchamos en el campo siguiente y seleccionamos el enlace dentro del apartado ¿Enlazado? en la ventana de Propiedades de campo. En este ca-so seleccionaremos el enlace Hermano contiguo.
Veremos cómo al seleccionar el enlace Hermano contiguo se activa el bo-tón Resolución. Esto se debe a que hemos de indicarle a Velázquez Visual una serie de parámetros que necesita conocer para que pueda utilizar di-cho enlace.
Si pulsamos el botón Resolución nos aparecerá una ventana correspon-diente a la Resolución de puntero a hermano: Las propiedades que apare-cen en dicha ventana son las siguientes:
Índice por el cual va a realizar el enlace. En nuestro caso es el índice que
hemos llamado Hermano.
Nº de partes comunes del índice que tienen los registros a enlazar. Será el
campo o los campos que tendrán en común los registros por los que nos queremos mover. En nuestro caso nos movemos por registros que tienen una edad fija, luego el número de partes comunes es uno (si quisiéramos fi-jar edad y nombre, entonces sería dos). Si quisiéramos movernos por los re-gistros sin fijar una edad, sino según el orden de edad, el número de partes comunes sería cero.
Dirección: Anterior/Siguiente: Marcaremos una de las dos opciones, sirve
para indicar si se enlazará con el registro anterior o con el siguiente. En nuestro caso esta opción determina si los registros por los que nos move-mos se ordenan por orden alfabético de apellidos y nombre hacia la Z o ha-cia la A.
Este proceso que hemos hecho con el campo siguiente, hemos de repetir-lo con el campo anterior, con la diferencia de que la dirección es Anterior. Llegados a este punto, el enlace ya está hecho. Ahora nos vamos a un for-mulario y creamos dos botones, llamémoslos por ejemplo Anterior Persona
08
Desarrollo completo de una aplicacióny Siguiente Persona. Para el botón Siguiente Persona, en las propiedades
del botón le especificamos que el comando asociado al pulsar el botón sea moverse a hermano contiguo, y le decimos que el campo es siguiente.
Re-petimos la operación con el botón Anterior Persona, siendo en este caso el campo anterior. De este modo, una vez que estemos viendo un registro de-terminado en el formulario, podremos movernos a los registros siguiente y anterior que coincidan en edad con la de la ficha que estemos viendo. Podemos agilizar el proceso de creación de enlace a hermano usando el asistente Creación de campo puntero: Hermano, presentándose el siguien-te cuadro de diálogo:
En el asistente encontramos la opción Dirección: Ambas, que nos crea los dos enlaces, anterior y siguiente, de una sola vez.
e
Cuestiones
1. Rehacer el diseño del ejemplo anterior. Para el índice hermano indi-car que el número de partes comunes sea cero: ¿cómo nos move-mos por los registros?
2. Siguiendo con el ejemplo anterior. Rehacer el índice hermano, de modo que se componga de las partes Nombre, Apellidos y Edad (por este orden).
8.2.3. Singular de plural por posición
Permite crear un enlace singular a una tabla histórica de la tabla actual (es decir, elegimos un solo registro entre varios, de ahí singular de plural: uno entre muchos). Tendremos que elegir entre los distintos enlaces históricos definidos en la tabla maestra y se resolverá la posición fija del histórico con el que establecemos el enlace (de ahí por posición).
En el esquema, el enlace aparecerá dibujado como una flecha verde .
Por ejemplo, supongamos una aplicación en la que tenemos la tabla ma-estra TRABAJOS y la tabla TRABAJADORES, histórica de la anterior. En la tabla maestra podemos añadir un campo llamado último trabajador enla-zado a la tabla TRABAJADORES mediante un enlace singular de plural por
posición.
Para realizar este enlace basta con seleccionar el enlace Singular de plural por posición y en el campo Identificador elegir el histórico al que queremos
08
Desarrollo completo de una aplicaciónIndicar que el número de partes comunes sea uno. ¿De qué modo nos movemos por los registros?
3. Tenemos una aplicación para la gestión de presupuestos, con una tabla de las distintas cuentas presupuestadas (PGC) y otra de presupuestos anua-les (PRESUPUESTOS). ¿Cómo haríamos para que al crear una ficha nue-va, al elegir la cuenta presupuestada nos inicialice el campo del importe con el valor que tuvo el presupuesto de esa misma cuenta el año anterior? ¿Cómo haríamos para que, a partir de los presupuestos del año anterior y con un proceso, el valor del importe sea el del año anterior de esa misma cuenta incrementado en un tanto por ciento escogido por nosotros?
apuntar. Como contenido de Fórmula escribimos n, que es el identificador que Velázquez Visual da a la variable de sistema número de elementos de
la lista. De este modo, desde el campo último trabajador de la tabla
TRA-BAJOS podremos atrapar el registro que se encuentra en la posición n de la tabla histórica TRABAJADORES, es decir, el último trabajador de la lista. También podemos construir un enlace a hermano usando el asistente, el cual nos presenta el siguiente cuadro de diálogo en el que definir las pro-piedades del enlace:
8.2.4. Singular de plural por índice
Permite crear un enlace singular a una tabla histórica de la tabla actual, usando para su resolución el índice utilizado en el enlace histórico. El pro-gramador únicamente tendrá que resolver aquellas partes del índice utiliza-do en enlace histórico que no sean el campo enlazautiliza-do a la tabla actual. Veá-moslo con un ejemplo:
Ejemplo: singular de plural por índice
Supongamos una aplicación de gestión en la que llevamos registro de las facturas de nuestros clientes. Queremos saber cuál es la última factura de un cliente determinado.
Para resolver este problema necesitamos dos tablas, una maestra que lla-maremos CLIENTES, y otra histórica de la anterior que llalla-maremos FACTU-RAS. Al enlazar ambas tablas con un enlace a tabla maestra, en la tabla
e
Cuestiones
1. Diseñar una aplicación que lleve el registro de los ganadores de ca-da etapa del Tour de Francia.
CLIENTES se creará el histórico facturas, mientras que en la tabla FACTU-RAS se crea un campo llamado cliente, así como el índice cliente. En la tabla FACTURAS vamos a añadir el campo fecha, que nos indicará cuál es la fecha correspondiente a cada registro. Queremos saber cuál ha sido la última factura que le hemos hecho a un cliente determinado. Para ello añadimos el campo fecha al índice cliente de la tabla FACTURAS.
Una vez hecho esto, en la tabla CLIENTES añadimos un campo llamado
úl-tima factura. A este campo le asociamos un enlace singular de plural por ín-dice, escogemos el histórico que vamos a usar (facturas-clientes) y
pincha-mos en el botón Resolución para resolver el enlace.
08
Desarrollo completo de una aplicaciónAl pinchar en el botón Resolución se muestra el enlace histórico seleccio-nado; en el apartado Resolución partes se muestran aquellas partes del ín-dice utilizado en el enlace histórico que el programador debe resolver. Pa-ra ello basta con hacer doble clic sobre cada una y, a tPa-ravés del Asistente
para la edición de fórmulas, establecer la fórmula de su resolución. En
nuestro caso, el índice que usa es cliente creado por Velázquez en la tabla FACTURAS cuando hicimos el enlace a tabla de datos maestra. A ese ín-dice le añadimos el campo Fecha de la factura, siendo esa fecha la parte que hemos de resolver, cosa que hacemos con el Asistente para edición de fórmulas, especificando que el contenido debe rellenarse con la función
fHoy().
Por último, hemos de especificar el modo de búsqueda del registro históri-co (modo buscar), que podrá ser: Igual, Igual o mayor, Igual o menor, Mayor,
Menor, Primero y Último. En nuestro caso, como nos interesa saber la
últi-ma factura, el modo de buscar será igual o menor, ya que la fecha de la úl-tima factura puede ser hoy o algún día ya pasado.
De este modo, en el campo última factura de la tabla CLIENTES podemos capturar la última factura que le hemos hecho a un cliente determinado. Como en los casos anteriores, también podemos crear este enlace me-diante el asistente, presentándose el siguiente cuadro de diálogo:
Cuando entre dos tablas existe un enlace singular de plural, éste se visua-liza en el esquema de tablas como una flecha de color verde .
e
Cuestiones
1. Trabajando sobre el esquema del ejemplo anterior, obtener la factura de un cliente cuyo importe sea igual o inmediatamente superior a una cantidad determinada.
8.2.5. Enlace a tabla de datos indirecta real
y virtual
Los punteros indirectos se utilizan para relacionar la tabla de datos en cur-so con otra tabla que no es maestra de la actual. Habitualmente se trata de tablas que carecen de campo CODIGO y que por tanto no pueden ser de-finidas como maestras de otras tablas.
Existen dos tipos de enlaces a tabla datos indirecta: el enlace indirecto
real y el enlace indirecto virtual . La diferencia entre el enlace real y virtual radica en que el primero ocupa espacio en disco y el segundo no, es decir, el real tiene persistencia en disco y el virtual en me-moria. Además, si es virtual no permite actualizar la tabla apuntada, ha de ser un enlace indirecto real para ello.
Veamos mediante un ejemplo cómo crear un enlace a tabla de datos indirecta.
Ejemplo: creación de un enlace a tabla de datos indirecta
Con el siguiente ejemplo de gestión veremos cómo se establecen los enla-ces a tablas de datos indirectas en Velázquez Visual. Para entender este ejemplo, sepamos que al realizar una venta o una compra, la operación se detalla en un albarán. Éste consta de una cabeza en la que se indica el cliente o el proveedor, fecha, número del documento, importe total, etc., y de una serie de líneas de albarán, en cada una de las cuales indicamos el artículo y la cantidad, precio, descuento, importe, etc., de éste.
En ARTÍCULOS cada registro hace referencia a un artículo en particular mientras que ALMACENES lleva recuento de cada uno de nuestros alma-cenes. Ambas tablas están enlazadas por un doble plural (los artículos del almacén, los almacenes del artículo) que resolvemos mediante una tabla de
08
Desarrollo completo de una aplicacióntipo histórico, EXISTENCIAS, en la que incluiremos un campo que llevará las existencias de un artículo en cada almacén.
Cada vez que hacemos una venta en un almacén, ésta se verá reflejada en un albarán, luego en la tabla ALBARANES llevamos recuento de todas las cabezas de albarán de un almacén en particular. Por lo tanto, ALBARANES es histórica de ALMACENES.
Cada albarán constará de una serie de líneas en cada una de las cuales in-dicamos el número de artículos vendidos de cada tipo. Estas líneas se guardan en la tabla LÍNEAS DE ALBARANES, que lógicamente es histórica de ALBARANES (las líneas del albarán).
Por otro lado, LÍNEAS DE ALBARANES también es histórica de ARTÍCU-LOS, ya que un mismo artículo puede repetirse en varias líneas.
Ahora bien: nuestro objetivo es crear en LINEAS DE ALBARANES un pun-tero enlazado a la tabla EXISTENCIAS.
En nuestra aplicación hemos creado una rejilla para cada tabla, formula-rios de altas, bajas y modificaciones, búsquedas completas para cada ta-bla y un menú, llamado AUTOEXEC, que es el que se presenta al ejecutar el mapa.
Además, se han incluido botones para acceder a campos enlazados desde los formularios de altas y modificaciones de las tablas: EXISTENCIAS, AL-BARANES y LINEAS DE ALBARAN, así como rejillas de histórico en formu-larios de modificaciones maestros.
La tabla EXISTENCIAS recogerá las existencias de cada artículo en cada al-macén, por ello hemos añadido el campo Stock de tipo numérico, mientras que al índice Artículos de la tabla EXISTENCIAS hemos añadido el compo-nente almacenes y hemos definido como de clave única. Esto será necesa-rio para la resolución del puntero indirecto desde la tabla LINEAS DE AL-BARANES.
A la tabla de datos LINEAS DE ALBARANES hemos añadido el campo
Can-tidad (numérico) para anotar las canCan-tidades vendidas de cada artículo.
Lo que se quiere es que, cada vez que se dé de alta una nueva línea de al-barán, se acumule en negativo el campo Stock de la tabla EXISTENCIAS, con la Cantidad de unidades anotadas en la tabla LINEAS DE ALBARANES (es decir, si en una línea se indica la venta de dos camisetas, las existencias de camisetas deben reducirse en dos unidades).
Como podemos observar en el esquema de tablas, EXISTENCIAS es una tabla histórica y no está relacionada con la tabla LINEAS DE ALBARANES, tenemos que crear un puntero indirecto que enlace las dos tablas. Para ello
08
Desarrollo completo de una aplicaciónañadimos un campo a la tabla LINEAS DE ALBARAN que llamaremos
Pu-nexist (puntero a EXISTENCIAS). Editamos el cuadro de propiedades del
campo y especificamos que éste debe estar enlazado a tabla de datos in-directa, siendo EXISTENCIAS el identificador de la tabla enlazada.
Nos aparecerá el siguiente mensaje: “Los punteros indirectos a tablas de datos deben ser resueltos”. Para resolver el puntero, en el cuadro de pro-piedades de campo pulsamos el botón Resolución. Como índice de la tabla EXISTENCIAS seleccionamos ARTICULOS (el índice al que antes añadimos el artículo del almacén).
Tras seleccionar el índice aparecerán los campos a resolver de la tabla EXISTENCIAS. Esta resolución la haremos desde la tabla LINEAS DE AL-BARANES. Seleccionamos el primero de los campos a resolver (Artículo), y de la lista de campos que aparece bajo el epígrafe Resolución desde origen
actual (líneas de albarán) pinchamos en el campo ARTICULO. Con esto le
estamos diciendo que el artículo es el que aparece en el campo Artículo de la tabla LINEAS DE ALBARANES.
Seleccionamos el segundo campo a resolver (Almacén), y de la lista de campos de EXISTENCIAS pinchamos en el campo Albarán. Tendremos ac-ceso de este modo a los campos de la tabla ALBARANES y elegimos el campo Almacén (hemos seleccionado el almacén del albarán de la línea).
Por último, en el cuadro de propiedades del campo activamos la opción Dar
alta si no existe, así, si damos de alta un albarán de un almacén que
con-tenga un artículo en las líneas que no estuviese dado de alta en la tabla EXISTENCIAS, lo creará automáticamente.
Ahora ya tenemos creado el enlace con la tabla EXISTENCIAS. Éste se vi-sualiza en el esquema de tablas como una flecha ondulada que une ambas tablas.
Para crear un puntero indirecto podemos hacer uso del asistente de
crea-ción de campo puntero. Para ello hacemos clic con el botón derecho
es-tando seleccionada la tabla en la que queremos crear el campo. Se pre-sentará la siguiente ventana con las propiedades del puntero.
08
Desarrollo completo de una aplicaciónYa hemos comentado cómo la opción Dar de alta si no existe permite que, si el registro con el que se ha de enlazar el registro actual no existe en la tabla indirecta, sea dado de alta. Si queremos que sea el propio usuario el que confirme o no el alta del registro en la tabla indirecta, seleccionamos un formulario de altas en el parámetro Formulario para dar alta. Esta op-ción no estará disponible para los enlaces virtuales, y no funcionará si al-guno de los campos a resolver en el índice tiene valor 0 (por ejemplo, un campo booleano cuyos valores posibles son 0 o 1); el motivo radica en que si el campo tiene valor 0, se toma como campo vacío y, por tanto, no es resuelto.
Si el proyecto va a ser ejecutado con la versión cliente-servidor, no es posible la especificación del formulario de altas, el motivo es que este ti-po de operaciones son realizadas en el Servidor, no en el Cliente, y, si se tuviese que mostrar el formulario, éste aparecería en el Servidor. Por es-te motivo, si en un enlace de eses-te tipo se hubiese especificado la peti-ción de formulario, en tiempo de ejecupeti-ción, esta petipeti-ción sería obviada por el Servidor.
8.2.6. Las actualizaciones
Se encargan de modificar el contenido de los campos de un registro de una tabla enlazada, cada vez que se produce un alta, una baja o una modifica-ción en la tabla de origen, donde están definidas. Por ejemplo, desde una tabla de LINEAS DE ALBARAN (histórico) podemos actualizar el contenido del campo STOCK de su maestro ARTICULOS.
Se crean pulsando el botón Nueva actualización de la barra de he-rramientas. Al pulsarlo se muestra la ventana Actualización desde. En la lista desplegable Campo enlazado seleccionaremos un campo enlazado a la tabla de datos donde se quiere actualizar. Una vez seleccionado, en el control Tabla a actualizar se mostrará el nombre de la tabla de datos que va a ser actualizada. Si el campo enlazado seleccionado fuese un campo enlazado a un hermano contiguo, en el control Campo hermano
contrario se mostrará el campo enlace a hermano contrario al
seleccio-nado. Nueva actualización
Los distintos componentes de actualización que se vayan creando se mos-trarán en el control situado bajo la barra de botones de la actualización. Las funciones de estos botones son:
Crear un nuevo componente de actualización. Eliminar el componente de actualización seleccionado.
Mover una posición hacia arriba el componente de actualización selec-cionado.
Mover una posición hacia abajo el componente de actualización selec-cionado.
Editar el componente de actualización seleccionado.
Asimismo, se incluyen botones para cortar, copiar y pegar componentes de actualización.
En el cuadro de diálogo Componente de actualización define qué campo de la tabla de destino ha de ser actualizado, en función o no de una con-dición, y cómo va a ser actualizado. Simplemente se definirá lo que debe hacerse en caso de alta, ya que el programa automáticamente “sabe” lo que se debe hacer en una baja o en una modificación de ficha. El cuadro aparece cuando pinchamos en el botón insertar de la ventana Actualizar
desde.
08
Desarrollo completo de una aplicaciónCrear un nuevo componente Eliminar el componente Mover una posición hacia arriba Mover una posición hacia abajo Editar el componente
Cada componente de actualización consta de los parámetros siguientes, excepto para los enlaces a Hermanos contiguos:
• Comentarios: comentario para el diseñador.
• Fórmula condición para modificar: expresión fórmula condicional que debe cumplirse para realizar la actualización. Disponemos del asistente
de fórmulas para simplificar el uso de éstas.
• Campo: campo de la tabla de datos a modificar.
• Fórmula: expresión fórmula de donde se obtiene el contenido a actualizar. • Modo de modificar: se refiere a cómo vamos a actuar sobre el campo a
modificar. Puede ser de uno de los dos modos siguientes:
• Acumular: acumula en el campo destino el contenido del cuadro de edi-ción Fórmula, siempre que se cumpla la condiedi-ción dada en el cuadro de edición Fórmula condición para modificar.
• Absoluto: sustituye en el campo destino el contenido del cuadro de edi-ción Fórmula, siempre que se cumpla la condiedi-ción dada en el cuadro de edición Fórmula condición para modificar.
Las actualizaciones son disparadas cuando se crean, modifican o eliminan registros. En el caso de modificar o de eliminar registros, Velázquez Visual deduce el tipo de modificación que ha de realizar la actualización. Por ejem-plo, se puede declarar una actualización en la tabla de líneas de albarán de venta para que, al crear una línea de albarán de venta, se descuenten las
unidades vendidas de las existencias del artículo. Al borrar una línea del al-barán se actualizará, automáticamente, las unidades de la línea borrada a las existencias del artículo.
También podemos borrar un registro sin desactualizar (p. e. líneas de alba-rán con más de 5 años), para ello hemos de usar la función de Procesos
Re-correr lista eliminando fichas sin desactualizar.
Ejemplo: Creación de una actualización
Continuaremos con el ejemplo anterior, de modo que vamos a actualizar las existencias de un artículo (campo Stock de EXISTENCIAS) con el conteni-do del campo Cantidad de las líneas de venta de la tabla LINEAS DE AL-BARANES. Es decir, si en una línea de venta se indica que la cantidad ven-dida de un artículo es de cinco unidades, el stock de ese artículo debe dis-minuir en cinco unidades. Para ello aprovechamos el puntero que hemos creado en la tabla LINEAS DE ALBARANES.
Nos situamos en la carpeta Actualizaciones de la tabla LINEAS DE ALBA-RANES. Con la tecla Insertar nos aparecerá la ventana de propiedades de la actualización, en la que seleccionaremos como Campo enlazado el cam-po Punexist (el camcam-po enlazado a la tabla EXISTENCIAS).
Pulsamos el botón Añadir para crear el componente de actualización, mos-trándose la ventana Componente de actualización. En ella especificamos:
Comentarios: “Acumula el stock de las existencias”, es una explicación de
la actualización.
Fórmula condición para modificar: condición para que se produzca
actuali-08
Desarrollo completo de una aplicaciónTengamos en cuenta la siguiente nota para la versión cliente - servidor: no hemos de incluir en componentes de actualización nada que implique la intervención del usuario, por ejemplo, visualizar un mensaje, mostrar un formulario, una pregunta, petición de un dato, etc. El motivo es que este tipo de operaciones se llevan a cabo en el Servidor, por lo que el mensaje o el formulario no serían presentados en el Cliente, sino en el propio Servidor. Para evitar esto, el mensaje, formulario, etc. a presentar, será obviado por el Servidor.
ADVERTENCIA
zación. En este caso no habrá que especificar condición para que acumule el stock, pues éste debe acumularse siempre que entre nueva mercancía.
Campo: Stock (campo de EXISTENCIAS que vamos a modificar).
Modo de modificar: acumular (pues ha de acumular las existencias de cada
artículo en cada almacén en tantas unidades como se especifica en el cam-po Cantidad de los albaranes).
Fórmula: aquí se ha de utilizar el campo de la tabla LINEAS DE ALBARAN que
va a acumular el campo Stock en la tabla EXISTENCIAS. Es el campo Cantidad.
8.2.7. Componente de actualización a un hermano
contiguo
Las actualizaciones a hermano contiguo nos permiten ir recorriendo los re-gistros de una tabla que estén relacionados por un enlace de hermano
con-e
Cuestiones
1. En el ejemplo anterior, ¿qué diferencia hay entre el modo de modifi-car Acumular y Valor Absoluto?
2. Siguiendo con el ejemplo anterior, ¿cómo haremos para que la ac-tualización del campo Stock tenga lugar sólo cuando la cantidad de la línea sea superior a cinco unidades?
3. ¿Cómo haríamos para pasar de un albarán a otro del mismo distri-buidor?
tiguo, de modo que podemos obtener un acumulado final con el valor de un determinado campo de cada registro.
Al crear la actualización a un enlace a Hermano contiguo, se activará el combo box de Campo hermano contrario. En el mismo sólo aparecerán campos que haya definido en esta tabla de datos que sean contrarios al
campo enlazado. Por ejemplo, si en una tabla de facturas hemos creado
los campos FACTURA-ANTERIOR y FACTURA-SIGUIENTE, enlazados a hermano anterior y siguiente, respectivamente, seleccionando como cam-po enlazado FACTURA-ANTERIOR, sólo aparecerá en la lista de camcam-pos a actualizar el campo FACTURA-SIGUIENTE. Cuando añadimos un compo-nente a una actualización de este tipo, se presentará el siguiente cuadro de diálogo:
Los parámetros del cuadro Componente de Actualización son:
• Campo valor acumulable: campo numérico que contendrá el valor a acu-mular de cada registro (por ejemplo, el importe total de cada una de las facturas).
• Campo a modificar (acumulador): campo en el que se va a acumular el valor del campo especificado en el parámetro anterior (aquí se iría acu-mulando el total de cada una de las facturas).
• Contenido inicial del acumulador: es un control de solo lectura y muestra la fórmula resultante de la especificación de los dos campos anteriores. • Comentarios: texto explicativo acerca de lo que realiza la actualización. En el contenido inicial del campo a modificar se creará automáticamente la fórmula a ejecutar para llevar a cabo la actualización.
08
Desarrollo completo de una aplicaciónEste tipo de enlaces, con sus correspondientes actualizaciones, son muy útiles en programas de contabilidad para llevar en un campo determinado el arrastrado de los movimientos de una cuenta.
Ejemplo: Actualización a hermano contiguo
Tenemos una aplicación de gestión con dos tablas: CLIENTES y FACTU-RAS. Buscamos el acumulado total de los importes de las facturas.
En la tabla FACTURAS tenemos los campos Factura-Anterior y
Factura-Si-guiente, que están enlazados a hermano contiguo y que son los que
usare-mos para realizar la actualización. El campo Total guarda el importe de ca-da factura, mientras que en el campo Total-Ventas acumularemos el total de cada factura.
Pinchamos en el botón Nueva Actualización , apareciendo la ventana
Ac-tualización desde: FACTURAS. En ella especificamos que el campo
enlaza-do es Siguiente y automáticamente Velázquez Visual toma
Factura-Anterior como campo hermano contrario.
A continuación pinchamos en el botón insertar , apareciendo la ventana
Componente de Actualización. Como Campo valor acumulable elegimos Total (es el importe de cada factura), el Campo a modificar (modificador) es Total-Ventas.
e
Nueva Actualización Insertar
Pulsamos el botón Aceptar y en la ventana Actualización desde: FACTURAS aparecerá Total-Ventas como campo a modificar. Pulsamos Aceptar de nue-vo y ya tenemos terminada la actualización a hermano contiguo. Ésta apa-recerá dentro de la carpeta Actualizaciones de la tabla FACTURAS.
08
Desarrollo completo de una aplicación8.2.8 Enlace a maestro de una tabla contra sí misma
En todas las ocasiones en las que hemos hablado del enlace singular-plu-ral, lo hemos establecido entre dos tablas: una histórica y otra maestra. Ahora bien, es posible que una misma tabla sea maestra e histórica de sí misma. Veámoslo con un ejemplo:
Supongamos una tabla que se encarga de llevar el registro de socios de una agrupación, de modo que para ingresar es necesario que un socio avale al solicitante. Cuando se acepta al nuevo socio, su ficha llevará el campo
So-cio principal, que apunta al registro del soSo-cio que lo avala.
De este modo un registro de la tabla puede ser maestro de una serie de so-cios a los que ha avalado (sus históricos). Éste sería el enlace a histórico. Por otro lado, cada registro de la tabla apuntará a un único registro de la misma tabla (el que lo avala), que será su maestro. Éste es el enlace a maestro.
Ejemplo: Enlace de una tabla contra sí misma
A continuación veremos los pasos a seguir para enlazar la tabla SOCIOS contra sí misma mediante un enlace a maestro.
En la tabla SOCIOS, que será en la que guardemos el registro de socios, creamos el campo Socio Principal, declarándolo en sus propiedades como enlazado a tabla de datos maestra, siendo SOCIOS la tabla enlazada. Este campo será el que apunte al registro correspondiente al socio que avala.
A continuación creamos el índice correspondiente al campo, para ello si-tuamos el foco sobre el campo Socio Principal y pulsamos el botón Nuevo
índice del campo .
Ahora nos falta declarar el enlace a histórico en la tabla SOCIOS. Para ello pulsamos el botón Nuevo enlace histórico , apareciendo la ventana
En-lace a histórico desde SOCIOS. En ella especificamos que la tabla
enlaza-da es SOCIOS, mientras que el índice es Socio Principal.
Con esto ya tendríamos enlazada la tabla SOCIOS contra sí misma.
08
Desarrollo completo de una aplicacióne
Nuevo índice del campo Nuevo enlace histórico
Resumen
El enlace a hermano contiguo permite acceder a los valores de los registros anterior y siguiente de una tabla o movernos a esos registros, de modo que podemos recorrer los registros a través de un índice determinado. No sólo podemos indicar los campos por los que queremos establecer el orden de movimiento, sino que también podemos forzar a movernos por registros que contengan un valor determinado en esos campos.
Mediante el enlace singular de plural por posición podemos crear un enla-ce una tabla histórica de la tabla actual y elegir uno de los registros del his-tórico resolviéndolo por su posición.
El enlace singular de plural por índice permite crear un enlace singular a una tabla histórica de la actual, capturando uno de los registros del histórico. Para su resolución se usa el índice utilizado en el enlace histórico y sólo de-ben resolverse aquellas partes del índice que no sean el campo enlazado a la tabla actual.
Mediante los punteros indirectos podemos enlazar la tabla de datos en cur-so con otra tabla que no guarda una relación directa. Existen dos tipos: el
enlace indirecto real (con persistencia en disco) y el virtual (con persistencia
en memoria).
Las actualizaciones modifican el contenido de los campos de un registro de una tabla enlazada, cada vez que se produce un alta, una baja o una modi-ficación en la tabla de origen, donde están definidas.
Con las actualizaciones a hermano contiguo recorremos los registros de una tabla que estén relacionados por un enlace de hermano contiguo, obte-niendo un acumulado final con el valor de un determinado campo de cada registro hermano.
8.3
Análisis de la información: ejemplos
8.3.1. Un centro de enseñanza
Conceptos a tratar
• Enlace singular y plural.
Descripción
Buscamos una aplicación para un centro de enseñanza que se encargue de gestionar sus alumnos y los cursos que realizan, con la condición de que cada alumno sólo puede estar matriculado en un curso.
Esquema de la aplicación
Este ejemplo se resuelve de forma sencilla creando dos tablas: ALUMNOS y CURSOS, ambas de tipo maestro normal con clave numérica. Ahora bien:
¿Cómo las enlazamos? Para verlo hemos de enunciar las siguientes frases: “Varios alumnos pueden pertenecer a un curso”, “Un alumno pertenece a un único curso”. Está claro que ALUMNOS (plural) va a ser un histórico de CURSOS (singular), de modo que enlazaremos ambas tablas mediante un enlace singular - plural.
Al establecer el enlace, Velázquez crea automáticamente el campo Cursos y el índice Cursos en la tabla ALUMNOS, mientras que en la tabla CURSOS crea el histórico Alumnos.
8.3.2. Empresa de instalación de cristalería
8.3.2.
para vehículos
Conceptos a tratar • Doble plural • Tablas submaestras • Tablas históricas DescripciónNecesitamos una aplicación de gestión para una empresa que se dedica a instalar cristales en automóviles. Hemos de tener en cuenta los siguientes puntos:
• Un vehículo se identifica por una marca, una serie y un modelo. Por ejemplo: marca Opel, serie Corsa, modelo 2000.
• La empresa dispone de diversos tipos de cristales que son suministra-dos por distintos fabricantes.
• Un determinado tipo de cristal puede ser suministrado por más de un fa-bricante.
• Un tipo concreto de modelo puede tener varios tipos de cristales.
08
Desarrollo completo de una aplicaciónEsquema de la aplicación
Empezaremos por crear las tablas MARCAS, SERIES y MODELOS, ya que éstas identifican inequívocamente a un vehículo. Está claro que una serie no puede existir sin una marca, de igual modo que un modelo no puede exis-tir sin una serie. Es por esto que definimos la tabla MARCAS como maes-tro normal con clave numérica, SERIES será submaestra de MARCAS y MODELOS será submaestra de SERIES.
Al crear las tablas, Velázquez Visual crea directamente los enlaces entre ellas por haber definido SERIES y MODELOS como submaestras: SERIES será histórica de MARCAS, mientras que MODELOS será histórica tanto de SERIES como de MARCAS.
Por otro lado, la empresa dispone de diversos tipos de cristales que son su-ministrados por diversos fabricantes. Esto justifica la creación de las tablas ARTÍCULOS y FABRICANTES. Ahora bien, ¿cómo las enlazamos? Volva-mos a enunciar las frases: “los artículos del fabricante”, “los fabricantes del artículo”. En este caso nos encontramos con un plural en los dos sentidos, lo que nos impide enlazar directamente ambas tablas mediante un enlace singular - plural.
Para resolver un doble plural creamos una tabla en medio de las otras dos. En este caso crearemos una tabla de tipo histórico que llamaremos ARTIFAB.
Cada uno de los registros de la tabla ARTIFAB consistirá en una pareja Ar-tículo - Fabricante, de modo que en ella guardamos todos los arAr-tículos de cada fabricante (o de otro modo, todos los fabricantes de cada artículo). En-tonces, dado un fabricante podemos navegar hacia sus históricos, que son todos los registros de la tabla ARTIFAB, y una vez cargados éstos, obtener todos sus maestros de la tabla ARTÍCULOS. De este modo obtenemos to-dos los artículos del fabricante de partida. De igual modo procederíamos para obtener todos los fabricantes de un artículo.
Aún nos queda por integrar en el diseño un detalle: en un modelo pueden instalarse distintos artículos (cristales), y un cristal puede instalarse en dis-tintos modelos. Nos encontramos de nuevo con doble plural, luego hemos de enlazar las tablas ARTÍCULOS y MODELOS mediante una tabla inter-mediaria de tipo histórico a la que llamaremos ARTIMODEL.
8.3.3. Aplicación de análisis para obras literarias
Conceptos a tratar
• Doble plural
Descripción
Supongamos un estudiante que, haciendo un estudio acerca de Lope de Vega, necesita saber todas las obras en las que aparece un determinado personaje y todos los personajes que aparecen en una obra determinada. Este problema es de resolución inmediata en Velázquez Visual.
Esquema de la aplicación
Declararemos dos tablas principales: PERSONAJES y OBRAS. Tanto las obras como los personajes necesitan estar identificados uno a uno de forma inconfundible, por lo que deben tener una clave de acceso única, es decir, deben declararse como tablas de tipo maestro normal con clave numérica. Ahora bien: ¿cómo las enlazamos? Volvemos a enunciar las dos frases: “En una obra aparecen varios personajes”, y en el caso más general, la segun-da frase es: “Un personaje puede aparecer en varias obras”. Es decir, nos encontramos con un plural en los dos sentidos que resolvemos con una ta-bla histórica que haga de intermediaria: REPARTOS.
08
Desarrollo completo de una aplicaciónLos registros de la tabla REPARTOS consisten en parejas Obra-Personaje, de manera que asociamos todas las obras con cada uno de sus persona-jes (o visto de otro modo, todos los personapersona-jes con cada una de las obras en las que aparece). Entonces, si nos situamos en la tabla OBRAS (por ejemplo), moviéndonos hacia histórico obtendremos todos los registros Obra-Personaje en los que la obra es la seleccionada de la tabla OBRAS. Una vez cargadas todos esas parejas, nos movemos hacia maestro en la di-rección de PERSONAJES, de modo que cargamos todos los personajes que aparecen en la obra. El mismo procedimiento seguiremos para, dado un personaje, obtener todas las obras en las que aparece.
8.3.4. Una galería de arte
Conceptos a tratar
• Enlace singular y plural • Doble plural
Descripción
El siguiente esquema de tablas gestionará una galería de arte bajo los si-guientes supuestos:
• Un artista de la galería puede tratar distintos temas, mientras que un te-ma en particular puede ser tratado por distintos artistas. Además, una obra de un artista puede ser expuesta en distintas exposiciones, mientras que varias obras del artista pueden exponerse en la misma exposición. • Cada artista tiene un representante (contacto), mientras que un
repre-sentante puede trabajar para distintos artistas.
Esquema de la aplicación
Comenzaremos creando las tablas ARTISTAS, TEMAS y OBRAS y enlazán-dolas.
Tal y como se expuso el problema, entre TEMAS y ARTISTAS existe un do-ble plural. Para resolverlo introducimos una tabla intermedia: OBRAS. De este modo no sólo resolvemos el doble plural, sino que aprovechamos pa-ra guardar en la tabla intermedia las obpa-ras de cada artista (claro, una obpa-ra pertenecerá a un artista y tratará un tema en particular). En la tabla OBRAS añadimos los campos Foto, Precio, Título, etc.
Las tres tablas se han definido con el tipo maestro normal con clave numé-rica. En este caso OBRAS también ha sido definida así (y no de tipo histó-rico) ya que nos interesa que cada obra tenga una clave única e irrepetible. Creamos ahora la tabla EXPOSICIONES, en la que incluimos los campos
Fecha inicio, Fecha fin, Motivo, etc. Nos encontramos con otro plural en los
dos sentidos entre esta tabla y OBRAS, de modo que hemos de crear otra tabla intermedia que lo solucione: OBRAS EXPUESTAS.
Por último, añadimos la tabla CONTACTOS, en la que guardaremos los da-tos de los representantes. Esta tabla es maestra de ARTÍCULOS.
8.3.5. Gestión de un colegio
Conceptos a tratar • Enlace singular-plural. • Tablas arboladas. • Tablas estáticas. DescripciónSupongamos que nos piden el diseño de una aplicación que gestione la or-ganización de un colegio. Dicha aplicación debe relacionar los aspectos fundamentales de un colegio: alumnos, profesores, materias, asignaturas, cursos, secciones, aulas, días lectivos y horarios.