Inserimento dati in due front-end in contemporanea

di il
35 risposte

35 Risposte - Pagina 2

  • Re: Inserimento dati in due front-end in contemporanea

    21/02/2024 - giadal ha scritto:


    Grazie dei suggerimenti …anche se ci sono cose che non capisco… devo studiare…

    RS sta x recordset?

    Si

    pk?

    Chiave Primaria=PK
    Chiave Esterna=FK

    Quando inserisci record da codice lato M, devi valorizzare la FK con la PK della Tabella lato 1 per rispettare le regole referenziali… 

    M?…abbandonare la sottomaschera in che senso?

    scusate l'ignoranza…

    La Sottomaschera inserita nella Maschera non consenta la gestione transazionale, quindi serve chiudere la tranzazione lato 1 per eventualmente salvare o gestire la tranzazione lato M(Sottomaschera), ma questo se gestito così in un MultiUtente non regge…

    se avete qualche esempio chiarificatore delle TRANSACTION vi ringrazio…mentre intanto studio…

    Purtroppo non che io sappia… è un tema che gli Accessisti non approfondiscono mai essendo un prodotto fatto per uso principalmente in LOCALE e MONOUTENTE, quando lo si usa per applicazioni più complesse e si può fare senza problemi, serve uscire dalla Zona Confort della gestione base nativa ed avere concetti funzionali tipici di strumenti diversi ed applicarli ad Access con appunto i Rs.

  • Re: Inserimento dati in due front-end in contemporanea

    @Alex la prossima volta SCRIVI che FK e' l'acronimo di Foreign Key e PK di Primary Key

    Tieni sempre presente a chi ti rivolgi: il nostro autore non e' alle prime armi,e' ancora prima ;-)

    praticamente ancora in fasce ;-) 

  • Re: Inserimento dati in due front-end in contemporanea

    21/02/2024 - migliorabile ha scritto:


    @Alex la prossima volta SCRIVI che FK e' l'acronimo di Foreign Key e PK di Primary Key

    Tieni sempre presente a chi ti rivolgi: il nostro autore non e' alle prime armi,e' ancora prima ;-)

    praticamente ancora in fasce ;-) 

    Osservazione corretta, ma spesso i poco esperti non hanno molta dimestichezza con l'inglese, nemmeno quello tecnico, e quando va bene cercano testi in Italiano, dove trovano “Chiave Primaria” e “Chiave Esterna”… per questo ho preferito l'italiano, quindi ho proprio tenuto conto di questo, però concordo che chiudere il cerchio sia più completo.

  • Re: Inserimento dati in due front-end in contemporanea

    Scrivere in italiano va bene  MA e' molto utile proprio per uno che non ha dimestichezza con l inglese sapere che FK e PK sono le prime lettere della versione inglese dell'italico termine ;-)

  • Re: Inserimento dati in due front-end in contemporanea

    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.

    Nel momento in cui ho BeginTrans sono tranquilla che nessun'altro fe possa interrompere la mia operazione. 

    DOMANDA: un altro fe che tenta la stessa operazione che errore riceve se sto già eseguendo io una transaction?

    Ora devo capire come creare il codice da eseguire nella transaction per riempire la riga della tabella in modo corretto…

  • Re: Inserimento dati in due front-end in contemporanea

    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

  • Re: Inserimento dati in due front-end in contemporanea

    21/02/2024 - giadal ha scritto:


    DoCmd.GoToRecord , "", acNewRec

    Vedendo questo mi sono reso conto che è troppo lungo da spiegare…

    Segui i consigli di @alex che essendo più ferrato di me in access riesce a darti spiegazioni molto intuitive.

  • Re: Inserimento dati in due front-end in contemporanea

    Io sono nel caso di maschera singola, ho provveduto a renderla non associata e pensavo sul tasto IserisciNuovoRecord di mettere questo:

    Dim myTransaction As SqlTransaction = SqlConnectionObject.BeginTransaction();
    Try
    	
        Dim rs As dao.Recordset
        Set rs = CurrentDb.OpenRecordset("...",dbOpenDynaset,?,dbPessimistic)
    
        myTransaction.Commit()
    
    Catch
        
        myTransaction.Rollback()
    
        Throw
    End Try 
    

    E' corretto? Non ho ben capito il parametro Options di 

    expression.OpenRecordset (Name, Type, Options, LockEdit)

    Sono sulla strada giusta?

  • Re: Inserimento dati in due front-end in contemporanea

    22/02/2024 - giadal ha scritto:


    Io sono nel caso di maschera singola, ho provveduto a renderla non associata e pensavo sul tasto IserisciNuovoRecord di mettere questo:

    Sono sulla strada giusta?

    No, non hai decisamente trovato codice per Access, quello più facilmente è VB.NET… quindi cerca meglio, in ogni caso prima studia, altrimenti fai 1000 tentativi inconcludenti.

  • Re: Inserimento dati in due front-end in contemporanea

    Questa funziona :

    Sub Transaction()
    Dim trans_in_corso As Boolean
    Dim rs As Database
    Dim objWs As dao.Workspace
    Dim strSQL As String
    On Error GoTo trans_err
       trans_in_corso = False
       Set objWs = DBEngine.Workspaces(0)
       Set rs = CurrentDb
       trans_in_corso = True
       objWs.BeginTrans
       strSQL = "Insert into [Archivio Report SIS] (Titolo) VALUES ('prova trans');"
       rs.Execute strSQL, dbFailOnError 
        
       objWs.CommitTrans
       
       trans_in_corso = False
       
    trans_exit:
       Set rs = Nothing
       Set objWs = Nothing
       Debug.Print "Fine transaction"
       Exit Sub
       
    trans_err:
       If trans_in_corso = True Then
           objWs.Rollback
           Debug.Print "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
           Resume trans_exit
       End If
    End Sub

    Ora devo implementare la gestione del lock…

  • Re: Inserimento dati in due front-end in contemporanea

    Questa con il lock:

    Sub Transaction2YYYY()
    Dim trans_in_corso As Boolean
    Dim objWs As DAO.Workspace
    'Dim strSQL As String
    Dim dbs As Database
    Dim rst As DAO.Recordset
    Dim tabella As String
    On Error GoTo trans_err
       trans_in_corso = False
       tabella = "Archivio Report SIS"
       Set dbs = CurrentDb
       Set objWs = DBEngine.Workspaces(0)
       trans_in_corso = True
       objWs.BeginTrans
        
       Set rst = dbs.OpenRecordset(tabella, dbOpenDynaset, , 2)
       With rst
       .AddNew
       !Titolo = "prova5"
       .Update
       End With
        
       objWs.CommitTrans
       
       trans_in_corso = False
       
    trans_exit:
       Set objWs = Nothing
       Debug.Print "Fine transaction"
       Exit Sub
       
    trans_err:
       If trans_in_corso = True Then
           objWs.Rollback
           Debug.Print "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
           'MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description
           Resume trans_exit
       End If
    End Sub
  • Re: Inserimento dati in due front-end in contemporanea

    Va bene cosi? quindi quando il primo utente inizierà ad inserire un nuovo record e  il secondo utente proverà ad inserire un nuovo record avrà un errore dalla transaction? Giusto?

  • Re: Inserimento dati in due front-end in contemporanea

    La premessa iniziale sembrava essere “inserimenti MultiUtente” da cui erano nati i suggerimenti… e non BLOCCO PESSIMISTICO che non solo contrasta con quanto in origine accennato ma può essere affrontato In modo estremamente più nativo e semplice.

    Altra cosa fondamentale che devi approfondire è la funzione della transazione che non ha nulla a che fare con il blocco record quello agisce separatamente… la transazione incapsula delle azioni dando la possibilità di annullare nel caso serva, il Blocco pessimistico agisce prima.

    La conseguenza di questa tua confusione è che quello che hai fatto con Access non serve a nulla perché se lo scopo è il blocco pessimistico ti basta usare Access nel modo più elementare e nativo possibile aggiungendo la modifica adeguata alla proprietà di Maschera Associata RecordLocks che trovi spiegata qui:

    https://support.microsoft.com/it-it/office/propriet%C3%A0-recordlocks-6ca29bbb-8824-4671-8087-97fe0568019a

    Ora penso siano caso di fare uno stop al 3D, tu stau facendo troppa confusione dovuta alle lacune tecncihe e noi ti abbiamo probabilmente dato informazioni troppo complicate in questa fase di conoscenza.

    Come ti ho già detto, devi prima chiarirti MOLTO BENE le idee cercando di studiare in modo più ccompleto i concetti.

  • Re: Inserimento dati in due front-end in contemporanea

    Allora provo a rispiegare il mio problema : devo inserire record con numerazione tipo fatture, in sequenza e nn duplicate che partono da 1000, quando fe1 clikka inserisci vengono contati i record con numerazione fatture valida per assegnare il n successivo e qui nessun altro fe deve poter iniziare la stessa operazione se no il conteggio si incasina, io ho bisogno che nel momento in cui il primo fe apre la tabella x contare e inserire gli altri fe se provano abbiano un   errore, ho provato con record lock e va bene x evitare la modifica contemporanea dello stesso record ma su inserimento di uno nuovo non funziona:2fe che fanno inserisci insieme e contano i record validi ottengono lo stesso numero(es 3) e assegnano entrambi n+1 (es 1004)   ,io vorrei che quando fe1 vuole inserire a fe2 venga detto attendi….ma anche se mettessi un controllo sul fatto che n non sia duplicato è sempre tardi perché se fe1 sta x inserire 1004 e fe2 sta x inserire 1004 (perché non vede il 1004di fe1 che nn   ancora scritto) non mi viene segnalato l'errore! Come risolvo?

  • Re: Inserimento dati in due front-end in contemporanea

    Usi una tabella di servizio “SEQUENZE” con colonne (NOME_SEQUENZA, ID_CORRENTE) che viene usata in questo modo:

    quando ti serve un nuovo ID, 

    1. BLOCCHI la tabella
    2. se una sequenza con quel nome non c'e', inserisci il corrispondente record
    3. leggi il valore “ID_CORRENTE” per la sequenza con il nome dato
    4. incrementi di 1 il valore cosi' ottenuto
    5. salvi il nuovo valore nella tabella
    6. SBLOCCHI la tabella
    7. usi il valore cosi' calcolato come ID dove ti serve.

    .

    Poiche' 2+ FE NON POSSONO ACCEDERE alla tabella mentre questa e' bloccata, TUTTI, eccetto il PRIMO, ASPETTANO.
    Poiche' l'operazione e' molto veloce, ASPETTANO pochissimo.
    Poiche' SOLO UN FE alla volta puo' accedere alla tabella, OGNI FE avra' un ID univoco.

    .

    Per cose piu' “arzigogolate”, ti servono gli strumenti ed i concetti della “programmazione concorrente”:

    1. mutex
    2. lock & release
    3. code di attesa
Devi accedere o registrarti per scrivere nel forum
35 risposte