Newsgroup: it.comp.appl.access
Titolo: N°progressivo unico x multiutente

devo creare un applicativo con destinazione multiutente in rete e su cui
devo inserire un contatore (non contatore) che mi permetta la sicurazza
dei dati unici, mi permetta in caso di più utenti che stanno immettendo
record contemporaneamente, di non assegnare lo stesso numero, e che il
numero assegnato non possa essere eliminato.
in precedenti applicativi ho creato un campo contatore in formato testo e
sul controllo maschera, nel valore predefinito ho inserito il seguente
codice 
=IIf(DCount("[Numero_pratica]";"Tabella1")=0;1;DMax("[numero_pratica]";"Tabella1")+1)
ma spesso quando 2 utenti inseriscono un record contemporaneamente capita
che: 
1° utente fa nuovo record, il contatore assegna un numero, mentre completa
il record, un 2° utente inserisce un nuovo record, il contatore assegna un
numero uguale al primo utente, in quanto quest'ultimo ancora non ha
completato il record. Il 2° completa il record e passa al successivo,
tutto OK per lui, ma il primo utente che completa dopo il record, alla
fine dell'inserimento gli si presenta un messaggio di errore in cui si
dice che il numero è già esistente con la conseguenza di dover reinserire
il record.
E questo voglio evitarlo!.
suggerimenti, procedure e pazienza sono ben accette!
luigi
grazie
ps: ho spulciato il demo gestionefacile3impresa postato su questo NG e il
modulo Modnumber che potrebbe fare al caso mio, ma non ci ho capito nulla!
la demo è troppo complicata per i miei saperi.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio news:f5d9q3$u3b$1...@news.newsland.it...

tu assegni il contatore sul dirty del record
spostalo sul salvataggio
-- 
--
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access
Segrate (MI), 7-8 giugno 2007

Io assegnerei il numero solo all'atto del salvataggio del record.
Ciao, Mauro

MA ha scritto:


grazie del suggerimento, ma come fare? praticamente! 
luigi


 Ciao, Mauro
come? in pratica?
grazie



Ciao Luigi
qualcosa di simile su prima di aggiornare della maschera:
' Se č un nuovo record
If Me.NewRecord Then
         Me.ctrlNumeroFattura = Nz(DMax("NumeroFattura", "tblFatture"), 0) + 
1
  End If
Daniele

CIDI ha scritto:


ok! pare che vada bene!
ma per vedere il numero assegnato prima di inserire un nuovo record come
potrei fare?
grazie
luigi


 --
Se puoi, salva subito appena calcolato il numero:
Riprendendo l'esempio di Daniele, potrebbe essere:
If Me.NewRecord Then
 Me.ctrlNumeroFattura = Nz(DMax("NumeroFattura", "tblFatture"), 0) +1
 docmd.RunCommand acCmdSaveRecord
End If
Se non puoi salvare, si potrebbe memorizzare il numero in una tabella
temporanea.
Ciao, Mauro.

 
non si puņ
puoi invece mostrare quello che PROBABILMENTE sarą il numero assegnato
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\

 Ciao, Mauro.
tipo?


 ha scritto nel messaggio 
news:f5duq6$tp7$1...@news.newsland.it...

Ciao Luigi - Mauro
secondo me, salvare il numero fattura in una tab. temporanea non
risolve il problema.
Poichè prima del salvataggio del record un'altro utente potrebbe usare
lo stesso numero.
Invece la routine, prima di aggiornare il record, legge l'ultimo numero in 
tabella Fatture
ed assegna il nuovo numero fattura.
Daniele

 ha scritto nel messaggio 
news:f5d9q3$u3b$1...@news.newsland.it...

buona Sera Luigi
Funziona da circa 7 anni quando ho messo in rete tutto.
Crei una sub vedi sotto.
Quando premi il pulsante nuovo record gli passi i valori.
Il messaggio ->MsgBox ("ATTENZIONE STESSA MASCHERA"), 48, "CONDIVISIONE" 
basta toglierlo.
Sub NuovoRecordAutoID(PrimoID As Variant, Intervallo As Byte, Frm As Form, 
SecondoID As Variant, TerzoID As Variant)
On Error GoTo Err_NuovoRecordAutoID
  VariabileRecord = 1
  Frm.[DefaultEditing] = 2
  DoCmd.GoToRecord , , acNewRec
InizioNuovoRecordAutoID:
  Frm![AutoID] = PrimoID
  Frm![Operatore] = NomeOperatore
  If SecondoID Then Frm![SecoID] = SecondoID
  If TerzoID Then Frm![TerzID] = TerzoID
  DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
  VariabileRecord = 0
Exit_NuovoRecordAutoID:
  Exit Sub
Err_NuovoRecordAutoID:
  If Err = 3022 Then
    MsgBox ("ATTENZIONE STESSA MASCHERA"), 48, "CONDIVISIONE"
    PrimoID = PrimoID + Intervallo
    Resume InizioNuovoRecordAutoID
  End If
  MsgBox Error$
  Resume Exit_NuovoRecordAutoID
End Sub
Saluti 

 ha scritto nel messaggio 
news:467ae38d$0$21202$5fc...@news.tiscali.it...

Mi dimenticavo:
Private Sub Nuovo_Click()
On Error GoTo Err_Nuovo_Click
  Dim UltimoID As Variant
  If DCount("[ID Dettaglio Bolla Cliente]", "xInfo Fatture Clienti/Bolle") = 
