Está en la página 1de 17

Creacin de Aplicaciones multiusuario 1

Ejecucin de Access en red


La primera decisin a que tenemos que enfrentarnos cuando creamos una aplicacin multiusuario de Access es dnde poner los archivos de la Base de Datos. Podemos elegir instalar de dos formas: 1. Instalar la Base de Datos completa de Access en el servidor, lo que permite a todos los usuarios ejecutar Access desde su estacin de trabajo hacia el servidor. 2. Instalar la aplicacin de Access con tablas vinculadas en cada estacin de trabajo y compartir solamente los datos de la Base de Datos entre los usuarios de la red. Instalacin de la aplicacin en el servidor Muchos programadores noveles en las aplicaciones de Access en red eligen instalar Access Access en el servidor, como se indica en la primera opcin. La ejecucin de Access en el servidor tiene las ventajas siguientes: Se emplea poco espacio o ninguno en las estaciones de trabajo. El software se actualiza fcilmente, porque solamente es preciso actualizar un conjunto de archivos.

Aunque sta es la solucin ms fcil, no es la mejor. Durante la ejecucin de Access se producen numerosos accesos al servidor de red. Cuando todos los archivos estn situados en el servidor de red, ste acceso constante degrada el rendimiento de la red y ralentiza la aplicacin de forma significativa. Sin contar con otros problemas habituales de bloqueo de la aplicacin por un uso inadecuado del bloqueo de registros. Instalacin de Access en cada estacin de trabajo Para solucionar ste problema de rendimiento en la ejecucin de Access en red, se puede ejecutar localmente en cada estacin de trabajo, accediendo solamente a los datos compartidos que se almacenan en una Base de Datos en el servidor que contiene solamente las tablas de la Aplicacin. Dado que la conexin de red se emplea nicamente para la transmisin de datos y no para cargar y ejecutar Access, el funcionamiento general de la Aplicacin es mucho ms rpido, ms seguro, y sin duda alguna, la forma correcta de instalar la Aplicacin en red. La nica desventaja real de sta forma de instalacin es el incremento en el tiempo de mantenimiento. An as, hay formas de realizarlo que resultan extremadamente sencillas, como ms adelante se indicar. Para realizar la instalacin de Access de sta forma siguientes procesos: se deben llevar a cabo los

1. Dividir la Base de Datos mediante el asistente de Access, de forma que en una Base de Datos Back End - quedarn las tablas, y en la otra Front End - el resto, con las consultas, formularios, informes etc. 2. Instalar el Backend , la parte de las tablas en el servidor de la red 3. Instalar el Frontend en una de las estaciones de trabajo. Con el asistente para administrar las tablas vinculadas apuntar cuando salga el buscador hacia el Frontend instalado en el servidor.

4. Hacer una copia de ste Frontend, que ya tiene las tablas bien vinculadas, e instalar en cada estacin de trabajo. Mi hbito personal es renombrar luego cada Frontend para evitar cualquier conflicto de nombres, por ejemplo, MiBase1, MiBase2, etc. Una vez realizados todos los pasos, tenemos ya lista la aplicacin para trabajar desde cada puesto de trabajo, con la ventaja de que por la red solamente circularn los datos almacenados en la aplicacin. Dividir la Base de Datos Para poder instalar Access a nivel de estaciones de trabajo tenemos que empezar por dividir las tablas donde se almacenan los datos, de todos los dems objetos de la Base de Datos, de forma que obtengamos dos Bases de Datos para la Aplicacin.

DISEO

TABLAS

Consultas Formularios Macros Informes Mdulos

Vinculos con Tablas Tablas

Divisin de los objetos en dos Bases de Datos

