Newsgroup: it.comp.appl.access
Titolo: evitare duplicati in base a un campo numerico e ad uno formato testo

Buongiorno a tutti.
Nella mia form "frmfatture" dopo aver selezionato l'IdAzienda (formato
numerico) su cui operare, genero l'NProtocollo e l'NFattura (entrambi
formato testo tipo 001/10). Siccome questi ultimi due non sono
bloccati, vorrei evitare che digitando un numero protocollo o numero
fattura già esistente il campo della tabella accettasse il valore.
Non posso mettere duplicati non ammessi, perchè gli stessi valori
possono essere uguali alle fatture emesse per altre ditte.
Ho messo il seguente codice sul controllo NProtocollo
If Not IsNull(DLookup("nprotocollo", "tblAziende", _
    "nprotocollo = " & Chr$(34) & Me!Nprotocollo & Chr$(34))) _
    And Me!Nprotocollo <> Nz(Me!Nprotocollo.OldValue) Then
  MsgBox " Già esiste un protocollo per " & Forms![frmfatture]!
[NomeAzienda] & ". "
ecc...
funziona ma senza tener conto dell'IdAzienda su cui sto lavorando.
Dove e come inserisco
"[IDAzienda]= " & Forms![frmfatture]![IDAzienda]        ????
Grazie.
Giuseppe.

 
i tre campi idazienda, NProtocollo e NFattura, sono gia' chiave primaria 
della tabella?
perche' se lo sono, in automagico viene impedita la duplicazione di 
protocollo e fattura per ogni azienda...
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

 --
No la chiave primaria è un'altro campo che si chiama "ID" .
Giuseppe.

 
metti un indice univoco sul terzetto di campi e dovresti essere a posto


 "[IDAzienda]= " & Forms![frmfatture]![IDAzienda]        ????
Prova cos�:
If Not IsNull(DLookup("nprotocollo", "tblAziende", _
    "IdAzienda = " & Me!IDAzienda & " And " & _
    "nprotocollo = " & Chr$(34) & Me!Nprotocollo & Chr$(34))) _
    And Me!Nprotocollo <> Nz(Me!Nprotocollo.OldValue) Then
-- 
cu
Karl
*********
Access FAQ: 
www.donkarl.com/it
 

 Access FAQ:
www.donkarl.com/it
Ho provato ad emettere una fattura con un'altra ditta che al momento
non ha emesso ancora nessuna fattura.
Dopo aver inserito l'idazienda, in automatico mi dà ovviamente e
giustamente come nprotocollo 001/10 ma se lo vario in 006/10 dopo
l'aggiornamento mi esce il msgbox avvisandomi che già esiste un
protocollo identico per la ditta selezionata. Quindi il controllo
sull'idazienda non l'ha fatto.
Ciao. Giuseppe.

 
metti l'indice sui tre campi.
con l'indice in tabella, hai un controllo intrinseco che impedisce 
l'inserimento ed eviti anche formule di controllo complesse/contorte.
soprattutto, qualsiasi maschera crei, hai gia' il controllo duplicati, 
senza dover riportare ogni volta tutta la formula contorta che stai 
tentando (senza successo) di far funzionare.


 --
Cosa devo mettere ai tre campi  Primario, univoco e ignora Null??
Alla chiave primaria che il campo ID c'è Si, Si e No.
Grazie Paolo.
Ciao.

 
univoco e' la voce che ti interessa; crei un indice univoco su tre campi.
primario non puoi impostarlo a si perche' la chiave primaria gia' c'e'.


 --
Ciao Paolo.
Quando vado a impostare nei tre campi IdAzienda, Nprotocollo ed
NFattura l'indice con "univoco" a si, e salvo la tabella mi dice
"L'apporto modifiche non è riuscito perchè si è cercato di duplicare i
valori nell'indice, nella chiave primaria o nella relazione. ecc.." In
effetti avevo dubbi su questa soluzione, perchè il mio è un db
multiaziendale e quindi nelle tabelle i numeri di registrazione o
numeri di fattura si ripetono per ogni ditta.
Credo sia opportuno riprovare con il suggerimento di Karl.
Saluti.

 
se hai un valore duplicato per la terna azienda/protocollo/fattura, non e' 
un problema della soluzione che scegli.
hai un db con dati duplicati.
dubbio: non e' che hai impostato singolarmente, per ogni campo, il valore 
univoco a true?
devi creare un indice sui tre campi e impostare le proprieta' sull'indice, 
non sui campi singolarmente...


 non sui campi singolarmente...
credo di aver commesso proprio questo errore ma non riesco a capire
come si imposta la proprietà sull'indice e non sui singoli campi.
Giuseppe.

 
sul sito ms c'e' una guida passo passo:
http://office.microsoft.com/en-us/access/ha102103471033.aspx
dove trovi la sezione 'Create a multiple-field index'
si riferisce ad access 2007, ma dovrebbe andare bene per tutte le versioni.
credo...


 --
Ciao Paolo, ti aggiorno.
Sono riuscito a creare l'indice su più campi e funziona.
Il problema è che l'avviso di dati duplicati esce solo dopo aver
cercato di salvare il record.
Io invece preferisco avvisare e interrompere, subito dopo l'immissione
di un dato duplicato nel controllo NProtocollo o NFattura; inoltre da
codice posso gestire il messaggio di errore e dove spostare il focus.
Magari l'indice creato va bene lasciarlo, però il codice sul singolo
controllo lo preferisco. Quello suggeritomi da Karl nel post
precedente funziona ma mi dà messaggio di valore già esistente
indipendentemente dalla ditta selezionata.
Grazie.
Giuseppe.


