Newsgroup: it.comp.appl.access
Titolo: Campi non duplicabili (Access 2010)

Tabella con tre campi :
 
ID
Cognome
Ospedale
 
Id è ovviamente contatore automatico
 
Cognome   ha una origine riga che deriva da una query su altra tabella
 
Ospedale ha una origine riga elenco valori (12 in tutto).
 
 
Non posso ripetere coppie di valori uguali
Es :
 
Cognome X   Ospedale Y
Cognome X   Ospedale Z
Cognome A   Ospedale Y
 
Cognome X   OSPEDALE Y  ---->  non posso ripetere
 
Come si può controllare  che una coppia di valori sia già stata 
digitata?  Grazie.
 
Rob

on 24-06-12, Bob supposed :

Metti una chiave primaria congiuntamente sui due campi Cognome e 
Ospedale.
 
Rivedrei comunque il progetto generale, che non mi sembra gran che.
Dici che Cognome proviena da un'altra tabella dove sicuramente non è 
chiave primaria: ma allora il suggerimento che ti ho dato sopra non ha 
molto senso.
Infatti tu devi evitare erronee duplicazioni pur consendo le omonimie.
 
Bruno
 
 


Ok,
grazie .
 
Cognome non è in effetti chiave primaria, ho preferito mettere il Cod. 
Fiscale . Ma ora che so che si può fare una chiave congiunta potrei 
inserirlo .
 
Rob

 Rob
 
rabbrividiamo...
 
piuttosto che metterlo in chiave primaria creati un indice.
 
la chiave primaria e' il metodo principale per identificare il record e 
se e' un singolo valore/campo ti semplifichi la vita.
 
se vuoi garantirti l'univocita' della combinazione di un po' di campi 
(chiamasi chiave alternativa) usa un indice.
 
 
 
-- 
Paolo opg
 
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 Fiscale . Ma ora che so che si puï¿œ fare una chiave congiunta potrei inserirlo 
 
Mi sembra tu non abbia ben inteso la mia osservazione.
Mi sono spiegato male.
 
Bruno
 
 


Ciao Bob,
poniamo che la tabella a cui trae origine record la maschera si chiami Tabella1 e che i due campi si chiamino "Cognome" e "Nome"; su Prima di aggiornare della casella di testo "Cognome" inserisci il seguente codice:
If IsNull(Me.Cognome) Or IsNull(Me.Nome) Then
Exit Sub
End If
If Not IsNull(DLookup("Cognome", "Tabella1", _
    "Cognome ='" & Replace(Me.Cognome, "'", "''") & "' AND Nome='" & Replace(Me.Nome, "'", "''") & "'")) _
        And Me.Cognome & Me.Nome <> Nz(Me.Cognome.OldValue) & Nz(Me.Nome.OldValue) Then
    MsgBox Me.Cognome & " " & Me.Nome & " Già esiste.", vbOKOnly, "Duplicato."
  Cancel = True
End If
 e su prima di aggiornare della casella di testo "Nome" inserisci quest'altro codice:
If IsNull(Me.Cognome) Or IsNull(Me.Nome) Then
Exit Sub
End If
If Not IsNull(DLookup("Cognome", "Tabella1", _
    "Cognome ='" & Replace(Me.Cognome, "'", "''") & "' AND Nome='" & Replace(Me.Nome, "'", "''") & "'")) _
        And Me.Cognome & Me.Nome <> Nz(Me.Cognome.OldValue) & Nz(Me.Nome.OldValue) Then
    MsgBox Me.Cognome & " " & Me.Nome & " Già esiste.", vbOKOnly, "Duplicato."
  Cancel = True
End If
 
Ciao Vladimiro


Ops, scusa Bob. Solo ora ho notato che il nome del campo che ho chiamato "Nome" si chiama in realtà "Ospedale". Comunque la sostanza non cambia in quanto i due campi sono di tipo testo e la funzione Replace che ho inserito evita l'errore su nomi con apostrofo e doppie virgolette.
:-)
Vladimiro

 Ciao Vladimiro
 
Secondo me il codice che hai scritto è tutto inutile.
 
In Validation Rule di Table Properties:
[Cognome] Is Not Null And [Nome] Is Not Null
Questo ad evitare inserimenti con uno o ambedue i campi Cognome e Nome 
a valore Null.
 
Quanto ai duplicati... che senso ha evitarli?
Al tuo ospedale si presentano due Bruno Campanini: il primo entra e il 
secondo lo lasciate morire?
 
Quindi:
In Tabella1 (Main Table):
ID_Paziente ==> AutoNumber ==> PrimaryKey
Cognome (Txt)
Nome (Txt)
...
 
In Tabella2 (Related Table):
ID_Paziente ==> Long  | Primary
Ospedale ==> Txt      | Key
...
 
Le due tabelle con relazione One-To-Many su ID_Paziente,
Enforce Referential Integrity = True
Cascade Update Related Fields = True
Cascade Delete Related Records = True
 
Bruno
 
 

 Bruno
Un pò meno arroganza non guasterebbe, non trovi Bruno?
Vladimiro
 
 

 Vladimiro
 
Volevo dare nel modo migliore un suggerimento utile... pazienza.
 
Se ti correggo pò in po' continuo ad essere arrogante? penso proprio di 
sì!
 
Bruno
 
 

 sì!
e ti pare che mi offendo se qualcuno mi fa notare che quello che ho suggerito è sbagliato? Anzi!!!
Fai tu.
Vladimiro.