Newsgroup: it.comp.lang.visual-basic
Titolo: [LUNGO]ORA tarda e Connessioni di ADO e recordset che non si aggiornano

Posto questa parziale soluzione...
Il sonno mi attanaglia ma purtroppo un lavoro va consegnato e anche se
domani mattina non sarà consegnato....almeno limitiamo i danni!
Però complice anche l'ottundimento da superlavoro di Morfeo....
Vi posto un po di codice
Posto il tutto più che come domanda, come FAQ per i newbie
VB6 sp5 ADO2.7 WinXpPro Access2000
Private Function TrovaUscita(Optional Contratto As String = "") As Boolean
'Trova le uscite attualmente memorizzate
Dim fSql As String
fSql = "SELECT  ComposizionePagine.Tipologia, Tipologia.Descrizione,
ComposizionePagine.Moduli, ComposizionePagine.superioreMezza,
...insomma...CUT...qui c'è una query!..una grande query!
fSql = fSql & " ORDER BY ComposizionePagine.anno, ComposizionePagine.mese,
ComposizionePagine.Tipologia"
If tCn.State = adStateOpen Then
    tCn.Close
End If
DoEvents
Set tCn = ApreConn 'Function che apre una conn e restituisce un oggetto
connection
Set Urs = ApreRec(fSql, tCn, adOpenKeyset, adLockReadOnly)'function che
ritorna il recordset
If Urs.BOF Then
    Testo = "Attenzione!" + vbCrLf + "Nessun dato in archivio per l'uscita
impostata " & CStr(Me.cmbMeseUscita.Text) & "/" &
Trim(Me.txtAnnoUscita.Text)
    MsgBox Testo, vbInformation + vbOKOnly, "Nessuna uscita trovata"
    TrovaUscita = False
Else
    Urs.MoveFirst
'DEBUG DI QUELLO CHE C'E' NELLA TABELLA
    Do
        Debug.Print Urs("Idprog"); " - "; Urs("Immagine")
        Urs.MoveNext
    Loop Until Urs.EOF
    Urs.MoveFirst
    DoEvents
    Set gridUscite.DataSource = Urs
    SetGridAnnunci True
....ETC ETC ETC....
End Function
Cosa succede? succede che io aggiorno (in altra function) la tabella
richiamo sta routine e prrrrr ...non si vedono i nuovi record o quelli
memorizzati!
I dati son visualizzati in una Hflexgrid!
Se aspetto un po e la reinvoco..OK...oppure se chiudo e apro di nuovo OK!
Ve l'ho detto...ho sonno!...quindi è mezzora che ci sbatto contro ...poi il
lampo!
If tCn.State = adStateOpen Then
    tCn.Close
End If
DoEvents
Set tCn = ApreConn
bastavano queste 3 linee...infatti in origine faceva l'inverso...se la conn
è chiusa aprila!
Sigh...più sotto c'è il
    Do
        Debug.Print Urs("Idprog"); " - "; Urs("Immagine")
        Urs.MoveNext
    Loop Until Urs.EOF
L'ho usato per fare delle prove e ho scoperto che DEVO chiudere la
connessione e riaprirla se voglio che SENTA le modifiche!
BENE l'importante è risolvere!!!
ORA LA DOMANDA!
Ora mi piacerebbe sapere il perchè di tutto ciò!
La sequenza logica del mio programma  è
a) Trova i dati con una query (recordset readOnly) Connessione Cn1
b) Popola la griglia
c) Invoca la variazione/introduzione (recordset Keyset Optimistic)
    Connessione Cn2
   Chiude tutto all'uscita della funzione!Recordset e connection Cn2
d) Chiama la routine sopra (recordset ReadOnly connessione Cn1)
Se l'aggiornamento lo fa su una conn diversa e la distrugge (cn2)...sembra
che la vecchia (Cn1) ci metta un po a rendersi conto che la tabella che ha
aperto è cambiata.
Il paradosso per me è che può anche esistere una cache (e sicuramente
c'è)...ma dovrebbe seguire le sorti del recordset no???
Perchè non basta chiudere e riaprire il recordset ...ma devo proprio
chiudere e riaprire la connessione?...devo giocare con qualche opzione o
parametro della conn?
Non c'è verso fare un flush o qualcosa di simile senza chiudere e
riaprire???
Se è un problema di tempistica non c'è verso disabilitare questa cache?
Tanto per disamina
Apro e chiudo Conn con....
Public Function ApreConn(Optional LatoConn As Long = adUseServer) As
ADODB.Connection
Dim T As String
Dim cn As New ADODB.Connection
T = "Provider=Microsoft.Jet.OLEDB.4.0;"
T = T & "Data Source=" & App.Path & "\archivio\DBmar01.mdb" & ";Persist
Security Info=False"
cn.ConnectionString = T
cn.CursorLocation = LatoConn
cn.Open
Set ApreConn = cn
End Function
Scusate la lunghezza e forse la confusione...casco dal sonno!....
Buona notte!
:-)

 la conn è chiusa aprila!
Non specifichi le modalità di apertura, presumo quindi che prenda il default
che, se non sbaglio, è adOpenForwardOnly, comunque non credo che sia
importante.
Credo che il problema stia, esclusivamente, nella griglia bound-ata. Fai le
stesse prove osservando esclusivamente il recordset composto. Deve andare
senza problemi (e senza DoEvents).

Vedi anche il 3d:
[!] Problema gravissimo ADO: la risposta!

il problema come già ha esposto lupo .. è la griglia ..
anche io avevo il tuo stesso problema .. ma purtroppo non c'è verso di
poterlo risolvere in maniera elegante, in quanto (almeno da quello che sono
riuscito a capire) è un problema di temporizzazione ..
la mia soluzione era stata:
1) nascondi griglia
2) movimenti della griglia
3) rivisualizzazione griglia
[t]Eo
--
|| TORNO SUBITO ||
" .. Sono fuori di testa. Tornerò tra cinque minuti .."


si incasina nell'assegnare con il datasource vero....(vedete lamers e newbie
...per una volta che volevo fare una scorciatoia!!!)
nel senso che se chiudo la connessione e  la riapro probabilmente fa
immediatamente il refresh della cache !
Ragionamento a voce alta....
Quello che non mi torna...ma forse bevono ha ragione Lupo....
è che sta cache sarebbe (almeno per me) più logico che seguisse il recordset
e non la conn
Dovrebbe bastare chiudere e riaprire il recordset per aggiornare la
cache...la conn non dovrebbe essere chiusa...
A meno che sia l'oggetto conn che gestisce la cache (ecco che mi torna anche
il nome connection pooling) e il recordset solo l'organizzazione dentro la
cache dei dati....
Sta a vedere che è proprio così...mmm ci sarò verso aggieggiare qualcosa di
sto oggetto conn a basso livello?...cerco su goggle

Caro amico di sventure (scusa la confidenza),
il problema che hai avuto tu l'ho avuto pure io ai tempi.
Ho provato e riprovato e riprovato ma nulla, alla fine ho adottato
anche io la tua stessa soluzione chiudendo e riaprendo la connessione!
Conta che non ci ho pensato sopra solo io (ai tempi era solo un paio
d'anni che programmavo) ma persone che ho visto fare software
"seri"...e nulla tranne quel conn.close e poi open...
ciao Al3x
PS: ora non programmo più in bound...ma solo con recordset
sconnessi...

[MEGA CUUUUUUUUUUT]
Come hai detto anche tu, chiudi la connessione e poi riaprila e aggiorna la
griglia
cosě funziona al 100%
Capitato anche a me.