Adjuntar lógica a datos con macros de datos en las aplicaciones de Access 2010

Ayuda visual de Office

Resumen:  aprenda a usar Microsoft Access 2010 para agregar compatibilidad con macros de datos y agregar reglas de negocio con macros de datos.

Última modificación: miércoles, 27 de enero de 2016

Hace referencia a: Access 2010 | Access Services | Office 2010

Se aplica a:  Microsoft Access 2010

Publicado: septiembre de 2010

Proporcionado por:  Ken Getz, MCW Technologies, LLC

Introducción

En este vídeo se muestra como desnormalizar las tablas de pedidos y detalles de pedidos en la base de datos de ejemplo Northwind, agregando una columna a la tabla de pedidos que conserva la cantidad total de compra del pedido. Aunque desnormalizar los datos no suele ser un comportamiento óptimo, puede aumentar el rendimiento al crear informes.

Codifíquelo

Muchos procedimientos de tratamiento de datos comparten tareas comunes, que se diferencian solo en detalles específicos, como la clave principal determinada para la fila que desea modificar. Podría repetir los mismos pasos en múltiples macros de datos. Sin embargo, si puede encontrar pasos comunes, es posible extraerlos y colocarlos en una macro de datos con nombre que puede llamar desde otras macros de datos. Para controlar los eventos de datos, puede crear una macro de datos con un nombre y, a continuación, llamarla desde un evento de datos, o puede crear una macro y adjuntarla a un evento de datos en una tabla. Si piensa con antelación, a menudo podrá ahorrase trabajo utilizando macros con nombre.

Dado que el propósito del ejemplo es mantener un total acumulado de la cantidad total en un pedido determinado, debe agregar una macro a los eventos de datos Después de actualizar, Después de insertar y Después de eliminar en la tabla Detalles del pedido. En cada uno de los casos, la macro actualiza el valor de un nuevo campo en la tabla Pedidos, un campo de Moneda denominado OrderTotal.

Además, la base de datos Northwind incluye datos de la tabla Detalles del pedido y se necesita alguna manera de acumular esos datos e inicializar el campo OrderTotal en la tabla Pedidos. Esto significa que debe crear una macro de datos independiente que pueda llamar para realizar la inicialización del campo OrderTotal. En este video, se empieza mediante la creación de la base de datos de ejemplo y, a continuación, se agrega esta macro con nombre independiente primero. A continuación, creará una macro con nombre que se pueda llamar desde los eventos Después de actualizar, Después de insertar y Después de eliminar de la tabla Detalles del pedido.

Crear la base de datos de ejemplo

Para crear la base de datos de ejemplo, use el siguiente procedimiento.

Para crear la base de datos de ejemplo

  1. Inicie Access 2010, haga clic en Archivoy, a continuación, haga clic en Nuevo.

  2. En la lista de plantillas disponibles, en Office.comPlantillas, seleccione Ejemplos.

  3. En la lista de bases de datos de ejemplo, seleccione Northwind 2007.

  4. Seleccione una ruta de acceso adecuada y, a continuación, haga clic en el botón Descargar para descargar e instalar una copia limpia de la base de datos de ejemplo.

  5. Si se le pide, haga clic en el botón Habilitar contenido en la Barra de mensajes para habilitar el código VBA en la base de datos de ejemplo.

  6. Acepte el Id. de inicio de sesión predeterminado en el formulario del Cuadro de diálogo de inicio de sesión y, a continuación, haga clic en Iniciar sesión.

En este punto, debe haber descargado e instalado una copia nueva de la base de datos de ejemplo de Northwind 2007, y debería estar cargada en Access 2010. Cierre el formulario de Inicio predeterminado.

Modificar la tabla Pedidos

Para probar las macros de datos, debe agregar un nuevo campo a la tabla Pedidos. Para modificar esta tabla, use el siguiente procedimiento.

Para modificar la tabla Pedidos

  1. En el Panel de navegación, expanda la lista desplegable en la parte superior del panel y seleccione Tipo de objeto de la lista de opciones disponibles.

  2. Expanda la pestaña Tablas, haga clic con el botón secundario del mouse en la tabla Pedidos, y seleccione Vista Diseño.

  3. En la parte inferior de la lista de campos, en la columna Nombre de campo, escriba OrderTotal. En el campo Tipo de datos, especifique Moneda.

  4. Guarde y cierre el diseñador.

Actualizar el campo OrderTotal

Una vez que el campo OrderTotal se encuentra en la tabla Pedidos, debe agregar una macro de datos que pueda inicializar el valor del campo, según el conjunto actual de filas en la tabla Detalles del pedido. La macro debe iterar entre todas las filas en la tabla Pedidos y, para cada fila, buscar el conjunto de filas correspondiente en la tabla Detalles del pedido. Una vez encontradas dichas filas, la macro debe calcular la suma de los campos Cantidad * [precio unitario] y almacenar esta suma en la fila actual en la tabla Pedidos.

En el Panel de navegación, haga doble clic en la tabla Pedidos para abrir la tabla. En la cinta de opciones, seleccione la pestaña Tabla. Luego, en el grupo Macros con nombre, seleccione Macro con nombre. Por último, seleccione Crear macro con nombre (consulte la figura 1).

