21/02/2024 - giadal ha scritto:
Quindi transaction è una “funzione” x eseguire operazioni atomiche senza interruzioni.
Se non ho capito male io potrei avere la mia maschera senza DoCmd.GoToRecord , "", acNewRec ma al termine della compilazione dei campi faccio partire la transaction per portare i dati nella tabella cosi non ho “interruzioni” da nessuno ed eventualmente in caso di problemi li gestisco con la gestione errori nella transaction.
Prima di fare congetture devi capire BENE i concetti di gestione Transazionale e come questi vengono usati in Access, da li distinguere se sei in una gestione MonoTransazionale(Maschera Singola) o MultiTransazionale quando interessi più tabelle dati relazionate 1-M o M-M…
In maschera Singola, quindi Monostransazionale anche i metodi nativi di Access supportano le transazioni, quindi più frendly.
Devi studiare il concetto di Maschere NON ASSOCIATE, ed aggiornamenti Batch, questi metodi non sono così documentati proprio perchè con Access in pochissimi li usano…
Nel momento in cui ho BeginTrans sono tranquilla che nessun'altro fe possa interrompere la mia operazione.
Dipende di cosa stiamo parlando… a mio avviso confondi il Blocco Record con la Transazione… e tu devi anche comprendere come interagire proprio con il Blocco Record, Ottimistico/Pessimistico o Nessun Blocco.
Spesso si inibisce la MODIFICA contemporanea allo stesso Record perchè è molto complessa da razionalizzare, quindi si inibisce il blocco alla modifica abilitando SOLO un utente in scrittura… ma anche quì non sempre è possibile, tuttavia l'azione con Access non consente di bloccare il singolo Record ma tutto il RS, da quì nasceva l'idea di Andrea di utilizzare un Flag di Blocco, ma questo è per l'Edit non per il NEW.
DOMANDA: un altro fe che tenta la stessa operazione che errore riceve se sto già eseguendo io una transaction?
La transazione non si occupa di questo, che invece dipende dalla modalità di accesso o appunto dal Blocco Record imposto in fase di gestione.
L'azione di apertura di un RS:
expression.OpenRecordset (Name, Type, Options, LockEdit)
Se leggi in relazione al parametro [LockEdit]:
https://learn.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/locktypeenum-enumeration-dao
Ora devo capire come creare il codice da eseguire nella transaction per riempire la riga della tabella in modo corretto…
Ci sono vari modi per attivare il processo transazionale, o con Recordset e Masachere non associate o con comandi DDL, Query Action incapsulate in transazioni… devi strudiarci bene il tema non è tra quelli più basic, e con Access non si trova tantissima documentazione, dovresti più approfondire l'argomento con libri specifici su DAO o se proprio ADO, ed adattarlo poi ad Access.
https://learn.microsoft.com/en-us/office/vba/access/concepts/data-access-objects/use-transactions-in-a-dao-recordset
https://codekabinett.com/rdumps.php?Lang=2&targetDoc=how-to-access-transaction