Al tener en cada estacin de trabajo la parte de formularios, informes, etc, el rendimiento es muy superior a la primera opcin que hemos sealado. Imaginemos abrir un formulario complejo, cuyo diseo tuviramos que pasarlo a travs de la red para cada estacin de trabajo. En poco tiempo, la capacidad de trfico de la red se podra ver colapsada. De sta segunda manera, los formularios estn en cada estacin de trabajo, por lo que su apertura es prcticamente instantnea. Una vez dividida la Base de Datos, el propio asistente genera la vinculacin de las tablas. Pero como normalmente la divisin la realizamos en el puesto de trabajo del programador de la aplicacin, cuando pongamos la base de datos de las tablas en el servidor, el Frontend tendr un vnculo a las tablas que no es el actual. Para ello, en la Barra de mens de Access, en Herramientas > Administrador de tablas vinculadas tenemos un asistente que nos permite buscar la ubicacin actual del backend de las tablas y actualizar los vnculos. En este punto hay que sealar que la divisin de una base de datos no es solo conveniente por una cuestin de trfico de red, sino necesario cuando estamos desarrollando la aplicacin para poder actualizar los cambios en el diseo de consultas, formularios, informes, cdigo VBA, etc. Si no hemos dividido la Base de Datos y el cliente nos solicita algunos cambios, qu vamos a hacer si ya est introduciendo datos? Si hemos dividido previamente la base de datos, la parte de las tablas seguir siendo la misma, y podremos cambiar cualquier parte de diseo, simplemente cambiando el frontend de cada estacin de trabajo por el Frontend con las nuevas modificaciones. Eso s, en todo momento vigilando que la vinculacin de las tablas sea la correcta.

Actualizacin de vnculos de las tablas Con independencia de qu mtodo utilicemos para vincular tablas, ya sea mediante el asistente de Access o mediante cdigo VBA, es preciso capacitar a nuestra aplicacin para reparar los vnculos rotas, si no queremos acudir a repararlos personalmente cada vez que un usuario o el administrador de la red mueva la carpeta que contiene la base de datos o cambie el nombre. La forma manual de vincular tablas mediante el asistente de Access ya la hemos explicado. Existe una forma de hacerlo mediante cdigo VBA que nos va a permitir que el usuario disponga de un botn que le permita de forma sencilla actualizar los vnculos. - Detectar cuando se rompe un vnculo Para evitar sorpresas al usuario poco experto en temas de programacin es conveniente proveer a la aplicacin de un sistema que al iniciarse detecte si se ha roto algn vnculo de las tablas. De sta manera, podemos parar la ejecucin de la aplicacin e indicarle al usuario que las tablas no estn donde estaban y que hay que decirle al programa dnde se encuentran. Para comprobar la validez de un vnculo, simplemente hay que hacer referencia a una propiedad TableDef de la tabla vinculada y tratar los errores que se produzcan. Supongamos que se produce el error siguiente: Error 3265 El elemento no se encuentra en sta coleccin Este error indica sencillamente que el vnculo se ha perdido. Entonces, para hacer sta primera comprobacin, crearemos una funcin en la ventana mdulos que compruebe si efectivamente hay error o no.

Esta funcin mira si se produce el error que detecta si el vnculo se ha roto o no. Si se ha roto devuelve False y si no se ha roto devuelve True. Ahora podremos utilizar ste resultado para, primero, avisar al usuario del problema, y despus revincular las tablas. Esto lo podemos hacer en un formulario de inicio de la aplicacin, que lo abrimos de forma predeterminada, y para ello creamos un procedimiento en el evento Al abrir del formulario Inicio:

Una vez que hayamos determinado que se ha roto un vnculo de las tablas, hay que buscar el nuevo emplazamiento de la base de datos del servidor, la que contiene las tablas. Para ello implantaremos un nuevo mdulo que se lo facilitaremos a nuestro cliente.

Creacin de Aplicaciones multiusuario 2


