Newsgroup: it.comp.appl.access
Titolo: "Controllare" ID Contatore della Tabella

Salve.
Devo evitare di registrare un duplicato di un certo record,
per esempio un Cliente iscritto due volte ad un corso del 2018
 
Quindi, sull'evento PRIMA di Aggiornare della Maschera ho scritto qualcosa tipo: 
If DCount.....è vero then
"Messaggio di avviso che il cliente è già iscritto"
Me.undo
Cancel = True
End if
 
Tutto bene...
ma mi accorgo che l'ID Contatore, nonostante il Me.Undo,  ha registrato comunque il numero, e userà il numero successivo creando così "buchi" nella numerazione crescente.  
(Per esempio il nuovo record doveva essere 10, ma è stato annullato, però se ne registro un altro sarà 11 e non ancora il 10)
Come si può fare per evitare che il Contatore Conti.... ?
Dove sto sbagliando? 
 

 Dove sto sbagliando?
 
per quanto ne so io,
NON è possibile,
proprio per le evenienze di cancellazioni e annullamenti,
"pretendere" che la numerazione automatica incrementale
possa "timbrare" TUTTE registrazioni con la sequenza continua di numeri
 
e quindi, se questo è davvero necessario, occorre "mettersi in proprio"
 
Accetto confutazioni, anzi le attendo,
perchè ho proprio il caso di registrazioni che DEVONO essere consecutive
 

Salve,
 
GiorgioDaPrato:

Come scritto tanti anni fa e tradotto quasi 10 anni fa:
 
In genere, i campi Contatore sono destinati per l'uso interno, p. e., 
essi servono come campi chiave e di relazione, non per ottenere dei bei 
numeri. Quest'ultimi dovrebbero essere creati via programmazione, quali 
valori predefiniti o manualmente.
 
http://www.donkarl.com/it?FAQ3.2
 
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 
 
 
 

Scusate... correggetemi se sbaglio:
La maschera associata è un'interfaccia di ciò che accade nella sottostante Tabella.
Alla maschera dico che PRIMA di aggiornare la tabella, deve fare un qualcosa, quindi dovrebbe tenere in Stand-by i dati che inserisco, proprio perché l'ho detto alla Maschera e NON ad un singolo controllo!
Quindi ... da una parte prende in considerazione ciò che detto, annullando il record corrente ma dall'altra ha già "Contato" l'ID.
A questo punto che c'è a fare l'evento BeforeUpdate? 
Qualcosa non mi torna...


Ciao Marco, ascolta Karl. Se hai bisogno di numeri tuoi, incrementali, senza buchi o quant'altro, fatti un campi Int, Long e lo gestisci. Access, anzi, Jet, per come è fatto (a differenza di altri motori), appena ti posizioni su un nuovo record crea un ID contatore. Creato è creato. Se non lo utilizzi, scelta tua. Lui lo tiene come già creato, e prosegue. Quindi, ascolta Karl!


Per evitare i duplicati vedi:
http://www.donkarl.com/it?FAQ4.25
 
 
Ciao
 
Daniele

 Qualcosa non mi torna...
 
NON stai tenendo conto della multiutenza


Ok. Mi adeguo. Effettivamente... se proprio non sopporto i buchi, avendo un contatore mio, posso farlo aggiornare DOPO la routine che rivela il doppione.  Grazie! Ascolto Karl :-)


Ciao Daniele. Mi pare di capire che entrambe le varianti riportate nell'esempio si riferiscono ad evitare UN campo duplicato. La mia esigenza è quella di non duplicare una doppia condizione: 
per esempio se esiste già un record dove 
Il campo A ha valore 1
e il Campo B ha valore 2018
Quello è un duplicato. 


Hai ragione...

Marco, forse stai sbagliando approccio. Se il campo, o il gruppo di campi, non devono essere duplicati x una ragione tua, ok, vai con le alchimie che vuoi. Ma tu mi sembra stia parlando di un gruppo di valori che rappresenta la primaria Key del record (ė quello il senso del contatore). Se così fosse, ti stai mettendo su una strada molto scorretta!!!

 Quello è un duplicato.
 
Tutti e due metodi funzionano anche con più campi. Per variante 1 puoi 
creare un indice univoco con due campi. Per variante 2 puoi aggiungere 
il secondo campo, p.e.
 
If Not IsNull(Dlookup("A", "MiaTabella", "A=" & Me!A)) _
     And Me!A <> nz(Me!A.OldValue) _
     And Not IsNull(Dlookup("B", "MiaTabella", "B=" & Me!B)) _
     And Me!B <> nz(Me!B.OldValue) Then
 
    MsgBox Me!A & " + " & Me!B " già esiste.", vbOKOnly, "Duplicato!"
    Cancel = True
 
End If


Marco pretended :

Lo scatto del contatore automatico avviene quando accedi a un nuovo
record, non quando ne confermi l'inserimento.
Non c'è nessuna ragione logica: Access funziona così.
 
Lo puoi verificare con una tabella: appena metti un dato in un campo
l'autonumber si incrementa e annullando l'inserimento l'autonumber
non si decrementa.
 
Vi sono solo due modi per evitarte salti di numerazione:
-- non usare l'autonumber;
-- trutte le volte che a seguito di un inserimento annullato
   è scattato l'autonumber... chiudere tutto e compattare il db.
 
Bruno
  l'autonumber... compattare il database!


non sarebbe meglio cancellare ID?
con qualcosa del genere da adattare al suo caso?
 
DoCmd.SetWarnings False
     DoCmd.RunSQL "DELETE tblFattureVendite.IDSpedizione " & _
     "FROM tblFattureVendite " & _
     "WHERE 
(((tblFattureVendite.IDSpedizione)=Forms!mFatturaVendita![IDSpedizione]));", 
0
 
     DoCmd.SetWarnings True
 
         Exit Sub
     Else
         Cancel = True
 
Ciao Bruno
buona domenica a tutti
 
Daniele