Newsgroup: it.comp.appl.access
Titolo: Eventi su RecordSet ADO

Si parlava al CISA di sfruttare gli eventi ADO per essere avvisati di 
modifiche fatte a dati in una tabella. Pare che non sia possibile. Su
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoevents.asp
si legge chiaramente:
"Recordset Events: Events are issued around asynchronous fetch operations as 
well as when you navigate through the rows of a Recordset object, change a 
field in a row of a Recordset, change a row in a Recordset, open a Recordset 
with a server-side cursor, close a Recordset, or make any change whatsoever 
in the Recordset. "
Quindi pare che gli eventi siano scatenati solo e soltanto se si fa qualcosa 
nel recordset.
-- 
Jonathan Canova
infoCHIOCCIOLAaladinoinformatica.com
www.aladinoinformatica.com
 

 ha scritto nel messaggio
news:FhVoe.1497606$35.55...@news4.tin.it...

Ciao,
purtroppo i sospetti che avevamo pare fossero fondati.
Voglio comunque fare una prova ma temo che sia inutile.
Mat.

 nel recordset.
Altri modi di intercettare eventi sui recordset non li ho trovati. Basta
cercare sul visualizzatore oggetti per vedere che non sono disponibili
eventi per gli oggetti che possono essere correlati direttamente alle
tabelle.
E non ce ne sono neanche di nascosti, infatti dichiarazioni del tipo
  Dim Withevents Tbl as Tabledef
  Dim Withevents Qry as Querydef
  Dim Withevents AApp as Access.Application
restituiscono tutte l'errore "L'oggetto non può essere origine di eventi
d'automazione".
Ciao.
Namor
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:d81v9v$9er$1...@news.newsland.it...

Ciao Marco, in realtà qualche mese fà trovai un Demo basato su VB+JET
che invece gestiva proprio un Recordset con Eventi, tramite i quali
aggiornava
la progressBar, ti assicuro che funzionava bene.
Se lo trovo, ma sarà difficile, lo espongo.
Notte.
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

 Namor
Ciao,
non ho capito bene di quale evento avete bisogno e per fare cosa ma se
volete qui c'è un esempio su come intercettare l'evento RecordExit di una
maschera.
---
How to programmatically implement a RecordExit event in Access 2002
http://support.microsoft.com/default.aspx?scid=kb;en-us;304139
---
Ciao Giorgio

 wrote in message
news:d82acl$v6k$
1...@domitilla.aioe.org
[CUT]
In un intermezzo notturno di lavoro ho trovato questo...!
Option Explicit 
Private msCnn As String 
Private WithEvents moCnn As ADODB.Connection 
Private WithEvents moRst As ADODB.Recordset 
Private Sub Form_Load() 
    Text1.Text = "SELECT * FROM Titles" 
    Command1.Caption = "Go" 
    Command1.Enabled = False 
    Const sDB = "biblio.mdb" 
    msCnn = "Provider=Microsoft.Jet.OLEDB.­4.0;" & "Data Source=" & sDB
& ";"
    Set moCnn = New ADODB.Connection 
    moCnn.Open msCnn, , , ADODB.adAsyncConnect 
End Sub 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 
    If (moCnn Is Nothing) Then 
        Exit Sub 
    ElseIf moCnn.State = ADODB.adStateOpen Then 
        moCnn.Close 
    ElseIf moCnn.State = ADODB.adStateConnecting Then 
        moCnn.Cancel 
    ElseIf moCnn.State = ADODB.adStateExecuting Then 
        moCnn.Cancel 
        moCnn.Close 
    End If 
    Set moCnn = Nothing 
End Sub 
Private Sub Command1_Click() 
    Dim sSQL As String 
    sSQL = Text1.Text 
    Set moRst = New ADODB.Recordset 
    With moRst 
        .CursorLocation = ADODB.adUseClient 
        '.Properties("Initial Fetch Size") = 2 
        '.Properties("Background Fetch Size") = 4 
        'Debug.Print "Start" 
        'Debug.Print "Initial Fetch Size: " & .Properties("Initial Fetch
Size") 
        'Debug.Print "Background Fetch Size" & .Properties( _ 
        '    "Background Fetch Size") 
        .Open sSQL, moCnn, , , ADODB.adAsyncFetch 
    End With 
End Sub 
Private Sub moCnn_ConnectComplete(ByVal pError As ADODB.Error, _ 
    adStatus As ADODB.EventStatusEnum, ByVal pConnection As 
ADODB.Connection) 
    If adStatus = adStatusErrorsOccurred Then GoTo EH 
    Debug.Print "Connection established" 
    Command1.Enabled = True 
    Exit Sub 