Actualizar vnculos de las tablas
Una vez determinado que se ha roto un vnculo, como veamos en el captulo anterior, hay que buscar el nuevo emplazamiento de la base de datos de las tablas ubicada en el servidor. Se puede hacer manualmente, mediante el asistente de Access Administrador de tablas vinculadas que muestra un Archivo buscar. Pero esto es complicarle la vida al usuario, que tendr que ir a la Barra de mens y hacer todo el proceso manualmente. La mejor solucin es escribirlo en cdigo VBA para automatizar al mximo posible sta operacin. Actualizacin de los vnculos Para reparar el vnculo roto, tenemos que definir la informacin de conexin a las tablas remotas, empleando la nueva ubicacin y desencadenando luego el mtodo RefreshLink para volver a vincular la tabla.

Para poner en marcha sta funcin, y restablecer el vnculo roto hay que llamar a la funcin pasando tanto la nueva ruta de acceso como la tabla a vincular. Para ello escribimos el siguiente cdigo en un botn del formulario de inicio: Dim resultado as Bolean Resultado = refresca(Nombredelatabla,C:\Carpeta\Subcarpeta\Bases de datos en red.mdb)

Lo que hace el bucle For Each Next es recorrer las tablas una por una, coge su nombre y lo pasa a la base de datos externa para volver a crear el vnculo. De sta forma, nos aseguramos que todas las tablas tendrn el vnculo actualizado. Algo que debemos tener en cuenta cuando vinculamos tablas es que, aunque aparecen en la ventana de la base de datos, las tablas no residen realmente en la aplicacin. Dado que residen en la base de datos externa y no en la aplicacin, solamente notaremos que los vnculos estn rotos cuando abrimos la tabla , consulta o formulario basado en esa tabla.

Un ejemplo prctico completo


A continuacin vamos a exponer un ejemplo prctico para poder aplicarlo en nuestra aplicacin. Lo primero que debemos hacer es crear un formulario con tres botones y un cuadro de texto, como se indica en la figura.

A continuacin vamos a crear las funciones que harn funcionar todo este sistema. De forma esquemtica necesitamos los siguientes mdulos: Un mdulo que llamaremos mdTestVinculos Un mdulo que llamaremos mdDialogoAbrir Al final de la exposicin de los mdulos haremos un resumen del funcionamiento y dnde se utiliza cada mdulo. Empezaremos creando un mdulo en la Ventana de mdulos que llamaremos mdTestVinculos y que har una comprobacin de las tablas vinculadas. Para ello, copiar y pegar en dicho mdulo el siguiente cdigo: Option Compare Database Option Explicit Sub RefreshAllLinks(szNewPath As String) On Error Resume Next Dim db As Database, iCount As Integer Dim tblDef As TableDef Set db = CurrentDb() For iCount = 0 To db.TableDefs.Count - 1 Set tblDef = db.TableDefs(iCount) If tblDef.Connect <> "" Then tblDef.Connect = ";DATABASE=" & szNewPath Err = 0 tblDef.RefreshLink If Err <> 0 Then Call RelinkTables If Err = 3011 Then ' si no existe tabla MsgBox "El archivo no contiene la tabla requerida '" & tblDef.SourceTableName & "'", 16, "Refresh Error" ElseIf Err = 3024 Then ' no se encuentra MISDATOS.MDB MsgBox "No se ha encontrado la Base de datos!", 16, "Refresh Error" ElseIf Err = 3051 Then ' Acceso denegado MsgBox "El archivo no se puede abrir (debe ser readonly).", 16, "Refresh Error" ElseIf Err = 3027 Then ' MISDATOS.MDB es read-only MsgBox "Nos se pueden actualizar vinculos. El origin es read-only.", 16, "Refresh Error" End If Exit Sub End If End If Next iCount MsgBox "Todos los vinculos se han refrescado!", 64, "Refresco conseguido" Exit Sub End Sub Function RefreshTableLink(szTableName As String, szNewPath As String) As Boolean