Ciao Giuseppe,
su prima di aggiornare della maschera inserisci la seguente routine:
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("select count(IdAzienda)&
count(NProtocollo) & count(NFattura ) from tblAziende where IdAzienda
& NProtocollo & NFattura ='" & Replace(Me.IdAzienda & Me.NProtocollo &
Me.NFattura, "'", "''") & "'")
If rs.Fields(0) > 0 Then
MsgBox ("Attenzione, il nominativo è già presente in archivio!"),
vbInformation
Cancel = True
Me.NProtocollo.SetFocus
End If
Ciao Vladimiro.

 - Mostra testo citato -
Rileggendo bene, se non ti va bene prima di aggiornare della maschera,
lo puoi inserire anche dopo aggiornamento di NFattura (3° in ordine
cronologico del codice) modificando solo:
Cancel=True
con
DoCmd.CancelEvent
Di nuovo Vladimiro

 DoCmd.CancelEvent
Comunque già dopo Nprotocollo dovrei avvisare che si sta inserendo una
fattura con Nprotocollo già esistente; altrettanto devo fare se pur
non essendo nprotocco un valore duplicato, lo è NFattura se l'NFattura
già esiste.
Grazie.
Giuseppe.

 già esiste.
Scusa, ma se tu scrivi:
Nella mia form "frmfatture" dopo aver selezionato l'IdAzienda
(formato
numerico) su cui operare, genero l'NProtocollo e l'NFattura (entrambi
formato testo tipo 001/10). Siccome questi ultimi due non sono
bloccati, vorrei evitare che digitando un numero protocollo o numero
fattura già esistente il campo della tabella accettasse il valore.
Non posso mettere duplicati non ammessi, perchè gli stessi valori
possono essere uguali alle fatture emesse per altre ditte.
Scusa, ma allora quali campi debbo concatenare affinchè siano un'unica
chiave primaria?
Faccio un esempio:
Ditta   Id     NP          NF
 A       1    001/10-1   001/10
 B       2    002/10-2   002/10
Secondo te quali dati potrei inserire al terzo record per non avere
dati duplicati?
Ciao Vladimiro.


Se continuando metti
Ditta   Id     NP          NF
A       3    002/10-3   002/10    va bene
se invece metti
Ditta   Id     NP          NF
A       3    001/10-3   002/10 duplicato nprotocollo
o
A       3    002/10-3   001/10 duplicato nfattura
o
A       1    002/10-1   002/10 duplicato ID (ma l'id non ha un
controllo visibile quindi non  può essere modificato)
Ciao Vladimiro e grazie per la pazienza.
Giuseppe.

 - Mostra testo citato -
Da quello che scrivi e da quello che interpreto, tu non hai bisogno di
avere la condizione di duplicati non ammessi su tre campi concatenati,
bensì su ogni singolo campo che in definitiva non sono più tre, in
quanto l'ID è nascosto, ma due (NProtocollo e NFattura).
E' così?
Ciao Vladimiro.


Sì i campi sono due. L'uno o l'altro sono indipendenti ed ognuno è
duplicato solo se la ditta è la stessa e il valore già esiste. Se
entrambi hanno un valore già esistente, allora i valori duplicati sono
2 (anche se con l'avviso sul primo controllo, non dovrebbe mai
verificarsi un doppio valore duplicato).
L'id (chiave primaria) è nascosto e ha come valore predefinito
=Nz(DMax("[id]";"[TBLfatture]");0)+1
Ciao Giuseppe.

 - Mostra testo citato -
Su prima di aggiornare della casella di testo NProtocollo inserisci:
Dim rs As DAO.Recordset
If IsNull(Me.NProtocollo) Then Exit Sub
Set rs = CurrentDb.OpenRecordset("select count(NProtocollo)" & _
" from tblAziende where NProtocollo ='" & _
Replace(Me.NProtocollo, "'", "''") & "'")
If rs.Fields(0) > 0 Then
MsgBox ("Attenzione, il protocollo inserito" & _
" è già presente in archivio!"), vbInformation
' ripristina il vecchio valore
Me.Undo
End If
rs.Close
Set rs = Nothing
e su prima di aggiornare della casella di testo NFattura inserisci:
Dim rs As DAO.Recordset
If IsNull(Me.NFattura) Then Exit Sub
Set rs = CurrentDb.OpenRecordset("select count(NFattura)" & _
" from tblAziende where NFattura ='" & _
Replace(Me.NFattura, "'", "''") & "'")
If rs.Fields(0) > 0 Then
MsgBox ("Attenzione, il numero della fattura inserito" & _
" è già presente in archivio!"), vbInformation
' ripristina il vecchio valore
Me.Undo
End If
rs.Close
Set rs = Nothing
Ciao Vladimiro

 " from tblAziende where NFattura ='" & _
con
" from tblfatture where NFattura ='" & _
e finalmente funziona.
Solo un'ultima domanda: perchè se dopo me.undo, inserisco
me.idazienda.setfocus
mi dice errore di run-time 2108, è necessario salvare il campo prima
di eseguire l'azione VaiaControllo o il metedo GoToControl o Setfocus?
Siccome si azzera anche l'idazienda, devo tornare indietro al
controllo manualmente.
Grazie.
Giuseppe.

 - Mostra testo citato -
Al posto di inserire la routine a Prima di aggiornare, la devi
inserire a Dopo aggiornamento e dopo il Me.Undo metti il focus dove
vuoi.
Ciao Vladimiro


Ora è tutto perfetto.
Grazie Vladimiro.
Giuseppe.

 ha scritto nel messaggio 
news:3d98e1f5-fabb-40a7...@o39g2000vbd.googlegroups.com...


Ora � tutto perfetto.
cos� sarebbe meglio.
ragazzi il quoting!! ... :D
ciao ad entrambi
Daniele