creación de aplicaciones multiusuario access

21
Creación de Aplicaciones multiusuario – 1 Ejecución de Access en red La primera decisión a que tenemos que enfrentarnos cuando creamos una aplicación multiusuario de Access es dónde 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 estación de trabajo hacia el servidor. 2. Instalar la aplicación de Access con tablas vinculadas en cada estación de trabajo y compartir solamente los datos de la Base de Datos entre los usuarios de la red. Instalación de la aplicación 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 opción. La ejecución de Access en el servidor tiene las ventajas siguientes: Se emplea poco espacio o ninguno en las estaciones de trabajo. El software se actualiza fácilmente, porque solamente es preciso actualizar un conjunto de archivos. Aunque ésta es la solución más fácil, no es la mejor. Durante la ejecución de Access se producen numerosos accesos al servidor de red. Cuando todos los archivos están situados en el servidor de red, éste acceso constante degrada el rendimiento de la red y ralentiza la aplicación de forma significativa. Sin contar con otros problemas habituales de bloqueo de la aplicación por un uso inadecuado del bloqueo de registros. Instalación de Access en cada estación de trabajo Para solucionar éste problema de rendimiento en la ejecución de Access en red, se puede ejecutar localmente en cada estación 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 Aplicación. Dado que la conexión de red se emplea únicamente para la transmisión de datos y no para cargar y ejecutar Access, el funcionamiento general de la Aplicación es mucho más rápido, más seguro, y sin duda alguna, la forma correcta de instalar la Aplicación en red.

Upload: javitron74

Post on 04-Aug-2015

1.329 views

Category:

Documents


6 download

DESCRIPTION

Creación de Aplicaciones multiusuario Access Part 1/4

TRANSCRIPT

Page 1: Creación de Aplicaciones multiusuario Access

Creación de Aplicaciones multiusuario – 1

Ejecución de Access en red

La primera decisión a que tenemos que enfrentarnos cuando creamos una aplicación multiusuario de Access es dónde 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 estación de trabajo hacia el servidor.

2. Instalar la aplicación de Access con tablas vinculadas en cada estación de trabajo y compartir solamente los datos de la Base de Datos entre los usuarios de la red.

Instalación de la aplicación 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 opción.

La ejecución de Access en el servidor tiene las ventajas siguientes:

Se emplea poco espacio o ninguno en las estaciones de trabajo. El software se actualiza fácilmente, porque solamente es preciso

actualizar un conjunto de archivos.

Aunque ésta es la solución más fácil, no es la mejor. Durante la ejecución de Access se producen numerosos accesos al servidor de red. Cuando todos los archivos están situados en el servidor de red, éste acceso constante degrada el rendimiento de la red y ralentiza la aplicación de forma significativa. Sin contar con otros problemas habituales de bloqueo de la aplicación por un uso inadecuado del bloqueo de registros.

Instalación de Access en cada estación de trabajo

Para solucionar éste problema de rendimiento en la ejecución de Access en red, se puede ejecutar localmente en cada estación 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 Aplicación. Dado que la conexión de red se emplea únicamente para la transmisión de datos y no para cargar y ejecutar Access, el funcionamiento general de la Aplicación es mucho más rápido, más seguro, y sin duda alguna, la forma correcta de instalar la Aplicación en red.

La única desventaja real de ésta forma de instalación es el incremento en el tiempo de mantenimiento. Aún así, hay formas de realizarlo que resultan extremadamente sencillas, como más adelante se indicará.

Para realizar la instalación de Access de ésta forma se deben llevar a cabo los siguientes procesos:

1. Dividir la Base de Datos mediante el asistente de Access, de forma que en una Base de Datos – Back End - quedarán 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

Page 2: Creación de Aplicaciones multiusuario Access

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 estación de trabajo. Mi hábito 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 aplicación para trabajar desde cada puesto de trabajo, con la ventaja de que por la red solamente circularán los datos almacenados en la aplicación.

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 demás objetos de la Base de Datos, de forma que obtengamos dos Bases de Datos para la Aplicación.

División de los objetos en dos Bases de Datos

Al tener en cada estación de trabajo la parte de formularios, informes, etc, el rendimiento es muy superior a la primera opción que hemos señalado. Imaginemos abrir un formulario complejo, cuyo diseño tuviéramos que pasarlo a través de la red para cada estación de trabajo. En poco tiempo, la capacidad de tráfico de la red se podría ver colapsada. De ésta segunda manera, los formularios están en cada estación de trabajo, por lo que su apertura es prácticamente instantánea.

Una vez dividida la Base de Datos, el propio asistente genera la vinculación de las tablas. Pero como normalmente la división la realizamos en el puesto de trabajo del programador de la aplicación, cuando pongamos la base de datos de las tablas en el servidor, el Frontend tendrá un vínculo a las tablas que no es el actual. Para ello, en la Barra de menús de Access, en Herramientas > Administrador de tablas vinculadas tenemos un asistente que nos permite buscar la ubicación actual del backend de las tablas y actualizar los vínculos.

En este punto hay que señalar que la división de una base de datos no es solo conveniente por una cuestión de tráfico de red, sino necesario cuando estamos desarrollando la aplicación para poder actualizar los cambios en el diseño de

Consultas

Formularios

Macros

Informes

Módulos

DISEÑO TABLAS

Tablas

Vinculos con Tablas

Page 3: Creación de Aplicaciones multiusuario Access

consultas, formularios, informes, código 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 diseño, simplemente cambiando el frontend de cada estación de trabajo por el Frontend con las nuevas modificaciones. Eso sí, en todo momento vigilando que la vinculación de las tablas sea la correcta.

Actualización de vínculos de las tablas

Con independencia de qué método utilicemos para vincular tablas, ya sea mediante el asistente de Access o mediante código VBA, es preciso capacitar a nuestra aplicación para reparar los vínculos 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 código VBA que nos va a permitir que el usuario disponga de un botón que le permita de forma sencilla actualizar los vínculos.

- Detectar cuando se rompe un vínculo

Para evitar sorpresas al usuario poco experto en temas de programación es conveniente proveer a la aplicación de un sistema que al iniciarse detecte si se ha roto algún vínculo de las tablas. De ésta manera, podemos parar la ejecución de la aplicación e indicarle al usuario que las tablas no están donde estaban y que hay que decirle al programa dónde se encuentran.

Para comprobar la validez de un vínculo, 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 colección

Este error indica sencillamente que el vínculo se ha perdido. Entonces, para hacer ésta primera comprobación, crearemos una función en la ventana módulos que compruebe si efectivamente hay error o no.

Page 4: Creación de Aplicaciones multiusuario Access

Esta función mira si se produce el error que detecta si el vínculo 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 después revincular las tablas.

Esto lo podemos hacer en un formulario de inicio de la aplicación, que lo abrimos de forma predeterminada, y para ello creamos un procedimiento en el evento Al abrir del formulario Inicio:

Page 5: Creación de Aplicaciones multiusuario Access

Una vez que hayamos determinado que se ha roto un vínculo 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 módulo que se lo facilitaremos a nuestro cliente.

Creación de Aplicaciones multiusuario – 2

Actualizar vínculos de las tablas

Una vez determinado que se ha roto un vínculo, como veíamos en el capítulo 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 menús y hacer todo el proceso manualmente.

La mejor solución es escribirlo en código VBA para automatizar al máximo posible ésta operación.

Actualización de los vínculos

Para reparar el vínculo roto, tenemos que definir la información de conexión a las tablas remotas, empleando la nueva ubicación y desencadenando luego el método RefreshLink para volver a vincular la tabla.

Page 6: Creación de Aplicaciones multiusuario Access

Para poner en marcha ésta función, y restablecer el vínculo roto hay que llamar a la función pasando tanto la nueva ruta de acceso como la tabla a vincular. Para ello escribimos el siguiente código en un botón del formulario de inicio:

Dim resultado as BoleanResultado = refresca(“Nombredelatabla”,”C:\Carpeta\Subcarpeta\Bases de datos en red.mdb”)

