Newsgroup: it.comp.lang.visual-basic
Titolo: errore 80040e21

Salve,
ho letto sul NG che l'errore in oggetto viene fuori quando si cerca di
assegnare un valore troppo grande ad un campo di una tabella.
Il mio problema e' che nel mio caso viene fuori quando eseguo
un'istruzione tipo:
  "If CDate(Reco.Fields("Data_Open")) Then"
oppure se assegno il contenuto di Data_Open ad una variabile, es.:
  pippo=Reco.Fields("Data_Open")
dove pippo e' una variabile "variant".
Ho provato a vedere il contenuto del campo Data_Open con l'istruzione
"msgbox", ma non viene fuori nulla!!!!
Io credo che il problema sia il contenuto di Data_Open per uno
specifico record, e' possibile che contenga qualche carattere che fa
"saltare" il programma.
Ho fatto la prova eliminando il record che crea problemi ed il
programma non da' errore!!
Come posso gestire l'errore controllando il contenuto del campo
Data_Open???
Grazie
Ciao
Donatella :)

 Donatella :)
Ah, si? e Corrado chi č?
Ciao-
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 dove pippo e' una variabile "variant".
Ho i brividi.
Iniziamo ipotizzando che il campo non sia NULL.
Supponendo che sia valorizzato, occorre che sia di tipo Date, oppure di 
tipo Stringa ma con formattazione identica alle impostazioni 
internazionali dell'utente con cui VB cerca di eseguire il CDate.
Ma siccome ne fai un CDate, è evidente che il campo non può essere di 
tipo Date, altrimenti staresti facendo un'operazione inutile 
(equivarrebbe ad innestare un CStr di un Date all'interno di un CDate, 
per riavere un Date dopo essere passati per una stringa).
Il problema del Pippo= fa pensare ad un Null, ma avrai già verificato.
Aggiungerei anche un .Value qua e la...
Alberto
-- 
Henry David Thoreau: L'uomo è tanto più ricco quanto meno costano i 
suoi piaceri.


Ciao yronium e Alberto,
in effetti le informazioni erano poche!!!
Mi collego a Sybase SQL Anywhere Database Engine Version 5.5.04 con
l'istruzione
Set Conn = New ADODB.Connection
Reco.Open StringaSQL, Conn, adOpenStatic
Reco.MoveFirst
filenum = FreeFile
FileTXT = App.Path & "\DatiDaInviare\" & NomeTabella & ".txt"
Open FileTXT For Output As #filenum
 While Not (Reco.EOF)
   StringaValori = ""
   For i = 0 To UBound(ArrVar)
     StringaValori = StringaValori & Reco.Fields(LTrim(ArrVar(i))) &
vbTab
   Next i
   Print #filenum, StringaValori
   Reco.MoveNext
 Wend
Close #filenum
Reco.Close
ArrVar e' un array che contiene l'elenco dei campi del recordset.
Questo e' il codice, ossia leggo i record del recordset e uno alla
volta li scrivo su un file di testo.
Quando arrivo ad un determinato record (sempre lo stesso!!) viene
evidenziata in giallo l'istruzione:
StringaValori = StringaValori & Reco.Fields(LTrim(ArrVar(i))) & vbTab
con l'errore:
errore di run-time '-
2147217887
(80040e21)':
Si sono verificati errori in un'operazione composta da piu' passaggi.
Controllare i singoli valori di stato.
Ho provato a saltare l'istruzione per il record che crea problemi e
tutto funziona perfettamente.
Ora quello che chiedo e':  come faccio a capire qual'e' il contenuto
del campo che da' problemi e di conseguenza gestire l'errore che viene
fuori???
Ho provato con MsgBox Reco.Fields(LTrim(ArrVar(i))), ma non viene
fuori nulla
Grazie per l'aiuto
Ciao
Donatella

 StringaValori = StringaValori & Reco.Fields(LTrim(ArrVar(i))) & vbTab
...
Beh, sai gia' molto...
quando va in errore puoi sapere quale e' il record che ti da il problema,
poi se vai a vedere quanto vale la tua I, sai anche quale e' il campo di
quel record che ti da il problema.
A quel punto penso tu possa andare a vedere il contenuto del campo del
record che ti da problemi, e capire cosa c'e' che non va.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Bene, ora va meglio.

Ok, questo è un errore ADO. Di solito questo errore avviene nel momento n
cui ADO si collega al database e dipende da un'incongruenza tra i dati nel
database e i dati che gli vengono passati. Ad esempio, se un campo è
preogettato per contenere il tipo di dati Date, e tu gli passi
CDate("roberto") lui non riesce a fornire una data valida riconosciuta dal
campo, così appena ci prova il campo restituisce l'errore.
Quando il meccanismo VB è progettato male - per esempio, un campo numerico
intero a cui viene assegnato il valore di una variabile stringa - questo
errore avviene sistematicamente per ogni record, perché ad ogni record VB
tenta di passare un valore non valido.
Invece nel nostro caso l'errore avviene soltanto in un (o più) determinato
record. Significa che ciò che viene passato a quel campo di solito va bene,
ma può anche assumere un valore che tu non avevi previsto e che il campo non
accetta, e questo si è verificato nel/nei record dove è avvenuto l'errore.
Come diceva Alberto, spesso il responsabile di questa situazione è un valore
Null: tu stai passando un valore Null ad un campo e lui non lo accetta. Ma
ci sono anche altri fattori frequenti, non ultimo l'annoso problema degli
apostrofi nel contenuto del campo (avviene con certi dbms quando si passa
"L'Aquila").
Se fosse il contenuto del campo che è Null, il problema si risolve con
StringaValori = StringaValori & Reco.Fields(LTrim(ArrVar(i))).Value & ""
ma non credo che si tratti di questo perché l'errore lo restituirebbe VB e
non ADO.
Invece, riguardando il tuo codice ho la sensazione che sia la tua istruzione
LTrim(ArrVar(i)) che restituisce un Null, e in quel caso ad ADO verrebbe a
mancare il nome del campo. Cosa succede se fai
MsgBox LTrim(ArrVar(i))
o anche
MsgBox ArrVar(i)
?
In questo caso il problema non dipenderebbe dal record ma dal valore di i,
perché evidentemente non tutte le righe della matrice ArrVar contengono
valori. Se è così devi testare il contenuto della matrice prima di passare
il nome del campo alla proprietà Reco.Fields(....)
Come ti ha suggerito Mizio, quando ricevi l'errore puoi testare il valore di
ogni variabile perché il codice si interrompe e la riga diventa gialla. Se
mentre l'esecuzione è interrotta passi con il mouse sopra ogni variabile ne
vedi il valore corrente, e se nella finestra Immediata scrivi ?ArrVar(i)
oppure ?i e premi Invio puoi conoscere il contenuto della cella corrente
della matrice o il valore del contatore i. Puoi usare questa tecnica anche
al posto delle istruzioni MsgBox che abbiamo visto sopra. Continua a fare
tentativi mentre l'esecuziuone è interrotta, e modifica le tue istruzioni
finché non trovi ciò che causa l'errore. Per procedere con il codice passo
passo premi F8, e per tornare indietro di qualche istruzione, clicca col
destro sulla riga dove ti vuoi spostare e scegli Istruzione successiva nel
menu contestuale.
Spero sia utile. Ciao.
