Características más importantes del formulario ModificarProductos

El formulario ModificarProductos muestra cómo crear un formulario en el que pueda modificar registros existentes pero no introducir otros nuevos. Estas técnicas hacen que el formulario ModificarProductos funcione:

•	Limitando los valores del cuadro combinado SeleccionarProducto en función del valor elegido en el cuadro combinado SeleccionarCategoría.

•	Buscando el registro para el producto elegido en el cuadro combinado SeleccionarProducto.

•	Actualizando la lista en el cuadro combinado SeleccionarProducto después de cambiar a otro registro.

•	Creando una barra de herramientas y un menú con botones y comandos limitados a tareas de edición.

Esta otra técnica mejora el formulario ModificarProductos:

•	Cambiar el color del cuadro de texto UnidadesEnExistencia y presentar un mensaje cuando el número de unidades es inferior al nivel del nuevo pedido.


Limitar el contenido de una lista basándose en el valor seleccionado en otra

Si una lista contiene numerosos elementos, es posible que le resulte más sencilla de usar si limita el número de elementos presentados a la vez. Por ejemplo, en lugar de presentar todos los productos de la base de datos de ejemplo Neptuno, la lista SeleccionarProducto en el formulario ModificarProductos sólo presenta los productos de la categoría elegida en la lista SeleccionarCategoría.

Información general

Cree un procedimiento de evento para la propiedad DespuésDeActualizar (AfterUpdate) del cuadro combinado SeleccionarCategoría que usa el método Requery para efectuar una nueva consulta del cuadro combinado SeleccionarProducto. Incluya el campo IdCategoría en la consulta base del cuadro combinado SeleccionarProducto. Establezca los criterios del campo a una expresión que limite la lista a aquellos productos cuyo valor IdCategoría coincida con el valor seleccionado en el cuadro combinado SeleccionarCategoría.

Objetos usados en este ejemplo

Objeto	Nombre
Tabla	Categorías, Productos
Consulta	ListaDeCategorías, LimitarListaDeProductos
Formulario	ModificarProductos
Módulo	módUtilidadesDeSoluciones
Paso a paso

1	Cree la consulta ListaDeCategorías.

Tabla	Campo
Categorías	NombreCategoría (Ascendente)
	IdCategoría
2	Cree la consulta LimitarListaDeProductos.

a)	Use los siguientes campos de la tabla Productos.

Campo	Orden
NombreProducto	Ascendente
IdProducto	—
IdCategoría	—
b)	En la celda Criterios del campo IdCategoría, escriba:

Forms![ModificarProductos]![SeleccionarCategoría]

3	Cree la función ActivarControles en el módulo módUtilidadesDeSoluciones, si aún no lo ha hecho.

4	Cree el formulario ModificarProductos.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Productos
Título (Caption)	Modificar productos
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
PermitirEdiciones (AllowEdits)	Sí
PermitirEliminación (AllowDeletions)	Sí
PermitirAgregar (AllowAdditions)	No
EntradaDeDatos (DataEntry)	No
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	En la sección Detalle, agregue los campos de la tabla Productos. Use los cuadros combinados para los campos IdProveedor e IdCategoría, una casilla de verificación para el campo Suspendido y cuadros de texto para los restantes campos.

c)	Establezca a No la propiedad Activado (Enabled) en todos los controles de la sección Detalle. Para evitar que las etiquetas parpadeen cuando se activan los controles, separe las etiquetas adjuntas de los controles cortándolas y pegándolas.

d)	Agregue un encabezado y pie del formulario. Establezca a 0 la propiedad Altura (Height) del pie del formulario.

e)	Cree el cuadro combinado SeleccionarCategoría en el encabezado del formulario y establezca sus propiedades como se muestra a continuación:

Propiedad	Valor
Nombre (Name)	SeleccionarCategoría
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	ListaDeCategorías
NúmeroDeColumnas ColumnCount)	2
AnchuraDeColumnas (ColumnWidths)	0 cm
ColumnaDependiente (BoundColumn)	2
LimitarALista (LimitToList)	Sí
DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
f)	Cree el cuadro combinado SeleccionarProducto en el encabezado del formulario. Separe la etiqueta adjunta cortándola y pegándola (para que así no parpadee cuando se active o desactive SeleccionarProducto). Establezca las propiedades del cuadro combinado SeleccionarProducto como se muestra a continuación.

Propiedad	Valor
Nombre (Name)	SeleccionarProducto
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	LimitarListaDeProductos
NúmeroDeColumnas (ColumnCount)	2
AnchuraDeColumnas (ColumnWidths)	0 cm
ColumnaDependiente (BoundColumn)	2
LimitarALista (LimitToList)	Sí
Activado (Enabled)	No
Sugerencia   En un formulario de sólo edición, puede evitar que los usuarios realicen cambios no deseados en el registro incorrecto desactivando los controles en la sección Detalle, mientras introducen los criterios de búsqueda y activándolos después de buscar el registro que desean modificar.

Referencias cruzadas

Para obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Función ActivarControles

Function ActivarControles(frm As Form, entSección As Integer, entEsatdo As Boolean) As Boolean

' Activar o desactivar los controles de la sección especificada

' del formulario. Utilizar los argumentos objeto Form,

' constante de sección y estado pasados al procedimiento ActivarControles.

Dim ctl As Control

' Establecer entEstado para todos los controles en la sección especificada.

For Each ctl In frm.Controls

If ctl.Section = entSección Then

On Error Resume Next

ctl.Enabled = entEstado

Err = 0

End If

Next ctl

ActivarControles = True

End Function


Procedimiento de evento AfterUpdate del cuadro combinado SeleccionarCategoría

Private Sub SeleccionarCategoría_AfterUpdate()

' Activar y volver a realizar la consulta del cuadro combinado SeleccionarProducto.

' Desactivar los controles de la sección Detalle.

Me!SeleccionarProducto.Enabled = True

Me!SeleccionarProducto.Requery

ActivarControles Me, acDetail, False

End Sub


Buscar un registro basándose en el valor seleccionado en una lista

Una manera rápida de encontrar un registro es seleccionar un valor en una lista. Por ejemplo, el formulario ModificarProductos busca el registro del producto seleccionado en el cuadro combinado SeleccionarProducto.

Sugerencia   En un formulario de sólo edición, puede evitar que los usuarios realicen cambios no deseados en el registro incorrecto desactivando los controles en la sección Detalle, mientras introducen los criterios de búsqueda y activándolos después de que encuentren el registro que desean modificar.

Información general

Cree un procedimiento de evento para la propiedad DespuésDeActualizar (AfterUpdate) del cuadro combinado SeleccionarProducto, que use el método ApplyFilter para buscar el registro y una función personalizada para activar todos los controles de la sección Detalle.

Objetos usados en este ejemplo

Objeto	Nombre
Tabla	Productos
Formulario	ModificarProductos
Módulo	módUtilidadesDeSoluciones
Paso a paso

1	Cree los cuadros combinados SeleccionarCategoría y SeleccionarProducto. Para saber cómo se crean estos cuadros combinados, consulte el tema Limitar el contenido de una lista en función del valor seleccionado en otra.

2	Cree la función ActivarControles en el módulo módUtilidadesDeSoluciones, si aún no lo ha hecho.

3	Cree un procedimiento de evento para la propiedad DespuésDeActualizar (AfterUpdate) del cuadro combinado SeleccionarProducto.

Referencias cruzadas

Para obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, " Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento AfterUpdate del cuadro combinado SeleccionarProducto

Private Sub SeleccionarProducto_AfterUpdate()

' Buscar el registro del producto seleccionado en el cuadro

' combinado SeleccionarProducto. Activar los controles

' de la sección Detalle y desactivar el cuadro de texto

' IdProducto. Ir al cuadro combinado IdProveedor.

DoCmd.ApplyFilter , "IdProducto = Forms!ModificarProductos!SeleccionarProducto"

ActivarControles Me, acDetail, True

Me!IdProducto.Enabled = False

Me!IdProveedor.SetFocus

End Sub


Volver a consultar una lista después de cambiar a otro registro

Al cambiar un valor en un campo que afecta a los valores de una lista, es esencial actualizar la lista o volver a consultarla, para que contenga los datos más actuales. Por ejemplo, cuando se cambia un registro en el formulario ModificarProductos, se efectúa una nueva consulta del cuadro combinado SeleccionarProducto.

Información general

Cree un procedimiento de evento para la propiedad DespuésDeActualizar (AfterUpdate) del formulario que use el método Requery para volver a consultar el cuadro combinado SeleccionarProducto.

Objeto usado en este ejemplo

Objeto	Nombre
Formulario	ModificarProductos
Paso a paso

•	Cree un procedimiento de evento para la propiedad DespuésDeActualizar (AfterUpdate) del formulario ModificarProductos.

Referencias cruzadas

Para obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, " Introducción a Visual Basic"


Procedimiento de evento AfterUpdate del formulario ModificarProductos

Private Sub Form_AfterUpdate()

' Volver a realizar la consulta del cuadro combinado SeleccionarProducto.

Me!SeleccionarProducto.Requery

End Sub


Crear una barra de herramientas y un menú que sólo incluyan tareas de edición

Puede controlar los tipos de tareas que los usuarios realizan en un formulario creando una barra de herramientas y un menú personalizados. Por ejemplo, la barra de herramientas y el menú personalizados para el formulario ModificarProductos incluyen sólo botones y comandos para las tareas de edición.

Información general

Cree una barra de herramientas y un menú personalizados. Establezca la propiedad Barra de herramientas (Toolbar) del formulario ModificarProductos al nombre de la barra de herramientas personalizada. Establezca la propiedad BarraDeMenús (MenuBar) al nombre de la barra de herramientas personalizada que desea usar como barra de menús.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	ModificarProductos
Barra de herramientas	BarraDeMenúsModificarProductos, BarraDeHerramientasModificarProductos
Paso a paso

1	Cree el formulario ModificarProductos. Para saber cómo se crea este formulario, consulte el tema Limitar el contenido de una lista en función del valor seleccionado en otra.

2	Cree una barra de herramientas personalizada.

a)	Cree una barra de herramientas, con el nombre BarraDeHerramientasModificarProductos, mediante las técnicas descritas en Crear una barra de herramientas o barra de menús personalizada.

b)	Incluya los siguientes botones incorporados en la barra de herramientas:

Cortar	Copiar	Pegar	Deshacer
Nota   Las barras de herramientas personalizadas de los formularios de la aplicación Soluciones para el programador también incluyen los botones Vista Diseño y Vista Formulario para que pueda fácilmente cambiar entre estas dos vistas mientras ve los ejemplos. En la mayoría de los casos, no conviene incluir estos botones en las barras de herramientas personalizadas que cree para sus aplicaciones.

c)	Para mostrar la barra de herramientas con el formulario, establezca la propiedad Barra de herramientas (Toolbar) del formulario a BarraDeHerramientasModificarProductos.

3	Cree un menú personalizado.

a)	Cree una barra de menús personalizada con el nombre BarraDeMenúsModificarProductos. Incluya sólo los menús y comandos enumerados en la siguiente tabla.

Menú	Comando
Archivo	Cerrar
Edición	Deshacer Cortar Copiar Pegar Eliminar Eliminar registro Seleccionar registro
Nota   La barra de menús personalizada del formulario ModificarProductos también incluye los menús Ver, Herramientas, Ventana y Ayuda para que pueda cambiar con facilidad entre las distintas vistas y usar las características normales de la barra de menús de la vista Formulario.

b)	Establezca la propiedad BarraDeMenús (MenuBar) del formulario al nombre de la barra de menús personalizada BarraDeMenúsModificarProductos.

Referencias cruzadas

Para obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Crear menús y barras de herramientas	Capítulo 1, "Creación de una aplicación"
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Cambiar el color de un control y mostrar un mensaje basándose en el valor del control

Cuando el valor de un control cumple ciertos criterios, puede resaltarlo cambiándole el color y presentando un mensaje junto a él. Por ejemplo, en el formulario ModificarProductos, cuando el número de unidades en existencia y de unidades en pedido es inferior al nivel de nuevo pedido, el texto del cuadro de texto UnidadesEnExistencia cambia a rojo y aparece un mensaje junto al mismo.

Información general

Cree una etiqueta para presentar el mensaje. Cree un procedimiento de evento para la propiedad AlActivarRegistro (OnCurrent) del formulario que use la propiedad ColorDelTexto (ForeColor) del cuadro de texto para establecer el color del texto y la propiedad Visible de la etiqueta para presentar el mensaje. Cree procedimientos de evento que ejecuten el procedimiento de evento Form_Current para las propiedades DespuésDeActualizar (AfterUpdate) de los controles UnidadesEnExitencia, UnidadesEnPedido y NivelNuevoPedido.

Objeto usado en este ejemplo

Objeto	Nombre
Formulario	ModificarProductos
Paso a paso

1	Cree una etiqueta junto al cuadro de texto UnidadesEnExistencia y establezca sus propiedades como se muestra a continuación:

Propiedad	Valor
Nombre (Name)	NExistenciasBajo
Título (Caption)	Las unidades en existencia están por debajo del nivel de nuevo pedido.
Visible	No
2	Cree procedimientos de evento para el formulario y controles de la manera siguiente:

Formulario/Control	Propiedad	Valor
Formulario ModificarProductos	AlActivarRegistro (OnCurrent)	[Procedimiento de evento]
Cuadro de texto UnidadesEnExistencia	DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
Cuadro de texto UnidadesEnPedido	DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
Cuadro de texto NivelNuevoPedido	DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
Referencias cruzadas

Para obtener más información sobre los temas siguientes, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento Current del formulario ModificarProductos

Private Sub Form_Current()

' Si el valor del cuadro de texto UnidadesEnExistencia es menor

' que el valor del cuadro de texto NuevoNivelPedido y el valor

' del cuadro de texto UnidadesEnPedido es 0, mostrar

' el valor de UnidadesEnExistencia en rojo y mostrar la etiqueta NExistenciasBajo.

If (Me!UnidadesEnExistencia + Me!UnidadesEnPedido) <= Me!NivelNuevoPedido Then

Me!UnidadesEnExistencia.ForeColor = 255

Me!NExistenciasBajo.Visible = True

' De otra manera, mostrar el valor del cuadro de texto UnidadesEnExistencia en negro

' y ocultar la etiqueta NExistenciasBajo.

Else

Me!UnidadesEnExistencia.ForeColor = 0

Me!NExistenciasBajo.Visible = False

End If

End Sub


Procedimiento de evento AfterUpdate del cuadro de texto UnidadesEnExistencia

Private Sub UnidadesEnExistencia_AfterUpdate()

' Ejecutar el procedimiento Form_Current.

Form_Current

End Sub


Procedimiento de evento AfterUpdate del cuadro de texto UnidadesEnPedido

Private Sub UnidadesEnPedido_AfterUpdate()

' Ejecutar el procedimiento Form_Current.

Form_Current

End Sub


Procedimiento de evento AfterUpdate del cuadro de texto NivelNuevoPedido

Private Sub NivelNuevoPedido_AfterUpdate()

' Ejecutar el procedimiento Form_Current.

Form_Current

End Sub


Características más importantes del informe VentasPorEmpleado

El informe VentasPorEmpleado muestra cómo crear un informe de tabla de referencias cruzadas con encabezados dinámicos de columnas. Estas técnicas hacen que el informe VentasPorEmpleado funcione:

•	Creando un informe de tablas de referencias cruzadas con encabezados dinámicos de columnas.

•	Estableciendo los criterios del informe en un cuadro de diálogo.

Esta otra técnica mejora el informe:

•	Impresión de los criterios que especificó en el cuadro de diálogo en el informe.


Crear un informe de tablas de referencias cruzadas con encabezados de columna dinámicos

Puede variar el número de columnas que imprime en un informe de tabla de referencias cruzadas dependiendo de los criterios que introduzca cuando lo imprima. Por ejemplo, como no todos los empleados de el informe VentasPorEmpleado tiene ventas todas las semanas, el informe sólo imprime columnas para aquellos empleados que tuvieron ventas en el periodo de tiempo especificado. Este informe también calcula totales para cada fila y columna.

Introducción

Cree una consulta de tabla de referencias cruzadas para utilizarla como origen de registros para el informe. En la vista Diseño del informe, cree cuadros de texto independientes en el encabezado de la página (para los encabezados de columnas), en la sección Detalle (para los encabezados de fila y los valores de tabla de referencias cruzadas) y en el pie del informe (para los totales de columnas). En las propiedades AlDarFormato (OnFormat) del encabezado de página y de las secciones de detalles, cree procedimientos de evento que llenen los cuadros de texto con los encabezados de columnas y los valores de tabla de referencias cruzadas y que oculten los cuadros de texto no utilizados. En la propiedad AlImprimir (OnPrint) de la sección Detalle, cree un procedimiento de evento que calcule el total de la fila y que lo agregue a la matriz de totales de columna. En la propiedad AlImprimir (OnPrint) del pie del informe, cree un procedimiento de evento que llene los cuadros de texto con los totales de las columnas.

Objetos utilizados en este ejemplo

Objeto	Nombre
Tabla	Empleados, Pedidos, Detalles de pedidos, Productos
Consulta	VentasPorEmpleado, DetallesDePedidoConDescuento
Informe	VentasPorEmpleado
Paso a paso

1	Importe la consulta DetallesDePedidoConDescuento y las tablas Empleados, Pedidos, Detalles de pedidos y Productos de la base de datos de ejemplo Neptuno, si no lo ha hecho ya.

2	Cree la consulta de tabla de referencias cruzadas VentasPorEmpleado.

Tabla/Consulta	Campo	Valor
Tabla Empleados	Apellidos	Total: Agrupar por Tab ref cruz: Encabezado de columna
Tabla Productos	NombreProducto	Total: Agrupar por Tab ref cruz: Encabezado de fila
Consulta DetallesDePedidoConDescuento	Cantidad de pedido: PrecioConDescuento	Total: Suma Tab ref cruz: Valor
Tabla Pedidos	Fecha de envío	Total: Donde Criterios: Entre #1/2/95# Y #1/16/95#
Nota   La consulta mostrada arriba utiliza un periodo de tiempo de ejemplo entre el 2 de enero de 1995 y el 16 de enero de 1995, pero probablemente deseará pedir a los usuarios los criterios de fecha. Si busca los criterios para el campo Fecha de envío en la consulta VentasPorEmpleado, verá que hace referencia a controles en el formulario CuadroDeDiálogoVentasPorEmpleado. Los pasos para modificar la consulta se indican en Establecer los criterios del informe en un cuadro de diálogo.

3	Crear el informe VentasPorEmpleado.

a)	Establezca VentasPorEmpleado en la propiedad OrigenDelRegistro (RecordSource) del informe.

b)	Agregue un encabezado y pie de informe. Cree un título para el informe en el encabezado de informe.

c)	Cree 11 cuadros de texto independientes en el encabezado de página. Estos cuadros de texto presentarán los encabezados de columna. Establezca en la propiedad Nombre (Name) del cuadro de texto más a la izquierda Encabezado1, en la propiedad Nombre (Name) del siguiente cuadro de texto Encabezado2 y así sucesivamente hasta Encabezado11.

d)	Cree 11 cuadros de texto independientes en la sección Detalle. (Cree un cuadro de texto para el encabezado de fila, nueve cuadros de texto para el máximo número de vendedores de Importadores Neptuno y un cuadro de texto para el total de filas.) Establezca Col1en la propiedad Nombre (Name) del cuadro de texto más a la izquierda, en la propiedad Nombre (Name) del siguiente cuadro de texto, Col2 y así sucesivamente hasta Col11. Establezca Estándar en la propiedad Formato (Format) de los cuadros de texto Col2 a Col11.

e)	Cree 11 cuadros de texto en el pie del informe. Establezca Tot1en la propiedad Nombre (Name) del cuadro de texto más a la izquierda. En su cuadro de propiedad OrigenDelControl (ControlSource), escriba ="Totales:".

Establezca la propiedad Nombre (Name) de los restantes cuadros de texto, que presentan los totales de las columnas, a Tot2 hasta Tot11. Establezca Estándar en la propiedad Formato (Format) de los cuadros de texto Tot2 a Tot11.

f)	En la sección General del módulo Report_VentasPorEmpleado, declare las variables, y cree el procedimiento Sub IniciarVariables y la función xtabCnulos.

g)	Cree procedimientos de evento y establezca propiedades tal como se describe en la siguiente tabla.

Informe/Sección	Propiedad	Valor
Informe	AlAbrir (OnOpen)	[Procedimiento de evento]
	AlCerrar (OnClose)	[Procedimiento de evento]
	AlNoHaberDatos (OnNoData)	[Procedimiento de evento]
Encabezado de informe	AlDarFormato (OnFormat)	[Procedimiento de evento]
Encabezado de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Sección Detalle	MantenerJuntos (KeepTogether)	Sí
	AlDarFormato (OnFormat)	[Procedimiento de evento]
	AlImprimir (OnPrint)	[Procedimiento de evento]
	AlRetirarse (OnRetreat)	[Procedimiento de evento]
Pie de informe	AlImprimir (OnPrint)	[Procedimiento de evento]
Referencia cruzada

Para obtener más información sobre el siguiente tema, vea Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Sección Declaraciones del módulo Report_VentasPorEmpleado

Option Compare Database   'Usar orden de la base de datos para las comparaciones de cadenas.

Option Explicit

' Constante para el número máximo de columnas que crearía la

' consulta VentasPorEmpleado más 1 para una columna de totales.

Const conColumnasTotal = 11

' Variables para los objetos Database y Recordset.

Dim bdInforme As Database

Dim rstInforme As Recordset

' Variables para el número de columnas y filas y para los totales del informe.

Dim entCuentaColumnas As Integer

Dim lngRgColumnTotal(1 To conColumnasTotal) As Long

Dim lngTotalInforme As Long


Procedimiento Sub IniciarVariables

Private Sub IniciarVariables()

Dim entX As Integer

' Iniciar la variable lngTotalInforme.

lngTotalInforme = 0

' Iniciar la matriz que almacena los totales de las columnas.

For entX = 1 To conColumnasTotal

lngRgColumnTotal(entX) = 0

Next entX

End Sub


Función xtabCnulos

Private Function xtabCnulos(varX As Variant)

' Probar si un valor es nulo.

If IsNull(varX) Then

' Si varX es nulo, establecer varX a 0.

xtabCnulos = 0

Else

' De lo contrario, devolver varX.

xtabCnulos = varX

End If

End Function


Procedimiento de evento Open del informe VentasPorEmpleado

Private Sub Report_Open(Cancelar As Integer)

' Crear conjunto de registros base para el informe utilizando el criterio introducido

' en el formulario CuadroDeDiálogoVentasPorEmpleado.

Dim entX As Integer

Dim qdf As QueryDef

Dim formulario As Form

'  No abrir el informe si está cargado el formulario CuadroDeDiálogoVentasPorEmpleado.

If Not (EstáCargado("CuadroDeDiálogoVentasPorEmpleado")) Then

Cancelar = True

MsgBox "Para obtener una vista previa de este informe o para imprimirlo, debe abrir " _

& "CuadroDeDiálogoVentasPorEmpleado en Vista Formulario.", vbExclamation, _

"Debe abrir el cuadro de diálogo"

Exit Sub

End If

' Establecer la variable de la base de datos a la base de datos actual.

Set bdInforme = CurrentDb

Set formulario = Forms!CuadroDeDiálogoVentasPorEmpleado

' Abrir el objeto QueryDef.

Set qdf = bdInforme.QueryDefs("VentasPorEmpleado")

' Establecer los parámetros para la consulta basándose en los valores

' introducidos en el formulario CuadroDeDiálogoVentasPorEmpleado.

qdf.Parameters("Forms!CuadroDeDiálogoVentasPorEmpleado!FechaInicio") _

= formulario!FechaInicio

qdf.Parameters("Forms!CuadroDeDiálogoVentasPorEmpleado!FechaFin") _

= formulario!FechaFin

' Abrir el objeto Recordset.

Set rstInforme = qdf.OpenRecordset

' Establecer una variable para guardar el número de columnas de la consulta de referencias cruzadas.

entCuentaColumnas = rstInforme.Fields.Count

End Sub


Procedimiento de evento Close del informe VentasPorEmpleado

Private Sub Report_Close()

On Error Resume Next

' Cerrar conjunto de registros.

rstInforme.Close

End Sub


Procedimiento de evento NoData del informe VentasPorEmpleado

Private Sub Report_NoData(Cancelar As Integer)

MsgBox "Ningún registro coincide con el criterio que introdujo.", vbExclamation, "No se encontró ningún registro"

rstInforme.Close

Cancelar = True

End Sub


Procedimiento de evento Format del encabezado del informe

Private Sub EncabezadoInforme3_Format(Cancelar As Integer, ContarFormato As Integer)

' Ir al primer registro del conjunto de registros al iniciar el informe

' o al reiniciar el informe. (Un informe se reinicia cuando

' se imprime un informe desde la ventana Vista preliminar o al volver

' a una página anterior durante la vista previa.)

rstInforme.MoveFirst

' Iniciar las variables.

IniciarVariables

End Sub


Procedimiento de evento Format del encabezado de la página

Private Sub EncabezadoPágina0_Format(Cancelar As Integer, ContarFormato As Integer)

Dim entX As Integer

' Colocar los encabezados de columnas en los cuadros de texto del encabezado de página.

For entX = 1 To entCuentaColumnas

Me("Encabezado" + Format(entX)) = rstInforme(entX - 1).Name

Next entX

' Hacer del siguiente cuadro de texto el encabezado de Totales.

Me("Encabezado" + Format(entCuentaColumnas + 1)) = "Totales"

' Ocultar los cuadros de texto no utilizados en el encabezado de página.

For entX = (entCuentaColumnas + 2) To conColumnasTotal

Me("Encabezado" + Format(entX)).Visible = False

Next entX

End Sub


Procedimiento de evento Format de la sección Detalle

Private Sub Detalle1_Format(Cancelar As Integer, ContarFormato As Integer)

 ' Colocar valores en los cuadros de texto y ocultar los cuadros de texto no utilizados.

Dim entX As Integer

' Comprobar que no ha llegado al final del conjunto de registros.

If Not rstInforme.EOF Then

'  Si ContarFormato es 1, colocar los valores del conjunto de registros en los cuadros de texto

'  de la sección Detalle.

If Me.FormatCount = 1 Then

For entX = 1 To entCuentaColumnas

' Convertir los valores Null a 0.

Me("Col" + Format(entX)) = xtabCnulos(rstInforme(entX - 1))

Next entX

' Ocultar los cuadros de texto no utilizados de la sección Detalle.

For entX = entCuentaColumnas + 2 To conColumnasTotal

Me("Col" + Format(entX)).Visible = False

Next entX

' Ir al siguiente registro del conjunto de registros.

rstInforme.MoveNext

End If

End If

End Sub


Procedimiento de evento Print de la sección Detalle

Private Sub Detalle1_Print(Cancelar As Integer, ContarImpresión As Integer)

Dim entX As Integer

Dim lngTotalFilas As Long

'  Si ContarImpresión es 1, iniciar la variable lngTotalFilas.

'  Agregar a los totales de columnas.

If Me.PrintCount = 1 Then

lngTotalFilas = 0

For entX = 2 To entCuentaColumnas

' Comenzando en la columna 2 (primer cuadro de texto con valor de referencias cruzadas),

' calcular el total de la fila actual de la sección Detalle.

lngTotalFilas = lngTotalFilas + Me("Col" + Format(entX))

' Agregar valor de referencias cruzadas al total de la columna actual.

lngRgColumnTotal(entX) = lngRgColumnTotal(entX) + Me("Col" + Format(entX))

Next entX

' Colocar el total de la fila en el cuadro de texto de la sección Detalle.

Me("Col" + Format(entCuentaColumnas + 1)) = lngTotalFilas

' Agregar total de la fila actual al total general.

lngTotalInforme = lngTotalInforme + lngTotalFilas

End If

End Sub


Procedimiento de evento Retreat de la sección Detalle

Private Sub Detalle1_Retreat()

' Volver siempre al registro anterior al retirarse de la sección Detalle.

rstInforme.MovePrevious

End Sub


Procedimiento de evento Print del pie del informe

Private Sub PieInforme4_Print(Cancelar As Integer, ContarImpresión As Integer)

Dim entX As Integer

' Colocar los totales de columnas en los cuadros de texto del pie del informe.

' Comenzar en la columna 2 (primer cuadro de texto con valores de referencias cruzadas).

For entX = 2 To entCuentaColumnas

Me("Tot" + Format(entX)) = lngRgColumnTotal(entX)

Next entX

' Colocar el total general en el cuadro de texto del pie del informe.

Me("Tot" + Format(entCuentaColumnas + 1)) = lngTotalInforme

' Ocultar los cuadros de texto no utilizados del pie del informe.

For entX = entCuentaColumnas + 2 To conColumnasTotal

Me("Tot" + Format(entX)).Visible = False

Next entX

End Sub


Características más importantes del formulario CuadroDeDiálogoVentasPorEmpleado

El formulario CuadroDeDiálogoVentasPorEmpleado muestra cómo pedir criterios para el informe VentasPorEmpleado y cómo especificar criterios de fecha utilizando el control ActiveX Calendar proporcionado con Microsoft Access. Esta técnica hace que el formulario CuadroDeDiálogoVentasPorEmpleado funcione:

•	Estableciendo los criterios del informe en un cuadro de diálogo.


Establecer los criterios del informe en un cuadro de diálogo

En lugar de hacer que los usuarios establezcan los criterios para un informe en su consulta base, puede presentar un cuadro de diálogo que pida a la persona que utiliza el informe que introduzca los criterios justo antes de imprimir. Un informe es más flexible cuando sus criterios se establecen en tiempo de ejecución porque los usuarios tienen control sobre el intervalo de datos que imprimen. En el formulario CuadroDeDiálogoVentasPorEmpleado, un usuario especifica las fechas de comienzo y final como los criterios de selección haciendo clic en fechas en un calendario.

Introducción

Cree un cuadro de diálogo que contenga el control ActiveX Calendar y controles de cuadro de texto para introducir los criterios del informe. Agregue los botones Vista previa, Imprimir, Cancelar y Establecer fecha de inicio. En la consulta base del informe, establezca los parámetros de consulta y los criterios para el campo de fecha mediante el uso de una expresión que incluya la colección Forms, el nombre del formulario y los nombres de los controles. En el procedimiento de evento para la propiedad AlAbrir (OnOpen), especifique los parámetros para la consulta.

Objetos utilizados en este ejemplo

Objeto	Nombre
Formulario	CuadroDeDiálogoVentasPorEmpleado
Informe	VentasPorEmpleado
Módulo	modEstáCargado
Paso a paso

1	Cree el informe VentasPorEmpleado.

2	Cree el formulario CuadroDeDiálogoVentasPorEmpleado.

a)	Cree un formulario independiente y establezca las siguientes propiedades de formulario.

Propiedad	Valor
Título (Caption)	Ventas por empleado
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
Modal (Modal)	Sí
EstiloDeLosBordes (BorderStyle)	Fino
BotonesMinMax (MinMaxButtons)	Ninguno
MenúDeMétodoAbreviado (ShortcutMenu)	No
AlCargar (OnLoad)	[Procedimiento de evento]
b)	Inserte el control ActiveX Calendar y establezca las siguientes propiedades de control.

Propiedad	Valor
Nombre (Name)	SeleccionarFecha
Verbo (Verb)	0
c)	Cree dos cuadros de texto independientes. Establezca en sus propiedades Formato (Format) Fecha corta y establezca las propiedades Título (Caption) para las etiquetas y las propiedades Nombre (Name) para los cuadros de texto como sigue.

Título para etiqueta	Nombre para cuadro de edición
Fecha de inicio:	FechaInicio
Fecha de fin:	FechaFin
d)	Cree los siguientes botones de comando, estableciendo sus propiedades Nombre (Name), Título (Caption) y AlHacerClic (OnClick) como sigue. Establezca también Sí en la propiedad Predeterminado (Default) del botón VistaPrevia.

Nombre	Título	Al hacer clic
VistaPrevia	Vista previa	[Procedimiento de evento]
Imprimir	Imprimir	[Procedimiento de evento]
Cancelar	Cancelar	[Procedimiento de evento]
EstablecerFecha	Establecer fecha de inicio	[Procedimiento de evento]
e)	En la sección de Declaraciones del módulo Form_CuadroDeDiálogoVentasPorEmpleado, escriba:

Const ConErrRptCanceled = 2501

3	Modifique la consulta VentasPorEmpleado.

a)	En el cuadro Criterios para el campo FechaEnvío, escriba:

Entre [Forms]![CuadroDeDiálogoVentasPorEmpleado]![FechaInicio] Y[Forms]![CuadroDeDiálogoVentasPorEmpleado]![FechaFin]

b)	Establezca los siguientes parámetros de consulta:

Forms!CuadroDeDiálogoVentasPorEmpleado!FechaInicio
Forms!CuadroDeDiálogoVentasPorEmpleado!FechaFin

c)	Establezca Fecha/Hora como tipo de datos para los parámetros de la consulta.

4	Cree el módulo módEstáCargado, si no lo ha hecho ya.

•	Cree la función EstáCargado.

5	Cree el procedimiento de evento Open del informe VentasPorEmpleado.

Referencias cruzadas