On Error GoTo RefreshTableLinkErr Dim db As Database Set db = CurrentDb() db.TableDefs(szTableName).Connect = ";DATABASE=" & szNewPath & "" db.TableDefs(szTableName).RefreshLink RefreshTableLink = True Exit Function ' El refresco se ha realizado, devuelve True

RefreshTableLinkErr: RefreshTableLink = False ' Se encuentra un error, devueve False Exit Function End Function Function TestLink(szTableName As String) As Boolean On Error Resume Next Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset(szTableName) If Err = 3024 Then ' No existe el vinculo, devuelve False TestLink = False ElseIf Err = 0 Then ' Existe el vinculo, devuelve True TestLink = True End If End Function

Creacin de Aplicaciones multiusuario 3


Un ejemplo prctico completo - 2
Ahora crearemos el modulo mdDialogoAbrir, de utilidad interna. Copiar y pegar el siguiente cdigo en ste mdulo creado: Option Compare Database Option Explicit ' Declaraciones para los procedimientos Windows Common Dialogs Private Type CLTAPI_OPENFILE strFilter As String intFilterIndex As Long strInitialDir As String strInitialFile As String strDialogTitle As String ' ' ' ' ' Cadena de filtro Filtro inicial a mostrar. Directorio inicial al abrir Archivo inicial al abrir. Titulo del cuadro de dialogo

' Extensin por defecto, si no se ' especifica una. lngFlags As Long ' Flags (ver lista de constantes). strFullPathReturned As String ' Path complete del archive elegido. strFileNameReturned As String ' Nombre del archive elegido. intFileOffset As Integer ' Offset del path completo '(strFullPathReturned) cuando elnombre del archivo '(strFileNameReturned) empieza. intFileExtension As Integer ' Offset del path complete '(strFullPathReturned) cuando empieza 'la extension del archivo. End Type Const ALLFILES = "Todos los Archivos" Private Type CLTAPI_WINOPENFILENAME lStructSize As Long hWndOwner As Long hInstance As Long lpstrFilter As String lpstrCustomFilter As String 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 String End Type Const Const Const Const Const Const Const Const Const Const Const Const Const Const OFN_ALLOWMULTISELECT = &H200 OFN_CREATEPROMPT = &H2000 OFN_EXPLORER = &H80000 OFN_FILEMUSTEXIST = &H1000 OFN_HIDEREADONLY = &H4 OFN_NOCHANGEDIR = &H8 OFN_NODEREFERENCELINKS = &H100000 OFN_NONETWORKBUTTON = &H20000 OFN_NOREADONLYRETURN = &H8000 OFN_NOVALIDATE = &H100 OFN_OVERWRITEPROMPT = &H2 OFN_PATHMUSTEXIST = &H800 OFN_READONLY = &H1 OFN_SHOWHELP = &H10

strDefaultExtension As String

Declare Function CLTAPI_GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _ (pOpenfilename As CLTAPI_WINOPENFILENAME) _ As Boolean Declare Function CLTAPI_GetSaveFileName Lib "comdlg32.dll" Alias "GetSaveFileNameA" _ (pOpenfilename As CLTAPI_WINOPENFILENAME) _

As Boolean Declare Sub CLTAPI_ChooseColor Lib "msaccess.exe" Alias "#53" _ (ByVal hwnd As Long, rgb As Long)

