Newsgroup: it.comp.appl.access
Titolo: Sostituire messaggio di errore su combo con messaggio personalizzato

Salve,
Ho una maschera che ha come origine una query di selezione "Query1" in
cui vengono messe in relazione la tabella fatture e la tabella clienti
tramite il campo comune IDCliente.
Nella maschera, relativa alla Query1, ho una combo che ha come origine
il campo "IDCliente" della Query1 (che è quello della tabella fatture)
e come origine riga il seguente SQL:
SELECT T_Clienti.IDCliente, T_Clienti.NomeCliente ORDER BY
T_Clienti.NomeCliente;
La prima colonna della combo è nascosta, la seconda è visibile.
Se viene cancellato il nome cliente dalla combo e si passa ad un altro
controllo, viene visualizzato il seguente messaggio di errore:
"Impossibile assegnare il valore NULL ad una variabile non di tipo
variant."
Io vorrei cercare di sostituirlo con uno più comprensibile per
l'utente del db, ma non ci riesco in nessun modo. Ho provato nella
maggior parte degli eventi sia della maschera che della combo,
utilizzando sia "on error goto ecc." che "if isnull(Me!combo) then
ecc", ma sempre quel messaggio mi compare.
Qualcuno può darmi una mano ad intercettare questo messaggio di
errore?
Ho visto anche che si tratta dell'errore n. 3162, ma anche se specifico
l'err.number, il risultato non cambia.
Grazie.

 ha scritto nel messaggio 
news:1152371993.8...@m73g2000cwd.googlegroups.com...
Salve,
Ho una maschera che ha come origine una query di selezione "Query1" in
cui vengono messe in relazione la tabella fatture e la tabella clienti
tramite il campo comune IDCliente.
Nella maschera, relativa alla Query1, ho una combo che ha come origine
il campo "IDCliente" della Query1 (che č quello della tabella fatture)
e come origine riga il seguente SQL:
SELECT T_Clienti.IDCliente, T_Clienti.NomeCliente ORDER BY
T_Clienti.NomeCliente;
La prima colonna della combo č nascosta, la seconda č visibile.
Se viene cancellato il nome cliente dalla combo e si passa ad un altro
controllo, viene visualizzato il seguente messaggio di errore:
"Impossibile assegnare il valore NULL ad una variabile non di tipo
variant."
Io vorrei cercare di sostituirlo con uno piů comprensibile per
l'utente del db, ma non ci riesco in nessun modo. Ho provato nella
maggior parte degli eventi sia della maschera che della combo,
utilizzando sia "on error goto ecc." che "if isnull(Me!combo) then
ecc", ma sempre quel messaggio mi compare.
Qualcuno puň darmi una mano ad intercettare questo messaggio di
errore?
Ho visto anche che si tratta dell'errore n. 3162, ma anche se specifico
l'err.number, il risultato non cambia.
Grazie.
... potresti postare il codice su :  OnError Goto  ?
Ivan 

 Ivan
Già fatto, ma mi compare sempre quel messaggio.


Per tagliare la testa al toro, potrei impostare la variabile cui il
messaggio si riferisce come variant, ma non so come fare.

 
Come e' definito il campo in tabella? Ha un default? Genera 
automaticamente il combo? (propendo per questa seconda ipotesi).
--
ac

robb ha scritto:

Forse non ho capito io, ma oltre essere basata sulla QUERY 1 questa
Combo è associata
anche ad un campo nella Tabella....?
Se si, e dovedde essere la PK ovviamente è un problema....!
Si usano Combo non associate in questo caso, ma non ho capito cosa devi
fare...!
In ogni caso per gestire il NotINlist ed anullarne l'errore in una
combo si fà così:
' Nel caso l'utente inserisca valori <NON in Elenco> nelle Combo(s)
Private Sub Form_Error(DataErr As Integer, Response As Integer)
  If DataErr = 2237 Then
        Response = acDataErrContinue
        Screen.ActiveControl.Undo
  Else
        Response = acDataErrDisplay
  End If
End Sub
Vedi se variando l'Error Code puoi risolvere...!
@Alex


Il campo IDCliente, che è la prima colonna della combo (nascosta) è
un campo di tipo contatore.
La combo ha come origine il campo IDCliente della query Q_Fattura,
nella quale vengono messe in relazione, tramite il campo comune
IDCliente, la tabella Fattura e la tabella Clienti.
Ho copiato in maniera pressoché identica dal database di esempio
Northwind.
L'unica differenza, forse fondamentale per risolvere questa situazione,
è che nel db Northwind il campo IDCliente è di tipo testo, mentre nel
mio db è di tipo contatore.
Infatti nel db Northwind compare il messaggio di errore personalizzato
(impostato sull'evento beforeupdate della combo), mentre nel mio db,
anche se impostato in maniera identica, non compare ed esce fuori quel
messaggio.
Il fatto è che mi serve avere quel campo come contatore. Non posso
metterlo di tipo testo. Quindi vorrei sapere se esiste un modo per
intercettare quell'errore e sostituirlo.

 @Alex
Ciao Alex, hai scritto mentre rispondevo ad Alessandro Cara e non ho
letto il tuo messaggio.
Il problema non è legato all'evento NotInList, ma viene fuori quando
il campo cliente viene lasciato Null.
Come ho detto nel messaggio di risposta ad A. Cara, il procedimento che
ho usato è copiato in maniera identica dal db NorthWind.
Se tu, nel db Northwind, apri la maschera Ordini e lasci vuoto il campo
cliente ("Fatturare a:"), compare un msgbox personalizzato.
Nel mio db, pur avendo impostato il msgbox in maniera identica,
continua a comparire l'errore 3162.
Adesso ho scoperto che questo avviene perché nel mio db, a differenza
di quello Northwind, il campo IDCliente è di tipo contatore.
Poiché mi serve tenerlo come contatore, esiste un modo per
intercettare l'errore 3162?
Se vuoi fare una prova di ciò che ti ho detto, apri il db Northwind e
imposta il campo IDClienti della tabella Clienti come contatore, poi
imposta il campo della tabella Ordini come numerico.
Apri la maschera Ordini e lascia Null la combo IDCliente e spostati su
un altro controllo. Vedrai che comparirà il fatidico messaggio 3162.

robb ha scritto:

Io ho letto quanto dicevi, ma tu hai capito quello che ti suggerivo
io...?????
Ci riprovo intercetta l'evento a livello di FORM non di controllo:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
   If DataErr = 3162 Then
         Msgbox "ERRORE 3162 FAI QUELLO CHE VUOI"
         'Response = acDataErrContinue
         'Screen.ActiveControl.Undo
   Else
         Response = acDataErrDisplay
   End If
End Sub
@Alex

 @Alex
Scusami Alex, mi ero dimenticato di togliere l'apice prima di "Response
= acDataErrContinue" e continuava a comparirmi il messaggio di errore
3162.
Ti ringrazio molto. Funziona perfettamente.
Ciao
Robb