Para obtener más información sobre los siguientes temas, vea Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajo con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información "


Procedimiento de evento Load del formulario CuadroDeDiálogoVentasPorEmpleado

Private Sub Form_Load()

'  Usado por Soluciones para el programador para devolver registros basado en un ejemplo.

'  Introducir los parámetros en los cuadros de texto FechaInicio y FechaFin

'  al cargar el formulario.

Me!SeleccionarFecha = #4/1/96#

Me!FechaInicio = #4/1/96#

Me!FechaFin = #4/10/96#

End Sub


Procedimiento de evento Click del botón de comando VistaPrevia

Private Sub VistaPrevia_Click()

'  Vista previa del informe.

Dim cadNombreDocumento As String

On Error GoTo Err_VistaPrevia_Click

'Comprobar que la fecha de fin es posterior a la fecha de inicio.

If IsDate(FechaInicio) And IsDate(FechaFin) Then

If FechaFin < FechaInicio Then

MsgBox "La fecha de fin debe ser posterior a la fecha de inicio."

EstablecerFecha.Caption = "Establecer fecha de fin"

SeleccionarFecha.SetFocus

Exit Sub

End If

Else

MsgBox "Utilice una fecha válida para los valores Fecha de inicio y Fecha de fin."

Exit Sub

End If

cadNombreDocumento = "VentasPorEmpleado"

DoCmd.OpenReport cadNombreDocumento, acViewPreview

'  Usado por Soluciones para el programador para abrir el tema Muéstreme del informe.

If EstáCargado("SolucionesParaElProgramador") Then

If Forms!SolucionesParaElProgramador!Muéstreme Then

ShowHelpAPI

End If

End If

Salir_VistaPrevia_Click:

Exit Sub

Err_VistaPrevia_Click:

If Err = ConErrRptCanceled Then

Resume Salir_VistaPrevia_Click

Else

MsgBox Err.Description

Resume Salir_VistaPrevia_Click

End If

End Sub


Procedimiento de evento Click del botón de comando Imprimir

Private Sub Imprimir_Click()

'  Imprimir el informe.

Dim cadNombreDocumento As String

On Error GoTo Err_Imprimir_Click

'Comprobar que la fecha de fin es posterior a la fecha de inicio.

If FechaFin < FechaInicio Then

MsgBox "La fecha de fin debe ser posterior a la fecha de inicio."

EstablecerFecha.Caption = "Establecer fecha de fin"

SeleccionarFecha.SetFocus

Exit Sub

End If

cadNombreDocumento = "VentasPorEmpleado"

DoCmd.OpenReport cadNombreDocumento, acViewNormal

Salir_Imprimir_Click:

Exit Sub

Err_Imprimir_Click:

If Err = ConErrRptCanceled Then

Resume Salir_Imprimir_Click

Else

MsgBox Err.Description

Resume Salir_Imprimir_Click

End If

End Sub


Procedimiento de evento Click del botón de comando Cancelar

Private Sub Cancelar_Click()

'  Cerrar el formulario. (Este código lo creó el Asistente para botones de comando).

On Error GoTo Err_Cancelar_Click

DoCmd.Close

Salir_Cancelar_Click:

Exit Sub

Err_Cancelar_Click:

MsgBox Err.Description

Resume Salir_Cancelar_Click

End Sub


Procedimiento de evento Click del botón de comando EstablecerFecha

Private Sub EstablecerFecha_Click()

On Error GoTo EstablecerFecha_Error

If EstablecerFecha.Caption = "Establecer fecha de inicio" Then

FechaInicio = SeleccionarFecha.Value

EstablecerFecha.Caption = "Establecer fecha de fin"

Else

FechaFin = SeleccionarFecha.Value

EstablecerFecha.Caption = "Establecer fecha de inicio"

End If

Exit Sub

EstablecerFecha_Error:

MsgBox Err.Description

Exit Sub

End Sub


Función EstáCargado

Function EstáCargado(cadNombreFormulario As String) As Boolean

'  Determina si un formulario está cargado.

Const conDiseñoFormulario = 0

Dim entX As Integer

EstáCargado = False

For entX = 0 To Forms.Count - 1

If Forms(entX).FormName = cadNombreFormulario Then

If Forms(entX).CurrentView <> conDiseñoFormulario Then

EstáCargado = True

Exit Function  ' Salir de la función al encontrar el formulario.

End If

End If

Next

End Function


Imprimir en el informe los criterios de un cuadro de diálogo de criterios de un informe

Para mejorar la funcionalidad de un informe, puede imprimir los criterios que escribió en el cuadro de diálogo de criterios del informe en el informe. Por ejemplo, los valores que introdujo en los cuadros de texto FechaInicio y FechaFin del formulario CuadroDeDiálogoVentasPorEmpleado aparecen en el encabezado del informe en el informe VentasPorEmpleado.

Introducción

Cree un cuadro de texto independiente en el informe. Establezca en su propiedad OrigenDelControl (ControlSource) una expresión que devuelva los valores introducidos en los controles en el cuadro de diálogo de criterios del informe.

Objetos utilizados en este ejemplo

Objeto	Nombre
Formulario	CuadroDeDiálogoVentasPorEmpleado
Informe	VentasPorEmpleado
Paso a paso

1	Cree el informe VentasPorEmpleado.

2	Cree el formulario CuadroDeDiálogoVentasPorEmpleado.

3	Modifique el informe VentasPorEmpleado. Cree un cuadro de texto independiente en el encabezado del informe. Establezca Intervalo en su propiedad Nombre (Name), y en el cuadro de su propiedad Origen del control (ControlSource), escriba:

="Desde " & Formato([Forms]![CuadroDeDiálogoVentasPorEmpleado]![FechaInicio],"dd-mmm-yy") & " hasta " & Formato([Forms]![CuadroDeDiálogoVentasPorEmpleado]![FechaFin],"dd-mmm-yy")


Características más importantes del formulario IntroducirOModificarProductos

El formulario IntroducirOModificarProductos muestra cómo introducir o modificar registros en el mismo formulario. Estas técnicas hacen que el formulario IntroducirOModificarProductos funcione:

•	Creando un formulario que presente distintas barras de herramientas cuando cambia entre introducir nuevos registros y modificar los existentes.

•	Actualizando la lista en el cuadro combinado SeleccionarProducto después de que cambie a otro registro. (La técnica es la misma que la utilizada en el formulario ModificarProductos.)

Estas técnicas mejoran el formulario:

•	Agregar una nueva categoría a la lista de categorías.

•	Convertir en mayúscula automáticamente la primera letra del nombre del producto.


Crear un formulario en el que pueda introducir o modificar datos

Puede tener fácil acceso a los datos al crear un formulario en el cual pueda cambiar rápidamente entere la introducción de nuevos registros y la modificación de los existentes. Por ejemplo, el formulario IntroducirOModificarProductos se abre en modo de Introducción de datos. Para modificar registros, haga clic en Modificar datos en la barra de herramientas. Para volver a cambiar a introducir registros, haga clic en Introducir datos en la barra de herramientas.

Introducción

Diseñe el formulario de tal forma que se abra en modo Introducción de datos para introducir nuevos registros. En el encabezado del formulario, agregue los cuadros combinados en los cuales introduce datos de búsqueda y deshabilítelos. Cree funciones para dos botones de barra de herramientas personalizados, Modificar datos e Introducir datos. En las funciones, establezca la propiedad Permitir ediciones (AllowEdits) del formulario de forma que en el evento Activate del formulario, pueda utilizar el valor de la propiedad como un indicador para mostrar la barra de herramientas correcta. Cree dos barras de herramientas, una que incluya el botón Modificar datos y que se presente cuando el formulario esté en modo Introducción de datos y otra que incluya el botón Introducir datos y que se presente cuando el formulario esté en modo Modificación.

Objetos utilizados en este ejemplo

Objeto	Nombre
Tabla	Productos
Formulario	IntroducirOModificarProductos
Macro	IntroducirOModificarProductos
Módulo	módUtilidadesDeSoluciones, módBotonesIntroducirOModificar
Paso a paso

1	Cree el formulario IntroducirOModificarProductos.

a)	Establezca las siguientes propiedades de formulario.

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Productos
Título (Caption)	Introducir o modificar productos
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
EntradaDeDatos (DataEntry)	Sí
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	En la sección Detalle, agregue los campos de la tabla Productos. Utilice una casilla de verificación para el campo Suspendido, cuadros combinados para los campos IdProveedor e IdCategoría y cuadros de texto para todos los demás campos.

c)	Para evitar que las etiquetas parpadeen cuando se habilitan y deshabilitan los controles de la sección detalle, separe las etiquetas adjuntas de los controles cortando las etiquetas y después pegándolas.

d)	Como es un campo Autonumérico, haga el cuadro de texto de IdProducto de sólo lectura estableciendo No en su propiedad Activado (Enabled).

2	Agregue un encabezado de formulario y cree los cuadros combinados SeleccionarCategoría y SeleccionarProducto. La creación de estos cuadros combinados se explica en el tema Limitar el contenido de una lista en función del valor seleccionado en otra. El procedimiento para crear los cuadros combinados se escribió para el formulario ModificarProductos, así que necesitará hacer los siguientes cambios.

a)	Establezca lo siguiente en la propiedad Origen de la fila (RowSource) del cuadro combinado SeleccionarProducto:

SELECT DISTINCTROW Productos.NombreProducto, Productos.IdProducto, Productos.IdCategoría
FROM Productos
WHERE (((Productos.IdCategoría)=[Forms]![IntroducirOModificarProductos]![SeleccionarCategoría]))
ORDER BY Productos.NombreProducto;

b)	Cree un procedimiento de evento en la propiedad DespuésDeActualizar (AfterUpdate) del cuadro combinado SeleccionarProducto.

c)	Establezca No en la propiedad Activado (Enabled) de ambos cuadros combinados.

d)	Para evitar parpadeos cuando los cuadros combinados se habilitan y deshabilitan, separe las etiquetas adjuntas de ambos cuadros combinados cortando y pegando las etiquetas.

3	Cree la función ActivarControles en el módulo módUtilidadesDeSoluciones, si no lo ha hecho ya.

4	Cree el módulo módBotonesIntroducirOModificar.

a)	Cree la función ModificarDatos.

b)	Cree la función IntroducirDatos.

5	Cree dos barras de herramientas personalizadas.

a)	Cree una barra de herramientas y llámela IntroducirOModificarProductos1, utilizando las técnicas discutidas en Crear una barra de herramientas o una barra de menús personalizada.

b)	Incluya estos botones incorporados en la barra de herramientas:

Vista Diseño	Vista Formulario	Cortar	Copiar	Pegar	Deshacer	Eliminar registro
c)	Agregue a la barra de herramientas un botón personalizado llamado Introducir datos que ejecuta la función IntroducirDatos. Para ejecutar esta función, establezca = IntroducirDatos() en la propiedad Acción (OnAction) del botón.

d)	Cree una barra de herramientas y llámela IntroducirOModificarProductos2.

e)	Incluya estos botones incorporados en la barra de herramientas: Vista Diseño, Vista Formulario, Cortar, Copiar, Pegar y Deshacer.

f)	Agregue a la barra de herramientas un botón personalizado llamado Modificar datos que ejecuta la función ModificarDatos. Para ejecutar esta función, establezca = ModificarDatos() en la propiedad Acción (OnAction) del botón..

Nota   Las barras de herramientas personalizadas para los formularios en la aplicación Soluciones para el programador incluyen los botones Vista Diseño y Vista Formulario de forma que pueda cambiar fácilmente entre vistas mientras que está mirando los ejemplos. En la mayoría de los casos, no incluirá esos botones en las barras de herramientas que cree para sus aplicaciones.

6	Cree procedimientos de evento para las siguientes propiedades del formulario.

Propiedad	Valor
AlAbrir (OnOpen)	[Procedimiento de evento]
AlActivar (OnActivate)	[Procedimiento de evento]
Referencias cruzadas

Para obtener más información sobre los siguientes temas, vea Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajo con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento AfterUpdate del cuadro combinado SeleccionarProducto

Private Sub SeleccionarProducto_AfterUpdate()

' Buscar el registro del producto seleccionado en

' el cuadro combinado SeleccionarProducto,

' activar los controles de la sección Detalle,

' desactivar el cuadro de texto IdProducto

' e ir al cuadro combinado IdProveedor.

DoCmd.ApplyFilter , "IdProducto = Forms!IntroducirOModificarProductos!SeleccionarProducto"

ActivarControles Me, acDetail, True

Me!IdProducto.Enabled = False

Me!IdProveedor.SetFocus

End Sub


Función ModificarDatos

Function ModificarDatos() As Integer

' Código para el botón Modificar datos de la barra

' de herramientas IntroducirOModificarProductos1.

Dim formulario As Form

Dim ctlCombinado1 As Control

Dim ctlCombinado2 As Control

On Error GoTo ModificarDatos_Err

Set formulario = Forms!IntroducirOModificarProductos

Set ctlCombinado1 = Forms!IntroducirOModificarProductos!SeleccionarCategoría

Set ctlCombinado2 = Forms!IntroducirOModificarProductos!SeleccionarProducto

' Establecer la propiedad AllowEdits a True para

' indicar el modo de edición.

formulario.AllowEdits = True

' Cambiar las barras de herramientas.

DoCmd.ShowToolbar "IntroducirOModificarProductos1", acToolbarYes

DoCmd.ShowToolbar "IntroducirOModificarProductos2", acToolbarNo

' Activar y moverse al primer cuadro combinado.

ctlCombinado1.Enabled = True

ctlCombinado1.SetFocus

' Desactivar los controles de la sección Detalle.

ActivarControles formulario, acDetail, False

Exit Function

ModificarDatos_Err:

MsgBox Err.Description

Exit Function

End Function


Función IntroducirDatos

Function IntroducirDatos() As Integer

' Código para el botón Introducir datos de la barra

' de herramientas IntroducirOModificarProductos2.

Dim formulario As Form

Dim ctlCombinado1 As Control

Dim ctlCombinado2 As Control

On Error GoTo IntroducirDatos_Err

Set formulario = Forms!IntroducirOModificarProductos

Set ctlCombinado1 = Forms!IntroducirOModificarProductos!SeleccionarCategoría

Set ctlCombinado2 = Forms!IntroducirOModificarProductos!SeleccionarProducto

' Establecer la propiedad AllowEdits a False para

' indicar el modo de introducción de datos.

formulario.AllowEdits = False

' Activar los controles de la sección Detalle y

' desactivar el cuadro de texto IdProducto.

ActivarControles formulario, acDetail, True

formulario!IdProducto.Enabled = False

' Ir a un nuevo registro y moverse al cuadro

' combinado IdProveedor.

DoCmd.GoToRecord , , acNewRec

formulario!IdProveedor.SetFocus

' Cambiar las barras de herramientas.

DoCmd.ShowToolbar "IntroducirOModificarProductos1", acToolbarNo

DoCmd.ShowToolbar "IntroducirOModificarProductos2", acToolbarYes

' Desactivar los cuadros combinados del encabezado

' del formulario.

ctlCombinado1.Enabled = False

ctlCombinado2.Enabled = False

Exit Function

IntroducirDatos_Err:

MsgBox Err.Description

Exit Function

End Function


Procedimiento de evento Open del formulario IntroducirOModificarProductos

Private Sub Form_Open(Cancel As Integer)

' Establecer True (Verdadero) en la propiedad

' Permitir ediciones (AllowEdits) cuando se

' abre el formulario.

Me.AllowEdits = True

End Sub


Procedimiento de evento Activate del formulario IntroducirOModificarProductos

Private Sub Form_Activate()

' Ocultar la barra de herramientas Vista Formulario.

DoCmd.ShowToolbar "Vista Formulario", acToolbarNo

' Utilizar el valor de la propiedad AllowEdits para

' determinar la barra de herramientas a mostrar.

If Me.AllowEdits = True Then

DoCmd.ShowToolbar "IntroducirOModificarProductos2", acToolbarYes

Else

DoCmd.ShowToolbar "IntroducirOModificarProductos1", acToolbarYes

End If

End Sub


Características más importantes del formulario AgregarCategoría

El formulario AgregarCategoría se abre desde el formulario IntroducirOModificarProductos cuando agrega una nueva categoría al cuadro combinado IdCategoría. Esta técnica hace que el formulario AgregarCategoría funcione:

•	Agregando una nueva categoría a la lista de categorías.


Agregar un nuevo registro a una lista

A medida que introduce o modifica registros, podría necesitar agregar un nuevo elemento a la lista en un cuadro combinado. Por ejemplo, en el formulario IntroducirOModificarProductos, puede agregar una nueva categoría a la lista escribiendo el nombre en el cuadro combinado. El formulario presenta un cuadro de mensaje que pregunta si desea agregar un nuevo registro. Si elige Sí, presenta un formulario en el cual usted introduce la información para la nueva categoría.

Introducción

Cree un procedimiento de evento para la propiedad Al no estar en la lista (OnNotInList) del cuadro combinado IdCategoría en el formulario IntroducirOModificarProductos. (Este procedimiento de evento presenta un cuadro de diálogo en el cual puede confirmar que desea agregar una nueva categoría; si hace clic en Sí, abre el formulario AgregarCategoría.) Cree un procedimiento de evento para el evento OnClose del formulario AgregarCategoría que utiliza el método Requery para volver a consultar el cuadro combinado IdCategoría del formulario IntroducirOModificarProductos.

Objetos utilizados en este ejemplo

Objeto	Nombre
Tabla	Productos, Categorías
Formulario	IntroducirOModificarProductos, AgregarCategoría
Módulo	módEstáCargado
Paso a paso

1	En el formulario IntroducirOModificarProductos, cree un procedimiento de evento en la propiedad Al no estar en la lista (OnNotInList) del cuadro combinado IdCategoría.

2	Cree el módulo módEstáCargado, si no lo ha hecho ya.

a)	Cree la función EstáCargado.

3	Cree el formulario AgregarCategoría.

a)	Establezca las propiedades del formulario y cree procedimientos de evento como sigue.

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Categorías
Título (Caption)	Agregar categoría
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
EntradaDeDatos (DataEntry)	Sí
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
AjusteDeTamañoAutomático (AutoResize)	Sí
CentradoAutomático (AutoCenter)	Sí
AlActivar (OnActivate)	[Procedimiento de evento]
b)	En la sección Detalle, agregue los campos NombreCategoría, Descripción e Imagen de la tabla Categorías.

Referencias cruzadas

Para obtener más información sobre los siguientes temas, vea Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajo con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento NotInList del cuadro combinado IdCategoría

Private Sub IdCategoría_NotInList(DatosNuevos As String, Respuesta As Integer)

' Agregar una categoría nueva escribiendo un nombre

' en el cuadro combinado IdCategoría.

Dim entCategoríaNueva As Integer, entNombreTruncado As Integer, cadTítulo As String, entCuadroMensaje As Integer

' Mostrar un cuadro de mensaje preguntado al

' usuario si desea agregar una nueva categoría.

cadTítulo = "La categoría no está en la lista"

entCuadroMensaje = vbYesNo + vbQuestion + vbDefaultButton1

entCategoríaNueva = MsgBox("¿Desea agregar una categoría nueva?", entCuadroMensaje, cadTítulo)

If entCategoríaNueva = vbYes Then

' Quitar el nombre nuevo del cuadro combinado

' IdCategoría para que el usuario pueda volver a

' consultar el control al volver al formulario.

DoCmd.RunCommand acCmdUndo

' Mostrar cuadro de mensaje y ajustar la

' longitud del valor introducido

' en el cuadro combinado IdCategoría.

cadTítulo = "Nombre demasiado largo"

entCuadroMensaje = vbOKOnly + vbExclamation

If Len(DatosNuevos) > 15 Then

entNombreTruncado = MsgBox("Los nombres de categorías no pueden ser más largos de " _

& "15 caracteres. El nombre que introdujo se truncará.", _

entCuadroMensaje, cadTítulo)

DatosNuevos = Left(DatosNuevos, 15)

End If

' Abrir el formulario AgregarCategoría.

DoCmd.OpenForm "AgregarCategoría", acNormal, , , acAdd, acDialog, DatosNuevos

' Continuar sin mostrar el mensaje de error

' predeterminado.

Respuesta = acDataErrAdded

End If

End Sub


Procedimiento de evento Activate del formulario AgregarCategoría

Private Sub Form_Activate()

' Ocultar la barra de herramientas Vista Formulario.

DoCmd.ShowToolbar "Vista Formulario", acToolbarNo

' Utilizar el valor de la propiedad AllowEdits para

' determinar la barra de herramientas a mostrar.

If Me.AllowEdits = True Then

DoCmd.ShowToolbar "IntroducirOModificarProductos2", acToolbarYes

Else

DoCmd.ShowToolbar "IntroducirOModificarProductos1", acToolbarYes

End If

End Sub


Convertir a mayúsculas la primera letra de un campo

Puede hacer que los formularios sean más legibles y que los informes parezcan más profesionales si los datos de los campos tienen una apariencia coherente. Por ejemplo, los nombres de productos en la base de datos de ejemplo Neptuno deberían comenzar todos con mayúscula. Como un nombre de producto puede incluir varias palabras, alguna de las cuales no desea que estén en mayúscula, puede definir una función que pone en mayúscula solo la primera letra de la primera palabra y deja el resto de las letras en mayúscula o minúscula según como las escribió.

Introducción

Cree una función que ponga en mayúscula la primera letra del valor de un campo. Use esa función en un procedimiento de evento en la propiedad Después de actualizar (AfterUpdate) del control.

Objetos utilizados en este ejemplo

Objeto	Nombre
Tabla	Productos
Formulario	IntroducirOModificarProductos
Paso a paso

1	En el módulo del formulario IntroducirOModificarProductos, Form_IntroducirOModificarProductos, cree la función PrimeraEnMayúsculas.

2	En el formulario IntroducirOModificarProductos, cree un procedimiento de evento en la propiedad Después de actualizar (AfterUpdate) del cuadro de texto NombreProducto.

Sugerencia   Puede poner en mayúscula la primera letra de todas las palabras del campo utilizando la función de Visual Basic StrConv.

Referencias cruzadas

Para obtener más información sobre el siguiente tema, vea Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Función PrimeraEnMayúsculas del módulo Form_IntroducirOModificarProductos

Function PrimeraEnMayúsculas(Cad)

' Convertir a mayúsculas la primera letra del

' campo; dejar las demás letras como están escritas.

Dim cadTemp As String

cadTemp = Trim(Cad)

PrimeraEnMayúsculas = UCase(Left(cadTemp, 1)) & Mid(cadTemp, 2)

End Function


Procedimiento de evento AfterUpdate del cuadro de texto NombreProducto

Private Sub NombreProducto_AfterUpdate()

' Convertir a mayúsculas la primera letra del

' nombre del producto.

If Not (IsNull(Me!NombreProducto)) Then

Me!NombreProducto = PrimeraEnMayúsculas((Me!NombreProducto))

End If

End Sub


Características más importantes del informe Factura

El informe Factura muestra cómo crear cartas modelo personalizadas que dan las ventas totales de cada representante. Esta técnica hace que el informe Factura funcione:

•	Creando un informe que se imprima en un formulario preimpreso.

Y esta otra técnica mejora el informe:

•	Imprimir "Continúa" al final del formulario preimpreso.


Crear un informe que se imprima en un formulario preimpreso

En algunos informes, los datos deben imprimirse en un lugar predefinido. Por ejemplo, los datos de una factura de un formulario preimpreso deben aparecer en las zonas adecuadas del formulario. Si una factura ocupa más de una página, es necesario imprimir cierta información en todas las páginas; por ejemplo el nombre y dirección del cliente. Otra información, como el total de la factura, tiene que imprimirse sólo en la última página.

Información general

Coloque los controles del nombre y dirección del cliente, así como otros datos que tienen que aparecer, en el encabezado de página. Coloque los controles del subtotal, cargo y total en el pie de página. Cree un cuadro de texto independiente en el pie IdPedido. En la propiedad AlDarFormato (OnFormat) del pie del grupo, cree un procedimiento de evento que establezca el valor del cuadro de texto como Verdadero. En la propiedad AlDarFormato (OnFormat) del pie de página, cree un procedimiento de evento que imprima el pie de página sólo después de que se hayan impreso todos los registros de la sección Detalle (es decir, cuando el valor del cuadro de texto independiente sea Verdadero).

Objetos usados en este ejemplo

Objeto	Nombre
Tabla	Clientes, Empleados, Pedidos
Consulta	Factura, DetallesDePedidoConDescuento
Informe	Factura
Paso a paso

1	Importe la consulta DetallesDePedidoConDescuento desde la base de datos de ejemplo Neptuno, si todavía no lo ha hecho.

2	Cree la consulta Factura.

a)	Use los campos de las siguientes tablas y consultas:

Tabla/Consulta	Campo
Tabla Clientes	NombreCompañía, Dirección, Ciudad, Región, CódPostal, País
Tabla Empleados	Apellidos, Nombre
Tabla Pedidos	IdPedido, IdCliente, FechaPedido, FechaEntrega, FechaEnvío, FormaEnvío,  Cargo, Destinatario, DirecciónDestinatario, CiudadDestinatario, RegiónDestinatario CódPostalDestinatario, PaísDestinatario
Consulta DetallesDePedidoConDescuento	NombreProducto, IdProducto, PrecioUnidad, Cantidad, Descuento, PrecioConDescuento
b)	En la fila Criterios para el campo FechaEnvío, escriba:

Entre #1/5/95# Y #31/5/95#

Sugerencia   En su aplicación, probablemente desee pedir a los usuarios criterios de fecha cuando hagan vista preliminar o impriman el informe, en lugar de especificar las fechas en la consulta. Para ver un ejemplo de cómo establecer criterios en tiempo de ejecución, consulte el informe VentasPorEmpleado.

3	Diseñe el informe Factura.

a)	En el cuadro Ordenar y agrupar, establezca las siguientes propiedades:

Campo/Expresión	Orden	Propiedades del grupo
IdPedido	Descendente	Encabezado del grupo: Sí Pie del grupo: Sí Agrupar en: Cada valor Intervalo del grupo: 1 Mantener juntos: No
IdProducto	Ascendente	(Valores predeterminados)
Nota   El pedido que ocupa múltiples páginas es el 11.077, el pedido más actual de la base de datos. IdPedido está ordenado en sentido descendente, de modo que este pedido aparecerá el primero.

b)	En el cuadro de diálogo Configurar impresión, haga clic en la ficha Márgenes y luego establezca los márgenes izquierdo, derecho, superior e inferior a 1.

c)	Establezca la propiedad Altura (Height) de las siguientes secciones según se indica:

Sección	Alto
Encabezado de página	9,366cm
Sección Detalle	0,635cm
Pie de página	2,54cm
El encabezado y el pie de IdProducto no están visibles en el informe impreso, por lo que no es necesario establecer su propiedada Altura (Height).

d)	En el encabezado de página, cree cuadros de texto para el nombre y dirección del cliente y para cualquier otra información que desee que aparezca en cada página.

e)	En la sección Detalle, cree cuadros de texto y establezca sus propiedades de la siguiente manera

Nombre	OrigenDelControl
IdProducto	IdProducto
NombreProducto	NombreProducto
Cantidad	Cantidad
PrecioUnidad	PrecioUnidad
Descuento	Descuento
PrecioConDescuento	PrecioConDescuento
f)	En el pie de IdProducto, cree un cuadro de texto independiente. Establezca su propiedad Nombre (Name) a ImprimirPiePágina.

g)	En el pie IdPedido, cree un cuadro de texto que calcule el subtotal de la factura y establezca sus propiedades como se muestra a continuación:

Propiedad	Valor
Nombre (Name)	Subtotal
OrigenDelControl (ControlSource)	= Suma[PrecioConDescuento])
h)	Cree cuadros de texto en el pie de página y establezca sus propiedades así:

Nombre	OrigenDelControl
SubtotalFactura	=[Subtotal]
Gastos de envío	Gastos de envío
TotalFactura	=[SubtotalFactura]+ [Cargo]
i)	Establezca las propiedades y cree procedimientos de evento para las siguientes secciones:

Sección	Propiedad	Valor
Encabezado IdPedido	Visible	No
	AlDarFormato (OnFormat)	[Procedimiento de evento]
Pie de IdPedido	ForzarNuevaPágina (ForceNewPage)	Después de la sección
	Visible	No
	AlDarFormato (OnFormat)	[Procedimiento de evento]
Pie de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Referencias cruzadas

Para obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos  de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Format del encabezado IdPedido

Private Sub EncabezadoGrupo1_Format(Cancelar As Integer, ContarFormato As Integer)

' Establecer el valor del cuadro de texto Fila a 1 para marcar

' el comienzo del grupo del pedido actual.

' Establecer el valor del cuadro de texto PáginaDePedido a 1

' para mostrar que está es la primera página del pedido.

Me!Fila = 1

Me!PáginaPedido = 1

' Ocultar los controles Continúa y SaltoPáginaDetalle.

Me!Continúa.Visible = False

Me!SaltoPáginaDetalle.Visible = False

End Sub


Procedimiento de evento Format del pie IdPedido

Private Sub PieGrupo3_Format(Cancelar As Integer, ContarFormato As Integer)

' Reiniciar el cuadro de texto PiePáginaImpresa para mostrar

' que todos los registros han sido impresos para el pedido

' actual. El informe imprimirá el pie de página cuando

' el valor de PiePáginaImpresa sea Verdadero.

Me!ImprimirPiePágina = True

End Sub


Procedimiento de evento Format del pie de página

Private Sub PiePágina4_Format(Cancelar As Integer, ContarFormato As Integer)

' Determinar cuándo imprimir el pie de página.

' Imprimir el pie de página si todos los registros de detalle

' del pedido actual han sido impresos.

If Me!ImprimirPiePágina = True Then

Me.PrintSection = True

Me!ImprimirPiePágina = False

Else

' No imprimir el pie de página si todos los

' registros de detalle del pedido actual no

' han sido impresos.

Me.PrintSection = False

End If

End Sub


Procedimiento de evento Page del informe CartaDeVentas

Private Sub Report_Page()

' Dibujar un borde de página alrededor del informe.

 Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), , B

End Sub


Imprimir "Continúa" al final de un formulario preimpreso

Cuando hay muchos registros de detalle para un grupo, puede imprimir "Continúa" al final de la página para indicar que hay más registros en la página siguiente. Por ejemplo, en el informe Factura, no hay espacio para imprimir 17 registros de detalle en una página. Si la factura tiene más de 17 registros de detalle, el informe imprime 16 e imprime "Continúa" al final de la primera página dónde se hubiera imprimido el decimoséptimo registro de detalle. Luego sigue imprimiendo en la siguiente página empezando por el registro de detalle número 17.

Información general

Determine el máximo número de secciones Detalle que pueden imprimirse en una página. Cuando el informe dé formato a la última sección Detalle en una página (la 17 para el informe Factura), oculte los controles del registro de detalle, imprima "Continúa" y  no avance al siguiente registro.

Objetos usados en este ejemplo:

Tipo	Nombre
Tabla	Clientes, Empleados, Pedidos
Consulta	Factura, DetallesDePedidoConDescuento
Informe	Factura
Paso a paso

1	Diseñe un informe para un formulario preimpreso.

2	En el encabezado de página, cree un cuadro de texto independiente y establezca sus propiedades como se muestra a continuación:

Propiedad	Valor
Nombre (Name)	FilasPorPágina
OrigenDelControl (ControlSource)	=17
Visible	No
3	En el encabezado de IdPedido, cree dos cuadros de texto independientes.

a)	Establezca la propiedad Nombre (Name) de un cuadro de texto a CuentaFilas y en el cuadro de la propiedad OrigenDelControl (ControlSource), escriba:

=Cuenta([IdProducto])

b)	Establezca la propiedad Nombre (Name) del otro cuadro de texto a PáginaPedido y deje su propiedad OrigenDelControl (ControlSource) en blanco.

Sugerencia   En el informe Factura, el encabezado IdPedido no está visible. Si crea un informe donde esté visible, asegúrese de establecer la propiedad Visible de estos controles a No.

4	Realice los siguientes cambios en la sección Detalle:

a)	Cree un cuadro de texto independiente detrás de los otros controles, en el centro de la sección Detalle y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	Continúa
OrigenDelControl (ControlSource)	="Continúa en la página siguiente..."
FuenteEnCursiva (FontItalic)	Sí
b)	Cree un cuadro de texto independiente en la esquina derecha de la sección Detalle y establezca sus propiedades como se explica a continuación:

Propiedad	Valor
Nombre (Name)	Fila
Visible	No
c)	Cree un control de salto de página al final de la sección. Establezca su propiedad Nombre (Name) a SaltoPáginaDetalle.

5	Cree procedimientos de evento para las siguientes secciones:

Sección	Propiedad	Valor
Encabezado de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Encabezado IdPedido	AlDarFormato (OnFormat)	[Procedimiento de evento]
Sección Detalle	AlDarFormato (OnFormat)	[Procedimiento de evento]
Referencias cruzadas

Para obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Format del encabezado de página

Private Sub EncabezadoPágina0_Format(Cancelar As Integer, ContarFormato As Integer)

' Al principio de la página, iniciar los controles de la sección Detalle.

' Establecer el valor del cuadro de texto Fila a 0.

