Newsgroup: it.comp.appl.access
Titolo: Problemi di duplicazione Nominativi

Salve a tutti, vorrei una soluzione ed un aiuto a questo problema,
dunque ho una tabella anagrafica con Cognome Nome indirizzo ecc...,
vorrei che quando inserisco una persona già presente il programma me
lo segnalasse, esempio. inserisco Rossi Paolo, il programma mi deve
dire che rossi paolo c'è già anche se si tratta di omonimia, poi
visualizzando gli altri dati verifico l'eventuale duplicato. Mi è
sufficiente.
Preciso che i campi Cognome e Nome sono separati, ho provato con
dlookup, ma con un campo solo riesco con 2 no.
Ringrazio fin da subito chi mi aiuta. Grazie
Fabio


Dimenticavo ma mi sembra una cosa scontata il tutto è visualizzato in
una maschera.

 dlookup, ma con un campo solo riesco con 2 no.
Perché non mostri cosa hai provato?
Come criterio puoi usare qc come:
"Nome = " & Chr$(34) & Me!Nome & Chr$(34)  _
" And Cognome = " & Chr$(34) & Me!Cognome & Chr$(34)
-- 
HTH
Karl
*********
Access FAQ: 
www.donkarl.com/it
 

 ha scritto nel messaggio 
news:b511f9ae-5b07-4578...@l64g2000hse.googlegroups.com...

Personalmente il problema dei duplicati l'ho risolto così.
In una form anagrafica il primo controllo è un combobox che ha le seguenti 
caratteristiche:
es. i dati sono in tbAnagrafica
proprietà Origine riga:
SELECT tbAnagrafica.[id dipendente], UCase([cognome] & " " & [nome])  AS 
operatore
FROM tbAnagrafica
ORDER BY UCase([cognome] & " " & [nome]);
devi impostare a 2 colonne e mettere a 0 cm la prima delle due;
questo dà la possibilità di comporre il cognome man mano che lo digiti se 
questo è presente in tabella,
se per esempio in tabella è presente un Sig. Ferrari appena digiti la F ti 
viene già proposto Ferrari, se è quello che vuoi: premi invio o tab e ti 
presenta il record del sig. Ferrari.
Questo viene gestito dall'evento Dopo aggiornamento così:
Private Sub CasellaCombinata18_AfterUpdate()
    ' Trova il record corrispondente al controllo
    Dim rs As Object
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[id dipendente] = " & Str(Nz(Me![CasellaCombinata18], 0))
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
Se Ferrari non è presente si genera l'evento Non in elenco che gestico così:
Private Sub CasellaCombinata18_NotInList(NewData As String, Response As 
Integer)
DoCmd.CancelEvent
Me.CasellaCombinata18 = ""
DoCmd.GoToRecord acActiveDataObject, , acNewRec
DoCmd.GoToControl "cognome"
Me.cognome = StrConv(NewData, vbUpperCase)
Response = acDataErrContinue
End Sub
e mi ritrovo un nuovo record aperto con già inserito il cognome.
E non ho più duplicati in tabella. potrà sembrare macchinoso, ma funziona
Ciao
NSantini 

On 23 Ago, 19:19, 
uomo...@hotmail.it
 wrote:

Ciao fabio, puoi fare in questo modo.
Su "Prima di aggiornare" della maschera o dopo aggiornamento della
seconda casella di testo ( considerando la prima "Cognome" e la
seconda "Nome") inserisci la seguente routine:
Dim ss As DAO.Recordset
Set ss = CurrentDb.OpenRecordset("select count(Cognome & Nome) from
Tua_Tabella where Cognome & Nome= '" & Replace(Me.Cognome & Me.Nome,
"'", "''") & "'")
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Cancel = True
Me.Cognome = ""
Me.Nome = ""
End If
End If
ss.Close
Set ss = Nothing
Ciao vladimiro.

 > Fabio
Ciao fabio,
nella routine che ti ho scritto è bene aggiungerci un'altra riga di
codice, in quanto, andando a modificare ad esempio l'iniziale del nome
o del cognome già presenti in archivio con la lettera maiuscola o
minuscola, verresti bloccato come se stessi scrivendo per la seconda
volta lo stesso nominativo:
Dim ss As DAO.Recordset
Set ss = CurrentDb.OpenRecordset("select count(Cognome & Nome) from
Anagrafica where Cognome & Nome= '" & Replace(Me.Cognome & Me.Nome,
"'", "''") & "'")
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
Exit Sub
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Cancel = True
Me.Cognome = ""
Me.Nome = ""
End If
End If
ss.Close
Set ss = Nothing
Di nuovo, Vladimiro.


