Newsgroup: it.comp.appl.access
Titolo: Conferma salvataggio record a singhiozzo

In una maschera di input quando qualche campo viene modificato, nel
passaggio ad un altro record chiedo conferma del salvataggio del
record mediante la seguente sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
   Dim strTtl As String
   Dim strMsg As String
   strTtl = "Salvare il record?"
   strMsg = "I dati sono cambiati. Vuoi salvare le modifiche?"
   retValue = MsgBox(strMsg, vbQuestion + vbYesNoCancel, strTtl)
   Select Case retValue
       Case vbYes
           'aggionare qualcosa prima di salvare il record
            Me!UltimoAggiornamento = Date     <= il debug si ferma qui
            Me!Agrecap = Me!CapComb.Column(1)
            Me!Agrecap.Requery
            Me.Ente = UCase(Me.Ente)
            Me.CognomeNome = UCase(Me.CognomeNome)
            Me.Indirizzo = UCase(Me.Indirizzo)
            Me.Città = UCase(Me.Città)
            etc, etc ....
       Case vbNo
           DoCmd.RunCommand acCmdUndo
       Case vbCancel
           Cancel = True
   End Select
End Sub
Ogni tanto ed in modo casuale viene fuori "errore di run-time 3020 -
metodo Update o CancelUpdate senza Addnew o edit".
e quando entro in debug l'interruzione è sulla linea che ho indicato
sopra (Me!UltimoAggiornamento = Date)
Perchè questo comportamento a saltabecco? ... va bene e salva i record
20,30, .... n volte e poi ogni tanto si inchioda.
Particolare: se chiudo l'applicativo e mi riposiziono sul record dove
si è inchiodato prima, modifico qualcosa e passo al record successivo,
il record viene salvato regolarmente e vado al successivo.
Adriano
e-mail galad***NOSPAM***@
alma.it

 ha scritto nel messaggio
news:av1omuon73ipq8t3p...@4ax.com...

Il recordset è derivato da una o da più tabelle? Se ci sono più tabelle che
tipo di join hai usato?
Perchè hai bisogno di Me!Agrecap.Requery?
Sicuro che non ci sia un controllo collegato ad un campo obbligatorio?
Sicuro di non avere un'altra maschera o query aperta con gli stessi dati?
Hai provato ad aprire da codice un recordset e popolare i campi di un nuovo
record
con i dati provenienti dalla maschera?
Sei sicuro che in Me!CapComb.Column(1) ci sia un valore?
Voglio dire sei sicuro che dalla combo si sia scelto un valore?
Ciao, Carlo

    retValue = MsgBox(strMsg, vbQuestion + vbYesNoCancel, strTtl)
    Chiariamo le tue intenzioni. Perche' poni la domanda "Vuoi salvare le
modifiche?" ?
    Perche' vuoi mettere l'utente in grado di:
        . Salvare;
        . Non salvare;
giusto?
    Allora perche' gli proponi tre pulsanti: Si', No, Annulla?
    L'utente che risponde Si' si aspetta che il record venga salvato.
    L'utente che risponde No si aspetta che il record non venga salvato e
che gli sia data la possibilita di *rileggere* o *modificare* o *completare*
quanto gia' immesso.
    Cosa dovrebbe aspettarsi l'utente che sceglie Annulla?
    Potresti invece usare i pulsanti vbOkCancel, che permettono di usare
Invio ed Esc, invece di costringere a cercare il tasto S o N sulla tastiera
o ad usare il mouse.
    Inoltre il pulsante Annulla, di regola, dovrebbe semplicemente chiudere
la finestra, per permettere all'utente di rinunciare alla richiesta fatta,
senza compiere altra azione che, ripeto, quella della chiusura della
finestra.

--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

finestra.
Direi proprio di sě, e, come ho spiegato + sopra, č proprio quello che
fa.
Perň, al di la di tutta questa disquisizione su Si,NO,Annulla che non
ha nulla a che fare con il problema, perchč Access si comporta in
questo modo???
Adriano
e-mail galad***NOSPAM***@
alma.it