Page 7: Creación de Aplicaciones multiusuario Access

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 vínculo. De ésta forma, nos aseguramos que todas las tablas tendrán el vínculo 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 aplicación. Dado que residen en la base de datos externa y no en la aplicación, solamente notaremos que los vínculos están rotos cuando abrimos la tabla , consulta o formulario basado en esa tabla.

Un ejemplo práctico completo

A continuación vamos a exponer un ejemplo práctico para poder aplicarlo en nuestra aplicación.

Lo primero que debemos hacer es crear un formulario con tres botones y un cuadro de texto, como se indica en la figura.

Page 8: Creación de Aplicaciones multiusuario Access

A continuación vamos a crear las funciones que harán funcionar todo este sistema.

De forma esquemática necesitamos los siguientes módulos: Un módulo que llamaremos mdTestVinculos Un módulo que llamaremos mdDialogoAbrir

Al final de la exposición de los módulos haremos un resumen del funcionamiento y dónde se utiliza cada módulo.

Empezaremos creando un módulo en la Ventana de módulos que llamaremos mdTestVinculos y que hará una comprobación de las tablas vinculadas. Para ello, copiar y pegar en dicho módulo el siguiente código:

Option Compare DatabaseOption Explicit

Sub RefreshAllLinks(szNewPath As String)On Error Resume NextDim db As Database, iCount As IntegerDim 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 read-only).", 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 IfNext iCount

MsgBox "Todos los vinculos se han refrescado!", 64, "Refresco conseguido"Exit Sub

End Sub

Page 9: Creación de Aplicaciones multiusuario Access

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 ' El refresco se ha realizado, devuelve TrueExit Function

RefreshTableLinkErr: RefreshTableLink = False ' Se encuentra un error, devueve False Exit FunctionEnd 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 = FalseElseIf Err = 0 Then ' Existe el vinculo, devuelve True TestLink = TrueEnd If

End Function

Creación de Aplicaciones multiusuario – 3

Un ejemplo práctico completo - 2

Ahora crearemos el modulo mdDialogoAbrir, de utilidad interna. Copiar y pegar el siguiente código en éste módulo creado:

Option Compare DatabaseOption Explicit

' Declaraciones para los procedimientos Windows Common Dialogs

Private Type CLTAPI_OPENFILE strFilter As String ' Cadena de filtro intFilterIndex As Long ' Filtro inicial a mostrar. strInitialDir As String ' Directorio inicial al abrir

Page 10: Creación de Aplicaciones multiusuario Access

strInitialFile As String ' Archivo inicial al abrir. strDialogTitle As String ' Titulo del cuadro de dialogo strDefaultExtension As String ' Extensión 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 StringEnd Type

Const OFN_ALLOWMULTISELECT = &H200Const OFN_CREATEPROMPT = &H2000Const OFN_EXPLORER = &H80000Const OFN_FILEMUSTEXIST = &H1000Const OFN_HIDEREADONLY = &H4Const OFN_NOCHANGEDIR = &H8Const OFN_NODEREFERENCELINKS = &H100000Const OFN_NONETWORKBUTTON = &H20000Const OFN_NOREADONLYRETURN = &H8000Const OFN_NOVALIDATE = &H100Const OFN_OVERWRITEPROMPT = &H2Const OFN_PATHMUSTEXIST = &H800Const OFN_READONLY = &H1Const OFN_SHOWHELP = &H10

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

Page 11: Creación de Aplicaciones multiusuario Access

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

Page 12: Creación de Aplicaciones multiusuario Access

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

Page 13: Creación de Aplicaciones multiusuario Access

' 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 parámetros 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_EXITEnd 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

Page 14: Creación de Aplicaciones multiusuario Access

Bien, con esto ya tenemos las funciones que necesitamos para poner en marcha el sistema. Una vez que tenemos todas las funciones de los módulos en la aplicación, tenemos que activar el código del formulario para que todo esto se ponga en marcha.

Lo primero que haremos es abrir el formulario en vista diseño y crear un evento en el botón que comprueba los vínculos.

Abrimos la ventana de depuración y pegamos el siguiente código:

Private Sub cmdTestLink_Click()On Error Resume Next

If TestLink("AquiNombredeTabla") Then MsgBox "El vinculo es correcto.", 64Else MsgBox "El vinculo está roto y necesita repararse.” , 64End If

