RecordLoking




' Workspace e Database

Private mwsWKS As Workspace
Private mdbDAT As Database
' Recordsets per Browse/Edit

Private mrsBrowse As Recordset
Private mrsEdit As Recordset
' Inizializza

'________________________________________________________


Private Sub OpenDB()
' Apro WS/DB, assumo che "biblio.mdb"

' sia nella dir corrente

Set mwsWKS = DBEngine.CreateWorkspace("LockTest", "Admin", "")
Set mdbDAT = mwsWKS.OpenDatabase("biblio.mdb", False, False, "")
' Apro RS per "browse"

Set mrsEdit = mdbDAT.OpenRecordset("SELECT * FROM Authors ORDER BY
Author, Au_ID", dbOpenSnapshot)
End Sub
'________________________________________________________


' Termina

Private Sub CloseDB()
mrsEdit.Close
mdbDAT.Close
mwsWKS.Close
Set mwsWKS = Nothing
DBEngine.Idle dbFreeLocks
End Sub
'________________________________________________________


' a questo punto si puo' "navigare" nel recordset

' mrsBrowse per selezionare il record che si desidera

' modificare (ad esempio con una grid o altro), nel

' momento in cui si desidera "bloccare" ed editare un

' record, si dovra' usare il codice seguente:

' Blocca un record per editing

Private Sub EditWithLock(ByVal lAu_Id As Long)
Dim sSelect As String
' Apro il recordset su una select

' che mi restituisce solo il record

' da bloccare ed editare

sSelect = "SELECT * FROM Authors WHERE Au_ID = " & lAu_Id
Set mrsEdit = mdbDAT.OpenRecordset(sSelect, dbOpenDynaset,
dbSeeChanges)
With mrsEdit
.LockEdits = True
.MoveFirst
' in caso di record bloccato qui

' si verifica un errore .... :-)

.Edit
End With
End Sub
'________________________________________________________


' Aggiorna e sblocca

Private Sub UpdateAndUnlock()
With mrsEdit
.Update
.Close
End With
Set mrsEdit = Nothing
DBEngine.Idle dbFreeLocks
End Sub

ossia; sembra che aprendo un recordset che ritorni il
solo record da editare senza specificare alcun
"lock flag" nella open, e poi impostando la property
lockedits a True Jet non blocchi una pagina ma soltanto
l'unico record presente nel recordset !! Non so se
questo sia un "buco" di Jet o una caratteristica non
documentata (dato che Jet 4.0 supporta il record-locking)
resta il fatto che e' estremamente utile, inoltre il
fatto di dover aprire un secondo recordset non e'
eccessivamente penalizzante grazie alla cache interna di
Jet. L'unica limitazione e' che con questa tecnica non si
possono usare controlli Data-Bound visto che edit/update
debbono forzatamente essere controllati da codice
(scusate il gioco di parole).










( recordloking.html )- by Paolo Puglisi - Modifica del 17/12/2023