Newsgroup: it.comp.appl.access
Titolo: Recordset con ADO

Da poco tempo utilizzo i recordset e non riesco a capire come mai ottengo la
finestra con il messaggio: "I dati sono stati modificati. Prima di salvare
le modifiche ai dati un altro utente ha modificato il record e ha salvato le
proprie modifiche. Modificare di nuovo il record."
Utilizzo una maschera con due caselle di testo non associate quindi apro un
recordset per prelevare un dato e metterlo in una delle due caselle di testo
e chiudo il recordset.
Modifico detto contenuto e passo il focus all'altra casella.
Sull'evento Prima di aggiornare della casella di testo con il dato, riapro
il recordset scrivo la modifica nel campo e a questo punto se verifico nella
tabella il dato lo trovo modificato. Se torno nella maschera e, senza fare
altro, ripasso il focus alla casella di testo con il dato, come tento
un'altra modifica mi compare la finestra di messaggio.
Come posso ovviare a questo inconveniente?
Grazie e un saluto
Francesco
--
E-mail: 
franco....@tiscalinet.it



forse serve il codice che hai utilizzato
Saluti.
Emanuele.

 wrote in message
bdoa3ugcahk434lrs...@4ax.com...

Segue codice:
Private Sub Form_Load()
    AggiornaGriglia
End Sub
Private Sub AggiornaGriglia()
    Dim conn As ADODB.Connection
    Dim rstAppuntamenti As ADODB.Recordset
    Dim strSQL As String
    'Stabilisce la connessione
    Set conn = CurrentProject.Connection
    'Crea un nuovo oggetto recordset
    Set rstAppuntamenti = New ADODB.Recordset
    'Formula l'istruzione SQL
    strSQL = "Select * From Appuntamenti Where IDAppuntamento=1"
    'Apre il recorset ricercando secondo l'istruzione SQL
    rstAppuntamenti.Open strSQL, conn, _
                         adOpenKeyset, adLockOptimistic
    'Testa se non trova nessun record
    If rstAppuntamenti.EOF Then
        'Svuota la casella di testo
        txtLunh800.SetFocus
        txtLunh800.Text = ""
        GoTo Chiudi
    Else
        'Inserisce l'unico record che può trovare nella casella di testo
        txtLunh800.SetFocus
        txtLunh800.Text = rstAppuntamenti!Oggetto
    End If
Chiudi: 'Chiude e distrugge il recordset
        rstAppuntamenti.Close
        Set rstAppuntamenti = Nothing
End Sub
Private Sub txtLunh800_BeforeUpdate(Cancel As Integer)
    Dim conn As ADODB.Connection
    Dim rstAppuntamenti As ADODB.Recordset
    Dim strData As String
    Dim strSQL As String
    'Stabilisce la connessione
    Set conn = CurrentProject.Connection
    'Crea un nuovo oggetto recordset
    Set rstAppuntamenti = New ADODB.Recordset
    'Formula l'istruzione SQL
    strSQL = "Select * From Appuntamenti Where IDAppuntamento=1"
    'Apre il recorset ricercando secondo l'istruzione SQL
    rstAppuntamenti.Open strSQL, conn, _
                         adOpenKeyset, adLockOptimistic
    If rstAppuntamenti.EOF Then GoTo Chiudi
    'Modifica il contenuto del campo Oggetto
    rstAppuntamenti!Oggetto = Me!txtLunh800.Text
    rstAppuntamenti.Update
Chiudi: 'Chiude e distrugge il recordset
        rstAppuntamenti.Close
        Set rstAppuntamenti = Nothing
End Sub

 wrote in message
news:a14bj5$41u$1...@pegasus.tiscalinet.it...
[CUT] tutto.
Ho visto 2 Private Sub ed in ognuna una New Connection...??????????
Non ho capito proprio bene il problema, nonostante abbia cercato,
ma una cosa del tuo codice non la capisco proprio....::::
PERCHE' apri 2 connessioni al SISTEMA...???
Io che pur non uso ADO con ACCESS, ritengo che la connessione debba essere
aperta a livello di Modulo e se non usi una tecnica diversa, ma che non è
quello che fai tu, la lasci sempre attiva.
Perchè in questo modo rallenti notevolmente il lavoro di connetti e
sconnetti...!
Saluti...!
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


La risposta alla tua domanda è semplice: incompetenza.
Mi spiegheresti meglio come inquadreresti il problema di scrivere il
contenuto di un campo in un oggetto non associato, di modificarlo e,
sull'evento Prima di aggiornare, riscrivere il record?
In particolare, come gestisco il recordset in una routine evento con il
recordset aperto in un modulo? Quando chiudo il recordset?
Un saluto e grazie.
Francesco
--
E-mail: 
franco....@tiscalinet.it

 Francesco
No, non è incompetenza, forse stai facendoti esperienza, non tutti
nascono maestri....!
Per rispondere alle tue domande...!
Credo tu faccia confusione su i due argomenti fondamentali di ADO:
1)La Connection
2)Il Recordset
Sono 2 cose estremamente dipendenti ma completamente diverse.....!
La Connection la si apre all'inizio del DB, questo per garantire che
tutto ciò che verrà richiesto come accesso di DATI riguarda la fonte
definita nella StringConnection....!
Il Recordset sfrutta l'origine dati di cui sopra, ma viene attivato
al momento che serve, poi viene richiuso....!
Ora la gestione di Form con controlli non associati in VB e molto più
semplice che in ACCESS, perchè senza trucchi permette l'utilizzo di
un Array di Controlli(TextBox) ad esempio, questo ti velocizza la fase
sia di recupero dati dal DB, che di salvataggio ES: 
Questa Sub dichiarata Public a livello di Modulo la utilizzo
per effetuare un Clean delle TextBox non associate durante l'inserimento
di un nuovo record, la proprietà TAG la utilizzo per essere sicuro di
considerare solo i controlli che voglio.
Public Sub Clean(Mask As Form)
    'Azzera il contenuto delle TextBox
    Dim ctl As Control
    For Each ctl In Mask.Controls
        If TypeOf ctl Is TextBox and ctl.Tag="1" Then
            ActiveControl = ""
        End If
    Next
End Sub
Es:Funzione per salvare sia le modifiche che i nuovi Record
Sub Scrivi(rs As Recordset, i As Integer)
Dim x As Integer
Rs.AddNew                 
For x = 0 To i - 1
    If TxtTesto(x).Text <> "" Then
            rs.Fields(x).Value = TxtTesto(x).Text
    End If
Next
Rs.Update
End Sub
La comodità di avere un'Array di controlli è grandissima, perchè riesci
ad indicizzare tutto.
Le routine che ti ho passato sono anche funzionanti, ma non sono il massimo,
possono essere generalizzate ulteriormente per essere posizionate in un
Modulo ed essere richiamate da tutte le Form.....!
Anche con Access si può fare, è leggermente differente la tecnica.....!


 Per rispondere alle tue domande...
[CUT]
Ti ringrazio per le utili indicazioni che mi hai dato e che mi hanno fatto
pensare ad altre soluzioni.
Ora proverò a riscrivere il codice diversamente con la speranza di non
vedere più quella finestra di messaggio che è stata l'origine di questo
thred.
Un cordiale saluto
Francesco
---
franco....@tiscalinet.it