• No se han encontrado resultados

Enlace a tabla de datos indirecta real y virtual

8.2 Tipos de enlace

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ón

tipo 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 cantidades 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ón

añ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ón

Ya 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 este tipo se hubiese especificado la peti- ción de formulario, en tiempo de ejecución, esta petición sería obviada por el Servidor.