Condividi tramite

Access - gestione errori di record-locking

Anonimo
2015-09-08T12:54:54+00:00

Buongiorno a tutti gli amici della community, ho messo in rete un DB creato con Access 2010 impostando il blocco ottimistico dei record, ma eseguendo delle prove ho notato che mi permette la modifica dei dati quando due utenti lavorano sullo stesso record.

Ho letto l'articolo di Emilio Scattaglia ed evidenzia questo:

Anche se si impostano le Opzioni predefinite di Access (2007) con un valore che sembra corretto per gestire i problemi di record-locking del proprio progetto, probabilmente con un numero elevato di utenti si verificheranno comunque conflitti di varia natura.

Più utenti usano l’applicazione, più probabile che si creino conflitti. Tali conflitti possono comunque essere gestiti (catturati) tramite codice VBA e comunicati agli utenti.

Per risolvere questi problemi bisogna usare nelle procedure transazioni con Workspace.BeginTrans e Workspace.CommitTrans. (Transazioni gestite dall’oggetto Connection di ADO)

Poiché non conosco bene cosa significhino le transazioni (non le ho mai utilizzate) e quando è opportuno utilizzarle, vi chiedo questo:

come adattare il codice sottoriportato nel mio DB per non permettere la modifica a due o più utenti quando lavorano sullo stesso record?

Public Function GestError(vValue As Integer) As Integer

Dim lCounter As Long

Dim lReturn As Long

Dim sCaption As String

Dim sMessage As String

sCaption = “gestione Errori”

Select Case Err.Number

Case 3021

‘ Lascia passare l’errore

Case 3186

‘ Record è bloccato da un’altra macchina

If vValue < 10 Then

For lCounter = 0 To 15000

Next lCounter

GestError = 3

Else

ParseError Err, Error

GestError = 4

End If

Case 3188

‘ Record è bloccato da un’altra sessione dell’applicativo sulla stessa machina

MsgBox “Il record non può essere bloccato in quanto in uso in questa macchina”

Case 3197

sMessage = “Il record che si stà salvando è stato modificato da un altro utente” _

& ” vuoi modificarlo ugualmente?”

lReturn = MsgBox(sMessage, vbYesNo, sCaption)

Select Case lReturn

Case vbYes

GestError = 3

Case vbNo

GestError = 4

End Select

Case 3260

‘ Il record è bloccato da un’altra macchina

If vValue < 10 Then

For lCounter = 0 To 15000

Next lCounter

GestError = 3

Else

ParseError Err, Error

GestError = 4

End If

Case 3421

sMessage = “Inserimento cancellato a causa di un errore di conversione”

lReturn = MsgBox(sMessage, vbOKOnly, sCaption)

Case Else

sMessage = “Il codice di errore è:  ” & Err

lReturn = MsgBox(sMessage, vbInformation, sCaption)

End Select

End Function

GestError accetta un singolo argomento (Flag – intero) sulla base del quale prende provvedimenti e visualizza messaggi.

Ringrazio anticipatamente chi mi aiuta in questo.

Ciao Nicola.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2015-09-09T22:01:14+00:00

ciao Nicola,

la soluzione della gestione dell'errore mi sembra corretta, e controllando su uno dei miei manuali i codice di errore da gestire sono esattamente gli stessi e anche la funzione di esempio molto simile.

in alternativa mi verrebbe un suggerimento un po' difficile da attuare, sviluppare la form unbound, con tutto quello che ne consegue, (lascia perdere) ,  i però blocchi potrebbero ridursi a notevolissimamente, con l'onere legato al numero di forms e all'impegno, importante, per implementare il codice al meglio;

-altra soluzione che ti mostro, una transazione con la gestione dell'errore in caso di modifica da parte di un altro utente dello stesso record : http://1drv.ms/1JUJ5mR  nicola.accdb, (demo minimale a pure titolo dimostrativo) per provarla dividi in front end in back end, colleghi la tabella e provi a modificare lo stesso record in contemporanea sui FE; ( modifichi e ti sposti di record);