Function GetOpenFile_CLT(strInitialDir As String, strTitle As String) As String ' Commentarios : Simple rutina Archivo Abrir. Para opciones adicionales, usar GetFileOpenEX_CLT() ' Parametros: strInitialDir - path para el dierctorio inicial, o en blanco para el directorio actual ' strTitle Titulo del cuadro de dialogo ' Devuelve : una cadena del path, nombre y extension del archivo seleccionado ' Dim fOK As Boolean Dim typWinOpen As CLTAPI_WINOPENFILENAME Dim typOpenFile As CLTAPI_OPENFILE Dim strFilter As String Dim quebusca On Error GoTo PROC_ERR quebusca = "Todos los archivos (*.*)" & "" If strInitialDir <> "" Then typOpenFile.strInitialDir = strInitialDir Else typOpenFile.strInitialDir = CurDir() End If If strTitle <> "" Then typOpenFile.strDialogTitle = strTitle End If typOpenFile.strFilter = strFilter typOpenFile.lngFlags = OFN_HIDEREADONLY Or OFN_SHOWHELP GetOpenFile_CLT = typOpenFile.strFullPathReturned PROC_EXIT: Exit Function PROC_ERR: GetOpenFile_CLT = "" Resume PROC_EXIT End Function Sub ConvertCLT2Win(CLT_Struct As CLTAPI_OPENFILE, Win_Struct As CLTAPI_WINOPENFILENAME) ' Commentarios : Convierte la estructura CLTAPI pasada a estructura Windows Dim strFile As String * 512 On Error GoTo PROC_ERR Win_Struct.hWndOwner = Application.hWndAccessApp Win_Struct.hInstance = 0

If CLT_Struct.strFilter = "" Then Win_Struct.lpstrFilter = ALLFILES & Chr$(0) & "*.*" & Chr$(0) Else Win_Struct.lpstrFilter = CLT_Struct.strFilter End If Win_Struct.nFilterIndex = CLT_Struct.intFilterIndex Win_Struct.lpstrFile = String(512, 0) Win_Struct.nMaxFile = 511 Win_Struct.lpstrFileTitle = String$(512, 0) Win_Struct.nMaxFileTitle = 511 Win_Struct.lpstrTitle = CLT_Struct.strDialogTitle Win_Struct.lpstrInitialDir = CLT_Struct.strInitialDir Win_Struct.lpstrDefExt = CLT_Struct.strDefaultExtension Win_Struct.Flags = CLT_Struct.lngFlags Win_Struct.lStructSize = Len(Win_Struct) PROC_EXIT: Exit Sub PROC_ERR: Resume PROC_EXIT End Sub

Sub ConvertWin2CLT(Win_Struct As CLTAPI_WINOPENFILENAME, CLT_Struct As CLTAPI_OPENFILE) ' Commentarios : Convierte la estructura CLTAPI pasada a estructura Windows On Error GoTo PROC_ERR CLT_Struct.strFullPathReturned = Left(Win_Struct.lpstrFile, InStr(Win_Struct.lpstrFile, vbNullChar) - 1) CLT_Struct.strFileNameReturned = RemoveNulls_CLT(Win_Struct.lpstrFileTitle) CLT_Struct.intFileOffset = Win_Struct.nFileOffset CLT_Struct.intFileExtension = Win_Struct.nFileExtension PROC_EXIT: Exit Sub PROC_ERR: Resume PROC_EXIT End Sub Function CreateFilterString_CLT(ParamArray varFilt() As Variant) As String ' Commentarios : Construye una cadena en formato Windows para "tipo de archivo" ' Parametros: varFilter parametros en formato: ' Text, Filter, Text, Filter ...

' Como: ' "Todos los archivos (*.*)", "*.*", "Archivos de texto (*.TXT)", "*.TXT" ' "Bases de datos (*.MDB)", "*.MDB" ' "Excel (*.xls)", "*.xls" Dim strFilter As String Dim intCounter As Integer Dim intParamCount As Integer On Error GoTo PROC_ERR intParamCount = UBound(varFilt) If (intParamCount <> -1) Then ' Hace un bucle para cada parametro For intCounter = 0 To intParamCount strFilter = strFilter & varFilt(intCounter) & Chr$(0) Next ' Comprueba que sea un numero par de parmetros If (intParamCount Mod 2) = 0 Then strFilter = strFilter & "*.*" & Chr$(0) End If End If CreateFilterString_CLT = strFilter PROC_EXIT: Exit Function PROC_ERR: CreateFilterString_CLT = "" Resume PROC_EXIT End Function Function RemoveNulls_CLT(strIn As String) As String ' Commentarios : Remueve terminadores de una cadena ' Parametros: strIn cadena a modificar ' Devuelve : cadena modificada Dim intChr As Integer intChr = InStr(strIn, Chr$(0)) If intChr > 0 Then RemoveNulls_CLT = Left$(strIn, intChr - 1) Else RemoveNulls_CLT = strIn End If End Function Bien, con esto ya tenemos las funciones que necesitamos para poner en marcha el sistema. Una vez que tenemos todas las funciones de los mdulos en la aplicacin, tenemos que activar el cdigo del formulario para que todo esto se ponga en marcha. Lo primero que haremos es abrir el formulario en vista diseo y crear un evento en el botn que comprueba los vnculos.

