Newsgroup: it.comp.appl.access
Titolo: Errore 3420: l'openrecordset è corretto, ma A VOLTE ricevo l'errore

Ciao a tutti, ho già scritto qualche tempo fa in relazione a quest'errore, ma non si è 
arrivati a una risposta.
Ho fatto altri tentativi e prove, che esporrò di seguito, ma il problema rimane.
Da un mdb vengono letti i SN del prodotto in fase di produzione, e accedo a tabelle in un 
back end per recuperare certi dati.
Eseguo quindi un Openrecordset impostando via codice la stringa SQL, usando il SN come 
criterio.
Il codice è questo
mioSQL = "SELECT SN.SN_T, TI.NrImpegno " _
& "FROM TI INNER JOIN SN_T ON TI.IDImpegno = SN_T.IDImpegno " _
& "WHERE (((SN_T.SN_T)='" & [Forms]![miaForm]![txtSN] & "'));"
set rst = currentdb.openrecordset(miosql)
if not rst.eof then
    rst.movefirst
eccetera
Spessissimo, il movefirst provoca l'errore 3420 (Oggetto non valido o non impostato).
In quel caso verifico che la stringa SQL è corretta, ma effettivamente il recordset non è 
impostato.
Attenzione, se si chiude il messaggio di errore e si riprova SUBITO a leggere il SN, va 
tutto bene!!!
Infatti la connessione di rete è stabile.
Ho provato a passare dal wireless alla rete cablata, temendo dei timeout, ma non è il 
problema.
Inizialmente per gli openrecordset usavo una variabile (impostata = currentDB all'inizio 
della routine), ma non era la causa del problema.
Ho provato a usare una query parametrica, ma non risolve.
Io non so più cosa fare: le tabelle sono tutte accessibili, modi diversi per aprire un 
recordset non ne conosco...cosa può essere?
Uso Access 97 su Windows XP e Windows 2000.
Grazie
Alessio

 eccetera
[...]
Tempo addietro qualche rognetta l'ho avuta anch'io,
concernente i vari Move...
Non ricordo bene la tipologia ma ricordo bene
d'aver risolto con dbOpenDynaset:
Set rst = CurrentDB.OpenRecordset(SQL dbOpenDynaset)
Bruno 

Bruno Campanini ha scritto:

ma l'OpenDynaset non è comunque l'opzione standard dell'OpenRecordset? Comunque ho appena 
aggiunto la specificazione di tale opzione in tutti gli openrecordset della routine...tra 
poco sapremo il risultato.
Grazie mille.
Alessio

Hal ha scritto:

ciao di nuovo: ho aggiunto l'esplicita dichiarazione dell'opzione dbOpenDynaset ed ho 
impostato a nothing tutti i recordset all'uscita, cosa che prima non facevo.
Adesso invece che avere errore praticamente ad ogni esecuzione, l'ho solo una volta ogni 
5/6. Per carità, un bel miglioramento, ma forse allora il problema sta altrove?

 problema sta altrove?
Riguardando il tuo post iniziale:
set rst = currentdb.openrecordset(miosql)
if not rst.eof then
    rst.movefirst
eccetera
a che giova rst.MoveFirst?
Se hai appena aperto il recordset ti trovi già sul primo
record. Hai provato ad eliminarlo?
E poi perché testi l'EOF?
Se hai appena aperto il recordset non sarai mai a fine
file: sarai al primo record ovvero in BOF se non vi sono
record.
E se non vi sono record ti trovi in BOF, quindi
If Not rst.EOF è TRUE e la successiva istruzione
rst.MoveFirst ti dà errore perché proprio al primo
record non ci può andare.
Prova:
Set rst = CurrentDB.OpenRecordset(SQL, dbOpenDynaset)
If Not rst.BOF then
        eccetera
Bruno

 record non ci può andare.
Hai ragione, per fare il test sull'esistenza di record dovrei controllare BOF *e* EOF.
Ho appena inserito in tutti i controlli tale condizione.

 Ho appena inserito in tutti i controlli tale condizione.
Per controllare se esiste almeno un record ti basta,
senza alcun Move..., controllare se rst.RecordCount > 0.
Bruno 

Bruno Campanini ha scritto:

Uso il Move non per controllare se il recordset è vuoto, ma per far sì che il recordcount 
dia un valore corretto.
Dalla guida di Access 97 alla voce "REcordcount"
"La proprietà RecordCount non indica il numero di record contenuti in un oggetto Recordset 
di tipo dynaset, snapshot o forward-only scrolling finché non si è avuto accesso a tutti i 
record. Quando si è avuto accesso all'ultimo record, la proprietà RecordCount indica il 
numero totale dei record non eliminati nell'oggetto Recordset o TableDef. Per forzare 
l'accesso all'ultimo record, utilizzare il metodo MoveLast nell'oggetto Recordset."
;)
Alessio

 Recordset."
Ma sì, lo so che occorre andare a fine recordset.
Avevo scritto
"Per controllare se esiste almeno un record ti basta..."
                                      ^^^^^
non per contarli!
Bruno

Hal ha scritto:

Ho risolto!
Il problema sorge nel mio caso perchè lavoro con più di un recordset aperto 
contemporaneamente.
Non mi è mai successo prima, e spesso mi sono trovato a dover lavorare su più di un RST 
aperti contemporaneamente, ma evidentemente c'è qualche circostanza che porta Access a 
confondersi e considerare uno d'essi "non impostato".
La circostanza potrebbe essere l'uso di qualche campo di ugual nome in più di un 
recordset, ma questa è solo una mia supposizione.
Spero che questo post possa essere utile ad altri: facendo le mie ricerche non ho trovato 
alcuna risposta che mi abbia aiutato, quindi conto che farà comodo :)
Ciao a tutti
    Alessio