Newsgroup: it.comp.appl.access
Titolo: [LONG] controllo su campo già inserito

Ciao a tutti.
Ho un problema. Cercherò di dettagliarlo il più possibile perché proprio
non riesco a venirne fuori (con un esempio semplificato, però).
Ho due tabelle:
tabMedici			tabPazienti
idMedico (Primary Key)		idPaziente (Primary Key)
cognome				idMedico (Required)
nome				codicefiscale (Unique, Required)
reparto				cognome
				nome
Le tabelle sono in relazione 1 a molti sul campo idMedico (integrità
referenziale applicata con aggiornamento ed eliminazioni a catena).
Inoltre ho due maschere (frmMedici e frmPazienti) relative alle due
tabelle. La maschera frmMedici ha un pulsante che apre (in modalità
DataEntry "True" e con Cycle - Sequenza impostata a "Record corrente",
così da creare 1 solo record) la maschera frmPazienti. Inoltre forza nel
campo idMedico il valore corrente proprio. Per capirci meglio:
Private Sub cmdInserisciPaziente_Click()
	'Apro la maschera in modalita DataEntry "True"
	DoCmd.OpenForm "frmPazienti",,,, acFormAdd
	'Creo il collegamento con il record corrente nella maschera frmMedici
	Form_frmPazienti.idMedico = idMedico
End Sub
E fin qui nessun problema.
I problemi sorgono quando, inserendo un paziente si immette un
codicefiscale che risulta già presente nella tabella tabPazienti.
Infatti io vorrei poter intercettare la cosa e intervenire senza
generare errori o messaggi di avviso.
Quindi, sull'evento codicefiscale_BeforeUpdate (e ringrazio Roberto -
Syd per avermi segnalato l'errore di usare AfterUpdate) inserisco il mio
codicino:
Private Sub codicefiscale_BeforeUpdate(Cancel As Integer)
 
	'Controllo l'esistenza di un codice fiscale uguale
	Dim strCriterio As String
	strCriterio = "codicefiscale = """ & codicefiscale & """"
	If DCount("idPaziente", "tabPazienti", strCriterio) > 0 Then
		'Trovato un codice fiscale uguale, avviso l'utente
		If MsgBox("Il codice fiscale digitato risulta già inserito. Si
desidera richiamare i dati relativi?", vbOKCancel + vbExclamation,
"Attenzione") = vbOK Then
			'L'utente ha deciso di richiamare i dati.
			'Annullo l'immissione del dato
			Me.Undo
			'Applico il filtro e impedisco modifiche
			Me.Filter = strCriterio
			Me.FilterOn = True
			Me.AllowEdits = False
		Else
			'L'utente ha deciso di non richiamare i dati. L'azione
			'ideale da compiere è quella di evidenziare il codice fiscale
			'immesso per farlo sostituire
			Cancel = True 
			codicefiscale.SetFocus
			codicefiscale.SelStart = 0
			codicefiscale.SelLength = Len(codicefiscale.Text) - 1
		End If
	'Se il conteggio risulta uguale a zero non dobbiamo fare niente.
	End If
End Sub
La cosa sembra effettivamente funzionare (e funziona davvero nel caso in
cui l'utente decide di cliccare OK e richiamare i dati). Se l'utente,
però, sceglie Annulla (si accorge cioè di aver sbagliato a scrivere il
codice fiscale e ne vuole inserire un altro), appena si esce dalla Sub,
viene visualizzato un msg:
"Il valore contenuto nel campo o record viola la regola di convalida per
il record o campo.
E' possibile, ad esempio, che sia stata cambiata una regola di convalida
senza verificare la corrispondenza dei dati esistenti con la nuova
regola di convalida.
Scegliere Annulla dal menu Modifica per ripristinare il valore
precedente oppure immettere un nuovo valore che soddisfi la regola di
convalida per il campo."
Cliccando su OK, si torna alla maschera con codicefiscale evidenziato e
da qui si può continuare sostituendo il codice e andando avanti.
Ma perché esce questo caz.. di msg?
Facendo delle prove ho visto che si tratta dell'errore 2116 della
maschera (non intercettabile dal codice del controllo codicefiscale ma
dalla routine Form_Error), e alla fine lo gestisco da qui. Ma mi
spiegate perché si verifica??
Grazie a tutti in anticipo.
giaconet
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 il record o campo.
A mio avviso quel me.undo e' messo nella parte sbagliata dell'If, mettilo
dopo l'ELSE.
Sib

"Sib" <si...@SPAMiol.it> ha scritto nel messaggio
news:r0Li8.16954$tC3.4...@twister1.libero.it...

Se non lo metto nel ramo If al momento del filtro ho un errore. Infatti
prima di applicare il filtro Access tenta di salvare il record ma
quest'ultimo ha il codice fiscale uguale ad uno già presente, ed il campo
codicefiscale la proprietà di non avere duplicati ho un errore.
Se lo metto nel ramo Else ho un altro comportamento non voluto: nella
maschera frmPazienti, fino a quel momento, i campi che hanno valore diverso
da null sono i seguenti: idMedico (l'ho imposto io nel momento in cui ho
premuto il pulsante), idPaziente (è un contatore, si è autoaggiornato nel
momento in cui ho imposto il valore di idMedico), codicefiscale (l'ha messo
l'utente). Se faccio Me.Undo li cancello tutti e tre e perdo il valore di
idMedico.
Cmq, grazie.
Bye
giaconet

 idMedico.
Daccordo, lascia quello e metti me.codFiscale.undo dopo l'else.
Sib