Newsgroup: it.comp.lang.visual-basic
Titolo: Quando aprire il recordset?

Salve a tutti,
da qualche tempo stò provando ad usare VB6 per piccole cose.
Adesso sto facendo un'applicazione leggermente più complessa
con l'uso di access come DB.
Il problema è che mi stò incasinando in maniera pazzesca con
l'apertura e la chiusura dei recordset.
Ho fatto delle ricerche sui gruppi e solitamente viene consigliato
semplicemente di aprirlo e chiuderlo al momento del bisogno,
specialmente se l'applicazione lavora su un server.
Premesso che quello che stò facendo è un mini programmino
che lavorerà solamente in locale vi chiedo cosa si intende per
al momento del bisogno.
Nel mio caso ho fatto così:
-   apro la connessione all'apertura dell'applicazione da un modulo
    dove ho impostato una sub main, che apre la connessione e
    richiama la form iniziale.
Per i recordset ho provato due strade ma in entrambi i casi,
come dicevo mi sono perso.
Caso1
    All'interno del form aprivo e chiudevo il recordset in ogni
    sub che necessitava l'accesso al DB.
    Ma in questo caso ho trovato problemi quando avevo con
    delle procedure richiamate dalla sub che usavano altri recordset
    e mi perdevo fra recordset aperti o chiusi.
Caso2
    Ho provato ad aprire tutti i recordset necessari su Load del form
    con l'idea di richiuderli sull'evento unload.
    In questo caso ho avuto problemi poiche quando aprivo un'altra form
    con form.show e andavo a riaprire i recordset spesso mi ritrovo l'errore
    recordset già aperto.
Qui vi chiedo, tenendo conto che è una piccola apllicazione in locale,
come viene solitamente gestita l'apertura e la chiusura dei recordset?
Grazie
WS

 come viene solitamente gestita l'apertura e la chiusura dei recordset?
Quello che hai letto è ok.
Poi bisogna vedere caso per caso cosa ti serve, tenendo sempre a mente il 
principio generale.
Se devi inserire un nuovo recordo nella tabella clienti:
prima ti fai tutti i tuoi controlli di validità dei dati nelle textbox, e 
solo quando tutto va bene, apri il recordset aggiiungi il record e lo 
chiudi.
Addirittura con comanndo sql "insert into tabella..." non c'è manco bisogno 
di aprire e chiudere i recodset, basta avere il solo database aperto.
Se poi, come mi pare di aver capito, per modificare una tabella, tu hai 
bisogno del dato di un'altra tabella, fai allo stesso modo.
- Apri il recordset
-  prendi il dato che ti servirà e lo metti in una variabile
- chiudi il recodset
- apri l'altro recordset
- fai quello che devi fare usanndo il dato dell'altro recorsedt conservato 
nella variabile
- chiudi il recordset.
-- 
Greg 


Ok, provo a fare in questo modo. Quando avevo letto al momento del
bisogno non pensavo si intendesse in modo così stretto del termine :))
Inoltre ad usare le variabili come hai consigliato non ci avevo pensato.
Il problema è che le nozioni sono limitate e le idee tante, e non è facile
far combaciare le due cose, specie quando il tempo da dedicare è poco...
...inevitabilmente si finisce per fare confusione.
Grazie per adesso
Ws

 ha scritto

*se*, ripeto se, e'un'applicazione locale, *e non e' destinata ad 
evolversi*, lascia perdere ado e usa dao 3.6. in locale e' tuttora la cosa 
piu' veloce, efficiente e affidabile, anche usandolo col solo sql. senza 
contare che anche dopo sp6 i controlli ado fanno abbastanza pieta'.
in un modulo fai qualcosa tipo
     dim myDb as database
al frmMain_load (se hai un mdi, o comunque sul principale)
    set myDb=opendatabase ecc.
al frmMain_unload
    mydb.close
    set myDB=nothing