Abrimos la ventana de depuracin y pegamos el siguiente cdigo: Private Sub cmdTestLink_Click() On Error Resume Next If TestLink("AquiNombredeTabla") Then MsgBox "El vinculo es correcto.", 64 Else MsgBox "El vinculo est roto y necesita repararse. , 64 End If End Sub

A continuacin creamos un procedimiento de evento en el botn de comando Archivo Abrir, en ste caso llamado Comando5, que nos permitir buscar la Base de datos. Para ello, copiar y pegar el siguiente cdigo en el evento del botn Al hacer click: Private Sub Comando5_Click() Me.NewPath = GetOpenFile_CLT("C:\", "Seleccionar el archivo") End Sub

Finalmente hacemos la misma operacin para el boton de commando Revincular todas las tablas, que en ste caso lo hemos llamado cmdRefreshAll. Copiar y pegar en el evento Al hacer clic el siguiente cdigo: Private Sub cmdRefreshAll_Click() If IsNull(NewPath) Then MsgBox "Hay que indicar el parh complete y el nombre de la Base de datos donde residen las tables vinculadas.", 64 Exit Sub End If If Dir$(NewPath) = "" Then MsgBox "El path\nombre de archive suministrado no existe.", 64 Exit Sub End If Call RefreshAllLinks(NewPath) End Sub

Esto es todo lo necesario para comprobar y actualizar los vnculos. Con sta herramienta, el usuario de la Base de datos no tendr ms que decir dnde est la base de datos con las tablas, y la aplicacin har el resto. Este sistema puede automatizarse aun ms, si en lugar de presentar un formulario, ponemos el test de vnculos en un formulario de inicio, poniendo el cdigo para testear en el procedimiento Al abrir del formulario de inicio. A partir de aqu, si el resultado es que los vnculos estn rotos, podemos mostrar un mensaje al usuario, indicndole que busque la ruta de la base de datos de las tablas en el cuadro de dilogo que le vamos a presentar. En cualquiera de las dos maneras, el asunto que evitar que el usuario tenga que actuar manualmente en una cuestin que supone debe hacerlo el programa. El hecho de presentarle un cuadro de dilogo para localizar la base de datos de las tablas le va a resultar en cierto modo agradable, ya que supone una interaccin entre la aplicacin y l.

Creacin de Aplicaciones multiusuario 4


Control del bloqueo de registros Puesto que en una Base de Datos multiusuarios se va a originar que varios usuarios puedan acceder simultneamente a la base de datos y posiblemente en algunos momentos varios usuarios traten de actualizar un registro en el mismo momento, Access deber saber qu cambio debe aceptar. Para ello Access emplea todo un sistema de control del bloqueo de registros. El bloqueo por pgina que utiliza Access crea un bloque de 2048 bytes (2k) de longitud. En este bloque almacena los datos de uno o varios registros, segn su tamao. Las pginas pueden contener varios registros o un solo registro puede ocupar varias pginas. Cuando se activa el bloqueo de registros por pgina se bloquean todos los registros contenidos en ella. Si la base de datos contiene cierto nmero de pequeos registros es posible que un

usuario que edite un registro, puede impedir (bloquear) que otros usuarios editen otros muchos registros. El cuadro de dilogo Opciones permite establecer las opciones multiusuario, as como otras opciones.

Bloqueo predeterminado de registros Las opciones de la seccin bloqueo predeterminado de registros establecen el modo que por defecto Access realizar el bloqueo de registros. Las opciones son: Sin bloquear (predeterminado), Todos los registros y Registro modificado Modo de bloqueo Sin bloquear. Este modo se denomina modo de bloqueo optimista porque el bloqueo solo se lleva a cabo en el momento en que se realiza la actualizacin de un registro, y tan solo causar error si el mismo registro es modificado por dos personas distintas al mismo tiempo. Modo de bloqueo Todos los registros. Al utilizar este mtodo de bloqueo, en esencia se estarn bloqueando todos los registros de un recordset. Esto significa que otros usuarios que intenten acceder a esos mismos registros nicamente podrn leerlos pero no podrn actualizarlos. Al elegir sta opcin adems, impide que otros usuarios puedan aadir o borrar registros. Modo de bloqueo Registro modificado. Este modo se denomina bloqueo pesimista. Bloquea la pgina en cuanto se empiece a editar un registro. Uno de los puntos a favor que tiene este modo de bloqueo es que garantiza que solo un usuario estar modificando el registro en un momento dado. En cuanto presione una tecla para modificar el registro, la pgina de registros donde ste se halla ser bloqueada. La parte negativa es que como Access utiliza el bloqueo por pgina, es posible que otros registros que quieran modificar otros usuarios los encuentren bloqueados, aun cuando nadie est en realidad modificndolos.

Utilizar el modo de bloqueo optimista, modo de bloque Sin bloquear, es el mejor desde el punto de vista del rendimiento ya que un desconcertante conflicto de escritura solo le aparecer al usuario cuando dos usuarios editen el mismo registro e intenten actualizarlo al mismo tiempo. Aunque elegir una de stas opciones para toda la aplicacin puede ser suficiente, un buen desarrollador debe tener en cuenta cada momento, cada circunstancia que puedan provocar los usuarios y utilizar el bloqueo a nivel de los formularios independientes. Para ello, tendremos que disponer de formularios sin origen del registro. Cuando el usuario rellena los campos, no est actualizando nada, ya que el formulario no depende de ninguna tabla. Una vez que haya actualizado todos los campos, tendremos un botn Guardar, que mediante cdigo va pasando los valores y finalmente se agrega un registro a la tabla. Este sistema, sin duda es relativamente costoso a la hora de programar, pero absolutamente efectivo en cuanto a rendimiento de la base de datos. Con todo, las funciones que se generan al hacer el primer formulario sirven de plantilla para otros formularios, por lo que la tarea no va a resultar tan complicada. En el cuadro de Opciones tenemos dos valores que podemos manejar: Intervalo de actualizacin Numero de intentos de actualizacin Si un usuario intenta actualizar un registro bloqueado, access espera el tiempo especificado y trata de actualizarlo el nmero de veces indicado. Si la aplicacin va a tener ediciones rpidas de registros se pueden manejar stos valores para mejorar el rendimiento del bloqueo de registros. Si utilizamos el mtodo de bloqueo Sin bloquear es posible que el intervalo y numeros de actualizacin sean insuficientes. Podemos reducir el intervalo y aumentar el nmero de intentos. El intervalo de actualizaciones es el tiempo que Access espera antes de buscar un conjunto de registros de un formulario o tabla abiertos y luego actualizar y mostrar los datos modificados. Por ejemplo, cuando dos usuarios abren un formulario en el mismo registro, si uno aplica y guarda los cambios en el registro, la pantalla del otro usuario se actualiza en el intervalo especificado para reflejar los cambios. En cualquier caso, dado que cada aplicacin difiere de otra, es conveniente ir probando stos valores hasta conseguir los ms ptimos para cada aplicacin.