Newsgroup: it.comp.appl.access
Titolo: Sitocomune: bug su esempio di log automatico con withevents

Un avviso per chi volesse utilizzare il mio esempio ‘Creare un sistema di
log completamente automatico e centralizzato’ pubblicato sul
www.sitocomune.com
 sezione modules: l’esempio contiene un bug, e non ho
ancora avuto tempo di studiarne le cause per risolverlo.
Per riprodurre il bug:
- aprire una delle maschere
- eliminare uno o più record
- alla richiesta di conferma premere ‘No’ per annullare l’eliminazione
A questo punto qualsiasi operazione successiva (inserimento, modifica o
eliminazione) genera un errore 3420 ‘Oggetto non valido o non impostato’,
e scegliendo ‘Fine’ il sistema di log si disattiva. Non ho ancora
verificato se la classe termina o se resta in memoria ma la variabile
dichiarata con WithEvents non intercetta più gli eventi.
Chiudendo e riaprendo la maschera la classe viene reistanziata e funziona,
a meno che non si riproduca nuovamente il bug.
Ciò si verifica solo se la prima operazione eseguita dopo l’apertura della
maschera è l’annullamento di un’eliminazione. Se invece la prima
operazione è un’altra (inserimento, modifica o eliminazione confermata) il
problema non si verifica più, nemmeno in caso di successivi annullamenti
di eliminazioni.
Il bug è stato riscontrato su Access 97 e 2000. Pregherei chi ha Access XP
e 2003 di provare a riprodurlo e comunicarci l’esito.
Appena trovo il tempo di esaminarlo a fondo, se riesco a risolverlo
invierò un update al 
www.sitocomune.com
.
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

 Namor
Sě, presenta l'errore che hai indicato...
Ciao.
-- 
Sergio MAZZA 

 ha scritto nel messaggio
news:co6rhq$ime$1...@news.newsland.it...

Ciao Namor,
per caso ho letto la tua email ed ho letto anche la risposta di Sergio
Mazza.
Per curiosità ho fatto per bene le prove anche io e la cosa strana è che mi
chiede conferma solo se voglio effettivamente modificare il record, ma se lo
cancello non mi chiede assolutamente nulla, lo cancella e basta.
Non mi appaiono errori.
Io ho Win XP ed Office 2003, ho aperto il DB nella versione 2000 e 97.
Ciao Rita

 ha scritto nel messaggio
news:co6rhq$ime$1...@news.newsland.it...

Ciao Marco.
Sinceramente ho provato tutto quello che hai detto su tutte le Form e
diverse volte.
Nessun errore..... su A_XP, confermo invece la presenza del Bug sulla
versione 97.
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

 Ciao
Il fatto che l'inconveniente si verifichi su A97 e 2000 e sparisca in XP,
e soprattutto che non si verifichi sempre dopo l'annullamento di
un'eliminazione ma solo quando questa avviene come prima operazione dopo
l'apertura della form, mi fa pensare ad un bug di access piuttosto che ad
un errore di programmazione. Manca un riscontro su Access 2003, vediamo se
qualcuno lo prova e ci comunica l'esito.
In ogni caso ricontrollerò il codice vba per vedere se ho commesso qualche
errore logico.
Ciao.


 Ciao Rita
E' perchè hai tolto la spunta all'opzione
Strumenti/Opzioni/Modifica-Trova/Conferma/Modifiche record
quindi gli eventi "Prima di conferma eliminazione" e "Dopo conferma
eliminazione" usati dalla classe textlog non si verificano.
Bisogna riabilitare l'opzione "Conferma modifiche record" o modificare il
codice della classe per farlo lavorare sul solo evento "Eliminazione", che
si verifica sempre, anche quando non disabiliti le richieste di conferma.


 ha scritto nel messaggio
news:cohm7o$2fb$1...@news.newsland.it...

Grazie Namor,
infatti ora è tutto a posto, funziona tutto.
Ho anche convertito il database nella versione 2003 (sempre con Win XP) e
funziona, non si è verificato il bug, pur rispettando la sequenza di
operazioni che hai elencato.
L'unica cosa che succede, sia nella versione 2000 e 2003, ma non è un errore
di certo è che quando rispondo 'NO' alla eliminazione di un record,
spariscono tutti i record visualizzati ed appare in cima, come unico record,
quello evidenziato per la cancellazione.
Poi se chiudo la Form e la riapro ricompaiono tutti i record, sto vedendo
come mai faccia il giochetto dell'apparizione e sparizione..
   Ciao
   Rita

 ha scritto nel messaggio
news:cohhje$iop$1...@news.newsland.it...

