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 |