anche prima di compattazioni ecc. ovviamente se ci devi lavorare ancora, 
dovrai risettarlo.
per i recordset, io li dichiaro, apro e chiudo, nelle particolari sub (*):
    dim rs as recordset
    set rs=mydb.openrecordset("select cognome, dnascita from anagrafe order 
by..", dbopensnapshot)
    ...operazioni..
    rs.close
    set rs=nothing
(*) *a meno che* non abbia datacontrol sul form. nel caso, per abitudine 
spesso sincronizzo il datacontrol al recordset, specie se indicizzato, e 
gestisco il rs. il dc va di conseguenza.
questo rs lo dichiari nelle generali del form, lo setti al load, e lo azzeri 
all'unload.
eventuali rs dichiarati nelle singole routine, avendo visibilita' locale, 
non interferiscono con quello principale, anche se il nome e' uguale. io uso 
quasi sempre solo "rs", specifico un po' di piu' solo se ne ho due annidati 
nella stessa routine.
ciao, a.

 come viene solitamente gestita l'apertura e la chiusura dei recordset?
Imho dipende:
Ho es. una maschera di input dove l'utente scrive un Codice Pagamento e su
una label devo caricare la descrizione. In questo caso un può fare un
RecSet Globale RsCodPagamento, magari pure disconnesso, per caricare le
descrizioni quando uno digita o cerca un cod.pagamento.
Lo apri all'inizio e lo chiudi alla fine.
Ho una tabella clienti con anche 1000 righe, quando devo ricercare un
cliente, con una sub:
Dim Rs As ADODB.Recordset
Set Rs = New ADODB.Recordset
Set Rs.ActiveConnection = AdoCN
Rs.Source = ""
Rs.Open
If Not Rs.EOF Then
End If
Rs.Close
Set Rs.ActiveConnection = Nothing
Set Rs = Nothing
Teoricamente non ti dovrebbero rimanere Rs aperti almeno che tu non gli
voglia globali e sempre aperti. Io i form.show li ho praticamente tutti
VbModal, ma in ogni caso, se il Rs mi serve per una ricerca, e non nella
form secondaria che vado ad aprire, è inutile che mi rimanga aperto.
|     Ma in questo caso ho trovato problemi quando avevo con
|     delle procedure richiamate dalla sub che usavano altri recordset
|     e mi perdevo fra recordset aperti o chiusi.
Questo non ci deve essere, quando chiami una sub, dal chiamante poi
richiudi il tutto. Es.
Rs.Open
Do Until Rs.EOF
  Call Elabora (Rs)
Loop
Rs.Close
Se hai un recSet globale che può darsi venga chiuso dal chiamante puoi fare
una cosa del genere
RsGlobal.Open
Do Until RsGlobal.EOF
  Call Elabora 
Loop
If RsGlobal.State= AdStateOpen Then RsGlobal.Close
Sinceramente devi capire come mai il programma non passa da dove vuoi tu, e
il problema che hai con i RecSet lo hai anche con le variabili e il resto.
-- 
DBMS Firebird
VB6 + Ado

Quello che ti ha detto Qreq e' corretto, io aggiungo un mio banale
suggerimento: il fatto che a volte ti "ingarbugli" con form e
recordset aperti, e' dovuto a mancaza di semplicita' nella stesura del
codice. Personalmente seguo sempre umo schema elementare: 
1) apro un recordset; 
2) appoggio i dai su una variabile (locale, di modulo o globale, e che
frequentemente puo' essere una griglia);
3) chiudo il recordset e lo 'anniento' (con Set MioRecordset =
Notinhg).
Dopo di che con i dati ci fai con calma quello che vuoi.
L'approccio e' banale, ma in anni di programmazione non ho mai dovuto
scostarmi da questa impostazione.
Uma metodologia dei "piccoli passi" e uno standard comune nelle
soluzioni, rende il codice facile da debuggare e da leggere, qualita'
che apprezzerai _molto_ quando dovrai riprendere in mano un codice
dopo un anno che lo hai scritto.
Giuliano

 scostarmi da questa impostazione.
A volte faccio il contrario, cioč metto i dati in una struttura recordset,
per sfruttare esempio filter o roba simile.
Ad ogni modo si puň lavorare anche con recordset disconnessi, di solito
trovo inutile travasare un RecSet in una matrice o array di type, quando
posso usare quello disconnesso.
All'uscita della routine viene distrutto cosě come una matrice.
In ogni caso l'ho usato 3/4 volte questo sistema, di solito apro
connessione, elaboro/ricerco, disconnetto.



Grazie a tutti per le delucidazioni.
Tante volte basta un piccolo input per sbloccarsi
e qui ne ho avuti diersi su cui lavorare.
WS