Per quanto ho potuto vedere non ci sono errori macroscopici, come hai detto
anche
tu non si spiegherebbe il Funzionamento con XP.
Forse è una delle tante strade di MS...!!
Ciao Marco.


 ha scritto nel messaggio
news:cohhje$iop$1...@news.newsland.it...

Su Access 2003 funziona tutto.
Ciao Rita

 Ciao.
Grazie per il test, Sergio (anche se non hai indicato con che versione!).
Namor
PS. Ma dov'è finito il nostro oldsailorman skipper che doveva portarci in
vacanza? Non avrà mica caricato il CBR RR sulla 14 metri andando a
veleggiare ai mari del sud senza di noi?


 Sergio MAZZA
Mai mettere in dubbio la parola di Sergio...!
Confermo che mi ero lasciato ingannare, ma per farmi perdonare
credo di aver risolto l'inghippo...!!!
Provate a sostituire la funzione sotto nella Classe...!
Private Function Record() As String
'genera una stringa contenente i nomi e i valori dei campi
'del recordset della maschera.
'è necessario un riferimento alla libreria Microsoft DAO
Dim Fld As DAO.Field, Str As String
Dim rs As DAO.Recordset
    Str = ""
    Set rs = Maschera.RecordsetClone
    'Maschera.RecordsetClone.Bookmark = Maschera.Bookmark
    For Each Fld In rs.Fields
        If Fld.Type <> dbLongBinary Then
        'non logga i campi tipo 'Oggetto OLE'
            Str = Str & Fld.Name & "=" & Fld.Value & vbCrLf
        End If
    Next
    Record = Str
    rs.Close
    Set rs = Nothing
End Function  'Record
Ora mi ero già accorto e ne avevo accennato a Sergio qualche tempo fà
nel Demo di Ricerca che ha sviluppato al quale avevo inserito di fretta una
variazione... che la gestione del RecordsetClone non sempre è simpatica...!
Assegando ad un Recordset il Clone si risolve spesso quello che non sempre è
spiegabile.
In questo caso il RecordsetClone parrebbe non essere aggiornato con
l'effettivo
Recordset di Form al quale hai eliminato Records... non chiedermi perchè...!
Ora pare funzionare...!!
Datemi conferma..!


 namor at inwind punto it
-- 
Sergio MAZZA 


-- 
Sergio MAZZA 

 Ciao.
Occhio che a primavera si riparte con l'organizzazione della minicrociera
ICAA!
Namor


 Namor
