Newsgroup: it.comp.appl.access
Titolo: Il RecordSet modifica la tabella d'origine?

Gentili iscritti,
Ho una query SQL:
StringaSQL = "SELECT * " & _
             "FROM MIATABELLA"
... e la faccio eseguire ...
 
RecSet.Open StringaSQL, , adOpenKeyset, adLockOptimistic, adCmdText
... a questo punto lavoro un po' nel RecordSet
RecSet.MoveFirst
Do While Not RecSet.EOF
	...
	RecSet.MoveNext
Loop
... ed infine lo chiudo ...
RecSet.Close 'chiude il Recordset
Set RectSet = Nothing
In fase di debug mi viene modificata MIATABELLA, MENTRE in fase di
esecuzione NO! Sono agli inizi nello studio di ADO, DAO, ecc. il mio
obiettivo sarebbe far sě che il risultato del RECORDSET si potesse
riversare STABILMENTE su MIATABELLA.
Come fare? Grazie.
--
Paolo Guagliumi - ICQ 46580228
_______________________________________
Casale Monferrato - Alessandria - Italy
http://web.tiscali.it/saw

 --
Ma cosa succede all'interno del ciclo?
Assegni dei valori ai vari campi ? Tipo:
RecSet![Descr] = X
RecSet![Quantità]= Y
Così facendo (se qualcuno del N.G. non mi tira energicamente le orecchie),
dovrebbero certamente modificarsi definitivamente i campi nelle tue
tabelle....
...Scusa se non ho capito il problema.

...Scusa se non ho capito il problema.
Si, in effetti è un caso strano... o sono io a dimenticare qualcosa e
a perdermi in una bolla d'acqua o Access ad avere qualche problema,
perchè questo è il codice del ciclo:
RecSet.MoveFirst
Do While Not RecSet.EOF
	If Not IsNull(RecSet.Fields("Valore").Value) Then
            RecSet.Fields("Valore").Value = "True"
        Else
            RecSet.Fields("Valore").Value = "False"
        End If
	RecSet.Update
        RecSet.MoveNext
Loop
La cosa ASSURDA è che se io lo eseguo in fase di DEBUG, tutta la mia
procedura FA ESATTAMENTE QUELLO CHE DEVE FARE e mi stampa i report in
modo corretto. Allo stesso modo se lancio il REPORT manualmente
cliccandovi sopra... perchè il REPORT prende semplicemente i dati da
una tabella che ha quel campo "Valore" modificato. Ora... in fase di
DEBUG o lanciandolo A MANO va a prendere i dati corretti. IN FASE DI
ESECUZIONE NO! Sembra quasi che "vada troppo velocemente" e che quindi
non siano STABILI le modifiche nella tabella.
(ho Access 2000 con SP1+SP2+SP3)
Ho provato a mettervi dei cicli vuoti di attesa, dei DOEVENTS
dovunque, magari nei cicli... da 2gg che ci sto... niente... in fase
di DEBUG eseguita linea per linea fa esattamente quello che deve fare,
mentre eseguita tutta d'un colpo... NO. E' un mistero di Access? ;)
Segue il codice, ma non perdervi tempo, l'ho allegato perchè magari
qualcuno dice... "Ma manca che ne so... una update... là"...
' **** codice per la stampa del report FASE_SINTESI ****
Private Sub Comando45_Click()
    Dim RecSet As Recordset 'definizione di un oggetto Recordset
    Dim NomeDB As String 'path e nome del database corrente
    Dim StringaConnessione As String 'stringa per la connessione al
database corrente da parte di ADO
    Dim StringaSQL, OutputSQL As String 'contiene la stringa SQL
corrente e l'Output ritornato dall'esecuzione della stringa SQL
    Dim IDStringaCantiere As String 'contiene ed individua il cantiere
corrente
    Dim StringaNomeIndirizzoCantiere 'contiene il nome e l'indirizzo
del cantiere
 
    DoCmd.SetWarnings False 'disabilita i Warning per poter eseguire
le query
    DoCmd.OpenQuery "Query1_Stampa_Fase" 'esegue queste query
    DoCmd.OpenQuery "Query2_Stampa_Fase"
    DoCmd.OpenQuery "Query3_Stampa_Fase"
    DoCmd.Close acQuery, "Query1_Stampa_Fase" 'chiude le query
    DoCmd.Close acQuery, "Query2_Stampa_Fase"
    DoCmd.Close acQuery, "Query3_Stampa_Fase"
    DoCmd.SetWarnings True
 
    Set RecSet = New ADODB.Recordset 'crea l'oggetto Recordset
    NomeDB = 
Application.CurrentDb.Name
 'nome del DataBase corrente
    StringaConnessione = "Provider = Microsoft.Jet.OLEDB.4.0; Data
Source=" & NomeDB 'stringa di connessione al database corrente
    RecSet.ActiveConnection = StringaConnessione 'stabilisce la
connessione Recordset
 
    IDStringaCantiere = Forms![STAMPA]![IDCantiere]
    StringaSQL = "SELECT * " & _
                 "FROM TABELLA_OUTPUT_FASI_CANTIERE"
 
    'query sql che mostra l'elenco delle varie fasi con associate le
rispettive categorie per quel cantiere
    RecSet.Open StringaSQL, , adOpenKeyset, adLockOptimistic,
adCmdText
    OutputSQL = Trim(RecSet.GetString)
    Debug.Print OutputSQL
 
    'questo ciclo sostituisce la stringa "nome del cantiere" con un