End Sub

A continuación creamos un procedimiento de evento en el botón de comando Archivo Abrir, en éste caso llamado Comando5, que nos permitirá buscar la Base de datos. Para ello, copiar y pegar el siguiente código en el evento del botón Al hacer click:

Page 15: Creación de Aplicaciones multiusuario Access

Private Sub Comando5_Click() Me.NewPath = GetOpenFile_CLT("C:\", "Seleccionar el archivo")

End Sub

Finalmente hacemos la misma operación 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 código:

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 SubEnd If

If Dir$(NewPath) = "" Then MsgBox "El path\nombre de archive suministrado no existe.", 64 Exit SubEnd If

Call RefreshAllLinks(NewPath)

End Sub

Esto es todo lo necesario para comprobar y actualizar los vínculos. Con ésta herramienta, el usuario de la Base de datos no tendrá más que decir dónde está la base de datos con las tablas, y la aplicación hará el resto.

Este sistema puede automatizarse aun más, si en lugar de presentar un formulario, ponemos el test de vínculos en un formulario de inicio, poniendo el código para testear en el procedimiento Al abrir del formulario de inicio.

A partir de aquí, si el resultado es que los vínculos están rotos, podemos mostrar un mensaje al usuario, indicándole que busque la ruta de la base de datos de las tablas en el cuadro de diálogo que le vamos a presentar.

En cualquiera de las dos maneras, el asunto que evitar que el usuario tenga que actuar manualmente en una cuestión que supone debe hacerlo el programa. El hecho de presentarle un cuadro de diálogo para localizar la base de datos de las tablas le va a resultar en cierto modo agradable, ya que supone una interacción entre la aplicación y él.

Creación 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 simultáneamente a la base de datos y posiblemente en algunos momentos varios usuarios traten de actualizar un registro en el mismo

Page 16: Creación de Aplicaciones multiusuario Access

momento, Access deberá saber qué cambio debe aceptar. Para ello Access emplea todo un sistema de control del bloqueo de registros.

El bloqueo por página que utiliza Access crea un bloque de 2048 bytes (2k) de longitud. En este bloque almacena los datos de uno o varios registros, según su tamaño. Las páginas pueden contener varios registros o un solo registro puede ocupar varias páginas. Cuando se activa el bloqueo de registros por página se bloquean todos los registros contenidos en ella. Si la base de datos contiene cierto número de pequeños registros es posible que un usuario que edite un registro, puede impedir (bloquear) que otros usuarios editen otros muchos registros.

El cuadro de diálogo Opciones permite establecer las opciones multiusuario, así como otras opciones.

Bloqueo predeterminado de registros

Las opciones de la sección 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 actualización 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 método de bloqueo, en esencia se estarán bloqueando todos los registros de un recordset. Esto significa que otros usuarios que intenten acceder a esos mismos registros únicamente podrán leerlos pero no podrán actualizarlos. Al elegir ésta opción además, impide que otros usuarios puedan añadir o borrar registros.

Modo de bloqueo Registro modificado.Este modo se denomina bloqueo pesimista. Bloquea la página en cuanto se empiece a editar un registro.

Page 17: Creación de Aplicaciones multiusuario Access

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 página de registros donde éste se halla será bloqueada.La parte negativa es que como Access utiliza el bloqueo por página, es posible que otros registros que quieran modificar otros usuarios los encuentren bloqueados, aun cuando nadie esté en realidad modificándolos.

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 aplicación 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 botón Guardar, que mediante código 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 actualización Numero de intentos de actualización

Si un usuario intenta actualizar un registro bloqueado, access espera el tiempo especificado y trata de actualizarlo el número de veces indicado. Si la aplicación va a tener ediciones rápidas de registros se pueden manejar éstos valores para mejorar el rendimiento del bloqueo de registros.

Si utilizamos el método de bloqueo Sin bloquear es posible que el intervalo y numeros de actualización sean insuficientes. Podemos reducir el intervalo y aumentar el número 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 aplicación difiere de otra, es conveniente ir probando éstos valores hasta conseguir los más óptimos para cada aplicación.