EH: 
    MsgBox "Check your connection parameters.", vbCritical, "Connection
Failed!" 
    Set moCnn = Nothing 
    Err.Clear 
End Sub 
Private Sub moRst_FetchProgress(ByVal Progress As Long, ByVal
MaxProgress As
Long, _ 
    adStatus As ADODB.EventStatusEnum, ByVal pRecordset As
ADODB.Recordset)
    'Debug.Print "Fetch: " & Progress & "  Max: " & MaxProgress 
End Sub 
Private Sub moRst_FetchComplete(ByVal pError As ADODB.Error, _ 
    adStatus As ADODB.EventStatusEnum, ByVal pRecordset As
ADODB.Recordset)
    If adStatus <> adStatusOK Then 
        Debug.Print "Failed" 
        Debug.Print "Error: " & pError.Number & " - " &
pError.Description
    Else 
        Set DataGrid1.DataSource = pRecordset 
        Debug.Print "Done" 
    End If 
End Sub 
Saluti.
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 la progressBar, ti assicuro che funzionava bene.
Aspetta a lavorare.
Il problema pare che sia che il recordset intercetta eventi legati a se 
stesso. Quindi, se fai un prelievo dati asincrono (quello di cui stavi 
parlando, penso, e di cui c'era un bell'articolo su VBJ), il recordset ti 
espone degli eventi e dei metodi per sapere il completamento e a che punto 
sei del prelievo. Ma noi avremmo voluto che il recordset ci lanciasse un 
evento quando qualcun'altro cambia un record della tabella a cui il 
recordset punta.
Esempio: hai due db di access che puntano alla stessa tabella. Ci fai sopra 
due form. Se, dal primo DB cambi un dato, dopo poco vedi la maschera del 
secondo DB che si aggiorna. Speravamo che il recordset si "accorgesse" che 
sotto qualcosa è cambiato, ma così non pare.


 Mat.
Ecco il codice utilizzato per i test (se a qualcuno fa comodo)
---------------- Inizio classe1 ----------------------------
Option Compare Database
Option Explicit
Private WithEvents rst As ADODB.Recordset
Public Sub Vai()
    Debug.Print "Vai"
    'MsgBox "Classe partita"
End Sub
Public Sub CancellaRiga()
    rst.Delete
End Sub
Private Sub Class_Initialize()
    Set rst = New ADODB.Recordset
    rst.Open "SELECT * FROM tabella1", CurrentProject.Connection, 
adOpenDynamic, adLockOptimistic
    Debug.Print "Classe partita"
End Sub
Private Sub Class_Terminate()
    rst.Close
    Debug.Print "Classe arrestata"
End Sub
Private Sub rst_WillChangeField(ByVal cFields As Long, ByVal Fields As 
Variant, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As 
ADODB.Recordset)
    MsgBox "WillChangeRecordset"
End Sub
Private Sub rst_WillChangeRecordset(ByVal adReason As ADODB.EventReasonEnum, 
adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    MsgBox "WillChangeRecordset"
End Sub
---------------- Fine classe1 ----------------------------
---------------- Inizio Maschera ----------------------------
Option Compare Database
Option Explicit
Dim test As Classe1
Private Sub Comando4_Click()
    test.CancellaRiga
End Sub
Private Sub Form_Open(Cancel As Integer)
    Set test = New Classe1
    test.Vai
End Sub
---------------- Fine Maschera ----------------------------
Cancellando un record dalla maschera, non succede nulla. Premendo il 
pulsante, che esegue una cancellazione di una riga sul recordset, si scatena 
l'evento "WillChangeRecordset"


giorgio rancati ha scritto:



Il problema alla base di tutto era la creazione di un sistema che stesse
in ascolto e potesse avvisare quando qualcuno modifica/inserisce/cancella
un record senza usare le maschere, direttamente sulle tabelle.


 
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdmscadoevents.asp
Per gli MVP: avete qualche conoscenza in "alti lochi" a cui chiedere:
1. Qual'è la sequenza di eventi attraverso i vari modelli che porta una 
maschera ad aggiornare un campo se qualcun'altro, anche da un altro pc ha 
modificato il valore di quel campo? (ossia: è Access che ogni tanto 
controlla, esiste un evento a livello di Jet o cosa?)
2. Se esistono certi eventi, ci  possiamo noi agganciare a loro?
