Anda di halaman 1dari 9

Cuando no existe una lnea de unin entre dos tablas en el diseo de una consulta, obtendremos el producto cartesiano de la filas

en los dos orgenes del registro. Para salir de un control SubFormulario, se debe mantener presionada la tecla Control, mientras se pulsa la tecla Tab. Permitir Cadenas de Longitud cero pero no valores Nulos Si deseamos permitir cadenas de longitud cero, pero no valores nulos, configuraremos las propiedades del campo deseado como se muestra a continuacin. Valor Predeterminado: Requerido: S Permitir longitud cero: S Mostrar valores numricos con dos decimales, aunque se guarden ms Formato: #.###,## Lugares Decimales: 2 Suma de Horas en Campos de Fecha/Hora Si disponemos de un campo de Fecha/Hora que almacena horas, por ejemplo n de horas de conduccin, y deseamos realizar una consulta que nos devuelva la suma de las horas de conduccin, utilizaremos una expresin como la siguiente: Sum(Hour(CampoHoras)+(Minute(CampoHoras)/60)) Cumplimentacin de Datos relacionados Como ocurre en SQL Server 2000, podemos crear ndices nicos y claves primarias, cuya nica diferencia radica en que un ndice nico puede ignorar valores los nulos. Sin embargo, una clave externa puede referenciar tanto a una clave primaria como a un ndice nico. En muchos casos, nos encontramos con tablas relacionadas, como pueda ser el caso de CLIENTES y PEDIDOS. As puede ser deseable que en el formulario de pedidos, al seleccionar el cliente (en un combo) se rellene automticamente todos los datos necesarios de ste. Para hacer que esto funcione, realizaremos una consulta que contenga todos los campos de la tabla CLIENTES y todos de la tabla PEDIDOS. Esta consulta, permite editar los datos de la parte varios (PEDIDOS) de la relacin, mientras que se muestran los datos de la parte uno (CLIENTES). Crearemos un formulario a partir de esta consulta, mostrando nicamente los datos que nos interesen de la tabla pedidos. Seguidamente, basta con aadir un cdigo de evento AfterUpdate en el ComboBox del Cliente, tal como se muestra en el siguiente ejemplo:
Private Sub IdCliente_BeforeUpdate(Cancel As Integer) Me!Ciudad = Me!cociudad End Sub

Ntese, que para realizar este ejemplo, no necesitaremos incluir los campos de la parte uno en el formulario. Ajuste de una Mscara en funcin del valor de otro Campo En muchos casos, puede ser necesario la entrada o no de un campo (o la mscara a aplicar a dicho campo) en funcin del valor de otro. Este puede ser el caso de las Formas de Pago. Si se paga en efectivo no se necesita ningn otro dato, mientras que

si se paga con VISA o MASTERD CARD esperaremos un formato distinto de tarjeta de crdito. Para solucionar este ejemplo, programaremos el evento AfterUpdate del ComboBox de Forma de Pago, para que muestre u oculte el campo de N Tarjeta as como para que aplique la correspondiente mscara de entrada en funcin del tipo de tarjeta especificada. As se muestra a continuacin:
Private Sub PayBy_AfterUpdate() Select Case Me!PayBy Case 1, 2 Me!CCNumber = Null Me!CCNumber.Visible = False Case 3 Me!CCNumber.Visible = True Me!CCNumber.InputMask = "0000\-000000\-00000;0;_" Case Else Me!CCNumber.Visible = True Me!CCNumber.InputMask = "0000\-0000\-0000\-0000;0;_" End Select End Sub