0 Then MsgBox ("NON Esistono D.d.t. Da FATTURARE"), 
48,IntestazioneMessaggio:Exit Sub
  UltimoID = DMax("[ID Serie Fattura]", "Fatture Clienti", "(Int([ID Serie 
Fattura]/100000))=((Year(Date()))-1995)")
  If IsNull(UltimoID) Then UltimoID = ((Year(Date) - 1995) * 100000)
  Call NuovoRecordAutoID((UltimoID + 1), 1, Screen.ActiveForm, 0, 0)
  eccetera................
Exit_Nuovo_Click:
  Exit Sub
Err_Nuovo_Click:
  MsgBox Error$
  Resume Exit_Nuovo_Click
End Sub

 End Sub
scusa, ma per mia ignoranza non ci ho capito niente!
io ho la tabella "disabili" campo "N_autorizzazione"
ho la maschera "frmdisabili" con il controllo campo "n_autorizzazione"
in pratica la progressione in rete deve avvenire su "N_autorizzazione"
non riesco ad adattare il tuo codice al mio DB.
luigi


Iniziamo
Ora adatto la mia per la TUA:
Questo è access 2000
Sub NuovoRecordAutoID(PrimoID As Variant, Intervallo As Byte, Frm As Form, 
SecondoID As Variant, TerzoID As Variant)
On Error GoTo Err_NuovoRecordAutoID
  Frm.[DefaultEditing] = 2
  DoCmd.GoToRecord , , acNewRec
InizioNuovoRecordAutoID:
  Frm![AutoID] = PrimoID
  If SecondoID Then Frm![SecoID] = SecondoID
  If TerzoID Then Frm![TerzID] = TerzoID
  DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
Exit_NuovoRecordAutoID:
  Exit Sub
Err_NuovoRecordAutoID:
  If Err = 3022 Then
    MsgBox ("ATTENZIONE STESSA MASCHERA"), 48, "CONDIVISIONE"
    PrimoID = PrimoID + Intervallo
    Resume InizioNuovoRecordAutoID
  End If
  MsgBox Error$
  Resume Exit_NuovoRecordAutoID
End Sub
Nella maschera avrai un pulsante chiamato Nuovo per creare il record:
Private Sub Nuovo_Click()
On Error GoTo Err_Nuovo_Click
  Dim UltimoID As Variant
 'UltimoID naturalmente è l'ultimo record della tua tabella "disabili"
  UltimoID = DMax("[N_autorizzazione]", "disabili")
 'Andiamo a prendere il valore UltimoID
  Call NuovoRecordAutoID((UltimoID + 1), 1, forms![frmdisabili], 0, 0)
 'Vado a chiamare la sub
  eccetera................
'-------------------------------------------------------------------------------------
'ATTENZIONE IL CAMPO "N_autorizzazione" della maschera lo chiamerai 
AutoID -->solo il nome mentre il valore "N_autorizzazione"
'Questo vuol dire che in tutte le maschere con campi di nome diverso che 
devi generare un numero progressivo li chiami AutoID
'in modo che la sub sia sempre quella.
'-------------------------------------------------------------------------------------
Exit_Nuovo_Click:
  Exit Sub
Err_Nuovo_Click:
  MsgBox Error$
  Resume Exit_Nuovo_Click
End Sub
Altrimenti manda il piccolo database formato (ACCESS 2000 io lavoro solo con 
questo) con la maschera che lo preparo e te lo rispedisco.
Ciao
Graziano 

 - Mostra testo tra virgolette -
Ciao Luigi,
scusa se rispondo solo ora.
Crei una tabella "UltimoNumero" con un solo campo "Ultimo" di tipo
intero che conterrà sempre un solo record.
Quando un utente crea un nuovo record, vai a leggere in questa tabella
qual'è l'ultimo numero disponibile (esempio: 883), e lo memorizzi in
una variabile.
Subito dopo sommi 1 (883+1=884) e sovrascrivi 883 con 884 nella
tabella "UltimoNumero".
In questo modo, il secondo utente che va leggere l'ultimo numero
disponibile nella tabella "UltimoNumero", trova 884.
Il primo utente può usare in tranquillità il numero 883 (memorizzato
nella variabile) come "N_autorizzazione" nella tabella "disabili",
perchè è sicuro che il secondo utente userà il numero 884.
Per la realizzazione pratica:
Nell'evento che crea un nuovo record scrivi:
Dim rst As Recordset, intUltimo as Long
Set rst = CurrentDb.OpenRecordset("UltimoNumero", dbOpenDynaset)
intUltimo = rst!ultimo
rst.Edit
rst!ultimo = rst!ultimo + 1
rst.Update
rst.Close
Me.N_autorizzazione = intUltimo
...
Ora, nella variabile "intUltimo" hai il tuo numero (883), che potrai
usare per compilare il campo "N_autorizzazione".
L'unico problema è che se il primo utente annulla il salvataggio del
record (magari perchè ha sbagliato a premere un pulsante), "brucia" il
numero assegnato (883) e nella tabella "disabili" le autorizzazioni
passano dal n.882 al 884. (a Max Pezzali dispiacerebbe molto :-)
A disposizione per chiarimenti.
Ciao, Mauro.