Newsgroup: it.comp.appl.access
Titolo: codice per generazione ID in multiutenza

Salve a tutti, vorrei un consiglio su un metodo che utilizzo per la gestione
della multiutenza. Personalmente, lavoro con tbl temporanee nel client e
tabelle "vere nel" BE; in pratica, l'operatore lavora tranquillamente sulla
sua tbl temporanea, poi quando preme "conferma" il/i record(s) vengono
accodati sulle tbl vere. Certe tabelle hanno una chiave di tipo ID numerico,
per la quale devo garantire l'unicità. Il problema si pone quando ho tbl
master e child, perchè non posso impostare l'ID sulla tbl vera ad
autonumber, perchè viene generato all'accodamento e non so come legare la
tabella child. Allora ho deciso di utilizzare questo metodo: nel BE tengo
una tbl "permov", monorecord, che contiene l'ID; quando un client apre la
maschera di inserimento (ricordo, basata sulla tbl temporanea) il codice
sotto riportato legge l'ID sulla tbl "permov", compila il campo ID
(numerico) sulla tbl temporanea e incrementa il contatore su "permov". In
questo modo, sono sicuro (teoricamente, ecco il quesito)  che ogni volta che
un client apre una maschera di inserimento gli viene assegnato un ID univoco
e che quindi il successivo append non genererà errori. Ciò che vorrei capire
e se il codice sotto riportato garantisce realmente l'unicità dell'ID o se
invece non possono esserci due client ai quali viene assegnato lo stesso ID.
Il locking del record impostato a dbpessimistic è sufficiente o c'è qualcosa
che non va nel codice? Lo stesso codice (più o meno) lo uso per la modifica
di un record; in particolare, assegno valore uno ad un campo flag; ogni
volta che un client vuole modificare un record, legge il valore del flag e
se è uguale a uno non procede, altrimenti lo pone ad uno e carica il record
nella tbl tmp per le modifiche. In questo modo sono sicuro che per tutto il
tempo che un utente modifica un record nessun altro può intervenire. Anche
in questo caso, il mio problema è essere sicuro del fatto che due utenti non
possano contemporaneamente caricare nelle rispettive tbl temporanee lo
stesso record.
Mi scuso per la lunghezza del post, ma credo che sia un problema che possa
interessare molti.
Grazie
codice all'apertura della maschera di inserimento temporanea:
Private Sub Form_Open(Cancel As Integer)
Dim rk As Recordset
Dim cont As Integer
Set rk = CurrentDb.OpenRecordset("permov", dbOpenDynaset, dbPessimistic)
rk.MoveFirst
            With rk
                    .Edit
                    cont = rk.Fields("prog")
                    !prog = !prog + 1
                    .Update
            End With
Me.mmt_ID.SetFocus
Me.mmt_ID.Value = cont
Me.mmt_cod.SetFocus
rk.Close
Set rk = Nothing
End Sub
codice per la modifica di un record:
codice = Me.Combo0.Value
Set rk = CurrentDb.OpenRecordset("ana_art", dbOpenDynaset, dbPessimistic)
rk.FindFirst " [aa_codice]='" & codice & "' "
    If rk.Fields("aa_flag") = "1" Then
        MsgBox "Il record è in uso da parte di un altro utente. Riprovare
più tardi", vbExclamation, "Record non modificabile"
        rk.Close
        Set rk = Nothing
        Exit Sub
        Else
        With rk
                .Edit
                !aa_flag = "1"
                .Update
        End With
        rk.Close
        Set rk = Nothing
    End If
DoCmd.RunSQL str_SQL 'accodamento sulla tbl tmp
DoCmd.OpenForm "mod_art"
DoCmd.Close acForm, "scelta_art_per_mod"

 della multiutenza
Anch'io ho dovuto affrontare lo stesso problema per generare i codici
protocollo per fatture, IDdocumento dei vari reparti ecc.
Per garantire l'unicità dell'ID generato per ogni utente ho preferito
definire un DB per ogni tabella che generasse un protocollo. Ovviamente sono
DB che vengono aperti un modalità esclusiva e non sono neanche collegati ai
DB fornt_end.
Le tabelle protocollo le apro con 'Opendatabase '.