Newsgroup: it.comp.lang.visual-basic
Titolo: Puntatore Recordset ADO

Buonasera a tutti,
programmo con vb6 e ado e sto leggendo un database access che interrogo 
tramite una query di estrazione.
Una volta scremati i record, secondo criterio, mi trovo un set di 5 
records che carico ad uno ad uno nei controlli textbox del form.
Fin qui ok, non fosse altro per il problema con le proprietà EOF e BOF 
che non riesco ad impostare. Scrivo così:
select * from tabella
RStemp.Source = sSql
     RStemp.ActiveConnection = CnStore
     RStemp.Open
.movelast
.movefirst
textA.text = Rstemp!Codice
...........etc etc...
Poi vorrei spostarmi al record successivo quindi ho messo due command 
btn, e ho scritto questo codice
If Not RStempArt.EOF Then
RStempArt.MoveNext
CaricaRecord
end if
...
ma il fatto è che non punta affatto l'ultimo record, ma me ne 
restituisce uno vuoto e poi l'errore. E questo lo fa anche sulla 
proprietà EOF
Potreste per favore indicarmi dove sbaglio?
Grazie
Buon Lavoro

 Potreste per favore indicarmi dove sbaglio?
Confesso di avere capito molto poco del tuo scenario.
Alberto


Alberto mi scuso con te e con tutti se sono stato poco chiaro, ho 
saltato alcuni passaggi immaginando che fossero scontati o non necessari 
alla risoluzione del problema. Riconsidero lo scenario in maniera piï¿œ 
completa:
apertura recordset
Set RStempArt = New ADODB.Recordset
     RStempArt.CursorType = adOpenStatic
     RStempArt.CursorLocation = adUseClient
     RStempArt.LockType = adLockPessimistic
     RStempArt.Source = sSql
     RStempArt.ActiveConnection = CnStore
     RStempArt.Open
RStempArt.MoveLast
RStempArt.MoveFirst
text_A.text = Val(RsArt!Codice)
text_B.text = RstempArt!Descrizione
parlavo di due pulsanti per andare sia indietro che avanti di un record
CmdNext
If (RStempArt.EOF) Then RStempArt.MoveLast
RStempArt.MoveNext
text_A.text = Val(RsArt!Codice)
text_B.text = RstempArt!Descrizione
e la stessa cosa effettuo sul cmdprev
If (RStempArt.BOF) Then RStempArt.Movefirst
RStempArt.Moveprevious
text_A.text = Val(RsArt!Codice)
text_B.text = RstempArt!Descrizione
Scritto cosï¿œ, il puntatore procede ugualmente e viene generato un errore.
Spero di essermi spiegato un pï¿œ meglio.
Grazie

 Grazie
Proviamo.
Alberto

Il 31/08/2011 16:50, Johnny At Work ha scritto:
CUT
Ho risolto anteponendo l'istruzione di avanzamento prima della verifica
RStempArt.MoveNext
If Not (RStempArt.BOF And RStempArt.EOF) Then RStempArt.MoveLast
Così funziona.
Grazie per il suggerimento.

 Ribadisco il consiglio di usare Set.
Scusa Alberto, ma non capisco come usare SET e dov'è l'errore se di 
errore si può parlare.
Jo

Johnny At Work ha pensato forte :

Veramente quel check era per individuare i recordset vuoti.
Che funzioni fatto così è veramente strano, teoricamente se clicchi due 
volte su cmdnext dovrebbe andare in errore...
Alberto

Sembra che Johnny At Work abbia detto :

.Connection è un puntatore ad un oggetto, non è una stringa.
Poi, se viene usato brutalmente come stringa, VB6 (che, ripeto, è 
troppo buono con queste cose che andrebbero cassate), si adegua e 
inventa.
Il tuo
RStempArt.ActiveConnection = CnStore
viene in realtà eseguito come
RStempArt.ActiveConnection.ConnectionString = CnStore.ConnectionString
La differenza non è capziosa.
Per due motivi:
1) ConnectionString è una Property, non è un elemento di una Struct, e 
quindi la sua lettura non riporta necessariamente ciò che vi è stato 
scritto dentro. Quindi, non è detto che la ActiveConnection di RSTemp 
abbia le stesse caratteristiche di connessione di CnStore. Un esempio 
lampante è nei casi di connessione a dbms dove sia disabilitato il 
PersistSecurityInfo.
2) Ado potrebbe (e lo fa) aprire una nuova connessione simile a 
CnStore, apposita per RSTemp, anzichè riutilizzare la stessa CnStore. 
Il che significa allocare risorse.
E' più corretto usare:
Set RStempArt.ActiveConnection = CnStore
Alberto


Ti ringrazio davvero tanto per questa esaustiva spiegazione. Applicherò 
immediatamente il suggerimento modificando il codice. E' il limite di 
imparare da autodidatta e spesso di non approfondire alcuni concetti, 
almeno fino a quando non capita il confronto.
grazie ancora
Jo


Ehm...no, non ho errori se scritto cosi come segue
RStempArt.MoveNext
If RStempArt.EOF Then RStempArt.MoveLast
...CaricamentoRecord....
E sbagliato? Spero di no...

 E sbagliato? Spero di no...
E' sbagliato perchï¿œ se arrivi lï¿œ che sei giï¿œ su EOF, va in errore.
Il tutto sta in piedi perchï¿œ 'in questo momento' non hai altri punti 
dove puoi andare su Eof.
Ma ï¿œ come andare forte su una strada ghiacciata: non hai problemi 
finchï¿œ vai dritto e non devi frenare. E quindi ti sembra che sia tutto 
a posto, ma sei a rischio.
Non capisco perchï¿œ mettere un banale Else in quello che avevi scritto 
prima non ti piaccia...
Comunque chiudo, sto uscendo.
Alberto


Grazie di cuore
Johnny

 caricaRecord?
Adesso, capisco che tu stia sviluppando per imparare o per diletto, 
però almeno datti la pena di leggere, e magari rileggere, prima di 
scrivere qualche riga a caso e poi chiedere "va bene così?".
Mia figlia di 8 anni quando fa i compiti con la mamma, spara una 
risposta a caso e si gira per vedere se la mamma annuisce. Se non 
annuisce, ne spara un'altra a caso. Finchè prima o poi ci prende.
Ecco, mi ricordi lei.
Alberto