Rete # Proposta da: Andrea Zenobi
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 avolte 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 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). |