Access 2000 Avanzado Inst. Sup. Software

108
AVANZADO

description

Programacion para Access

Transcript of Access 2000 Avanzado Inst. Sup. Software

Page 1: Access 2000 Avanzado Inst. Sup. Software

AVANZADO

Page 2: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

1

Contenido: DISEÑO DE CONSULTAS AVANZADAS –SQL...................................................... 3

CONVENIOS SOBRE LA SINTAXIS DE SQL. ...................................................................... 3 LA SINTAXIS SELECT DE SQL EN MICROSOFT ACCESS. .................................................. 4 FROM, CLÁUSULA......................................................................................................... 7 GROUP BY, CLÁUSULA. ............................................................................................... 9 HAVING, CLÁUSULA. ................................................................................................. 10 IN, CLÁUSULA. ............................................................................................................. 12 JOIN, OPERACIÓN. ....................................................................................................... 14 ORDER BY, CLÁUSULA. ............................................................................................. 16 PARAMETERS, DECLARACIÓN.................................................................................. 17 PREDICADO: BETWEEN ............................................................................................. 19 PREDICADO: COMPARACIÓN. ....................................................................................... 19 PREDICADO: EXISTS................................................................................................... 20 PREDICADO: IN ............................................................................................................ 21 PREDICADO: LIKE......................................................................................................... 22 PREDICADO: NULL...................................................................................................... 23 PREDICADO: QUANTIFIED............................................................................................. 24 CONDICIÓN DE BÚSQUEDA. .......................................................................................... 24 SELECT, SENTENCIA................................................................................................... 26 SUBCONSULTA. ............................................................................................................ 29 TOTAL, FUNCIÓN: AVG ............................................................................................... 32 TOTAL, FUNCIÓN: MAX............................................................................................... 32 TOTAL, FUNCIÓN: MIN ................................................................................................ 33 TOTAL, FUNCIÓN: SUM ............................................................................................... 34 TRANSFORM, SENTENCIA. ........................................................................................ 35 UNION, OPERADOR DE CONSULTA. ............................................................................. 37 WHERE, CLÁUSULA.................................................................................................... 38

DISEÑO DE FORMULARIOS AVANZADOS. ....................................................... 39 UN FORMULARIO VARIOS A UNO................................................................................... 39

Diseño de un formulario varios a uno. .................................................................... 39 CREACIÓN E INSERCIÓN DE SUBFORMULARIOS. ............................................................ 42

Especificación del origen del subformulario........................................................... 43 Diseño del subformulario. ....................................................................................... 45 Especificación del origen del formulario principal................................................. 48 Creación del formulario principal........................................................................... 49 Incrustación de un subformulario............................................................................ 50

USO DE FORMATO CONDICIONAL.................................................................................. 52 INTRODUCCIÓN DE CONTROLES ACTIVEX – EL CONTROL FICHA. ................................. 54 CREACIÓN DE FORMULARIOS DE VARIAS PÁGINAS. ...................................................... 57 ENLACE DE FORMULARIOS CON BOTONES DE MANDATO. ............................................. 59

Añadir un botón de mandato. .................................................................................. 59

DISEÑO DE INFORMES AVANZADOS. ................................................................ 62 CREACIÓN DE UNA CONSULTA PARA UN INFORME COMPLEJO. ...................................... 62

Page 3: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

2

DEFINICIÓN DE CRITERIOS DE ORDENACIÓN Y AGRUPAMIENTO. ................................... 63 ESTABLECER RANGOS DE GRUPOS SEGÚN EL TIPO DE DATOS. ....................................... 64 CREACIÓN DE INFORMES POR GRUPO............................................................................ 65 AJUSTE DE LAS PROPIEDADES DEL INFORME Y DE LA SECCIÓN. .................................... 67

Propiedades de la sección. ...................................................................................... 68 Propiedades del informe. ......................................................................................... 70

USO DE VALORES CALCULADOS. .................................................................................. 74 Adición de la fecha de impresión y el número de página. ....................................... 74 Adición de valores a través de un grupo. ................................................................ 76 Creación de un total general. .................................................................................. 77 Concatenación de cadenas de texto y omisión de valores redundantes. ................. 78 Cálculo de porcentajes. ........................................................................................... 80 Uso de Suma continua. ............................................................................................ 81 Ventajas del formato condicional. ........................................................................... 83

AÑADIR POTENCIA CON MACROS. .................................................................... 84 USO DE LAS MACROS. ................................................................................................... 84 LA VENTANA MACRO................................................................................................... 86 ALMACENAR LA MACRO............................................................................................... 88 VERIFICAR LA MACRO. ................................................................................................. 88 DEFINICIÓN DE ACCIONES MÚLTIPLES. ......................................................................... 90 AGRUPAMIENTO DE MACROS........................................................................................ 92 EXPRESIONES CONDICIONALES..................................................................................... 94 RESUMEN DE LAS ACCIONES DE UNA MACRO................................................................ 95

Page 4: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

3

Diseño de consultas avanzadas –SQL. En el trasfondo de todas las consultas de Microsoft Access se encuentra el lenguaje de órdenes de base de datos SQL. Aunque podemos diseñar la mayoría de las consultas utilizando el interfaz gráfico de la cuadrícula de diseño, Access guarda cada consulta que ha sido diseñada como un mandato SQL. Para aquellos tipos de consultas avanzadas que utilizan los resultados de una segunda consulta como condición de comparación, necesitamos conocer SQL para poder definir la segunda consulta (denominada Subconsulta). Además, no podremos utilizar la cuadrícula de diseño para construir todos los tipos de consultas disponibles en Microsoft Access; para algunas de ellas deberemos utilizar SQL.

Convenios sobre la sintaxis de SQL. La siguiente tabla lista los convenios sobre la sintaxis SQL que encontraremos a lo largo de este capítulo. Convenio SQL Significado MAYÚSCULAS Las letras mayúsculas indican las palabras clave y las

palabras reservadas que debemos introducir exactamente tal como se muestran. Nótese que Microsoft Access comprende las palabras claves que han sido introducidas tanto en mayúsculas como en minúsculas.

Cursivas Las palabras en cursiva representan las variables que suministramos.

Corchetes angulares <> Los corchetes angulares encierran los elementos sintácticos que se deben suministrar. Las palabras que se encuentran en el interior de estos corchetes describen el elemento pero no muestran la sintaxis real del elemento.

Corchetes [] En caso de que se liste más de un elemento, los elementos opcionales serán encerrados entre corchetes y separados por un carácter piperlín (|). No introduzca los corchetes ni el carácter piperlín. Nótese que en numerosas ocasiones, Access requiere que los nombres sean encerrados entre corchetes. Cuando se requiere que los corchetes formen parte de la sintaxis de las variables que debemos suministrar en estos ejemplos, los corchetes se muestran en cursiva, como por ejemplo en [MiTabla].[MiCampo].

Llaves {} En caso de que se liste una o más opciones, se encierran entre llaves y serán separadas por un carácter pipelín (|). Elija una opción a partir de la lista. No incluya las llaves ni el carácter pipelín.

Page 5: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

4

Convenio SQL Significado Puntos suspensivos… Los puntos suspensivos indican que un mismo elemento

puede repetirse una o más veces. Cuando aparece una coma junto a los puntos suspensivos, significa que debe incluir la coma entre los elementos.

La sintaxis select de SQL en Microsoft Access. La sentencia SELECT forma el núcleo del lenguaje de base de datos SQL. Utilizaremos la sentencia SELECT para seleccionar o recuperar las filas y columnas deseadas a partir de las tablas de nuestra base de datos. La sintaxis de la sentencia SELECT consta de cinco cláusulas principales, construidas normalmente de la siguiente manera.

SELECT <lista de campos> FROM <lista de tabla> WHERE <especificación de selección de fila>] GROUP BY <especificación de agrupación>] HAVING <especificación de selección de grupo>] ORDER BY <especificación de ordenación>]

Microsoft Access implementa cuatro expresiones significativas al lenguaje: TRANSFORM, que permite elaborar consultas de tabla de referencias cruzadas; IN, que permite especificar una conexión con una base de datos a distancia o especificar nombres de columna en una consulta de tabla de referencias cruzadas. DISTINCTROW, para limitar las filas devueltas a partir de la <lista de campos>; y WITH OWNERACCESS OPTION, que permite diseñar consultas que pueden ser ejecutadas por usuarios que estén autorizados a utilizar dicha consulta pero que no tengan derechos sobre las tablas a las que se hace referencia en la consulta. Los siguientes apartados de este capítulo representan una guía de referencia a la implementación en Access de SQL para las consultas de selección, de totales y de tabla de referencia cruzadas. Nombre de columna. Especifica el nombre de una columna en una expresión. Sintaxis. [ [ [ ] {nombre-de-tabla | nombre-consulta-de-selección | nombre-de-correlación } [ ] ] . ] [ [ ] nombre-de-campo [ ] ]

Page 6: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

5

Notas. Sólo debe incluir un cualificador en el nombre de campo si el nombre es ambiguo dentro del contexto de la consulta o subconsulta (por ejemplo, si el mismo nombre de campo aparece en más de una tabla o consulta listada en la clausura FROM.) El nombre-de-tabla, nombre-consulta-de-selección o nombre-de-correlación que cualifica el nombre de campo debe aparecer en la cláusula FROM de la consulta o subconsulta. Si una tabla o consulta posee un nombre de correlación, deberá utilizar el nombre de alias, no el nombre actual de la tabla o consulta en la cláusula FROM.). Ejemplos. Para especificar un campo llamado Apellidos Cliente de una tabla denominada Lista Cliente, utilice lo siguiente. [Lista Cliente] . [Apellidos Cliente]. Para especificar un campo llamado Dirección que aparece solamente en una tabla o consulta en la cláusula FROM, introduzca. Dirección Expresión. Especifica un valor en un predicado o en la lista de selección de una sentencia SELECT o subconsulta. Sintaxis. [+ | - ] { Función | [ (] expresión [) ] | literal | nombre-de-columna) [{ +|- |*| /|\|^|MOD|&} {función | (expresión) | literal | nombre-de-columna}]… Notas. Función – Se puede especificar una función de totales SQL tal como AVG, COUNT, MAX, MIN, STDEV, STDEVP, SUM, VAR, o , VARP; sin embargo, no puede utilizar una función de totales SQL más de una vez en una expresión. También se puede utilizar algunas de las funciones incorporadas en Access o las funciones que han sido definidas utilizando Visual Basic. [(]expresión[)] – Se puede construir una expresión a partir de varias expresiones separadas por operadores. Encierre las expresiones entre paréntesis para especificar el orden de evaluación.

Page 7: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

6