Figura 1. Crear una macro con nombre

Creación de una macro con nombre

En el diseñador Macro, en el cuadro combinado, seleccione ForEachRecord. Esta acción le permite iterar entre todas las filas de un origen de datos. En el cuadro combinado junto a Para cada registro en, seleccione Pedidos. La figura 2 muestra el diseñador de macros en este momento.

Figura 2. Iterar entre todas las filas

Procesamiento de una iteración en todas las filas

En el cuadro combinado dentro del área ForEachRecord, seleccione SetLocalVar, y cree una variable llamada varTotalPurchased con valor 0, como se muestra en la figura 3.

Figura 3. Cree una variable local que registrará los resultados

Creación de una variable local que calculará el resultado

En el cuadro combinado vacío dentro de la acción de macro ForEachRecord, seleccione ForEachRecord (para poder recorrer todas las filas del pedido en la tabla Detalles del pedido). Ingrese valores como se muestra en la figura 4 con Access IntelliSense mientras escribe. Tenga en cuenta el campo Alias. Este valor crea un conjunto con nombre de filas para que usted pueda hacer referencia al conjunto de filas. El nombre es arbitrario.

Figura 4. Seleccionar el conjunto de filas coincidentes en la tabla Detalles del pedido

Selección del conjunto de filas coincidentes en la tabla de detalles del pedido

Dentro de la nueva acción ForEachRecord, en el cuadro combinado, seleccione SetLocalVar, y escriba las expresiones como se muestra en la figura 5. Esta acción acumula el total de compras para cada ítem en la tabla Detalles del pedido.

Figura 5. Acumular el total para el pedido

Acumulación del total para el pedido

Para completar la macro y actualizar el valor en la tabla Pedidos, haga clic para seleccionar la acción de macro ForEachRecord más alejada. En el cuadro combinado en la parte inferior de la acción, seleccione EditRecord. Dentro de la acción, seleccione SetField en el cuadro combinado. Establezca el cuadro de texto Nombre en Orders.OrderTotal y el cuadro de texto Valor en varTotalPurchased, como se muestra en la figura 6.

Figura 6. Establecer el valor del campo OrderTotal con la variable local

Configuración del valor del campo OrderTotal mediante una variable local

Ahora, ha creado una macro de datos con nombre que itera entre las filas en la tabla Pedidos. Para cada fila de una tabla, la macro encuentra las filas coincidentes en la tabla Detalles del pedido, acumula el producto de los campos Cantidad y Precio unitario, recolecta la suma en una variable llamada varTotalPurchased, y por último, copia el valor de la variable local en el campo OrderTotal en la tabla Pedidos.

Para crear una macro para ejecutar la macro de datos

  1. En la cinta de opciones, haga clic en Guardar, especifique el nombre de la macro como UpdateTotals y, a continuación, haga clic en Cerrar.

  2. Para ejecutar la macro e inicializar todos los campos OrderTotal, en la cinta de opciones seleccione Crear, y en el grupo Macros y código, seleccione Macro.

  3. En el menú desplegable Agregar nueva acción, seleccione RunDataMacro, luego seleccione la macro Orders.UpdateTotals, como se muestra en la figura 7, guarde la macro como UpdateTotals y, a continuación, haga clic en Ejecutar.

  4. Cuando termine la macro, seleccione la tabla Pedidos y compruebe que el campo OrderTotal contenga ahora la cantidad total de compra en el pedido.

Puede crear una consulta de totales para comprobar los resultados.

Figura 7. Crear una macro para ejecutar la macro de datos

Creación de una macro para ejecutar la macro de datos

Crear la macro con nombre UpdateTotal

Cada uno de los eventos de datos (Después de actualizar, Después de insertar y Después de eliminar) debe realizar básicamente la misma tarea: calcular la nueva cantidad que se tiene que sumar (o restar, en el caso de los eventos Después de actualizar y Después de eliminar) del valor de OrderTotal y, a continuación, realizar el cambio. Dado que todas las macros de eventos requieren funcionalidad compartida, tiene sentido crear una única macro con nombre que se puede llamar desde cada uno de los eventos de datos. Para empezar, abra la tabla Detalles del pedido y cree una nueva macro con nombre, como lo hizo con la tabla Pedidos. Esta macro requiere dos parámetros. Haga clic en el vínculo Crear parámetro dos veces y proporcione los valores, como se muestra en la figura 8.

Figura 8. Crear parámetros de macro

Creación de los parámetros de la macro

En el cuadro combinado, seleccione la acción LookupRecord e inserte los parámetros como se muestra en la figura 9. Esta acción lo ayuda a encontrar la fila en la tabla Pedidos que coincide con el valor IdPedido que se pasa a la macro.

Figura 9. Ubicar el pedido correcto

Búsqueda del pedido correcto

En la acción LookupRecord, agregue una acción EditRecord y, dentro de esa acción, agregue una acción SetField. Establezca los valores de los parámetros de acción, tal como se muestra en la figura 10. Estos valores establecen el campo Orders.OrderTotal a su valor anterior más la cantidad que se pasa a esta macro.