' Establecer la propiedad Visible para mostrar los controles del

' registro de detalle y ocultar los controles Continúa y SaltoPáginaDetalle.

With Me

!Fila = 0

!Continúa.Visible = False

!SaltoPáginaDetalle.Visible = False

!IdProducto.Visible = True

!NombreProducto.Visible = True

!Cantidad.Visible = True

!PrecioUnidad.Visible = True

!Descuento.Visible = True

!PrecioConDescuento.Visible = True

End With

End Sub


Procedimiento de evento Format de la sección Detalle

Private Sub Detalle2_Format(Cancelar As Integer, ContarFormato As Integer)

' Determinar si tiene que imprimir registro de detalle o "Continúa".

' Mostrar el cuadro de texto Continúa si estamos en el número

' máximo de registros de detalle por página.

If (Me!Fila = Me!PáginaPedido * (Me!FilasPorPágina - 1) + 1) And Me!Fila <> Me!CuentaFilas Then

Me!Continúa.Visible = True

End If

' Mostrar página de salto y ocultar los controles de la sección Detalle.

With Me

If !Continúa.Visible Then

!SaltoPáginaDetalle.Visible = True

!IdProducto.Visible = False

!NombreProducto.Visible = False

!Cantidad.Visible = False

!PrecioUnidad.Visible = False

!Descuento.Visible = False

!PrecioConDescuento.Visible = False

' Incrementar el valor de Página de pedido.

.NextRecord = False

!PáginaPedido = Me!PáginaPedido + 1

Else

' Incrementar el contador de fila si se imprime

' un registro de detalle.

!Fila = Me!Fila + 1

End If

End With

End Sub


Procedimiento de evento Format del encabezado IdPedido

Private Sub EncabezadoGrupo1_Format(Cancelar As Integer, ContarFormato As Integer)

' Establecer el valor del cuadro de texto Fila como 1 para

' marcar el comienzo del grupo del pedido actual.

' Establecer el valor del cuadro de texto PáginaDePedido

' como 1 para mostrar que está es la primera página del pedido.

Me!Fila = 1

Me!PáginaPedido = 1

' Ocultar los controles Continúa y SaltoPáginaDetalle.

Me!Continúa.Visible = False

Me!SaltoPáginaDetalle.Visible = False

End Sub


Características más importantes del informe RegistroDeEnvíos

El informe Registro de envíos ilustra cómo presentar datos en un formato de columna tipo periódico o al estilo de una guía telefónica. Esta técnica hace que el informe RegistroDeEnvíos funcione:

•	Creando un informe con varias columnas.

Esta otra técnica mejora el informe:

•	Ocultar un pie de grupo cuando aparece al principio de una página o columna.


Crear un informe con varias columnas

Puede crear un informe al estilo de una guía de teléfonos imprimiendo datos en dos o más columnas de tipo periodístico. Por ejemplo, el informe RegistroDeEnvíos imprime sus datos en dos columnas.

Información general

Establezca el ancho del informe a la del área de impresión de la página (el área comprendida dentro de los márgenes). Establezca el número y ancho de las columnas de la página en el cuadro de diálogo Configurar página del informe.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Pedidos
Consulta	SubtotalesDePedido, RegistroDeEnvíos
Informe	RegistroDeEnvíos
Paso a paso

1	Importe la consulta Subtotales de pedidos desde la base de datos de ejemplo Neptuno, si todavía no lo ha hecho.

2	Diseñe la consulta RegistroDeEnvíos.

Tabla/Consulta	Campo	Criterio
Tabla Pedidos	FechaEnvío	Entre #1/02/95# Y #31/03/95#
	IdPedido	—
Consulta SubtotalesDePedido	Subtotal	—
Sugerencia   En su aplicación, es probable que desee pedir a los usuarios el criterio de la fecha cuando hagan vista preliminar o impriman el informe, en lugar de especificar las fechas en la consulta. Para ver un ejemplo de cómo establecer criterios en tiempo de ejecución, consulte el informe VentasPorEmpleado.

3	Diseñe el informe RegistroDeEnvíos.

a)	En el cuadro Ordenar y agrupar, establezca las siguientes propiedades:

Campo/Expresión	Orden	Propiedades del grupo
FechaEnvío	Descendente	Encabezado del grupo: Sí Pie del grupo: Sí Agrupar en: Cada valor Intervalo del grupo: 1 Mantener juntos: Con el primer detalle
IdPedido	Ascendente	(Valores predeterminados)
b)	Establezca la propiedad Anchura (Width) del informe a 22,86cm.

c)	Establezca las siguientes opciones en el cuadro de diálogo Configurar página:

Tabulación	Opción	Valor
Página	Orientación	Horizontal
Márgenes	Márgenes	Izquierdo: 2,54cm Derecho: 2,54cm Superior: 2,54cm Inferior: 2,54cm
Columnas	Opciones de la cuadrícula	Número de columnas: 2
		Espacio entre columnas:  1,905cm
	Tamaño de columna	Ancho: 8,255cm Alto: 0,.583cm
	Diseño de columna	Hacia abajo y después a lo ancho
d)	Coloque en el encabezado de página etiquetas con los siguientes títulos: Fecha envío, Id. de pedido y Cantidad de pedido.

e)	Coloque los siguientes cuadros de texto en las secciones del informe que se indican a continuación y establezca las propiedades Nombre (Name) y OrigenDelControl (ControlSource) de la manera siguiente:

Sección	Nombre	OrigenDelControl
Encabezado FechaEnvío	FechaEnvío	FechaEnvío
Sección Detalle	IdPedido Subtotal	IdPedido Subtotal
f)	Copie las etiquetas Fecha envío, Id. de pedido y Cantidad de pedido del encabezado de página y péguelas a la derecha del primer conjunto. (La propiedad Izquierda (Left) de la segunda etiqueta Fecha de envío debería establecerse a 10,16cm.)


Ocultar una sección cuando se imprime al principio de una página o columna

Es útil utilizar un pie de grupo en blanco para separar grupos cuando se desea señalar con claridad la división entre ellos. Sin embargo, probablemente no se desea que se imprima un pie de grupo en blanco cuando es la primera sección de una página o columna. En el informe RegistroDeEnvíos, el pie FechaEnvío es una sección en blanco que no se imprime si se encuentra al principio de una página o columna.

Información general

Use la propiedad Superior (Top) para determinar si el pie del grupo es la primera sección con formato de una página o columna. En caso afirmativo, no imprima la sección ni avance a la siguiente posición de impresión de la página.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Pedidos
Consulta	SubtotalesDePedido, RegistroDeEnvíos
Informe	RegistroDeEnvíos
Paso a paso

1	Cree un informe con varias columnas.

2	En el encabezado FechaEnvío, cree un cuadro de texto independiente y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	Superior1
Visible	No
3	Cree procedimientos de evento para las siguientes secciones:

Sección	Propiedad	Valor
Encabezado de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Pie FechaEnvío	AlDarFormato (OnFormat)	[Procedimiento de evento]
Referencias cruzadas

Para obtener más información sobre el siguiente tema, consulte Creaciones de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Format del encabezado de página

Private Sub EncabezadoPágina1_Format(Cancelar As Integer, ContarFormato As Integer)

' En la parte superior de la página, establecer el valor

' del cuadro de texto Superior1 a 0.

Me!Superior1 = 0

End Sub


Procedimiento de evento Format del pie FechaEnvío

Private Sub PieGrupo4_Format(Cancelar As Integer, ContarFormato As Integer)

' Determinar si el pie de grupo es la primera sección

' con formato en la parte superior de la página o columna.

' No imprimir el pie de grupo si alguna de las

' instrucciones es True.

If Me!Superior1 = 0 Or Me.Top = Me!Superior1 Then Cancelar = True

End Sub


Características más importantes del informe CartaDeVentas

El informe CartaDeVentas es una carta modelo que usa un subinforme para resumir las ventas totales de un empleado. El subinforme se basa en parte de los resultados de una consulta de tabla de referencias cruzadas. Esta técnica hace que el informe CartaDeVentas funcione:

•	Creando una carta modelo con un borde de página.

Esta otra técnica mejora el informe:

•	Destacar datos mediante su inclusión en un círculo.


Crear una carta modelo con un borde de página

Cuando necesite enviar la misma carta a varias personas, puede usar un informe para crear una carta modelo. Por medio de los datos de su base de datos, puede personalizar el nombre, dirección y otra información en cada carta. Por ejemplo, el informe CartaDeVentas imprime el mismo mensaje de felicitación en todas las cartas, pero el nombre, objetivo y los totales trimestrales son los correspondientes a cada representante. Además, es posible que desee incluir un borde de página en el formulario impreso.

Información general

Cree las consultas base del informe. Coloque el nombre, dirección y otros controles del informe principal en la sección Detalle. Cree un subinforme para los totales trimestrales y agréguelo a la sección Detalle del informe principal. En la propiedad AlPaginar (OnPage) del informe, cree un procedimiento de evento que dibuje un borde de página.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Empleados, Pedidos, ObjetivosDeVentas
Consulta	SubtotalesDePedido, CartaDeVentas1 CartaDeVentas2
Informe	CartaDeVentas, SubinformeCartaDeVentas
Paso a paso

1	Importe la consulta Subtotales de pedidos de la base de datos de ejemplo Neptuno, si no lo hizo anteriormente.

2	Cree la consulte de tabla de referencias cruzadas CartaDeVentas1.

a)	En las tablas y consultas listadas, use los siguientes campos y expresiones:

Tabla/Consulta	Campo/Expresión	Valor
Tabla Empleados	IdEmpleado	Total: Agrupar por Tab ref cruz: Encabezado de fila
	NombreApellidos: [Apellidos] & ", " & [Nombre]	Total: Agrupar por Tab ref cruz: Encabezado de fila
Campos de la tabla Pedidos	Año: ParcFecha("aaaa", [FechaEnvío])	Total: Agrupar por Tab ref cruz: Encabezado de fila
	Expr1: "Tri" & ParcFecha("t", [FechaEnvío])	Total: Agrupar por Tab ref cruz: Encabezado de columna
	ParcFecha("aaaa", [FechaEnvío])	Total: Dónde Criterio: 1996
Consulta SubtotalesDePedidos	Subtotal	Total: Suma Tab ref cruz: Valor
Sugerencia   En su aplicación, es probable que desee pedir a los usuarios el criterio de fecha cuando presenten o impriman el informe, en lugar de especificar las fechas en la consulta. Para ver un ejemplo de cómo establecer criterios en tiempo de ejecución, consulte el informe VentasPorEmpleado.

b)	Establezca la propiedad TítulosDeColumna (ColumnHeadings) de la consulta con el siguiente valor:

"Tri1", "Tri2","Tri3","Tri4"

3	Cree la consulta CartaDeVentas2.

Tabla/Consulta	Campo/Expresión	Valor
Tabla Empleados	Apellidos	Orden: Ascendente
	Vendedor: [Nombre] & " " & [Apellidos]	—
	IdEmpleado, Dirección, Ciudad, Región, CódPostal, País	—
Tabla ObjetivosDeVentas	Objetivo	—
	AñoObjetivo: ParcFecha("aaaa" [ObjetivosDeVentas].[Año])	Criterios: [CartaDeVentas1].[Año]
Consulta CartaDeVentas1	Tri1, Tri2, Tri3, Tri4	—
4	Cree el informe CartaDeVentas.

a)	Establezca la propiedad OrigenDelRegistro (RecordSource) del informe a CartaDeVentas2.

b)	Elimine el encabezado y pie de página. (En este informe sólo es necesaria la sección Detalle.)

c)	En el cuadro Ordenar y agrupar, establezca la columna Campo/Expresión a Apellidos y la columna Orden a Ascendente.

d)	Establezca la propiedad ForzarNuevaPágina (ForceNewPage) de la sección Detalle a Después de la sección.

e)	Cree cuadros de texto para el nombre del vendedor, dirección, saludo y el texto de la carta. Para el saludo, use una expresión como la siguiente:

= "Estimado " & [Vendedor] & ":"

Para combinar texto y datos en un párrafo, use una expresión como:

="¡Enhorabuena! Usted ha alcanzado o excedido su objetivo de ventas trimestral de " & Formato([Objetivo],"$#,##0") & " en " & [Año Objetivo] & ". En el siguiente resumen de sus ventas, cada trimestre que está dentro del 90% de su objetivo está marcado."

Si un cuadro de texto contiene uno o más párrafos, haga el cuadro de texto del alto de una línea de texto y establezca la propiedad AutoExtensible (CanGrow) a Sí.

f)	Establezca la propiedad AlPaginar (OnPage) del informe CartaDeVentas a [Procedimiento de evento] para crear un borde de página.

5	Cree el SubinformeCartaDeVentas.

a)	Establezca la propiedad OrigenDelRegistro (RecordSource) del informe a CartaDeVentas2.

b)	Elimine el encabezado y pie de página. (Sólo es necesaria la sección Detalle.)

c)	Cree los cuadros de texto de los totales y objetivo trimestrales. Haga que los cuadros de texto tengan el mismo ancho y alto y sitúelos a intervalos regulares en la sección Detalle. Por ejemplo, para cada cuadro de texto establezca la propiedad Anchura (Width) a 2,54cm y la propiedad Altura (Height) a 0,502cm. Deje 0,3175cm entre cada cuadro de texto.

d)	Guarde el informe.

6	Agregue el subinforme al informe principal.

a)	Seleccione el SubinformeCartaDeVentas de la ventana Base de datos y arrástrelo a la sección Detalle del informe CartaDeVentas.

b)	Elimine la etiqueta del control subinforme y ajuste el tamaño del control del subinforme. Por ejemplo, haga que el control del subinforme sea del alto de una línea de texto.

c)	Verifique que las propiedades VincularCamposSecundarios (LinkChildFields) y VincularCamposPrincipales (LinkMasterFields) del control SubinformeCartaDeVentas estén establecidas a IdEmpleado.

7	Ajuste la ubicación de los controles en el informe principal. Por ejemplo, asegúrese de que las partes de la carta dirección, saludo, texto y despedida estén situadas según el estilo de carta que prefiera.


Resaltar datos encerrándolos en un círculo

Puede destacar unos datos específicos acentuándolos de alguna manera. Por ejemplo, el informe CartaDeVentas acentúa el total trimestral que es igual o mayor al 90 por ciento del objetivo, incluyéndolo en un círculo.

Información general

Use el método Círculo para dibujar un círculo o una elipse alrededor de un control que cumpla los criterios especificados.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Empleados, Pedidos, ObjetivosDeVentas
Consulta	SubtotalesDePedido, CartaDeVentas1, CartaDeVentas2
Informe	CartaDeVentas, SubinformeCartaDeVentas
Paso a paso

1	Cree el Subinforme CartaDeVentas.

2	En el Subinforme CartaDeVentas, cree un procedimiento de evento para la propiedad AlImprimir (OnPrint) de la sección Detalle.

Referencias cruzadas

Si desea obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Print de la sección Detalle

Private Sub Detalle0_Print(Cancelar As Integer, ContarImpresión As Integer)

' Dibujar una elipse alrededor de los controles que coinciden

' con el criterio especificado.

Dim ctl As Control

Dim entImprimirCírculo As Integer

Dim sngAspect As Single, sngYOffset As Single

Dim entAltoElipse As Integer, entAnchoElipse As Integer

Dim sngXCoord As Single, sngYCoord As Single

Dim entI As Integer

' Para obtener la elipse deseada, establecer sngAspect

' y sngYOffset de acuerdo al tamaño y ubicación de los cuadros

' de texto del subinforme.

sngAspect = 0.23

sngYOffset = 200

' Determinar alto y ancho de la elipse.

entAltoElipse = Me!Objetivo.Height * 1.1

entAnchoElipse = Me!Objetivo.Width * 1.04

sngYCoord = (Me!Objetivo.Top + Me!Objetivo.Height) \ 2 + sngYOffset

' Pasar por los controles que podrían quedar rodeados

' por la elipse. Si ctl no es Null, determinar si el valor

' es 90% o más que el valor del cuadro de texto Objetivo.

For entI = 1 To 4

Set ctl = Me("Tri" & entI)

If Not IsNull(ctl) Then

entImprimirCírculo = (ctl >= 0.9 * Me!Objetivo)

' Determinar las coordenadas de ctl y dibujar la elipse.

If entImprimirCírculo Then

sngXCoord = ctl.Left + (ctl.Width \ 2)

Me.Circle (sngXCoord, sngYCoord), entAnchoElipse \ 2, , , , sngAspect

End If

End If

Next entI

End Sub


Principales características del formulario TotalesDeVentas

El formulario TotalesDeVentas muestra cómo presentar de forma progresiva más detalles sobre las ventas de un empleado. Esta técnica hace que el formulario TotalesDeVentas funcione:

•	Creando un formulario uno a varios a varios.


Crear un formulario uno a varios a varios

Cuando examina datos, puede querer ver una presentación general y otra detallada. En el formulario TotalesDeVentas, puede revisar las ventas totales anuales del vendedor seleccionado además de sus ventas trimestrales totales del año seleccionado.

Información general

Cree un subformulario que presente los totales anuales y un segundo subformulario que presente los totales trimestrales. Cree un formulario principal dependiente de la tabla Empleados. En el encabezado del formulario principal, cree un cuadro combinado independiente que puede utilizar para buscar registros del empleado seleccionado. En la sección Detalle del formulario principal, cree un cuadro de texto independiente que vincule el segundo subformulario al primero. Establezca la propiedad OrigenDelControl (ControlSource) del cuadro de texto a una expresión que presente el valor desde el T-Año, (el campo de vinculación del primer subformulario). Establezca las propiedades VincularCamposSecundarios (LinkChildFields) y VincularCamposPrincipales (LinkMasterFields) del segundo subformulario a los campos que identifican el empleado y el año, es decir IdEmpleado y T-Año.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Empleados, Detalles de pedidos, Pedidos
Consulta	Vendedores, TotalesDeVentas(Tri) TotalesDeVentas(Año)
Formulario	TotalesDeVentas, SuformularioTotalesDeVentas1, SuformularioTotalesDeVentas2
Módulo	módUtilidadesDeSoluciones
Paso a paso

1	Cree la consulta Vendedores.

a)	Use los campos y expresiones de las siguientes tablas:

Tabla	Campo/Expresión
Empleados	IdEmpleado
Campos de la tabla Empleados	Vendedor: [Apellidos] &", " & [Nombre]
Pedidos	—
b)	En la celda Orden de la expresión Vendedor, haga clic en Ascendente.

Nota   En esta consulta no se utiliza ningún campo de la tabla Pedidos. La tabla Pedidos sólo se usa para limitar los empleados a aquellos que tengan registros en ellas.

2	Cree la consulta de TotalesDeVentas (Año).

Tabla	Campo/Expresión	Total	Criterio
Pedidos	IdEmpleado	Agrupar por	—
	T-Año: Año([FechaEnvío])	Agrupar por	Es Negado Nulo
Campos  de la tabla DetallesDePedido	Total: CMoneda(Suma(CLargo([PrecioUnidad] * [Cantidad] * (1-[Descuento]) * 100)/100))	Expresión	—
3	Cree la consulta de TotalesDeVentas (Tri).

Tabla	Campo/Expresión	Total	Criterio
Pedidos	IdEmpleado	Agrupar por	—
	T-Año: Año([FechaEnvío])	Agrupar por	Es Negado Nulo
	Trimestre: ParcFecha("t",[FechaEnvío])	Agrupar por	Es Negado Nulo
Campos  de la tabla DetallesDePedido	Subtotal: CMoneda(Suma(CLng([PrecioUnidad] * [Cantidad] * (1-[Descuento]) * 100)/100))	Expresión	—
4	Diseñe el formulario SubformularioTotalesDeVentas1.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	TotalesDeVentas(Año)
PresentaciónPredeterminada (DefaultView)	Hoja de datos
b)	Cree dos cuadros de texto en la sección Detalle y establezca las propiedades Nombre (Name) y OrigenDelControl (ControlSource) de la manera siguiente:

Nombre	OrigenDelControl
T-Año	T-Año
Total	Total
c)	Cambie a la vista Hoja de datos. Ajuste el ancho de las columnas y guarde el formulario.

5	Diseñe el formulario SubformularioTotalesDeVentas2.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	TotalesDeVentas(Tri)
PresentaciónPredeterminada (DefaultView)	Hoja de datos
b)	Cree dos cuadros de texto en la sección Detalle y establezca sus propiedades Nombre (Name) y OrigenDelControl (ControlSource) como se explica a continuación:

Nombre	OrigenDelControl
Trimestre	Trimestre
Subtotal	Subtotal
c)	Cambie a la vista Hoja de datos. Ajuste el ancho de las columnas y guarde el formulario.

6	Cree la función ActivarControles en el módulo módUtilidadesDeSoluciones, si no lo hizo anteriormente.

7	Diseñe el formulario TotalesDeVentas:

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Empleados
Título (Caption)	Totales de ventas
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	Agregue un encabezado y un pie de formulario. Establezca la propiedad Altura (Height) del pie a 0 cm.

c)	En el encabezado del formulario, cree un cuadro combinado independiente y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	SeleccionarVendedor
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	Vendedores
NúmeroDeColumnas (ColumnCount)	2
AnchuraDeColumna (ColumnWidths)	5,08cm; 0cm
ColumnaDependiente (BoundColumn)	2
LimitarALista (LimitToList)	Sí
DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
d)	En la sección Detalle, cree un cuadro de texto, separe su etiqueta y luego establezca las propiedades del cuadro de texto de la siguiente manera:

Propiedad	Valor
Nombre (Name)	Vendedor
OrigenDelControl (ControlSource)	=[Apellidos] & ", " & [Nombre]
Activado (Enabled)	No
PuntoDeTabulación (TabStop)	No
e)	En la sección Detalle, cree un cuadro de texto oculto y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	T-Año
OrigenDelControl (ControlSource)	=[SubformularioTotalesDeVentas1]![T-Año]
Visible	No
PuntoDeTabulación (TabStop)	No
Nota   Microsoft Access usa el valor de este cuadro de texto para vincular los valores del SubformularioTotalesDeVentas2 a la fila seleccionada en el SubformularioTotalesDeVentas1.

8	Agregue el SubformularioTotalesDeVentas1 al formulario TotalesDeVentas.

a)	Seleccione el SubformularioTotalesDeVentas1 en la ventana de la base de datos y arrástrelo a la sección Detalle del formulario TotalesDeVentas.

b)	Cambie la etiqueta del control del subformulario a Seleccionar año: y ajuste el tamaño del control del subformulario.

c)	Verifique que las propiedades VincularCamposSecundarios (LinkChildFields) y VincularCamposPrincipales (LinkMasterFields) del control del SubformularioTotalesDeVentas1 tienen el valor IdEmpleado..

d)	Establezca a No la propiedad Activado (Enabled) del control del SubformularioTotalesDeVentas1.

9	Agregue el SubformularioTotalesDeVentas2 al formulario TotalesDeVentas

a)	Seleccione el SubformularioTotalesDeVentas2 en la ventana de la base de datos y arrástrelo a la sección Detalle del formulario TotalesDeVentas.

b)	Cambie la etiqueta del control del subformulario a Totales trimestrales del año seleccionado: y ajuste el tamaño del control del subformulario.

c)	En las propiedades VincularCamposSecundarios (LinkChildFields) y VincularCamposPrincipales (LinkMasterFields) del control del SubformularioTotalesDeVentas2, escriba: T-Año;IdEmpleado.

d)	Establezca a No la propiedad Activado (Enabled) del control del SubformularioTotalesDeVentas2.

Referencias cruzadas

Si desea obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento AfterUpdate del cuadro combinado SeleccionarVendedor

Private Sub SeleccionarVendedor_AfterUpdate()

'  Buscar los registros del vendedor seleccionado en el

'  cuadro combinado Vendedor. Activar los controles de

'  la sección Detalle. Ir a SubformularioTotalesDeVentas1.

DoCmd.ApplyFilter , "IdEmpleado = Forms!TotalesDeVentas!SeleccionarVendedor"

ActivarControles Me, acDetail, True

Me!SubformularioTotalesDeVentas1.SetFocus

End Sub


Características más importantes del formulario MostrarVentas

El formulario MostrarVentas ilustra cómo usar los cuadros de texto y un grupo de opciones para especificar criterios de una consulta. Esta técnica hace que el formulario MostrarVentas funcione:

•	Usando una función personalizada en una instrucción SELECT de SQL.


Utilizar una función personalizada en una instrucción SELECT (SQL) de un formulario
Usar una función personalizada en una instrucción SELECT (SQL) de un formulario

En un formulario donde especifique los criterios de una consulta, es posible que desee que los usuarios elijan una opción de un conjunto específico de criterios. Por ejemplo, en el formulario MostrarVentas, puede especificar un intervalo de fechas y si desea ver todos los registros del intervalo de fechas o sólo aquellos cuyas ventas sean menores o mayores de 1000.

Información general

Cree un formulario en el que introducir criterios en cuadros de texto y un grupo de opciones en el Encabezado del formulario principal y presente los registros de un subformulario en la sección Detalle. Cree una función que devuelva el valor seleccionado en el grupo de opciones. Cree un botón de comando en el Encabezado del formulario principal. En la propiedad AlHacerClic (OnClick) del botón de comando, cree un procedimiento de evento que origine una instrucción SELECT de SQL que use la función personalizada para devolver los criterios del usuario y establezca la propiedad OrigenDelRegistro (RecordSource) del subformulario a la instrucción SELECT.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Clientes, Pedidos
Consulta	SubtotalesDePedido, MostrarVentas
Formulario	MostrarVentas, SubformularioMostrarVentas
Módulo	módUtilidadesDeSoluciones
Paso a paso

1	Cree el SubformularioMostrarVentas.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	SELECT [NombreCompañía] FROM Clientes WHERE False
PresentaciónPredeterminada (DefaultView)	Hoja de datos
PresentacionesPermitidas (ViewsAllowed)	Hoja de datos
MenúDeMétodoAbreviado (ShortcutMenu)	No
Nota   Al establecer la propiedad OrigenDelRegistro (RecordSource) a la instrucción SQL, se presentará el subformulario como una hoja de datos vacía cuando se abra el formulario MostrarVentas.

b)	En la sección Detalle, cree cuadros de texto para los campos NombreCompañía, IdPedido y Subtotal.

c)	Cambie a modo de presentación Hoja de datos. Ajuste el ancho de las columnas y guarde el formulario.

2	Cree el formulario MostrarVentas.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	—
Título (Caption)	MostrarVentas
PresentaciónPredeterminada (DefaultView)	Formulario sencillo
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
MenúDeMétodoAbreviado (ShortcutMenu)	No
AlAbrir (OnOpen)	[Procedimiento de evento]
b)	Seleccione en la ventana de base de datos el SubformularioMostrarVentas y arrástrelo a la sección Detalle del formulario MostrarVentas. Ajuste el tamaño y ubicación del control del subformulario y elimine la etiqueta adjunta. (Deje en blanco las propiedades VincularCamposSecundarios (LinkChildFields) y VincularCamposPrincipales (LinkMasterFields).)

c)	Agregue un Encabezado y Pie de formulario. Establezca a 0 la propiedad Altura (Height) del Pie del formulario.

d)	En el Encabezado del formulario, cree dos cuadros de texto independientes y establezca las propiedades Nombre (Name) y Formato (Format) como sigue:

Nombre	Formato
FechaInicio	Fecha mediana
FechaFin	Fecha mediana
e)	Escriba el nombre de cada cuadro de texto en la propiedad Título de su etiqueta adjunta.

f)	En el Encabezado del formulario, cree un grupo de opciones independiente y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	Ventas
ValorPredeterminado (DefaultValue)	1
g)	Escriba Ventas en la propiedad Título (Caption) de la etiqueta adjunta del grupo de opciones.

h)	Cree tres botones de opción en el grupo de opciones Ventas y establezca sus propiedades Nombre (Name) y ValorDeLaOpción (OptionValue) como se indica a continuación:

Nombre	ValorDeLaOpción
Menos de 1000	1
Más de 1000	2
Todo	3
i)	Escriba el nombre de cada botón de opción en la propiedad Título (Caption) de su etiqueta adjunta.

3	Importe la consulta SubtotalesDePedido de la base de datos de ejemplo Neptuno, si no lo ha hecho todavía.

4	Cree la consulta MostrarVentas.

a)	Use los campos de las siguientes tablas y consulta:

Tabla/Consulta	Campo
Tabla Clientes	NombreCompañía
Tabla Pedidos	FechaEnvío
Consulta SubtotalesDePedido	IdPedido
	Subtotal (Descendente)
b)	En la celda Criterios del campo IdTema, escriba:

Entre Forms![MostrarVentas]![FechaInicio] Y Forms![MostrarVentas]![FechaFin]

Sugerencia   Puede copiar la instrucción SQL desde la ventana SQL de la consulta para usarla en el procedimiento de evento del botón de comando creado en el paso 7.

5	En la sección General del módulo Form_MostrarVentas, cree la función MostrarValorDeVentas.

6	Cree el módulo módUtilidadesDeSoluciones, si todavía no lo ha hecho.

•	Cree la función ActivarControles.

7	En el Encabezado del formulario MostrarVentas, cree un botón de comando y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	MostrarVentas
Título (Caption)	Mostrar Ventas
Predeterminado (Defautl)	Sí
TextoDeAyudaDelControl (ControlTipText)	Mostrar las ventas que cumplen el criterio especificado.
AlHacerClic (OnClick)	[Procedimiento de evento]
Referencias cruzadas

Para obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento Open del formulario MostrarVentas

Private Sub Form_Open(Cancel As Integer)

' Mover punto de inserción al campo FechaInicio.

Me!FechaInicio.SetFocus

' Utilizado por Soluciones para el programador para

' devolver registros basado en un ejemplo.

Me!FechaInicio = #4/1/96#

Me!FechaFin = #4/30/96#

MostrarVentas_Click

End Sub


Función MostrarValorDeVentas

Private Function MostrarValorDeVentas(lngValorGrupoDeOpciones As Long) As String

' Devolver el valor seleccionado en el grupo de opciones Ventas.

' Definir constantes para valores del grupo de opciones.

Const conVentasDeMenosDe1000 = 1

Const conVentasDeMásDe1000 = 2

Const conTodasLasVentas = 3

' Crear restricción basada en el valor del grupo de opciones.

Select Case lngValorGrupoDeOpciones

Case conVentasDeMenosDe1000:

MostrarValorDeVentas = "SubtotalesDePedido.Subtotal < 1000"

Case conVentasDeMásDe1000:

MostrarValorDeVentas = "SubtotalesDePedido.Subtotal >= 1000"

Case Else

MostrarValorDeVentas = "SubtotalesDePedido.Subtotal = True"

End Select

End Function


Procedimiento de evento Click del botón de comando MostrarVentas

Private Sub MostrarVentas_Click()

' Comprobar que la fecha de fin es posterior a la fecha de inicio.

If FechaFin < FechaInicio Then

MsgBox "La fecha de fin debe ser posterior a la fecha de inicio."

FechaInicio.SetFocus

Exit Sub

End If

' Crear una instrucción SQL utilizando el criterio de búsqueda

' introducido por el usuario para establecer la propiedad

' RecordSource de SubformularioMostrarVentas.

Dim cadSQL As String, cadRestricción As String

Dim lngX As Long

lngX = Forms!MostrarVentas!Ventas.Value

cadRestricción = MostrarValorDeVentas(lngX)

' Crear instrucción SELECT.

cadSQL = "SELECT DISTINCTROW Clientes.NombreCompañía, SubtotalesDePedido.IdPedido, "

cadSQL = cadSQL & "SubtotalesDePedido.Subtotal, Pedidos.FechaEnvío "

cadSQL = cadSQL & "FROM Clientes INNER JOIN (SubtotalesDePedido INNER JOIN Pedidos ON "

cadSQL = cadSQL & "SubtotalesDePedido.IdPedido = Pedidos.IdPedido) ON "

cadSQL = cadSQL & "Clientes.IdCliente = Pedidos.IdCliente "

cadSQL = cadSQL & "WHERE (Pedidos.FechaEnvío Between Forms!MostrarVentas!FechaInicio "

cadSQL = cadSQL & "And Forms!MostrarVentas!FechaFin) "

cadSQL = cadSQL & "And " & cadRestricción

cadSQL = cadSQL & " ORDER BY SubtotalesDePedido.Subtotal DESC;"

' Establecer la propiedade RecordSource de SubformularioMostrarVentas.

Me!SubformularioMostrarVentas.Form.RecordSource = cadSQL

' Si ningún registro coincide con el criterio, restablecer

'la propiedad RecordSource del formulario, mostrar un mensaje

' y mover el enfoque al cuadro de texto FechaInicio.

If Me!SubformularioMostrarVentas.Form.RecordsetClone.RecordCount = 0 Then

Me!SubformularioMostrarVentas.Form.RecordSource = "SELECT NombreCompañía FROM Clientes WHERE False;"

MsgBox "Ningún registro coincide con el criterio introducido.", vbExclamation, "No se encontró ningún registro"

Me!FechaInicio.SetFocus

Else

' Activar los controles de la sección Detalle.

ActivarControles Me, acDetail, True

' Mover el punto de inserción a SubformularioMostrarVentas.

Me!SubformularioMostrarVentas!NombreCompañía.SetFocus

