Subformularios

Un subformulario, no es otra cosa que un formulario desplegado dentro de otro formulario y el cual, generalmente esta relacionado por medio de campos clave.

La combinación de un formulario/Subformulario se puede realizar por medio de un Encabezado/Detalle (También conocido como Maestro/Detalle o como Padre/Hijo), este tipo de combinaciones ya las vimos en el capítulo 1 al definir la tabla de facturas, no estaría de más que revisaras nuevamente lo aprendido.

Los subformularios son especialmente efectivos para mostrar datos de otras tablas que se involucran en una relación uno a muchos. Con el propósito de ver el funcionamiento de estos objetos, crearemos con el asistente para formularios el formulario de la tabla facturas y redimensionaremos sus campos, así como haremos la distribución de ellos en el formulario.

Vamos por pasos, primero crearemos el formulario para facturas con el asistente, seleccionaremos todos los campos del formulario y eliminaremos el campo Id Cliente y el campo usuario, los cuales sustituiremos por cuadros combinados relacionados con las tablas de clientes y usuarios respectivamente, trata de seguir los mismos pasos que realizamos en el formulario de Clientes. Después redimensionaremos el espacio de trabajo del formulario asignando un espacio suficiente para que quepa el subformulario de detalle.

Ahora, generemos un formulario del detalle de factura utilizando el Autoformulario en tabla, acomodemos los datos para utilizar el menor ancho posible, ya que este formulario será agregado al de facturas. También vamos a eliminar el campo IdArticulo e IdProveedor para obtener la información de las tablas Artículos y Articulo-Proveedor respectivamente, creando cuadros combinados. Con la información de ambos campos, obtendremos el precio del artículo.

Comencemos por hacer invisible al campo No_Factura, ya que el formulario de factura lo tendrá presente mientras estemos trabajando en la factura y el detalle estará relacionado por medio de este campo, para esto selecciona el campo en el subformulario, abre la ventana de propiedades y en el apartado de todas, busca la propiedad de “visible”, en este momento debe tener un valor de “Si”, selecciona de la lista el valor “No” y cuando el formulario este en la vista, este campo no se mostrara, no quiere decir que no existe, solo no se esta mostrando.

Alinea los otros campos para que ocupen el espacio desde el extremo izquierdo del formulario, no importa que encimes algunos campos sobre el campo No_Factura y borra la etiqueta “No Factura” del encabezado del formulario, no olvides alinear también las etiquetas de los demás campos.

Agreguemos el cuadro combinado para el campo IdArticulo, esto lo haremos de la misma forma en que generamos el campo para el cliente, el origen de la información será de la tabla de Artículos y seleccionaremos los campos IdArticulo y Nombre_Articulo, el campo vinculado será IdArticulo, con esto podremos filtrar al cuadro combinado de la tabla Articulo_Proveedor para obtener el precio. Nota que necesitamos ambos campos para poder obtener el precio, ya que el precio esta en la tabla Articulo_Proveedor y la llave esta formada por ambos campos. No olvides asignarle al campo que acabas de crear el nombre del campo al que esta vinculado, este nombre lo vamos a usar un poco mas adelante.

Antes de definir el campo para el proveedor, quiero hacer una anotación técnica con respecto a los formularios. Aunque el objetivo del curso no es conocer el código de programación de Access, debemos auxiliarnos con un poco de el, así, en los eventos podemos asignar valores a campos o cambiar propiedades de objetos dependiendo de nuestras necesidades.

Dicho esto, cuando en un formulario agregas un objeto subformulario, Access reconoce al formulario principal como un solo formulario, de esta forma cada vez que se quiera hacer referencia a algún objeto del subformulario se debe hacer como una extensión del formulario que lo contiene, parece algo enredado ¿verdad?, pero bueno lo explicare con otras palabras, supongamos que tienes una objeto en el subformulario y quieres cambiar alguna de las propiedades de este objeto desde algún evento del formulario padre, si intentas cambiar alguna propiedad de los objetos del subformularios haciendo referencia al nombre del objeto, Access no lo hará, debes indicarle que es una extensión del formulario padre, solo podrás cambiar propiedades de los objetos del subformulario haciendo referencia únicamente a su nombre cuando el cambio lo realices en algún evento del subformulario.

Ya que tenemos la clave del articulo en nuestro subformulario, ahora debemos generar el cuadro combinado para el campo proveedor, el origen de los datos será la tabla Articulo_proveedor, seleccionemos los campos IdArticulo, IdProveedor y precio, Ajustemos el tamaño del campo IdArticulo para que no sea visible en nuestro despliegue, El campo que identificara como única a nuestra selección es el campo IdProveedor, el campo que almacenara el valor es el campo IdProveedor, y no importa cuál es el nombre de la etiqueta, ya que la eliminaremos y crearemos una nueva en el encabezado del subformulario, nuevamente te recuerdo que debemos de cambiar el nombre del cuadro combinado por el del campo relacionado.

Aparentemente nuestro cuadro combinado esta listo pero no, nos falta decirle que cuando se despliegue la lista solo nos muestre los precios de los diferentes proveedores que coincidan con el articulo que tenemos seleccionado en el campo IdArticulo, para esto en las propiedades del campo IdProveedor que acabamos de crear seleccionemos la propiedad origen de la fila y abriremos la consulta del origen de la información en modo diseño, la modificaremos un poco. Agregaremos una condición al campo IdArticulo para que solo muestre los renglones que coincidan con el artículo seleccionado en el cuadro combinado de IdArticulo.

En la imagen tenemos el origen de la consulta y nosotros agregamos la línea que se encuentra en la parte de criterios, de esta forma le indicamos a la consulta que solo nos muestre la información de la tabla en donde el campo IdArticulo coincida con el valor del campo del subformulario IdArticulo, Cerremos la consulta desde el menú Archivo -> Cerrar, Access nos pedirá que confirmemos los cambios a la consulta, digamos que “Si”.

Ahora el siguiente paso es obtener el precio del artículo que hemos seleccionado y hacer que este valor se almacene el campo de precio, para esto obtendremos el dato de la misma tabla Articulo_proveedor usando los campos que acabamos de agregar. Para realizar esto, necesitamos agregar un poco de código al evento del cuadro combinado IdProveedor entonces, selecciona el campo IdProveedor, abre la ventana de propiedades, selecciona la sección de eventos, posiciónate en el evento “después de actualizar” y selecciona el botón al extremo derecho que contiene (…), Access te presenta una lista de opciones, selección el generador de expresiones y completa el siguiente código, después de esto ve al menú Archivo y selecciona la opción “Cerrar y volver a Microsoft Access“.

Como haz visto, poco a poco vamos definiendo cómo se comportará nuestra aplicación, pero aun falta algunas cosas por hacer. Debemos definir que cuando captures la cantidad de artículos en el detalle, automáticamente calcule el campo importe, esto lo haremos multiplicando la cantidad de artículos por el precio. Esto lo haremos usando nuevamente los eventos, utilizaremos el mismo evento “Después de actualizar”, al final de cuentas, la primera vez es la difícil.

Seleccionemos el campo cantidad, en la ventana de propiedades, usemos la sección de eventos y nuevamente presionemos el botón (…) para seleccionar de las opciones al generador de código, agregaremos el siguiente código:

Me!Importe = Me!Cantidad * Me!Precio

Debemos agregar un campo en el pie del subformulario al cual llamaremos “Suma Importe”, en su propiedad de “Origen de control” asignaremos el siguiente valor =Suma([Importe]) esto calculara la suma de los importes en el detalle de la factura y almacenara la información para ser enviada al encabezado de la factura.

Ocultemos la sección de pie de formulario del subformulario, esto lo hacemos seleccionando el selector de pie de formulario en el formulario Detalle_factura y asignando a su propiedad visible el valor de “No”.

Y por fin el detalle esta listo para ser incorporado como un subformulario en el formulario facturas y bueno no perdamos más tiempo grabemos nuestra formulario y cerrémoslo, ahora volvamos al formulario de facturas y agreguemos el subformulario que acabamos de crear, hagamos el espacio necesario para que el subformulario quepa dentro de nuestro formulario.

El subformulario del detalle de factura es creado dentro del formulario de facturas como un objeto mas del formulario, con propiedades y eventos, mas adelante tendremos la oportunidad de usar un evento subformulario para actualizar información del formulario.

Fuente: Apuntes de Base de datos de la UNIDEG