Tratamiento del Evento NotInList Cuando trabajamos con formularios de datos, en los que existe un ComboBox que nos permite seleccionar un valor de una tabla relacionada, puede ocurrir que el valor que deseamos seleccionar no se encuentre actualmente en dicha tabla, y que lo deseemos dar de alta automticamente para ahorrar tiempo. Este podra se el caso de un cliente o un producto en un formulario de pedidos. Para conseguir esto, utilizaremos el evento NotInList del ComboBox, que precisa que la propiedad LimitToList se encuentra al valor True. Este evento se dispara al intentar pasar a otro control o guardar el registro, ocurriendo despus de todos los eventos Change. En el siguiente ejemplo se ve como en caso de no existir el cliente se pregunta al usuario si desea aadirlo a base de datos, abriendo el formulario de clientes en modo Modal con los datos de Nombre y Apellido rellenos.
Private Sub ClienteID_NotInList(NewData As String, Response As Integer) intReturn = MsgBox("Cliente " & strCli & " is not in the system." & _ "Do you want to add this author?", _ vbQuestion + vbYesNo, "Microsoft Press") If intReturn = vbYes Then DoCmd.OpenForm FormName:="frmClienteAdd", DataMode:=acAdd, _ WindowMode:=acDialog, OpenArgs:=strCli If IsNull(DLookup("ClienteID", "tblClientes", "[LastName] = """ & strLast & """")) Then Response = acDataErrContinue Else Response = acDataErrAdded End If Exit Sub End If Response = acDataErrDisplay End Sub

Ajustar el tamao de una ventana Formulario Para modificar el tamao de la ventana Formulario de forma que se ajuste a los lmites del diseo del formulario, selecciones la orden Ajustar al formulario en el men Ventana. Intercambio de informacin entre Formularios En algunas ocasiones puede ser de utilidad poder disponer de un formulario con uno o varios subformularios. As, podemos acceder a las propiedades del formulario padre a travs de la propiedad Parent del subformulario, pudiendo utilizar las sentencias de tratamiento de errores para controlar si se ejecuta cdigo cuando el formulario se ejecuta independientemente. Del mismo modo, puede resultar til utilizar formularios modales para mostrar datos relacionados. En este caso, podemos utilizar el objeto DoCmd para abrir y cerrar formularios. A continuacin se puede acceder a los controles de cualquier formulario a travs de la coleccin Forms, pudiendo utilizar sentencias de tratamiento de errores para aquellos casos en que el formulario deseado no est abierto, y otras situaciones. Seleccin de Controles en Diseo Para seleccionar un conjunto de controles que se encuentran alineados horizontal o verticalmente, basta con hacer clic sobre la regla horizontal o vertical, a la altura de uno de ellos, y quedarn todos seleccionados, sin necesidad de seleccionarlos uno a uno. Tambin puede seleccionar varios controles, seleccionando con el ratn un determinado rea del formulario. Elija la orden Opciones del men Herramientas y seleccione la ficha Formularios/Informes. Cuando seleccione la opcin Parcialmente encuadrada, para seleccionar un control slo necesitar que el cuadro de seleccin toque cualquier parte del control. Si elige Totalmente encuadrada, el cuadro de seleccin deber contener todo el control para que ste sea seleccionado. Cambiar el Tamao de Controles en Diseo Para ajustar el tamao al contenido de cualquier control o etiqueta, en funcin del tipo de letra del mismo, basta hacer doble-clic sobre cualquiera de sus ajustadores de tamao. Podemos seleccionar un objeto, de manera que pulsando Shift y utilizando los cursores, podemos variar su tamao de una manera sencilla y ms exacta que con el uso del ratn. Adems, pulsando Ctrl. y los cursores variaremos su posicin. Podemos seleccionar varios, y despus utilizar las opciones de los mens contextuales Alinear y Tamao (tambin disponibles desde men Formato). Para mover objetos en diseo mediante el teclado, pulsaremos control a la vez que utilizamos los cursores para desplazarnos por el documento, ya sea un informe, formulario, etc. Establecer el Orden de Tabulacin Si desea cambiar el orden de tabulacin, elija Orden de tabulacin del men Ver, y reorganice los controles como desee. Pulse el botn Orden automtico para reorganizar los controles de modo que el orden de tabulacin corresponda con la disposicin de los controles en el formulario.

Tambin puede establecer el orden de tabulacin de un control individual cambiando el valor de la propiedad del control Indice de tabulacin. As mismo, si no deseamos que un control forme parte del orden de tabulacin, estableceremos a No su propiedad Punto de tabulacin. Funciones de utilidad General Existen varias funciones que nos pueden ayudar en el desarrollo tanto de cdigo VBA como de consultas, como son: Nz(Value,[ValueIfNull]). Si el valor pasado como primer parmetro es nulo, devuelve el valor pasado como segundo parmetro, de lo contrario devuelve el valor original. Switch(exp1,valor1[,exp2,valor2...[expn,valorn]]). Evala una lista de expresiones y devuelve un valor Variant o una expresin asociada a la primera instruccin de la lista que da como resultado True. Iif(exp,ValorSiCierto,ValorSiFalso). Devuelve uno de entre dos valores, dependiendo de la evaluacin de una expresin. Choose(indice,valo1[,valor2,...[,valorn]]). Devuelve un valor de la lista de opciones dependiendo del valor del ndice. Si ndice es 1 devuelve el primer valor, si el 2 el segundo, y as sucesivamente. Devuelve nulo si el ndice es menor que uno o mayor que el nmero de elementos en la lista. Format(exp[,formato[,primerdiasemana[,primerdiaao]]]) . Devuelve una cadena que contiene una expresin formateada de acuerdo a los criterios establecidos. Formatea nmeros, fechas, horas, y cadenas. DlookUp(exp,dominio,[criterio]). Permite obtener el valor de una campo o expresin (exp) a partir de una tabla o consulta (dominio) segn un criterio establecido. Si no se encuentra dicho valor, se devuelve NULL, por lo que es til combinar esta funcin con la funcin NZ(). Ejemplo:
lngUsuario_ID = Nz(DLookup("USUARIO_ID", "USUARIOS", "USUARIO='" & txtUsuario & "' AND USUARIO_PASSWORD='" & txtPassword & "'"), 0)

SendKeys string[, wait].Enva una o ms pulsaciones de teclas a la ventana activa, como si se hubieran presionado desde el teclado. Para ver como enviar teclas especiales como Intro, Tab, etc. ver la ayuda de VBA. En ocasiones se utiliza la funcin Shell para abrir una aplicacin, y seguidamente se envan pulsaciones de teclas a esta. AppActivate title[, wait]. Cambia el enfoque a la aplicacin o ventana especificada. Se utiliza la funcin Shell para iniciar una aplicacin y establecer el estilo de la ventana.Para determinar qu aplicacin se va a activar, se compara title con la cadena de ttulo de cada aplicacin que hay en ejecucin. Si hay ms de una instancia de la aplicacin cuyo nombre es title, se activa cualquiera de ellas, de forma arbitraria. Shell(pathname[,windowstyle]). Ejecuta un programa ejecutable y devuelve un tipo Variant (Double) que representa la identificacin de la tarea del programa si se ha ejecutado con xito, en caso contrario devuelve cero. La funcin Shell ejecuta otros programas de forma asncrona.

Utilizacin de Informes Podemos definir hasta un mximo de 10 criterios de agrupacin, as como encabezados y pies independientes para cada grupo, mediante la ventana Ordenar y Agrupar. Podemos agrupar por un campo o introducir una expresin (empezaremos por el signo =, como es lgico). Podemos definir un encabezado y pie para todo el informe (adems de los de pgina).

Podemos utilizar objetos de imagen independientes y objetos de imagen dependientes. Podemos utilizar asistentes para la creacin rpida de informes. El botn Opciones de resumen, nos permite especificar que valores resumen deseamos que aparezcan en los pies de grupo. Podemos establecer a True la propiedad Ocultar Replicados de un control de la seccin Detalle para evitar que aparezca repetido si mantiene el mismo valor durante varios registros consecutivos. Podemos incluir subinformes en la seccin de Detalle de un informe para visualizar varias lneas procedentes de una tabla o consulta que posea una relacin varios respecto a la lnea actualmente impresa en la seccin Detalle. Utilizar informes con subinformes en cascada, puede producir problemas. Los informes de Access no puede superar los 56x56cm en diseo POR SECCION. Esto se puede solucionar utilizando subinformes, para as ahorrar espacio en el informe principal. Una manera podra se realizar un subinforme para cada pgina, y un informe que enlace todos estos subinformes como un nico objeto. Cuando necesitamos informes con los cuales podamos interactuar, la solucin es claramente usar un formulario, en el cual podremos utilizar la vista previa e imprimir, y a la vez utilizar los distintos campos (cajas de texto, combos, etc.) y sus eventos para permitir realizar un informe ms dinmico. Esta tcnica la utilizan muchos programadores y da mucha agilidad al desarrollo de una manera sencilla y profesional. Una caracterstica de la cual no disponen los informes es la de Agrupar. Sin embargo, puede utilizarse subformularios o subinformes en vez de secciones.

Utilizacin de Frmulas Podemos utilizar frmulas para personalizar nuestros informes y tambin nuestros formularios, mediante valores calculados. Para ello, estableceremos el valor de la propiedad Origen del Control del control deseado a la expresin que necesitemos utilizar, empezando por el signo igual =. Una frmula tpica es =Pgina & [Pgina] & de & [Pginas] . Tambin suele utilizarse las funciones Fecha() (devuelve fecha actual) y Ahora() (devuelve fecha y hora actual) para mostrar la fecha de impresin. Podemos utilizar frmulas con funciones de grupo en los pies de las secciones para mostrar totales. Suma y Sigue. Access permite crear totales continuos dentro de la seccin de detalle. Puede establecer la propiedad Suma continua para cualquier cuadro de texto que visualice un valor numrico de modo que as pueda producir un total que sea inicializado al principio de cada grupo o que contine hallando el total del informe completo. Se puede establecer a No, Sobre grupo, o Sobre todo. Para generar un nmero de lnea para cada fila de la seccin Detalle, inserte un pequeo cuadro de texto con la propiedad Origen de control establecida a =1, y a continuacin establezca la propiedad Suma Continua. Clculo de Porcentajes. Estableceremos la propiedad Formato del control a Porcentaje, y a continuacin estableceremos la propiedad Origen del Control a la expresin formada por la divisin de la cantidad individual por la total. En esta expresin, podemos utilizar el nombre de otro control que contenga el total o subtotal deseado para realizar el clculo.

Formas de Agrupacin en Informes Para agrupar campos de texto, podemos indicar a Microsoft Access que comience un nuevo grupo cuando se produzca un cambio en el valor de uno o ms caracteres al comienzo de la cadena. Establezca a Primeros caracteres la propiedad Agrupar en, y establezca la propiedad Intervalo del grupo al nmero deseado de caracteres de comienzo de la cadena que diferenciar cada grupo. Para agrupar campos numricos, podemos establecer la propiedad Agrupar en a Intervalo, e introducir un ajuste para la propiedad para la propiedad Intervalo del grupo. Por ejemplo, si selecciona 10 veremos grupos para los valores comprendidos entre 0 y 9, 10 y 19, etc. Para agrupar campos de fecha/hora, podemos establecer la propiedad Agrupar en con subdivisiones de fecha u hora y mltiplos de estas, tales como ao, trimestre, mes, semana, da, hora y minuto. Si desea realizar la agrupacin basndose en un mltiplo de la subdivisin, incluya un parmetro en la propiedad Intervalo del grupo. Propiedades interesantes de Seccin Forzar nueva pgina. Establezca esta propiedad a Antes de la seccin para obligar a que se imprima esta seccin al principio de una nueva pgina. Establezca esta propiedad a Despus de la seccin para obligar a que la siguiente seccin se imprima al principio de una nueva pgina. Nueva fila o columna. Esta propiedad es til para obligar a que los encabezados se impriman de nuevo al principio de cada columna en un informe de varias columnas. Autoextensible. Esta propiedad permite que la seccin se extienda para acomodar los controles que podran ampliarse (como campos memo). Autocomprimible. Esta propiedad permite que la seccin sea ms pequea en caso de que los controles de esta seccin ocupasen un tamao menor. Al dar formato. Introduzca el nombre de una macro o un procedimiento en VBA que desee que Access ejecute cuando ste empiece a dar formato a esta seccin. Al imprimir. Introduzca el nombre de una macro o un procedimiento en VBA que desee que Access ejecute cuando ste comienza la impresin de esta seccin o cuando se visualiza la seccin en Vista preliminar. Controlar que no hay Registros en un Informe Puede resultar interesante en alguna ocasin, controlar la existencia de registros en un informe, de tal modo que si no existen registros a mostrar, se cancele dicho informe y se muestre un mensaje informativo de esta situacin. Para conseguir este efecto, realizaremos lo siguiente: En el evento NoData del informe, introduciremos una sentencia MsgBox con el texto que deseemos mostrar al usuario cuando no hay registros, y seguidamente asignaremos Cancel=1. En el trozo de cdigo que llama al informe (ej: evento OnClick de un formulario), utilizar la sentencia On Error Resume Next para controlar el error que se produce al cerrar un informe que se est abriendo. Objetos Importantes de Access 2000 Application. DoCmd. CurrentDB.

Acceso a controles entre Formularios y Subformularios Si desde un formulario deseamos acceder a un control de otro formulario, lo haremos como en el siguiente ejemplo: Forms!Formulario!Campo.Visible Si desde un formulario deseamos acceder a un control de un subformulario, lo haremos como en el siguiente ejemplo: Forms!FormularioPadre!FormularioHijo.Form!Campo.Visible Enlace de Access con Word Podemos enlazar nuestra aplicacin Access con Word, Excell, etc, mediante cdigo VBA, de manera que se puedan realizar tareas como crear y rellenar automticamente una Hoja de Clculo con informacin de una consulta, etc. En cualquier caso, deberemos crearnos un objeto aplicacin (Word.Application, Excell.Application, etc.) a partir del que trabajaremos. Para saber que cdigo escribir, adems de apoyarnos en la Ayuda de Office, podemos realizar una macro que repita tareas que deseamos hacer. Al Modificar la macro, se muestra una ventana con el cdigo VBA generado automticamente por el propio Office, y que con pocas modificaciones podr ser totalmente reutilizado por nosotros.
'*** As nos declaramos creamos un objeto Word con la sentencia Dim*** '*** Se requiere una referencia en el proyuecto *** Dim miWord As New Word.Application '*** As nos declaramos un Variant, y le asignamos un nuevo objeto Word *** Dim miWord As Variant Set miWord = CreateObject("Word.Application") miWord.Visible = True miWord.Documents.Add '*** As aadimos un documento Nuevo *** miWord.Documents.Open "c:\prueba.doc" '*** As abrimos un documento existente *** miWord.ActiveDocument.Save '*** As guardamos un documento *** miWord.ActiveDocument.SaveAs "c:\prueba.doc" '*** As 'guardamos como' un documento *** '*** Liberar Memoria *** miWord.Quit Set miWord = Nothing

Enviar una Tabla/Informe/Formulario por FAX o email Para enviar por FAX una Tabla/Informe/Formulario necesita un FAX/MODEM, el cliente de correo electrnico de Microsoft Exchange/Outlook y Microsoft Fax o el WinFax Pro de Symantec.
DoCmd.SendObject acReport, "rptOrdersFax", acFormatRTF, _ "[fax: " & FaxNumber & "]", , , , , False

Para enviar por correo electrnico una Tabla/Informe/Formulario, necesita el cliente de correo electrnico de Microsoft Exchange/Outlook, para as poder utilizar el mtodo DoCmd.SendObject. En este caso utilizaremos el formato HTML, o bien el formato SnapShop. Este ltimo produce un mejor resultado, pero est condicionado a tener

instalado el SnapShop Viewer, mientras que el formato HTML puede ser suficiente para una gran mayora de los casos posibles.
DoCmd.SendObject acReport, "rptOrdersEmail", acFormatHTML, "" & EmailSet![Email] & "", , , _ "Order Notice", _ Chr$(13) & Chr$(10) & "Dear" & " " & EmailSet![CompanyName] & Chr$(13) & _ Chr$(10) & Chr$(13) & Chr$(10) & EmailMsgSet![Email_Msg_Body], _ False

Exportar una Tabla/Informe/Formulario a un fichero Para esto utilizaremos el mtodo DoCmd.OutputTo, eligiendo un formato adecuado, al igual que en los casos anteriores. DoCmd.OutputTo acOutputTable, "Employees", acFormatRTF, "Employee.rtf", True Mostrar campos SI/NO de uno u otro color Para poner los campos tipo si/no de un color u otro hay un pequeo truco muy sencillo. Escoge la tabla que contenga el/los campos si/no y abre la ventana de diseo. En el campo si/no que quieras hacer ese efecto, ves a la casilla "Formato" En el caso de que fuera un campo que controlara facturas emitidas/no emitidas, escribe, por ejemplo ;"Facturado"[Azul];"Pendiente"[Rojo] Dale a aceptar y abre la tabla o el formulario continuo a ver si es eso lo que buscas. Establecer Combos en Cascada Dados dos combos, basta disponer el siguiente cdigo para el combo principal (padre en la relacin);
Private Sub Territorial_ID_BeforeUpdate(Cancel As Integer) Club_ID.RowSource = "SELECT [Clave del Club], Club "FROM Clubes " & _ "WHERE [Clave del Club] like '" & Territorial_ID & "*' ORDER BY Club " End Sub

Actualizar los datos de un Combo Si en un formulario deseamos actualizar los datos de un combo, por ejemplo por que se han aadido registros en la tabla origen, utilizaremos la siguiente lnea de cdigo:
Combo1.Requery

Obtener el ltimo da de un mes Para ello basta con restarle uno al primer da del mes siguiente. Tambin, el da cero del mes siguiente, devolver el ltimo da del mes actual. Inicio de Sesin en aplicaciones Access Para obligar a autenticarse a nuestros usuarios sin utilizar los usuarios y permisos de Microsoft Access, podemos hacer lo siguiente: Crear una tabla de usuarios. Crear un formulario de Inicio de Sesin, con dos cajas de texto (para usuario y password) y dos botones (aceptar y cancelar). El botn cancelar cerrar el formulario y el botn aceptar comprobar contra la tabla de usuarios las credenciales suministradas. Sin son certeras, guardaremos el ID del usuario en una variable global declarada en un mdulo. El cdigo del botn aceptar sera como el que sigue:
'*** lngUsuario_ID: Variable Global. Si vale 0, no se ha iniciado sesin. *** lngUsuario_ID = Nz(DLookup("USUARIO_ID", "USUARIOS", "USUARIO='" & txtUsuario & _ "' AND USUARIO_PASSWORD='" & txtPassword & "'"), 0) If lngUsuario_ID = 0 Then MsgBox "El usuario y contrasea que ha introducido son incorrectos." & vbCr & vbLf & _

"Compruebe sus datos e intntelo de nuevo.", vbInformation + vbOKOnly Else DoCmd.Close acForm, Me.Name DoCmd.OpenForm "frmMenuPrincipal" End If

Ahora, slo queda comprobar en cada formulario, si la variable global que contiene el ID del usuario contiene un valor igual o distinto de cero, y hacer lo que sea pertinente. Esto puede realizarse escribiendo el siguiente cdigo en el evento OnLoad de cada formulario:
If lngUsuario_ID = 0 Then MsgBox "Debe iniciar sesin antes de poder acceder a esta pantalla.", vbInformation + vbOKOnly DoCmd.Close acForm, Me.Name DoCmd.OpenForm "frmLogon" End If

Campos Cdigo y Descripcin al estilo ORACLE FORMS Cuando en una tabla se almacenan cdigos cuya descripcin se encuentra en otra tabla aparte, se disponen dos maneras de afrontar este problema: utilizar un ComboBox, o bien utilizar una caja de texto que muestre el cdigo y otra que muestre la descripcin. La primera es trivial, ya que se abordara mediante las propiedades de bsqueda, mientras que para la segunda tenemos dos formas: Utilizar un formulario sobre una tabla . El campo de descripcin, debe utilizarse como un frmula. Utilizar un formulario sobre una vista. Como conocer las variables de Entorno del Sistema Operativo Basta con utilizar la funcin ENVIRON (). Proyectos ADP (Access contra SQL Server) Podemos migrar una aplicacin Access a SQL Server, mediante el Asistente para convertir a SQL Server, disponible desde la carpeta Utilidades de la base de datos del men Herramientas. El asistente nos permitir: Elegir si deseamos crear un nuevo MDB, o migrar el MDB existente. Seleccionar el servidor SQL Server dnde crear la nueva base de datos, y el nombre de esta. Seleccionar las tablas que deseamos migrar a SQL Server (habitualmente todas). El tiempo que tarda en realizarse todo el proceso es considerable. Una base de datos que recin compactada ocupa 6MB, puede tardar sobre 20 minutos. Hay que tener en cuenta algunas peculiaridades: El asistente slo es capaz de pasar las consultas sencillas de Seleccin, por lo que no se pasan consultas de insercin, actualizacin, etc. En el nuevo fichero ADP, no disponemos de la propiedad de Bsqueda en los campos de las tablas, lo que complica el desarrollo en comparacin con Access nativo. Para disponer de esta caracterstica, deberemos utilizar Access 2002.