LockSingleRecord




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

Stando alla documentazione di M$ nonche' ai vari help,
libroni ecc. ecc. Jet non puo' bloccare un singolo record
ma esegue il blocco su di una pagina di records (2 Kb) il
che a volte e' un pochino scocciante (per non dire di peggio)
ho casualmente scoperto che in determinate condizioni la
cosa NON E' VERA, ossia Jet riesce a BLOCCARE
UN SINGOLO RECORD !!

Il codice in questione e' il seguente:
Workspace e Database










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