simbolo "»" per indicare che quella fase è presente
    RecSet.MoveFirst
    Do While Not RecSet.EOF
        If Not IsNull(RecSet.Fields("Valore").Value) Then
            RecSet.Fields("Valore").Value = "True"
        Else
            RecSet.Fields("Valore").Value = "False"
        End If
	Recset.Update
        RecSet.MoveNext
    Loop
 
    RecSet.Close 'chiude il Recordset
    Set RectSet = Nothing
 
    DoCmd.OpenTable ("TABELLA_OUTPUT_FASI_CANTIERE")
 
    DoCmd.SetWarnings False 'disabilita i Warning per poter eseguire
le query
    DoCmd.OpenQuery "Query4_Stampa_Fase" 'esegue queste query
    DoCmd.Close acQuery, "Query4_Stampa_Fase" 'chiude le query
    DoCmd.SetWarnings True
 
    DoCmd.OpenReport "FASE_SINTESI", acViewPreview
 
    'ora realizzo una nuova query sql per estrapolare il nome del
cantiere e il suo indirizzo da includerli nel report
    'Set RecSet = New ADODB.Recordset 'crea l'oggetto Recordset
    StringaConnessione = "Provider = Microsoft.Jet.OLEDB.4.0; Data
Source=" & NomeDB 'stringa di connessione al database corrente
    RecSet.ActiveConnection = StringaConnessione 'stabilisce la
connessione Recordset
    StringaSQL = "SELECT * " & _
                 "FROM CANTIERE " & _
                 "WHERE CANTIERE.IDCantiere = " & IDStringaCantiere
 
    'query sql che mostra i dati del singolo cantiere
    RecSet.Open StringaSQL, , adOpenKeyset, adLockOptimistic,
adCmdText
    OutputSQL = Trim(RecSet.GetString)
    RecSet.MoveFirst
    'Debug.Print OutputSQL
 
    'aggiunta al report delle informazioni relative al cantiere
    StringaNomeIndirizzoCantiere = UCase("CANTIERE: " +
RecSet.Fields("Cantiere").Value + " - " +
RecSet.Fields("Indirizzo").Value)
    Reports("FASE_SINTESI").Controls("TestoNomeCantiere") =
StringaNomeIndirizzoCantiere
    Reports("FASE_SINTESI").Controls("TestoNomeCantiere").Visible =
True
 
    DoCmd.OpenReport "FASE_SINTESI", acViewNormal 'stampa il report
(stampa 2 pagine del report)
    DoCmd.Close acReport, "FASE_SINTESI", acSaveNo 'chiude il report
aperto
 
    RecSet.Close 'chiude il Recordset
    Set RectSet = Nothing
 
    'DoCmd.DeleteObject acTable, "TABELLA_OUTPUT_FASI_CANTIERE"
End Sub



Prova a mettere alla fine anche un
set recset = nothing
Antonio


Ciao Paolo
Visto che lavori sul database corrente prova a non aprire una connessione
concorrente a quella già aperta da CurrentProject.
Dim Rs As ADODB.Recordset
Dim StringaSQL As String
Set Rs = New ADODB.Recordset
StringaSQL = "SELECT * " & _
                 "FROM TABELLA_OUTPUT_FASI_CANTIERE"
Rs.Open StringaSQL, CurrentProject.Connection, adOpenKeyset,
adLockOptimistic
Ciao Giorgio.

Antonio
Ti ringrazio per il suggerimento, ma c'era già!
IL MISTERO DELLA ROUTINE ACCESS: eseguita in fase di debug va
perfettamente... eseguita in fase d'esecuzione, NO, sigh. Assurdo?!
 'questo ciclo sostituisce la stringa "nome del cantiere" con un
simbolo "»" per indicare che quella fase è presente
    RecSet.MoveFirst
    Do While Not RecSet.EOF
        If Not IsNull(RecSet.Fields("Valore").Value) Then
            RecSet.Fields("Valore").Value = "True"
        Else
            RecSet.Fields("Valore").Value = "False"
        End If
	Recset.Update
        RecSet.MoveNext
    Loop
 
    RecSet.Close 'chiude il Recordset
    Set RectSet = Nothing
--


concorrente a quella già aperta da CurrentProject.
GIORGIO SEI UN MITO! TI RINGRAZIO INFINITAMENTE! Ti ringrazio davvero
TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO,
TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO,
TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO, TANTO!
Vi mancava in effetti il parametro:
CurrentProject.Connection
nella Rs.open! Fosse stato per me avrei potuto ancora cercare,
cercare, cercare, senza trovarlo, visto che negli esempi che avevo...
non c'era! Perchè non capivo come mai in fase di debug andasse e in
fase di esecuzione NO! Pensavo fosse un problema di Access. Invece...
era una stranezza che in fase di DEBUG funzionasse.
Grazie ancora, problema risolto!
Ringrazio anche Mario Puglisi e Antonio Biso che mi hanno risposto!
Grazie a tutti, ciao, ciao!


 CurrentProject.Connection
appena un tantino potresti pure ringraziarlo!
--
a.cara
togli qualcosa dall'email

Pensavo fosse un problema di Access. Invece...
 >era una stranezza che in fase di DEBUG funzionasse.
Ciao Paolo.
Non è un problema di access ne una stranezza che in fase di debug funziona,
se apri una nuova connessione al tuo Db corrente viene vista come l'apertura
di un secondo utente e durante l'esecuzione della tua routine la connessione
corrente (CurrentProject.Connection) non fa in tempo a rileggere la nuova
situazione del DB quindi ad aggiornare il buffer di I/O, cosa che riesce a
fare benissimo in fase di Debug.
Ciao Giorgio.