dulcis in fundo altra soluzione e  facilissima da attuare...nel caso in cui il db sia utilizzato in ufficio di poche persone con la possiblità di parlarsi in modo diretto nel caso in cui due utenti blocchino lo stesso record....basterebbe impostare la maschera a  blocco record record modificati e se imposti il selettore di record nel FE e due utenti modificano lo stesso record compare su di esso il simbolo di divieto finchè l'altro utente non conferma le modifiche.

scheda dati, blocco record, record modificati.

ovviamente controlla nelle  impostazione client del DB che il blocco record sia sui record, file, opzioni, impostazioni client, apri database con impostazione blocco record.

HTH,

ciao, Sandro.

La risposta è stata utile?

0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-09-10T06:45:53+00:00

    Buongiorno a tutti, ciao bob3m, ciao Sandro, grazie ancora una volta per le vostre indicazioni.

    Per Sandro: il mio DB è in rete ed è diviso con la procedura divisione guidata database di Access, accedono 5 utenti al DB e non sono tutti nello stesso ufficio quindi scarterei la tua ultima indicazione.

    Grazie per la tua demo, quello che ti chiedo (solo perché desidero capire, sono autodidatta e mi baso ora per imparare di più l'utilizzo di Access sul libro di Access 2010 Guida Completa - Apogeo) come  applicare il codice che ho postato all'inizio di questa discussione, al fine dia vere la certezza di chi usa lo stesso record e cosa sta facendo ecc... 

    Cioè cosa devo fare altro, dove inserirlo, come richiamarlo ecc.

    Ti giuro che non ci ho capito nulla, quando mi si accenna alle transazioni a come si gestisce il blocco dei record da codice e altro.

    Ti sarei grato se tu mi spiegassi tutto sul blocco dei record, io ho lasciato fare ad Access tutto questo quando ho progettato e realizzato il DB in rete ma ho notato che non è molto sicuro in multiutenza cosi come segnalato da Scattaglia sul suo sito.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-09-09T19:19:11+00:00

    Ciao,

    il problema dei blocchi dei record di access e che se un utente apre un record, poi va a prendere un caffè, poi va a pranzo, ecc... tiene bloccato il record a tutta la rete.

    Io ho fatto così:

    -ho creato nella tabella un campo testo

    -all'appertura del record salvo nel campo il nome dell'utente che ha avuto accesso

    -al momento del salvataggio del record, verifico che il nome presente nel campo corrisponde ancora allo stesso utente (potrebbe essere entrato un nuovo utente sullo stesso record). Se corrisponde salvo, altrimenti avviso l'utente che un'altro utente (avviso anche chi) nel frattempo ha modificato il record e non è possibile il salvataggio.

    Così esce e rientra vedendo le nuove modifiche al record

    -all'uscita della maschera cancello il nome utente (solo se nel frattempo non è entrato nessun altro utente sullo stesso record).

    Ciao

    Massimo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-09-09T06:43:31+00:00

    Ciao Mimmo, grazie per il tuo intervento e la tua precisazione, desideravo sapere se è possibile proseguire ed essere aiutato con il quesito iniziale.

    Ho la necessità di non permettere nel mio DB in rete la modifica o la lavorazione dei dati sullo stesso record, avvisando con un messaggio che mi dica che il record è impegnato da un altro utente ecc. cosi come ho potuto intuire dal codice di Scattaglia già pubblicato.

    Resto in attesa di risposte di altri esperti della community per risolvere il problema segnalato.

    Auguro buona giornata a tutti.

    Ciao Nicola.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-09-08T15:45:47+00:00

    Ciao Nicola,

    non ho esperienze di concorrenza in Access, ma volevo solo chiarire il concetto di transazione.

    Si utilizza una transazione quando si devono effettuare più aggiornamenti e si vuole o apportarli tutti o nessuno. Cioè se dopo n aggiornamenti si genera una situazione che non consente i successivi aggiornamenti, si annullano tutti i precedenti procedendo con un rollback (ripristino della situazione iniziale).

    Ciao Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento