Donde trabajo existe una aplicación creada en VB5 (es decir creada en DAO). Es para el cobro de atención de pacientes (consultorios de un hospital), el problema surgió al momento de poner 2 PC más, para el cobro (en total 3 PC). Ya que cuando desean grabar una atención, simultáneamente, a una de las PC le hace salir del sistema, entorpeciendo el desempeño normal.
Como me recomiendan realizar el bloqueo para poder solucionar el problema. Por favor si desean algo más de información solicítenmelo.
Desde luego yo siempre elijo el bloqueo optimista, ya que creo que cuanto menos tiempo esté bloqueado un registro mejor. Te voy a recordar las diferencias que hay entre uno y otro: - Bloqueo pesimista (LockEdits = True). La página de 2 KB que contiene el registro que se está modificando se bloquea tan pronto como se utiliza el método Edit. - Bloqueo optimista(LockEdits = False). La página de 2 KB que contiene el registro se bloquea sólo mientras el registro se está actualizando con el método Update. Ahora te voy a enviar un ejemplo que trae la ayuda de vb5 y que es muy interesante, se ve como utilizar los dos bloqueos: Ejemplo de la propiedad LockEdits Este ejemplo demuestra el bloqueo pesimista estableciendo la propiedad LockEdits a True y demuestra el bloqueo optimista estableciendo la propiedad LockEdits a False. También demuestra qué tipo de tratamiento de errores se necesita en un entorno de base de datos multiusuario para modificar un campo. Se necesitan las funciones BloqueoPesimista y BloqueoOptimista para ejecutar este procedimiento. Sub LockEditsX() Dim dbsNeptuno As Database Dim rstClientes As Recordset Dim strNombreAntiguo As String Set dbsNeptuno = OpenDatabase("Neptuno.mdb") Set rstClientes = _ dbsNeptuno.OpenRecordset("Clientes", _ dbOpenDynaset) With rstClientes ' Almacena los datos originales. strNombreAntiguo = !NombreCompañía If MsgBox("Demostración de bloqueo pesimista...", _ vbOKCancel) = vbOK Then ' Intenta modificar datos con el bloqueo ' pesimista activo. If BloqueoPesimista(rstClientes, !NombreCompañía, _ "Antonio Moreno Taquería") Then MsgBox "Registro modificado con éxito." ' Restaura los datos originales... .Edit !NombreCompañía = strNombreAntiguo .Update End If End If If MsgBox("Demostración de bloqueo optimista...", _ vbOKCancel) = vbOK Then ' Intenta modificar datos con el bloqueo ' optimista activo. If BloqueoOptimista(rstClientes, !NombreCompañía, _ "Antonio Moreno Taquería") Then MsgBox "Registro modificado con éxito." ' Restaura los datos originales... .Edit !NombreCompañía = strNombreAntiguo .Update End If End If .Close End With dbsNeptuno.Close End Sub Function BloqueoPesimista(rstTemp As Recordset, _ fldTemp As Field, strNueva As String) As Boolean dim ErrBucle as Error BloqueoPesimista = True With rstTemp .LockEdits = True ' Cuando establece LockEdits a True, intercepta ' los errores al llamar al método Edit. On Error GoTo Err_Bloqueo .Edit On Error GoTo 0 ' Si Edit todavía está en ejecución, no se ' producen errores; puede modificar los datos. If .EditMode = dbEditInProgress Then fldTemp = strNueva .Update .Bookmark = .LastModified Else ' Recupera el registro activo para ver los ' cambios realizados por otro usuario. .Move 0 End If End With Exit Function Err_Bloqueo: If DBEngine.Errors.Count > 0 Then ' Enumera la colección Errors. For Each errBucle In DBEngine.Errors MsgBox "Número de error: " & errBucle.Number & _ vbCr & errBucle.Description Next errBucle BloqueoPesimista = False End If Resume Next End Function Function BloqueoOptimista(rstTemp As Recordset, _ fldTemp As Field, strNueva As String) As Boolean dim ErrBucle as Error BloqueoOptimista = True With rstTemp .LockEdits = False .Edit fldTemp = strNueva ' Cuando establece LockEdits a False, intercepta ' los errores al llamar al método Update. On Error GoTo Err_Bloqueo .Update On Error GoTo 0 ' Si Edit todavía está en ejecución, no se ' producen errores; puede modificar los datos. If .EditMode = dbEditNone Then ' Mueve el puntero del registro activo al ' registro modificado más recientemente. .Bookmark = .LastModified Else .CancelUpdate ' Recupera el registro activo para ver los ' cambios realizados por otro usuario. .Move 0 End If End With Exit Function Err_Bloqueo: If DBEngine.Errors.Count > 0 Then ' Enumera la colección Errors. For Each errBucle In DBEngine.Errors MsgBox "Número de error: " & errBucle.Number & _ vbCr & errBucle.Description Next errBucle BloqueoOptimista = False End If Resume Next End Function También es aconsejable utilizar el método Idle, ya que con esto se consigue que se guarden rápidamente los cambios en el disco y así se actualizan más rápido los recordsets. Se utilizaría justo después de los update y sería así: DBEngine. Idle (dbRefreshCache) Bueno espero haberte ayudado.
Supongo que como se hacia antes cuando se abre la aplicación se captura la tabla y no se suelta hasta que no finalizas el programa. Lo que hay que hacer es abrir y cerrar solo en el momento de hacer las transacciones. Si realizas el cambio podrías pasar también a ADO, donde esta bastante más preparado para los bloqueos.