Errore: Metodo update o cancel update senza addnew o edit

di il
21 risposte

Errore: Metodo update o cancel update senza addnew o edit

Buongiorno, mi scuso se l'argomento non è di attualità, ma in giro per il web ho trovato poco.
Mi capita l'errore "metodo update o cancel update senza addnew o edit", quando dopo aver modificato via codice il contenuto di un controllo (in genere una textbox) associato ad un campo (esempio: Me.txtNome= "Pippo") e mi sposto su un altro record. La cosa strana è che mi succede non sempre, ma soltanto se lo spostamento di record è eseguito per il tramite di una listbox che elenca tutti i record (con il metodo consueto Me.bookmark=rs.bookmark ecc.). In pratica se mi sposto da un record all'altro con i pulsanti di selezione (le frecce) è tutto OK, lo stesso se uso i tasti Pag.Su e Pag.Giù, mentre con l'altro metodo scatta l'errore. Se eseguo la modifica del controllo via codice nell'evento Form_BeforeUpdate (ad esempio = Me.txtDataUltimaModifica=Now() ) l'errore si ripete due volte: una prima volta nella sub Form_BeforeUpdate (con in codice ADO -2147352567) e quindi si ripete nella sub lstElencoDeiRecord_Click (con il codice DAO 3020). L'errore è sempre lo stesso.
Qualcuno mi può aiutare?
Grazie, Filippo.