Voglio dire sei sicuro che dalla combo si sia scelto un valore?
Il campo gestito dalla combo non è obbligatorio, per cui non
necessariamente l'utente deve scegliere un valore.
Adriano
e-mail galad***NOSPAM***@
alma.it

 ha scritto nel messaggio
news:q44pmuk5i1dt9ko19...@4ax.com...

Questo codice di errore era frequente nella versione di jet 2.n o in VB4 ed
evidenziava un Update senza AddNew o senza Edit. Si trattava di un bug
risolto
nelle versioni successive.
Accertati che i riferimenti siano corretti.
Ora mi sono proprio incuriosito e
ti propongo due soluzioni.
1) Accodi un nuovo recordset alla tabella
2) Mi mandi una copia zippata del DB e vedo cosa posso fare.
Fammi sapere
Ciao, Carlo

 sopra (Me!UltimoAggiornamento = Date)
    Pero' l'errore che segnali non e' un errore vb ma Jet. Usa l'evento
Error e ispeziona mettendo un punto di interruzione.


 > >> metodo Update o CancelUpdate senza Addnew o edit".
Questo errore capitava spesso anche a me prima che imparassi a non
modificare mai un record se non č veramente necessario, non ho capito
neppure io il reale motivo di questo errore, mi sono fatto un'idea e secondo
me
capita quando piů routine modificano contemporaneamente (o quasi) il record.
Per esempio, in una maschera di ricerca per una rubrica che ho progettato,
l'evento Current spostava il record corrente della rubrica per visualizzare
il contatto selezionato nella maschera di ricerca. Questo evento scatenava
anche l'evento oncurrent della rubrica che controllava e modificava, spesso
inutilmente il valore del record. Ho risolto il problema evitando di
scatenare l'evento oncurrent della rubrica quando la maschera di ricerca
fosse aperta.
Comunque quando ho cominciato ad inserire accorgimenti del tipo
Dim Valore as variant
If Rec!Campo<>Valore Then Rec!Campo=Valore
questo tipo di errrore non l'ho piů riscontrato
ciao omnitow


Solo per curiosità ma anche per studio, mandami il db zippato.
Ovviamente puliscilo di tutto quello che non serve.
Ciao, Carlo

 Ciao, Carlo
Non credo ti possa essere utile ormai ho apportato parecchie modifiche, era
il mio primo progetto
ciao omnitow

2) Mi mandi una copia zippata del DB e vedo cosa posso fare.
Questo è alquanto problematico perchè, tra una cosa e l'altra il file
è di circa 16 mega
Adriano
e-mail galad***NOSPAM***@
alma.it

 ha scritto nel messaggio
news:lm2smuo57vqbaf970...@4ax.com...

Controlla il controllo "UltimoAggiornamento" se accetta il valore Date
che gli passi. Vedi se è di tipo data/ora, se ha una maschera di input.
Al limite sostituisce Date con Format(Date,"dd/mm/yyyy")
Riguardo a "Accodi un nuovo recordset alla tabella":
scrivi due righe di codice che aprono la tabella che ti interessa
e accodano i dati:
Dim RCS as Recordset
Set RCS = CurrentDB.OpenRecordset("TuaTabella")
With RCS
.AddNew
!UltimoAggiornamento = Format(Date,"dd/mm/yyyy")
!Agrecap = Me!CapComb.Column(1) 'oppure nz(Me!CapComb.Column(1),"")
!Ente = UCase(Me.Ente)
!CognomeNome = UCase(Me.CognomeNome)
!Indirizzo = UCase(Me.Indirizzo)
!Città = UCase(Me.Città)
'....ecc.
.Update
End With
RCS.Close
Fammi Sapere.
Poi per l'invio del db zippato non è necessario inviarlo tutto
bastano solo le tabelle, le maschere o le query interessate
Ciao, Carlo

RCS.Close
Stasera provo il tuo codice ... probabilmente dovrò sostituire Edit al
posto di AddNew in quanto modificando un record già esistente se
faccio AddNew la cosa non funzia ... già!!! c'è però il problema che
quando aggiungo un record nuovo cosa succede al momento del
salvataggio se metto Edit al posto di AddNew?? ... comunque faccio un
po' di prove e ti faccio sapere.
P.S. spero che la cosa funzioni anche se la tabella in questione è
allegata! ( dal tuo codice: >Set RCS =
CurrentDB.OpenRecordset("TuaTabella") )
Adriano
e-mail galad***NOSPAM***@
alma.it

 e-mail galad***NOSPAM***@
alma.it
Ottime osservazioni. Infatti avevo pensato al problema cercando di
cancellare i dati appena scritti subito prima di fare l'update del
recordset.
Con  Me.Undo prima di .Update
subito dopo ci vuole un requery:
Me.Requery
Non ho provato questa soluzione.
Con Edit non credo funzioni perchè si dovrebbe attivare
una modifica concorrente dello stesso record con conseguente
messaggio su quali modifiche salvare.
Ti sarei grato se mi mandassi uno spezzone di questo DB.
Ciao, Carlo

Ti sarei grato se mi mandassi uno spezzone di questo DB.
Eccoti accontentato, ma forse chi è più contento sono io che, grazie
ai tuoi consigli forse ha risolto il problema.
Dico "forse" perchè vorrei ancora fare ancora delle prove in quanto
come ti ho detto l'anomalia si presentava in media su un 5% di
operazioni di aggiornamento di record. Comunque su una sessantina di
record che ho provato a modificare la Sub si comporta bene.
Ancora un piccolo commento ai dubbi che avevo su AddNew ed Edit e il
fatto che la tabella fosse una tabella allegata.
Come potrai vedere dal codice che ti riporto "in Toto", Io ho messo
EDIT e funziona sia in aggiornamento di un record esistente sia se
inserisco un record nuovo ... tu mi dirai che è strano eppure così
funziona.
Ecco la Sub in questione:
_______________________________
Private Sub Form_BeforeUpdate(Cancel As Integer)
   Dim CodiceImportanza As String
   Dim strTtl As String
   Dim strMsg As String
   strTtl = "Salvare il record?"
   strMsg = "I dati sono cambiati." & vbCrLf & _
            "Vuoi salvare le modifiche?"
   retValue = MsgBox(strMsg, vbQuestion + vbYesNoCancel, strTtl)
   Select Case retValue
       Case vbYes
            Dim RCS As Recordset
            Set RCS = CurrentDb.OpenRecordset("Archivio")
            With RCS
            .Edit
            Me!UltimoAggiornamento = Format(Date, "dd/mm/yyyy")
            Me!Agrecap = Me!Capcomb.Column(1)
            Me!Agrecap.Requery
            Me!Ente = UCase(Me!Ente)
            Me!CognomeNome = UCase(Me!CognomeNome)
            Me!Indirizzo = UCase(Me!Indirizzo)
            Me!Città = UCase(Me!Città)
            Me!Provincia = UCase(Me!Provincia)
            Me!Nazione = UCase(Me!Nazione)
            Me!Presentazione = UCase(Me!Presentazione)
            CodiceImportanza = Me!I01 & Me!I02 & Me!I03 & Me!I04 &
Me!I05 & _
            Me!I06 & Me!I07 & Me!I08 & Me!I09 & Me!I10 & _
            Me!I11 & Me!I12 & Me!I13 & Me!I14 & Me!I15 & _
            Me!I16 & Me!I17 & Me!I18 & Me!I19 & Me!I20 & _
            Me!I21 & Me!I22 & Me!I23 & Me!I24 & Me!I25
            Me!CodiceImportanza = CodiceImportanza
            .Update
            End With
            RCS.Close
       Case vbNo
           DoCmd.RunCommand acCmdUndo
       Case vbCancel
           Cancel = True
   End Select
End Sub
___________________________________________
... spero che le prove che farò nei prossimi giorni non mi riservino
sorprese ... ancora grazie del contributo.
Adriano
e-mail galad***NOSPAM***@
alma.it