End If

End Sub


Características más importantes del formulario ListaDeTeléfonosDeClientes

El formulario ListaDeTeléfonosDeClientes muestra cómo presentar un registro de un formulario y después, de forma simultánea, un segundo registro en otra copia del formulario. Esta técnica hace que el formulario ListaDeTeléfonosDeClientes funcione:

•	Presentando múltiples instancias de un formulario.

La técnica que mejora el formulario ListaDeTeléfonosDeClientes es:

•	Usar una función para crear un cuadro de lista de selección  múltiple.


Mostrar múltiples instancias de un formulario

En un formulario que presenta registros de una lista, como la lista de teléfonos de los clientes, es posible que desee ver la información específica de más de un registro al mismo tiempo. En el formulario ListaDeTeléfonosDeClientes, puede hacer clic en un botón de comando para ver información específica del cliente de un segundo formulario y luego ver información detallada sobre otros clientes en copias separadas del segundo formulario.

Información general

Cree un formulario ListaDeTeléfonosDeClientes que presente una lista de clientes. Cree un formulario Clientes que presente información específica sobre los clientes. Defina una propiedad personalizada y procedimientos para controlar las múltiples instancias del formulario. Agregue un botón de comando al formulario que presente una instancia separada del formulario Clientes para cada registro de cliente.

Objetos usados en este ejemplo

Objeto	Nombre
Tabla	Clientes
Formulario	ListaDeTeléfonosDeClientes, Clientes
Paso a paso

1	Cree el formulario ListaDeTeléfonosDeClientes.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Clientes
Título (Caption)	Lista de teléfonos de clientes
PresentaciónPredeterminada (DefaultView)	Formularios continuos
PresentacionesPermitidas (ViewsAllowed)	Ambas
PermitirEdiciones (AllowEdits)	No
PermitirEliminación (AllowDeletions)	No
PermitirAgregar (AllowAdditions)	No
AjusteDeTamañoAutomático (AutoResize)	Sí
CentradoAutomático (AutoCenter)	Sí
b)	En el Encabezado del formulario, cree las etiquetas Nombre de compañía, Nombre del contacto, País y Teléfono.

c)	En la sección Detalle, agregue los campos NombreCompañía, NombreContacto, País y Teléfono de la tabla Cliente como cuadros de texto y elimine las etiquetas de los cuadros de texto que son creadas automáticamente.

2	Cree el formulario Clientes.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Clientes
Título (Caption)	Clientes
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Ambas
PermitirEdiciones (AllowEdits)	No
PermitirEliminación (AllowDeletions)	No
PermitirAgregar (AllowAdditions)	No
SelectoresDeRegistro (RecordSelectors)	No
AjusteDeTamañoAutomático (AutoResize)	Sí
CentradoAutomático (AutoCenter)	Sí
b)	En el Encabezado del formulario, cree una etiqueta Clientes.

c)	En la sección Detalle, agregue los campos de la tabla Clientes como cuadros de texto.

3	En la sección Declaraciones del módulo Form_ListaDeTeléfonosDeClientes, declare las variables.

4	En la sección Declaraciones del módulo Form_Clientes, declare las variables.

5	A nivel del módulo Form_Clientes agregue las instrucciones Propiedad Obtener (Get) y Propiedad Permitir (Let) para definir una propiedad personalizada que controle las instancias del formulario.

6	A nivel del módulo Form_ ListaDeTeléfonosDeClientes, cree un subprocedimiento personalizado para controlar las instancias de formulario.

7	Cree un procedimiento de evento para el formulario ListaDeTeléfonosDeClientes de la siguiente manera:

Propiedad	Valor
AlCerrar (OnClose)	[Procedimiento de evento]
8	Cree procedimientos de evento para el formulario Clientes según se indica:

Propiedad	Valor
AlCerrar (OnClose)	[Procedimiento de evento]
AlAbrir (OnOpen)	[Procedimiento de evento]
9	En la sección Detalle del formulario ListaDeTeléfonosDeClientes, cree un botón de comando Ver y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	Ver
Título (Caption)	Más...
TextoDeAyudaDelControl (ControlTipText)	Haga clic aquí para obtener más información acerca del cliente actual.
AlHacerClic (OnClick)	[Procedimiento de evento]
Referencias cruzadas

Si desea obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"
Trabajo con objetos y colecciones	Capítulo 5, "Trabajo con objetos y colecciones"


Sección Declaraciones del módulo Form_ListaDeTeléfonosDeClientes

Option Compare Database

Option Explicit

' Colección que contiene instancias del formulario Clientes.

Dim colFormulariosClientes As New Collection


Sección Declaraciones del módulo Form_Clientes

Option Compare Database

Option Explicit

' Variables públicas que serán utilizadas para hacer el seguimiento de

' las instancias del formulario.

Dim cadMultiInstKey As String

Dim frmClientes As Form_Clientes


Instrucción Property Get del módulo Form_Clientes

Public Property Get MultiInstKey() As String

' Definir la propiedad personalizada MultiInstKey.

MultiInstKey = cadMultiInstKey

End Property


Instrucción Property Let del módulo Form_Clientes

Public Property Let MultiInstKey(cadVal As String)

'Definir la propiedad personalizada MultiInstKey.

cadMultiInstKey = cadVal

End Property


Procedimiento Sub QuitarCopiaDeFormulario del módulo Form_ListaDeTeléfonosDeClientes

Public Sub QuitarCopiaDeFormulario(cadCuál As String)

' Quitar de la colección la copia del formulario Clientes

' especificado por cadCuál.

colFormulariosClientes.Remove cadCuál

End Sub


Procedimiento de evento Close del formulario ListaDeTeléfonosDeClientes

Private Sub Form_Close()

Dim entÍndice As Integer

Dim frm As Form_Clientes

' Abrir el formulario CuadroDeDiálogoClientes para preguntar al

' usuario qué formularios desea mantener abiertos.

If colFormulariosClientes.Count > 0 Then

DoCmd.OpenForm "CuadroDeDiálogoClientes", , , , , acDialog

End If

' Cerrar todos los formularios de la colección para que no

' vuelvan a llamar a este formulario al cerrarse. Observe

' que este formulario se cierra antes que los demás y quita

' la colección del alcance. Esto liberará todas las variables

' del formulario y cierra todos los formulario Clientes.

For Each frm In colFormulariosClientes

frm.MultiInstKey = ""

Next

End Sub


Procedimiento de evento Close del formulario Clientes

Private Sub Form_Close()

' Quitar de la colección esta copia del formulario ejecutada

' por ListaDeTeléfonosDeClientes. El formulario ListaDeTeléfonosDeClientes

' establece en este formulario una propiedad definida

' por el usuario para hacerle saber que es un formulario

' de varias copias. Este procedimiento comprueba esa

' propiedad para saber si este elemento se debe eliminar de la colección.

If cadMultiInstKey <> "" Then

Forms!ListaDeTeléfonosDeClientes.QuitarCopiaDeFormulario cadMultiInstKey

End If

End Sub


Procedimiento de evento Open del formulario Clientes

Private Sub Form_Open(Cancel As Integer)

'Inicializar cadMultiInstKey.

cadMultiInstKey = ""

End Sub


Procedimiento de evento Click del botón de comando Ver

Private Sub Ver_Click()

Dim frmNuevaCopia As Form_Clientes

Const conFormularioNoExiste = 5

On Error Resume Next

'Comprobar que ya existe en la colección una copia del formulario.

Set frmNuevaCopia = colFormulariosClientes(Me!IdCliente)

If Err = conFormularioNoExiste Then

' El formulario no existe.

Set frmNuevaCopia = New Form_Clientes

' Establecer las propiedades del formulario, incluida

' la propiedad personalizada MultiInstKey.

With frmNuevaCopia

.MultiInstKey = Me!IdCliente

.AllowAdditions = False

.AllowDeletions = False

.NavigationButtons = False

.RecordSelectors = False