21 Risposte

  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Filippo, Filippo!!! (questo nome non mi è nuovo)
    Posta il codice perché così non si capisce dove agire.
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Allora, l'errore si genera anche se lo spostamento tra record è eseguito selezionandolo da un combobox.
    Questi i codici:
    Private Sub cboPrendiFattura_AfterUpdate()

    Dim rs As DAO.Recordset
    On Error GoTo cboPrendiFattura_AfterUpdate_Error

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[IDFattura] = " & CStr(Nz(Me.cboPrendiFattura.Column(0)))
    Me.Bookmark = rs.Bookmark
    Set rs = Nothing
    Exit Sub

    cboPrendiFattura_AfterUpdate_Error:

    Call MostraErrore(Err, Me.Name, "cboPrendiFattura_AfterUpdate")
    Set rs = Nothing

    End Sub


    Private Sub lstElenco_Click()
    Dim rs As DAO.Recordset
    On Error GoTo lstElenco_Click_Error

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[IDFattura] = " & CStr(Nz(Me!lstElenco))

    Me.Bookmark = rs.Bookmark
    Set rs = Nothing
    Exit Sub

    lstElenco_Click_Error:
    Call MostraErrore(Err, Me.Name, "lstElenco_Click")
    Set rs = Nothing

    End Sub

    Private Sub Form_BeforeUpdate(Cancel As Integer)

    On Error GoTo Form_BeforeUpdate_Error
    Me.txtDataUltimaModifica = Now()
    Exit Sub

    Form_BeforeUpdate_Error:
    Call MostraErrore(Err, Me.Name, "Form_BeforeUpdate")

    End Sub

    Grazie, ciao F.
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Se usi il [RecordsetClone], come di norma si dovrebbe fare, al posto del [Recordset.Clone]...?
    Sono 2 oggetti diversi li conosci...?

    Manca poi la verifica del NoMatch che anche se non indispensabile dal momento che un Item sicuramente corrisponde perforza ad un Record... ma se sei su NEWRECORD che succede...?
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    In ogni caso magari ottimizza quel codice non c'è bisogno di scrivere lo stesso codice 3 volte... basta scrivere una Funzione alla quale passi la PK per fare la sincronizzazione del Bookmark...
    
    Function Sincro(vPK as Variant) As Boolean
       On Error GoTo SincroError
       If Len(vPK & vbNullstring) Then exit Function
    
       With Me.RecordsetClone
          .FindFirst "[IDFattura] = " & CStr(vPK)
          If Not .NoMatch then
             Me.Bookmark = .Bookmark
             Sincro=true
          End If
       End With
       Exit Sub
    
    SincroError:
       Call MostraErrore(Err, Me.Name, "lstElenco_Click")
    End Function
    Da richiamare con
    
    Call Sincro(Me!lstElenco)
    oppure
    Call Sincro(Me!cboPrendiFattura)
    ' la Colonna Column(0) se è la BoundColumn è di Default...
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Alex, grazie per le dritte, tra l'altro mi piace molto l'uso di una funzione unica parametrizzata.
    Immagino che la condizione:
    If Len(vPK & vbNullString) Then Exit Function
    sia invece:
    If Len(vPK & vbNullString) = 0 Then Exit Function

    L'ho adottata, ma purtroppo il problema rimane... questi i messaggi di errore e il codice, tra l'altro nella Sub BeforeUpdate l'errore restituito è ADO, nella Function Sincro invece è DAO (ma l'errore è lo stesso....)

    26/10/2020 14:32:19
    Errore n. -2147352567 Metodo Update o CancelUpdate senza AddNew o Edit.
    nel Modulo: frmFattura
    Procedura: Form_BeforeUpdate - Numero di linea: 20
    Operatore: Filippo
    ------------
    26/10/2020 14:32:31
    Errore n. 3020 Metodo Update o CancelUpdate senza AddNew o Edit.
    nel Modulo: frmFattura
    Procedura: Sincro - Numero di linea: 60
    Operatore: Filippo


    Private Sub Form_BeforeUpdate(Cancel As Integer)
    10 On Error GoTo Form_BeforeUpdate_Error
    20 Me.txtDataUltimaModifica = Now()
    30 Exit Sub

    Form_BeforeUpdate_Error:
    40 Call MostraErrore(Err, Me.Name, "Form_BeforeUpdate")
    50 Err.Clear
    End Sub

    Function Sincro(vPK As Variant) As Boolean
    10 On Error GoTo SincroError
    20 If Len(vPK & vbNullString) = 0 Then Exit Function

    30 With Me.RecordsetClone
    40 .FindFirst "[IDFattura] = " & CStr(vPK)
    50 If Not .NoMatch Then
    60 Me.Bookmark = .Bookmark
    70 Sincro = True
    80 End If
    90 End With
    100 On Error GoTo 0
    110 Exit Function

    SincroError:
    120 Call MostraErrore(Err, Me.Name, "Sincro")
    130 Err.Clear
    End Function
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Si la riga corretta è questa, l'ho scritta a braccio
    
    If Len(vPK & vbNullString) = 0 Then Exit Function
    Il problema, non è nello spostare il Bookmark, ma nel fatto che quando vai a scrivere nella TextBox si attiva la transazione di EDIT e, se non la chiudi e tenti di spostare il Bookmark ovviamente si arrabbia...!
    ADO non c'entra nulla, è solo DAO in questo caso.

    Quindi se la proprietà di Form è DIRTY allora si spiega l'errore... lo riesci a determinare mettendo in Debug Me.Dirty, che significa Transazione aperta o Modifica non salvata...!
    In questo caso hai 3 opzioni:
    1° SALVI, con DoCmd.RunCommand acCmdSaveRecord
    2° Forzi la Proprietà Me.Dirty=False, in teoria perdi le modifiche, ma ti consente di spostarti...
    3° Sempre su Evento BeforeUpdate intercetti il Dirty e chiedi all'utente se fare il Commit(salvando) o RollBack(Forzando Cancel=True)

    Fai qualche prova...
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Sto facendo delle prove ma il problema rimane (in Form_AfterUpdate ho inserto If Me.Dirty ecc. ma l'errore compare sempre)
    Il punto è che se cambio record usando i pulsanti di spostamento (le frecce in basso a sinistra per intenderci) oppure la tastiera, fila tutto liscio... quindi non capisco...
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Non ho detto AfterUpdate mi pare... su After(Dopo) il Dirty è RESETTATO.
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Volevo dire BeforeUpdate, ovviamene, scusa.... il problema resta
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Lo leggi prima o dopo l'EDIT della textBox...?
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Alex (intanto grazie....) questo è il codice e questi gli errori:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim Titolo As String
    Dim Messaggio As String
    10 On Error GoTo Form_BeforeUpdate_Error
    20 Titolo = "Salvare il record?"
    30 Messaggio = "I dati sono cambiati." & vbCrLf & "Vuoi salvare le modifiche?"
    40 If Me.Dirty = True Then
    50 Select Case MsgBox(Messaggio, vbQuestion + vbYesNoCancel, Titolo)
    Case vbYes
    60 Me.txtDataUltimaModifica = Now()
    70 Case vbNo
    80 DoCmd.RunCommand acCmdUndo
    90 Case vbCancel
    100 Cancel = True
    110 End Select
    120 End If
    130 Exit Sub

    Form_BeforeUpdate_Error:

    140 Call MostraErrore(Err, Me.Name, "Form_BeforeUpdate")
    150 Err.Clear



    End Sub



    ------------
    26/10/2020 16:48:18
    Errore n. -2147352567 Metodo Update o CancelUpdate senza AddNew o Edit.
    nel Modulo: frmFattura
    Procedura: Form_BeforeUpdate - Numero di linea: 60
    Operatore: FV

    ------------
    26/10/2020 16:48:25
    Errore n. 3020 Metodo Update o CancelUpdate senza AddNew o Edit.
    nel Modulo: frmFattura
    Procedura: Sincro - Numero di linea: 60
    Operatore: FV
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Alex, scusa, non fare caso al codice che precede (l'ultimo) anche se, cambiando record con i pulsanti non sorgono problemi... neanche con quel codice.
    Mi pare che l'evento Before_Update si verifica soltanto quando è stato editato il controllo, esatto? Quindi la proprietà Dirty è sempre true, e allora non ha senso intercettarla.... si può sempre chiedere la conferma all'utente sul Commit/Rollback, o sbaglio?
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Premesso che quello che fai deve avere un problema di fondo che non racconti... altrimenti quell'errore non verrebbe generato in quanto nessuna delle cose che citi può interferire.
    Fatico a capire diverse cose per le quali sarebbe opportuno avere un DEMO di test.

    P.s. verifica Dirty non su BeforeUpdate, è corretta la tua osservazione, ma verificato prima del Findfirst per capire se è in corso una transazione e di modifica...

    Se hai un demo è meglio sono certo ci siano delle cose appese che si rincorrono e che tu sottovaluti puntando l'attenzione all'errore ma senza comprenderne le vere cause... e noi siamo abbastanza ciechi direi.
  • Re: Errore: Metodo update o cancel update senza addnew o edit

    Non so che dire... ho fatto una prova con un altro database, una semplice anagrafica, e il problema si presenta tale e quale. In pratica, si esegue una qualsiasi modifica su un record dal form, poi si passa ad un altro record. Nell'evento Form_BeforeUpdate si edita un controllo associato a un campo del record corrente (la data di modifica o anche qualche altra cosa, non è rilevante). Ora, se per spostarsi a un altro record si sono usati i pulsanti di spostamento (le frecce) oppure con i tasti PagUp e PagDown non ci sono problemi, se si è usato il metodo di cui abbiamo parlato (tramite listbox o combo) allora si presenta sempre quell'errore. Non ho verificato il comportamento se per muoversi tra i record si usa il comando DoCmd.GotoRecord ... Domani provo a mandarti un demo, per ora grazie.
Devi accedere o registrarti per scrivere nel forum
21 risposte