Grazie Vladimiro ma
Ho copiato quello che mi hai scritto .............
Private Sub Nome_AfterUpdate (Cancel As Integer)
Dim ss As DAO.Recordset
Set ss = CurrentDb.OpenRecordset("select count(Cognome & Nome) from
Tabella anagrafica where Cognome & Nome= '" & Replace(Me.Cognome &
Me.Nome, "'", "''") & "'")
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
Exit Sub
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Cancel = True
Me.Cognome = ""
Me.Nome = ""
End If
End If
ss.Close
Set ss = Nothing
End If
End Sub
però non mi segnala che il nominativo c'è quindi non funziona...cosa
ho sbagliato?
Grazie ancora per l'interessamento

 ha scritto nel messaggio 
news:b511f9ae-5b07-4578...@l64g2000hse.googlegroups.com...

Ciao Fabio
su evento prima di aggiornare della casella di testo Nome
della tua form di inserimento dati:
If Not IsNull(DLookup("Cognome", "tblAnagrafica", "Cognome=" & _
Chr$(34) & [Forms]![mElenco]![Cognome] & Chr$(34) & _
" AND " & Chr$(34) & [Forms]![mElenco]![Nome] & _
Chr$(34) & " = " & Chr$(34) & [Forms]![mElenco]![Nome] _
& Chr$(34))) Then
   MsgBox (Me!Cognome & " " & Me!Nome & " esistente")
End If
eventualmente modifica i nomi di campi e tabella.
Daniele

 - Mostra testo citato -
Ciao fabio,
non credo che la tabella si chiami "Tabella anagrafica" o sbaglio? :-)
Poi, (e questa volta la colpa è mia)  visto che usi l'opzione "Dopo
aggiornamento" della casella di testo, non puoi e tra l'altro non
serve più utilizzare la proprietà "Cancel" : Cancel=True
In definitiva, se la tabella si chiama Anagrafica e i campi Nome e
Cognome, dopo aggiornamento della casella di testo Nome, inserisci il
seguente codice:
Dim ss As DAO.Recordset
Set ss = CurrentDb.OpenRecordset("select count(Cognome & Nome) from
Anagrafica where Cognome & Nome= '" & Replace(Me.Cognome & Me.Nome,
"'", "''") & "'")
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
Exit Sub
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Me.Cognome = ""
Me.Nome = ""
'eventualmente inserisci il focus
Me.Cognome.SetFocus
End If
End If
ss.Close
Set ss = Nothing
End If
Vladimiro.
Ps
Guarda che l'ho provato e funziona alla grande :-)

 - Mostra testo citato -
Vladimiro ti ringrazio per la cortesia, la mia tabella si chiama
proprio Tabella anagrafica, è un problema? perchè non funziona.
Evidentemente sono testone io.
Al momento sto usando il suggerimento di CIDI  e sembra che funzioni
perfettamente come serviva a me...però sono curioso di fare funzionare
il tuo.
Cmq grazie a tutti siete eccezionali dei veri maestri per chi come me
è un po alle prime armi, anche se sono molto appassionato di access e
cerco di imparare.

 cerco di imparare.
prova a racchiudere il nome della tabella in parentesi quadre:
[tabella anagrafica]
-- 
Ciao
Geppo 

 - Mostra testo citato -
Come giustamente ti ha suggerito Geppo, quando il nome di una tabella
o di un campo è formato da due o più parole distinte, devi
racchiuderlo tra parentesi quadre [...]
E' bene però in futuro evitare ciò per non incorrere in spiacevoli
sorprese dovute magari ad un pò di disattenzione.
Se proprio vuoi visualizzare più nomi distinti (ma questo vale solo
per il nome dei campi), nella struttura della tabella nella riga nome
campo inserisci ad esempio TotaleNominativi oppure Totale_Nominativi e
nella riga etichetta Totale Nominativi; oppure nella struttura della
query, volendo modificare un nome che in origine tabella ha come nome
ad esempio Nome_di_battesimo, puoi scrivere Nome di
battesimo:Nome_di_battesimo; in questo modo quando andrai a crearti in
autocomposizione le maschere o i report visualizzerai le etichette con
i nomi separati dagli spazi e non ti dovrai più preoccupare quando
andrai a crearti qualche routine di racchiudere il nome tra parentesi
quadre.
Ciao vladimiro.

On 25 Ago, 18:48, 
vladil...@alice.it
 wrote:

Scusate l'intromissione, ho adattato questa soluzione al mio db ma
solo per il campo partita iva e/o codice fiscale. Dopo aver inserito
una nuova anagrafica ma con una partita iva già presente nella
tabella, mi dà messaggio di errore e mi evidenzia in Vba la parola
Replace. Cosa c'è di errato nel codice che ho modificato?
Grazie. Ciao.
Dim ss As DAO.Recordset
Set ss = CurrentDb.OpenRecordset("select count(pARTITAIVA) from
TBLAnagrafica where PartitaIva= '" & Replace(Me.partitaiva, "''") &
"'")
If Me.partitaiva = Me.partitaiva.OldValue Then
Exit Sub
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Me.partitaiva = ""
'eventualmente inserisci il focus
Me.partitaiva.SetFocus


 - Mostra testo citato -
Vladimiro io non so cosa c'è ma non funziona.......non mi segnala cioè
quando il nominativo è presente...Mi sa che sono incapace io...cmq sto
usando il suggerimento di CIDI e funziona....anche se vorrei che mi
mostrasse....i record dove il nominativo è presente.....chiedo troppo?
Ciao

 ha scritto nel messaggio 
news:ced471fb-1217-4555...@v57g2000hse.googlegroups.com...


Ma allora, scusa, perchè non usare una casella combinata, nell'intestazione 
della maschera?
si può fare con l'autocomposizione e ti darebbe anche la possibilità di 
scegliere il nominativo.
Ciao
Daniele 

 ha scritto nel messaggionews:ced471fb-1217-4555...@v57g2000hse.googlegroups.com...

Cioè spiegati meglio se puoi........
casella combinata legata al campo Cognome e per il nome?????
cmq voglio anche provare.....
Ciao..attendo se puoi aiutarmi

 ha scritto nel messaggio 
news:823399a7-1c3f-489b...@k36g2000pri.googlegroups.com...


apri, in struttura, la maschera Ordini del database di esempio Northwind.
guarda la casella combinata IDCliente.
ne devi fare una simile nell'intestazione maschera.
Ciao
Daniele 

 - Mostra testo citato -
Ciao Giuseppe, è normale che ti dà l'errore se mi parli di Partita Iva
perchè molto probabilmente il campo è di tipo numerico. Devi
sostituire la riga di codice in questo modo:
Set ss = CurrentDb.OpenRecordset("select count(pARTITAIVA) from
TBLAnagrafica where PartitaIva=" & Me.PartitaIva)
Ciao Vladimiro.

 - Mostra testo citato -
Se vuoi mi puoi mandare il DB (preferibilmente con pochi records)
perchè mi pare proprio strano che non funziona.
Per quanto riguarda l'andare al record con il nominativo già inserito,
penso la cosa più semplice da fare è quella di crearti una semplice
query con parametri (dove inserisci manualmente il nome ed il cognome
da ricercare) da aprire subito dopo aver inserito il dato già presente
in archivio.
vladileonchiocciolalibero.it
Fammi sapere.
Vladimiro.

 End If
-- 
Ciao
Geppo 

Ciao 
vlad...@alice.it
 wrote:
---cut---

Ma sei proprio sicuro?
Analizzando questa riga
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
    Exit Sub
Se il Cognome & Nome è uguale a Cognome & Nome esce dall'IF, pertanto non 
esegue il msgbox, ma se sono diversi il messaggio non viene eseguito 
ugualmente inquanto c'è exit sub che ti butta fuori dalla routine.
forse dopo la exit sub manca un "else". ;-)
-- 
Ciao
Geppo 

 mostrasse....i record dove il nominativo è presente.....chiedo troppo?
provala cosi:
Private sub nome_AfterUpdate()
Dim ss As DAO.Recordset
Set ss = CurrentDb.OpenRecordset("select count(Cognome & Nome) from
Anagrafica where Cognome & Nome= '" & Replace(Me.Cognome & Me.Nome,
"'", "''") & "'")
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
   Exit Sub
else
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Me.Cognome = ""
Me.Nome = ""
'eventualmente inserisci il focus
Me.Cognome.SetFocus
End If
End If
ss.Close
Set ss = Nothing
End If
end sub
-- 
Ciao
Geppo 

 - Mostra testo citato -