.RecordSource = "Select * from Clientes Where Clientes.IdCliente = """ & Me!IdCliente & """;"

.Requery

.Visible = True

End With

colFormulariosClientes.Add Item:=frmNuevaCopia, Key:=Me!IdCliente

Else

' El formulario existe. Cambiar el enfoque al formulario.

frmNuevaCopia.SetFocus

DoCmd.Restore

End If

End Sub


Características más importantes del formulario CuadroDeDiálogoClientes

El formulario CuadroDeDiálogoClientes ilustra cómo usar Visual Basic para rellenar el contenido de un cuadro de lista y permitir que los usuarios seleccionen múltiples elementos de la lista.

Nota   Para ver cómo funciona el formulario CuadroDeDiálogoClientes, abra múltiples instancias del formulario Clientes haciendo doble clic en el botón 'Más…" del formulario ListaDeTeléfonosDeClientes. Cuando estén visibles varios formularios Clientes, cierre el formulario ListaDeTeléfonosDeClientes y se mostrará el formulario CuadroDeDiálogoClientes.

Esta técnica hace que el formulario CuadroDeDiálogoClientes funcione:

•	Usando una función para crear un cuadro de lista de selección múltiple.


Utilizar una función para crear un cuadro de lista de selección múltiple

Cuando un usuario cierra un formulario principal que presenta instancias múltiples de un segundo subformulario, el usuario puede elegir que las instancias del segundo formulario permanezcan abiertas. Por ejemplo, cuando se cierra el formulario ListaDeTeléfonosDeClientes, el formulario CuadroDeDiálogoClientes presenta un cuadro de lista en el que muestra los registros del cliente actualmente presentados en instancias del formulario Clientes. El usuario puede dejar abiertos los registros del cliente que desee.

Información general

Cree un formulario CuadroDeDiálogoClientes que presente en un cuadro de lista los registros del cliente. Cree una función para rellenar el cuadro de lista. Agregue un botón de comando al formulario que cierre el formulario CuadroDeDiálogoClientes pero que mantenga abiertos los registros seleccionados en instancias del formulario Clientes.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Clientes
Formulario	ListaDeTeléfonosDeClientes, Clientes, CuadroDeDiálogoClientes
Paso a paso

1	Cree el formulario CuadroDeDiálogoClientes.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Ambas
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
AjusteDeTamañoAutomático (AutoResize)	Sí
CentradoAutomático (AutoCenter)	Sí
Emergente (PopUp)	Sí
Modal (Modal)	Sí
EstíloDeLosBordes (BorderStyle)	Diálogo
b)	En la sección Detalle, cree una etiqueta que muestre instrucciones acerca de cómo usar el cuadro de diálogo.

c)	En la sección Detalle, cree el cuadro de lista IstFormularios y el botón de comando cmdAceptar.

2	En el módulo Form_ListaDeTeléfonosDeClientes, cree la función DevolverColección.

3	En el módulo Form_Clientes, cree el procedimiento Sub MantenerAbierto.

4	En la sección Declaraciones del módulo Form_CuadroDeDiálogoClientes, escriba lo siguiente:

Dim colFormulariosClientes As Collection

5	En el módulo Form_CuadroDeDiálogoClientes, cree la función Llenar_lstFormularios.

6	Establezca la propiedad TipoDeOrigenDeLaFila (RowSourceType) del cuadro de lista lstFormularios a Llenar_lstFormularios.

7	Establezca la propiedad AlHacerClic (OnClick) del botón de comando cmdAceptar a [Procedimiento de evento].

Referencias cruzadas

Si desea obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Función DevolverColección del módulo Form_ListaDeTeléfonosDeClientes

Public Function DevolverColección() As Collection

' Devuelver la colección de formularios de Clientes abiertos.

Set DevolverColección = colFormulariosClientes

End Function


Procedimiento Sub MantenerAbierto del módulo Form_Clientes

Public Sub MantenerAbierto(frmQuiénSoy As Form_Clientes)

'Indicar que este formulario debería mantenerse abierto cuando se

'cierre el CuadroDeDiálogoClientes.

Set frmClientes = frmQuiénSoy

End Sub


Función Llenar_lstFormularios

Function Llenar_lstFormularios(ctl As Control, lngId As Long, lngFila As Long, lngCol As Long, entCódigo As Integer) As Variant

Dim frm As Form_Clientes

'Error si está abierto el formulario ListaDeTeléfonosDeClientes.

Const conFormularioNoEstáAbierto = 2450

On Error GoTo Error_Llenar

Select Case entCódigo

Case acLBInitialize     'Iniciar el cuadro de lista.

Set colFormulariosClientes = Forms![ListaDeTeléfonosDeClientes].DevolverColección

Llenar_lstFormularios = True

Case acLBOpen       'Abrir.

Llenar_lstFormularios = Timer

Case acLBGetRowCount        'Obtener el número de filas.

Llenar_lstFormularios = colFormulariosClientes.Count

Case acLBGetColumnCount     'Obtener el número de columnas.

Llenar_lstFormularios = 1

Case acLBGetColumnWidth     'Obtener el ancho de columna.

Llenar_lstFormularios = -1      'Utilizar el ancho predeterminado.

Case acLBGetValue           'Obtener los datos.

Set frm = colFormulariosClientes(lngFila + 1)

Llenar_lstFormularios = frm![NombreCompañía]

End Select

Exit Function

Error_Llenar:

If Err = conFormularioNoEstáAbierto Then

Exit Function

Else

MsgBox Err.Description

Exit Function

End If

End Function


Procedimiento de evento Click del botón de comando cmdAceptar

Private Sub cmdAceptar_Click()

Dim varÍndice As Variant

Dim frm As Form_Clientes

Const conObjetoRequerido = 424

On Error GoTo Error_Cerrar

If Me!lstFormularios.ListIndex = 0 And IsNull(Me!lstFormularios.ItemData(0)) Then

' Si no hay elementos en la lista, cerrar el formulario y

' salir del procedimiento.

DoCmd.Close acForm, "CuadroDeDiálogoClientes"

Exit Sub

End If

' Establecer el valor de la propiedad definida por el usuario

' MantenerAbierto de los formularios que deben permanecer abiertos.

varÍndice = 1

' Determinar los elementos seleccionados en el cuadro de lista.

For Each varÍndice In lstFormularios.ItemsSelected

Set frm = colFormulariosClientes(varÍndice + 1)

frm.MantenerAbierto frm

Next varÍndice

DoCmd.Close acForm, "CuadroDeDiálogoClientes"

Exit Sub

Error_Cerrar:

If Err = conObjetoRequerido Then

DoCmd.Close acForm, "CuadroDeDiálogoClientes"

Exit Sub

Else

MsgBox Err.Description

Exit Sub

End If

End Sub


Información general acerca de Soluciones para el programador

Soluciones para el programador es una aplicación autodocumentada que presenta una colección de los formularios, informes y elementos de interfaz más usados para crear aplicaciones. En muchos ejemplos se incluyen características nuevas de esta versión de Microsoft Access.

Quién debe utilizar Soluciones para el programador

Los ejemplos de Soluciones para el programador le serán más útiles si ya sabe cómo crear consultas, formularios, informes y macros y si se ha familiarizado con la información que aparece en Creación de aplicaciones con Microsoft Access97.

Sugerencias para el uso de Soluciones para el programador

Todos los ejemplos de esta aplicación aparecen en el formulario principal SolucionesParaElProgramador, presentado nada más abrir la base de datos Soluciones para el programador. Para abrir un formulario o informe de ejemplo, primero seleccione una categoría de ejemplos en el cuadro de lista superior del formulario SolucionesParaElProgramador y haga doble clic en el ejemplo del cuadro de lista inferior, o seleccione el ejemplo y haga clic en Aceptar. Soluciones para el programador automáticamente presentará el formulario o informe de ejemplo y el tema Principales características desde Muéstreme, el sistema de ayuda de Soluciones para el programador.

El tema Principales características de Muéstreme identifica las técnicas usadas para crear el formulario o informe. Haga clic en la técnica que le interese y siga las instrucciones paso a paso para ver cómo se aplicó la técnica al formulario o informe.

Sugerencias para el uso de Muéstreme

El tema Muéstreme de un formulario o informe se presenta automáticamente una vez seleccionada la casilla de verificación en la parte inferior del formulario SolucionesParaElProgramador. Para mostrar el tema Muéstreme de un formulario en vista Formulario, o de un informe en Vista preliminar, presione F1 o haga clic en el botón Muéstreme en la barra de herramientas.

Las principales características de Muéstreme se asemejan a las de la Ayuda de Microsoft Access:

•	Para usar una palabra clave o frase para buscar un tema, haga clic en el botón Temas de ayuda de la ventana Muéstreme y haga clic en la ficha Índice o Buscar.

•	Para imprimir un tema, haga clic en Opciones y luego en Imprimir tema.

•	Para copiar texto o el código de Visual Basic para aplicaciones desde un tema, use el botón secundario del mouse para seleccionar el texto que desea copiar y luego haga clic en Copiar en el menú contextual.

•	Para mantener la ventana Muéstreme en la parte superior, haga clic en Opciones, apunte a Mantener la ayuda visible y haga clic en Visible.


Características más importantes del formulario LimitarContenidoDeLista

El formulario LimitarContenidoDeLista ilustra cómo presentar sólo los productos de una categoría seleccionada. La siguiente técnica aparece en el formulario LimitarContenidoDeLista:

•	Limitar el contenido de una lista en función del valor seleccionado en un grupo de opciones.


Limitar el contenido de una lista basándose en el valor seleccionado en un grupo de opciones

Puede usar los valores de un control para determinar los valores presentados en una lista. Si el grupo que determina los valores es estable, como las categorías de la base de datos de ejemplo Neptuno, puede presentarlas en un grupo de opciones. Por ejemplo, cuando selecciona una categoría en el formulario LimitarContenidoDeLista, sólo se presentan los productos de esa categoría.

Información general

Incluya el campo IdCategoría en la consulta base del cuadro de lista SeleccionarProducto. Establezca los criterios de IdCategoría como una expresión que limite la lista a aquellos productos cuyo valor IdCategoría se corresponda al valor seleccionado en el grupo de opciones SeleccionarCategoría. Vuelva a consultar la lista de productos después de seleccionar una categoría.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Productos
Consulta	LimitarListaDeProductos2
Formulario	LimitarContenidoDeLista
Paso a paso

1	Cree la consulta LimitarListaDeProductos2.

a)	Use los siguientes campos de la tabla Productos:

Campo	Orden
NombreProducto	Ascendente
IdProducto	—
IdCategoría	—
b)	En la celda Criterios del campo IdCategoría, escriba:

Forms!LimitarContenidoDeLista!SeleccionarCategoría

2	Cree el formulario LimitarContenidoDeLista.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Productos
Título (Caption)	Limitar el contenido de la lista
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	Cree un grupo de opciones independiente y establezca su propiedad Nombre (Name) a SeleccionarCategoría.

c)	Para cada categoría de un grupo de opciones, agregue un botón de opción y escriba el nombre de la categoría en cada etiqueta.

d)	Establezca la propiedad ValorDeLaOpción (OptionValue) para todos los botones de opción como el valor de IdCategoría correspondiente. Por ejemplo, el valor de IdCategoría para Bebidas es 1, de modo que debería establecer a 1 la propiedad ValorDeLaOpción (OptionValue) del botón de opción Bebidas.

e)	Establezca a 1 la propiedad ValorPredeterminado (DefaultValue) del grupo de opciones.

f)	Cree un procedimiento de evento para la propiedad DespuésDeActualizar (AfterUpdate) del grupo de opciones.

g)	Cree un cuadro de lista independiente y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	SeleccionarProducto
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	LimitarListaDeProductos2
NúmeroDeColumnas (ColumnCount)	2
AnchuraDeColumna (ColumnWidths)	0cm
ColumnaDependiente (BoundColumn)	2
Referencias cruzadas

Si desea obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento AfterUpdate del grupo de opciones SeleccionarCategoría

Private Sub SeleccionarCategoría_AfterUpdate()

' Volver a realizar la consulta del cuadro de lista

' SeleccionarProducto.

Me!SeleccionarProducto.Requery

End Sub


Características más importantes del formulario AgregarTodoALaLista

El formulario AgregarTodoALaLista ilustra cómo agregar "(Todos)" a la lista de un cuadro de lista o de un cuadro combinado. La siguiente técnica está implantada en el formulario AgregarTodoALaLista

•	Agregar "(Todos)" a una lista.


Agregar "(Todos)" a una lista

Al usar un cuadro de lista o un cuadro combinado para introducir criterios de selección, es conveniente tener la posibilidad de especificar todos los registros. En el formulario AgregarTodoALaLista, la lista del cuadro combinado SeleccionarCliente incluye la línea “(Todos)"

Información general

Cree una función que agregue "(Todos)" a la lista de un cuadro combinado o de un cuadro de lista. Cree un cuadro de lista o un cuadro combinado y establezca la propiedad TipoDeOrigenDeLaFila al nombre de la función.

Objetos usados en este ejemplo:

Objeto	Nombre
Formulario	AgregarTodoALaLista
Módulo	MódAgregarTodoALaLista
Paso a paso

1	Cree el módulo AgregarTodoALaLista.

a)	Cree la función AgregarTodoALaLista.

2	Cree el formulario AgregarTodoALaLista.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
OrigenDelRegistro (RecordSource)	Clientes
Título (Caption)	Agregar todo a la lista
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
CentradoAutomático (AutoCenter)	Sí
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	Agregue un encabezado y pie al formulario. Establezca a 0cm la propiedad Altura (Height).

c)	Cree un cuadro combinado en el encabezado del formulario y establezca sus propiedades como se indica a continuación:

Propiedad	Valor
Nombre (Name)	SeleccionarCliente
TipoDeOrigenDeLaFila (RowSourceType)	AgregarTodoALaLista
OrigenDeLaFila (RowSource)	ListaDeClientes
NúmeroDeColumnas (ColumnCount)	2
AnchuraDeColumna (ColumnWidths)	7,62cm; 0cm
ColumnaDependiente (BoundColumn)	2
LimitarALista (LimitToList)	Sí
Información adicional (Tag)	1
DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
d)	En la sección Detalle del formulario, agregue cuadros de texto para los campos IdCliente, NombreCompañía, NombreContacto, Teléfono y Fax.

Referencias cruzadas

Si desea obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access 97.

Temas	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Función AgregarTodoALaLista

Function AgregarTodoALaLista(ctl As Control, lngId As Long, lngFila As Long, _

lngCol As Long, entCódigo As Integer) As Variant

' Agregar "(Todos)" a la parte superior de un cuadro

' combinado o de un cuadro de lista.

' Puede agregar "(Todos)" a otra columna de un cuadro

' combinado o de un cuadro de lista estableciendo la

' propiedad Información adicional del control a otro

' número de columna, o puede mostrar un texto distinto

' de "(Todos)" agregando un punto y coma (;) y el texto

' que desea mostrar. Por ejemplo, estableciendo la propiedad

' Información adicional a "2;<Ninguno>" muestra "<Ninguno>"

' en la segunda columna de la lista.

Static bd As Database, rst As Recordset

Static lngIdMostrar As Long

Static intColMostrar As Integer

Static cadTextoMostrar As String

Dim entPuntoYComo As Integer

On Error GoTo Err_AgregarTodoALaLista

Select Case entCódigo

Case acLBInitialize

' Comprobar si la función está en uso.

If lngIdMostrar <> 0 Then

MsgBox "Otro control está utilizando 	AgregarTodoALaLista"

AgregarTodoALaLista = False

Exit Function

End If

' Analizar la columna a mostrar y el texto a mostrar de

' la propiedad Información adicional.

intColMostrar = 1

cadTextoMostrar = "(Todos)"

If Not IsNull(ctl.Tag) Then

entPuntoYComo = InStr(ctl.Tag, ";")

If entPuntoYComo = 0 Then

intColMostrar = Val(ctl.Tag)

Else

intColMostrar = Val(Left(ctl.Tag, entPuntoYComo - 1))

cadTextoMostrar = Mid(ctl.Tag, entPuntoYComo + 1)

End If

End If

' Abrir el conjunto de registros definido en la propiedad

' Origen de fila.

Set bd = CurrentDb

Set rst = bd.OpenRecordset(ctl.RowSource, dbOpenSnapshot)

' Grabar y devolver lngId para esta función.

lngIdMostrar = Timer

AgregarTodoALaLista = lngIdMostrar

 Case acLBOpen

AgregarTodoALaLista = lngIdMostrar

Case acLBGetRowCount

' Devolver el número de columnas del conjunto de registros.

On Error Resume Next

rst.MoveLast

AgregarTodoALaLista = rst.RecordCount + 1

Case acLBGetColumnCount

' Devolver el número de campos (columna) del conjunto de registros.

AgregarTodoALaLista = rst.Fields.Count

Case acLBGetColumnWidth

AgregarTodoALaLista = -1

Case acLBGetValue

If lngFila = 0 Then

If lngCol = intColMostrar - 1 Then

AgregarTodoALaLista = cadTextoMostrar

Else

AgregarTodoALaLista = Null

End If

Else

rst.MoveFirst

rst.Move lngFila - 1

AgregarTodoALaLista = rst(lngCol)

End If

Case acLBEnd

lngIdMostrar = 0

rst.Close

End Select

Salir_AgregarTodoALaLista:

Exit Function

Err_AgregarTodoALaLista:

MsgBox Err.Description, vbOKOnly + vbCritical, "AgregarTodoALaLista"

AgregarTodoALaLista = False

Resume Salir_AgregarTodoALaLista

End Function


Procedimiento de evento AfterUpdate del cuadro combinado SeleccionarCliente

Private Sub SeleccionarCliente_AfterUpdate()

' Devolver los registros que cumplan el valor elegido en

' el cuadro combinado SeleccionarCliente.

If Len(Me!SeleccionarCliente.Column(1)) = 0 Then

DoCmd.ShowAllRecords

Else

DoCmd.ApplyFilter , "IdCliente = Forms!AgregarTodoALaLista!SeleccionarCliente"

End If

End Sub


Características más importantes del formulario IntroducciónASoluciones

El formulario IntroducciónASoluciones ilustra cómo crear un formulario que el usuario pueda desactivar cuando no necesite usarlo más. La siguiente técnica está implantada en el formulario IntroducciónASoluciones:

•	Crear un formulario que el usuario pueda desactivar.


Crear un formulario que el usuario pueda desactivar

Puede presentar al principio un formulario que ofrezca información preliminar sobre su aplicación y que los usuarios tengan la posibilidad de hacer que no aparezca otra vez. Por ejemplo, el formulario IntroducciónASoluciones se presenta después del formulario Inicio y antes del formulario principal SolucionesParaElProgramador cada vez que empieza la aplicación Soluciones para el programador. Si no desea que aparezca más, puede seleccionar la casilla de verificación en la parte inferior del formulario.

Información general

Cree un propiedad de base de datos personalizada para indicar si el formulario de presentación debe aparecer o no. Cree el formulario de presentación con los siguientes controles: etiquetas que presenten información sobre su aplicación, una casilla de verificación independiente y un botón de comando que cierre el formulario. Cree un formulario principal. En la propiedad AlHacerClic (OnClick) del botón de comando, cree un procedimiento de evento que establezca a Falso la propiedad personalizada si la casilla de verificación está seleccionada. En la propiedad AlCargar (OnLoad) del formulario introductorio, cree un procedimiento de evento que cierre el formulario y abra el formulario principal si la propiedad personalizada se establece a Falso.

Objetos usados en este ejemplo:

Objeto	Nombre
Formulario	SolucionesParaElProgramador, IntroducciónASoluciones
Paso a paso

1	Cree la propiedad de la base de datos personalizada MostrarFormularioInicio.

a)	Una vez abierta la base de datos, haga clic en Propiedades de la base de datos en el menú Archivo.

b)	Haga clic en la ficha Personalizar.

c)	En el cuadro Nombre, escriba MostrarFormularioInicio.

d)	En el cuadro Tipo, seleccione Sí o no.

e)	En el cuadro Valor, seleccione Sí.

2	Cree el formulario IntroducciónASoluciones.

a)	Establezca las siguientes propiedades del formulario:

Propiedad	Valor
Título (Caption)	Introducción a Soluciones para el programador
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
PermitirEdiciones (AllowEdits)	Sí
PermitirEliminación (AllowDeletions)	Sí
PermitirAgregar (AllowAdditions)	No
EntradaDeDatos (DataEntry)	No
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationsButtons)	No
CentradoAutomático (AutoCenter)	Sí
EstíloDeLosBordes (BorderStyle)	Fino
BotonesMinMax (MinMaxButtons)	Ninguno
BotónCerrar (CloseButton)	Sí
AlCargar (OnLoad)	[Procedimiento de evento]
b)	Cree etiquetas para presentar información sobre la aplicación.

c)	Cree una casilla de verificación. En la propiedad Título (Caption) de su etiqueta adjunta, escriba:

No volver a mostrar este formulario.

Luego establezca las siguientes propiedades para la casilla de verificación:

Propiedad	Valor
Nombre (Caption)	OcultarIntroducciónASoluciones
TextoDeLaBarraDeEstado (StatusBarText)	No volver a mostrar este formulario.
d)	Cree un botón de comando y establezca las siguientes propiedades:

Propiedad	Valor
Nombre (Name)	Aceptar
Título (Caption)	&Aceptar
Predeterminado (Default)	Sí
TextoDeAyudaDelControl (ControlTipText)	Cerrar formulario
AlHacerClic (OnClick)	[Procedimiento de evento]
3	Cree el formulario SolucionesParaElProgramador.

Referencias cruzadas

Para obtener información sobre el tema siguiente, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Load del formulario IntroducciónASoluciones

El siguiente procedimiento de evento Form_Load del formulario IntroducciónASoluciones usa el procedimiento EsUnaRéplica para impedir que se muestre este formulario si la base de datos es una réplica. Esto es necesario porque el formulario IntroducciónASoluciones permite al usuario cambiar una propiedad personalizada de la base de datos que generará un error en una base de datos de réplica. El código del procedimiento EsUnaRéplica se muestra a continuación, y se encuentra en el módulo estándar módUtilidadesDeSoluciones de la base de datos Soluciones para el programador.

Private Sub Form_Load()

' Este código comprueba algunas propiedades de la base

' de datos para determinar si se debe mostrar este

' formulario. Si la propiedad MostrarFormularioInicio

' está establecida a False o si la base de datos es

' una réplica, no mostrar el formulario.

Dim bd As Database

Dim doc As Document

Set bd = CurrentDb

Set doc = bd.Containers("Databases")!UserDefined

' Si se produce un error, continuar.

On Error Resume Next

If EsUnaRéplica(bd) = True Then

' No mostrar este formulario.

DoCmd.Close

Exit Sub

Else

' Comprobar el valor de la propiedad personalizada

' MostrarFormularioInicio' de la base de datos.

' Si es True, borrar la casilla de verificación

' OcultarIntroducciónASoluciones, si no colocar

' una marca en la casilla de verificación.

If doc.Properties!MostrarFormularioInicio = False Then

OcultarIntroducciónASoluciones = True

Else

OcultarIntroducciónASoluciones = False

End If

' Si la base de datos es de sólo lectura, desactivar la

' casilla de verificación OcultarIntroducciónASoluciones.

If bd.Updatable = False Then

OcultarIntroducciónASoluciones.Enabled = False

End If

End If

End Sub

Function EsUnaRéplica(bd As Database) As Boolean

On Error Resume Next

If bd.Properties("Replicable") = "T" Then

If Err = 3270 Then

' No es una réplica. Mostrar el formulario de inicio.

EsUnaRéplica = False

Else

' Esta base de datos es un Diseño principal o una réplica.

' Cerrar la pantalla de presentación antes de mostrarlo.

EsUnaRéplica = True

End If

End If

End Function


Procedimiento de evento Click del botón de comando Aceptar

Private Sub Aceptar_Click()

' Abrir el formulario Soluciones para el programador y cerrar este formulario.

Dim bd As Database

Dim doc As Document

On Error GoTo Err_Aceptar_Click

Set bd = CurrentDb

Set doc = bd.Containers("Databases")!UserDefined

If OcultarIntroducciónASoluciones = True Then

' Si el usuario marcó la casilla de verificación,

' establecer la propiedad personalizada MostrarFormularioInicio

' de la base de datos a False.

doc.Properties!MostrarFormularioInicio = False

Else

' De lo contrario, establecer la propiedad personalizada

' MostrarFormularioInicio de la base de datos a True.

doc.Properties!MostrarFormularioInicio = True

End If

' Cerrar este formulario y abrir el formulario Soluciones

' para el programador.

DoCmd.Close acForm, "IntroducciónASoluciones"

If EstáCargado("FormularioHipervínculosSoluciones") Then

' Salir del procedimiento.

Exit Sub

Else

' Abrir el formulario SolucionesParaElProgramador.

DoCmd.OpenForm "SolucionesParaElProgramador"

End If

Salir_Aceptar_Click:

Exit Sub

Err_Aceptar_Click:

MsgBox Err.Description

CloseCurrentDatabase

Resume Salir_Aceptar_Click

End Sub


Características más importantes del informe PromediosDeVentas

El informe PromediosDeVentas ilustra cómo presentar múltiples datos por cada encabezado de fila de un informe de tabla de referencias cruzadas. Esta técnica hace que el informe PromediosDeVentas funcione:

•	Creando un informe de tabla de referencias cruzadas con resultados múltiples.


Crear un informe de tabla de referencias cruzadas con resultados múltiples

Puede crear un informe de tabla de referencias cruzadas que imprima múltiples datos por cada encabezado de fila. Por ejemplo, el informe PromediosDeVentas enumera el volumen de ventas mínimo, promedio y máximo mensual de todos los vendedores.

Información general

Use una consulta de selección como origen de los registros del informe y cree un diseño de tabla de referencias cruzadas diseñando un informe de múltiples columnas. Cree un cuadro de texto independiente en el encabezado de grupo Apellidos para usarlo como indicador que determine qué encabezado de fila hay que imprimir. En la propiedad AlDarFormato (OnFormat) del encabezado de grupo Apellidos, cree un procedimiento de evento que use la propiedad RegistroSiguiente (NextRecord) para imprimir los encabezados de fila en dos columnas. Cree un procedimiento de evento en la propiedad AlDarFormato (OnFormat) del encabezado de grupo FechaEnvío que use la función Mes y la propiedad Izquierda (Left) para comprobar que se imprimen los datos correctos en cada columna. Cuando no haya datos en una columna, use la propiedad RegistroSiguiente (NextRecord) para evitar que se avance al registro siguiente y use la propiedad ImprimirSección (PrintSection) para evitar que se imprima la sección siguiente.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Empleados, Pedidos
Consulta	SubtotalesDePedido, PromediosDeVentas
Informe	PromediosDeVentas
Paso a paso

1	Importe la consulta SubtotalesDePedido de la base de datos de ejemplo Neptuno, si aún no lo ha hecho.

2	Cree la consulta PromediosDeVentas.

a)	Use los campos de las siguientes tablas y consultas:

Tabla/Consulta	Campo/Expresión	Total
Tabla Empleados	Apellidos Nombre	Agrupar por Agrupar por
Tabla Pedidos	IdPedido FechaEnvío AñoAPromediar:  Año([FechaEnvío])	Agrupar por Agrupar por Agrupar por
Consulta SubtotalesDePedido	Subtotal	Agrupar por
b)	En la celda Criterios de la expresión AñoAPromediar, escriba: "1995".

3	Diseñe el informe PromediosDeVentas.

a)	En el cuadro Ordenar y agrupar, establezca las siguientes propiedades:

Campo/Expresión	Orden	Propiedades de grupo
Apellidos	Ascendente	Encabezado del grupo:  Sí Pie del grupo:  Sí Agrupar en:  Cada valor Intervalo del grupo:  1 Mantener juntos:  No
FechaEnvío	Ascendente	Encabezado del grupo:  Sí Pie del grupo:  No Agrupar en:  Cada valor Intervalodel grupo:  1 Mantener juntos:  No
b)	Establezca a 24,84cm la propiedad Anchura del informe.

c)	Establezca las siguientes opciones en el cuadro de diálogo Configurar página:

Ficha	Opción	Valor
Página	Orientación	Horizontal
Márgenes	Márgenes	Izquierdo: 1,016mm Derecho: 1,016mm Superior: 2,54mm Inferior: 2,54mm
Columnas	Opciones de la cuadrícula	Número de columnas: 14 Espacio entre columnas: 0,254cm
	Tamaño de columna	Ancho: 1,52cm Alto: 0cm
	Diseño de columna	A lo ancho y después hacia abajo
d)	En el encabezado de página, pegue las etiquetas del tipo de moneda y los nombres de los meses.

e)	En el encabezado de grupo Apellidos, cree los siguientes cuadros de texto, uno debajo del otro:

Nombre	Origen del control
ApellidosVendedor	=[Apellidos]&","
Nombre	Nombre
f)	En el encabezado de grupo Apellidos, cree las etiquetas siguientes en la parte superior de los cuadros de texto creados en el paso 3e.

Nombre	Título
EMínimo	Mínimo:
EPromedio	Promedio:
EMáximo	Máximo
g)	En el encabezado de grupo Apellidos, cree los siguientes cuadros de texto y establezca sus propiedades según se indica.

Nombre	Propiedad
QuéImprimir	Visible: No
AnchoColumna	Origen del control:  =(,6+,1)*1440 Formato: Número general Visible: No
MargenIzquierdo	Origen del control:  =,4*1440 Formato:  Número general Visible:  No
h)	En el encabezado de grupo FechaEnvío, cree los siguientes cuadros de texto, uno debajo del otro. Establezca como Estándar la propiedad Formato de los tres, como 0 la propiedad Lugares decimales y la propiedad Origen del control según se indica:

Nombre	Origen del control
MínimoMes	=Mín([Subtotal])
PromedioMes	=Promedio([Subtotal])
MáximoMes	=Máx([Subtotal])
i)	Establezca las siguientes propiedades de sección:

Sección	Propiedad	Valor
Encabezado de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Encabezado de grupo Apellidos	MantenerJuntos (KeepTogether) AlDarFormato (OnFormat)	Sí [Procedimiento de evento]
Encabezado de grupo FechaEnvío	MantenerJuntos (KeepTogether) AlDarFormato (OnFormat)	Sí [Procedimiento de evento]
Sección de detalle	Altura (Height)	0 cm
Encabezado de grupo Apellidos	NuevaFilaOColumna (NewRowOrCol) Altura (Height)	Después de sección 0 cm
Pie del informe	Altura (Height)	0 cm
Referencias cruzadas

Para obtener más información sobre el tema siguiente, consulte Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Format del encabezado de página

Private Sub EncabezadoPágina1_Format(Cancelar As Integer, ContarFormato As Integer)

' En la parte superior de la página, establecer el cuadro de texto QuéImprimir a 0.

Me!QuéImprimir = 0

End Sub


Procedimiento de evento Format del encabezado de grupo Apellidos

Private Sub EncabezadoGrupo2_Format(Cancelar As Integer, ContarFormato As Integer)

' Imprimir la información de los encabezados de fila en el orden correcto.

' Imprimir los cuadros de texto ApellidosVendedor y Nombre,

' ocultar las etiquetas Mínimo, Promedio y Máximo,

' establecer el cuadro de texto QuéImprimir a -1 y no pasar al siguiente registro.

With Me

If !QuéImprimir = 0 Then

!ApellidosVendedor.Visible = True

!Nombre.Visible = True

!EMínimo.Visible = False

!EPromedio.Visible = False

!EMáximo.Visible = False

!QuéImprimir = -1

.NextRecord = False

' Ocultar los cuadros de texto ApellidosVendedor y Nombre,

' imprimir las etiquetas Mínimo, Promedio y Máximo,

' establecer el cuadro de texto QuéImprimir a 0.

Else

!ApellidosVendedor.Visible = False

!Nombre.Visible = False

!EMínimo.Visible = True

!EPromedio.Visible = True

!EMáximo.Visible = True

!QuéImprimir = 0

End If

End With

End Sub


Procedimiento de evento Format del encabezado de grupo FechaEnvío

Private Sub EncabezadoGrupo3_Format(Cancelar As Integer, ContarFormato As Integer)

' Imprimir los datos en la columna correcta.

' No pasar al siguiente registro ni imprimir la siguiente sección.

If Me.Left < Me!MargenIzquierdo + (Month(Me!FechaEnvío) + 1) _

* Me!AnchoColumna Then

 Me.NextRecord = False

 Me.PrintSection = False

End If

End Sub


Características más importantes del informe ListaDeTeléfonosDeClientes

El informe ListaDeTeléfonosDeClientes muestra cómo identificar la primera y última compañía impresas en cada página. Esta técnica hace que el informe ListaDeTeléfonosDeClientes funcione:

•	Imprimiendo la primera y la última entrada de una página en el encabezado de página.


Imprimir la primera y la última entrada de una página en el encabezado de página

Al igual que es sencillo buscar palabras en un diccionario, también es fácil buscar datos en su informe identificando la primera y última entrada de una página. En el informe ListaDeTeléfonosDeClientes, el primer nombre de compañía está impreso en el lado izquierdo del encabezado de página, y el de la última compañía en el lado derecho.

Información general

Cree un informe que ordene los datos por el nombre de compañía. En el pie de página, cree un cuadro de texto para los números de página que use la propiedad Páginas en su expresión (para forzar un informe de dos pasadas). Cree un procedimiento de evento para la propiedad AlDarFormato (OnFormat) del pie de página que, en la primera pasada, ponga el nombre de cliente del último registro de la página en una matriz global. Cree un procedimiento de evento para la propiedad AlDarFormato (OnFormat) del pie del informe que, en la primera pasada, ponga el último registro del conjunto de registros en la matriz. Cree también un procedimiento de evento para la propiedad AlDarFormato (OnFormat) del encabezado de página que, en la segunda pasada, rellene los cuadros de texto PrimeraEntrada y ÚltimaEntrada.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	Clientes
Informe	ListaDeTeléfonosDeClientes
Paso a paso

1	Diseñe el informe ListaDeTeléfonosDeClientes.

a)	Establezca la propiedad OrigenDelRegistro (RecordSource) del informe a Clientes.

b)	Agregue un encabezado y pie de informe. Establezca a 0 las propiedades Altura (Height) de las dos secciones.

c)	En el cuadro Ordenar y agrupar, seleccione NombreCompañía en la columna Campo/Expresión y establezca Orden a Ascendente.

d)	En la sección Detalle, cree los cuadros de texto NombreCompañía, NombreContacto y Teléfono. Corte sus etiquetas adjuntas y péguelas en el encabezado de página.

e)	Establezca a Sí la propiedad MantenerJuntos (KeepTogether) de la sección.

f)	Cree cuadros de texto en las siguientes secciones y elimine sus etiquetas adjuntas.

Sección	Nombre	OrigenDelControl
Encabezado de página	PrimeraEntrada	--
	ÚltimaEntrada	--
Pie de página	NúmeroPágina	=Página & " de " & Páginas & " páginas"
g)	En la sección Declaraciones del módulo Report_ListaDeTeléfonosDeClientes, declare las variables.

h)	Cree procedimientos de evento para las siguientes secciones:

Sección	Propiedad	Valor
Encabezado de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Pie de página	AlDarFormato (OnFormat)	[Procedimiento de evento]
Pie del informe	AlDarFormato (OnFormat)	[Procedimiento de evento]
Referencias cruzadas

Si desea obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Sección Declaraciones del módulo Report_ListaDeTeléfonosDeClientes

'Usar orden de base de datos para las comparaciones de cadenas.

Option Compare

Option Explicit

' Matriz para el último registro de cada página y el último

' registro de un conjunto de registros.

Dim gÚltimo() As String

' Indicador para el número de veces que pasa por el informe.

Dim gÚltimaPágina As Integer


Procedimiento de evento Format del encabezado de página

Private Sub EncabezadoPágina0_Format(Cancelar As Integer, ContarFormato As Integer)

' Durante la segunda vez que pasa, llenar los cuadros de

' edición PrimeraEntrada y ÚltimaEntrada.

If gÚltimaPágina = True Then

Reports!ListaDeTeléfonosDeClientes!PrimeraEntrada = _

Reports!ListaDeTeléfonosDeClientes!NombreCompañía

Reports!ListaDeTeléfonosDeClientes!ÚltimaEntrada = _

gÚltimo(Reports!ListaDeTeléfonosDeClientes.Page)

End If

End Sub


Procedimiento de evento Format del pie de página

Private Sub PiePágina2_Format(Cancelar As Integer, ContarFormato As Integer)

' Durante la primera vez que pasa, aumentar el tamaño de la matriz

' e introducir el último registro de la página en la matriz.

If Not gÚltimaPágina Then

ReDim Preserve gÚltimo(Reports!ListaDeTeléfonosDeClientes.Page + 1)

gÚltimo(Reports!ListaDeTeléfonosDeClientes.Page) = _

Reports!ListaDeTeléfonosDeClientes!NombreCompañía

End If

End Sub


Procedimiento de evento Format del pie del informe

Private Sub PieInforme4_Format(Cancelar As Integer, ContarFormato As Integer)

Dim bd As Database

Dim rst As Recordset

' Establecer el indicador después de terminar la primera pasada.

gÚltimaPágina = True

' Abrir el conjunto de registros para el informe.

Set bd = CurrentDb

Set rst = bd.OpenRecordset("Clientes")

' Ir al último registro del conjunto de registros.

rst.MoveLast

' Introducir el último registro en la matriz.

ReDim Preserve gÚltimo(Reports!ListaDeTeléfonosDeClientes.Page + 1)

gÚltimo(Reports!ListaDeTeléfonosDeClientes.Page) = rst!NombreCompañía

End Sub


Crear una barra de herramientas o barra de menús personalizada

En Microsoft Access 97, hay tres tipos de barras de comandos: barras de menús, barras de herramientas, y menús contextuales (emergentes).

La barra de menús es una barra de comandos que normalmente está disponible todo el tiempo. Por ejemplo, la barra de menús incorporada de Microsoft Access 97 es una colección de menús desplegables que incluye entradas para Archivo, Edición, Ver, Herramientas, Ventana y Ayuda. Esta es la barra de menús utilizada en su aplicación,  a menos que haya creado una barra de menús personalizada para reemplazarla. Si establece la propiedad BarraDeMenúsDeInicio (StartupMenuBar) al nombre de una barra de menús personalizada, reemplazará la barra de menús incorporada de Microsoft Access. También puede asociar una barra de menús personalizada con un formulario o informe estableciendo la propiedad BarraDeMenús (MenuBar) del formulario o informe. En la aplicación de  muestra Soluciones para los programadores, el formulario ModificarProductos utiliza la barra de menús personalizada BarraDeMenúsModificarProductos.

Además de una barra de menús, normalmente se muestra una barra de herramientas y contiene botones cuyos iconos representan acciones que se producirán si se hace clic en el botón. Todos los formularios e informes de la aplicación Soluciones para los programadores utilizan barras de herramientas personalizadas. Se puede asociar una barra de menús personalizada con un formulario o informe estableciendo la propiedad BarraDeHerramientas (Toolbar) del formulario o informe al nombre de una barra de menús personalizada. En la aplicación Soluciones para los programadores, todos los formularios, excepto ModificarProductos e IntroducirOModificarProductos, usan la barra de menús personalizada Vista Formulario personalizado y todos los informes usan la barra de menús personalizada Vista preliminar personalizada. El formulario ModificarProductos muestra una barra de menús personalizada separada.

Una barra de comandos emergente personalizada se utiliza para crear menús contextuales (botón secundario) asociados con formularios o informes. Un menú contextual aparece cuando se hace clic con el botón secundario en un objeto cuya propiedad BarraDeMenúDeMétodoAbreviado (ShortcutMenuBar) está establecida al nombre de una barra de comandos emergente personalizada. La aplicación Soluciones para los programadores no utiliza ningún menú contextual personalizado. Para obtener información acerca de la creación de menús contextuales, busque "menús contextuales" en el índice de Ayuda de Microsoft Access.

Introducción general

Cree una barra de menús personalizada y una barra de menús personalizada para mostrar cuándo está abierto un formulario. Agregue a la barra de menús personalizada y a la barra de menús los controles incorporados que desee que estén disponibles cuando se abra el formulario. Agregue controles botón de comando personalizados a la barra de herramientas y a la barra de menús para ejecutar las macros o procedimientos personalizados de Visual Basic.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	ModificarProductos
Barra de menús	BarraDeMenúsModificarProductos
Barra de herramientas	BarraDeHerramientasModificarProductos
Macro	Cerrar
Macro	SeleccionarRegistro
Macro	MostrarAcercaDeSoluciones
Macro	Barras de herramientas
Macro	OpcionesDeHerramientas
Modulo	módUtilidadesDeBarraDeHerramientas
Paso a paso — Creación de una barra de menús

1	Crear la barra de menús BarraDeMenúsModificarProductos.

a)	En el menú Ver, apunte a Barras de herramientas, haga clic en Personalizar, y luego haga clic en Nueva. Nombre la barra de comandos BarraDeMenúsModificarProductos.

b)	En el cuadro de diálogo Personalizar, seleccione la casilla de verificación BarraDeMenúsModificarProductos en el cuadro Barras de herramientas, y luego haga clic en Propiedades.

c)	En el cuadro de diálogo Propiedades de la barra de herramientas, establezca la propiedad Tipo (Type) de la barra de herramientas a Barra de menús, y luego haga clic en Cerrar.

2	Agregar controles a la barra de menús BarraDeMenúsModificarProductos.

a)	En el cuadro de diálogo Personalizar, seleccione la casilla de verificación BarraDeMenúsModificarProductos en el cuadro Barras de herramientas.

b)	Haga clic en la ficha Comandos y desplácese a la parte inferior de la lista de comandos. Haga clic en la categoría Nuevo menú. Un objeto Nuevo menú aparecerá en el cuadro de lista Comandos.

c)	Arrastre el objeto Nuevo menú a la barra de menús BarraDeMenúsModificarProductos.

d)	Haga clic con el botón secundario en el comando Nuevo menú y escriba &Archivo en el cuadro Nombre del menú contextual.

e)	Repita el proceso de arrastrar el objeto Nuevo menú a la nueva barra de menús y cambie el nombre a cada control hasta que tenga los menús llamados "&Archivo", "&Edición", "&Ver", "&Herramientas" y "&Ayuda".

f)	Haga clic en Menús incorporados en el cuadro Categorías y desplácese por la lista de Comandos hasta que vea la entrada del menú Ventana incorporado. Arrastre el menú Ventana incorporado a la nueva barra de menús y colóquelo entre los menús Herramientas y Ayuda.

3	Cree la macro Cerrar. El botón Cerrar ejecuta la macro Cerrar.

a)	Abra una nueva macro y seleccione EjecutarComando en el valor de su Acción y escriba Cerrar en el argumento Comando del cuadro de la acción.

b)	Cierre la macro y guárdela con el nombre Cerrar.

4	Agregar el comando Cerrar al menú Archivo.

a)	Haga clic en el menú Archivo en la barra de menús BarraDeMenúsModificarProductos para que aparezca el menú desplegable en blanco.

b)	En el cuadro de diálogo Personalizar, haga clic en la ficha Comandos, seleccione la categoría Todas las macros, y luego arrastre la macro Cerrar al menú desplegable en blanco.

c)	Haga clic con el botón secundario en el comando Cerrar y haga clic en Solo texto (Siempre) en el menú contextual.

d)	Haga clic de nuevo con el botón secundario en el comando Cerrar, haga clic en Propiedades en el menú contextual, y seleccione la macro Cerrar en el cuadro de la propiedad Acción (OnAction).

5	Crear la macro SeleccionarRegistro. Esta macro ejecuta el comando Seleccionar registro en el menú Edición.

a)	Abra una nueva macro y seleccione EjecutarComando en el valor de Acción y escriba SeleccionarRegistro en el cuadro Comando del argumento de la acción.

b)	Cierre la macro y guárdela con el nombre SeleccionarRegistro.

6	Agregar los comandos al control personalizado del menú Edición en la barra de menús BarraDeMenúsModificarProductos.

a)	Haga clic en el menú Edición en la barra de menús BarraDeMenúsModificarProductos para que aparezca el menú desplegable en blanco.

b)	En el cuadro de diálogo Personalizar, haga clic en la ficha Comandos, haga clic en la categoría Edición, y arrastre los comandos Deshacer, Cortar, Copiar y Pegar al menú desplegable Edición.

c)	Haga clic en la categoría Registros y arrastre el comando Eliminar registro al menú desplegable Edición.

d)	Haga clic en la categoría Todas las macros y arrastre al macro SeleccionarRegistro al menú desplegable Edición.

e)	Haga clic con el botón secundario en el comando Seleccionar registro y apunte a Cambiar imagen del botón en el menú contextual, y luego seleccione un icono para el comando Seleccionar registro.

f)	Haga clic de nuevo con el botón secundario en el comando Seleccionar registro, haga clic en Propiedades en el menú contextual, y seleccione la macro SeleccionarRegistro en el cuadro de la propiedad Acción (OnAction).

g)	Para crear las líneas de separación que aparecen antes de los comandos Cortar, Eliminar registro, y Seleccionar registro, haga clic con el botón secundario en cada uno de los comandos en el menú Edición, y luego haga clic en Empezar un grupo en el menú contextual.

7	Repita los pasos descritos anteriormente para agregar cada control a los menús desplegables BarraDeMenúsModificarProductos. No es necesario que agregue todos los controles del menú Ventana porque BarraDeMenúsModificarProductos utiliza el grupo de controles incorporado del menú Ventana. Observe que va a usar la macro MostrarAcercaDeSoluciones como el valor de la propiedad Acción (OnAction) para el comando Acerca de soluciones para los programadores del menú Ayuda. De la misma forma, va a usar la macro Barras de herramientas y la macro OpcionesDeHerramientas como los valores de la propiedad Acción (OnAction) del comando Barras de herramientas del menú Ver y del comando Opciones del menú Herramientas, respectivamente.

8	Abra el formulario ModificarProductos y establezca su propiedad MenuBar a BarraDeMenúsModificarProductos en la hoja de propiedades.

Paso a paso — Creación de una barra de herramientas

1	Crear la barra de herramientas BarraDeHerramientasModificarProductos.

•	En el menú Ver, apunte a Barras de herramientas, haga clic en Personalizar, y luego haga clic en Nuevo. De a la barra de comandos el nombre BarraDeHerramientasModificarProductos.

Nota   Las barras de comandos se crean con la propiedad Tipo establecida a Barra de herramientas de forma predeterminada, con lo que no es necesario que establezca esta propiedad.

2	En el cuadro de diálogo Personalizar, haga clic en la ficha Comandos, y luego haga clic en la categoría Ver.

•	Arrastre los comandos vista Diseño y vista Formulario a la barra de herramientas BarraDeHerramientasModificarProductos.

3	Haga clic en la categoría Edición y arrastre los comandos Cortar, Copiar, Pegar, y Deshacer a la barra de herramientas BarraDeHerramientasModificarProductos.

•	Para crear una línea que separe el botón Deshacer del botón Pegar, haga clic con el botón secundario en el botón de comando Deshacer, y luego haga clic en Empezar un grupo en el menú contextual.

4	Crear el botón de barra de menús personalizada Muéstreme.

a)	En el cuadro de diálogo Personalizar, haga clic en la ficha Comandos, y luego haga clic en Archivo en el cuadro Categorías.

b)	Arrastre el comando Personalizar desde el cuadro Comandos a la barra de herramientas BarraDeHerramientasModificarProductos.

c)	Haga clic con el botón secundario en el botón Personalizar, y escriba Muéstreme en el cuadro Nombre del menú contextual.

d)	Haga clic con el botón secundario en el botón Muéstreme, haga clic en Propiedades en el menú contextual, y establezca la propiedad Acción (OnAction) del botón al nombre de la función MostrarAyudaAPI en el módulo modUtilidadesDeBarraDeHerramientas escribiendo =MostrarAyudaAPI().

5	Abra el formulario ModificarProductos y establezca su propiedad Barra de herramientas a BarraDeHerramientasModificarProductos en la hoja de propiedades.


Características más importantes del formulario Ayudante

El formulario Ayudante muestra cómo usar las propiedades y métodos del objeto Assistant para utilizar el Ayudante de Office. El formulario Ayudante utiliza un control ficha para separar los controles relacionados con las propiedades del Ayudante, las animaciones del Ayudante, y manipular el objeto Balloon.

Nota   Antes de que pueda modificar las propiedades y métodos del objeto Assistant con Visual Basic, primero debe establecer una referencia a la Microsoft Access 8.0 Object Library

Las siguientes técnicas hacen que el formulario Ayudante funcione:

•	Determinando las propiedades del Ayudante.

•	Animando el Ayudante.

•	Usando el objeto Balloon con el Ayudante.


Determinar las propiedades del Ayudante

El Ayudante tiene propiedades que pueden ser establecidas por un usuario mientras se ejecuta una aplicación. Por tanto, antes de que pueda intentar manipular el Ayudante usando Visual Basic, es una buena idea determinar cuáles son los valores de la propiedad. Haciendo esto se consigue interactuar más fácilmente con el objeto Assistant mediante programación, permitiéndole también devolver las propiedades a sus valores originales cuando haya finalizado.

Introducción general

Cree un formulario independiente para mostrar las propiedades del objeto Assistant. Agregue al formulario un control ficha que contenga tres páginas. Establezca la propiedad Título (Caption) de la primera página del control ficha a Propiedades. Agregue un control cuadro de texto y cinco controles casilla de verificación a la página Propiedades. Agregue código al procedimiento de evento Open del formulario para mostrar los valores de las propiedades del Ayudante en los controles casilla de verificación. Agregue código al procedimiento de evento AfterUpdate de cada control casilla de verificación para cambiar la propiedad correspondiente del Ayudante.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	Ayudante
Paso a paso

1	Crear el formulario Ayudante. Establezca las siguientes propiedades del formulario.

Propiedad	Valores
PresentaciónPreliminar (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguno
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
EstiloDeLosBordes (BorderStyle)	Diálogo
MenúDeMétodoAbreviado (ShortcutMenu)	No
AlAbrir (OnOpen)	[Procedimiento de evento]
2	Agregar un control ficha llamado ControlFicha0 al formulario Ayudante. El control ficha debería tener tres páginas llamadas Propiedades, Animaciones y Globo.

3	Agregar los siguientes controles a la página Propiedades y establecer la propiedad InformaciónAdicional (Tag) de cada control como sigue.

Nombre del control	propiedad InformaciónAdicional
txtNombrearchivo	Nombrearchivo
chkAnimación	Animación
chkSonidos	Sonido
chkVentanaReducida	VentanaPequeña
chkVisible	Visible
chkOcultar	MoverCuandoSePongaDelante
El procedimiento de evento Open del formulario Ayudante utiliza el valor de la propiedad InformaciónAdicional (Tag) de cada control para identificar el control y la propiedad correspondiente del Ayudante.

4	Para cada control casilla de verificación, agregue el código al procedimiento de evento DespuésDeActualizar (AfterUpdate) para establecer la propiedad relacionada del Ayudante al valor del control.

5	Agregar la variable pública gAsstVisible a la sección de declaraciones del módulo de clase Form_Ayudante. Esta variable se utiliza para guardar el valor de la propiedad Visible del objeto Assistant durante el procedimiento de evento Open del formulario. La variable se utiliza luego para restaurar el valor de la propiedad Visible en el procedimiento de evento Unload del formulario.

6	Crear el procedimiento de evento Open del formulario. Este procedimiento examina cada control de la colección Controls de la página Propiedades para determinar los valores de la propiedad InformaciónAdicional (Tag) que creó en el paso 3.


Procedimiento de evento Open del formulario Ayudante

Private Sub Form_Open(Cancel As Integer)

Dim ctlPage As Control, ctl As Control

Set ctlPage = ControlFicha0.Pages("Propiedades")

' Establecer los controles casilla de verificación del control

' ficha de página 'Propiedades' para reflejar las

' propiedades actuales del objeto Assistant.

For Each ctl In ctlPage.Controls

Select Case ctl.Tag

Case "Nombrearchivo"

ctl.Value = Assistant.Item

Case "Animación"

ctl.Value = Assistant.Animation

Case "Sonido"

ctl.Value = Assistant.Sounds

Case "VentanaPequeña"

ctl.Value = Assistant.Reduced

Case "Visible"

ctl.Value = Assistant.Visible

Case "MoverCuandoSePongaDelante"

ctl.Value = Assistant.MoveWhenInTheWay

End Select

Next ctl

' Guardar el estado Visible del Ayudante.

gAsstVisible = Assistant.Visible

End Sub


Procedimiento de evento AfterUpdate de los controles casilla de verificación de la página Propiedades del formulario Ayudante

Private Sub verifAnimación_AfterUpdate()

' Utilizar el valor de la casilla de verificación para

' activar o desactivar los controles de la página Animaciones

' del control ficha.

Me!ControlFicha0.Pages("Animaciones").Enabled = verifAnimación.Value

End Sub

Private Sub verifOcultar_AfterUpdate()

' Utilizar el valor de la casilla de verificación para

' establecer la propiedad MoveWhenInTheWay.

Assistant.MOVEWHENINTHEWAY = Me!verifOcultar.Value

End Sub

Private Sub verifVentanaReducida_AfterUpdate()

' Utilizar el valor de la casilla de verificación para

' establecer la propiedad Reduced.

Assistant.REDUCED = Me!verifVentanaReducida.Value

End Sub

Private Sub verifSonidos_AfterUpdate()

' Utilizar el valor de la casilla de verificación para

' establecer la propiedad Sounds.

Assistant.SOUNDS = Me!verifSonidos.Value

End Sub

Private Sub verifVisible_AfterUpdate()

' Utilizar el valor de la casilla de verificación para

' establecer la propiedad Visible.

Assistant.Visible = Me!verifVisible.Value

End Sub


Animación del Ayudante

Se puede utilizar Visual Basic para animar el Ayudante estableciendo la propiedad Animation del objeto Assistant a una de las constantes de animación o al valor que representa la constante. Aunque todas las constantes de animación se aplican a todos los Ayudantes, no cada Ayudante tiene una animación que corresponda a cada constante. Además, algunos Ayudantes tiene múltiples animaciones asociadas con una única constantes de animación.

Introducción general

Cree un formulario independiente para mostrar las propiedades del objeto Assistant. Agregue al formulario un control ficha conteniendo tres páginas. Establezca la propiedad Título (Caption) de la segunda página del control ficha a Animaciones. Agregue un control cuadro combinado a la página Animaciones. Agregue código al procedimiento de evento AfterUpdate del control cuadro combinado para animar al Ayudante usando la animación seleccionada del cuadro combinado. Agregue una tabla que contenga una descripción de cada animación y el valor de la constante de animación asociada.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	Ayudante
Tabla	Animaciones
Consulta	AnimacionesOrdenadas
Paso a paso

1	Crear el formulario Ayudante como se describe en Determinar las propiedades del Ayudante.

2	Agregar un control ficha llamado ControlFicha0 al formulario Ayudante. El control ficha debería tener tres páginas llamadas Propiedades, Animaciones y Globo.

3	Crear la tabla Animaciones. La tabla Animaciones de Soluciones para los programadores fue creada usando información del Examinador de objetos. Puede ver las animaciones disponibles abriendo el Examinador de objetos y haciendo clic en Office en el cuadro Proyecto/Biblioteca. Luego escriba msoTipoAnimación en el cuadro Buscar texto y haga clic el botón Buscar en la barra de herramientas Examinador de objetos. Los miembros de la clase msoTipoAnimación se mostrarán en el panel inferior derecho del Examinador de objetos. La tabla Animaciones consiste en un campo DescripciónAnimación y un campo ValorAnimación. El campo DescripciónAnimación contiene el nombre de la constante de animación sin el prefijo "msoAnimación". El campo ValorAnimación contiene el valor de la constante de animación.

4	Crear la consulta AnimacionesOrdenadas usando los siguientes campos de la tabla Animaciones.

Campo	Orden
ValorAnimación	—
DescripciónAnimación	Ascendente
5	Agregar un control cuadro combinado a la página Animaciones del control ficha y establecer las siguientes propiedades.

Propiedad	Valores
Nombre (Name)	combAnimaciones
TipoOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	AnimacionesOrdenadas
NúmeroDeColumnas (ColumnCount)	2
AnchuraDeColumnas (ColumnWidths)	0cm;5,08cm"
ColumnaDependiente (BoundColumn)	1
LimitarALista (LimitToList)	Sí
DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]


Procedimiento de evento AfterUpdate para el control cuadro combinado combAnimaciones

Private Sub combAnimaciones_AfterUpdate()

Dim ctlFicha As TabControl

On Error Resume Next

' Establecer variable de objeto al control ficha.

Set ctlFicha = Me!ControlFicha0

' Asegurarse de que el Ayudante está visible.

If Assistant.Visible = False Then Assistant.Visible = True

Me!verifVisible = True

' Animar el Ayudante utilizando el valor seleccionado

' en el cuadro combinado.

Assistant.Animation = Me!combAnimaciones.Value

End Sub


Utilizar el objeto Balloon con el Ayudante

Puede usar el objeto Balloon para presentar información al usuario de forma muy parecida a como se puede hacer con la función MsgBox. Además, puede usar el objeto Balloon para obtener información del usuario manipulando las propiedades y métodos del objeto Balloon. El formulario Ayudante muestra cómo mostrar la información al usuario y obtener información usando botones de opción o controles casilla de verificación.

Introducción general

Cree un formulario independiente para mostrar las propiedades del objeto Assistant. Agregue un control ficha conteniendo tres páginas al formulario. Establezca la propiedad Título (Caption) de la tercera página de un control ficha a Globo. Agregue los controles especificados a la página Globo. Agregue código al procedimiento de evento Click del botón Mostrar globo para crear y mostrar un objeto Balloon que pueda utilizar para obtener entrada de datos del usuario y mostrar la información al usuario.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	Ayudante
Paso a paso

1	Crear el formulario Ayudante como se describe en Determinar las propiedades del Ayudante.

2	Agregar un control ficha llamado ControlFicha0 al formulario Ayudante. El control ficha debería tener tres páginas llamadas Propiedades, Animaciones y Globo.

3	Agregue los siguientes controles cuadro de texto a la página Globo y establezca la propiedad ValorPredeterminado (DefaultValue) de cada control como sigue.

Nombre del control	propiedad ValorPredeterminado (DefaultValue)
txtEncabezadoGlobo	"¿Qué opción desea?"
txtOpción1	"Menos de 30"
txtOpción2	"Más de 30"
txtOpción3	"Más de 40"
txtOpción4	"Cualquiera"
4	Agregar los siguientes controles a la página Globo y establecer la propiedad Nombre (Name) y el título de la etiqueta de cada control como sigue.

Tipo de control	Nombre propiedad	Título Etiqueta
Grupo de opciones	ctlEstiloOpción	Estilo de opción:
Botón de opción	optEtiquetas	Etiquetas
Botón de opción	optCasillasDeVerificación	Casillas de verificación
5	Agregar un botón de comando a la página Globo y establecer sus propiedades como sigue.

Propiedad	Valores
Nombre (Name)	cmdMostrarGlobo
Título (Caption)	Mostrar globo
AlHacerClic (OnClick)	[Procedimiento de evento]


Procedimiento de evento Click del botón de comando cmdMostrarGlobo

Private Sub cmdMostrarGlobo_Click ()

Dim objBal As Balloon, intRetval As Integer, strChoice As String

Dim blnAsstVisible As Boolean, intI As Integer

On Error GoTo MostrarGlobo_Err

' Establecer variables de objeto Globo.

Set objBal = Assistant.NewBalloon

' Guardar estado actual de propiedad Visible de Ayudante

' para que pueda ser restaurada al final del procedimiento.

blnAsstVisible = Assistant.Visible

' Asegurarse de que el Ayudante esta visible.

If Assistant.Visible = False Then Assistant.Visible = True

' Determinar estilo de botón seleccionado por usuario.

Select Case Me!ctlEstiloOpción

Case 1	' Estilo botón Etiqueta.

With objBal

.Button = msoButtonSetNone

.Heading = Me!txtBalloonHeading

.Labels(1).Text = Me!txtOption1

.Labels(2).Text = Me!txtOption2

.Labels(3).Text = Me!txtOption3

.Labels(4).Text = Me!txtOption4

.Text = "¿Cúal de las siguientes opciones " _

& .Labels.Count & " se le puede aplicar?"

' Guardar la selección hecha por el usuario.

intRetval = .Show

If intRetval > 0 Then

strChoice = .Labels(intRetval).Text

Else

strChoice = ""

End If

End With

Case 2	' Casilla verificación estilo botón.

With objBal

.Button = msoButtonSetOK

.Heading = Me!txtBalloonHeading

.Checkboxes(1).Text = Me!txtOption1

.Checkboxes(2).Text = Me!txtOption2

.Checkboxes(3).Text = Me!txtOption3

.Checkboxes(4).Text = Me!txtOption4

.Text = "¿Cúal de las siguientes opciones " _

& .Checkboxes.Count & " se le puede aplicar?"

' Guardar la selección hecha por el usuario.

intRetval = .Show

' Construir cadena para mostrar al usuario basado en

' las selecciones del usuario.

For intI = 1 To .Checkboxes.Count

If .Checkboxes(intI).Checked = True Then

strChoice = strChoice & .Checkboxes(intI).Text & "' and '"

End If

Next intI

' Eliminar las "' y '" de la cola de strChoice.

If Len(strChoice) <> 0 Then

strChoice = Left(strChoice, Len(strChoice) - 7)

End If

End With

End Select

' Crear nuevo objeto Balloon y mostrar elecciones del usuario.

Set objBal = Assistant.NewBalloon

With objBal

If intRetval > 0 Or Len(strChoice) > 0 Then

.Text = "Seleccionó '" & strChoice & "'"

Else

.Text = "No realizó ninguna selección."

End If

.Show

End With

' Restaurar estado Visible original del Ayudante.

Assistant.Visible = blnAsstVisible

MostrarGlobo_Salir:

Exit Sub

MostrarGlobo_Err:

MsgBox Err.Description

Resume MostrarGlobo_Salir

End Sub


Características más importantes del formulario FormularioBarrasDeComandos

El formulario FormularioBarrasDeComandos muestra cómo usar las propiedades y métodos de las barras de comandos y los controles barra de comandos para crear y manipular objetos CommandBar en Microsoft Access 97.

Las siguientes técnicas hacen que el formulario FormularioBarrasDeComandos funcione:

•	Examinando barras de comandos y controles.

•	Creando un botón barra de comando que llama a un procedimiento personalizado de Visual Basic para recuperar datos de una tabla.


Examinar barras de comandos y controles

La ficha Examinar controles del formulario FormularioBarrasDeComandos contiene controles que le permiten examinar y copiar barras de comandos incorporadas y personalizadas a la base de datos de Soluciones para los programadores. Las barras de comandos que tienen su propio estilo establecido a la barra de menús contienen controles que se despliegan para mostrar controles adicionales. El formulario FormularioBarrasDeComandos muestra estos controles en un subformulario. Cuando haga clic en un registro del subformulario de un control, su icono asociado se muestra en la barra de menús principal.

Introducción general

Agregue un control ficha a un formulario independiente. Establezca la propiedad Título (Caption) de una página de un control ficha a Examinar controles. Agregue un control grupo de opciones con tres botones de opción junto con los demás controles enumerados en la tabla a continuación. Agregue código al procedimiento de evento AfterUpdate del control grupo de opciones para rellenar el control combBarrasDeComandos. Agregue código al procedimiento de evento AfterUpdate del control combBarrasDeComandos para rellenar el control lstControlesBarraDeComandos. Vincule el control del subformulario a un control cuadro de texto oculto que contiene el valor IdControlMiembro de los controles mostrados en el control del cuadro de lista lstControlesBarraDeComandos.

Además de los controles que muestran información de las tablas ocultas, el formulario FormularioBarrasDeComandos utiliza también procedimientos contenidos en el módulo módCódigoBarraDeComandos que pueden volver a crear, si es necesario, las tablas ocultas, y actualizar los datos de las tablas para reflejar la adición de cualquier barra de comandos personalizada o de controles de barra de comandos.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	FormularioBarrasDeComandos
Consulta	LlenarCuadroCombinadoExamiar
Consulta	LlenarListaExaminar
Consulta	conEliminarDatosDeTablaMiembrosBarraDeComandos
Consulta	conEliminarDatosDeTablaBarrasDeComandos
Consulta	conEliminarDatosDeTablaControlesMiembro
Tabla (oculta)	Tab_MiembrosBarraDeComandos
Tabla (oculta)	Tab_BarrasDeComandos
Tabla (oculta)	Tab_TiposControl
Tabla (oculta)	Tab_ControlesMiembro
Módulo	módCódigoDeBarraDeComandos
Paso a paso

1	Crear la tabla oculta tab_TiposControl.

•	Cree un nuevo nombre para la tabla tab_TiposControl e incluya los siguientes campos.

Nombre de campo	Tipo de datos
IdControl	Autonumérico
Descripción	Texto
La tabla tab_TiposControl que se encuentra en Soluciones para los programadores fue creada usando información del Examinador de objetos. Puede ver los tipos de control barra de comandos disponibles abriendo el Examinador de objetos y haciendo clic en Office en el cuadro Proyecto/Biblioteca. Luego escriba msoTipoDeControl en el cuadro Buscar texto y haga clic en el botón Buscar en la barra de herramientas Examinador de objetos. Los miembros de la clase msoTipoDeControl serán mostrados en el panel inferior derecho del Examinador de objetos. La tabla tab_TiposControl consiste en un campo Descripción y un campo IdControl. El campo Descripción contiene el tipo de la constante de control sin el prefijo "msoControl". El campo IdControl contiene el valor de la constante de control.

2	Crear las consultas utilizadas por los controles en el formulario FormularioBarrasDeComandos.

a)	Crear la consulta FillBrowseCombo, que se utiliza para rellenar el control cuadro combinado combBarrasDeComandos del formulario FormularioBarrasDeComandos.

Tabla	Campo
tab_BarrasComandos	IdBarraComandos NombreBarraComandos TipoBarraComandos
b)	En la celda Criterios del campo TipoBarraComandos, escriba lo siguiente:

[Forms]![FormularioBarrasDeComandos]![ctlTipoBarraComandos]

c)	Crear la consulta FillBrowseList, que se utiliza para rellenar el control cuadro combinado lstControlesBarraDeComandos del formulario FormularioBarrasDeComandos.

Tabla	Campo	Orden
tab_MiembrosBarraDeComandos	IdControlMiembro IdBarraDeComandos NombreControlMiembro TipoControlMiembro Visible ID	—   —  Ascendente  —   —   —
d)	En la celda Criterios del campo IdBarraDeComandos, escriba lo siguiente:

[Forms]![FormularioBarrasDeComandos]![combBarrasDeComandos]

e)	Crear las siguientes consultas de eliminación, que se utilizan para eliminar datos de las tablas ocultas de la barra de comandos y control de barra de comando.

Consulta	Instrucción SQL
conEliminarDatosDeTablaMiembrosBarraDeComandos	DELETE tab_MiembrosBarraDeComandos.* FROM tab_MiembrosBarraDeComandos;
conEliminarDatosDeTablaBarrasDeComandos	DELETE tab_BarrasComandos.* FROM tab_BarrasComandos;
conEliminarDatosDeTablaControlesMiembro	DELETE tab_ControlesMiembro.* FROM tab_ControlesMiembro;
3	Crear el formulario FormularioBarrasDeComandos y agregar un control ficha llamado ControlFicha0 que contiene al menos dos páginas.

a)	Establecer la propiedad Título (Caption) de una de las páginas a Examinar controles.

b)	Agregar los siguientes controles a la página Examinar controles y establecer sus propiedades Nombre (Name) y DespuésDeActualizar (AfterUpdate) como se indica.

Tipo de  control	Nombre propiedad	propiedad DespuésDeActualizar (AfterUpdate)
Grupo de opciones	ctlTipoBarraComandos	[Procedimiento de evento]
Cuadro combinado	combBarrasDeComandos	[Procedimiento de evento]
Cuadro de lista	lstControlesBarraComandos	—
c)	En el control grupo de opciones ctlTipoBarraComandos, cree los siguientes botones de opción y establezca sus títulos de etiqueta y las propiedades ValorDeLaOpción (OptionValue) como sigue.

Botón de opción	Título de etiqueta	propiedad ValorDeLaOpción (OptionValue)
Option4	Barra de menús	1
Option6	Barra de herramientas	0
Option8	Emergente	2
Nota   Los valores de la propiedad ValorDeLaOpción (OptionValue) para estos botones de opción corresponden a los valores de la propiedad Type para la barra de menús, barra de herramientas, y barras de comandos emergentes.

d)	Establezca las siguientes propiedades del control cuadro combinado combBarrasDeComandos y el control cuadro de lista lstControlesBarraDeComandos.

Propiedad	Valores
TipoOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	FillBrowseCombo (para combBarrasDeComandos) FillBrowseList (para lstControlesBarraDeComandos)
e)	Agregar los siguientes botones de comandos a la página Examinar controles.

Nombre propiedad	propiedad AlHacerClic (OnClick)
cmdCopiarBarraDeComandos	[Procedimiento de evento]
cmdMostrarEmergente	[Procedimiento de evento]
cmdRegenerarTablas	[Procedimiento de evento]
Nota   El formulario FormularioBarrasDeComandos usa cuatro tablas ocultas para almacenar datos acerca de las barras de comandos y controles barra de comandos. En Microsoft Access se pueden ver los objetos ocultos seleccionando las casillas de verificación Objetos ocultos y Objetos del sistema en la ficha Ver del cuadro de diálogo Opciones (menú Herramientas). La tabla tab_TiposControl fue creada como  se describió en el paso 1. Las otras tres tablas son creadas ejecutando el código en el procedimiento de evento Click del botón de comando cmdRegenerarTablas. Si desea volver a crear tablas ocultas de otra base de datos, importe el módulo módCódigoBarraDeComandos y ejecute el procedimiento CrearTablas. Si tiene pensado utilizar el código del módulo módCódigoBarraComandos para actualizar los datos de la barra de comandos y del control barra de comandos, debe importar también las siguientes consultas:

conEliminarDatosTablaMiembrosBarraComandos
conEliminarDatosDeTablaBarrasDeComandos
conEliminarDatosDeTablaControlesMiembro

f)	Cree dos cuadros de texto independientes, llamados txtIdControlMiembro y txtTipoDeControl, y establezca sus propiedades Visible a No. Estos cuadros de texto son usados por la función GetControlType para sincronizar el subformulario con el formulario principal.

4	Crear el subformulario SubformularioBarrasComandos.

a)	Crear el subformulario y establecer las siguientes propiedades del mismo.

Propiedad	Valores
OrigenDelRegistro (RecordSource)	tab_ControlesMiembro
PresentaciónPredeterminada (DefaultView)	Hoja de datos
PresentacionesPermitidas (ViewsAllowed)	Hoja de datos
b)	En el módulo de clase Form_SubformularioBarrasComandos, cree un procedimiento de evento Form_Current que llame a la función ShowButtonImage, que se usa para mostrar el icono del control en la barra de menús principal.

c)	Cree un control subformulario en el formulario FormularioBarrasDeComandos y establezca sus propiedades como sigue.

Propiedad	Valores
Nombre (Name)	SubformularioBarrasComandos
ObjetoOrigen (SourceObject)	SubformularioBarrasComandos
VincularCamposSecundarios (LinkChildFields)	IdControlMiembro
VincularCamposPrincipales (LinkMasterFields)	txtIdControlMiembro
5	En el módulo módCódigoBarrasComandos, cree la función ShowButtonImage.


Procedimiento de evento Click del botón de comando cmdVolverAGenerarTablas

El trabajo real en este procedimiento lo realiza el procedimiento CrearTablas que se muestra abajo. El procedimiento CrearTablas (ubicado en el módulo módCódigoBarraDeComandos) comprueba para asegurar que existe cada tabla requerida y, si existe, rellena las tablas con la barra de comandos y los datos de los controles barra de comandos. Si no existen las tablas, hay procedimientos para volver a crear las tablas requeridas. Para ver el código que vuelve a crear las tablas que faltan, puede examinar los siguientes procedimientos del módulo módCódigoBarraDeComandos: CrearTablaControlesMiembro, CrearTablaMiembrosBarraDeComandos, CrearTablaBarrasDeComandos, y CrearRelación.

Para ver el código que rellena las tablas ocultas con datos acerca de las barras de comandos y los controles barra de comandos, puede examinar los siguientes procedimientos del módulo módCódigoBarraDeComandos: LlenarTablaBarrasComandos, LlenarTablaMiembrosBarraDeComandos, y LlenarTablaControlesMiembros.

Private Sub cmdVolverAGenerarTablas_Click()

' Volver a generar las tablas ocultas tab_BarrasDeComandos,

' tab_MiembrosBarraDeComandos y tab_ControlesMiembro utilizadas

' para llenar los controles de este formulario.

CrearTablas

' Actualizar los datos mostrados.

Me!lstControlesBarraDeComandos.Requery

' Restablecer la selección del grupo de opciones a Barra de menús.

Me!cmdTipoBarra = 1

' Borrar la selección del cuadro combinado.

Me!combBarrasDeComandos = ""

Me!combBarrasDeComandos.Requery

End Sub

Sub CrearTablas()

' Este procedimiento se utiliza para actualizar los datos de las tablas

' ocultas de barras de comandos. Si faltan las tablas, se vuelven a crear.

DoCmd.Hourglass True

Dim varDevolver As Variant, entCuenta As Integer

' Mostrar la barra de progreso en el área de la barra de estado.

varDevolver = SysCmd(acSysCmdInitMeter, "Creando las tablas...", 10)

' Si no existe la tabla, crearla. De lo contrario, ejecutar la consulta

' de eliminación para quitar los datos existentes.

If ExisteLaTabla("tab_ControlesMiembro") = False Then

CrearTablaControlesMiembro

Else

CurrentDb.QueryDefs("conEliminarDatosDeTablaControlesMiembro").Execute

End If

' Actualizar medidor de progreso de la barra de estado.

varDevolver = SysCmd(acSysCmdUpdateMeter, entCuenta + 2)

' Si la tabla no existe, crearla. De lo contrario, ejecutar la consulta

' de eliminación para quitar los datos existentes.

If ExisteLaTabla("tab_MiembrosBarraDeComandos") = False Then

CrearTablaMiembrosBarraDeComandos

Else

CurrentDb.QueryDefs("conEliminarDatosDeTablaMiembrosBarraDeComandos").Execute

End If

' Actualizar medidor de progreso.

varDevolver = SysCmd(acSysCmdUpdateMeter, entCuenta + 4)

' Si la tabla no existe, crearla. De lo contrario, ejecutar la consulta

' de eliminación para quitar los datos existentes.

If ExisteLaTabla("tab_BarrasDeComandos") = False Then

CrearTablaBarrasDeComandos

Else

CurrentDb.QueryDefs("conEliminarDatosDeTablaBarrasDeComandos").Execute

End If

' Actualizar medidor de progreso.

varDevolver = SysCmd(acSysCmdUpdateMeter, entCuenta + 6)

On Error Resume Next

Dim relTemp As Relation

Set relTemp = CurrentDb.Relations("ControlesBarraDeComandos")

If Err <> 0 Then

' Si faltan las relaciones, volverlas a crear.

CrearRelación

End If

' Actualizar medidor de progreso.

varDevolver = SysCmd(acSysCmdClearStatus)

' Llenar las tablas con datos nuevos.

LlenarTablaDeBarrasDeComandos "tab_BarrasDeComandos"

' Volver a abrir el formulario principal.

DoCmd.OpenForm "FormularioBarrasDeComandos"

DoCmd.Hourglass False

End Sub


Procedimiento de evento Click del botón de comando cmdMostrarEmergente

El procedimiento de evento cmdMostrarEmergente_Click() pasa el nombre de barra de comandos seleccionado actualmente a la función MostrarBarraEmergente. El nombre de la barra de comandos se recupera de la segunda columna de la consulta que rellena el control combBarrasDeComandos. El método ShowPopUp de un objeto barra de comandos muestra la barra de comandos emergente en la posición actual del cursor de forma predeterminada. Se pueden especificar las coordenadas x e y de la ubicación en la que desee mostrar la barra de comandos emergente al pasar esos valores al método ShowPopUp.

Private Sub cmdMostrarEmergente_Click()

' Usar el objeto BarrasComandos del método ShowPopup para mostrar

' la barra de herramientas.

ShowPopUpBar Me!combBarrasDeComandos.Column(1)

End Sub

Function MostrarBarraEmergente(cadNombreBarra As String)

' Este procedimiento se llama desde el botón Mostrar emergente del

' formulario FormularioBarrasDeComandos para mostrar la barra de comandos emergente

' seleccionada por el usuario.

Dim cbr As CommandBar

On Error Resume Next

Set cbr = CommandBars(cadNombreBarra)

If cbr.Type <> msoBarTypePopup Then

MsgBox "No es una barra de comandos emergente."

Exit Function

End If

cbr.ShowPopup

End Function


Procedimiento de evento Click del botón de comando cmdCopiarBarraDeComandos

Private Sub cmdCopiarBarraDeComandos_Click()

Dim cadBCOrig As String, cadBCNueva As String, cadTemp As String

If Len(Me!combBarrasDeComandos) <> 0 Then

' Establecer nombre de barra de comandos origen.

cadBCOrig = Me!combBarrasDeComandos.Column(1)

' Establecer nombre de barra de comandos nueva.

cadBCNueva = InputBox("¿Nombre de barra de comandos nueva?", "Nombre nuevo", "Nueva barra de comandos " & cadBCOrig & ".")

' Si falta el nombre nuevo o si el usuario presionó el botón Cancelar,

' salir del procedimiento.

If Len(cadBCNueva) = 0 Then Exit Sub

On Error Resume Next

' Intentar establecer el nombre como si la barra de comandos ya existiera

' y probar si se produce algún error.

cadBCNueva = CommandBars(cadBCNueva).Name

If Err = 0 Then

MsgBox "La barra de comandos especificada '" & cadBCNueva & "' ya existe."

Else

Err = 0

' Asegurarse de que aún existe la barra de herramientas original.

cadTemp = CommandBars(cadBCOrig).Name

If Err = 0 Then

' Copiar la barra de comandos.

CopiarBarraDeComandos cadBCOrig, cadBCNueva

Else

MsgBox "La barra de comandos especificada '" & cadBCOrig & "' ya no existe. Vuelva a generar la tabla de barras de comandos para obtener los datos actuales."

End If

End If

End If

End Sub


Función MostrarImagenDeBotón llamada por el procedimiento de evento Current del subformulario SubformularioBarrasDeComandos

Function MostrarImagenDeBotón()

' Este procedimiento se llama desde el procedimiento de evento

' Change del formulario SubformularioBarrasDeComando para mostrar

' la imagen asociada a un botón especificado de la barra de comandos.

Dim cmdBarra As CommandBar, cmdBotónDeBarra As CommandBarButton

Dim cmdBotónDeBarraDest As CommandBarButton

On Error Resume Next

Set cmdBarra = CommandBars("Barra de menús")

Set cmdBotónDeBarraDest = cmdBarra.Controls("<- Imagen del botón actual")

If Err <> 0 Then

' Si se produce un error es porque no existe el botón

' y se debe agregar.

Set cmdBotónDeBarraDest = cmdBarra.Controls.Add(msoControlButton)

Err = 0

End If

With cmdBotónDeBarraDest

.Caption = "<- Imagen del botón actual"

.BeginGroup = True

.Style = msoButtonIconAndCaption

.TooltipText = "Imagen asociada al botón de barra de herramientas actual"

End With

Set cmdBotónDeBarra = CommandBars.FindControl(msoControlButton, Forms!FormularioBarrasDeComandos!SubformularioBarrasDeComandos!ID)

cmdBotónDeBarra.CopyFace

If Err > 0 Then

' Para los controles que contienen a otros controles,

' no hay ninguna imagen. Cambiar el valor de Style

' para no mostrar ninguna imagen, si no seguirá apareciendo

' la imagen del control anteriormente seleccionado.

cmdBotónDeBarraDest.Style = msoButtonCaption

Else

cmdBotónDeBarraDest.Style = msoButtonIconAndCaption

cmdBotónDeBarraDest.PasteFace

End If

End Function


Procedimiento de evento AfterUpdate del control cuadro combinado combBarrasDeComandos

Este procedimiento llama a la función GetControlType que suministra datos a un control oculto que vincula el control subformulario a los datos mostrados en el formulario principal cuando hay registros coincidentes en el subformulario SubformularioBarrasDeComandos. La función GetControlType se enumera a continuación.

Private Sub combBarrasDeComandos_AfterUpdate()

' Si hay un nombre de barra de comandos en el control

' se activa el botón Copia, si no se desactiva.

If Len(Me!combBarrasDeComandos.Text) > 0 Then

Me!cmdCopiarBarraDeComandos.Enabled = True

Else

Me!cmdCopiarBarraDeComandos.Enabled = False

End If

' Actualizar la lista de controles.

Me!lstControlesBarraDeComandos.Requery

' Determinar la información de tipo de control.

ObtenerTipoDeControl

If Me!cmdTipoBarra = 2 Then

Me!cmdMostrarEmergente.Enabled = True

Else

Me!cmdMostrarEmergente.Enabled = False

End If

End Sub

Function ObtenerTipoDeControl()

' Esta función establece el valor de dos controles

' ocultos del formulario

' FormularioBarrasDeComandos para sincronizar el

' formulario y el subformulario.

Dim lst As ListBox, txtTipo As TextBox

Dim txtIdMiembro As TextBox, frm As Form

Set frm = Me!SubformularioBarrasDeComandos.Form

Set lst = Me!lstControlesBarraDeComandos

Set txtTipo = Me!txtTipoDeControl

Set txtIdMiembro = Me!txtIdControlMiembro

' Si hay un elemento seleccionado en el cuadro de lista

' establecer el valor de los controles ocultos.

If Len(lst) <> 0 Then

txtTipo = lst.Column(3)

txtIdMiembro = lst.Column(0)

End If

End Function


Procedimiento de evento AfterUpdate del control grupo de opciones cmdTipoBarra

Private Sub cmdTipoBarra_AfterUpdate()

' Volver a consultar el cuadro combinado basado en la selección

' hecha en este grupo de opciones.

Me!combBarrasDeComandos.Value = Null

cmdCopiarBarraDeComandos.Enabled = False

cmdMostrarEmergente.Enabled = False

Me!combBarrasDeComandos.Requery

Me!lstControlesBarraDeComandos.Requery

End Sub


Crear un botón de barra de comandos que llama a un procedimiento personalizado de Visual Basic

La ficha Agregar botón del formulario FormularioBarrasDeComandos contiene el botón de comando cmdCrearBotón y el cuadro combinado NombreCompañía. El botón de comando agrega un botón de barra de comando personalizado a la barra de menús y establece su propiedad Acción (OnAction) al nombre de un procedimiento que recupera información de la tabla Clientes dependiendo de la selección actual del cuadro combinado NombreCompañía.

Introducción general

Agregue un control ficha a un formulario independiente. Establezca la propiedad Título (Caption) de una página del control ficha a Agregar botón. Agregue un botón de comando y un cuadro combinado al formulario. Cree un procedimiento de evento Click para el botón de comando cmdCrearBotón para agregar un botón personalizado a la barra de menús. Cree un procedimiento para mostrar la información de contacto del cliente cuando se haga clic en el botón personalizado.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	FormularioBarrasDeComandos
Tabla	Clientes
Paso a paso

1	Crear el formulario FormularioBarrasDeComandos y agregar un control ficha llamado ControlFicha0 que contenga al menos dos páginas.

a)	Establecer la propiedad Título (Caption) de una de las páginas a Agregar botón.

b)	Agregar los siguientes controles a la página Agregar botón y establecer sus propiedades Nombre (Name) y título de etiquetas como sigue.

Tipo de control	Nombre propiedad	Título de etiqueta
Botón de comando	cmdCrearBotón	Crear botón de barra de herramientas
Cuadro combinado	NombreCompañía	Compañías:
2	Establezca la propiedad AlHacerClic (OnClick) del botón de comando cmdCrearBotón a [Procedimiento de evento], y luego cree el procedimiento de evento Click. Este procedimiento de evento llama a la función CrearBotónPersonalizado en el módulo de clase Form_FormularioBarrasDeComandos.


Procedimiento de evento Click del botón de comando cmdCrearBotón

El procedimiento de evento cmdCrearBotón_Click() llama a la función CrearBotónPersonalizado, que agrega un botón con el título "Información de contactos" a la barra de menús y establece varias propiedades para permitir la ejecución de la función ObtenerInformaciónDelContacto si se hace clic en el botón. Una vez creado el botón, no hay necesidad de crearlo de nuevo, con lo que se desactiva el botón de comando cmdCrearBotón. Observe que el código de un procedimiento de evento Change de un control ficha comprueba si el botón personalizado está todavía en la barra de menús y, si no lo está, vuelve a activar el botón de comando cmdCrearBotón para permitir que el usuario vuelva a crearlo si es necesario.

Private Sub cmdCrearBotón_Click()

' Crear un botón de barra de comando personalizado.

CrearBotónPersonalizado

' Establecer el enfoque en control NombreCompañía.

Me!NombreCompañía.SetFocus

' Puesto que se acaba de crear botón, desactivar este control por ahora.

Me!cmdCrearBotón.Enabled = False

End Sub

Function CrearBotónPersonalizado() As Integer

Dim cmdBarraPrincipal As CommandBar, cmdBotónPersonalizadoDeBarra As CommandBarButton

Set cmdBarraPrincipal = CommandBars("Menu Bar")

' Mostrar barra de menús principal si está oculta.

If cmdBarraPrincipal.Visible = False Then cmdBarraPrincipal.Visible = True

On Error Resume Next

Set cmdBotónPersonalizadoDeBarra = cmdBarraPrincipal.Controls("Información de contacto")

If Err <> 0 Then

' Crear el botón personalizado porque aún no existe.

Set cmdBotónPersonalizadoDeBarra = 	cmdBarraPrincipal.Controls.Add(msoControlButton, , , , True)

End If

With cmdBotónPersonalizadoDeBarra

.Caption = "Información de contacto"

.BeginGroup = True

.OnAction = "=msgbox(ObtenerInformaciónDeContacto())"

.Style = msoButtonCaption

End With

End Function


Características más importantes del formulario FormularioHipervínculosSoluciones

El formulario FormularioHipervínculosSoluciones muestra cómo usar hipervínculos para navegar a otros objetos de la aplicación de muestra que se encuentra en Soluciones para los programadores. Este formulario duplica la funcionalidad del formulario SolucionesParaElProgramador con unas cuantas diferencias importantes. Primero, el propio formulario es "ligero", significando que no tiene módulo de código adjunto. Todos los eventos y propiedades a los que se llama desde este formulario son llamados usando los valores de la propiedad. Segundo, el formulario utiliza un control ficha que contiene cuatro controles página, cada uno con un cuadro de lista asociado para mostrar las principales categorías de ejemplos de Soluciones para los programadores. Tercero, todas las navegaciones a los objetos de la base de datos se producen usando hipervínculos. Los hipervínculos a los objetos de base de datos se crean sobre la marcha basados en la selección hecha por el usuario.

Las siguientes técnicas hacen que el formulario FormularioHipervínculosSoluciones funcione:

•	Usando un hipervínculo para mostrar un objeto de base de datos.


Utilizar un hipervínculo para mostrar un objeto de base de datos

Los hipervínculos se utilizan en los formularios y hojas de datos para saltar a objetos de la misma o de otra base de datos de Microsoft Access, a documentos creados con Microsoft Word, con Microsoft Excel, y con Microsoft PowerPoint, y a documentos de la Internet general o de una intranet local. El formulario FormularioHipervínculosSoluciones de Soluciones para los programadores muestra cómo saltar a objetos de la misma base de datos. Para navegar a un objeto de la misma base de datos de Microsoft Access se utiliza la parte de subdirección de los datos almacenados en un campo con el tipo de datos Hipervínculo o estableciendo la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress) de un botón de comando, etiqueta, o control imagen. El formulario FormularioHipervínculosSoluciones establece la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress) del botón cmdAceptar del formulario para mostrar un objeto.

Introducción general

Cree un formulario independiente para mostrar las categorías de ejemplos y los temas de ejemplo. Agregue al formulario un control ficha con páginas para las categorías Temas generales, Formularios, Informes, y Consultas. Agregue el código al evento Load del formulario y el procedimiento de evento Change del control ficha para rellenar los distintos controles cuadro de lista de las categorías. Agregue un procedimiento para rellenar los controles cuadro de lista de ejemplos. Agregue un procedimiento al evento Click del botón de comando Aceptar para crear el valor de la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress). Agregue un procedimiento para navegar al destino especificado por la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress).

Un valor válido de la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress) consiste en un tipo de objeto y un nombre de objeto separados por un espacio. Por ejemplo, para abrir la tabla Clientes desde un botón de comando, podría establecer la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress) del botón de comando a "Tabla Clientes". El formulario FormularioHipervínculosSoluciones utiliza esta técnica para navegar a los objetos de la aplicación de muestra de Soluciones para los programadores.

Las funciones ObtenerObjetoDeEjemplo y CrearHipervínculo se usan para crear de forma dinámica una propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress) para el botón cmdAceptar. Es necesario resaltar dos técnicas usadas en este ejemplo. Primero, cuando se navega a una dirección de hipervínculo, Microsoft Access muestra automáticamente la barra de herramientas Web. Sin embargo, la barra de herramientas Web no es necesaria en este ejemplo con lo que se desactiva de forma explícita en la función ObtenerObjetoDeEjemplo, justo antes de que se produzca la navegación a la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress). Segundo, un control con un valor de la propiedad DirecciónDeHipervínculo (HyperlinkAddress) o SubdirecciónDeHipervínculo (HyperlinkSubaddress) forzará al puntero del mouse a mostrar un dedo señalador cuando se mueva el puntero sobre el control. Este comportamiento tampoco es necesario en el formulario de ejemplo FormularioHipervínculosSoluciones. Para evitar el comportamiento predeterminado, la propiedad SubdirecciónDeHipervínculo (HyperlinkSubaddress) del botón cmdAceptar se restablece a una cadena de longitud cero inmediatamente después de que se invoque al método Follow para navegar al objeto especificado.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	FormularioHipervínculosSoluciones
Consulta	HipervínculosFichaGeneral
Consulta	HipervínculosFichaFormularios
Consulta	HipervínculosFichaInformes
Consulta	HipervínculosFichaConsultas
Módulo	módCódigoHipervínculo
Paso a paso

1	Crear las consultas utilizadas para rellenar los controles cuadro de lista del formulario FormularioHipervínculosSoluciones.

Consulta	Tabla	Campo	Criterios
HipervínculosFichaGeneral	TemasDeEjemplo	Tipo	"General"
HipervínculosFichaFormularios	TemasDeEjemplo	Tipo	"Formularios"
HipervínculosFichaInformes	TemasDeEjemplo	Tipo	"Informes"
HipervínculosFichaConsultas	TemasDeEjemplo	Tipo	"Consultas"
2	Crear el formulario FormularioHipervínculosSoluciones.

a)	Establecer siguientes propiedades del formulario.

Propiedad	Valores
PresentaciónPreliminar (DefaultView)	Formulario simple
EstiloDeLosBordes ( BorderStyle)	Diálogo
AlAbrir (OnOpen)	=ObtenerListaDeEjemplos()
b)	En la sección de detalles, agregue un control ficha llamado ctlFicha, y escriba =ComprobarÍndice() en la propiedad AlCambiar (OnChange) de la ficha en la hoja de propiedades.

c)	Cree cuatro páginas en el control ficha ctlFicha, y establezca sus propiedades Título (Caption) a Temas generales, Formularios, Informes y Consultas.

d)	En cada página, cree un cuadro de lista independiente. Nombre el cuadro de lista lstGeneral, lstFormularios, lstInformes, o lstConsultas, respectivamente, y luego establezca las siguientes propiedades para el mismo.

Propiedad	Valores
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	HipervínculosFichaGeneral (para lstGeneral) HipervínculosFichaFormularios (para lstFormularios) HipervínculosFichaInformes (para lstInformes) HipervínculosFichaConsultas (para lstConsultas)
AlHacerClic (OnClick)	=ObtenerListaDeEjemplos()
e)	Agregue un cuadro de lista independiente al formulario, y establezca las siguientes propiedades al mismo.

Propiedad	Valores
Nombre (Name)	lstEjemplos
AlHacerDobleClic (OnDblClick)	=ObtenerObjetoDeEjemplo()
f)	Agregue un botón de comando al formulario, y establecer sus propiedades como sigue.

Propiedad	Valores
Nombre (Name)	cmdAceptar
Título (Caption)	&Aceptar
AlHacerClic (OnClick)	=ObtenerObjetoDeEjemplo()
3	Cree las siguientes funciones en el módulo módCódigoHipervínculo:

•	función ObtenerListaDeEjemplos

•	función ComprobarÍndice

•	función ObtenerObjetoDeEjemplo

•	función CrearHipervínculo

Nota   La función CrearHipervínculo se llama desde la función ObtenerObjetoDeEjemplo.


Función CrearHipervínculo

Private Function CrearHipervínculo(ctl As Control, cadSubdirección As String)

' Establecer la propiedad SubdirecciónDeHipervínculo (HyperlinkSubAddress)

' del botón cmdAceptar del formulario FormularioHipervínculosSoluciones.

' Después se visita la subdirección utilizando el método

' Follow y se establece inmediatamente a una cadena de longitud

' cero para impedir que el puntero del mouse cambie cuando está

' sobre el botón de comando cmdAceptar.

Dim hip As Hyperlink

Select Case ctl.ControlType

Case acLabel, acImage, acCommandButton

Set hip = ctl.Hyperlink

With hip

.Address = Null

.SubAddress = cadSubdirección

.Follow True, True

.SubAddress = ""

End With

Case Else

MsgBox "El control " & ctl.Name & " no permite utilizar hipervínculos."

End Select

End Function


Función ObtenerObjetoDeEjemplo

Function ObtenerObjetoDeEjemplo() As Integer

' Este procedimiento se llama desde la propiedad AlHacerClick

' (OnClick) del botón cmdAceptar del formulario

' FormularioHipervínculosSoluciones y obtiene la información

' necesaria para llamar al procedimiento CrearHipervínculo.

Dim formulario As Form

Dim ctlLista As ListBox, cmdAceptar As CommandButton

Dim NombreObjeto As String, TipoObjeto As String, cadSubdirección As String

Set formulario = Forms!FormularioHipervínculosSoluciones

Set ctlLista = formulario!lstEjemplos

Set cmdAceptar = formulario!cmdAceptar

If IsNull(ctlLista.Column(2)) Then

MsgBox "Seleccione un ejemplo de la lista."

Exit Function

Else

NombreObjeto = ctlLista.Column(2)

TipoObjeto = ctlLista.Column(3)

If TipoObjeto = "Diálogo" Then TipoObjeto = "Formulario"

cadSubdirección = TipoObjeto & " " & NombreObjeto

End If

' Desactivar la barra de herramientas Web; de lo contrario

' aparece automáticamente al llamar al método Follow en el

' procedimiento CrearHipervínculo.

DoCmd.ShowToolbar "Web", acToolbarNo

CrearHipervínculo cmdAceptar, cadSubdirección

End Function


Función ComprobarÍndice

Function ComprobarÍndice()

' Este procedimiento se llama desde el valor de la propiedad AlCambiar

' (OnChange) del formulario FormularioHipervínculosSoluciones.

' Si no hay ninguna selección, fuerza la selección del primer

' elemento del control cuadro de lista de cada ficha.

Dim ctlLista As Control

Set ctlLista = Screen.ActiveControl

If ctlLista.Properties("ListIndex") = -1 Then

ctlLista.Properties("ListIndex") = 0

End If

' Llenar el cuadro de lista de ejemplos.

ObtenerListaDeEjemplos

End Function


Función ObtenerListaDeEjemplos

Function ObtenerListaDeEjemplos()

' Este procedimiento se llama desde el valor de la propiedad

' AlAbrir (OnOpen) del formulario FormularioHipervínculosSoluciones

' y desde el procedimiento de evento AlCambiar (OnChange) del

' control ficha del formulario FormularioHipervínculosSoluciones.

' Llena el control cuadro de lista de la ficha actual.

Dim formulario As Form, ctlFicha As TabControl

Dim ctlLista As ListBox, ctlListaEjemplos As ListBox

Dim cadSQLLista As String

On Error Resume Next

Set formulario = Forms!FormularioHipervínculosSoluciones

Set ctlFicha = formulario!ctlFicha

Set ctlListaEjemplos = formulario!lstEjemplos

cadSQLLista = "Select * FROM ObjetosDeFormularioHipervínculosSoluciones WHERE IdTema = "

Select Case ctlFicha.Value

Case 0

' Recuperar los temas para la ficha Temas generales.

Set ctlLista = formulario!lstGeneral

Case 1

' Recuperar los temas para la ficha Formularios.

Set ctlLista = formulario!lstFormularios

Case 2

' Recuperar los temas para la ficha Informes.

Set ctlLista = formulario!lstInformes

Case 3

' Recuperar los temas para la ficha Consultas.

Set ctlLista = formulario!lstConsultas

End Select

ctlListaEjemplos.RowSource = cadSQLLista & ctlLista.Column(0)

' Ocultar el formulario Soluciones para el programador mientras

' está abierto el formulario FormularioHipervínculosSoluciones.

Forms!SolucionesParaElProgramador.Visible = False

End Function


Características más importantes del formulario WebExplorarTabla

El formulario WebExplorarTabla muestra cómo examinar hipervínculos almacenados en una tabla.

Nota   El formulario WebExplorarTabla utiliza el control Explorador de Web de Microsoft para mostrar el contenido del Web de un formulario Microsoft Access. El control Explorador de Web se instala en su máquina cuando se instala Microsoft Internet Explorer 3.0 o posterior. Si no ha instalado Internet Explorer 3.0 o posterior, no podrá ejecutar el formulario WebExplorarTabla.

Además, el formulario WebExplorarTabla intenta conectar inmediatamente a la Internet a través de su proveedor de servicio Internet cuando se abre. Puede que experimente un retraso de varios minutos mientras se establece la conexión Internet.

La siguiente técnica hace que el formulario WebExplorarTabla funcione:

•	Examinando datos de hipervínculo almacenados en una tabla.


Examinar datos de hipervínculos almacenados en una tabla

El formulario WebExplorarTabla demuestra cómo examinar los hipervínculos almacenados en una tabla usando el control Explorador de Web de un formulario de Microsoft Access. En la aplicación de muestra Soluciones para el programador, los hipervínculos se almacenan en la tabla Vínculos. Puede agregar nuevos hipervínculos a un registro de la tabla Vínculos haciendo clic en Hipervínculo en el menú Insertar o introduciendo datos de hipervínculo en la tabla. También puede guardar datos de hipervínculo en la tabla Vínculos haciendo clic en el botón de comando Guardar ubicación en el formulario WebExplorarWeb.

Introducción general

Cree un formulario y establezca su propiedad OrigenDelRegistro (RecordSource) a la tabla Vínculos. En el encabezado del formulario, agregue controles cuadro de texto independientes a los campos Descripción e Hipervínculo de la tabla Vínculos. En la sección Detalle del formulario, agregue un control Explorador de Web. Agregue código al procedimiento de evento Current del formulario para navegar al hipervínculo de destino en el campo Hipervínculo del registro actual.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	WebExplorarTabla
Tabla	Vínculos
Paso a paso

1	Crear la tabla Vínculos.

a)	Agregar un campo llamado Descripción, establezca su tipo de datos a Texto, y establezca su propiedad Tamaño del campo (FieldSize) a 255.

b)	Agregue un segundo campo llamado Hipervínculo y establezca su tipo de datos a Hipervínculo.

2	Crear formulario WebExplorarTabla.

a)	Establecer las siguientes propiedades del formulario.

Propiedad	Valores
OrigenDelRegistro (RecordSource)	Vínculos
Título (Caption)	Examinar hipervínculos guardados
AlActivarRegistro (OnCurrent)	[Procedimiento de evento]
AlAbrir (OnOpen)	[Procedimiento de evento]
b)	En la sección Encabezado del formulario, agregue controles cuadro de texto a los campos Descripción e Hipervínculo en la tabla Vínculos arrastrando estos campos desde la lista de campos al formulario.

c)	En la sección Detalle, agregue un control ActiveX Explorador de Web y llámelo ControlActiveX1. Para insertar el control, haga clic en Control ActiveX en el menú Insertar, y luego haga clic en Control Explorador de Web de Microsoft.

Nota   Si el control Explorador de Web no aparece en el cuadro de diálogo Insertar control ActiveX, haga clic en Controles ActiveX en el menú Herramientas, y luego haga clic en el botón Registrar. Localice Shdocvw.dll en la carpeta Windows\System.

3	En la sección de declaraciones del módulo de clase Form_WebExplorarTabla, crear la variable pública gvarBookmark. Esta variable almacena información de marcadores que se utiliza para moverse al último registro que contenía un hipervínculo válido si se produce un error cuando se encuentra una dirección de hipervínculo no válida.


Procedimiento de evento Current del formulario WebExplorarTabla

Private Sub Form_Current()

' Este procedimiento usa el método Navigate del control

' Explorador de Web para moverse a la siguiente dirección de

' hipervínculo. La función HyperlinkPart se utiliza para extraer

' la parte de Dirección del hipervínculo guardado. Si funciona la

' navegación, la propiedad Marcador (Bookmark) del formulario se

' almacena en una variable pública. Esta variable pública se

' utiliza para volver al último registro si falla la navegación.

Dim varFull As Variant, varDescription As Variant

Dim DirecciónDeHipervínculo As String, SubdirecciónDeHipervínculo As String

Dim msg As String, rst As Recordset, strDisplay As String

On Error Resume Next

Set rst = Me.RecordsetClone

rst.Bookmark = Me.Bookmark

varFull = rst!HyperLink

If IsNull(varFull) Then GoTo Current_Err

varDescription = rst!Description

Me!ActiveXCtl1.Navigate HyperlinkPart(varFull, acAddress)

If Err = 438 Then Exit Sub

gvarBookMark = Me.Bookmark

Current_Salir:

Exit Sub

Current_Err:

MsgBox "Dirección de hipervínculo no válida. Puede eliminar el _

& "registro descrito como '" & rst!Description & "' de tabla _

& "'Vínculos' o modificar hipervínculo para suministrar _

& "una dirección válida."

Me.Bookmark = gvarBookMark

Exit Sub

End Sub


Procedimiento de evento Open del formulario WebExplorarTabla

Private Sub Form_Open(Cancel As Integer)

' Este procedimiento obtiene hipervínculo almacenado en primer

' registro de tabla Vínculos y utiliza el método Navigate

' del control Explorador de Web para navegar a ese hipervínculo.

' El control Explorador de Web se instala y registra durante

' instalación de Microsoft Internet Explorer 3.0

' (o posterior).

Dim dbs As Database, rst As Recordset

On Error Resume Next

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Vínculos", dbOpenDynaset)

rst.MoveFirst

Me!ActiveXCtl1.Navigate HyperlinkPart(rst!HyperLink, acAddress)

If Err = 438 Then

' Error generado cuando control Explorador de Web no está instalado.

MsgBox "Este formulario sólo puede verse en una máquina que tenga también instalado Microsoft Internet Explorer 3.0 o posterior.", vbCritical, "Error cargando Explorador"

DoCmd.Close acForm, Me.Name

Exit Sub

End If

' Almacenar marcador de registro actual en variable pública para

' utilizar, si es necesario, en procedimiento de evento Current

' del formulario.

gvarBookMark = Me.Bookmark

End Sub


Características más importantes del formulario WebExplorarWeb

El formulario WebExplorarWeb muestra cómo explorar el World Wide Web desde un formulario de Microsoft Access.

Nota   El formulario WebExplorarWeb usa el control Explorador de Web de Microsoft para mostrar el contenido del Web en un formulario Microsoft Access. El control Explorador de Web se instala en su máquina cuando se instala Microsoft Internet Explorer 3.0 o posterior. Si no ha instalado Internet Explorer 3.0 o posterior, no podrá ejecutar el formulario WebExplorarWeb.

Además, el formulario WebExplorarWeb intenta conectarse inmediatamente a la Internet a través de su proveedor de servicio Internet cuando se abre. Puede que experimente un retraso de varios minutos mientras se establece una conexión Internet.

Las siguientes técnicas hacen que el formulario WebExplorarWeb funcione:

•	Creando una animación para indicar que el control Explorador de Web está ocupado descargando datos.

•	Creando un cuadro de diálogo para obtener información del usuario y guardar datos del hipervínculo en el tabla de hipervínculos.

•	Agregando controles y procedimientos de evento al formulario WebExplorarWeb que le permitan explorar el World Wide Web.


Crear una animación para indicar que el control Explorador de Web está ocupado descargando datos

Todos los exploradores de Web usan alguna pista visual para indicar que el explorador está ocupado. Usando técnicas simples de animación en Visual Basic, puede agregar animación a su formulario para proporcionar las mismas pistas visuales. El formulario WebExplorarWeb usa una serie de ocho imágenes para simular una luna girando y una imagen individual de la tierra para indicar que el control Explorador de Web está desocupado. El procedimiento de evento Timer del formulario se utiliza para manipular las imágenes para crear la animación.

Introducción general

Crear un formulario, y agregar una serie de imágenes a la sección Encabezado del formulario. Agregue código a los procedimientos de evento DownloadBegin y DownloadComplete del control Explorador de Web para iniciar y detener la animación. Agregue código al procedimiento de evento Timer del formulario para animar las imágenes.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	WebExplorarWeb
Tabla	Hipervínculos
Paso a paso

1	Crear la tabla Hipervínculos, como se describe en Examinar datos de hipervínculo almacenados en una tabla.

2	Crear el formulario WebExplorarWeb.

a)	Establecer las siguientes propiedades del formulario.

Propiedades	Valores
OrigenDelRegistro (RecordSource)	Hipervínculos
Título (Caption)	Formulario explorador Personalizado
AlCronómetro (OnTimer)	[Procedimiento de evento]
b)	En la sección Encabezado del formulario, agregue nueve controles imagen, llamados Luna1 a Luna8 y Tierra1. Los nueve controles deberían estar ubicados en el mismo lugar, con cada control apilado encima de los demás.

c)	En la sección Encabezado del formulario, cree un cuadro de texto independiente y establezca sus propiedades como sigue.

Propiedad	Valores
Nombre (Name)	txtVínculos
ValorPredeterminado (DefaultValue)	"http://www.microsoft.com"
DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
d)	En la sección Detalle, agregue un control ActiveX Explorador de Web, como se describe en Examinar datos de hipervínculo almacenados en una tabla.

3	En el módulo de clase Form_WebExplorarWeb, crear el procedimiento RotarIconos. El procedimiento de evento RotarIconos establece la propiedad IntervaloDeCronómetro (TimerInterval) del formulario para iniciar y detener la animación dependiendo del valor del argumento blnState.

4	En el módulo de clase Form_WebExplorarWeb, cree los procedimientos de evento DownloadBegin y DownloadComplete para el control Explorador de Web. En el procedimiento de evento DownloadBegin, agregue una llamada para iniciar el procedimiento RotarIconos. En el procedimiento de evento DownloadComplete, agregue una llamada para detener el procedimiento RotarIconos.


Procedimiento de evento Timer del formulario WebExplorarWeb

Private Sub Form_Timer()

' Este procedimiento anima el icono que muestra una luna girando.

' El formulario contiene 8 iconos de luna distintos y un icono de

' tierra. El icono de la tierra se muestra de forma

' predeterminada. Cuando el explorador está ocupado, el

' procedimiento RotarIconos establece la propiedad

' Intervalo de cronómetro, que especifica cuándo se rotan los

' iconos.

Select Case gLunaActual

Case 1

Me!luna2.Visible = True

Me!luna1.Visible = False

Case 2

Me!luna3.Visible = True

Me!luna2.Visible = False

Case 3

Me!luna4.Visible = True

Me!luna3.Visible = False

Case 4

Me!luna5.Visible = True

Me!luna4.Visible = False

Case 5

Me!luna6.Visible = True

Me!luna5.Visible = False

Case 6

Me!luna7.Visible = True

Me!luna6.Visible = False

Case 7

Me!luna8.Visible = True

Me!luna7.Visible = False

Case 8

Me!luna1.Visible = True

Me!luna8.Visible = False

End Select

If gLunaActual < 8 Then

gLunaActual = gLunaActual + 1

Else

gLunaActual = 1

End If

End Sub


Procedimiento RotarIconos

Sub RotarIconos(blnState As Boolean)

If blnState = True Then

' Establecer propiedad IntervaloCronómetro.

Me.TimerInterval = 100

' Si blnState es True, ocultar tierra1 y

' rotar luna1 a luna8.

Me!tierra1.Visible = False

Else

' Si blnState es False, ocultar todos los controles de imagen

' excepto tierra1.

Me!tierra1.Visible = True

' Establecer IntervaloCronómetro a 0 de forma que no se

' dispare evento.

Me.TimerInterval = 0

End If

End Sub

Private Sub ActiveXCtl1_DownloadBegin()

' Animar iconos mientras control está ocupado.

RotarIconos True

End Sub

Private Sub ActiveXCtl1_DownloadComplete()

' Detener animación de iconos.

RotarIconos False

End Sub


Crear un cuadro de diálogo para obtener información del usuario y guardar datos del hipervínculo en la tabla de hipervínculos

Cuando se exploran ubicaciones del World Wide Web usando el formulario WebExplorarWeb, el botón Guardar ubicación proporciona una manera fácil de guardar la dirección de hipervínculo actual en la tabla de hipervínculos. (Estos hipervínculos guardados se pueden ver usando el formulario WebExplorarTabla.) Cuando hace clic en el botón de comando Guardar ubicación, el código del procedimiento de evento Click del botón busca en la tabla de hipervínculos para determinar si el hipervínculo actual ya existe. Si el hipervínculo no se ha guardado todavía en la tabla de hipervínculos, se abre el formulario CuadroDeDiálogoGuardarDirecciónURL para permitir que introduzca información adicional con respecto al hipervínculo que está guardando. Haciendo clic en el botón de comando Aceptar del formulario CuadroDeDiálogoGuardarDirecciónURL guarda los datos especificados en la tabla de hipervínculos.

Introducción general

Cree el formulario independiente CuadroDeDiálogoGuardarDirecciónURL. Agregue dos controles cuadro de texto para obtener información de la descripción y de la dirección acerca del hipervínculo a ser guardado. Agregue un botón de comando Guardar ubicación a la sección Encabezado del formulario WebExplorarWeb que comprueba para estar seguro de que el hipervínculo no se ha guardado y permite que guarde el hipervínculo en la tabla de hipervínculos.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	CuadroDeDiálogoGuardarDirecciónURL
Formulario	WebExplorarWeb
Tabla	Hipervínculos
Paso a paso

1	Crear el formulario CuadroDeDiálogoGuardarDirecciónURL.

a)	Establecer las siguientes propiedades del formulario.

Propiedad	Valores
Título (Caption)	Guardar ubicación en tabla
AlCargar (OnLoad)	[Procedimiento de evento]
b)	En la sección Detalle, agregue controles de cuadro de texto de descripción y de dirección llamados txtDescripciónGuardada y txtDirecciónGuardada, respectivamente.

c)	En la sección Detalle, agregue los botones de comando Aceptar y Cancelar (llamados cmdAceptar y cmdCancel) bajo los cuadros de texto txtDescripciónGuardada y txtDirecciónGuardada.

2	Cree la tabla Hipervínculos, como se describe en Examinar datos de hipervínculo almacenados en una tabla.

3	Crear el formulario WebExplorarWeb, como se describe en Crear una animación para indicar que el control Explorador de Web está ocupado descargando datos.

•	En la sección Encabezado del formulario, crear el botón de comando Guardar ubicación y establecer sus propiedades como sigue.

Propiedades	Valores
Nombre (Name)	cmdGuardarUbicación
Título (Caption)	Guardar ubicación
AlHacerClic (OnClick)	[Procedimiento de evento]
El código del procedimiento de evento Click del botón Guardar ubicación guarda la información del hipervínculo si el usuario hace clic en el botón Aceptar en el formulario CuadroDeDiálogoGuardarDirecciónURL. El procedimiento de evento Click del botón Aceptar oculta el formulario CuadroDeDiálogoGuardarDirecciónURL estableciendo su propiedad Visible a False. Cuando el control vuelve al código que se ejecuta en el procedimiento de evento Click del botón Guardar ubicación, los datos actuales del hipervínculo se guardan en la tabla Vínculos sólo si el formulario CuadroDeDiálogoGuardarDirecciónURL permanece abierto, aunque oculto.

4	En el módulo de clase Form_WebExplorarWeb, cree el procedimiento de evento Click para el botón de comando Guardar ubicación y la función ExistenRegistros relacionada,  que se utiliza para determinar si el usuario está intentando guardar un hipervínculo que ya está guardado en la tabla de hipervínculos. Observe que el código del procedimiento de evento Click pasa la información acerca del hipervínculo actual al formulario CuadroDeDiálogoGuardarDirecciónURL usando el argumento AbrirArgs (OpenArgs) de la acción AbrirFormulario. El código procedimiento de evento Load del formulario CuadroDeDiálogoGuardarDirecciónURL usa esa información para rellenar sus dos controles cuadro de texto. Observe también que la acción AbrirFormulario abre el formulario CuadroDeDiálogoGuardarDirecciónURL con el argumento acDialog. Esto fuerza al código del procedimiento de evento Click del botón Guardar ubicación a esperar hasta que el usuario haga clic en Aceptar o Cancelar en el formulario CuadroDeDiálogoGuardarDirecciónURL antes de proceder.


Procedimiento de evento Load del formulario CuadroDeDiálogoGuardarDirecciónURL

Private Sub Form_Load()

If Len(Me.OpenArgs > 0 Then

' Obtener información contenida en propiedad ArgsDeApertura.

Me!txtDescripciónGuardada = Left(Me.OpenArgs, InStr _

(Me.OpenArgs), ";") - 1)

Me!txtDirecciónGuardada = Mid(Me.OpenArgs, InStr _

(Me.OpenArgs, ";") + 1)

End If

End Sub


Procedimiento de evento Click del botón de comando cmdGuardarUbicación

El procedimiento de evento Click del botón de comando cmdGuardarUbicación llama a la función ExistenRegistros (mostrada a continuación), que determina si el usuario está intentando guardar un hipervínculo que ya existe en la tabla de hipervínculos.

Private Sub cmdGuardarUbicación_Click()

' Este procedimiento guarda el hipervínculo actual en la tabla Vínculos.

Dim bd As Database, rst As Recordset

Dim ctlHiper As Control, frmDiálogo As Form

Dim cadHipervínculo As String

Set bd = CurrentDb

Set rst = bd.OpenRecordset("Vínculos", dbOpenDynaset)

Set ctlHiper = Me!ControlActiveX1

cadHipervínculo = "#" & ctlHiper.LocationURL & "#"

' Comprobar si esta página ha sido guardada en la tabla Vínculos.

If ExistenRegistros(rst, cadHipervínculo) = True Then

MsgBox "Esta ubicación ya estaba guardada en la tabla."

DoCmd.Hourglass False

Exit Sub

End If

' Abrir el formulario CuadroDeDiálogoGuardarDirecciónURL.

DoCmd.OpenForm "CuadroDeDiálogoGuardarDirecciónURL", acNormal, , , acEdit, acDialog, ctlHiper.LocationName & ";" & ctlHiper.LocationURL

If EstáCargado("CuadroDeDiálogoGuardarDirecciónURL") = False Then

' El usuario hizo clic en Cancelar. Salir del procedimiento.

DoCmd.Hourglass False

Exit Sub

End If

' Agregar el nuevo registro y cerrar el formulario CuadroDeDiálogoGuardarDirecciónURL.

With rst

.AddNew

!Descripción = Forms!CuadroDeDiálogoGuardarDirecciónURL!txtDescripciónGuardada

!Hipervínculo = cadHipervínculo

.Update

End With

DoCmd.Close acForm, "CuadroDeDiálogoGuardarDirecciónURL", acSaveNo

DoCmd.Hourglass False

End Sub

Function ExistenRegistros(rst As Recordset, cadUbicación As String) As Boolean

' Este procedimiento se llama desde el evento cmdGuardarUbicación_Click()

' para determinar si ya existe en la tabla Vínculos la dirección

' de hipervínculo que está intentando guardar el usuario.

On Error Resume Next

DoCmd.Hourglass True

With rst

.MoveLast

If Err = 3021 Or .RecordCount = 0 Then

' No hay ningún registro en la tabla.

ExistenRegistros = False

Else

.MoveFirst

.FindFirst "Hipervínculo = '" & cadUbicación & "'"

If .NoMatch Then

' No hay ningún registro coincidente en la tabla.

ExistenRegistros = False

Else

' Un registro coincidente encontrado.

ExistenRegistros = True

End If

End If

End With

DoCmd.Hourglass False

End Function


Agregar controles y procedimientos de evento al formulario WebExplorarWeb que permitan explorar el World Wide Web

El formulario WebExplorarWeb está diseñado para realizar operaciones similares a aquellas encontradas en las aplicaciones comerciales del Web. El control Explorador de Web le ofrece una herramienta eficaz para tener acceso a los datos de Internet y, cuando se usa desde Microsoft Access, es fácil de programar.

Introducción general

Cree el formulario WebExplorarWeb y agregue un control Explorador de Web a la sección Detalle del formulario. Agregue botones de comandos a la sección Detalle del formulario para permitirle moverse hacia atrás y hacia adelante por los hipervínculos visitados, así como actualizar el hipervínculo actual y tener acceso a una página de Búsqueda de Internet. Agregue un control cuadro de texto a la sección Encabezado del formulario para mostrar la información acerca de la dirección actual del hipervínculo y agregue código al procedimiento de evento AfterUpdate del control para ir a la dirección del hipervínculo escrita en el cuadro de texto. Estas características del formulario WebExplorarWeb y los controles descritos anteriormente se proporcionan a través de varios métodos del control Explorador de Web.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	WebExplorarWeb
Tabla	Hipervínculos
Paso a paso

1	Crear la tabla Hipervínculos, como se describe en Examinar datos de hipervínculos almacenados en una tabla.

2	Crear el formulario WebExplorarWeb, como se describe en Crear una animación para indicar que el control Explorador de Web está ocupado descargando datos.

a)	Agregar un encabezado y pie al formulario. Establezca la propiedad Alto de la sección Pie a 0".

b)	En la sección Detalle, agregue un control ActiveX Explorador de Web, como se describe en Examinar datos de hipervínculo almacenados en una tabla.

c)	En la sección Encabezado del formulario, agregue seis botones de comando y establezca sus propiedades Título (Caption) como sigue.

Nombre del control	Propiedad Título (Caption)
cmdGuardarUbicación	Guardar ubicación
cmdPrincipal	Principal
cmdAtrás	Atrás
cmdAdelante	Adelante
cmdActualizar	Actualizar
cmdBuscar	Buscar
d)	Cree el procedimiento de evento Click del botón Guardar ubicación, y cree los procedimientos de evento Click para los restantes cinco botones.

Nota   El botón Guardar ubicación y su procedimiento de evento Click se describen en el tema Crear un cuadro de diálogo para obtener información del usuario y guardar los datos del hipervínculo en la tabla de hipervínculos.

e)	En la sección Encabezado del formulario, cree el cuadro de texto independiente txtVínculos, como se describe en Crear una animación para indicar que el control Explorador de Web está ocupado descargando datos.

3	En el módulo de clase WebExplorarWeb, cree el procedimiento ComprobarDirecciónURL, que se usa para activar los botones de comando Atrás y Adelante como resulte apropiado.


Procedimiento de evento AfterUpdate del control cuadro de texto txtVínculos

Private Sub txtVínculos_AfterUpdate()

On Error Resume Next

' Si el usuario introdujo una dirección (URL) en este control,

' intentar explorar esa dirección.

If Len(Me!txtVínculos) > 0 Then

Me!ControlActiveX1.Navigate Me!txtVínculos

End If

End Sub


Procedimiento ComprobarDirecciónURL

Sub ComprobarDirecciónURL()

' Este procedimiento se utiliza para asegurarse de

' que el botón Atrás sigue activado a menos que el

' usuario haya vuelto a la dirección URL inicial.

If gIndicadorAtrás = True And gPrimeraDirecciónURL <> Me!ControlActiveX1.LocationURL Then

Me!cmdAtrás.Enabled = True

Else

Me!ControlActiveX1.SetFocus

Me!cmdAtrás.Enabled = False

End If

End Sub


Procedimientos de evento Click de los botones de comando de la sección Encabezado del formulario WebExplorarWeb

Private Sub cmdPrincipal_Click()

On Error Resume Next

' Explorar la página principal.

Me.ControlActiveX1.GoHome

End Sub

Private Sub cmdAtrás_Click()

On Error Resume Next

' Explorar hacia atrás la dirección URL anterior.

Me.ControlActiveX1.GoBack

' Llamar al procedimiento que determina la forma de

' establecer la 	propiedad Enabled del botón Atrás.

ComprobarDirecciónURL

' Activar el botón Adelante.

gIndicadorAdelante = True

Me!cmdAdelante.Enabled = True

End Sub

Private Sub cmdAdelante_Click()

On Error Resume Next

' Explorar hacia adelante la dirección URL anterior.

Me.ControlActiveX1.GoForward

End Sub

Private Sub cmdActualizar_Click()

On Error Resume Next

' Obligar al control WebBrowser a volver a cargar la

' dirección URL actual.

Me.ControlActiveX1.Refresh

End Sub

Private Sub cmdBuscar_Click()

On Error Resume Next

' Explorar la página de búsqueda.

Me.ControlActiveX1.GoSearch

End Sub


Principales características del formulario SolucionesParaElProgramador

El formulario SolucionesParaElProgramador muestra cómo tener acceso a todos los ejemplos de la aplicación Soluciones para el programador. Las siguientes técnicas hacen que el formulario SolucionesParaElProgramador funcione:

•	Vinculando tablas al iniciar.

•	Abriendo un formulario o informe desde un formulario principal.

Una técnica que mejora el formulario es:

•	Cerrar todos los objetos de la base de datos al salir de la aplicación.


Vincular tablas al iniciar

Cuando use múltiples bases de datos para una aplicación, puede asegurarse de que la información de conexión de las tablas vinculadas se actualiza cuando se inicia la aplicación. Por ejemplo, cuando abre el formulario SolucionesParaElProgramador, se ejecuta un código que verifica los vínculos de las tablas de la base de datos de ejemplo Neptuno y los actualiza si es necesario.

Información general

Cree funciones que verifiquen los vínculos de las tablas externas y los restablezca si es necesario. Cree una función VolverAVincularTablas para buscar la base de datos Neptuno en la subcarpeta Ejemplos de la carpeta donde fue instalado Microsoft Access. Cree una función BuscarNeptuno para presentar el cuadro de diálogo Abrir si no se encuentra la base de datos Neptuno, de modo que el usuario pueda especificar la ubicación de la base de datos. Pida las funciones del procedimiento de evento Load del formulario SolucionesParaElProgramador.

Objetos usados en este ejemplo:

Objeto	Nombre
Formulario	SolucionesParaElProgramador
Módulo	módActualizarVínculosDeTablas
Paso a paso

1	Cree el módulo módActualizarVínculosDeTablas.

a)	Cree la función ComprobarVínculos.

b)	Cree la función VolverAVincularTablas.

c)	Cree la función ActualizarVínculos.

d)	Agregue código a la sección Declaraciones del módulo que permita el uso del cuadro de diálogo Abrir de Microsoft Windows para ubicar la base de datos de ejemplo Neptuno.

e)	Cree la función BuscarNeptuno.

f)	Cree la función MSA_CreateFilterString.

g)	Cree la función MSA_GetOpenFilename.

h)	Cree el procedimiento Sub MSAOF_to_OFF.

i)	Cree el procedimiento Sub OF_to_MSAOFF.

2	Establezca la propiedad AlCargar (OnLoad) del formulario SolucionesParaElProgramador a [Procedimiento de evento].

Referencias cruzadas

Si desea obtener más información sobre el siguiente tema, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Función ComprobarVínculos

Public Function ComprobarVínculos() As Boolean

' Comprobar los vínculos a la base de datos Neptuno.

' Devolver True si los vínculos son correctos.

Dim bd As Database, rst As Recordset

Set bd = CurrentDb

' Abrir la tabla vinculada para ver si la información

' de conexión es correcta.

On Error Resume Next

Set rst = bd.OpenRecordset("Productos")

' Si no se produce ningún error, devolver True.

If Err = 0 Then

ComprobarVínculos = True

Else

ComprobarVínculos = False

End If

End Function


Función VolverAVincularTablas

Public Function VolverAVincularTablas() As Boolean

' Intentar actualizar los vínculos a la base de datos Neptuno.

' Devolver True si no se produce ningún error.

Dim cadDirectorioAccess As String

Dim cadRutaBúsqueda As String

Dim cadNombreArchivo As String

Dim entError As Integer

Dim cadError As String

Const conTablasMáximas = 8

Const conTablaNoExistente = 3011

Const conNoEsNeptuno = 3078

Const conNeptunoNoEncontrada = 3024

Const conAccesoDenegado = 3051

Const conBaseDeDatosDeSóloLectura = 3027

Const conTítuloAplicación = "Soluciones para el programador"

' Obtener el nombre del directorio donde está ubicado

' MSAccess.exe.

cadDirectorioAccess = SysCmd(acSysCmdAccessDir)

' Obtener la ruta predeterminada de la base de datos de ejemplo.

If Dir(cadDirectorioAccess & "Ejemplos\.") = "" Then

cadRutaBúsqueda = cadDirectorioAccess

Else

cadRutaBúsqueda = cadDirectorioAccess & "Ejemplos\"

End If

' Buscar la base de datos Neptuno.

If (Dir(cadRutaBúsqueda & "Neptuno.mdb") <> "") Then

cadNombreArchivo = cadRutaBúsqueda & "Neptuno.mdb"

Else

' Imposible encontrar Neptuno, mostrar el cuadro de diálogo Abrir.

MsgBox "Imposible encontrar las tablas vinculadas de la base de datos Neptuno. Debe buscar Neptuno para poder utilizar " _

& conTítuloAplicación & ".", vbExclamation

cadNombreArchivo = BuscarNeptuno(cadRutaBúsqueda)

If cadNombreArchivo = "" Then

cadError = "Lo siento, debe buscar Neptuno para abrir " & conTítuloAplicación & "."

GoTo Salir_Falló

End If

End If

' Reparar los vínculos.

If ActualizarVínculos(cadNombreArchivo) Then

VolverAVincularTablas = True

Exit Function

End If

' Si falló, mostrar un error.

Select Case Err

Case conTablaNoExistente, conNoEsNeptuno

cadError = "El archivo '" & cadNombreArchivo & "' no contiene las tablas necesarias de Neptuno."

Case Err = conNeptunoNoEncontrada

cadError = "Imposible ejecutar " & conTítuloAplicación & " hasta que busque la base de datos Neptuno."

Case Err = conAccesoDenegado

cadError = "Imposible abrir " & cadNombreArchivo & " porque es de sólo lectura o está ubicada en un recurso compartido de sólo lectura."

Case Err = conBaseDeDatosDeSóloLectura

cadError = "Imposible volver a vincular las tablas porque " & conTítuloAplicación & " es de sólo lectura o está ubicada en un recurso compartido de sólo lectura."

Case Else

cadError = Err.Description

End Select

Salir_Falló:

MsgBox cadError, vbCritical

VolverAVincularTablas = False

End Function


Función ActualizarVínculos

Private Function ActualizarVínculos(cadNombreArchivo As String) As Boolean

' Actualizar los vínculos a la base de datos suministrada.

' Devolver True si no se produce ningún error.

Dim bd As Database

Dim tdf As TableDef

' Comprobar todas las tablas de la base de datos.

Set bd = CurrentDb

For Each tdf In bd.TableDefs

' Si la tabla tiene una cadena de conexión, es una tabla vinculada.

If Len(tdf.Connect) > 0 Then

tdf.Connect = ";DATABASE=" & cadNombreArchivo

Err = 0

On Error Resume Next

tdf.RefreshLink ' Volver a vincular la tabla.

If Err <> 0 Then

ActualizarVínculos = False

Exit Function

End If

End If

Next tdf

ActualizarVínculos = True' Vinculación terminada.

End Function


Sección Declaraciones del módulo módActualizarVínculosDeTablas

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'                 ActualizarTablaVínculos                      '

'                                                              '

' Este módulo contiene funciones que actualizan los vínculos   '

'    a las tablas de Neptuno cuando no están disponibles.      '

'                                                              '

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Option Explicit           ' Forzar la declaración de variables antes de utilizarlas.

Option Compare Database   ' Usar orden de la base de datos para las comparaciones de cadenas.

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _

    "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _

    "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

Type MSA_OPENFILENAME

    ' Cadena de filtro utilizada para los filtros Abrir cuadro de diálogo.

    ' Utilizar MSA_CreateFilterString() para crearlo.

    ' Valor predeterminado = Todos los archivos, *.*

    cadFiltro As String

    ' Filtro inicial a mostrar.

    ' Valor predeterminado = 1.

    lngÍndiceFiltro As Long

    ' Directorio inicial en el que se abre el cuadro de diálogo.

    ' Valor predeterminado = Directorio de trabajo actual.

    cadDirectorioInicial As String

    ' Nombre de archivo inicial para el cuadro de diálogo.

    ' Valor predeterminado = "".

    cadArchivoInicial As String

    cadTítuloDeCuadroDeDiálogo As String

    ' Extensión predeterminada a anexar al archivo si el usuario no especifica ninguna.

    ' Valor predeterminada = Valores del sistema (Abrir archivo, Guardar archivo).

    cadExtensiónPredeterminada As String

    ' Indicadores (ver lista de constantes) a utilizar.

    ' Valor predeterminado = sin indicadores.

    lngIndicadores As Long

    ' Ruta completa del archivo seleccionado. Cuando se muestra el cuadro de diálogo

    ' Abrir archivo, si el archivo selecciona un archivo que no existe,

    ' sólo se devuelve el texto del cuadro "Nombre de archivo".

    cadRutaCompletaDevuelta As String

    ' Nombre del archivo seleccionado.

    cadNombreDeArchivoDevuelto As String

    ' Posición dentro de la ruta completa (cadRutaCompletaDevuelta) donde

    ' comienza el nombre del archivo (cadNombreDeArchivoDevuelto).

    entPosiciónArchivo As Integer

    ' Posición dentro de la ruta completa (cadRutaCompletaDevuelta) donde

    ' comienza la extensión del archivo.

    entExtensiónArchivo As Integer

End Type

Const ALLFILES = "Todos los archivos"

Type OPENFILENAME

    lStructSize As Long

    hwndOwner As Long

    hInstance As Long

    lpstrFilter As String

    lpstrCustomFilter As Long

    nMaxCustrFilter As Long

    nFilterIndex As Long

    lpstrFile As String

    nMaxFile As Long

    lpstrFileTitle As String

    nMaxFileTitle As Long

    lpstrInitialDir As String

    lpstrTitle As String

    Flags As Long

    nFileOffset As Integer

    nFileExtension As Integer

    lpstrDefExt As String

    lCustrData As Long

    lpfnHook As Long

    lpTemplateName As Long

End Type

Const OFN_ALLOWMULTISELECT = &H200

Const OFN_CREATEPROMPT = &H2000

Const OFN_EXPLORER = &H80000

Const OFN_FILEMUSTEXIST = &H1000

Const OFN_HIDEREADONLY = &H4

Const OFN_NOCHANGEDIR = &H8

Const OFN_NODEREFERENCELINKS = &H100000

Const OFN_NONETWORKBUTTON = &H20000

Const OFN_NOREADONLYRETURN = &H8000

Const OFN_NOVALIDATE = &H100

Const OFN_OVERWRITEPROMPT = &H2

Const OFN_PATHMUSTEXIST = &H800

Const OFN_READONLY = &H1

Const OFN_SHOWHELP = &H10


Función BuscarNeptuno

Function BuscarNeptuno(cadRutaDeBúsqueda) As String

' Mostrar el cuadro de diálogo Abrir para que el usuario busque

' la base de datos Neptuno. Devolver la ruta completa de Neptuno.

Dim msaof As MSA_OPENFILENAME

' Establecer las opciones para el cuadro de diálogo.

msaof.cadTítuloDeCuadroDeDiálogo = "¿Dónde está Neptuno?"

msaof.cadDirectorioInicial = cadRutaDeBúsqueda

msaof.cadFiltro = MSA_CreateFilterString("Bases de datos", "*.mdb")

' Llamar a la rutina del cuadro de diálogo Abrir.

MSA_GetOpenFileName msaof

' Devolver la ruta de acceso y el nombre del archivo.

BuscarNeptuno = Trim(msaof.cadRutaCompletaDevuelta)

End Function


Función MSA_CreateFilterString

Function MSA_CreateFilterString(ParamArray varFilt() As Variant) As String

' Crear una cadena de filtro a partir de los argumentos pasados.

' Devolver "" si no se ha pasado ningún argumento.

' Esperar un número par de argumentos (nombre de filtro, extensión), pero

' si se pasa un número impar, anexar "*.*".

Dim cadFiltro As String

Dim entDev As Integer

Dim entNúm As Integer

entNúm = UBound(varFilt)

If (entNúm <> -1) Then

For entDev = 0 To entNúm

cadFiltro = cadFiltro & varFilt(entDev) & vbNullChar

Next

If entNúm Mod 2 = 0 Then

cadFiltro = cadFiltro & "*.*" & vbNullChar

End If

cadFiltro = cadFiltro & vbNullChar

Else

cadFiltro = ""

End If

MSA_CreateFilterString = cadFiltro

End Function


Función MSA_GetOpenFileName

Private Function MSA_GetOpenFileName(msaof As MSA_OPENFILENAME) As Integer

' Abrir el cuadro de diálogo Abrir.

Dim of As OPENFILENAME

Dim entDev As Integer

MSAOF_to_OF msaof, of

entDev = GetOpenFileName(of)

If entDev Then

OF_to_MSAOF of, msaof

End If

MSA_GetOpenFileName = entDev

End Function


Procedimiento Sub MSAOF_to_OF

Private Sub MSAOF_to_OF(msaof As MSA_OPENFILENAME, of As OPENFILENAME)

' Este subprocedimiento convierte la estructura de Microsoft Access

' a la estructura Win32.

Dim cadArchivo As String * 512

' Inciar algunas partes de la estructura.

of.hwndOwner = Application.hWndAccessApp

of.hInstance = 0

of.lpstrCustomFilter = 0

of.nMaxCustrFilter = 0

of.lpfnHook = 0

of.lpTemplateName = 0

of.lCustrData = 0

If msaof.cadFiltro = "" Then

of.lpstrFilter = MSA_CreateFilterString(ALLFILES)

Else

of.lpstrFilter = msaof.cadFiltro

End If

of.nFilterIndex = msaof.lngÍndiceFiltro

of.lpstrFile = msaof.cadArchivoInicial _

& String(512 - Len(msaof.cadArchivoInicial), 0)

of.nMaxFile = 511

of.lpstrFileTitle = String(512, 0)

of.nMaxFileTitle = 511

of.lpstrTitle = msaof.cadTítuloDeCuadroDeDiálogo

of.lpstrInitialDir = msaof.cadDirectorioInicial

of.lpstrDefExt = msaof.cadExtensiónPredeterminada

of.Flags = msaof.lngIndicadores

of.lStructSize = Len(of)

End Sub


Procedimiento Sub OF_to_MSAOF

Private Sub OF_to_MSAOF(of As OPENFILENAME, msaof As MSA_OPENFILENAME)

' Este subprocedimiento convierte la estructura Win32

' a la estructura de Microsoft Access.

msaof.cadRutaCompletaDevuelta = Left(of.lpstrFile, InStr(of.lpstrFile, vbNullChar) - 1)

msaof.cadNombreDeArchivoDevuelto = of.lpstrFileTitle

msaof.entPosiciónArchivo = of.nFileOffset

msaof.entExtensiónArchivo = of.nFileExtension

End Sub


Procedimiento de evento Load del formulario SolucionesParaElProgramador

Private Sub Form_Load()

' Comprobar los vínculos a las tablas de la

' base de datos Neptuno.

On Error GoTo Form_Load_Error

' Comprobar que Neptuno está disponible.

If ComprobarVínculos() = False Then

' Intentar volver a vincular las tablas; si falla,

' cerrar Soluciones para el programador.

If VolverAVincularTablas() = False Then

DoCmd.Close acForm, "Inicio"

CloseCurrentDatabase

End If

End If

Form_Load_Salir:

Exit Sub

Form_Load_Error:

MsgBox Err.Description

CloseCurrentDatabase

Resume Form_Load_Salir

End Sub


Abrir un formulario o informe desde un formulario principal

Si la aplicación dispone de varios formularios e informes, es posible que desee tener un formulario principal que los organice por tareas y tipos de trabajo. El formulario SolucionesParaElProgramador es el formulario principal de la aplicación de ejemplo Soluciones para el programador. Agrupa los ejemplos por categoría de desarrollo de aplicación.

Información general

Cree un formulario independiente. Cree un cuadro de lista que muestre las categorías y un segundo cuadro de lista que muestre los ejemplos que pertenezcan a la categoría seleccionada. Cree un botón de comando Aceptar que abra el formulario o informe de ejemplo seleccionado en el cuadro de lista de los ejemplos. Cree un botón de comando Salir que cierre la aplicación de ejemplo Soluciones para el programador.

Objetos usados en este ejemplo:

Objeto	Nombre
Tabla	ObjetosDeEjemplo, Ejemplos, TemasDeEjemplo
Consulta	ListaDeEjemplos, ListaDeTemasDeEjemplo
Formulario	SolucionesParaElProgramador
Paso a paso

1	Cree la consulta ListaDeTemasDeEjemplo.

Tabla	Campo	Mostrar
TemasDeEjemplo	IdTema Descripción Orden (Ascendente)	Sí Sí No
2	Cree la consulta ListaDeEjemplos.

a)	Use los campos de las siguientes tablas:

Tabla	Campo	Mostrar
Ejemplos	Descripción (Ascendente)	Sí
ObjetosDeEjemplo	NombreObjeto	Sí
ObjetosDeEjemplo	TipoObjeto	Sí
Ejemplos	IdTema	Sí
b)	En la celda Criterios del campo IdTema, escriba:

[Forms]![SolucionesParaElProgramador]![SeleccionarTema]

3	Diseñe el formulario SolucionesParaElProgramador.

a)	Cree un formulario independiente y establezca sus propiedades según se indica:

Propiedad	Valor
Título (Caption)	SolucionesParaElProgramador
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	Cree un cuadro de lista independiente y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	SeleccionarTema
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	ListaDeTemasDeEjemplo
NúmeroDeColumnas (ColumnCount)	2
AnchuraDeColumna (ColumnWidths)	0cm; 12,7cm
ColumnaDependiente (BoundColumn)	1
TextoDeLaBarraDeEstado (StatusBarText)	Seleccione una categoría de ejemplos.
DespuésDeActualizar (AfterUpdate)	[Procedimiento de evento]
c)	Cree otro cuadro de lista independiente y establezca sus propiedades como se expone a continuación:

Propiedad	Valor
Nombre (Name)	SeleccionarEjemplo
TipoDeOrigenDeLaFila (RowSourceType)	Tabla/Consulta
OrigenDeLaFila (RowSource)	ListaDeEjemplos
NúmeroDeColumnas (ColumnCount)	3
AnchuraDeColumna (ColumnWidths)	12,7cm ;0cm; 0cm
ColumnaDependiente (BoundColumn)	2
TextoDeLaBarraDeEstado (StatusBarText)	Seleccione un ejemplo
AlHacerDobleClic (OnDblClick)	[Procedimiento de evento]
d)	Cree un botón de comando, y establezca sus propiedades de la siguiente manera:

Propiedad	Valor
Nombre (Name)	Aceptar
Título (Caption)	&Aceptar
Predeterminado (Default)	Sí
TextoDeAyudaDelControl (ControlTipText)	Mostrar el formulario o informe para el ejemplo.
AlHacerClic (OnClick)	[Procedimiento de evento]
4	Cree la función ShowHelpAPI

Referencias cruzadas

Si desea obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con formularios	Capítulo 3, "Uso de formularios para recopilar, filtrar y presentar información"


Procedimiento de evento AfterUpdate del cuadro de lista SeleccionarTema

Private Sub SeleccionarTema_AfterUpdate()

' Volver a consultar el cuadro de lista SeleccionarEjemplo.

Me!SeleccionarEjemplo.Requery

End Sub


Función ShowHelpAPI

Introduzca el siguiente código en la sección Declaraciones de un nuevo módulo. A continuación, guarde el módulo con el nombre módUtilidadesDeBarraDeHerramientas.

Option Compare Database

Option Explicit

Private Declare Function WinHelp Lib "user32" Alias "WinHelpA" _

(ByVal hWnd As Long, ByVal lpHelpFile As String, _

ByVal wCommand As Long, ByVal dwData As Long) As Long

A continuación cree la función ShowHelpAPI en el módulo módUtilidadesDeBarraDeHerramientas.

Function ShowHelpAPI() As Boolean

' Este procedimiento lo utiliza el botón Muéstreme en varias barras de

' herramientas de Soluciones para el programador. Utiliza la función

' WinHelp de la API para que el botón Muéstreme de Ayuda proporcione

' Ayuda contextual sin importar el estado actual del objeto.

' Asegúrese de que el archivo de Ayuda está en el mismo

' directorio que la base de datos Soluciones para el programador.

Dim lnghWnd As Long, cadArchivoDeAyuda As String, lngContexto As Long

Dim lngValorDevuelto As Long, obj As Object

On Error Resume Next

Const conContextoDeAyuda = &H1

Set obj = Screen.ActiveForm

If Err = 2475 Then

' El objeto activo no es un formulario.

' Restablecer Err y probar si el objeto es un informe.

Err = 0

Set obj = Screen.ActiveReport

If Err = 2476 Then

' EL objeto activo no es un formulario ni un informe.

MsgBox "Seleccionar un formulario o un informe antes de pedir Ayuda."

ShowHelpAPI = False

Exit Function

End If

End If

With obj

' Obtener las propiedades hWnd, HelpFile y HelpContextID

' del objeto actual.

lnghWnd = .hWnd

cadArchivoDeAyuda = .HelpFile

lngContexto = .HelpContextId

End With

lngValorDevuelto = WinHelp(lnghWnd, cadArchivoDeAyuda, conContextoDeAyuda, lngContexto)

ShowHelpAPI = True

End Function


Procedimiento de evento DblClick del cuadro de lista SeleccionarEjemplo

Private Sub SeleccionarEjemplo_DblClic(Cancel As Integer)

' Ejecuta el procedimiento Aceptar_Clic.

Aceptar_Clic

End Sub


Procedimiento de evento Click del botón de comando Aceptar

Private Sub Aceptar_Click()

' Abrir el formulario o el informe del ejemplo seleccionado.

' Mostrar el tema Muéstreme si la casilla de verificación

' Muéstreme está seleccionada.

' Abrir el formulario del ejemplo seleccionado.

If Me!SeleccionarEjemplo.Column(2) = "Formulario" Then

' Usado por Soluciones para el programador para abrir

' el formulario y mostrar el tema Muéstreme.

DoCmd.OpenForm Me!SeleccionarEjemplo.Column(1)

If Me!Muéstreme = True Then

ShowHelpAPI

End If

' Abrir el informe del ejemplo seleccionado.

ElseIf Me!SeleccionarEjemplo.Column(2) = "Informe" Then

' Usado por Soluciones para el programador para abrir

' el informe y mostrar el tema Muéstreme.

DoCmd.OpenReport Forms!SolucionesParaElProgramador!SeleccionarEjemplo.Column(1), acViewPreview

If Me!Muéstreme = True Then

ShowHelpAPI

End If

' Usado por Soluciones para el programador para abrir el

' cuadro de diálogo para el informe VentasPorEmpleado.

ElseIf Me!SeleccionarEjemplo.Column(2) = "Diálogo" Then

DoCmd.OpenForm "CuadroDeDiálogoVentasPorEmpleado"

End If

End Sub


Cerrar todos los objetos de la base de datos al salir de una aplicación

Puede hacer que todos los objetos de una base de datos abierta se cierren automáticamente al salir de su aplicación. Si ha realizado algunos cambios a cualquier objeto, puede hacer que su aplicación le pregunte si desea guardar o no los cambios. Por ejemplo, cuando hace clic en Salir del formulario SolucionesParaElProgramador, este trata de cerrar todos los objetos abiertos. Si ha cambiado el diseño de un objeto, Microsoft Access le pregunta si desea guardar, descartar los cambios o cancelar. Si hace clic en Cancelar, el formulario SolucionesParaElProgramador presenta un mensaje en el que indica que debe guardar o descartar los cambios.

Información general

Cree una función que cierre cualquier objeto abierto. Agregue un botón de comando al formulario. Cree un procedimiento de evento en la propiedad AlHacerClic que cierre todos los tipos de objeto de la base de datos y después ésta.

Objetos usados en este ejemplo:

Objeto	Nombre
Formulario	SolucionesParaElProgramador
Módulo	MódUtilidadesDeSoluciones
Paso a paso

1	En la sección General del módulo MódUtilidadesDeSoluciones, cree la función CerrarObjeto.

2	Agregue un botón de comando al formulario SolucionesParaElProgramador y establezca sus propiedades de esta forma:

Propiedad	Valor
Nombre (Name)	Salir
Título (Caption)	&Salir
TextoDeAyudaDelControl (ControlTipText)	Salir de la aplicación Soluciones para el programador
AlHacerClic (OnClick)	[Procedimiento de evento]
Nota   El procedimiento de evento Click del botón de comando Salir no funciona cuando descarta los cambios del módulo. Cuando elija la opción de no guardar cambios en el módulo, Microsoft Access cierra la ventana Módulo pero detiene el procedimiento de evento Click del botón de comando Salir y debe cerrar la base de datos usted mismo.

Referencias cruzadas

Para obtener más información sobre los siguientes temas, consulte Creación de aplicaciones con Microsoft Access97.

Tema	Capítulo
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"
Trabajar con objetos	Capítulo 5, "Trabajo con objetos y colecciones"


Función CerrarObjeto

Public Function CerrarObjeto(cadNombreContenedor As String, entTipoContenedor As Integer)

' Cerrar objetos abiertos de la base de datos.

Dim bd As Database, ctr As Container

Dim entX As Integer

Set bd = CurrentDb

Set ctr = bd.Containers(cadNombreContenedor)

For entX = 0 To ctr.Documents.Count - 1

DoCmd.Close entTipoContenedor, ctr.Documents(entX).Name

Next entX

End Function


Procedimiento de evento Click del botón de comando Salir

Private Sub Salir_Click()

' Cerrar todos los objetos abiertos de la base

' de datos y salir de la aplicación.

' Activar la intercepción de errores.

On Error Resume Next

CerrarObjeto "Tablas", acTable

CerrarObjeto "Consultas", acQuery

CerrarObjeto "Formularios", acForm

CerrarObjeto "Informes", acReport

CerrarObjeto "Macros", acMacro

CerrarObjeto "Módulos", acModule

' Salir de la aplicación.

CloseCurrentDatabase

End Sub


Características más importantes del cuadro de diálogo AcercaDeSoluciones

El formulario AcercaDeSoluciones muestra cómo mostrar el nombre de una aplicación, la información de derechos de autor, y el logotipo en un cuadro de diálogo. Esta técnica hace que el formulario AcercaDeSoluciones funcione:

•	Creando un cuadro de dialogo Acerca de.


Creación de un cuadro de diálogo Acerca de

Se puede mostrar información acerca de la aplicación en un cuadro de diálogo que esté disponible desde una barra de menús personalizada. El cuadro de diálogo AcercaDeSoluciones está disponible en el menú Ayuda del formulario ModificarProductos.

Introducción

Cree un formulario independiente que muestre información acerca de su aplicación. Cree una macro que abra el cuadro de diálogo AcercaDeSoluciones.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	AcercaDeSoluciones
Macro	MostrarAcercaDeSoluciones
Paso a paso

1	Cree el formulario AcercaDeSoluciones.

a)	Establezca las siguientes propiedades del formulario.

Propiedad	Valor
Título (Caption)	Acerca de Soluciones para los programadores
PresentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
PermitirEdiciones (AllowEdits)	No
PermitirEliminación (AllowDeletions)	No
PermitirAgregar (AllowAdditions)	No
BarrasDeDesplazamiento (ScrollBars)	Ninguno
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
EstiloDeLosBordes (BorderStyle)	Diálogo
BotonesMinMax (MinMaxButtons)	Ninguno
MenúDeMétodoAbreviado (ShortcutMenu)	No
b)	En la sección de detalles, cree etiquetas que muestren el nombre de la aplicación, el número de versión, y la información de derechos de autor. Además, cree un marco de objeto independiente que muestre el logotipo de la aplicación.

c)	Cree un botón de comando. Establezca sus propiedades y cree la función CerrarFormulario del evento Click como sigue.

Propiedad	Valor
Nombre (Name)	Aceptar
Título (Caption)	Aceptar
TextoDeAyudaDelControl (ControlTipText)	cuadro de diálogo Cerrar acerca de Soluciones para los programadores.
AlHacerClic (OnClick)	=CerrarFormulario()
2	Cree la macro MostrarAcercaDeSoluciones, que abre el formulario AcercaDeSoluciones, y establezca los argumentos de la acción AbrirFormulario como sigue.

Argumento	Valor
Nombre del formulario Vista Modo de datos Modo de Ventana	AcercaDeSoluciones Formulario Sólo lectura Diálogo
3	Establezca la propiedad OnAction del comando Acerca de Soluciones para los programadores en la barra de herramientas BarraDeMenúsModificarProductos a la macro MostrarAcercaDeSoluciones, usando las técnicas descritas en Crear una barra de herramientas o una barra de menús personalizada. Para obtener información acerca de la creación de un menú personalizado, consulte Crear una barra de menús y un menú que sólo incluyan tareas de edición.

Sugerencia   La aplicación Soluciones para los programadores usa una barra de menús personalizada solamente para el formulario ModificarProductos; por tanto, el formulario AcercaDeSoluciones está disponible en el menú Ayuda sólo cuando el formulario ModificarProductos esté abierto en la vista Formulario. Si a lo largo de la aplicación utiliza barras de menús personalizadas, agregue la macro MostrarAcercaDeSoluciones a cada barra de herramientas personalizada de la aplicación.

Referencias cruzadas

Para obtener más información acerca del siguiente tema, consulte Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Creación de procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Función CerrarFormulario para el botón de comando Aceptar

Function CerrarFormulario() As Integer

' Cerrar el formulario.

DoCmd.Close

End Function


Características más importantes del formulario Inicio

El formulario Inicio muestra cómo mostrar automáticamente una pantalla de presentación durante unos cuantos segundos cuando se abre una aplicación. Esta técnica hace que el formulario Inicio funcione:

•	Creando un formulario Inicio.


Creación de un formulario Inicio

Cuando se inicia la aplicación, puede que desee mostrar su nombre, información de derechos de autor, y logotipo durante un tiempo breve. En la aplicación de muestra Soluciones para los programadores, el formulario Inicio se muestra durante varios segundos cuando se abre la base de datos.

Introducción

Cree un formulario independiente que muestre la información acerca de su aplicación. Cree un procedimiento de evento para la propiedad AlAbrir (OnOpen) para establecer la propiedad IntervaloDeCronómetro (TimerInterval) del formulario a un intervalo de tiempo (expresado en milisegundos). Cree un procedimiento de evento para la propiedad AlCronómetro (OnTimer) para cerrar el formulario. Establezca la opción Inicio que designa al formulario como el formulario Inicio.

Objetos usados en este ejemplo

Objeto	Nombre
Formulario	Inicio
Paso a paso

1	Cree el formulario Inicio.

a)	Establezca las siguientes propiedades del formulario.

Propiedad	Valor
PreentaciónPredeterminada (DefaultView)	Formulario simple
PresentacionesPermitidas (ViewsAllowed)	Formulario
BarrasDeDesplazamiento (ScrollBars)	Ninguna
SelectoresDeRegistro (RecordSelectors)	No
BotonesDeDesplazamiento (NavigationButtons)	No
CentradoAutomático (AutoCenter)	Sí
EstiloDeLosBordes (BorderStyle)	Ninguna
MenúDeMétodoAbreviado (ShortcutMenu)	No
AlAbrir (OnOpen)	[Procedimiento de evento]
AlCronómetro (OnTimer)	[Procedimiento de evento]
Nota   Para que pueda abrir el formulario Inicio y examinarlo en Soluciones para los programadores, establezca la propiedad IntervaloDeCronómetro (TimerInterval) a 5000 (milisegundos, o 5 segundos) en el procedimiento de evento de la propiedad AlAbrir (OnOpen) y restablézcala a 0 en el procedimiento de evento de la propiedad AlCronómetro (OnTimer).

b)	En la sección de detalles, cree etiquetas que muestren el nombre de la aplicación, el número de versión, y la información de derechos de autor. Además, cree un marco de objeto independiente que muestre el logotipo de la aplicación.

2	Agregue un botón de comando al formulario Inicio.

a)	Establezca las siguientes propiedades de control.

Propiedad	Valor
Nombre (Name)	cmdCerrarFormulario
Título (Caption)	&Cerrar
Visible	No
AlHacerClic (OnClick)	[Procedimiento de evento]
3	Establezca la propiedad FormularioDeInicio (StartupForm) al nombre del formulario.

a)	En la ventana Base de datos, haga clic en Inicio en el menú Herramientas.

b)	En el cuadro Mostrar formulario, escriba Inicio.

Referencias cruzadas

Para obtener más información acerca de los siguientes temas, consulte Creación de aplicaciones con Microsoft Access 97.

Tema	Capítulo
Establecer opciones de Inicio	Capítulo 1, "Creación de una aplicación "
Crear procedimientos de evento	Capítulo 2, "Introducción a Visual Basic"


Procedimiento de evento Open del formulario Inicio

Private Sub FORM_OPEN(CANCEL As Integer)

' Comprobar que las referencias al control Calendario

' y al control Microsoft Web Browser son válidas.

If EstáCargado("SolucionesParaElProgramador") Then

' Si está abierto el formulario principal

' Soluciones para el programador, entonces este

' formulario se abrió como un ejemplo y se debe

' mostrar el botón Cerrar.

cmdCerrarFormulario.Visible = True

Else

' Este formulario se abrió como el formulario de

' inicio de la aplicación, entonces se debe ocultar

' el botón Cerrar y establecer TimerInterval para

' cerrar el formulatio después de 5 segundos.

cmdCerrarFormulario.Visible = False

Me.TimerInterval = 5000

End If

End Sub


Procedimiento de evento Click del botón oculto Cerrar del formulario Inicio

Private Sub cmdCerrarFormulario_Click()

' Cerrar pantalla de presentación.

DoCmd.Close

End Sub


Procedimiento de evento Timer del formulario Inicio

El procedimiento de evento Timer del formulario Inicio se ejecuta una vez expire el valor de la propiedad IntervaloDeCronómetro (TimerInterval) establecida en el evento Load del formulario. Este procedimiento establece primero la propiedad IntervaloDeCronómetro (TimerInterval) a 0 para que el evento Timer no continúe ejecutándose mientras está cargado el formulario. Luego llama al procedimiento MostrarInicio para determinar qué formulario abrir a continuación.

Private Sub Form_Timer()

' Si la instrucción utilizada por Soluciones para

' el programador para restablecer la propiedad

' TimerInterval.

If Me.TimerInterval <> 0 Then

Me.TimerInterval = 0

End If

' Llamar al procedimiento MostrarInicio para

' determinar el valor de la propiedad

' personalizada DisplayStartupForm de la base de datos.

If MostrarInicio = True Then

DoCmd.OpenForm "IntroducciónASoluciones"

Else

DoCmd.OpenForm "SolucionesParaElProgramador", , , , acNormal

End If

DoCmd.Close acForm, "Inicio"

End Sub

Para crear el procedimiento de formulario MostrarInicio, pegue el siguiente código en la sección Declaraciones de un módulo estándar.

Function MostrarInicio() As Boolean

' Comprobar valor de propiedad de base de datos

' personalizada MostrarFormularioDeInicio.

' Si la propiedad no existe,

' crearla y establecerla a True (Sí).

On Error GoTo MostrarInicio_Error

Dim dbs As Database

Dim doc As Document

Dim prp As Property

Const conPropertyNotFound = 3270

Set dbs = CurrentDb

Set doc = dbs.Containers("Basesdedatos")!UserDefined

If doc.Properties!MostrarFormularioDeInicio = False Then

' Si usuario ha desactivado previamente el

' formulario IntroSoluciones,

' establecer valor de función a False.

MostrarInicio = False

Else

' En caso contrario, establecer valor a True.

MostrarInicio = True

End If

MostrarInicio_Exit:

Exit Function

MostrarInicio_Error:

' Crear propiedad MostrarFormularioDeInicio si no

' existe todavía.

If Err = conPropertyNotFound And CurrentDb().Updatable Then

Set prp = doc.CreateProperty("MostrarFormularioDeInicio", dbBoolean, True)

doc.Properties.Append prp

Err = 0

Resume

Else

' Ocurrió error desconocido.

MsgBox Err.Description, vbCritical

CloseCurrentDatabase

Resume MostrarInicio_Exit

End If

End Function