literal – Se puede especificar una constante numérica o alfanumérica. Una constante alfanumérica debe estar encerrada entre comillas simples o dobles. Para incluir un apóstrofe en una constante alfanumérica, introduzca el carácter apóstrofe dos veces en la cadena literal o encierre la cadena del literal entre dobles comillas. Si la expresión es numérica, debe utilizar una constante numérica. Un literal de fecha / hora debe estar encerrado entre signos de número (#). Cuando introduzca un literal de fecha / hora en vista SQL, éste deberá seguir el formato dd/mm/aa (o dd/mm/aaaa). Este formato podría ser diferente al utilizado en la cuadrícula de diseño de una consulta, que debe seguir el formato definido por el ajuste Formato de fecha corta de la sección Configuración regional del Panel de control de Windows. nombre-de-columna – Se puede especificar un nombre de columna de una tabla o una consulta. Solamente se puede utilizar un nombre de columna de una tabla o consulta que haya sido especificada en la cláusula FROM de la sentencia. Si la expresión es aritmética, debe utilizar una columna que contenga datos numéricos. Si la expresión es aritmética, debe utilizar una columna que contenga datos numéricos. Si aparece el mismo nombre de columna en más de una de las tablas o consultas que se incluyen en la consulta, el nombre debe ser especificado por completo con el nombre de consulta, nombre de tabla o nombre de correlación, como por ejemplo en [TablaA].[Columna1]. Aunque en el SQL de ANSI se puede hacer referencia a un nombre-de-columna-de-salida en cualquier posición dentro de una expresión. Microsoft Access sólo permite hacer esto dentro de la <lista-de-campos> en una sentencia SELECT. Access no soporta las referencias a nombres de columnas de expresión en las cláusulas GROUP BY, HAVING, ORDER BY o WHERE. Deberá repetir la expresión en lugar de utilizar el nombre de columna. + | - | * | / | \ | ^ | MOD – Se puede combinar varias expresiones numéricas utilizando operadores aritméticos que especifiquen un cálculo. Si utiliza operadores aritméticos, todas las expresiones incluidas dentro de una expresión deben poder ser evaluadas como tipos de datos numéricos. & - Se pueden concatenar constantes alfanuméricas utilizando el operador especial ámpersan (&). Ejemplos. Introduzca la siguiente función para especificar el promedio de una columna denominada COSTE. AVG (coste) Introduzca la siguiente expresión para especificar la mitad del valor de una columna denominada PRECIO. (Precio *0,5)

Page 8: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

7

Para especificar un literal tal como 3:00 P.M del día 1 de Marzo de 1998, introduzca lo siguiente. #1 /3 / 1998 3:00PM# Para especificar una cadena de caracteres que contiene el nombre Acme Mail Order Company introduzca el siguiente literal. “Acme Mail Order Company” Para especificar una cadena de caracteres que es el resultado de la concatenación de campos de una tabla denominada Lista Cliente que contiene el nombre y los apellidos de una persona, escriba lo siguiente: [Lista Cliente] . [Nombre] & “ “ & [Lista Cliente] . [Apellidos]

FROM, cláusula Especifica las tablas o consultas que proporcionan los datos de origen para su consulta. Sintaxis: From { { nombre-de-tabla [ [AS] nombre-de-correlación ] | nombre-de-consulta-de-selección [ [AS] nombre-de-correlación] | <tabla combinada> } , … (IN <especificación-del-origen> ] donde <tabla combinada> es ( {nombre-de-tabla [ [AS] nombre-de-correlación] | nombre-de-consulta-de-selección [ [AS] nombre-de-correlación] | <tabla combinada> [INNER | LEFT | RIGHT} JOIN ( nombre-de-tabla [ [AS] nombre-de-correlación] | nombre-de-consulta-de-selección [ [AS] nombre-de-correlación] | <tabla combinada> } ON <especificación-de-combinación> ) Notas: De manera opcional se puede suministrar un nombre de correlación para cada nombre de tabla o consulta y utilizar este nombre de correlación como un alias para el nombre de tabla completo a la hora de especificar los nombres de columna en la lista de selección, en la <lista-de-campos>, en la <especificación-de-combinación> o en la cláusula WHERE y las subcláusulas. Si está combinando una tabla o una consulta

Page 9: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

8

consigo misma, deberá utilizar los nombres de correlación para especificar a qué copia de la tabla o consulta está haciendo referencia en la lista de selección, criterio de combinación o criterio de selección. Si el nombre de la tabla o consulta es además una palabra reservada (por ejemplo, “Order”), deberá encerrar el nombre entre paréntesis. Si incluye varias tablas en la cláusula FROM sin una especificación JOIN pero incluye un predicado que compara campos de varias tablas en la cláusula WHERE, en la mayoría de los casos, Access optimiza esta situación llegando a la solución de que la consulta sea tratada como un JOIN. Por ejemplo, SELECT * FROM TablaA, TablaB WHERE TablaA.ID = TablaB.ID es tratado por Access como si se hubiese especificado SELECT * FROM TablaA INNER Join TablaB.ID No se pueden actualizar los campos de una tabla utilizando una hoja de respuestas dinámica mostrada por la consulta, la hoja de datos de la consulta o un formulario basado en una consulta de varias tablas donde la combinación haya sido expresada utilizando una lista-de-tabla y una cláusula WHERE. En la mayoría de las ocasiones, podrá actualizar los campos de las tablas subyacentes cuando utilice la sintaxis JOIN. Cuando se lista más de una tabla o consulta sin criterios de combinación, el origen es el Producto cartesiano de todas las tablas. Por ejemplo, FROM TablaA, TablaB indica a Access que reconozca todas las filas de la TablaA que coincidan con todas las filas de la TablaB. A menos que especifique otro criterio de restricción, el número lógico de filas que Access procesa podría ser el número de filas de la TablaA por el número de filas de la TablaB. A continuación, Access devolverá las filas en las que se cumple el criterio de selección especificado en la cláusula WHERE y HAVING. Ejemplo. Para seleccionar la información acerca de los clientes cuyas compras superen los 100 dólares, introduzca lo siguiente SELECT tblClientes.IDCliente, tblClientes.Nombre, tblClientes.Apellidos, tblPedidos.FechaPedido, tblDetallesPedido.NúmeroISBN, tblLibros.Título, tblDetallesPedido.Cantidad, tblDetallesPedido.Descuento, tblLibros.PrecioSug, Round(CCur(([tblDetallesPedido].[Cantidad]*[tblLibros].[PrecioSug])*(1-[tblDetallesPedido].[Descuento])),2) AS PrecioExt FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido

Page 10: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

9

WHERE (((Round(CCur(([tblDetallesPedido].[Cantidad]*[tblLibros].[PrecioSug])*(1-[tblDetallesPedido].[Descuento])),2))>100));

GROUP BY, cláusula. En una sentencia SELECT, esta cláusula especifica las columnas utilizadas para la formación de grupos a partir de las pilas seleccionadas. Cada grupo contiene valores idénticos en la columna o columnas especificadas. En Access, la cláusula GROUP BY se utiliza para definir una consulta de totales. También deberá incluir una cláusula GROUP BY en una consulta de tabla de referencias cruzadas. (Para más detalles véase la sentencia TRANSFORM). Sintaxis. GROUP BY nombre-de-columna , … Notas: Un nombre de columna en la cláusula GROUP BY puede hacer referencia a cualquier columna de cualquier tabla incluida en la cláusula FROM, incluso si la columna no fue mencionada en la lista de selección. Si la cláusula GROUP BY está precedida por una cláusula WHERE, Access crea los grupos a partir de las filas seleccionadas después de la aplicación de la cláusula WHERE. Cuando incluye una cláusula GROUP BY en una sentencia SELECT, la lista de selección debe estar formada por funciones de totales SQL o por los nombres de columna especificados en la cláusula GROUP BY Ejemplo. Para encontrar el pedido de mayor importe de cualquier cliente dentro de cada código postal, podríamos crear las dos siguientes consultas.

1. Una consulta que calcule el total para cada pedido. (La consulta tiene como nombre CejempTotalesPedidos)

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

Page 11: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

10

2. Podríamos diseñar una consulta basada en la primera consulta para localizar el pedido de mayor cuantía. (el nombre de nuestra consulta al que introduciremos el código es llamada CejempMayorPedidoPorCódigoPostal):

SELECT cEjempTotalesPedido.CódigoPostal, Max(cEjempTotalesPedido.TotalPedido) AS MaxTotalDePedido FROM cEjempTotalesPedido GROUP BY cEjempTotalesPedido.CódigoPostal;

Para encontrar el promedio y los precios máximos de los libros del catálogo por nombre de categoría, introduzca lo siguiente. (El nombre de la consulta a la que podemos introducir el código se llama CejempPromedioMáxPrecioPorCategoría). SELECT tblCategorías.Categoría, Avg(tblLibros.PrecioSug) AS PromDePrecioSug, Max(tblLibros.PrecioSug) AS MaxDePrecioSug FROM tblCategorías INNER JOIN (tblLibros INNER JOIN tblCategoríasLibro ON (tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN) AND (tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN)) ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría GROUP BY tblCategorías.Categoría;

HAVING, cláusula. Especifica los grupos de filas que aparecen en la tabla lógica (un conjunto de registros de Access) definido por una sentencia SELECT. La condición de búsqueda se aplica a las columnas especificadas en una cláusula GROUP BY, a las columnas creadas por funciones de totales o a las expresiones que contienen funciones de totales. Si un grupo no cumple la condición de búsqueda, no será incluido en la tabla lógica. Sintaxis. HAVING <Condición-de-búsqueda> Notas. Si no incluye una cláusula GROUP BY, la lista de selección deberá estar formada mediante el uso de una o más funciones de totales. La diferencia entre la cláusula HAVING y la cláusula WHERE es que la <condición-de-búsqueda> de la cláusula WHERE, se aplica a las filas individuales antes de que sean agrupadas, mientras que la <condición-de-búsqueda> de la cláusula HAVING se aplica a los grupos de filas Si incluye una cláusula GROUP BY que proceda a la cláusula HAVING, la condición de búsqueda se aplica a cada uno de los grupos formados por valores iguales en las

Page 12: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

11

columnas especificadas. Si no incluye una cláusula GROUP BY, la condición de búsqueda se aplica a toda la tabla lógica definida por la sentencia SELECT. Ejemplos. Para localizar las ciudades en las que el promedio de compras de los clientes es inferior al promedio de compras realizadas por todos los clientes, podríamos crear las dos consultas siguientes.

1. Una consulta que calcule el total para cada pedido, como nombre de consulta le podríamos asignar CejempTotalesPedido

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

2. Podríamos diseñar una consulta basada en la primera consulta para localizar el pedido de mayor cuantía, como nombre de consulta le podríamos asignar cEjempPromedioCiudades.

SELECT cEjempTotalesPedido.Ciudad, Avg(cEjempTotalesPedido.TotalPedido) AS PromedioDeTotalPedido FROM cEjempTotalesPedido GROUP BY cEjempTotalesPedido.Ciudad HAVING (((Avg(cEjempTotalesPedido.TotalPedido))<(SELECT Avg([TotalPedido]) FROM cEjempTotalesPedido))); Para hallar el promedio y las cantidades máximas de pedidos para los clientes del estado de Washington para cada mes en el que la cantidad máxima de pedido se encuentra por debajo de los 1.900 dólares, podría crear las dos consultas siguientes.

1. Una consulta que calcule el total para cada pedido, como nombre de consulta le podría asignar cEjempTotalesPedido.

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido

Page 13: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

12

GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

2. Podríamos diseñar una consulta basada en la primera consulta para localizar

el pedido de mayor cuantía, como nombre de consulta le podríamos asignar cEjempPromedioCiudades.

SELECT cEjempTotalesPedido.Ciudad, Avg(cEjempTotalesPedido.TotalPedido) AS PromedioDeTotalPedido FROM cEjempTotalesPedido GROUP BY cEjempTotalesPedido.Ciudad HAVING (((Avg(cEjempTotalesPedido.TotalPedido))<(SELECT Avg([TotalPedido]) FROM cEjempTotalesPedido))); Para hallar el promedio y las cantidades máximas de pedidos para los clientes del estado de Washington para cada mes en el que la cantidad máxima de pedido se encuentra por debajo de los 1.900 dólares, podríamos crear las dos consultas siguientes.

1. Una consulta que calcule el total para cada pedido, como nombre de consulta le podría asignar cEjempTotalesPedido.

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

2. Podríamos diseñar una consulta basada en la primera consulta para localizar el pedido de mayor cuantía, como nombre de consulta le podría asignar cEjempMaxPedidosWA<1900.

SELECT Month([FechaPedido]) AS Mes, Avg(cEjempTotalesPedido.TotalPedido) AS PromDeTotalPedido, Max(cEjempTotalesPedido.TotalPedido) AS MaxDeTotalPedido FROM cEjempTotalesPedido WHERE (((cEjempTotalesPedido.EstadoOProvincia)="WA")) GROUP BY Month([FechaPedido]) HAVING (((Max(cEjempTotalesPedido.TotalPedido))<1900));

IN, cláusula. Especifica el origen de las tablas en una consulta. El origen puede ser otra base de datos Access; un archivo de dBase, Microsoft FoxPro o Parados; o cualquier base de datos

Page 14: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

13

para el que disponga de un controlador ODBC. Se trata de una extensión Access para SQL estándar. Sintaxis. IN <”nombre de base de datos origen”> <[cadena de conexión origen]> Introduzca el <“nombre de base de datos origen”> <[cadena de conexión origen]>. (No olvide incluir los corchetes y las comillas.) Si el origen de su base de datos es Access, introduzca solamente el “nombre de base de datos origen”. En la siguiente tabla, se muestran los parámetros que debe introducir de acuerdo con el tipo de base de datos a la que está conectándose. Nombre de base de datos

Nombre de base de datos origen

Cadena de conexión origen

Access “unidad:\ruta\nombrearchivo” (ninguna) dBASE III “unidad:\ruta” [dBASE III; ] dBASE IV “unidad:\ruta” [dBASE IV;] dBASE V “unidad:\ruta” [dBASE 5.0;] Paradox 3.x “unidad:\ruta” [Paradox 3.x;] Paradox 4.x “unidad:\ruta” [Paradox 4.x;]

Paradox 5.x “unidad:\ruta” [Paradox 5.x;] FoxPro 2.0 “unidad:\ruta” [FoxPro 2.0;] FoxPro 2.5 “unidad:\ruta” [FoxPro 2.5;] FoxPro 2.6 “unidad:\ruta” [FoxPro 2.6;] FoxPro 3.0 “unidad:\ruta” [FoxPro 3.0;] ODBC (ninguno) [ODBC; DATABASE =

basededatospredeterminada; UID = usuario; PWD = contraseña ; DNS = nombreorigendatos]

Notas. La cláusula IN se aplica a todas las tablas a las que se hace referencia en la cláusula FROM y cualquiera de las subconsultas de su consulta. Tan sólo podemos hacer referencia a una base de datos externa dentro de una consulta. Si necesita hacer referencia a más de un archivo o base de datos externos, asocie esos archivos como tablas de Access y utilice los nombres de tabla lógica asociada en su lugar. Para ODBC, si se omite DSN= o DATABASE=, Access visualizará un cuadro de diálogo en el que se muestran los orígenes de los datos disponibles de tal modo que pueda elegir el que desee. Si se omiten los parámetros UID= o PWD= y el servidor requiere un identificador de usuario y una contraseña, Access mostrará un cuadro de diálogo de identificación para cada tabla a la que se acceda. Para las bases de datos dBASE, Parados y FoxPro, podemos proporcionar una cadena vacía (“ “) como nombre de base de datos origen y proporcionar la ruta de acceso o

Page 15: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

14

nombre de archivo de diccionario utilizando en su lugar el parámetro DATABASE= en la cadena de conexión origen. Ejemplos. Para recuperar el campo Nombre de compañía de la base de datos de ejemplo NEPTUNO sin tener que asociar la tabla Clientes, podría introducir lo siguiente. SELECT DISTINCTROW Clientes. [Nombre de compañía] FROM Clientes Id “ “ C:\Mis documentos\ Acceso directo a NEPTUNO.MDB”;

JOIN, operación. Gran parte de la potencia de SQL viene dada por su habilidad para combinar (unir) información procedente de varias tablas o consultas, y mostrar el resultado como un único conjunto de registros. En la mayoría de los casos, Access permite actualizar el conjunto de registros de una tabla combinada como si se tratase de una simple tabla base. Utilice una operación JOIN en una cláusula FROM para especificar la forma en que desea que se enlacen dos tablas al formar un conjunto de registros lógicos a partir del cual se seleccionará la información necesaria. Puede pedir a Access que cambie solamente aquellas filas que coinciden en ambas tablas (denominado combinación interna) o que devuelva todas las filas de una de las dos tablas incluso cuando una fila coincidente no exista en la segunda tabla (denominado Combinación externa). Puede anidar varias operaciones de combinación para enlazar, por ejemplo, una tercera tabla con el resultado de la combinación de las otras dos tablas. Sintaxis: ( {nombre-de-tabla [ [AS] nombre-de-correlación] | nombre-de-consulta-de-selección [ [AS] nombre-de-correlación] | <Tabla combinada> { INNER | LEFT | RIGHT} JOIN {nombre-de-tabla [ [AS] nombre-de-correlación] | nombre-de-consulta-de-selección [ [AS] nombre-de-correlación] | <tabla combinada > ON <especificación-de-combinación>) Donde <tabla combinada> es el resultado de otra operación de combinación y <especificación-de-combinación> es una condición de búsqueda formada por predicados que comparan campos de la primera tabla o consulta combinada con campos de la segunda tabla, consulta o tabla combinada.

Page 16: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

15

Notas: De manera opcional, puede suministrar un nombre de correlación para cada nombre de tabla o consulta. Este nombre de correlación se puede utilizar como un alias para el nombre de tabla completo durante la especificación de los nombres de columna en la lista de selección o en la cláusula WHERE o subcláusulas. Si se encuentra combinando una tabla o una consulta consigo misma, deberá utilizar los nombres de correlación para especificar a que copia de la tabla o consulta está haciendo referencia en la lista de selección, criterio de combinación o criterio de selección. Si el nombre de la tabla o consulta es, además, una palabra reservada (por ejemplo, “Order”), deberá encerrar el nombre entre paréntesis. Utilice INNER JOIN para obtener como resultado las filas que coinciden con la especificación de combinación en ambas tablas. Utilice LEFT JOIN para obtener cómo resultado todas las filas procedentes de la primera tabla lógica (donde tabla lógica es cualquier expresión de tabla, consulta o tabla combinada) combinada en la especificación de combinación con cualquiera de las filas que coincidan con la segunda tabla lógica. Cuando no existe ninguna fila coincidente en la segunda tabla, Access da por resultado valores nulos en las columnas de esa tabla. En sentido inverso, al utilizar RIGHT JOIN obtendremos todas las filas procedentes de la segunda tabla lógica combinada con cualquiera de las filas que coincidan con la primera tabla lógica. Cuando solamente utilice predicados de comparación equivalencia en la especificación de combinación, el resultado se denomina combinación equivalente. Las combinaciones que Access representa en la cuadrícula de diseño son combinaciones equivalentes. Access no puede representar en la cuadrícula de diseño ninguna especificación de combinación que utilice algún operador de comparación distinto del operador de igualdad (=), también denominadas combinaciones no equivalentes. Si desea definir una combinación en función de una comparación que no sea de equivalencia (<, >, <>, <= o >=), deberá definir la consulta utilizando la vista SQL. Cuando combine una tabla consigo misma utilizando un predicado de comparación de equivalencia, el resultado se denomina autocombinación. Ejemplos. Imagínese que desea seleccionar información acerca de los libros y sus autores, ordenada por identificador del libro (ISBN), introduzca lo siguiente. SELECT tblLibros.*, [tblAutores].[Apellidos] & ", " & [tblAutores].[Nombre] & IIf(IsNull([tblAutores].[InicialNOmbre]),Null," " & [tblAutores].[InicialNombre] & ".") AS NombreAutor, tblAutores.DirCorreoElectrónico, tblAutores.Fotografía, tblAutores.Bio FROM tblLibros INNER JOIN (tblAutores INNER JOIN tblAutorLibro ON tblAutores.IDAutor = tblAutorLibro.IDAutor) ON tblLibros.NúmeroISBN = tblAutorLibro.NúmeroISBN;

Page 17: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

16

Para llevar a cabo una búsqueda de aquellos libros que no hayan sido incluidos en ningún pedido en los últimos 90 días, podríamos crear las dos consultas que se muestran a continuación.

1. Una consulta que calcule los libros que han sido pedidos en los últimos 90 días, y podríamos guardar la consulta con el siguiente nombre: cEjempLibrosEnUltimos90Días

SELECT DISTINCTROW tblLibros.NúmeroISBN FROM tblPedidos INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido WHERE (((tblPedidos.FechaPedido) Between Date() And Date()-90)); Esta consulta utiliza DISTINCTROW para que cada libro sólo se visualice una vez.

2. Una consulta basada en la primera consulta para localizar los libros que no han sido solicitados en ningún pedido, podría guardar la consulta con el nombre cEjempLibrosNoPedidos.

SELECT tblLibros.NúmeroISBN, tblLibros.Título FROM tblLibros LEFT JOIN cEjempLibrosEnUltimos90Días ON tblLibros.NúmeroISBN = cEjempLibrosEnUltimos90Días.NúmeroISBN WHERE (((cEjempLibrosEnUltimos90Días.NúmeroISBN) Is Null)); Para visualizar un listado de los libros y las cantidades solicitadas en los pedidos, ordenados por categoría de libro, podríamos crear una consulta e introducir el siguiente código, y guardarla con el nombre cEjempPedidosPorCategoríaYTítulo. SELECT tblCategorías.Categoría, tblLibros.Título, tblDetallesPedido.Cantidad FROM (tblCategorías INNER JOIN (tblLibros INNER JOIN tblCategoríasLibro ON (tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN) AND (tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN)) ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría) INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN ORDER BY tblCategorías.Categoría;

ORDER BY, cláusula. Especifica la secuencia de filas a ser devuelta por una sentencia SELECT o una sentencia INSERT. Sintaxis: ORDER BY {nombre-de-columna} | número-de-columna [ASC | DESC] } , …

Page 18: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

17

Notas. Utilice los nombres de columna o los números de columna de salida relativos para especificar las columnas cuyos valores serán utilizados para ordenar las filas devueltas. (Si utiliza los números de columna de salida relativos, la columna de salida es la 1). En la cláusula ORDER BY se puedes especificar varias columnas. La lista será ordenada primeramente por columna cuyo nombre se especifica en primer lugar. Si existen filas que poseen valores idénticos en esa columna, a continuación, serán ordenados por el nombre de la siguiente columna de la lista ORDER BY. Se puede especificar el orden deseado, ascendente (ASC) o descendente (DESC), para cada columna. Si no indica ASC o DESC, Access asume el orden ascendente, ASC. El uso de una cláusula ORDER BY en una sentencia SELECT es lo único que determina la definición de la sentencia de las filas a devolver. Ejemplos. Supongamos que desea seleccionar los clientes con los que negociamos por primera vez en febrero de 1999 e incluso antes, y listarlos en orden ascendente por código postal, podríamos introducir el siguiente código y guardar la consulta con el nombre cEjempClientesConPedidosAntesFebrero1999). SELECT tblClientes.Nombre, tblClientes.SegundoNombre, tblClientes.Apellidos, tblClientes.Ciudad, tblClientes.CódigoPostal FROM tblClientes WHERE (((#3/1/1999#)>=(Select Min([FechaPedido]) From tblPedidos Where tblPedidos.IDCliente = tblClientes.IDCliente))) ORDER BY tblClientes.CódigoPostal;

PARAMETERS, declaración. Precede a una sentencia SQL y define el tipo de datos de cualquier parámetro que se incluya en la consulta. Puede utilizar parámetros para solicitar al usuario los valores de los datos o para hacer coincidir los valores de los datos en los controles de un formulario abierto. Sintaxis. PARAMETERS { [nombre-parámetro] tipo-de-datos} , …; Notas. Si su consulta solicita al usuario la entrada de valores, cada nombre de parámetro debería describir el valor que el usuario necesita introducir. Por ejemplo, [Imprimir facturas de los pedidos de la fecha:] es mucho más descriptivo que [Introduzca la

Page 19: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

18

fecha:]. Si desea hacer referencia a un control en un formulario abierto, utilice el formato

[Formularios]![MiFormulario]![MiControl] Para hacer referencia a un control de un subformulario, utilice el formato.

[Formularios]![MiFormulario]![MiControlSubformulario].[Formulario]![ControlDeSubformulario]

Ejemplo. Para crear una consulta de parámetros que resuma las ventas y el precio de coste de todos los artículos vendidos en un determinado mes, podríamos introducir el siguiente código. PARAMETERS [Año a resumir:] Short, [Mes a resumir:] Short; SELECT tblLibros.NúmeroISBN, tblLibros.Título, Format([FechaPedido],"mmmm"", ""yyyy") AS MesPedido, Sum(Round(CCur(([tblDetallesPedido].[Cantidad]*[tblLibros].[PrecioSug])*(1-[tblDetallesPedido].[Descuento])),2)) AS TotalPedido FROM tblPedidos INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido WHERE (((Year([FechaPedido]))=[Año a resumir:]) AND ((Month([FechaPedido]))=[Mes a resumir:])) GROUP BY tblLibros.NúmeroISBN, tblLibros.Título, Format([FechaPedido],"mmmm"", ""yyyy"); La siguiente tabla muestra las entradas de tipo de datos válidas. Tipo de datos del parámetro SQL Tipo de datos de Access equivalente Chart, Text(n)1, VarChar Texto Text1, LongText, LongChart, Memo Memo TinyInt, Byte, Integer1 Numérico, Byte SmallInt, Short, Integer2 Numérico, Entero Integer, Long, Integer4 Numérico, Entero largo Real, Single, Float4, IEEESingle Numérico, Simple Float, Double, Foat8, IEEEDouble Numérico, Doble Decimal, Numeric Numérico, Decimal UniqueIdentifier, GUID Numérico, id. de la réplica DateTime, Date, Time Fecha/Hora Money, Currency Moneda Bit, Bolean, Logical, YesNo Si/No

1 El texto con una longitud de descriptor de 255 o inferior se reconoce como un tipo de datos Texto de Access. Cuando el texto no posee un descriptor es un campo Memo.

Page 20: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

19

Predicado: BETWEEN Compara un valor con un rango de valores. Sintaxis. expresión [NOT] BETWEN <expresión> AND <expresión> Notas. El tipo de datos de todas las expresiones debe ser compatible. La comparación de literales (cadenas) alfanuméricos en Access no hace distinción entre las mayúsculas y las minúsculas. Considere las expresiones a, b, c. Podremos decir, en términos de otros predicados, que a BETWEEN b AND c es equivalente a la siguiente expresión. a >= b AND a <= c a NOT BETWEEN b AND c es equivalente a: a < b OR a > c El resultado es indefinido si cualquiera de las expresiones es nula. Ejemplo. Para determinar si el promedio de Cantidad multiplicado por PrecioSug es mayor o igual a 500 dólares y menor o igual que 10.000 dólares, introduzca lo siguiente.

AVG (Cantidad * PrecioSug) BETWEEN 500 AND 10000

Predicado: Comparación. Compara los valores de dos expresiones o el valor de una expresión y un único valor que ha sido devuelto por una consulta. Sintaxis.

expresión {= | <> | > | < | >= ( <= } {<expresión> | <subconsulta> }

Notas. La comparación de cadenas en Access no hace distinción entre mayúsculas y minúsculas. El tipo de datos de la primera expresión debe ser compatible con el tipo de datos de la segunda expresión o con el valor devuelto por la subconsulta. Si la

Page 21: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

20

subconsulta no devuelve ninguna fila o devuelve más de una fila, el resultado sería un error salvo en el caso de que la lista de selección de la subconsulta sea COUNT (*), en cuyo caso la devolución de varias filas produce un valor. Si la primera expresión, la segunda expresión, o la subconsulta se evalúa a un valor Nulo, el resultado de la comparación será indefinido. Ejemplos. Para determinar si el pedido tuvo lugar en 1998, introduzca lo siguiente.

AÑO(FechaPedido) = 1998

Para determinar si el campo IDPedido es distinto a 50, introduzca.

IDPedido <> 50 Para determinar si un pedido tuvo lugar en el primer semestre del año, introduzca lo siguiente.

Mes(FechaPedido) <7 Para determinar si el valor máximo de la cantidad total del pedido del grupo es menor que el promedio de la cantidad total del pedido encontrado en la tabla Detalles pedidos, introduzca lo siguiente

MAX ([Total Pedido]) < (SELECT AVG ([Total pedido]) FROM [cEjempTotalesPedido])

Predicado: EXISTS Comprueba si existe al menos una fila que satisface el criterio de selección de una subconsulta. Sintaxis. EXISTS (<subconsulta>) Notas. El resultado no puede ser indefinido. Si la subconsulta devuelve al menos una fila, el resultado es Verdadero; en cualquier otro caso, el resultado es Falso. La subconsulta no necesita devolver valores para este predicado; por tanto, puede listar algunas columnas en la lista de selección que existe en las tablas o consultas subyacentes o utilizar un asterisco (*) para denotar todas las columnas.

Page 22: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

21

Ejemplo. Para seleccionar todos los autores que han escrito al menos un libro, introduzca lo siguiente. SELECT tblAutores.Nombre, tblAutores.InicialNombre, tblAutores.Apellidos FROM tblAutores WHERE (((Exists (SELECT * FROM tblAutorLibro WHERE tblAutorLibro.IDAutor = tblAutores.IDAutor))<>False));

Predicado: IN Determina si un valor es igual a alguno de los valores o es distinto a todos los valores de un conjunto devuelto por una subconsulta o proporcionado en una lista de valores. Sintaxis. <expresión> [NOT] IN { (<subconsulta>) | ( {literal} , …) | <expresión>} Notas. La comparación de cadenas en Access no hace distinción entre mayúsculas y minúsculas. El tipo de datos de todas las expresiones, literales y la columna obtenida como resultado de la subconsulta deben ser compatibles. Si la expresión o cualquier valor devuelto por la subconsulta es nulo, el resultado será indefinido. En términos de otros predicados, <expresión> IN <expresión> será equivalente a lo siguiente.

<expresión> = <expresión> <expresión> IN (<subconsulta>) sería equivalente a lo siguiente.

expresión = ANY (subconsulta) <expresión> IN (a, b, c, …), donde a, b y c son literales, sería equivalente a lo siguiente.

(<expresión> = a) OR (<expresión> = b) OR (<expresión> = c) …

<expresión> NOT IN … es equivalente a lo siguiente.

NOT (<expresión> IN …)

Page 23: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

22

Ejemplos. Para determinar si un Estado norteamericano pertenece a la costa oeste de Estados Unidos, introduzca lo siguiente.

[EstadoOProvincia] IN (“CA” , “OR”, “WA”) Para determinar si el IDCliente coincide con cualquier IDLibrería de Washington, introduzca lo siguiente. IDCliente IN (SELECT IDLibrería FROM tblLibrerías WHERE tblLibrerías. [EstadoOProvincia] = “WA”) Para listar todos los autores que no han escrito un libro “Avanzado” (Categoría número 13), introduzca lo siguiente. SELECT tblAutores.IDAutor, tblAutores.Nombre, tblAutores.InicialNombre, tblAutores.Apellidos FROM tblAutores WHERE (((tblAutores.IDAutor) Not In (SELECT tblAutorLibro.IDAutor FROM (tblLibros INNER JOIN tblAutorLibro ON tblLibros.NúmeroISBN = tblAutorLibro.NúmeroISBN) INNER JOIN tblCategoríasLibro ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN WHERE tblCategoríasLibro.IDCategoría=13)));

Predicado: Like Localiza las cadenas que coinciden con un determinado modelo. Sintaxis. nombre-columna [NOT} LIKE cadena-coincidente Notas: Las comparaciones de cadena de Access no hacen distinción entre mayúsculas y minúsculas. Si la columna especificada por nombre-columna contiene un valor nulo, el resultado es indefinido. La comparación de dos cadenas vacías o una cadena vacía con el carácter especial asterisco (*) se evalúa a Verdadero. Proporcione una cadena de texto como el valor para cadena-coincidente que defina los caracteres que pueden existir y en que posiciones deben encontrarse para que la comparación sea cierta. Access comprende un cierto número de caracteres comodín mostrados en la siguiente tabla que pueden ser utilizados para definir las posiciones que

Page 24: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

23

pueden contener cualquier carácter, ningún carácter o más de un carácter, o un único número cualquiera. Carácter comodín Significado ? Un único carácter cualquiera * Cero o más caracteres (utilizado para definir

cadenas al principio, al final o insertadas que no es necesario que coincidan con ningún modelo de caracteres).

# Un único número cualquiera También es posible especificar que cualquier determinada posición del texto o del campo memo pueda contener exclusivamente los caracteres de una lista que proporcionemos. Para definir una lista de caracteres de comparación para una determinada posición, encierre la lista entre corchetes ([]). Se puede especificar un rango de caracteres dentro de la lista introduciendo el carácter del valor mínimo, un guión y el carácter del valor máximo, como por ejemplo [A-Z] o [3-7]. Si desea comprobar que una posición pueda contener cualquier carácter salvo los que se encuentran en una lista, comience la lista con un signo de admiración (!). Si desea comprobar la existencia de los caracteres especiales *, ?, # y [ deberá encerrar el carácter entre corchetes. Ejemplos. Para determinar si el campo Apellidos del cliente tiene al menos una longitud de cuatro caracteres y si además comienza por Smi, introduzca lo siguiente.

tblClientes.Apellidos LIKE “Smi?*”

Para comprobar si CódigoPostal es un código postal canadiense válido, introduzca lo siguiente.

CódigoPostal LIKE “ [A-Z] # [A-Z] # [A-Z] # “

Predicado: NULL. Determina si la expresión se evalúa a Nulo. Este predicado se evalúa solamente a Verdadero o Falso y no será evaluado a indefinido Sintaxis. <expresión> IS [NOT] NULL Ejemplo. Para determinar si la columna del número de teléfono del cliente nunca ha sido rellenada, introduzca lo siguiente:

Page 25: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

24

NúmeroTeléfono IS NULL

Predicado: Quantified Compara el valor de una expresión con alguno, ninguno o todos los valores de una única columna devuelta por una subconsulta. Sintaxis. <expresión> {= | <> | > | < | >= | <= } [SOME | ANY | ALL] (<subconsulta>) Notas. La comparación de cadenas en Access no hace distinción entre mayúsculas y minúsculas. El tipo de datos de la expresión debe ser compatible con el tipo de datos del valor devuelto por la subconsulta. Cuando se utiliza ALL, el predicado es cierto si la comparación es cierta para todos los valores devueltos por la subconsulta. Si la expresión o cualquiera de los valores devueltos por la subconsulta es nulo, el resultado será indefinido. Cuando se utiliza SOME o ANY, el predicado es cierto si la comparación es cierta para cualquiera de los valores devueltos por la subconsulta. Si la expresión es un valor nulo, el resultado es indefinido. Si la subconsulta no devuelve ningún valor, el predicado es falso. Ejemplos. Para localizar los libros cuyo coste es superior al de todos los libros de Microsoft Access, introduzca lo siguiente. SELECT [tblLibros].[NúmeroISBN], [tblLibros].[Título], [tblLibros].[PrecioSug] FROM tblLibros WHERE (((tblLibros.PrecioSug)>All (SELECT tblLibros.PrecioSug FROM tblCategorías INNER JOIN (tblLibros INNER JOIN tblCategoríasLibro ON tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN) ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría WHERE tblCategorías.Categoría="Microsoft Access")));

Condición de búsqueda. Describe un predicado simple o compuesto que es cierto, falso o indefinido respecto a una determinada fila o grupo. Utilice una condición de búsqueda en la cláusula WHERE de una sentencia SELECT, una subconsulta, una sentencia DELETE o una sentencia UPDATE. También puede ser utilizada dentro de la cláusula HAVING de una sentencia SELECT.

Page 26: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

25

La condición de búsqueda define las filas que aparecerían en la tabla lógica resultante o las filas sobre las que se actuaría en una operación de cambio. Si la condición de búsqueda es cierta cuando se aplica a una fila, dicha fila será incluida en el resultado. Sintaxis. [NOT] {predicado | (<Condición-de-búsqueda>) } [ { AND | OR | XOR | EQV | IMP } [NOT] {predicado | (<condición-de-búsqueda>) } ] … Notas. Access aplica de manera efectiva cualquier subconsulta de la condición de búsqueda a cada fila de la tabla resultante de las cláusulas anteriores. A continuación, Access evalúa el resultado de la subconsulta con respecto a cada fila candidata. Si incluye un predicado de comparación en el formato <expresión> operador de comparación <subconsulta>, en caso de que la subconsulta no devuelva ninguna fila el resultado será un error. El orden de evaluación de los operadores booleanos es NOT, AND, OR, XOR ( OR exclusivo), EQV (equivalencia) e IMP (implicación). Puede incluir paréntesis adicionales para indicar el orden en que los operadores booleanos serán procesados. Al utilizar el operador booleano NOT, se obtendrán los siguientes resultados: NOT (Verdadero) que es equivalente a FALSO, NOT (Falso) que es equivalente a Verdadero y NOT (indefinido) que es equivalente a indefinido. Siempre que un predicado haga referencia a un valor nulo, el resultado será indefinido. Aquellas filas cuyo resultado en la evaluación de la condición de búsqueda sea Falso, no serán seleccionadas. Access devuelve los valores Verdadero, Falso o Indefinido como resultado de la aplicación de operadores booleanos (AND, OR, XOR, EQV, IMP) entre dos predicados o condiciones de búsqueda según las tablas mostradas en la siguiente ilustración.

AND Verdadero Falso Indefinido (Nulo) Verdadero Verdadero Falso Nulo

Falso Falso Falso Falso Indefinido (Nulo) Nulo Falso Nulo

Or Verdadero Falso Indefinido (Nulo) Verdadero Verdadero Verdadero Verdadero

Falso Verdadero Falso Nulo Indefinido (Nulo) Verdadero Nulo Nulo

Page 27: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

26

XOR Verdadero Falso Indefinido (Nulo) Verdadero Falso Verdadero Nulo

Falso Verdadero Falso Nulo Indefinido (Nulo) Nulo Nulo Nulo

EQV Verdadero Falso Indefinido (Nulo) Verdadero Verdadero Verdadero Nulo

Falso Falso Falso Nulo Indefinido (Nulo) Nulo Nulo Nulo

IMP Verdadero Falso Indefinido (Nulo) Verdadero Verdadero Falso Nulo

Falso Verdadero Verdadero Verdadero Indefinido (Nulo) Verdadero Nulo Nulo

Ejemplo. Para localizar todos los libros cuyo precio sugerido es superior a 20 dólares y el número de edición es igual a 2 o el año de copyright es 1995, pero no ambos, introduciríamos lo siguiente. SELECT tblLibros.NúmeroISBN, tblLibros.Título, tblLibros.AñoCopyright, tblLibros.PrecioSug, tblLibros.NúmeroEdición FROM tblLibros WHERE (((tblLibros.PrecioSug)>20) AND (([tblLibros].[AñoCopyright]=1995 Xor [tblLibros].[NúmeroEdición]=2)<>False));

SELECT, sentencia Lleva a cabo las operaciones relacionales de selección, proyección y combinación para crear una tabla lógica (conjunto de registros) a partir de otras tablas o consultas. Los elementos de la lista de selección identifican las columnas o valores calculados de las columnas que serán proyectados desde las tablas de origen hacia la tabla que está siendo formada. Identifique en la cláusula FROM las tablas que van a ser combinadas, e identifique en la cláusula WHERE las filas que serán seleccionadas. Utilice GROUP BY para especificar la forma en que se formarán los grupos para una consulta de totales y utilice HAVING para especificar los grupos resultantes que serán incluidos en el resultado.

Page 28: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

27

Sintaxis. SELECT [ALL | DISTINCT | DISTINCTROW | TOP número

[PERCENT] <lista-de-selección> FROM { {nombre-de-tabla [ [AS] nombre-de-correlación] |

nombre-consulta-de-selección [ [AS] nombre-de-correlación] | (<sentencia-de-selección>) AS nombre-de-correlación | <tabla combinada> } , …

IN < ” nombre base de datos origen” > <[cadena de conexión origen]> [WHERE <condición-de-búsqueda>] [GROUP BY nombre-columna, …] [HAVING <condición-de-búsqueda>] [UNION [ALL] <sentencia-de-selección>] [ORDER BY {nombre-de-columna [ASC | DESC] } , …] |

donde <lista-de-selección> es {* | {<expresión> [AS nombre-de-columna-salida] |

nombre-de-tabla.* | nombre-de-consulta.* | nombre-de-correlación.*} , …}

y donde <tabla combinada> es ( { nombre-de-tabla [ [AS] nombre-de-correlación ] |

nombre-consulta-de-selección [ [AS] nombre-de-correlación ] | (<sentencia-de-selección>) AS nombre-de-correlación | <tabla combinada>}

{INNER | LEFT | RIGHT} JOIN {nombre-de-tabla [ [AS] nombre-de-correlación ] | nombre-consulta-de-selección [ [AS] nombre-de-correlación ] | (<sentencia-de-selección>) AS nombre-de-correlación | <tabla combinada>}

ON <especificación-de-combinación>) Notas De manera opcional, se puede suministrar un nombre de correlación para cada nombre de tabla o consulta. Deberá proporcionar un nombre de correlación cuando incluya una <sentencia-de-selección> en una cláusula FROM. Puede utilizar este nombre de correlación como un alias para el nombre completo de tabla, el nombre de la consulta, o la expresión <sentencia de selección> a la hora de especificar los nombres de columna en la <lista de selección> o en la cláusula WHERE y las subcláusulas. Si se encuentra combinando una tabla o una consulta consigo misma, deberá utilizar los nombres de correlación para especificar a que copia de la tabla o consulta está haciendo

Page 29: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

28

referencia en la <lista-de-selección>, criterio de combinación o criterio de selección. Si el nombre de la tabla o consulta es, además, una palabra reservada (por ejemplo, “ORDER”), deberá encerrar el nombre entre corchetes. Cuando se lista más de una tabla o consulta sin criterio de combinación, el origen es el Producto cartesiano de todas las tablas. Por ejemplo, FROM TablaA, TablaB indica a Access que reconozca todas las filas de la TablaA que coincidan con todas las filas de la TablaB. A menos que especifique otro criterio de restricción, el número lógico de filas que Access procesa sería igual al número de filas de la TablaA por número de filas de la TablaB. A continuación, Access devuelve las filas en las que se cumple el criterio de selección especificado en la clásula WHERE y HAVING. Además, se pueden definir las filas que Access incluirá en el conjunto de registros de salida especificando ALL, DISTINCT, DISTINCTROW, TOP n o TOP n PERCENT. ALL incluye todas las filas procedentes de las tablas de origen que coincidan con el criterio de búsqueda incluyendo las filas duplicadas. DISTINCT solicita que Access devuelva únicamente las filas que sean diferentes de las demás. No se puede actualizar ninguna columna en una consulta que utilice ALL o DISTINCT. DISTINCTROW (el valor por omisión en la versión 7.0 y anteriores de Access) solicita que Access devuelva solamente las filas en las que la concatenación de las claves principales de todas las tablas que suministran columnas de salida sean únicas. Dependiendo de las columnas que haya elegido, podrían visualizarse aquellas filas que contengan valores duplicados en el resultado, aunque cada fila del resultado se deduce a partir de una combinación de filas de las tablas subyacentes. DISTINCTROW sólo es significativo cuando se incluyen una combinación en una consulta y no se incluyen columnas de salida de todas las tablas. Especifique TOP n o TOP n PERCENT para solicitar que el conjunto de registros tan sólo contenga las primeras n filas o n por ciento de las filas. En general, debería especificar una cláusula ORDER BY cuando utilice TOP para indicar la secuencia que define qué filas se encuentran primero o en la parte superior. El parámetro n debe ser un entero y deberá ser menor o igual que 100 si incluye la palabra reservada PERCENT. Si no incluye una cláusula ORDER BY, la secuencia de filas devueltas será indefinida. En una consulta TOP, si la eneava fila y cualquier fila que se encuentre inmediatamente después de la eneava fila están duplicadas, Access devuelve los duplicados; de este modo, el conjunto de registros podría tener más de n filas. Cuando incluye una cláusula GROUP BY, la lista de selección debe estar formada por una o más funciones de totales SQL, o por uno o más nombres de columna especificados en una cláusula GROUP BY. Un nombre de columna en una cláusula GROUP BY puede hacer referencia a cualquier columna de cualquier tabla de la cláusula FROM, incluso si la columna no se menciona en la lista de selección. Si desea hacer referencia a una expresión calculada en la cláusula GROUP BY, debe asignar un nombre de columna de salida para la expresión en la lista de selección y, a

Page 30: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

29

continuación, hacer referencia a ese nombre en la cláusula GROUP BY. Si la cláusula GROUP BY está precedida por una cláusula WHERE, Access forma los grupos a partir de las filas seleccionadas después de la aplicación de la cláusula WHERE. Si se utiliza la cláusula HAVING, pero no se incluye una cláusula GROUP BY, la lista de selección debe estar formada mediante el uso de funciones de totales SQL. Si incluye la cláusula GROUP BY precediendo a la cláusula HAVING, entonces la condición de búsqueda de la cláusula HAVING se aplica a cada uno de los grupos formados por valores iguales en las columnas especificadas. Si no incluye una cláusula GROUP BY, la condición de búsqueda de la cláusula HAVING se aplica a toda la tabla lógica definida por la sentencia SELECT. Utilice los nombres de columnas o los números de columnas de salida relativos para especificar las columnas cuyos valores serán utilizados para ordenar las filas devueltas. (Si utiliza los números de columna de salida relativos, la primera columna de salida será la 1). En una cláusula ORDER BY se pueden especificar varias columnas. La lista será ordenada primeramente por la columna cuyo nombre se especifica en primer lugar. Si existen filas que poseen valores idénticos en esa columna, a continuación, serán ordenados por el nombre de la siguiente columna de la lista ORDER BY. Podemos especificar el orden deseado, ascendente (ASC) o descendente (DESC), para cada columna. Si no indica ASC o DESC, Access adoptará el orden ascendente, ASC. El uso de una cláusula ORDER BY en una sentencia SELECT es lo único que determina la definición de la secuencia de las filas a devolver. Ejemplos. Para seleccionar la información acerca de los clientes cuyas compras superan los 100 dólares, podríamos introducir lo siguiente. SELECT tblClientes.IDCliente, tblClientes.Nombre, tblClientes.Apellidos, tblPedidos.FechaPedido, tblDetallesPedido.NúmeroISBN, tblLibros.Título, tblDetallesPedido.Cantidad, tblDetallesPedido.Descuento, tblLibros.PrecioSug, Round(CCur(([tblDetallesPedido].[Cantidad]*[tblLibros].[PrecioSug])*(1-[tblDetallesPedido].[Descuento])),2) AS PrecioExt FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido WHERE (((Round(CCur(([tblDetallesPedido].[Cantidad]*[tblLibros].[PrecioSug])*(1-[tblDetallesPedido].[Descuento])),2))>100));

Subconsulta. Selecciona a partir de una única columna cualquier número de valores o ningún valor de la comparación en un predicado.

Page 31: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

30

Sintaxis. (SELECT [ALL | DISTINCT] <lista-de-selección> FROM { { nombre-de-tabla [ [AS] nombre-de-correlación ] | nombre-consulta-de-selección [ [AS] nombre-de-correlación ] } | <tabla combinada>} , … [WHERE <condición-de-búsqueda> ] [ GROUP BY nombre-de-columna , …] [HAVING <condición-de-búsqueda> ] ) donde lista-de-selección es {* | {<expresión> | nombre-de-tabla.* | nombre-de-consulta.* | nombre-de-correlación.*} | y donde <tabla combinada> es ( { nombre-de-tabla [ AS ] nombre-de-correlación ] | nombre-consulta-de-selección [ [ AS] nombre-de-correlación ] | <tabla combinada>) {INNER | LEFT | RIGHT} JOIN {nombre-de-tabla [ [AS ] nombre-de-correlación ] | <tabla combinada>} ON <especificación-de-combinación>} Notas. Es posible utilizar el carácter especial asterisco (*) en la <lista-de-selección> de una subconsulta solamente cuando la subconsulta se utiliza en un predicado EXISTS o cuando la cláusula FROM dentro de la subconsulta hace referencia a una sola tabla o consulta que contiene únicamente una columna. Se puede suministrar un nombre de correlación para cada nombre de tabla o consulta. Puede utilizar este nombre de correlación como un alias para el nombre de tabla completo a la hora de especificar los nombres de columna en la lista de selección o en la cláusula WHERE y las subcláusulas. Si se encuentra combinando una tabla o una consulta consigo misma, deberá utilizar los nombres de correlación para especificar a qué copia de la tabla o consulta está haciendo referencia en la <lista-de-selección>, criterio de combinación o criterio de selección. Si el nombre de la tabla o consulta es, además, una palabra reservada (por ejemplo, “Order”), deberá encerrar el nombre entre corchetes. Cuándo se lista más de una tabla o consulta sin criterio de combinación, el origen es el producto cartesiano de todas las tablas. Por ejemplo, FROM TablaA, TablaB indica a Microsoft Access que reconozca todas las filas de la TablaA que coincidan con todas las

Page 32: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

31

filas de la TablaB. A continuación, Access devuelve las filas en las que se cumple el criterio de selección especificado en la cláusula WHERE y HAVING. En la condición de búsqueda de la cláusula WHERE de una subconsulta se puede hacer referencia a las columnas de cualquier tabla o consulta que esté definida en las consultas externas mediante una referencia externa. Si la referencia de la tabla o consulta resulta ambigua, deberá especificar el nombre de columna completo. Un nombre de columna en una cláusula GROUP BY puede hacer referencia a cualquier columna de cualquier tabla de la cláusula FROM, incluso si la columna no se menciona en la <lista-de-selección>. Si la cláusula GROUP BY está precedida por una cláusula WHERE, Access forma los grupos a partir de las filas seleccionadas después de la aplicación de la cláusula WHERE. Cuando incluye una cláusula GROUP BY o HAVING en una sentencia SELECT, la <lista-de-selección> debe estar formada por funciones de totales SQL o por nombres de columna especificados en una cláusula GROUP BY. Si incluye una cláusula GROUP BY precediendo a la cláusula HAVING, la condición de búsqueda de la cláusula HAVING se aplica a cada uno de los grupos formados por los valores iguales en las columnas especificadas. Si no incluye una cláusula GROUP BY, la condición de búsqueda de la cláusula HAVING se aplica a toda la tabla lógica definida por la sentencia SELECT. Ejemplos. Para seleccionar todos los autores que han escrito al menos un libro, podríamos introducir el siguiente código. SELECT tblAutores.Nombre, tblAutores.InicialNombre, tblAutores.Apellidos FROM tblAutores WHERE (((Exists (SELECT * FROM tblAutorLibro WHERE tblAutorLibro.IDAutor = tblAutores.IDAutor))<>False)); Para localizar las ciudades en las que el promedio de compra de los clientes es inferior al promedio de compras de todos los clientes, podríamos crear la siguiente consulta (una consulta que calcule el total para cada pedido). SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

Page 33: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

32

Total, función: AVG En una tabla lógica definida por una sentencia SELECT o una subconsulta, crea un valor en una columna que es la media aritmética de los valores de la expresión o nombre de columna especificado. Puede utilizar una cláusula GROUP BY para crear un promedio para cada grupo de filas seleccionadas a partir de las tablas o consultas subyacentes. Sintaxis. AVG (<expresión>) Notas. No se puede hacer referencia a otra función de total dentro de la expresión. Si se utiliza una función de totales SQL en la lista de selección de una sentencia SELECT, el resto de las columnas de la lista de selección se deberán deducir utilizando una función de total, o el nombre de la columna deberá aparecer en una cláusula GROUP BY. Una expresión debe contener una referencia hacia al menos un nombre de columna, y la expresión o el nombre de columna deben ser del tipo de datos numéricos. Los valores nulos no son incluidos en el cálculo del resultado. El tipo de datos del resultado generalmente es el mismo que el de la expresión o del nombre de columna. Si la expresión o nombre de columna fuese un entero, el promedio resultante será truncado. Por ejemplo, AVG(n), donde n es un entero y los valores de n en las filas seleccionadas son 0, 1 y 1, el resultado es 0. Ejemplos. Para encontrar el promedio y los precios máximos de los libros del catálogo por nombre de categoría, introduzca lo siguiente. SELECT tblCategorías.Categoría, Avg(tblLibros.PrecioSug) AS PromDePrecioSug, Max(tblLibros.PrecioSug) AS MaxDePrecioSug FROM tblCategorías INNER JOIN (tblLibros INNER JOIN tblCategoríasLibro ON (tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN) AND (tblLibros.NúmeroISBN = tblCategoríasLibro.NúmeroISBN)) ON tblCategorías.IDCategoría = tblCategoríasLibro.IDCategoría GROUP BY tblCategorías.Categoría;

Total, función: MAX En una tabla lógica definida por una sentencia SELECT o una subconsulta, crea un valor en una columna que es el valor máximo de la expresión o nombre de columna especificado. Puede utilizar una cláusula GROUP BY para crear un valor máximo para cada grupo de filas seleccionadas de las tablas o consultas subyacentes.

Page 34: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

33

Sintaxis. MAX (<expresión>) Notas. No se puede hacer referencia a otra función de total dentro de la expresión. Si se utiliza una función de totales SQL en la lista de selección de una sentencia SELECT, el resto de las columnas de la lista de selección se deberán deducir utilizando una función de total, o el nombre de la columna deberá aparecer en una cláusula GROUP BY. Una expresión debe contener una referencia al menos a un nombre de columna. Los valores nulos no son incluidos en el cálculo del resultado. El tipo de datos del resultado es el mismo que el de la expresión o del nombre de columna. Ejemplos. Para encontrar el pedido de mayor importe de cualquier cliente dentro de cada código postal, podría crear las siguientes dos consultas.

1. Una consulta que calcule el total de cada pedido, podría guardar la consulta con el nombre cEjempTotalesPedido.

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

2. Una consulta basada en la primera consulta para encontrar el pedido de mayor cuantía.

SELECT cEjempTotalesPedido.CódigoPostal, Max(cEjempTotalesPedido.TotalPedido) AS MaxTotalDePedido FROM cEjempTotalesPedido GROUP BY cEjempTotalesPedido.CódigoPostal;

Total, función: MIN En una tabla lógica definida por una sentencia SELECT o una subconsulta, crea un valor en una columna que es el valor mínimo de la expresión o nombre de columna especificado. Puede utilizar una cláusula GROUP BY para crear un valor mínimo para cada grupo de filas seleccionadas a partir de las tablas o consultas subyacentes.

Page 35: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

34

Sintaxis. MIN (<expresión>) Notas. No se puede hacer referencia a otra función de total dentro de la expresión. Si se utiliza una función de totales SQL en la lista de selección de una sentencia SELECT, el resto de las columnas de la lista de selección se deberán deducir utilizando una función de total, o el nombre de la columna deberá aparecer en una cláusula GROUP BY. Una expresión debe contener una referencia hacia al menos un nombre de columna. Los valores nulos no son incluidos en el cálculo del resultado. El tipo de datos del resultado es el mismo que el de la expresión o del nombre de columna. Ejemplos. Para encontrar el pedido de menor importe de cualquier cliente dentro de cada código postal, podría crear las siguientes consultas.

1. Una consulta que calcule el total para cada pedido, como nombre de consulta le podría asignar cEjempTotalesPedido

SELECT tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalPedido FROM (tblClientes INNER JOIN tblPedidos ON tblClientes.IDCliente = tblPedidos.IDCliente) INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido GROUP BY tblPedidos.IDPedido, tblPedidos.FechaPedido, tblClientes.IDCliente, tblClientes.Ciudad, tblClientes.EstadoOProvincia, tblClientes.CódigoPostal;

2. Una consulta basada en la primera consulta para encontrar el pedido de menor cuantía

SELECT cEjempTotalesPedido.CódigoPostal, Min(cEjempTotalesPedido.TotalPedido) AS MinDeTotalPedido FROM cEjempTotalesPedido GROUP BY cEjempTotalesPedido.CódigoPostal;

Total, función: SUM En una tabla lógica definida por una sentencia SELECT o una subconsulta, crea un valor en una columna que es la suma numérica de los valores de la expresión o nombre de columna especificado. Puede utilizar una cláusula GROUP BY para crear una suma para cada grupo de filas seleccionadas a partir de las tablas o consultas subyacentes.

Page 36: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

35

Sintaxis. SUM (<expresión>) Notas. No se puede hacer referencia a otra función de total dentro de la expresión. Si se utiliza una función de totales SQL en la lista de selección de una sentencia SELECT, el resto de las columnas de la lista de selección se deberán deducir utilizando una función de total, o el nombre de la columna deberá aparecer en una cláusula GROUP BY. Una expresión debe contener una referencia hacia al menos un nombre de columna. Los valores nulos no son incluidos en el cálculo del resultado. El tipo de datos del resultado generalmente es el mismo que el de la expresión o del nombre de columna. Ejemplos. Para crear una consulta de parámetros que resuma las ventas y el precio de coste de todos los artículos vendidos en un determinado mes, introduciríamos el siguiente código. PARAMETERS [Año a resumir:] Short, [Mes a resumir:] Short; SELECT tblLibros.NúmeroISBN, tblLibros.Título, Format([FechaPedido],"mmmm"", ""yyyy") AS MesPedido, Sum(Round(CCur(([tblDetallesPedido].[Cantidad]*[tblLibros].[PrecioSug])*(1-[tblDetallesPedido].[Descuento])),2)) AS TotalPedido FROM tblPedidos INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido WHERE (((Year([FechaPedido]))=[Año a resumir:]) AND ((Month([FechaPedido]))=[Mes a resumir:])) GROUP BY tblLibros.NúmeroISBN, tblLibros.Título, Format([FechaPedido],"mmmm"", ""yyyy");

TRANSFORM, sentencia. Genera una consulta de tabla de referencias cruzadas que le permite resumir un único valor utilizando los valores encontrados en una columna o en una expresión especificada como encabezados de columna y utilizando otras columnas o expresiones que definen un criterio de agrupamiento para formar las filas. El resultado es similar al de una hoja de cálculo y es más útil como entrada para un objeto gráfico.

Page 37: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

36

Sintaxis. TRANSFORM <expresión-función-de-total> <sentencia-de-selección> PIVOT <expresión> [ IN (<lista-de-valores-de-columna>) ] donde <expresión-función-de-total> es una expresión creada con una de las funciones de totales, <sentencia-de-selección> consta de una cláusula GROUP BY y <lista-de-valores-de-columna> es una lista de los valores requeridos que espera que sean devueltos por la expresión PIVOT, encerrada entre paréntesis y separada por comas. (Puede utilizar la cláusula IN para obligar la secuencia de salida de las columnas.) Notas. El parámetro <expresión-función-de-total> es el valor que desea que aparezca en las “celdas” de la hoja de datos de la tabla de referencias cruzadas. PIVOT <expresión> define la columna o expresión que proporciona los valores de encabezado de columna en la tabla de referencias cruzadas resultante. Podría utilizar este valor para proporcionar una lista de meses con filas de totales definidas por categoría del producto en la cláusula GROUP BY de la <sentencia-de-selección>. Es posible utilizar más de una columna o expresión en la sentencia de selección para definir el criterio de agrupación para las filas. Ejemplo. Para proporcionar una cantidad de ventas totales realizada en cada uno de los meses del año 1999, clasificado por libro, podríamos introducir el siguiente código. TRANSFORM Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS Expr1 SELECT tblLibros.NúmeroISBN, tblLibros.Título, Sum(Round(CCur(([Cantidad]*[PrecioSug])*(1-[Descuento])),2)) AS TotalVentas FROM tblPedidos INNER JOIN (tblLibros INNER JOIN tblDetallesPedido ON tblLibros.NúmeroISBN = tblDetallesPedido.NúmeroISBN) ON tblPedidos.IDPedido = tblDetallesPedido.IDPedido WHERE (((tblLibros.FueraDeImpr)=False)) GROUP BY tblLibros.NúmeroISBN, tblLibros.Título PIVOT Format([FechaPedido],"mmm yyyy") In ("Ene 1999","Feb 1999","Mar 1999","Abr 1999","May 1999","Jun 1999","Jul 1999","Ago 1999","Sep 1999","Oct 1999","Nov 1999","Dic 1999");

Page 38: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

37

UNION, operador de consulta. Produce una tabla resultante que consta de filas devueltas tanto por la primera sentencia de selección como por la segunda sentencia de selección. Para definir una consulta de UNION debe utilizar la vista SQL. Sintaxis. <sentencia-de-selección> UNION [ALL] <sentencia-de-selección> [ORDER BY {nombre-columna | número-columna [ASC | DESC] } , …] Notas. Si se especifica ALL, Access devuelve todas las filas de ambas tablas lógicas. Si no se especifica ALL, Access elimina las filas duplicadas. Las tablas devueltas por cada <sentencia-de-selección> deben contener el mismo número de columnas, y cada columna debe tener atributos idénticos. En la sentencia de selección que está unida por operadores de consulta no se debe utilizar la cláusula ORDER BY; sin embargo, puede incluir una única cláusula ORDER BY al final de una sentencia que utilice uno o más operadores de consulta. Esta acción aplicará el orden especificado al resultado de la sentencia completa. Access deduce los nombres de columna de la salida a partir de los nombres de columna devueltos por la primera <sentencia-de-selección>. Si desea utilizar nombres de columna en la cláusula ORDER BY, asegúrese de utilizar nombres procedentes de la primera consulta. Utilice los nombres de columna de salida para definir el criterio de la cláusula ORDER BY. Es posible cambiar varias sentencias de selección utilizando UNION para obtener resultados complejos. Utilice paréntesis para indicar la secuencia en que desea que Access aplique los operadores, tal como se muestra a continuación. SELECT … UNION (SELECT … UNION SELECT … ) Ejemplo. Para encontrar los nombres de todas las librerías y clientes actuales del estado de Washington, eliminando los duplicados y ordenando los nombres por código postal, podríamos introducir el siguiente código. SELECT [tblClientes].[Apellidos] & ", " & [tblClientes].[Nombre] & IIf(IsNull([tblClientes].[SegundoNombre]),Null," " & [tblClientes].[SegundoNombre] & ".") AS Nombre, tblClientes.Ciudad, tblClientes.CódigoPostal FROM tblClientes Where tblClientes.EstadoOProvincia = "WA"

Page 39: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

38

UNION SELECT tblLibrerías.NombreLibrería, tblLibrerías.Ciudad, tblLibrerías.CódigoPostal FROM tblLibrerías Where tblLibrerías.EstadoOProvincia = "WA" ORDER BY CódigoPostal DESC;

WHERE, cláusula Especifica una condición de búsqueda en una sentencia o cláusula SQL. Las sentencias DELETE, SELECT Y UPDATE y la subconsulta que contienen la cláusula WHERE solamente operan sobre aquellas filas que cumplen la condición. Sintaxis. WHERE <condición-de-búsqueda> Notas. Access aplica la <condición-de-búsqueda> a cada fila de la tabla lógica ensambladas como resultado de la ejecución de las cláusulas anteriores, y vuelve a ejecutar aquellas filas para las cuales la <condición-de-búsqueda> no se cumple. Si utiliza una subconsulta dentro de un predicado en la <condición-de-búsqueda> (a menudo denominado consulta interna), Access en primer lugar debe ejecutar la subconsulta antes de que sea evaluado el predicado. Si se hace referencia a una tabla o consulta que, además, se utiliza en una cláusula FROM externa en una subconsulta (a menudo denominada subconsulta correlativa), Access deberá ejecutar la subconsulta sólo una vez. Una subconsulta correlativa también puede ser expresada como una combinación que, por lo general, se ejecutaría de manera más efectiva. Si incluye un predicado en la <condición-de-búsqueda> en el formato. El resultado será un error en caso de que la subconsulta no devuelva ninguna fila.

expresión operador-de-comparación Subconsulta El orden de evaluación de los operadores booleanos utilizados en la <condición-de-búsqueda> es NOT, AND, OR, XOR (OR exclusivo), EQV (equivalencia) y después IMP (implicación). Se pueden incluir paréntesis adicionales para indicar el orden en el que Access procesará las expresiones booleanas. Ejemplo. Para localizar todos los libros cuyo precio sugerido es superior a 20 dólares y el número de edición es igual a 2 o el año de copyright es 1995, pero no ambos, podría introducir el siguiente código.

Page 40: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

39

SELECT tblLibros.NúmeroISBN, tblLibros.Título, tblLibros.AñoCopyright, tblLibros.PrecioSug, tblLibros.NúmeroEdición FROM tblLibros WHERE (((tblLibros.PrecioSug)>20) AND (([tblLibros].[AñoCopyright]=1995 Xor [tblLibros].[NúmeroEdición]=2)<>False));

Diseño de formularios avanzados.

Un formulario varios a uno. Resulta realmente sencillo diseñar un formulario que nos permita visualizar y actualizar los datos de una sola tabla. Pero, ¿y si desease ver más información de las tablas relacionadas? La mejor manera de visualizar y actualizar los datos es diseñar una consulta basada en dos (o más) tablas relacionadas y utilizar dicha consulta como base para el formulario. La mayor parte de las veces que crea una consulta con dos o más tablas, está trabajando con relaciones uno a varios entre estas tablas. Microsoft Access permite actualizar cualquier dato de la tabla que se encuentra en la parte “varios” de la relación y cualquier campo que no sea clave principal en la parte “uno” de la relación. Esto significa que cuando un formulario esté basado en una consulta, puede actualizar todos los campos del formulario que procedan de la tabla “varios” y la mayoría de los campos que procedan de la parte “uno”. Dado que el propósito principal del formulario es buscar y actualizar los registros de la parte “varios” de la relación mientras revisa la información de la parte “uno”, este tipo de formularios se denomina formulario varios a uno.

Diseño de un formulario varios a uno. Supongamos que abrimos una consulta llamada conEjempContratos. Una vez que tuviésemos la consulta abierta, podríamos crear un formulario basado en la consulta. Si lo desea, para facilitarlo puede utilizar el Asistente para formularios. De la tabla tblContratos podríamos incluir los campos NúmContrato, FechaContrato, IDGrupo, IDClub, PrecioContrato, TérminosContrato, FechaInicio, FechaFin y NúmeroDeSemanas. De la tabla tblClubs, podríamos incluir los siguientes campos Dirección, Ciudad, EstadoOProvincia, CódigoPostal, ApellidosManager, NombreManeger, y DíasHoras. De la tabla tblGrupos, podríamos seleccionar los siguientes campos Tamaño, NombreLíder, ApellidosLíder, Dirección, Ciudad, EstadoOProvíncia y CódigoPostal.

Page 41: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

40

Selección de los campos de la consulta de varias tablas en el Asistente para formularios

Selección de un único formulario para los campos procedentes de varias tablas

Si estuviese haciendo uso del Asistente para formularios, sus selecciones de campo deberían ser las mostradas en la siguiente ilustración.

Pulse el botón Siguiente para pasar a la segunda ventana del asistente.

Cuando comience con una consulta que contiene varias tablas o si selecciona campos de varias tablas en la primera ventana del Asistente para formularios, el asistente le ofrece

Page 42: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

41

algunas elecciones interesantes si puede determinar qué tablas forman la parte “uno” y que tablas forman la parte “varios” en la relación. Como puede ver en la ilustración anterior, el asistente asume que desea ver todos los campos como una única presentación de la parte “varios” (tblContratos) de esta relación. Si selecciona “por TblClubs” o “por tblGrupos” en la lista situada a la izquierda, el asistente cambiará la visualización de la derecha para ofrecer la posibilidad de crear un formulario principal y un subformulario, o formularios vinculados. Si selecciona formularios vinculados, el asistente crea dos formularios de forma automática. El primer formulario sólo visualizaría la información de la parte “uno” (tblGrupos o tblClubs). Un botón de mandato en el primer formulario permitiría abrir el segundo formulario, que visualiza la información de la parte “varios” (tblContratos). Por ahora, podríamos seleccionar “por tblContratos” para ver todos los campos de un formulario. Seleccionaríamos un diseño en columnas en la siguiente ventana y el estilo que deseáramos en la ventana que aparece a continuación. Podríamos asignar el nombre Contratos como título para el formulario en el último paso. Cuando el asistente finalice, el formulario debería ser similar al mostrado en la siguiente ilustración.

En este formulario podría tratar de llevar a cabo algunas mejoras, aunque el asistente ya ha realizado parte de nuestro trabajo. Nótese que el asistente ha colocado en el formulario cuadros combinados para el ID Grupo y el ID Club, ya que la tabla tblContratos posee propiedades de búsqueda establecidas en ambos campos para visualizar de forma más significativa el nombre del club y del grupo. Si intentáramos cambiar el ID del Club en el primer contrato, podríamos observa cómo de forma automática aparecería en la visualización el correspondiente nombre de manager y la información de la dirección del club, como se muestra en la siguiente ilustración.

Page 43: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

42

Al cambiar el ID del club, automáticamente se visualiza la información del nuevo club relacionado.

Creación e inserción de subformularios. Si desea mostrar datos procedentes de varias tablas y desea tener la posibilidad de actualizar los datos de más de una de esas tablas, lo más probable es que necesite algo más complejo que un formulario estándar. Suponga que tuviera una base de datos llamada libros, como se muestra en la siguiente ilustración.

En la base de datos Libros, la información principal del pedido se encuentra en la tabla tblPedidos. Por supuesto, un pedido no tendría sentido si no existiesen algunos libros asociados a él. La tabla tblLibros lista todos los libros disponibles para su venta en esta base de datos. Puesto que cualquier pedido puede incluir varios libros diferentes y cualquier libro puede aparecer en varios pedidos, La tabla tblPedidos está relacionada con la tabla tblLibros en una relación varios a varios. Cuando estemos visualizando información sobre un pedido en particular, puede que deseemos ver y editar la información del pedido. Podría crear un único formulario que visualizase la información de la tabla tblPedidos en combinación con la tabla tblDetallesPedido. Sin embargo, el enfoque debería estar sobre los detalles de pedido,

Page 44: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

43

de modo que pueda visualizar un libro por cada una de las filas del formulario. Tal vez podría diseñar un formulario continuo, aunque visualizaría la información de tblPedidos de forma repetida. Los subformularios pueden ayudarnos a resolver este problema. Podemos crear un formulario principal que visualice la información del pedido e incluir en él un subformulario que visualice todas las filas relacionadas de la tabla de unión. Si utiliza un cuadro combinado en el subformulario, puede visualizar los nombres de los libros que coincidan con los números ISBN de la tabla tblDetallesPedidos.

Especificación del origen del subformulario. Podemos incluir hasta dos niveles de subformularios dentro de otro formulario. Debería comenzar a diseñar el formulario de nivel más inferior e ir subiendo de nivel. Por tanto, comenzaremos por decidir el origen de los datos del subformulario. En el ejemplo descrito anteriormente, desearemos crear o actualizar las filas de la tabla tblDetallesPedido para poder crear, modificar y eliminar los enlaces establecidos entre los pedidos de la tabla tblPedidos y los libros de la tabla tblLibros. Además desearemos modificar la presentación ya que la tabla tblDetallesPedido consta solamente de los dos campos de unión IdPedido y NúmeroISBN (una información que no es muy útil para visualizar en un formulario). Necesitamos asegurarnos que las propiedades de búsqueda para el campo NúmeroISBN están establecidas para visualizar los títulos de los libros (y, quizá, los números de edición) de la tabla tblLibros. Para facilitar la visualización del número ISBN, el título del libro y el número de edición después de establecer el número ISBN en el campo de unión, necesitaremos incluir la tabla tblLibros en el origen del subformulario de forma que pueda extraer los datos del libro y el número de edición a partir de esta tabla para su visualización Además, necesitaremos esta tabla si deseamos calcular la cantidad total debida, ya que solamente podemos encontrar el precio de venta sugerido para el libro en tblLibros, no en tblDetallesPedido. Por supuesto también necesitaremos los campos Cantidad y Descuento de tblDetallesPedido. Siguiendo nuestro ejemplo, podríamos comenzar abriendo una nueva consulta en Vista Diseño. En el cuadro de diálogo Mostrar tabla, podríamos añadir las listas de campos de las tablas tblDetallesPedido y tblLibros a la ventana Consulta. Podemos actualizar todos los campos de la tabla tblDetallesPedido, de modo que tendríamos que colocarlos en la cuadrícula de diseño. Para ello, debemos hacer uso del indicador de todos los campos (*). Podemos añadir los campos Título, NúmeroEdición y PrecioSug de la tabla TblLibros. Podríamos añadir un campo calculado llamado PrecioExt para visualizar el precio extendido.

Page 45: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

44

La fórmula para calcular el precio extendido en la consulta conDetallesPedido

La siguiente ilustración muestra la fórmula para el cálculo del precio extendido. La fórmula mostrada aquí incluye la función incorporada NZ (nulo a cero) para visualizar un valor cero si alguno de los argumentos fuese un valor nulo.

La razón por la que necesitamos utilizar la función NZ es que no estará disponible ningún precio hasta que establezca un número ISBN en una nueva fila tblDetallesPedido cuando añada un libro a un pedido. Si no incluye NZ, el formulario visualizará Error en el control del precio extendido si introduce una cantidad de pedido antes de establecer el número ISBN. La apariencia de la consulta será similar a la mostrada en la siguiente ilustración.

Siguiendo nuestro ejemplo, podemos observar que la tabla tblLibros posee una relación uno a varios con la tabla tblDetallesPedido, este hecho nos indica que puede actualizar cualquier campo de la tabla tblDetallesPedido, ya que la tabla tblDetallesPedido es la parte varios de la relación. Podríamos guardar la consulta de forma que se pueda utilizar al diseñar el subformulario. Podríamos almacenarla con el siguiente nombre: conDetallesPedido.

Page 46: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

45

Diseño del subformulario. Diseñar un subformulario para ser utilizado en Vista Hoja de datos resulta sencillo ya que sólo necesita incluir los campos que desea visualizar en la sección de detalle del formulario, sin preocuparse de la alineación o ubicación. Access se encargará de organizar, ajustar el tamaño y proporcionar encabezados de columna en la hoja de datos. Sin embargo, se podría utilizar la vista Formularios continuos ya que ésta permite controlar el tamaño de las columnas (en vista Hoja de datos, un usuario puede modificar el tamaño de las columnas e incluso podría estrechar una columna de forma que no se encuentre visible).

Vista formulario continuo Vista formulario hoja de datos Además, si el subformulario se muestra en Vista Formulario simple o en Vista Formularios continuos, la orden Ajustar del submenú Tamaño se encargará de ajustar el control al tamaño del subformulario en Vista formulario, no a la anchura o altura de un número exacto de filas de la hoja de datos. El usuario tiene la posibilidad de modificar el tamaño de la altura de la fila y la anchura de la columna en Vista hoja de datos, de manera que el modo en que ajuste el tamaño del subformulario en Vista Diseño será sólo una estimación. Siguiendo nuestro ejemplo, podríamos crear un nuevo formulario sin utilizar el asistente para formularios, basado en la consulta que podríamos tener en la base de datos conLibrosPedido.

Page 47: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

46

Una vez visualizado el subformulario en Vista Diseño, pulse el botón de la herramienta Cuadro texto en el cuadro de herramienta y después abra la hoja de propiedades y establezca la propiedad Etiquetado automático a No. Se debería hacer lo mismo para el control del cuadro combinado.

Esto permitirá crear estos controles en la sección de Detalle sin que sea asociada una etiqueta. Asegúrese también de que no se encuentra presionado el botón Asistente para controles en el cuadro de herramientas, ya que el cuadro combinado que necesitamos crear ya posee las propiedades de búsqueda que fueron establecidas en el diseño de la tabla. Para crear el formulario, siga los siguientes pasos.

Pulse el botón de herramienta Cuadro combinado, y arrastre el campo NúmeroISBN a la sección de Detalle del subformulario.

Arrastre y suelte el campo Título sobre el formulario colocándolo junto al cuadro combinado NúmeroISBN.

Añada cuadros de texto para los campos NúmeroEdición, PrecioSug, Cantidad, Descuento y PrecioExt junto a los otros dos campos

Elija Alinear en el menú Formato y después elija Arriba en el submenú para alinear todos los controles en relación con su borde superior en la sección de Detalle

Asegúrese de que se encuentra seleccionada la orden Encabezado o pie de formulario en el menú Ver.

Utilice la herramienta Etiqueta para crear etiquetas en la sección Encabezado del formulario sobre cada uno de los campos creados en la sección de detalle. Para crear una etiqueta de varias líneas, mantenga presionada la tecla Ctrl y pulse intro para almacenar un retorno de carro mientras escribe en la propiedad Título de la etiqueta.

Añada dos cuadros de texto independientes para la sección Pie del formulario, uno de ellos debajo del campo Cantidad y el otro debajo del campo PrecioExt, podríamos establecer la propiedad Origen del control del primer cuadro de texto a =Suma ([Cantidad]). Podríamos establecer la propiedad Formato a Moneda. Estos dos controles visualizarán los totales del pedido. Añada una etiqueta descriptiva cuya propiedad Título esté establecida a Totales:

Todo lo que tiene que hacer es establecer la propiedad Vista predeterminada a Formularios continuos, establecer la propiedad Barras de desplazamiento a Sólo vertical (su diseño debería incluir todos los campos dentro del control subformulario en

Page 48: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

47

El subformulario de edición de los detalles del pedido en vista Diseño

El subformulario de detalles de pedido en vista Formularios continuos.

el formulario principal de forma que el usuario no necesite desplazarse hacia la izquierda y hacia la derecha), y establezca la propiedad Botones de desplazamiento a No (podemos utilizar la barra de desplazamiento vertical para movernos a través de las filas). El resultado debería ser similar a la siguiente ilustración.

Puede activar la vista Formulario del subformulario para comprobar su trabajo. La ilustración anterior muestra el diseño para el formulario continuo. Puesto que este formulario todavía no está vinculado como un subformulario (que limitará la visualización al pedido actual), los totales visualizados en el pie del formulario son los totales para todos los pedidos.

Page 49: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

48

Especificación del origen del formulario principal. Ha llegado el momento de ocuparse del formulario principal. En primer lugar, necesitaremos una tabla o consulta como origen del formulario. Deseamos tener la posibilidad de visualizar, actualizar, añadir y eliminar pedidos, de modo que el origen de la fila debería incluir la tabla tblPedidos. También podemos aplicar las técnicas que aprendimos en la creación de un formulario “varios a uno” para permitir insertar y actualizar los datos de la tabla tblPedidos mientras se visualiza la información de las tablas relacionadas de la parte “uno” (tblClientes y tblLibrerías). Para diseñar la consulta que necesita, siga los siguientes pasos.

Siguiendo nuestro ejemplo, podríamos crear una nueva consulta basada en la tabla tblPedidos e incluir todos los campos en la cuadrícula de diseño utilizando el campo especial “*”

Podríamos agregar la lista de campos tblClientes a la consulta y después arrastrar los campos Apellidos, Nombre, SegundoNombre, Dirección, Ciudad, EstadoOProvíncia, CódigoPostal y País a la cuadrícula de diseño

Podríamos establecer un criterio de ordenación ascendente para los campos Apellidos y Nombre.

Podríamos agregar la lista de campos tblLibrerías a la cuadrícula de diseño. Podríamos hacer doble clic en la línea de unión que Access crea y seleccionar la opción correspondiente para incluir todos los registros de tblPedidos y solo aquellos registros de tblLibrerías donde los campos combinados sean iguales. En esta aplicación, la especificación de una librería en un pedido es opcional, de modo que probablemente muchos pedidos no posean una librería especificada. Si no crea una combinación externa en su consulta, solamente verá los pedidos en los que se haya especificado una librería en la hoja dinámica de respuestas resultante

Page 50: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

49

Podríamos incluir los campos NombreLibrería, Dirección, Ciudad, CódigoPostal, EstadoOProvíncia y País de la tabla tblClientes en esta consulta

Finalmente, podríamos añadir los campos IDPedido y FechaPedido de la tabla tblPedidos a la consulta, establezca criterios para una ordenación ascendente. La consulta que acabamos de crear es similar a la mostrada en la siguiente ilustración.

Creación del formulario principal. El diseño del formulario para la tabla tblPedidos es bastante sencillo. De hecho, podemos seleccionar la consulta que acabamos de crear y utilizar un Asistente para formularios para elaborar el formulario básico utilizando un formato en columnas. El diseño de ejemplo mostrado en la siguiente ilustración dispone de un espacio en la parte inferior de la sección de Detalle donde podemos colocar el subformulario para visualizar los datos de detalle del pedido.

Page 51: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

50

Incrustación de un subformulario. Existen dos técnicas para incrustar el subformulario en el formulario principal. En primer lugar, puede anular la selección del botón Asistente para controles en el cuadro de herramientas, seleccionar la herramienta Subformulario / Subinforme del cuadro de herramientas y después hacer clic en la esquina superior izquierda del área en blanco del formulario principal y arrastrar el puntero del ratón para crear un control subformulario. Si deja activo el Asistente para controles, Access inicia un asistente que le ayudará a crear el subformulario cuando cree el control subformulario en el formulario principal. Una vez creado el subformulario, no necesitaremos ayuda. Una vez colocado el control, establezca la propiedad Objeto origen para que indique el subformulario que hemos creado, en nuestro ejemplo, podríamos utilizar como Objeto origen fsubEjempLibrosPedido.

Otra forma de incluir el subformulario es situar la ventana Formulario y la ventana Base de datos, una al lado de la otra, encontrar el formulario que se desea incluir y arrastrarlo desde la ventana Base de datos, una al lado de la otra, encontrar el formulario que desea incluir y arrastrarlo desde la ventana Base de datos hasta soltarlo en el formulario. En cualquier caso, su resultado será similar al de la siguiente ilustración.

Page 52: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

51

Escriba el nombre de uno o más campos de vinculación en el subformulario, subinforme u objeto incrustado

Escriba el nombre de uno o más campos o controles de vinculación en el formulario o informe principales

Access ofrece dos propiedades clave en el control subformulario que definen el enlace entre el formulario más externo y el subformulario: Vincular campos principales y Vincular campos secundarios. La propiedad vincular campos principales define el campo o campos del Origen del registro del formulario más externo que será utilizado por Access para filtrar los registros visualizados en el subformulario. La propiedad Vincular campos secundarios define el nombre del campo o campos relacionados en el Origen del registro del formulario que corresponde al control subformulario. A medida que se mueva a través de las filas del formulario más externo, Access utilizará los valores encontrados en el campo o campos seleccionados en la propiedad Vincular campos principales como si se tratase de un filtro para los campos del subformulario definidos en la propiedad Vincular campos secundarios. Cuando necesite definir varios campos para proporcionar el enlace, separe los nombres de los campos por punto y coma en el recuadro de la propiedad. En este caso, el enlace para las filas relacionadas en el subformulario es el campo IDPedido de tblPedidos del formulario más externo. Del mismo modo, el campo IDPedido de tblDetallesPedido es el campo que desea que Access utilice para filtrar las filas relacionadas que serán visualizadas en el subformulario. Establezca a IDPedido las propiedades Vincular campos principales y Vincular campos secundarios del control subformulario.

Cambiar el tamaño de un subformulario que está siendo visualizado en vista Formulario es bastante sencillo. Seleccione el control subformulario, abra el menú Formato, seleccione Tamaño y después elija Ajustar en el submenú. En este caso, estamos utilizando un submenú en vista Formularios continuos, de modo que Access modificará el tamaño del subformulario a la anchura correcta y a la altura vertical más próxima para que puedan visualizarse las filas en la sección de Detalle en su totalidad.

Page 53: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

52

Observe que si la vista predeterminada del subformulario es la vista hoja de datos, el uso de la orden Tamaño / Ajustar no operará correctamente a menos que la vista Diseño de formulario sea exactamente del mismo tamaño que él de la hoja de datos. Tendremos que entrar y salir de la Vista formulario, y ajustar de forma manual el tamaño de control subformulario. Cuando haya finalizado, pulse el botón Vista formulario de la barra de herramientas para visualizar el formulario terminado, como se muestra en la siguiente ilustración.

Puesto que hemos diseñado el formulario principal una consulta “varios a uno”, podremos ver que el nombre y la dirección del cliente son actualizados de forma automática cada vez que establece un IDCliente diferente para el pedido. Del mismo modo, Access mostrará la información relacionada de la librería cuando elija un IDLibrería para el pedido utilizando el cuadro combinado. Puesto que se ha establecido de forma apropiada la información del campo de unión para el control subformulario, podrá visualizar los libros para cada pedido en el subformulario conforme se desplace de un pedido a otro.

Uso de formato condicional. Access 2000 incluye una nueva característica que permite definir una modificación dinámica del formato de los cuadros de texto y cuadros combinados. Puede definir una expresión que compruebe el valor del cuadro de texto o del cuadro combinado o cualquier otro control disponible del formulario. Si la expresión es cierta, Access modificará las propiedades Negrita, Cursiva, Subrayado, Color de fondo o de relleno, Color de fuente o de primer plano y Habilitado de forma automática basándose en la configuración personal asociada con la expresión. Esta característica puede ser particularmente útil para el control de la visualización del campo de un subformulario en la vista Formularios continuos. En versiones anteriores, debía escribir una macros o código en Visual Basic para que comprobase los valores

Un formulario para la edición de pedidos en un formulario principal y de detalles del pedido en un subformulario

Page 54: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

53

cada vez que el usuario se desplazaba a una nueva fila y después cambiar la configuración dependiendo del valor. Esto no funcionaba de forma apropiada cuando se trataba de un subformulario ya que sólo existe una copia de cada control. Por ejemplo, si deseaba establecer el color de fondo del campo Descuento en el subformulario mostrado en la anterior ilustración cuando el valor superaba un cierto porcentaje, no podía hacerlo. Podía detectar el momento en el que el usuario se desplazaba a una fila con un porcentaje de descuento superior, pero al cambiar el fondo del campo Descuento también se cambiaba el fondo de todas las filas que el usuario podía visualizar. Para definir un formato condicional, en primer lugar abra el formulario que necesita modificar en Vista diseño. Supongamos que utilizamos el siguiente formulario.

Podríamos utilizar el subformulario que aparece dentro del formulario Pedidos. Haga clic en el campo Descuento, y a continuación elija Formato condicional en el menú Formato para visualizar el cuadro de diálogo mostrado a continuación.

En el recuadro Formato predeterminado, puede observar el formato definido actualmente para el control. Puede utilizar los botones Negrita, Cursiva, Subrayado, Color de fondo o de relleno, color de fuente o de primer plano y habilitado para modificar el valor predeterminado. Cuando abre este cuadro de diálogo por primera vez,

Page 55: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

54

Access visualiza solamente una Condición 1 en blanco. En el cuadro combinado situado más a la izquierda, puede seleccionar El valor del campo es, para comprobar un valor en el campo, La expresión es, para crear una expresión lógica que pueda comprobar otros campos en el formulario o comparar otro campo con este, y El campo tiene foco, para definir los ajustes del control que serán heredados cuando el usuario haga clic en el control. Cuando elige El valor del campo es, cómo se muestra en la primera condición de la anterior ilustración, el segundo cuadro de diálogo ofrece opciones para la comparación lógica como por ejemplo Menor que, Igual a, o Mayor que. Elija la comparación lógica que desee y, a continuación, introduzca el valor con el que será comparado el campo en el cuadro de texto situado a la derecha. Establezca las propiedades de formato que desea que el control adopte si la comprobación es cierta a través de los botones que se muestran a la derecha. Para definir comprobaciones adicionales, pulse el botón Agregar situado en la parte inferior del cuadro de diálogo. Cada vez que pulsa este botón, Access visualiza una fila adicional para la definición de una nueva Condición. En la segunda fila y las subsiguientes podrá elegir El valor del campo es o La expresión es en el cuadro combinado situado más a la izquierda. En el ejemplo mostrado en la anterior ilustración, ha sido introducida dentro de la condición 2 una expresión para comprobar si el valor de Cantidad es mayor que 2. Cuando esta condición se cumple, el ajuste establecido indica a Access que el valor será visualizado en Negrita y Cursiva. Tenga en cuenta que Access comprueba las condiciones comenzando por la primera y se detiene en el instante en que una condición se cumple.

Introducción de controles ActiveX – el control Ficha. Como puede observar, un subformulario es una excelente forma de crear un formulario que permita editar información de la parte “uno” de una relación en el formulario principal mientras se editan los datos de la parte “varios” de una relación en la ventana del subformulario. El diseño de un subformulario es muy simple cuando se trata de una relación uno a varios, pero ¿Qué se puede hacer cuando posee varias relaciones o muchos datos que desea tratar en un formulario que debe ajustarse en una única “página” en la pantalla?. Access proporciona un control ActiveX denominado Ficha que permite colocar varios controles en fichas individuales dentro de un formulario. Los controles de una ficha pueden ser tan complejos como subformularios o tan simples como cuadros de texto El trabajo con el control Ficha es bastante simple. Si lo desea, puede comenzar con un formulario en columnas sencillo creado por el Asistente para formularios. Utilice una consulta como Origen del registro y reserve un espacio en la parte inferior del

Page 56: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

55

formulario para añadir un control ficha. Para diseñar un control que permita ver de forma alternada la información contenida en cada uno de los campos, siga los siguientes pasos:

Pulse el botón de herramienta Control ficha en el cuadro de herramientas y arrastre un área en el formulario con las medidas de ancho y alto que desee. Access muestra un control ficha básico con dos fichas definidas. Abra la hoja de propiedades y establezca la propiedad Ancho fijo de la ficha para introducir la medida.

Mientras el control ficha posee el enfoque, seleccione Página de control ficha en el menú Insertar, como se muestra a continuación. Access añadirá una tercera ficha al control.

Access siempre inserta las nuevas fichas delante de la ficha actualmente seleccionada. Si desea colocar la nueva ficha al final del orden de las fichas, puede seleccionar la ficha y establecer su propiedad Índices de páginas. Otra forma de establecer la secuencia de ficha es haciendo clic con el botón derecho del ratón sobre el control y después elegir Orden de las páginas en el menú contextual para visualizar el siguiente cuadro de diálogo. Seleccione una ficha y desplácela hacia arriba o hacia abajo hasta conseguir la secuencia deseada.

Page 57: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

56

Seleccione la primera ficha y establezca la propiedad Título en la hoja de propiedades a Categorías.

Seleccione la segunda ficha y establezca la propiedad Título a Autores (siguiendo nuestro ejemplo)

Seleccione la tercera ficha y establezca la propiedad Título a Notas. Seleccione la ficha Categorías para que sea visualizada en primer plano. Haga clic en el control Subformulario en el cuadro de herramientas y establezca la propiedad Etiquetado automático a No. Añada un control subformulario en la ficha Categorías, establezca su propiedad Objeto origen a (dependiendo del subformulario que desee insertar). Siguiendo nuestro ejemplo, podríamos insertar el subformulario fsubEjempCategoríasLibro y podríamos establecer las propiedades Vincular campos secundarios y Vincular campos principales a NúmeroISBN. Si lo desea, también puede arrastrar el subformulario desde la ventana Base de datos y soltarlo sobre la ficha.

Siguiendo nuestro ejemplo, podríamos hacer clic en la ficha Autores y añadir el formulario fsubEjempAutoresLibro a esta ficha como un subformulario. Asegúrese de establecer las propiedades de unión del control subformulario a NúmeroISBN

Siguiendo nuestro ejemplo, podríamos hacer clic en la ficha Notas para que se vea visualizada en primer plano. Arrastre el campo Notas desde la lista de campos, suéltelo en esta ficha y elimine la etiqueta asociada.

Un formulario para la edición de libros que hace uso del control ActiveX ficha.

Page 58: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

57

Ajuste la posición y el tamaño de los controles en cada ficha. Establezca cada propiedad a las medidas deseadas. Seleccione cada control, abra el menú Formato, seleccione Tamaño y después elija Ajustar en el submenú.

En nuestro ejemplo, el resultado podría ser el que se muestra en la siguiente ilustración.

Observe que al hacer clic en cada ficha en vista Diseño se visualizan los controles que han sido almacenados en esta ficha. Active la Vista formulario para ver el formulario en acción.

Creación de formularios de varias páginas. Microsoft Access facilita la visualización de gran cantidad de información relacionada sobre un tema en un único formulario utilizando una consulta como origen del formulario o visualizando la información relacionada en un subformulario. Si tiene demasiada información como para que pueda ser incluida en un solo formulario que ocupe la totalidad de la pantalla, puede utilizar el control ActiveX ficha, o bien se puede dividir el formulario en varias “páginas”. La longitud máxima que podemos utilizar para la creación de un formulario es de 22 pulgadas lógicas. Si está trabajando con una pantalla con una resolución de 640 * 480 píxeles, no podrá visualizar más de 3 pulgadas lógicas verticalmente de forma simultánea. Si la información que mostramos en el formulario no se ajusta a esa altura de diseño, puede dividir el formulario en varias páginas utilizando el control Salto de página. Para la creación de un formulario de varias páginas, se debe tener en cuenta que todas las páginas posean la misma altura. Además, el control salto de página debe estar situado en un área horizontal. Si al diseñar el formulario, el control salto de página se solapa sobre otros controles, sus datos podrían ser visualizados en los límites de la página.

El control ficha completado en vista Diseño.

Page 59: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

58

También hay que prestar una especial atención al establecer la propiedad del formulario Ajuste de tamaño automático a Sí, ya que Access modifica el tamaño del formulario a la página de mayor tamaño. Si todas las páginas no poseen el mismo tamaño, el movimiento a través de ellas haciendo uso de las teclas AvPág y RePág será discontinuo. Supongamos que tenemos un formulario de varias páginas llamado fEjempAutores.

Si abre el formulario en Vista Diseño y selecciona la sección de Detalle del formulario, podríamos ver la altura correspondiente a ésta área (en nuestro ejemplo sería de 15 cm.). Si hace clic en el control Salto de página, podrá comprobar la distancia de la parte superior de la página (en nuestro ejemplo, 7,619 cm).

En nuestro ejemplo, cuando se encuentre en la parte inferior del control Bio en la segunda página del formulario y pulse la tecla AvPág, se desplazará a la segunda página del siguiente registro. Verá que cierta información clave (como por ejemplo, el nombre del autor) ha sido duplicada en la segunda página de forma que pueda conocer en todo momento el registro que está siendo editado.

Control salto de página

Page 60: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

59

Una propiedad clave para el correcto funcionamiento de los formularios de varias páginas es la propiedad Ciclo. En este formulario de ejemplo, la propiedad Ciclo está establecida a Página activa. Otras opciones son Todos los registros (el valor predeterminado) y registro activo. Si no establece la propiedad Ciclo a Página activa, deberá colocar el primer y último control en una página que pueda recibir el enfoque exactamente en el límite de la página. Si no lo hace, el formulario sólo se desplaza parcialmente una página hacia abajo cuando el punto de inserción se encuentra en el último registro de una página y pulsa TAB para pasar al primer control de la siguiente página. Para crear un salto de página haga un clic con el botón izquierdo del mouse al botón de la barra de herramientas Cuadro de herramientas.

Enlace de formularios con botones de mandato. Una de las características más sobresalientes de Access es su habilidad para activar macros o procedimientos en Visual Basic cuando se producen eventos en los formularios. Por ejemplo, Nos podría interesar pasar de un formulario a otro. Para conseguirlo de una manera fácil, se podría crear en uno de los formularios una serie de botones para facilitar la tarea. Podemos crearlos mediante el uso de Asistentes para controles, sin tener la necesidad de entrar en Visual Basic, ya que Access programa para nosotros (VBA).

Añadir un botón de mandato. Para crear un botón de mandato en un formulario, deberá abrirlo en vista Diseño. Asegúrese de que se encuentra presionado el botón Asistentes para controles en el cuadro de herramientas. Pulse el botón de herramienta Botón de comando y sitúe el ratón el encabezado del formulario Transcurrido un instante, se iniciará el Asistente para botones de comando y se visualiza la primera ventana como puede observar en la siguiente ilustración.

Page 61: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

60

Supongamos que deseamos abrir un formulario relacionado, seleccione Operaciones con formularios en la lista Categorías y elija Abrir formulario en la lista Acciones. Pulse el botón Siguiente para pasar al siguiente paso. En la segunda ventana, seleccione el formulario que le interese.

Pulse el botón Siguiente para continuar. En la tercera ventana, seleccione la opción Abrir el formulario y buscar los datos específicos que se van a mostrar. Pulse el botón Siguiente para ver la cuarta ventana del asistente, mostrada en la siguiente ilustración.

Siguiendo nuestro ejemplo, seleccionaríamos el campo IDClub en ambas listas y después pulsaríamos el botón rotulado con una flecha de dos direcciones situado entre

La primera ventana del Asistente para botones de comando.

Page 62: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

61

las listas para establecer la relación. Nótese que el asistente está limitado a abrir un formulario relacionado en un determinado registro basándose en el valor de un único campo relacionado. Pulse el botón Siguiente para visualizar la quinta ventana. Aquí puede optar por introducir un título para el botón de mandato o especificar un archivo de imagen de mapa de bits. Pulse el botón Siguiente. En la sexta ventana, especifique un nombre para el control Botón de mandato y pulse el botón Finalizar para hacer que el asistente añada el botón y el código Visual Basic necesario en su formulario para crear el enlace. Puede ver el resultado en la siguiente ilustración.

Como puede observar, ha sido añadido un ajuste para la propiedad Texto de Ayuda del control para ofrecer un indicio sobre la acción que realiza el botón cuando coloca el puntero sobre el botón de mandato sin presionar el botón del ratón. Active la Vista formulario para ver el resultado mostrado en la siguiente ilustración.

En el momento de hacer un clic con el botón izquierdo del mouse en el botón de mandato, se abrirá el formulario correspondiente. En nuestro ejemplo, se abre el formulario Contratos.

Page 63: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

62

Diseño de informes avanzados.

Creación de una consulta para un informe complejo. Puesto que los informes tienden a recopilar información procedente de varias tablas, es aconsejable empezar la construcción de un informe con el diseño de una consulta que recoja los datos necesarios para el informe. Imagínese que tuviéramos una base de datos llamada Calendario de Entretenimientos, podríamos necesitar información procedente de las tablas tblClubs, TblContratos y tblComisiones. Podríamos abrir una nueva ventana Consulta en vista Diseño y añadir estas tablas a la consulta. La consulta podría aparecer como se muestra en la siguiente ilustración.

Page 64: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

63

Definición de criterios de ordenación y agrupamiento.

Lo primero que necesitamos hacer es definir los criterios de ordenación y agrupamiento para el informe. Pulse el botón Ordenar y Agrupar de la barra de

herramientas para abrir la ventana del mismo nombre. Siguiendo nuestro ejemplo, este informe visualizará los datos del contrato y de la comisión clasificados por grupo, y después por mes, con las líneas de detalle mostrando los datos del contrato y la comisión semanal procedentes de la consulta. Siguiendo nuestro ejemplo, podríamos seleccionar el campo NombreGrupo en la primera línea de la ventana Ordenar y Agrupar, y después podríamos establecer la propiedad Pie del grupo a Sí. Nótese que cuando establece la propiedad Encabezado del grupo o la propiedad Pie del grupo a Sí para cualquier campo o expresión en la ventana Ordenar y Agrupar, Microsoft Access muestra un símbolo de agrupamiento en el selector de fila para esa fila. Access, además, añade una sección apropiada al informe. Puesto que deseamos asegurarnos que un encabezado de grupo no quede huérfano en la parte inferior de una página, establezca la propiedad Mantener juntos a Con el primer detalle. Además, podemos indicar a Access que intente mantener todos los detalles para este nivel de agrupamiento en una página estableciendo la propiedad Mantener juntos a Grupo entero. Al hacer esto, Access desplaza a una nueva página todos los detalles del siguiente grupo si no pueden ser colocados en la página actual. Puesto que sabemos que muchos de los grupos poseen demasiadas filas como para que quepan en una única página, puede establecer la propiedad Mantener juntos a Grupo entero. Como podemos ver un poco más adelante las secciones del informe además disponen de propiedades que pueden establecerse para que cada vez que comience un nuevo grupo, sea colocado en una nueva página. Siguiendo nuestro ejemplo, nos podría interesar que el campo SemanaInicio de la consulta devolviese la fecha del lunes para cada semana en la que se encuentra vigente cada contrato. Sin embargo, los pagos de la comisión se liquidan al final de la semana. Además, nos podría interesar que este informe proporcione los subtotales por mes, aunque los meses deberían estar agrupados en función de las fechas cuando los pagos se efectúen. Para asegurar un correcto agrupamiento, podríamos especificar una expresión en la ventana Ordenar y agrupar. Si SemanaInicio es siempre lunes, entonces [SemanaInicio]+6 deberá ser el Domingo al final de la semana. Podríamos escribir la expresión en la columna Campo / expresión precedida por un signo (=), y establecer la propiedad Pie de grupo a Sí y la propiedad Agrupar en a Mes. Finalmente nos podría interesar ordenar las filas de detalle por la fecha de final de semana escribiendo =[SemanaInicio]+6 de nuevo en la columna Campo/Expresión (pero sin cambiar ninguna de las propiedades de agrupamiento).

Page 65: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

64

Aunque la consulta conContratoPagadoActivo posea criterios de ordenación, deberá definir el criterio de ordenación que desee en la definición del informe. Los informes ignoran cualquier especificación de ordenación de la consulta de origen si define algún criterio en la ventana Ordenar y agrupar.

Establecer rangos de grupos según el tipo de datos. Podemos definir las propiedades Agrupar en e Intervalo del grupo para cada campo o expresión en la parte superior de la ventana Ordenar y agrupar. Si deseamos comenzar una nueva agrupación de datos siempre que el valor del campo o expresión cambie. Sin embargo, podemos especificar que comience una nueva agrupación siempre que un campo o una expresión cambie en función de un rango de valores. La clase de rango que podemos especificar varía según el tipo de datos del campo o expresión. Para agrupar campos de texto, podemos indicar a Access que comience un nuevo grupo cuando se produzca un cambio en el valor de uno o más caracteres al comienzo de la cadena. Por ejemplo, podría crear un nuevo grupo basándose en un cambio de la primera letra del campo (en lugar de cualquier otro cambio en el campo) para crear un grupo por cada una de las letras del alfabeto. Para llevar a cabo una agrupación basada en los primeros caracteres, establezca a Primeros caracteres la propiedad Agrupar en, y establezca la propiedad Intervalo del grupo al número deseado de caracteres de comienzo de la cadena que diferenciará cada grupo.

Para utilizar la función Ordenar y agrupar, deberá tener visualizado un informe en Vista Diseño

Page 66: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

65

Para agrupar campos numéricos, podemos establecer la propiedad Agrupar en a Intervalo. Al seleccionar este parámetro, se puede introducir un ajuste para la propiedad Intervalo del grupo que reúna los diversos valores que entran dentro de un rango. Access calcula los rangos partiendo de cero. Por ejemplo, si selecciona 10 como valor para el intervalo, veremos grupos para los valores comprendidos entre –20 y –11, entre -10 y –1, entre 0 y 9, entre 10 y 19, y así sucesivamente. Para los campos de fecha/hora, podemos establecer la propiedad Agrupar en con subdivisiones de fecha u hora y múltiplos de esas subdivisiones, tales como Año, Trimestre, Mes, Semana, Día, Hora y Minuto. Si desea realizar la agrupación basándose en un múltiplo de la subdivisión, incluya un parámetro en la propiedad Intervalo del grupo. Por ejemplo, si desea crear grupos para periodos de dos años, establezca a Año la propiedad Agrupar en y la propiedad Intervalo del grupo a 2.

Creación de informes por grupo. Una vez definidos los grupos, podemos comenzar a diseñar un informe. Antes de seguir adelante, seleccione la orden Guardar como del menú Archivo. Siguiendo nuestro ejemplo, podríamos guardar el informe con el nombre infMiEstadoContratoGrupo. Para crear el informe básico siga los siguientes pasos:

Seleccione Configurar página en el menú Archivo para abrir el cuadro de diálogo que lleva el mismo nombre. Seleccione la ficha Página y establezca la orientación de la página a Horizontal. Seleccione la ficha márgenes y establezca una medida a los márgenes Superior, Inferior, Izquierdo y Derecho y pulse el botón Aceptar para cerrar el cuadro de diálogo Configurar página.

Coloque una etiqueta en el encabezado de página y escriba por ejemplo Estado de contrato por grupo. Seleccione la etiqueta y utilice la barra de herramientas para establecer las características de la fuente. También podría elegir la orden Tamaño del menú Formato y, a continuación, elegir Ajustar en el submenú para ampliar la etiqueta de forma que quepa el texto. Para mejorar el aspecto de

Page 67: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

66

nuestro informe, podríamos añadir un control línea a la sección Encabezado de página.

Si fuese necesario pulse el botón de herramienta Etiqueta en el cuadro de herramientas, abra la hoja de propiedades y compruebe que la fuente predeterminada es Times New Roman con un tamaño de 10 puntos y un espesor de la fuente Negrita. Pulse el botón de herramienta Cuadro de texto en el cuadro de herramientas y compruebe que las propiedades predeterminadas son: Fuente Times New Roman, Tamaño de la fuente 10, Espesor de la fuente Normal, Etiquetado automático Sí y Agregar dos puntos No.

Siguiendo nuestro ejemplo, abriríamos la lista de campos y arrastraríamos los siguientes campos a la sección de Detalle: NombreGrupo, NúmContrato, NombreClub, SemanaInicio, EstadoContrato, CantidadDebida y CantidadPagada.

Podríamos seleccionar todas las etiquetas de los controles que acabamos de crear en la sección de Detalle y después utilizar la orden de Copiar en el menú Edición para que sean colocadas en el Portapapeles. Haga clic en la sección Encabezado de página y utilice la orden Pegar en el menú Edición para colocar las etiquetas en esta sección. Podríamos seleccionar todas las etiquetas de encabezado de columna, elegir la orden Alinear del menú Formato y después elegir Arriba en el submenú para alinear la parte superior de los controles. Podríamos ajustar el grupo completo verticalmente de modo que los controles de cuadro de texto estén espaciados entre las dos filas de controles de línea.

En la sección Detalle, desplace todos los controles de cuadro de texto de modo que queden alineados debajo de sus respectivas etiquetas a lo largo del borde superior de la sección.

Page 68: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

67

Podríamos cambiar el título de la etiqueta Cantidad debida a Comisión debida y el título de la etiqueta Cantidad pagada a Comisión pagada.

Cuando pulse el botón Vista preliminar de la barra de herramientas, el resultado debería ser similar al mostrado en la siguiente ilustración.

Ajuste de las propiedades del informe y de la sección. Probablemente habrá observado que Microsoft Access posee una hoja de propiedades para cada sección de la ventana Informe en vista Diseño. Podemos establecer las propiedades no sólo para controlar la apariencia de la sección sino para controlar que Access intente mantener un grupo de manera conjunta o inicie una página antes o después del grupo. También existe una hoja de propiedades para el informe completo. En este momento, no es necesario cambiar ninguna de estas propiedades.

La parte superior izquierda del informe Estado del contrato por grupo en Vista Diseño.

El informe Estado del contracto por grupo en Vista preliminar

Page 69: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

68

Propiedades de la sección. Cuando hace clic en cualquier área de alguna de las secciones de grupo o en la sección de Detalle de un informe, y después pulsa el botón Propiedades, Access visualizará una hoja de propiedades, tal como se muestra en la siguiente ilustración.

Propiedad Descripción Nombre Access genera automáticamente un nombre único para la

sección Forzar nueva página Establezca esta propiedad a Antes de la sección para obligar a

que se imprima esta sección al principio de una nueva página. Establezca esta propiedad a Después de la sección para obligar a que la siguiente sección se imprima al principio de una nueva página.

Nueva fila o columna Cuando se utiliza el cuadro de diálogo Configurar página para dar formato al informe con más de una columna (vertical) o más de una fila (Horizontal) de secciones, podemos establecer esta propiedad a Antes de la sección, Después de la sección o Antes y Después para obligar a que Access genere de nuevo la sección al principio o al final o en ambas partes de una nueva columna o fila. Esta propiedad es útil para obligar a que los encabezados se impriman de nuevo al principio de cada columna en un informe de varias columnas.

Mantener juntos Establezca esta propiedad a No para permitir que Access continúe con una sección más allá de los límites de la página. El valor predeterminado es Sí , indica a Access que mantenga todas las líneas que pertenecen a una sección juntas en una página. Podemos indicar a Access que trate de mantener las líneas con encabezados y pies de grupo juntos estableciendo la propiedad Mantener juntos a Sí

Una hoja de propiedades para una sección del informe

Page 70: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

69

Propiedad Descripción Visible Establezca esta propiedad a Sí para hacer que la sección esté

visible o a No para que la sección no esté visible. Esta propiedad es adecuada para activarla desde una macro o desde un procedimiento en Visual Basic mientras Access da formato e imprime el informe. Podemos hacer que las secciones desaparezcan, dependiendo de los valores de los datos en el informe.

Autoextensible Access establece esta propiedad a Sí cuando se incluye algún control en la sección que también tiene su propiedad Autoextensible establecida a Sí. Esta propiedad permite que la sección se extienda para acomodar los controles que podrían ampliarse debido a que, por ejemplo, visualizan campos memo o cadenas de texto de gran longitud. Podemos diseñar un control para visualizar una línea de texto, aunque deberíamos permitir que el control se extienda para visualizar más líneas de texto cuando sea necesario.

Autocomprimible Esta propiedad es similar a Autoextensible. Puede establecer esta propiedad a Sí para permitir que la sección sea más pequeña en caso de que los controles de esta sección ocupasen un tamaño menor para acomodar menos texto.

Alto Esta propiedad define la altura de la sección. Normalmente cambiará esta propiedad arrastrando el borde inferior de la sección. Si desea una determinada altura, puede introducirla aquí, y Access cambiará la visualización para que todos los controles puedan ser ajustados dentro de la altura definida.

Color del fondo Para la mayoría de los informes, el color de fondo de una sección será el valor RGB de color blanco (16,777,215). Es mejor hacer uso de la barra de herramientas Formato para ajustar este valor a un color estándar distinto de blanco. También puede seleccionar un valor de color personal haciendo clic en la propiedad y, a continuación, pulsando el botón Generar (…) situado junto al recuadro de la propiedad para abrir el cuadro de diálogo de configuración de color.

Efecto especial Para la mayoría de los informes, debería utilizar un efecto sin relieve. También puede establecer un efecto en relieve o hundido para una sección en la barra de herramientas Formato o seleccionando este efecto a partir de la lista desplegable de la propiedad.

Información adicional Utilice esta propiedad para almacenar una información de identificación adicional sobre la sección. Podemos utilizar esta propiedad en las macros y procedimientos en Visual Basic para almacenar temporalmente información que deseamos pasar a otra rutina.

Al dar formato Introduzca el nombre de una macro o un procedimiento en Visual Basic que desee que Access ejecute cuando éste empiece a dar formato a esta sección.

Page 71: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

70

Propiedad Descripción Al imprimir Introduzca el nombre de una macro o procedimiento en Visual

Basic que desee que Access ejecute cuando éste comienza la impresión de esta sección o cuando se visualiza la sección en Vista preliminar.

Al retirarse Introduzca el nombre de la macro o procedimiento en Visual Basic que desee que Access ejecute cuando éste tenga que volver a la sección anterior después de encontrar que la sección no puede ser incluida en la página actual y la propiedad Mantener juntos ha sido establecida a Sí. Este evento ocurre después de Al dar formato, pero antes de Al imprimir, de modo que puede utilizar esta propiedad para deshacer la configuración de las propiedades que se hayan cambiado en la rutina Al dar formato. Access llama Al dar formato de nuevo cuando éste da formato a la sección en una nueva página.

Para los encabezados y pies de página, solamente están disponibles las propiedades Nombre, Visible, Alto, Efecto especial, Color del fondo, Información adicional, al dar formato y Al imprimir.

Propiedades del informe.

Si elige la orden Seleccionar informe del menú Edición (o hace clic más allá del borde derecho de la sección de Detalle) y después pulsa el botón Propiedades, Access visualiza las propiedades del informe en la hoja propiedades, como se muestra en la ilustración.

Page 72: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

71

Propiedad Descripción Origen del registro Esta propiedad visualiza el nombre de la tabla o consulta que

proporciona los datos para el informe. Filtro Esta propiedad muestra cualquier filtro heredado de la

propiedad Origen del registro o aplicado por una macro o procedimiento en Visual Basic, la última vez que fue abierto el informe.

Activar filtro Establezca esta propiedad a Sí si desea que el filtro definido para el informe sea automáticamente aplicado cada vez que abra el informe. Nótese que puede establecer las propiedades Filtro y Activar filtro desde una macro o procedimiento en Visual Basic.

Ordenar por Esta propiedad muestra cualquier criterio de ordenación heredado de la propiedad Origen del registro o aplicado por una macro o un procedimiento en Visual Basic, la última vez que fue abierto el informe.

Activar orden Establezca esta propiedad a Sí si desea que la propiedad Ordenar por para el informe sea aplicada cada vez que abre el informe. Nótese que puede establecer las propiedades Ordenar por y Activar orden desde una macro o procedimiento en Visual Basic. Recuerde que Ordenar por y Activar orden no tendrán efecto si ha especificado algún ajuste en la ventana Ordenar y agrupar.

Título Utilice esta propiedad para introducir el texto que aparecerá en la barra de título cuando se abra el informe en Vista preliminar.

Bloqueos del registro Establezca esta propiedad a Todos los registros, si los datos de su informe se encuentran en un servidor compartido por otros usuarios y desea asegurar que ningún usuario pueda actualizar los registros en el informe hasta que Access cree todas las páginas del informe. No debería establecer esta propiedad a todos los registros para un informe que planifique visualizar en Vista preliminar ya que impedirá que otros usuarios puedan visualizar el informe en su pantalla

Encabezado de página Esta propiedad controla si el encabezado de página aparecerá a todas las páginas. Es posible indicar que no se imprima el encabezado de página en la primera y última página si estas páginas contienen un encabezado o pie del informe.

Pie de página Esta propiedad controla si debe aparecer el pie de página en todas las páginas. Es posible indicar que no se imprima el pie de página en la primera y última página si estas páginas contienen un encabezado o pie de informe.

Agrupación de fechas Utilice esta propiedad para determinar la forma en que Access agrupará las fechas y las horas que hemos especificado en la ventana Ordenar y agrupar. Las dos opciones disponibles para establecer esta propiedad son: Predeterminado para EE.UU y Usar opciones del sistema.

Page 73: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

72

Propiedad Descripción Mantener junto el grupo

Establezca esta propiedad a Por página si desea que Access considere la propiedad Mantener juntos de la ventana Ordenar y agrupar. Establezca esta propiedad a Por columna para un informe de varias columnas si desea que Access intente mantener unido un grupo dentro de una columna.

Ancho Esta propiedad es establecida por Access cuando modificamos la anchura del informe en la cuadrícula de diseño.

Imagen, Tipo de imagen

Para estas propiedades, introduzca el nombre del archivo y la ruta de acceso completa del mapa de bits que desee utilizar como fondo para el informe. Si establece la propiedad Tipo de imagen a Incrustado, Access copia el mapa de bits en el objeto Informe y establece a (mapa de bits) la propiedad Imagen. Si establece la propiedad Tipo de imagen a Vinculado, Access utiliza la ruta de acceso almacenada en la propiedad Imagen para cargar el mapa de bits cada vez que abre el informe. Las propiedades Imagen y Tipo de imagen también están disponibles en los formularios.

Modo de tamaño de la Imagen

Cuando la imagen de fondo no tiene el mismo tamaño que su página, se puede establecer la propiedad Modo de tamaño de la imagen para ajustar el tamaño. El ajuste Recortar visualiza la imagen en su tamaño original, y si la página es más pequeña que la imagen, Access recorta los bordes derecho e inferior de la imagen. El ajuste Zoom mantiene el ratio del aspecto o alarga la imagen hasta su máxima extensión para que se ajuste a la página. Si su imagen no tiene el ratio de la misma dimensión horizontal y vertical que su página, Access podría mostrar algún espacio en blanco en el borde derecho o inferior de la página. El ajuste Extender amplía la imagen para ajustar el tamaño de la página y podría distorsionar la imagen si el ratio original de la imagen no coincide con el ratio de la página.

Distribución de la imagen.

Cuando establezca la propiedad Modo de tamaño de la imagen a Recortar, Puede utilizar la propiedad Distribución de la imagen para colocar la imagen en el centro de la página o en una de las esquinas antes de que la imagen sea recortada.

Mosaico de imágenes Cuando establezca la propiedad Modo de tamaño de la imagen a Recortar y su imagen sea más pequeña que el tamaño de la página, puede establecer la propiedad Mosaico de imágenes a Sí, de modo que Access coloque varias copias de la imagen a lo ancho y a lo largo de la página.

Páginas de la imagen. Puede establecer esta propiedad para mostrar la imagen en Todas las páginas, Primera página o Ninguna página.

Barra de menús. Introduzca el nombre de una barra de menús personal o el nombre de la macro que define una barra de menús personal. Access visualizará la barra de menús cuando se abra el informe en Vista preliminar.

Page 74: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

73

Propiedad Descripción Barra de herramientas Introduzca el nombre de una barra de herramientas personal.

Access visualizará la barra de herramientas cuando abra el informe en Vista preliminar.

Barra de menús contextuales.

Introduzca el nombre de un menú contextual personal o el nombre de la macro que define un menú contextual personal. Access visualizará la barra de menús cuando abra el informe en Vista preliminar y haga clic con el botón derecho del ratón en la ventana Informe.

Línea X, Línea Y Especifican el número de divisiones horizontales (X) o verticales (Y) por pulgada o por centímetro para los puntos en el área de diseño del informe. Cuando utilicemos la medida en pulgadas (debido a que se encuentra establecido Inglés [Estados Unidos] en la sección Configuración regional del Panel de control de Windows), podremos ver los puntos siempre que elijamos un valor igual a 24 o inferior para X y para Y. En caso de que la medida sea en centímetros (cuando el ajuste Sistema de medida esté establecido a Métrica), podremos ver los puntos cuando elijamos un valor igual a 9 o inferior.

Diseño a imprimir Si esta propiedad se establece a Sí, elegiremos entre varias fuentes de impresora y TrueType en el diseño. Si está establecida a No, estarán disponibles las fuentes de pantalla

Impresión láser rápida Algunas impresoras láser soportan el trazado de líneas (como por ejemplo, los bordes de los rectángulos, el control de línea o los bordes de los cuadros de texto) con las reglas. Si establece Impresión láser rápida a Sí, Access envía las órdenes de la regla en lugar de los gráficos a la impresora para imprimir las reglas. Las reglas se imprimen más rápido que los gráficos

Archivo de Ayuda, Id del contexto de Ayuda

Puede configurar la propiedad Archivo de ayuda para indicar cualquier formato de archivo de Ayuda soportado por Windows y Office 2000, incluyendo el nuevo formato de ayuda HTML. Utilice la propiedad Id del contexto de Ayuda para indicar un determinado tema de la ayuda dentro del archivo.

Origen de la paleta Si dispone de una impresora en color, puede especificar un archivo de mapa de bits de dispositivo independiente (dib), un archivo de Paleta de Microsoft Windows (pal) o un archivo de mapa de bits de Windows (bmp) para proporcionar una paleta de colores diferentes de los predeterminados de Access.

Información adicional. Utilice esta propiedad para almacenar una información de identificación sobre el informe. Puede utilizar esta propiedad en macros y procedimientos en Visual Basic para almacenar temporalmente la información que deseamos pasar a otra rutina.

Al abrir Introduzca el nombre de la macro o procedimiento en Visual Basic que desea que Access ejecute cuando se inicie la impresión de este informe o cuando se visualice en Vista preliminar

Page 75: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

74

Propiedad Descripción Al cerrar Introduzca el nombre de la macro o procedimiento en Visual

Basic que desea que Access ejecute cuando se cierra la Vista preliminar o cuando Access termine de enviar el informe a la impresora.

Al activar Introduzca el nombre de la macro o procedimiento en Visual Basic que desea que Access ejecute cuando se active la ventana informe en Vista preliminar. Esta propiedad proporciona un método apropiado para abrir una barra de menús o barra de herramientas personal.

Al desactivar Introduzca el nombre de la macro o procedimiento en Visual Basic que desea que Access ejecute cuando la ventana informe pierde el enfoque en Vista preliminar. Esta propiedad proporciona un método apropiado para cerrar una barra de menús o barra de herramientas personal.

Al no haber datos Introduzca el nombre de una macro o procedimiento en Visual Basic que desea que Access ejecute cuando el informe se abre pero el origen del registro no contiene datos.

Al paginar Introduzca el nombre de una macro o procedimiento en Visual Basic que desee que Access ejecute cuando todas las secciones de una página poseen un formato pero todavía no ha sido impresa. En Visual Basic, puede utilizar métodos especiales para trazar gráficos personales en la página.

Al ocurrir un error Introduzca el nombre de la macro o procedimiento en Visual Basic que desee que Access ejecute cuando se produce cualquier error en el informe.

Tiene un módulo asociado

Esta propiedad indica si el informe posee un módulo de clase Visual asociado. Un módulo de clase es un módulo Visual Basic que ha sido especificado para un único formulario o informe.

Uso de valores calculados. Gran parte de la potencia de los informes de Microsoft Access procede de la posibilidad de realizar tanto cálculos sencillos como complejos sobre los datos de la tabla o consulta subyacente. Access, además, ofrece docenas de funciones incorporadas que podemos utilizar para operar con los datos o para añadir información a nuestro informe.

Adición de la fecha de impresión y el número de página. La información que probablemente se añade con más frecuencia a un informe es la fecha en la que ha sido preparado el informe. Probablemente también desee añadir los números de página.

Page 76: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

75

Para las fechas, Access proporciona dos funciones incorporadas que podemos utilizar para añadir la fecha y hora actual del informe. La función Fecha() da por resultado la fecha actual del sistema como una variable de tipo Fecha/Hora sin el componente de la hora. La función Ahora() da por resultado la fecha y la hora actual del sistema como una variable de tipo Fecha/Hora. Para añadir la fecha actual al informe, cree un control de cuadro de texto independiente en el Encabezado de página y establezca su propiedad Origen del control a = Ahora(). Seguidamente, elija un parámetro de Fecha/Hora para el cuadro de la propiedad Formato. Regrese al informe y escriba un título más significativo para la etiqueta, o borre la etiqueta si no desea un título. En la siguiente ilustración podemos ver un ejemplo del uso de la función Ahora.

El resultado en Vista preliminar se muestra en la siguiente ilustración.

Para añadir un número de página, utilice la propiedad del informe denominada Página. No es probable que podamos ver esta propiedad en cualquiera de las hojas de propiedades, ya que se trata de una propiedad mantenida por Access. Access, además, proporciona la propiedad Páginas, que contiene un contador del número total de páginas del informe.

Page 77: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

76

Para añadir el número de página actual a un informe, cree un control de cuadro de texto independiente y establezca su propiedad Origen del control a =” Página “ & [Página] & “ de “ & [Páginas], como se muestra en la siguiente ilustración.

Adición de valores a través de un grupo. Otra de las tareas más comunes en un informe es la adición de valores a través de un grupo. Supongamos que hemos creado un informe llamado Estado del contrato por grupo, como se muestra en la siguiente ilustración.

En el informe Estado de contrato por grupo tenemos dos niveles de agrupamiento: un nivel por grupo y otro nivel por mes dentro de cada grupo. Esto es debido a que cuando especificamos criterios de ordenación y agrupamiento, solicitamos que Access proporcione pies de grupo. Ello proporciona secciones en el informe en las que pueda añadir controles independientes que utilizan cualquiera de las funciones agregadas (Suma, Min, Máx, Promedio, Cuenta, Primero, Último, DesVest o Var) en expresiones para visualizar un valor calculado para todas las filas de ese grupo. En el ejemplo, podemos crear controles independientes en los pies NombreGrupo y = [SemanaInicio]+6 para mantener los totales, por grupo y por mes, para la comisión debida y la comisión pagada

Uso de las propiedades Página y Páginas utilizadas para añadir los números de página a un informe.

Page 78: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

77

Creación de un total general. Utilice la sección Pie del informe para crear totales generales para cualquier valor a través del conjunto de registros completo de un informe. Del mismo modo que en los pies de las dos secciones de agrupamiento, puede utilizar cualquiera de las funciones agregadas en el pie del informe. La siguiente ilustración muestra dos funciones Suma utilizadas en controles del pie del informe.

Si activa la Vista preliminar, se mueve hasta la última página del informe, y se desplaza hacia la parte inferior de la página, podrá ver un resultado similar al mostrado en la siguiente ilustración.

Page 79: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

78

Concatenación de cadenas de texto y omisión de valores redundantes. Es posible que haya notado en algunos de los ejemplos anteriores que algunos campos del informe se imprimen en cada línea de detalle. Cuando una determinada línea de detalle posee valores que coinciden con las líneas anteriores, el informe presenta un aspecto menos legible y profesional. Puede controlar esto utilizando la propiedad Ocultar duplicados (que sólo está disponible en los informes). Supongamos que tenemos un informe en el cual los campos NombreGrupo, NúmContrato y NombreClub se imprimen en cada línea de detalle. Para ocultar los Duplicados active la vista Diseño de este informe y establezca la propiedad Ocultar duplicados a Sí para el cuadro de texto NombreGrupo en la sección de Detalle para imprimir el NombreGrupo en la sección de Detalle para imprimir el nombre del grupo sólo una vez por grupo o página. Cuando Access se desplaza a un nuevo nivel de agrupamiento o página, imprime el nombre del grupo aunque coincida con el valor anteriormente visualizado. Siguiendo nuestro ejemplo, podríamos, además establecer la propiedad Ocultar duplicados para los campos NúmContrato, y NombreClub. Sin embargo, nótese que esta propiedad funciona sobre una base campo por campo. En esta base de datos, un par de grupos tienen más de un contrato para el mismo club en un mes. Si establece la propiedad Ocultar duplicados a Sí para los dos campos de forma independiente, podrá encontrar ocasiones en las que el número del nuevo contrato se imprime pero el nombre del club no se imprime puesto que es el mismo que el de la línea anterior. Debería ser menos confuso ocultar los duplicados para la combinación del número de contrato y el nombre del Club. Para hacer esto, tendrá que utilizar una concatenación de cadena para visualizar los datos de un único control y poder establecer la propiedad Ocultar duplicados. La siguiente ilustración nos muestra una concatenación de cadena de texto como parámetro para la propiedad Origen de control.

La expresión del origen del control que permite establecer la propiedad Ocultar replicados para eliminar los valores duplicados de los campos Número Contrato y NombreClub

Page 80: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

79

Necesitamos eliminar los cuadros de texto NúmContrato y NombreClub, y reemplazarlos con un único cuadro de texto que se extienda por el área cubierta por las dos etiquetas de encabezado de columna. El carácter ámpresand (&) indica una operación de concatenación de tres cadenas de texto. La primera cadena se deriva de la función Formato aplicada al campo NúmContrato para obtener un resultado de seis dígitos. La segunda cadena añade algunos espacios en blanco entre los dos campos de datos. La última cadena es el campo NombreClub del origen del registro. Ahora podrá establecer la propiedad Ocultar replicados de este control a Sí para ocultar los datos redundantes sólo cuando ambos campos NúmContrato y NombreClub sean iguales que en la línea anterior. Otro uso de la concatenación de cadena es la visualización de los datos que aparecen como una etiqueta, pero que además, incluye información procedente del origen del registro. En algunas ocasiones, puede resultar de gran utilidad combinar texto descriptivo con un valor procedente de un campo de texto de la consulta o tabla subyacente, o combinar varios campos de texto en un control. En la siguiente ilustración, podemos ver una etiqueta descriptiva (creada por un único control de cuadro de texto) en una de las líneas de subtotal.

Esta “etiqueta” concatena las palabras Total para con una expresión que utiliza la función Formato aplicada a la fecha de final de semana ([SemanaInicio]+6) para obtener el nombre del mes y el año, y una cadena final que concatena dos puntos, como se muestra en la siguiente ilustración.

Page 81: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

80

En realidad, podría definir una etiqueta seguida por un cuadro de texto seguido por otra etiqueta para crear la misma visualización. La ventaja de utilizar un único control es que no tiene que preocuparse por alinear los tres controles o establecer las características de fuente. Puesto que la cadena de la parte central contiene el mes y el año cuya longitud varía, no podría crear tres controles independientes donde puedan alinearse todos los posibles valores de forma correcta. Como ya habrá imaginado, puede utilizar la misma técnica en el pie del grupo para crear una “Etiqueta” donde se lea Total para el grupo seguida por el nombre del grupo y dos puntos. Sería aconsejable establecer la propiedad Alineación del texto de estos controles a Derecha de modo que sean alineados correctamente junto a los controles de resumen.

Cálculo de porcentajes. En cualquier informe que agrupe o resuma los datos, puede que desee determinar que porcentaje de un total de grupo externo o del total general está representado en una determinada suma. Esto puede realizarse debido a que Access realiza dos pasadas de los datos. En la primera pasada, calcula las expresiones sencillas en las líneas de detalle, efectúa las sumas de los grupos y la suma del informe completo, y calcula la longitud del informe. En la segunda pasa, resuelve cualquier expresión que haga referencia a los totales calculados en la primera pasada. En consecuencia, puede crear una expresión en una sección de resumen de grupo o de detalle que se divida por una suma de un grupo externo o por el total general para hallar porcentajes. En la siguiente ilustración, vemos un ejemplo de un cálculo de porcentajes en la sección PieNombreGrupo.

Las líneas de totales ahora tienen títulos descriptivos que hacen uso de los datos del origen del registro.

Page 82: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

81

La expresión divide la suma del campo CantidadDebida para este grupo y después la divide por el mismo valor en un campo denominado txtTotalDebido. Si observa la sección Pie del informe, encontrará que éste es el nombre del cuadro de texto que contiene el total general para el campo CantidadDebida. Establezca la propiedad Formato a Porcentaje y cambíe a Vista preliminar.

Uso de Suma continua. Además de producir totales para cualquier grupo que haya sido definido, Access permite crear totales continuos dentro de la sección de Detalle. Puede establecer la propiedad Suma continua para cualquier cuadro de texto que visualice un valor numérico de modo que así pueda producir un total que sea iniciado al principio de cada grupo o que continúe hallando el total del informe completo. Siguiendo nuestro ejemplo, podríamos realizar algunos cambios en el informe infEjempEstadoPorGrupoPaso3

Adición de un cálculo para un porcentaje de un total general.

Page 83: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

82

En primer lugar, podríamos cambiar le etiqueta Comisión pagada para que se lea Acum.Comisión Debida y ajustar su tamaño de forma que pueda leerse el título completo. Podríamos eliminar el cuadro de texto CantidadPagada y todos los campos de totales para el grupo y el informe que estén basados en CantidadPagada. Podríamos añadir un cuadro de texto en la sección de Detalle debajo de la etiqueta que acabamos de cambiar. Podríamos establecer su propiedad Origen de control a CantidadDebida, y establecer la propiedad Suma continua del cuadro de texto a Sobre grupo. La siguiente ilustración muestra la apariencia del informe una vez completado estos pasos.

No, se trata de una segunda copia del campo CantidadDebida, esto genera (como el propio nombre de la propiedad indica) una suma continua del campo CantidadDebida dentro de la sección de Detalle. Conforme Access encuentra cada nueva línea en la

Adición de un cálculo de Suma continua para la Cantidad debida.

Page 84: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

83

sección de Detalle, añade el valor actual de CantidadDebida al valor acumulado anteriormente y visualiza el resultado. Puesto que indicó la suma Sobre grupo, Access inicializa el total acumulado cada vez que encuentra un nuevo grupo.

Ventajas del formato condicional. Es posible que desee destacar aquellas cantidades debidas del contrato cuando superan los 50 dólares. Para hacer esto, debería abrir el informe deseado en Vista Diseño. Siguiendo nuestro ejemplo, podríamos abrir el informe infEjempEstadoContrato.

. Podríamos seleccionar el cuadro de texto en la sección de Detalle que visualiza el campo CantidadDebida, y elija Formato condicional en el menú Formato. Access visualizará el cuadro de diálogo Formato condicional, mostrado en la siguiente ilustración.

Del mismo modo que en un cuadro de texto de un formulario puede definir una comprobación para el valor actual del control o introducir una expresión. En este caso, se ha seleccionado El valor del campo es, en el primer recuadro, Mayor que, en el segundo recuadro, y el valor 50 en el tercer recuadro.

Page 85: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

84

Nótese que en la sección de Detalle, puede hacer referencia a cualquier otro campo de la fila actual para crear su expresión. Al crear una expresión de formato condicional en una sección de grupo, la referencia a cualquier campo que se utilice en una expresión utilizará el valor de la fila “Actual”. En un Pie de grupo, por ejemplo, la fila “Actual” es la última fila visualizada en la sección de Detalle anterior. En este ejemplo, se ha solicitado que Access visualice los valores mayores de 50 dólares con letras en Cursiva y en Negrita con las letras en blanco en un fondo gris. Si utiliza una impresora a color, puede elegir cualquier color para visualizar el resultado en la pantalla y cuando se imprima el informe. Al activar la vista preliminar, podrá observar el resultado, como se muestra en la siguiente ilustración.

Añadir potencia con macros. En Microsoft Access, podemos definir una macro para que realice cualquier tarea que pudiese ser incluida con el teclado o con el ratón. La verdadera potencia de las macros de Access es su habilitad para automatizar la respuesta a muchos tipos de eventos sin que sea necesario aprender un lenguaje de programación. Un evento puede ser un cambio en los datos, la apertura o cierre de un formulario o informe, o incluso un cambio de selección de un control a otro. Dentro de una macro, podemos incluir varias acciones y definir condiciones de comprobación de tal modo que se lleven a cabo diferentes acciones dependiendo de los valores de los formularios o informes.

Uso de las macros. Microsoft Access proporciona varios tipos de acciones de macro que podemos utilizar para automatizar una aplicación.

Se pueden utilizar macros para abrir cualquier tabla, consulta, formulario o informe en cualquier modo de visualización disponible. También podemos utilizar una macro para cerrar cualquier tabla, consulta, formulario o informe.

El resultado de la configuración de formato condicional

Page 86: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

85

Se pueden utilizar macros para abrir un informe en Vista preliminar o enviar un informe directamente a la impresora. También puede enviar los datos de salida de un informe a un archivo de formato de texto enriquecido (rtf), un archivo de bloc de notas (txt) o un archivo de Microsoft Excel, y seguidamente abrir el archivo en Microsoft Word, en el Bloc de notas o en Microsoft Excel.

Se pueden utilizar macros para ejecutar una consulta de selección o una consulta de acción. Los parámetros de una consulta pueden estar basados en los controles de cualquier formulario abierto.

Se pueden utilizar macros para basar la ejecución de una acción en cualquier condición que compruebe los valores de la base de datos, de un formulario o de un informe. Puede utilizar macros para ejecutar otras macros o ejecutar funciones Visual Basic. Puede detener la macro actual o todas las macros, cancelar el evento que activo la macro, o salir de la aplicación.

Se pueden utilizar macros para establecer el valor de cualquier control de un formulario o informe. También es posible emular las acciones de teclado y proporcionar una entrada para los cuadros de diálogo del sistema, y actualizar los valores de cualquier control que esté basado en una consulta.

Se pueden utilizar macros para aplicar un filtro a la tabla o consulta subyacente de un formulario, desplazarse a cualquier registro o buscar datos en ella.

Se pueden utilizar macros con cualquier formulario para definir una barra de menús personal que sustituya a la barra de menús estándar incorporada en Access. También se puede activar o desactivar, y marcar o anular la selección de elementos en menús personales, incluyendo menús contextuales y menús globales. También se puede abrir y cerrar alguna de las barras de herramientas estándar de Access o las barras de herramientas personales.

Se pueden utilizar macros para ejecutar cualquiera de las órdenes que se encuentran en cualquiera de los menús de Access.

Se pueden utilizar macros para desplazar, cambiar el tamaño, minimizar, maximizar o restaurar cualquier ventana dentro del espacio de trabajo de Access. También es posible activar una ventana o cualquier control dentro de una ventana. Se puede seleccionar la página de un informe para que sea visualizado en Vista preliminar.

Se pueden utilizar macros para presentar mensajes informativos y emitir un pitido para llamar la atención de un mensaje. También se pueden inhabilitar ciertos mensajes de advertencia a la hora de ejecutar consultas de acción.

Se pueden utilizar macros para cambiar el nombre de cualquier objeto de la base de datos. Se puede realizar otra copia de un objeto seleccionado en la base de datos o copiar un objeto a otra base de datos Access. Se pueden eliminar objetos de la base de datos. Con las macros, además, se puede importar o exportar, o vincular otras tablas de la base de datos, o importar o exportar archivos de texto o de la hoja de cálculo.

Se pueden utilizar macros para iniciar otra aplicación, o intercambiar datos con la aplicación utilizando Intercambio Dinámico de Datos (DDE) o el Portapapeles. Se pueden enviar datos desde una tabla, consulta, formulario o informe a un archivo de salida y, a continuación, abrir ese archivo en la aplicación apropiada. También se pueden enviar pulsaciones a la aplicación de destino.

Page 87: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

86

Considere alguna de las demás posibilidades ofrecidas para las macros. Por ejemplo, puede facilitar el paso de una tarea a otra utilizando botones de mandato que abren y visualizan formularios, y establecen valores. Puede crear rutinas de edición muy complejas que validen los datos introducidos en los formularios, incluyendo la comprobación de datos en otras tablas. Incluso puede comprobar cosas tales como el nombre de un cliente introducido en un formulario de pedido y abrir otro formulario de tal modo que el usuario pueda introducir los datos de detalle en caso de que no exista ningún registro para ese cliente.

La ventana Macro. Para crear una Macro, pulse el botón Macros en la ventana Base de datos, y pulse el botón Nuevo para abrir una nueva ventana Macro similar a la mostrada en la siguiente ilustración. En la parte superior de la ventana Macro podrá definir la nueva Macro, y en la parte inferior podrá introducir los parámetros, denominados argumentos, para las acciones que han sido seleccionadas en la macro. La parte superior muestra al menos dos columnas, Acción y Comentario. Para visualizar las cuatro columnas mostradas en la siguiente ilustración, pulse los botones Nombre de macro y Condiciones en la barra de herramientas. Observe que el área situada en la parte inferior derecha de la ventana Macro presenta un breve mensaje de ayuda. El mensaje cambia, dependiendo del lugar donde se encuentre

el cursor en la ventana Macro. (Recuerde que siempre que lo desee, puede pulsar la tecla F1 para abrir un tema de Ayuda relacionado con el contexto.)

Nombres de macro Condiciones

Page 88: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

87

En la columna Acción, puede especificar cualquiera de las más de 53 acciones de macro proporcionadas por Access. Si hace clic en cualquier parte de la columna Acción, verá un botón con una flecha hacia abajo en el extremo derecho del recuadro. Este botón abre una lista desplegable que contiene las acciones de macro disponibles, como se muestra en la siguiente ilustración.

Para ver cómo funciona la ventana Macro, intente seleccionar en este momento la acción CuadroMsj. (Deslícese a través de la lista hasta que encuentre CuadroMsj). Puede utilizar esta acción para hacer que se abra un cuadro de diálogo modal emergente con un mensaje en su interior. Sería una forma de visualizar una advertencia de información en la base de datos sin tener que definir un formulario independiente. Suponga que este mensaje será un saludo, escriba Mensaje de saludo en el cuadro correspondiente de la columna Comentario de la ventana Macro. Si se trata de macros extensas que contienen muchas acciones. Podemos introducir comentarios adicionales en cualquier cuadro que se encuentre en blanco de la columna Comentario (es decir, cualquier línea en donde no se haya definido una acción en la columna Acción). Después de seleccionar una acción, por ejemplo CuadroMsj, Access visualiza cuadros de argumento en la parte inferior de la ventana, como se muestra en la siguiente ilustración, en los cuales se pueden introducir los argumentos para la acción.

La lista desplegable con las acciones de la macro.

Los argumentos para una acción CuadroMsj que visualiza un mensaje de saludo

Page 89: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

88

Utilice el cuadro del argumento Mensaje para establecer el mensaje que deseamos que Access visualice en el cuadro de diálogo que estamos creando. El parámetro del cuadro del argumento denominado Bip indica a Access si debe emitir o no un pitido cuando visualice el mensaje. En el argumento Tipo, podemos establecer el indicador gráfico, por ejemplo una señal de stop roja, que aparecerá con el mensaje en el cuadro de diálogo. En el cuadro del argumento Título, podemos escribir el contenido de la barra de título del cuadro de diálogo. Utilice los parámetros mostrados en la anterior ilustración para su macro.

Almacenar la macro. Antes de poder ejecutar una macro es necesario guardarla. Elija la orden Guardar (o la orden Guardar como o exportar) del menú Archivo. Cuando elige la orden Guardar, Access abre el cuadro de diálogo mostrado en la siguiente ilustración. Introduzca el nombre deseado y pulse Aceptar para guardar la macro.

Verificar la macro. Algunas macros pueden ser ejecutadas directamente desde la ventana Base de datos o desde la ventana Macro, ya que no dependen de los controles de un formulario o informe que se encuentre abierto. Si la macro depende de un formulario o informe, debe asociar la macro al evento apropiado y ejecutarla de ese modo. Sin embargo, Access proporciona una buena forma de comprobar su ejecución, permitiendo ejecutar las acciones de la macro paso a paso. Para activar este modo de ejecución, en primer lugar active la ventana Base de datos, seleccione la ficha Macros, seleccione la macro que desea comprobar y pulse el botón Diseño. Estos pasos abrirán la macro en una ventana Macro. A continuación, puede o bien pulsar el botón Paso a paso en la barra de herramientas Diseño de la macro o elegir la orden Paso a paso del menú Ejecutar. Ahora, cuando ejecute la macro, Access abrirá el cuadro de diálogo Macro paso a paso antes de ejecutar cada acción de macro. En este cuadro de diálogo, veremos el nombre de la macro, la acción y los argumentos de la acción.

El cuadro de diálogo Guardar como para almacenar una macro

Page 90: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

89

Si pulsa el botón Paso a paso del cuadro de diálogo, se ejecutará la acción que vemos en el cuadro de diálogo y, por tanto, veremos el cuadro de diálogo Modal con el mensaje que hemos creado, como se muestra en la siguiente ilustración.

Pulse el botón Aceptar en el cuadro de diálogo Modal para que desaparezca de la pantalla. Si hubiésemos definido más de una acción, volveríamos a visualizar el cuadro de diálogo Macro paso a paso mostrando la siguiente acción. En este caso, la macro solamente contiene una acción de modo que Access volverá a la ventana Macro. Si se produce un error en alguna macro durante la ejecución normal de la aplicación Access primero presenta un cuadro de diálogo explicando el error encontrado. A continuación, veremos un cuadro de diálogo denominado Falló la acción, similar al cuadro de diálogo Macro paso a paso, con información sobre la acción que ha provocado el problema. En este momento, solamente podemos pulsar el botón detener. A continuación, podremos editar la macro para resolver el problema.

El cuadro de diálogo Macro paso a paso.

Page 91: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

90

Definición de acciones múltiples. En Microsoft Access podemos definir más de una acción dentro de una Macro, y además podemos definir la secuencia en la cual deseamos que se lleven a cabo estas acciones. En la siguiente ilustración se muestra un ejemplo de una macro que contiene más de una acción.

En la macro expuesta en la ilustración anterior se han definido ocho acciones. Access ejecutará cada acción de forma automática siempre que se abra la base de datos. En primer lugar, la acción RelojDeArena visualiza un puntero del ratón en forma de reloj de arena para ofrecer al usuario una sensación visual de que los siguientes pasos van a emplear uno o dos segundos. Es aconsejable que siempre active este efecto visual, incluso cuando piense que las siguientes acciones no emplearán mucho tiempo. La orden Ecco hace que (cuando su argumento Ecco activo está establecido a No) Access no vuelva a trazar la pantalla después de que sucedan algunas acciones. Cuando piense ejecutar varias acciones en una fila que potencialmente puedan producir cambios en la visualización de la pantalla, puede hacer que la pantalla no sea trazada para minimizar el tiempo de parpadeo de la pantalla.

La macro Autoexec que define las múltiples acciones que Access ejecuta de forma automática al abrir una base de datos

Page 92: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

91

La siguiente acción, EjecutarMacro, ejecuta otra macro que oculta la barra de herramientas Vista Formulario. Esta técnica resulta muy útil si utiliza algunas series cortas de acciones una y otra vez en macros. Cree una macro con los mandatos repetidos, y después invoque esa macro desde otra macro siempre que necesite ejecutar estos mandatos comunes. La siguiente acción, AbrirFormulario, abre el formulario FormListaBoda. Como podemos ver en la siguiente ilustración, la acción AbrirFormulario establece cuatro argumentos para definir el modo en que se deberá llevar a cabo.

El argumento Nombre del formulario indica el formulario que desea abrir. El argumento Vista indica a Access el modo de visualización en el que deberá ser abierto el formulario. (Las cuatro elecciones para el argumento Vista son Formulario, Diseño, Vista preliminar y Hoja de datos.) El ajuste predeterminado para el argumento Modo de datos es Modificar, que permite al usuario añadir, editar o eliminar registros mientras se utiliza el formulario. (Las elecciones para este agrupamiento son Agregar, Modificar y Sólo lectura). El ajuste predeterminado para el argumento Modo de la ventana es Normal, y abre el formulario en el modo establecido por su propiedad de diseño. Podemos anular los ajustes de la propiedad de diseño para abrir el formulario en el modo Oculta, como un icono o en el modo especial Diálogo. Cuando abre un formulario en el modo Diálogo, Access no ejecuta más acciones o sentencias Visual Basic hasta que se cierra ese formulario. Access no siempre espera que una acción sea completada antes de pasar a la siguiente acción. Por ejemplo, una acción AbrirFormulario inicia una tarea para comenzar la apertura del formulario. Particularmente, si el formulario visualiza muchos datos, Access podría emplear varios segundos en cargar todos los datos y finalizar la visualización del formulario.

Page 93: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

92

Puesto que está ejecutando Microsoft Windows ( o quizá Microsoft Windows NT o Windows 2000), su computadora puede realizar varias tareas de manera simultánea. Access aprovecha esta situación para pasar a la siguiente tarea sin esperar a que el formulario sea abierto totalmente.

Agrupamiento de macros. Habrá notado que la mayoría de los formularios que se diseñan para una aplicación requieren varias macros para responder a los eventos (algunas de ellas para editar campos, abrir informes, y otras como respuesta a los botones de mandato). Podría diseñar una macro independiente almacenada con su propio nombre único en la ventana Base de datos para responder a cada evento, aunque de esta manera pronto se encontraría con cientos de macros independientes en la aplicación. Puede crear un conjunto de objetos más manejable definiendo objetos macro que contengan varias macros a las que se ha asignado un nombre dentro de cada objeto. Una buena idea sería crear un objeto macro almacenado por cada formulario o informe. Otra técnica es asignar una categoría a cada macro según el tipo de acción (por ejemplo, una macro que contenga todas las acciones AbrirFormulario y otra que contenga todas las acciones AbrirInformes.) Para crear un grupo de procedimientos de macro bajo un nombre dentro de un objeto macro, debe abrir la columna Nombre de macro en la ventana de diseño de macro. Puede crear una serie de acciones al principio de la definición de macro sin asignarles un nombre que puede ser referenciado desde una propiedad de evento o una acción Ejecutar macro utilizando sólo el nombre del objeto macro. Para crear un conjunto de acciones bajo un nombre dentro de un objeto macro, escriba un nombre en la primera acción dentro del conjunto en la columna Nombre de macro. Para ejecutar un conjunto de macros al que ha sido asignado un nombre dentro de un objeto macro desde una propiedad de evento o una acción EjecutarMacro, introduzca el nombre del objeto macro, un punto y, a continuación, el nombre que ha indicado en la columna Nombre de macro. En la siguiente ilustración, se muestra el formulario Opciones de impresión de una base de datos. Este formulario contiene dos botones de mandato, donde cada uno de ellos activa una macro diferente. Las dos macros están contenidas en un grupo de macros denominado EjecutarInforme.

Page 94: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

93

En la siguiente ilustración se muestra este grupo de macros.

El objeto macro EjecutarInforme posee una columna denominada Nombre de macro. (Si no visualiza esta columna, pulse el botón Nombres de macro de la barra de herramientas). Cada uno de los siete nombres de esta columna representa una macro dentro del objeto. La primera macro abre el formulario OpcionesImpresión, y la segunda macro determina el informe que ha sido seleccionado. Las siguientes cuatro macros visualizan el informe apropiado en Vista preliminar, basándose en el resultado de la segunda macro. La última macro, cierra el formulario OpcionesImpresión al pulsar el botón Cancelar. Access ejecuta una macro comenzando con la primera acción del nombre de macro especificada y ejecuta cada acción de forma secuencial hasta que encuentra una acción DetenerMacro, otro nombre de macro o hasta que no existan más acciones. Siguiendo nuestro ejemplo, al abrir el formulario OpcionesDeImpresión en Vista Diseño, se observan las propiedades de cada uno de los botones de mandato; verá que la propiedad Al hacer clic, contiene el nombre de la macro que se ejecutará al pulsar el botón de mandato.

Page 95: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

94

Si abre la lista desplegable de cualquier propiedad de evento, podrá ver que Access lista todas las macros y grupos de macros para facilitar la selección de la macro deseada. Recuerde que el nombre de macro está dividido en dos partes. La parte situada antes del punto es el nombre del grupo de macro, y la parte situada después del punto es el nombre de una determinada macro dentro del grupo. De este modo, para el primer control de botón de mandato, la propiedad Al hacer clic, está establecida a EjecutarInforme.Imprimirlo. Al pulsar este botón, Access ejecuta la macro Imprimirlo del objeto EjecutarInforme. Después de especificar un nombre de macro en una propiedad de evento, al pulsar el botón Generar que aparece junto a la propiedad, Access abre esa macro en una ventana de diseño de macro.

Expresiones condicionales. En algunas macros, probablemente deseemos ejecutar algunas acciones sólo si se cumplen ciertas condiciones. Por ejemplo, es posible que desee actualizar un registro, pero solamente si los nuevos valores de los controles de un formulario superan las pruebas de validación. También puede ocurrir que deseemos visualizar u ocultar ciertos controles dependiendo del valor de otros controles. Siguiendo nuestro ejemplo, tenemos una macro llamada Imprimirlo, la cual utiliza condiciones para determinar la acción que deberá llevarse a cabo. Esta macro está activada por la propiedad Al hacer clic, del botón Imprimir en el formulario OpcionesImpresión. Este formulario permite al usuario imprimir un determinado informe seleccionando el botón de opción apropiado y después pulsando el botón Imprimir. Si observa el formulario en Vista Diseño como se muestra en la siguiente ilustración verá que los botones de opción están situados dentro de un control grupo de opción en el formulario. Cada botón de opción establecen un valor numérico específico (en este caso 1 para el primer botón, 2 para el segundo botón, 3 para el tercer botón y 4 para el cuarto botón) del grupo de opción, que puede comprobar en la columna Condición de una macro.

Page 96: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

95

Al incluir una condición en una macro, Access no ejecuta la acción de esta línea a menos que se cumpla la condición. Si desea ejecutar un grupo de acciones basándose en el valor de salida de una comprobación, puede introducir la comprobación en la columna Condición de la primera línea de acción e introducir puntos suspensivos (…) en la columna Condición para las otras acciones de las series. Esto hace que Access evalúe la condición sólo una vez y ejecute las líneas adicionales (aquellas con puntos suspensivos en la columna Condición) si la comprobación original se cumple.

Resumen de las acciones de una macro. Este apartado resume las acciones disponibles que se pueden utilizar en las macros. Abrir y cerrar objetos de Access. Acción de macro Propósito Cerrar Cierra la ventana especificada o la ventana activa de

una tabla, consulta, formulario, o informe. Si se encuentra activa la ventana Base de datos cuando se ejecuta una acción Cerrar y no se especifica una ventana, Access cierra la base de datos. También puede indicar si el objeto será almacenado cuando se cierre.

AbrirPáginaDeAccesoADatos Abre una página de acceso a datos en vista Examinar (Página) o Vista Diseño.

AbrirDiagrama Abre un diagrama de relación de tabla de la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista Diseño

AbrirFormulario Abre un formulario en Vista Diseño, Hoja de datos, Formulario o en Vista preliminar. Además, podemos aplicar un filtro o una condición Donde en vista Hoja de datos, Formulario o en Vista preliminar.

AbrirMódulo Abre un módulo en Vista Diseño y visualiza el procedimiento mencionado. Para visualizar un procedimiento de evento, especifique el nombre del módulo en el que se encuentra ubicado el procedimiento. Esto es necesario ya que los procedimientos de evento son privados y no aparecen en el espacio del nombre global. Para abrir un procedimiento de evento de un formulario o informe, deberá ser abierto el propio formulario o informe.

Page 97: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

96

Acción de macro Propósito AbrirConsulta Abre una consulta en Vista Diseño u Hoja de datos, o

en Vista preliminar. Si especifica una consulta de acción, Access lleva a cabo las actualizaciones especificadas por la consulta. Puede indicar si los registros pueden ser añadidos o modificados o si deberán ser de sólo lectura

AbrirInforme Abre un informe en Vista preliminar, imprime el informe, o abre el informe en Vista Diseño. Para la Vista preliminar y la impresión, también se puede especificar un filtro o una condición Dónde.

AbrirProcedimientoAlmacenado Abre un procedimiento almacenado en la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista Hoja de datos o Vista Diseño o en Vista preliminar

AbrirTabla Abre una tabla en Vista Diseño u Hoja de datos, o en Vista preliminar. Puede indicar si los datos deberán ser de sólo lectura o si los datos podrán ser añadidos o modificados.

AbrirVista Abre una vista de la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista Hoja de datos o Vista Diseño o en Vista preliminar.

Impresión de los datos. Acción de macro Propósito AbrirFormulario De manera opcional, abre un formulario en Vista

preliminar. Puede especificar un filtro o una condición Donde.

AbrirConsulta De manera opcional, abre una consulta en Vista preliminar.

AbrirInforme Imprime un informe o abre un informe en Vista preliminar. Puede especificar un filtro o una condición Donde.

AbrirProcedimientoAlmacenado De manera opcional, abre un procedimiento almacenado en la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista preliminar.

AbrirTabla De manera opcional, abre una tabla en Vista preliminar.

AbrirVista Abre una vista de la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista hoja de datos o Vista diseño o en Vista preliminar.

Page 98: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

97

Acción de macro Propósito SalidaHacia Dirige la salida de la tabla, consulta, formulario,

informe o módulo mencionado a otro formato de archivo. Los formatos incluyen HTML (htm), Microsoft ActiveX Server (asp), Microsoft Internet Information Server (htx.idc), Microsoft Excel (xls), Rich Text Format (rtf) o texto (txt). De manera opcional, además puede iniciar la aplicación para editar el archivo. Si se trata de formularios, la salida de los datos se realiza desde la Vista hoja de datos del formulario. En el caso de los informes, Microsoft Access realiza una salida de todos los controles que contienen datos (incluyendo los controles calculados) excepto los controles OLE.

Imprimir Imprime la hoja de datos, formulario o informe activo. Puede especificar un rango de páginas, la calidad de impresión, el número de copias y la intercalación de copias. Utilice primero una acción “Abrir” si desea aplicar un filtro o una condición “Donde”

Ejecución de una consulta. Acción de macro Propósito AbrirConsulta Ejecuta una consulta de selección y visualiza el

conjunto de registros en vista Hoja de datos o en Vista preliminar. Ejecuta una consulta de acción. Utilice una acción EjecutarSQL para especificar los parámetros para una consulta de acción.

AbrirProcedimientoAlmacenado Abre un procedimiento almacenado en la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista Hoja de datos o Vista Diseño o en Vista preliminar. Si el procedimiento almacenado es una orden de definición de datos o el equivalente de una consulta de acción de Access, ejecuta el procedimiento sin los datos de retorno.

AbrirVista Abre una vista de la base de datos del servidor de un archivo de proyecto Access (adp) conectado a una base de datos SQL Server en Vista Hoja de datos o Vista Diseño o en Vista preliminar.

EjecutarSQL Ejecuta la sentencia de consulta de acción especificada (INSERT, DELETE, SELECT…INTO, o UPDATE) o sentencia de consulta de definición de datos (CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX, DROP INDEX). (Nótese que no puede introducir más de 255 caracteres en el argumento de la sentencia SQL)

Page 99: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

98

Comprobación de condiciones y control del flujo de la acción. Acción de macro Propósito CancelarEvento Cancela el evento que produjo que esta macro fuese

ejecutada. No puede utilizar una acción CancelarEvento en una macro que define órdenes de menú o en el evento AlCerrar de un informe. CancelarEvento puede cancelar los siguientes eventos: AplicarFiltro, AntesDeConfirmarEliminación, AntesDeInsertar, AntesDeActualizar, AlHacerDobleClic, AlEliminar, AlSalir, AlFiltrar, AlDarFormato, AlPresionarTecla, AlBajarMouse, AlNoDatos, AlAbrir, AlImprimir y AlDescargar.

Salir Cierra todas las ventanas de Access y sale de Access. EjecutarCódigo Ejecuta un procedimiento de función en Visual Basic. Si

existen otras acciones después de esta acción, se ejecutan después de que la función haya finalizado.

EjecutarComando Ejecuta una orden incorporada de Access. La lista de mandatos disponibles incluyen todas las órdenes que pueden ejecutarse desde cualquiera de los menús incorporados. Si utiliza macros para definir un menú personal, puede utilizar la orden EjecutarComando para hacer disponibles las órdenes de menú de Access seleccionadas en el menú personal.

EjecutarMacro Ejecuta otra macro. Las acciones que siguen a esta acción se ejecutan después de que se complete esa otra macro.

DenenerTodasMacros Detiene todas las macros, incluyendo cualquier macro que fuera llamada por esta macro.

DetenerMacro Detiene la macro actual Establecer valores. Acción de macro Propósito NuevaConsulta Actualiza los datos de un control que depende de una

consulta (por ejemplo, un cuadro de lista, un cuadro combinado, un subformulario, o un control basado en una función de dominio tal como Dsuma). Utilice la acción NuevaConsulta para actualizar los valores de un control, cuando otras acciones (tal como insertar o eliminar una fila en la tabla subyacente) puedan afectar al contenido de este control que depende de una consulta. Utilice NuevaConsulta sin argumento para actualizar los datos del objeto activo (formulario u hoja de datos).

Page 100: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

99

Acción de macro Propósito EnviarTeclas Almacena las pulsaciones en la memoria intermedia de

teclado. Si intenta enviar pulsaciones a un cuadro de diálogo o formulario modal, debe ejecutar la acción EnviarTeclas antes de abrir el cuadro de diálogo o formulario modal.

EstablecerValor Cambia el valor de cualquier control o propiedad que se pueda actualizar. Por ejemplo, puede utilizar la acción EstablecerValor para calcular un nuevo total en un control independiente o influir en la propiedad Visible de un control (la cual determina si se puede visualizar ese control).

Búsqueda de datos. Acción de macro Propósito AplicarFiltro Restringe la información visualizada en una tabla,

formulario o informe aplicando un filtro, una consulta o una cláusula WHERE de SQL a los registros de la tabla o consulta subyacente del formulario o informe.

BuscarSiguiente Busca el siguiente registro que coincida con el criterio anteriormente establecido por una acción de macro BuscarRegistro o en el cuadro de diálogo Buscar en campo.

BuscarRegistro Busca un registro que coincida con el criterio de búsqueda. En la acción de macro se pueden especificar todos los parámetros disponibles en el cuadro de diálogo Buscar en campo.

IrRegistro Le lleva a un registro diferente y lo convierte en el registro actual de la tabla, consulta o formulario especificado. Puede desplazarse al primer, último, siguiente o anterior registro. Cuando especifica siguiente o anterior registro, se puede desplazar más de un registro. Además, puede ir a un determinado número de registro o al lugar reservado para un nuevo registro al final del conjunto.

Diseño de un menú personal y ejecución de órdenes de menú. Acción de macro Propósito EjecutarComando Ejecuta una orden incorporada de Access. La lista de

mandatos disponibles incluyen todas las órdenes que puedan ejecutarse desde los menús incorporados. Si utiliza macros para definir un menú personal, utilice la orden EjecutarComando para hacer disponibles las órdenes del menú de Access seleccionadas en el menú personal.

Page 101: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

100

Acción de macro Propósito AgregarMenú Añade un menú desplegable a la barra de menús

personal de un formulario o informe. Ésta es la única acción permitida en una macro referida por una propiedad Barra de menús. Los argumentos para AgregarMenú especifican el nombre de esta barra de menús y el nombre de otra macro que contiene todas las órdenes mencionadas en el menú y las acciones que corresponden a estas órdenes. Una acción Agregar Menú también puede hacer referencia a otra macro que utilice una acción AgregarMenú para elaborar submenús

EstablecerElementoDelMenú Ejecuta una orden de uno de los menús estándar de Access. Utilice esta acción de macro dentro de una barra de menús personal para que estén disponibles en el menú personal las órdenes del menú de Access seleccionadas.

Control de la visualización y el enfoque. Acción de macro Propósito Eco Controla la visualización de las acciones intermedias

durante la ejecución de una macro. IrAControl Activa el control especificado IrAPágina Se desplaza a la página especificada de un informe o

formulario. RelojDeArena Cambia la forma del puntero del ratón a un icono de

reloj de arena mientras se está ejecutando una macro. Maximizar Maximiza la ventana activa Minimizar Minimiza la ventana activa DesplazarTamaño Mueve y cambia las dimensiones de la ventana activa RepintarObjeto Obliga a que se vuelva a trazar la ventana del objeto

especificado. Hace que se vuelvan a calcular las fórmulas de los controles de ese objeto.

NuevaConsulta Actualiza los datos de un control que depende de una consulta (por ejemplo, un cuadro de lista, un cuadro combinado, un subformulario, o un control basado en una función de dominio tal como Dsuma). Utilice la acción NuevaConsulta para actualizar los valores de un control, cuando acciones (tales como, insertar o eliminar una fila en la tabla subyacente) puedan afectar al contenido de ese control que depende de una consulta. Utilice NuevaConsulta sin argumento para actualizar los datos del objeto activo (formulario u hoja de datos).

Restaurar Restaura una ventana maximizada o minimizada a su tamaño anterior

Page 102: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

101

Acción de macro Propósito SeleccionarObjeto Selecciona la ventana del objeto especificado. Restaura

la ventana en caso de que estuviese minimizada. Si el objeto está en el proceso de apertura (por ejemplo, un formulario al que se ha hecho referencia en una acción AbrirFormulario anterior), SeleccionarObjeto obliga la finalización de la apertura antes de continuar con la siguiente acción. Utilice esta acción después de AbrirFormulario cuando necesite hacer referencia al formulario, una hoja de un control en el formulario, o datos de un control en el formulario de forma inmediata.

EstablecerAdvertencias Cuando se encuentre habilitada, produce una respuesta automática de tecla Intro a todos los mensajes de advertencia o informativos durante la ejecución de una macro. Cuando se trata de mensajes de advertencia visualizados en un cuadro de diálogo, el hecho de pulsar la tecla Intro produce la sección del botón predeterminado (normalmente Aceptar o Sí). No detiene la visualización de los mensajes de error. Utilice esta acción de macro con el argumento Eco activo de la acción Eco establecido a No para evitar la visualización de los mensajes.

MostrarTodosRegistros Elimina cualquier filtro aplicado anteriormente sobre la tabla, consulta o formulario activo.

MostrarBarraDeHerramientas Muestra u oculta cualquiera de las barras de herramientas estándar o cualquiera de las barras de herramientas personales.

Informar al usuario de las acciones. Acción de macro Propósito Bip Emite un sonido CuadroMsj Presenta un mensaje de advertencia o informativo y, de

forma opcional, emite un sonido. Deberá pulsar el botón Aceptar para que desaparezca el cuadro de diálogo y poder continuar.

EstablecerAdvertencias Cuando se encuentre habilitada, produce una respuesta automática de tecla Intro a todos los mensajes de advertencias o informativos durante la ejecución de una macro. Cuando se trata de mensajes de advertencia visualizados en un cuadro de diálogo, el hecho de pulsar la tecla Intro produce la selección del botón predeterminado (normalmente Aceptar a Sí). No detiene la visualización de los mensajes de error. Utilice esta acción de macro con el argumento Eco activo de la acción Eco establecido a No para evitar la visualización de los mensajes.

Page 103: Access 2000 Avanzado Inst. Sup. Software

Access 2000 (Avanzado)

Instituto Superior de Software

102

Renombrar, copiar, eliminar, almacenar, importar y exportar objetos. Acción de macro Propósito CopiarObjetos Copia cualquier objeto de la base de datos actual con un

nuevo nombre o copia cualquier objeto de la base de datos a otra base de datos Access utilizando el nombre especificado.

EliminarObjeto Elimina cualquier tabla, consulta, formulario, informe, macro o módulo

SalidaHacia Dirige la salida de la tabla, consulta, formulario, informe o módulo mencionado a un formato de archivo diferente. Los formatos incluyen HTML (htm), Microsoft Active Server Page (asp), Microsoft Internet Information Server (htx, idc), Excel (xls), Rich Text Format (rtf), o texto (txt). De manera opcional, puede iniciar la aplicación para editar el archivo. Si se trata de formularios, la salida de los datos se realiza desde la Vista Hoja de datos del formulario. En el caso de los informes, Access realiza una salida de todos los controles que contienen datos (incluyendo los controles calculados) excepto controles Actives.

CambiarNombre Asigna un nuevo nombre al objeto especificado de la base de datos actual.

Guardar Almacena cualquier tabla, consulta, formulario, informe, macro o módulo

EnviarObjeto Dirige la salida de una hoja de datos de una tabla, consulta o formulario, los datos de cuadro de texto de un formulario, o un módulo, hacia un archivo HTML (htm), Excel (xls), Rich Text Format (rtf) o de texto (txt) e incluye los datos en un mensaje de correo electrónico. Podemos especificar la persona a quien va dirigido el mensaje, el tema del mensaje, el texto adicional del mensaje y si el mensaje puede ser editado antes de ser enviado. Para tal fin, debemos disponer de un software de correo electrónico instalado que sea compatible con el estándar de Interfaz de programación para envío de mensajes entre aplicaciones (MAPI) o el estándar Vendor Independent Mail (VIM)

TransferirBaseDatos Exporta o importa datos hacia o desde otra base de datos Access, dBASE, Paradox, FoxPro o SQL. Además, puede utilizar esta acción para vincular tablas o archivos desde otras bases de datos Access, dBase, Paradox, FoxPro o SQL, o desde archivos de texto o de hoja electrónica.

TransferirHojaCálculo Exporta o importa datos hacia o desde archivos de hoja de cálculo de Microsoft Excel o Lotus 1-2-3.

TransferirTexto Exporta o importa datos hacia o desde archivos de texto

Page 104: Access 2000 Avanzado Inst. Sup. Software
Page 105: Access 2000 Avanzado Inst. Sup. Software
Page 106: Access 2000 Avanzado Inst. Sup. Software
Page 107: Access 2000 Avanzado Inst. Sup. Software
Page 108: Access 2000 Avanzado Inst. Sup. Software