Figura 10. Actualizar el campo OrderTotal

Actualización del campo OrderTotal

En la cinta de opciones, haga clic en Guardar, guarde la nueva macro de datos con nombre como UpdateTotal y, a continuación, haga clic en Cerrar.

Controlar el evento Después de insertar

Cuando inserta una nueva fila en la tabla Detalles del pedido, debe agregar el valor Cantidad * [Precio unitario] en la fila correspondiente en la tabla Pedidos. Para poder hacerlo, primero debe verificar que la tabla Detalles del pedido esté abierta y seleccionada. En la cinta de opciones, seleccione la pestaña Tabla. A continuación, en el grupo Eventos posteriores, seleccione Después de insertar. Esta acción crea una macro que Access llamará después de que se inserte una nueva fila en la tabla Detalles del pedido. En la nueva macro, seleccione la acción RunDataMacro, e inserte los parámetros, como se muestra en la figura 11. En la cinta de opciones, haga clic en Cerrar y guarde la macro cuando se le pida.

Figura 11. Crear la macro de datos Después de insertar

Creación de la macro de datos Después de insertar

Controlar el evento Después de actualizar

Controlar el evento Después de actualizar requiere un poco más de esfuerzo. Debe restar el valor anterior asociado con el detalle del pedido y luego agregar el nuevo. Access proporciona los valores originales para cada campo como propiedades del objeto Old en esta macro de datos para que se pueda trabajar tanto con los valores actuales como con los anteriores.

En la cinta de opciones, haga clic en Después de actualizar para crear la macro de datos para el evento y, en el cuadro combinado, seleccione Si, y use la función Updated incorporada para determinar si los campos Cantidad o Precio unitario se actualizaron como parte de la actualización actual. De lo contrario, no cambie la tabla Pedidos. La figura 12 muestra la expresión que debe ingresar en el diseñador de macro.

Figura 12. Proporcionar una expresión condicional para la acción de macro Si

Suministro de la expresión condicional para la acción de macro If

Dentro de la acción de macro If, llame la acción RunDataMacro, y especifique los parámetros como se muestra en la figura 13. Tenga en cuenta que esta acción resta el valor anterior para el importe total. Agregará el importe total a la fila actual en la siguiente acción.

Figura 13. Restar el importe total anterior a la fila actual

Resta del importe ampliado anterior de la fila actual

Finalice la macro agregando una llamada final a la acción RunDataMacro y agregue el importe total actual (consulte la figura 14).

Figura 14. Agregar el importe total a la fila actual

Suma del importe ampliado de la fila actual

En la cinta de opciones, haga clic en Guardary, a continuación, haga clic en Cerrar.

Controlar el evento Después de eliminar

Si elimina una fila de Detalles del pedido, debe restar el importe total anterior, como se muestra en el ejemplo mencionado. Repita los pasos de la sección anterior, seleccione el evento Después de eliminar y agregue una única llamada a la acción RunDataMacro. Cuando haya terminado, los parámetros serán similares a la figura 15. Haga clic en Cerrar y guarde la macro cuando se le pida.

Figura 15. Restar el importe total de la fila eliminada

Resta del importe ampliado de la fila eliminada

Probar las macros

Tenga en cuenta que el primer pedido de la tabla Pedidos tiene un valor de Id. de pedido de 30. Use este valor para modificar la tabla Detalles del pedido. Agregue una nueva fila y especifique un producto, un precio unitario y una cantidad. Compruebe que el OrderTotal en la tabla Pedidos se actualice correctamente. Modifique la fila y compruebe el resultado. Elimine la fila y vuelva a comprobar el resultado. En cada caso, debido a las macros de datos que agregó, debe ver el campo OrderTotal actualizado correctamente.

Léalo

Access 2010 agrega la capacidad de crear macros que se pueden asociar a eventos de datos en tablas. Esto le permite crear funcionalidad tipo desencadenador sin escribir código. Dado que las bases de datos web limitan su capacidad para incluir código de VBA y consultas de totales, puede usar macros de datos para reemplazar los controladores de eventos o las consultas que podrían crear totales. En este ejemplo se muestra un tipo de macro de datos (agregar datos en un evento de tabla), pero puede usar macros de datos para encapsular cualquier tipo de lógica de negocios. El uso de macros de datos evita la necesidad de escribir código VBA en formularios e informes y, como las macros están adjuntas a los eventos de la tabla, Access 2010 ejecuta las macros tanto si está trabajando con la tabla directamente, editando datos en una consulta, o incluso mostrando y editando datos en un formulario. Además, dado que las bases de datos web no admiten el código VBA, usar macros de datos proporciona la única manera de agregar funcionalidad tipo desencadenador.

Explórelo

Sobre el autor
Ken Getz es consultor sénior en MCW Technologies. Es coautor de ASP.NET Developers Jumpstart (Addison-Wesley, 2002), Access Developer's Handbook (Sybex, 2001) y VBA Developer's Handbook, 2da edición (Sybex, 2001).