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