Ciao Geppo,
sono due cose distinte e separate; probabilmente l'equivoco nasce dal
fatto che il seguente codice con condizione "If" deve stare tutto su
una riga:
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
Exit Sub
(solo la visualizzazione di questo post fa pensare all'inserimento di
un "Else")
La suddetta istruzione serve ad evitare che la prima condizione prenda
il sopravvento nell'andare a modificare il carattere maiuscolo o
minuscolo di un dato già inserito; ad esempio se in archivio ho il
nome geppo e volessi cambiarlo con il nome GEPPO oppure Geppo ecc...
senza la condizione dell'OldValue(vecchio valore) Access lo
prenderebbe come un nuovo valore duplicato.
Ciao Vladimiro.

Ciao 
vlad...@alice.it
 wrote:
---cut---

E' abbastanza chiaro a cosa serve quell'istruzione e solo che mi sono fatto 
ingannare dalla End If in più che ha aggiunto "uomo_43", forse proprio 
perchè il codice scritto come hai fatto tu è meno comprensibile che con  la 
else.
-- 
Ciao
Geppo 

 comprensibile che con  la else.
questo è IMHO.
-- 
Ciao
Geppo 

 Geppo
Non riesco a capire tutta questa difficoltà su 4 righe di codice.
Proviamo ad analizzarlo:
'Dichiaro la variabile ss
Dim ss As DAO.Recordset
' apro la tabella Anagrafica conteggiando il valore dei campi Cognome
e Nome rispetto al valore che sto inserendo in maschera
Set ss = CurrentDb.OpenRecordset("select count(Cognome & Nome) from
Anagrafica where Cognome & Nome= '" & Replace(Me.Cognome & Me.Nome,
"'", "''") & "'")
' questo l'ho già spiegato
If Me.Cognome & Me.Nome = Me.Cognome.OldValue & Me.Nome.OldValue Then
Exit Sub
' se il valore inserito nel recordset è maggiore di 0 ...
If ss.Fields(0) > 0 Then
If MsgBox("Attenzione, il nominativo è già presente in archivio!
Continuare?", vbInformation + vbYesNo) = vbNo Then
Me.Cognome = ""
Me.Nome = ""
'eventualmente inserisci il focus
Me.Cognome.SetFocus
End If
End If
' chiudo la variabile ss
ss.Close
' distruggo la variabile ss
Set ss = Nothing
End If
Vladimiro.

 - Mostra testo citato -
Bhe Vladimiro te lo posso anche mandare.. ma non funziona.Ho provato a
farne uno nuovo per provare, però fa uguale...passa senza segnalare
che il nome c'è già. Cmq non voglio disturbarti oltre ti ho fatto
perdere anche troppo tempo, lasciamo perdere sto usando il programma
suggerito da CIDI e per quello che mi serve puo andare. adesso devo
solo trovare il modo che una volta che mi segnala che il nome c'è
già.......mi faccia vedere i record...ho fatto cosi:
Private Sub Nome_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("Cognome", "Tabella anagrafica", "Cognome=" & _
Chr$(34) & [Forms]![Maschera anagrafica]![Cognome] & Chr$(34) & _
" AND " & Chr$(34) & [Forms]![Maschera anagrafica]![Nome] & _
Chr$(34) & " = " & Chr$(34) & [Forms]![Maschera anagrafica]![Nome] _
& Chr$(34))) Then
   MsgBox (Me!Cognome & " " & Me!Nome & " E' PRESENTE IN ARCHIVIO"),
vbExclamation, "ATTENZIONE!"
   Cancel = False
DoCmd.OpenForm "M cognome", , , "[COGNOME]=" & Chr$(34) & Me!Cognome &
Chr$(34)
End If
End Sub
però.....mi fa vedere tutti quelli che si chiamano con quel cognome,
quindi esempio se io cerco ROSSI PAOLO, mi segnala che c'è però quando
apre la form "M cognome" mi visualizza tutti quelli con il cognome
ROSSI.

 ha scritto nel messaggio 
news:27791d35-84c4-4c1b...@8g2000hse.googlegroups.com...
Bhe Vladimiro te lo posso anche mandare.. ma non funziona.Ho provato a
farne uno nuovo per provare, però fa uguale...passa senza segnalare
che il nome c'è già. Cmq non voglio disturbarti oltre ti ho fatto
perdere anche troppo tempo, lasciamo perdere sto usando il programma
suggerito da CIDI e per quello che mi serve puo andare. adesso devo
solo trovare il modo che una volta che mi segnala che il nome c'è
già.......mi faccia vedere i record...ho fatto cosi:
Private Sub Nome_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("Cognome", "Tabella anagrafica", "Cognome=" & _
Chr$(34) & [Forms]![Maschera anagrafica]![Cognome] & Chr$(34) & _
" AND " & Chr$(34) & [Forms]![Maschera anagrafica]![Nome] & _
Chr$(34) & " = " & Chr$(34) & [Forms]![Maschera anagrafica]![Nome] _
& Chr$(34))) Then
   MsgBox (Me!Cognome & " " & Me!Nome & " E' PRESENTE IN ARCHIVIO"),
