Newsgroup: it.comp.lang.visual-basic
Titolo: Problema di navigazione con Recordset ADO

Un saluto a tutti i partecipanti al NG.
Sull'evento Foarm Load apro il Recordset, dichiarato a livello di modulo,
con le caratteristiche :
rs.cursortype = adopenkeyset
rs.cursorlocation = aduseclient
recordset solo lettura
con un ciclo assegno i Fields del recordset ai miei controlli.
Sui pulsanti di navigazione mi muovo :
if not rs.eof then rs.movenext - ecc.
Quando navigo e giungo al termine del recordset il comando di navigazione mi
genera il seguente errore :
Errore di run-time -
2147217842
 (80040e4e)
Operation was canceled.
Quale potrebbe essere la causa.
Qualcuno ha mai incontrato lo stesso problema ?
Grazie per qualsiasi suggerimento.
Ciao - Daniele

 Operation was canceled.
Se il recordset è di sola lettura e ti serve solo per popolare i
controlli, impostalo a ForwardOnly che è più veloce.
Cmq, che istruzione ti genera l'errore? Il MoveNext?
Che Database usi?
Ciao.

 Qualcuno ha mai incontrato lo stesso problema ?
No, hai provato a disconnettere il recordset?
Set Rs.ActiveConnection = Nothing
Non è che fai qualche altra operazione oltre al Rs.MoveNext?
Cioè questo darebbe errore (ma comunque non il tuo)
if not rs.eof then rs.movenext
if not isnull(rs.Fields(0).value) then
  msgbox "Non Nullo"
Else
  msgbox "Nullo"
endif

 Operation was canceled.
Se il recordset č di sola lettura e ti serve solo per popolare i
controlli, impostalo a ForwardOnly che č piů veloce.
Cmq, che istruzione ti genera l'errore? Il MoveNext?
Che Database usi?
Ciao.
Ciao Barzo
Il recordset mi serve di supporto ad una form pertanto devo permettere
all'utente di navigare.
L'errore mi viene generato da qualsiasi movimento nel recordset previous -
next - first - last.
il DB č Access 2000.
Ciao - Daniele

"Andrea [Work]" <nos...@invalid.invalid> ha scritto nel messaggio
news:5xi42028n49d$.q4ikyqh4vvy6.dlg@40tude.net...

Ciao
Non capisco la finalità pratica di disconnettere il recordset. Scusami ma
puoi essere più esplicito ?
Oltre al movenext, assegno un nuovo recordset ad un Datagrid che rappresenta
un dettaglio righe di un ordine principale.
Mi stai suggerendo di ciclare sulla collection Fields per verificare se
qualche valore è nullo ?
Ciao - daniele

 qualche valore è nullo ?
No era per dire che se fai il controllo
if not rs.eof then rs.movenext
e poi usi Rs è normale dia errore.
Invece dovresti fare
if not rs.eof then
  rs.movenext
  Altre operazioni che usano Rs
endif
In ogni caso se usassi SELECT, INSERT, UPDATE sicuramente avresti meno
problemi, piuttosto che usare i recordset.
Prova a postare il codice di un pulsante completo e la riga dove ti da
errore.

 endif
Anzi ovviamente sarebbe:
if not rs.eof then
  Altre operazioni che usano Rs
  rs.movenext
endif

"Andrea [Work]" <nos...@invalid.invalid> ha scritto nel messaggio
news:16vzdpf1pcjss$.10176pvky518s$.dlg@40tude.net...

anche muovendomi nel recordset così :
With rs
.MoveNext
If .EOF Then
.MoveLast
End If
End With
mi da comunque errore.
l'assegnazione del recordset al Datagrid avviene con questo codice che è la
continuazione del codice di movimento nel recordset MoveNext:
If rsmixer.State = adStateOpen Then (recordset dichiarato a livello di
modulo)
    rsmixer.Close
End If
Dim sqlmixer As String
sqlmixer = "SELECT Mixer.IdInvoice, Mixer.IdRighe, " _
& "Righe.Description, Righe.Category, Righe.Quantity, Righe.UnitPrice, " _
& "Righe.ProductDiscount, Righe.TotalAmount FROM Righe INNER JOIN Mixer " _
& "ON Righe.IdRiga = Mixer.IdRighe WHERE (((mixer.IdInvoice) = " & Me!InvNum
& "))"
rsmixer.CursorType = adOpenKeyset
rsmixer.CursorLocation = adUseClient
rsmixer.Open sqlmixer, cn, , adLockReadOnly
Set dg1.DataSource = rsmixer
L'approccio alternativo con SQL è possibile, ma prima di cambiare il codice
volevo capire se potevo risolvere il problema in maniera più veloce.
Grazie per l'aiuto.
Ciao Daniele

 volevo capire se potevo risolvere il problema in maniera più veloce.
A cosa ti serve AdUseClient?
Dato che è in sola lettura io farei la select e popolerei la griglia (anche
una MSFlexGrid al limite mi pare che la DataGrid sia solo Bounded, o una
ListView), non ti serve tenere un recset aperto sul DB, specialmente se in
sola lettura.
Volendo ti fai una funzione a cui passi RecSet e ListView e ti carica
automaticamente i dati e struttura. E la riusi quando vuoi.

 volevo capire se potevo risolvere il problema in maniera più veloce.
A cosa ti serve AdUseClient?


 automaticamente i dati e struttura. E la riusi quando vuoi.
uso un Datagrid perchč non conosco MSFlexGrid. Mi puoi consigliare un sito
dove trovare qualche informazione su questo controllo ?
Ciao - Daniele

 dove trovare qualche informazione su questo controllo ?
Bhe dai componenti aggiungi:
Microsoft FlexGrid Control
oppure
Microsoft Hierarchical FlexGrid Control
(questa la puoi collegare direttamente a un RecSet col DataSource).
Le aggiungi in una form, selezione e fai F1.
Per la seconda per provare fai:
Set MSHFlexGrid1.DataSource = rsmixer
(magari prova senza adUseClient)
Trall'altro ho provato a distruggere il RecSet dopo e i dati sono rimasti.
Altrimenti popoli a mano Con il metodo
MSHFlexGrid1.AddItem

 MSHFlexGrid1.AddItem
provo a studiarmi un pò il MSFlexGrid. Funziona sia unbound che bound ?
Ciao - Daniele


Ciao Andrea
Ho scomposto le mie routine in routine più piccole per verificare ogni
singola operazione e finalmente ho scoperto che ogni movimento del recordset
movenext oppure moveprevious attivava l'evento "change" di una textbox che
attribuiva valori ad altri controlli. questo evento causava l'errore.
Ti ringrazio per l'aiuto che mi hai dato e ti saluto cordialmente.
Ciao - Daniele

 provo a studiarmi un pò il MSFlexGrid. Funziona sia unbound che bound ?
La FlexGrid normale non è mai agganciata ad un RecSet.
La MSHFlexGrid si assegna ad un recordset, ma poi non so come si comporta,
ho visto che c'è un metodo Refresh, ma non l'ho mai usata.

 Ti ringrazio per l'aiuto che mi hai dato e ti saluto cordialmente.
Di niente, ciao