ZZzzzzzz
In A97 in effetti è ancora presente..., ma cavolo con XP è strano ha una
dipendenza diversa...(C'è ancora però)
Ho messo un Break nella Routine in ogni caso ed il problema è proprio
quello.
Durante la cancellazione viene aperta una transazione ed il Recordset
di Maschera ha già eliminato il Record, ma quello che non capisco è
il disallineamento tra il RecordsetClone reale e quello visto....!!!
Alla conclusione della transazione
Mi fa incavolare stà cosa....!!!!


 ha scritto nel messaggio
news:conlj0$cso$1...@lacerta.tiscalinet.it...




Evabbé va... Se la metti su questo piano...
Ciao.
-- 
Sergio MAZZA 

 al limite posso considerare Ostia come tappa di passaggio...
Eddaiiiii.... e non fare il difficileee!!!
Io mica mi faccio venire a prendere a Trieste!
E poi se ti passiamo a prendere fin laggiù ti perdi mezza vacanza (il
prezzo invece rimane intero, ovviamente!).
Namor
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 


 Mi fa incavolare stà cosa....!!!!
Usando un oggetto recordset al posto di RecordsetClone il problema si
risolve, ma non ho ancora ben capito perchè lo faceva, e perchè solo come
prima operazione dopo l'apertura della maschera. Resto dell'idea che sia
un bug di access.
Di seguito i blocchi di codice da sostituire per eliminare l'errore:
'variabili globali
Private WithEvents Maschera As Form
Private UserName As String, HostName As String
Private LogFile As String, DatiLog As String
Private Eliminandi As Long, Inserimento As Boolean
Private RsClone As Recordset
Public Sub Associa(ByRef OpenedForm As Form)
    'associo l'oggetto locale "Maschera" alla maschera appena aperta
    Set Maschera = OpenedForm
 
    'abilito sulla maschera l'auditing degli eventi che uso
    Maschera.OnDelete = "[Event Procedure]"
    Maschera.BeforeUpdate = "[Event Procedure]"
    Maschera.AfterUpdate = "[Event Procedure]"
    Maschera.BeforeDelConfirm = "[Event Procedure]"
    Maschera.AfterDelConfirm = "[Event Procedure]"
    Maschera.BeforeInsert = "[Event Procedure]"
    Maschera.AfterInsert = "[Event Procedure]"
    Maschera.OnActivate = "[Event Procedure]"
    Maschera.OnClose = "[Event Procedure]"
    Set RsClone = Maschera.RecordsetClone
End Sub  'Associa
Private Sub Class_Terminate()
    'libero la memoria occupata dall'oggetto 'Maschera'
    Set Maschera = Nothing
    'chiudo e distruggo il recordset RsClone
    RsClone.Close: Set RsClone = Nothing
End Sub  'Class_Terminate
Private Function Record() As String
'genera una stringa contenente i nomi e i valori dei campi
'del recordset della maschera.
'è necessario un riferimento alla libreria Microsoft DAO
Dim Fld As DAO.Field, Str As String
    Str = ""
    RsClone.Bookmark = Maschera.Bookmark
    For Each Fld In RsClone.Fields
        If Fld.Type <> dbLongBinary Then
        'non logga i campi tipo 'Oggetto OLE'
            Str = Str & Fld.Name & "=" & Fld.Value & vbCrLf
        End If
    Next
    Record = Str
End Function  'Record
Testato solo su Access 2000, per ora.
Namor
-- 
namor at inwind punto it
questo articolo e` stato inviato via web dal servizio gratuito 


 Namor
Di questa anomalia come ti dicevo ne avevo già parlato
ed è per questo che nei primi tentativi avevo provato
a gestire un Recordset separato, ora non avevo pensato
all'associazione immediata su associazione Maschera.
C'è da pensare se il Recordset così creato sia effettivamente
sempre aggiornato, e che non sia necessario inserire l'aggiornamento
al Clone per ogni EVENTO....!!!
Ci penso un pò sù, questa sera lo testo meglio su A_XP, anche se
ho notato che l'errore lo dà solo alla 2° Cancellazione Annullata
in alcuni test che stavo facendo...!!
Ciao
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ALESSANDRO Baraldi ha scritto:

Un saluto a Namor ed a tutti voi.
Ho copiato il codice rettificato e funziona.
Ho solo un problema relativo all'uso della sottomaschera nel programma di
esempio di Namor, col nuovo codice mi appare il messaggio:
Errore di runtime '7951'
Riferimento alla proprietà RecordsetClone non valido nell'espressione.
Se faccio il debug mi appare evidenziata la riga:
Logger.Associa Maschera
Come mai? Le maschere continue e singole funzionano bene.
Ricordo che io ho Win XP ed Office 2003.
Grazie
Ciao Rita

 > Namor
[ACCESS_XP]
Pare funzionare benone.
Ciao Marco.
@Alex

 Ciao Rita
Perchè sarà una maschera non associata e non ha un recordset, quindi di
conseguenza nemmeno un recordsetclone. Devi modificare il codice o meglio,
per non modificare l'originale, creare una seconda classe apposta per
maschere non associate, che faccia il log del contenuto dei controlli
anziché dei campi del recordset.
Oppure fare il log direttamente dal codice di quella maschera.


 [CUT]


In questo caso del recordset uso solo i bookmarks che vengono calcolati
all'apertura o al requery della maschera.
Sarebbe necessario riassegnare rsclone=recordsetclone solo dopo un
eventuale requery, però fino ad access 2000 non è disponibile un evento
requery, che sarebbe l'ideale per risolvere il problema.
Se si sa che nel codice della form viene eseguito un requery bisognerebbe
riassegnare rsclone su un altro evento, per esempio su corrente, il che
sprecherebbe parecchie risorse dato che verrebbe eseguito anche quando non
serve, e se è messo nella classe verrà eseguito anche per le maschere che
non ne hanno bisogno perchè non fanno requery.
Un altra strada è esporre nel modulo di classe un metodo che faccia la
riassegnazione, e richiamarlo dal codice della form subito dopo aver fatto
il requery.
Ciao.


 Namor
Se non sbaglio A_XP ti consente di generare Eventi personalizzati nella Form
pertanto dovrebbero essere ereditati dalla Classe avendo istanziato la
Form con WithEvents.
Questo è un "forse" non ho testato.
In ogni caso la cosa non è assolutamente fattibile in 2000 nè a maggior
ragione
in 97, pertanto l'unica soluzione sarebbe proprio quella che hai ipotizzato
del Metodo nella Classe, ma il tutto a scapito della singolare funzionalità
del lavoro che hai fatto praticamente a ZERO codice.


 ha scritto nel messaggio
news:cp905n$oen$1...@news.newsland.it...

Grazie Namor,
ora ho capito il perchè, vedrò cosa posso fare.
Ciao Rita