vbExclamation, "ATTENZIONE!"
   Cancel = False
DoCmd.OpenForm "M cognome", , , "[COGNOME]=" & Chr$(34) & Me!Cognome &
Chr$(34)
End If
End Sub
però.....mi fa vedere tutti quelli che si chiamano con quel cognome,
quindi esempio se io cerco ROSSI PAOLO, mi segnala che c'è però quando
apre la form "M cognome" mi visualizza tutti quelli con il cognome
ROSSI.
ovvio! usi solo il cognome per ricerca, prova così:
    DoCmd.OpenForm ("M cognome"), , , "[Cognome]&[Nome]=" & "'" & 
Me![Cognome] & [Nome] & "'"
sarebbe meglio non utilizzare nomi con spazi.
Ciao
Daniele 


Qui c'è il link per scaricare un piccolo esempio:
http://cid-c6235c2e3d2ce762.skydrive.live.com/self.aspx/Pubblica/Chiave%20primaria%20su%20due%20campi/Chiave%20primaria%20su%20due%20campi%20e%20apertura%20maschera%20su%20valore%20duplicato.zip
Ciao vladimiro.

 Ciao vladimiro.
Grazie di cuore a tutti. Funziona benissimo ho usato il suggerimento
di cidi con la correzione successiva.
Ciao Fabio

 - Mostra testo citato -
SCUSATE MA.... ci risiamo con questo problema....pensavo che andasse
tutto bene invece usandolo a pieno ritmo mi sono accorto che c'è
qualcosa che non va ..(mi riferisco al suggerimento datomi da CIDI)
infatti quando inserisco il nominativo es. ROSSI PAOLO, mi segnala che
c'è anche se in realta non c'è soltanto perchè trova altri nominativi
con cognome ROSSI,
Mentre per esempio se inserisco BIANCHI MARIO e in archivio non ho
nessuno con il cognome BIANCHI va tutto bene..e funziona anche se
ovviamente inserisco GARIBALDI GIUSEPPE, che ho gia in archivio, mi
segnala che è presente e mi mostra la precedente o le precedenti
registrazioni, adesso mi chiedo dove è l'errore nella formula?
Private Sub Nome_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("Cognome", "Tabella anagrafica", "Cognome=" & _
Chr$(34) & [Forms]![Maschera anagrafica]![Cognome] & Chr$(34) & _
" AND " & Chr$(34) & [Forms]![Maschera anagrafica]![Nome] & _
Chr$(34) & " = " & Chr$(34) & [Forms]![Maschera anagrafica]![Nome] _
& Chr$(34))) Then
   MsgBox (Me!Cognome & " " & Me!Nome & " E' PRESENTE IN ARCHIVIO"),
vbExclamation, "ATTENZIONE!"
   Cancel = False
DoCmd.OpenForm ("M cognome"), , , "[Cognome]&[Nome]=" & "'" &
Me![Cognome] & [Nome] & "'"
End If
End Sub
Grazie se potete ancora aiutarmi!!! Fabio

 ha scritto nel messaggio 
news:a4188726-6eea-4430...@y21g2000hsf.googlegroups.com...





End If
End Sub

Ciao Fabio
prova cosě:
If Not IsNull(DLookup("Cognome", "Tabella anagrafica", "Cognome=" & _
Chr$(34) & Me![Cognome] & Chr$(34) & _
" AND Nome = " & Chr$(34) & Me!Nome & Chr$(34))) Then
   MsgBox (Me!Cognome & " " & Me!Nome & " E' PRESENTE IN ARCHIVIO"), 
vbExclamation, "ATTENZIONE!"
   Cancel = False
   End If
DoCmd.OpenForm ("M cognome"), , , "[Cognome]&[Nome]=" & "'" &
Me![Cognome] & [Nome] & "'"
End If
End Sub
prima faceva il controllo solo sul Cognome.
Daniele 

 Daniele
Grazie..provo e ti faccio sapere.....spero che adesso funzioni
Ciao Fabio

 - Mostra testo citato -
Finalmente funziona, provato a pieno regime, nessun problema.
Grazie a tutti
Fabio