Bloqueos en Visual basic

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.
2

2 respuestas

Respuesta
1
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.
Respuesta
1
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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas