Evitare salvataggio automatico

di il
16 risposte

Evitare salvataggio automatico

Voglio evitare il salvataggio automatico.

ho pensato di fare così

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.Dirty And AllowEdits = True Then
Dim risposta
risposta = MsgBox("Salvare le modifiche?" & vbCrLf & "(Si=Salva, No=elimina modifice, Annulla=Continua modifiche", vbYesNoCancel, "Salva modifiche")
If risposta = vbYes Then
 AllowEdits = False
 Cancel = False
ElseIf risposta = vbNo Then
 Cancel = True
 Me.Undo
Else
Cancel = True
End If
End If
End Sub

Verifico AllowEdits per poter scorrere tutti i record senza che si attivi msgbox.

Un altra cosettina vorrei che su Yes si rimane sul record corrente e non andare al successivo poiché potrebbe capitare di andare su maschera vuota se ultimo record cosa indesiderata

16 Risposte

  • Re: Evitare salvataggio automatico

    Il codice che scrivi è illogico… innnazitutto stai manipolando AllowEdits cosa assurda se sei tu a voler gestire il Salvataggio, ed oltretutto se rispondi YES alla domanda perchè forzi AllowEdits = False che invece inibisce il save…?

    Detto ciò mi sfugge la logica… 

  • Re: Evitare salvataggio automatico

    06/04/2023 - @Alex ha scritto:


    Il codice che scrivi è illogico… innnazitutto stai manipolando AllowEdits cosa assurda se sei tu a voler gestire il Salvataggio, ed oltretutto se rispondi YES alla domanda perchè forzi AllowEdits = False che invece inibisce il save…?

    Detto ciò mi sfugge la logica… 

    Ho usato AllowEdits altrimenti non è possibile scorre tra i record poiche viene sempre il messaggio di salvataggio anche quando non ho fatto modifiche.

    cos'altro non è logico?

  • Re: Evitare salvataggio automatico

    Direi che non è logico NULLA… quello che dici è assurdo, è SBAGLIATO…!!!!

    Se non modifichi alcun dato in fase di scorrimento Records, non scatena ASSOLUTAMENTE MAI il BeforeUpdate proprio perchè non hai Dirty a True.

    Questa cosa che ti ho detto è una Milestone che ti dovrebbe essere chiara, partendo da questa… l'unico evento che si scatena su scorrimento Records è solo CURRENT.

    Temo invece che tu abbia farcito di codici in modo non consapevole che generano conflitti tra le cose che fai, ti invito a fare qualche riflessione più razionale.

  • Re: Evitare salvataggio automatico

    06/04/2023 - @Alex ha scritto:


    Questa cosa che ti ho detto è una Milestone che ti dovrebbe essere chiara, partendo da questa… l'unico evento che si scatena su scorrimento Records è solo CURRENT.

    Temo invece che tu abbia farcito di codici in modo non consapevole che generano conflitti tra le cose che fai, ti invito a fare qualche riflessione più razionale.

    Ho fatto un controllo sull'evento Current e mi son accorto che avevo una funzione che assegnava valori ad alcuni controlli. Ora funziona.

    Function save(Cancel As Integer)
    If Me.Dirty Then
    Dim risposta
    risposta = MsgBox("Salvare le modifiche?" & vbCrLf & "(Si=Salva, No=Elimina modifice, Annulla=Continua modifiche", vbYesNoCancel, "Salva modifiche")
    If risposta = vbYes Then
     Cancel = False
    ElseIf risposta = vbNo Then
     Cancel = True
     Me.Undo
    Else
    Cancel = True
    End If
    End If
    End function

    Ora  ho portato il codice di il codice dell'evento in una funzione per poterlo usare anche con il pulsante salva.

    il problema è che quando premo su annulla mi salva il record invece di farmi continuare la modifica.

  • Re: Evitare salvataggio automatico

    Quella funzione come la chiami e da dove…?
    Il fatto tu abbia messo nel parametro della Funzione il Cancel As Integer… non significa che serva poi… 

    Il Cancel è un prametro specifico degli Eventi Transazionali, e solo in quelli ha l'effetto di RollBack transazionale, nella tua Funzione, non serve a nulla… ed ovviamente salva.

  • Re: Evitare salvataggio automatico

    07/04/2023 - @Alex ha scritto:


    Quella funzione come la chiami e da dove…?
    Il fatto tu abbia messo nel parametro della Funzione il Cancel As Integer… non significa che serva poi… 

    La funzione la chiamo sull'evento Form_BeforeUpdate o alla pressione di un pulsante.

  • Re: Evitare salvataggio automatico

    Si ma dubito tu lo faccia nel modo corretto… per come hai scritto la funzione.

    Quindi se vuoi passare il codice completo bene, altrimenti non so come aiutarti.

  • Re: Evitare salvataggio automatico

    Sto cercando di mettere il codice salva in un modulo così da poterlo utilizzare su più maschere.
    Quando vado a fare il salva mi chiede due volte salva e alla seconda da errore.

    Public Function save_record()
    On Error GoTo Err_save_reocord_Click
     With CodeContextObject
    If .Form.Dirty Then
    Dim risposta
    risposta = MsgBox("Salvare le modifiche?" & vbCrLf & "(Si=Salva, No=elimina modifice, Annulla=Continua modifiche", vbYesNoCancel, "Salva modifiche")
    If risposta = vbYes Then
    DoCmd.RunCommand acCmdSaveRecord
    .Form.AllowEdits = False
    .Form.Refresh
    ElseIf risposta = vbNo Then
    .Form.Undo
    .Form.Refresh
    .Form.AllowEdits = False
    End If
    Else
    MsgBox "Nessuna modifica", vbInformation = vbOK, "Nessuna modifica"
    .Form.Caption = .Form.name
    .Form.AllowEdits = False
    End If
    End With
    Exit_save_reocord_Click:
        Exit Function
    Err_save_reocord_Click:
        MsgBox Err.Description
        Resume Exit_save_reocord_Click
    End Function
    
  • Re: Evitare salvataggio automatico

    Ti ho già cercato di spiegare che se non ti inserisci in un evento transazionale di Form, quello che fai non funziona, avevi iniziato a scrivere una funzione potenzialmente usabile ma funzionalemente non corretta… ora scrivi questo codice che torna a capo come principio ma che concettualmente ha errori sostanziali di non comprensione del tema… boh…

    Non capiamo come e da che evento la chiami, cosa che ti ho chiesto 2 volte… insomma ti lascio sperimentare… con tutta tranquillità.

    Buon lavoro.

  • Re: Evitare salvataggio automatico

    Anzi ti mostro come si potrebbe ragionare, poi ci pensi sopra e confronti con quello che hai fatto….

    Function SaveDataCancel(Optional mfrm As Access.Form) As Integer
        Dim risposta    As VBA.VbMsgBoxResult
        Dim frm         As Access.Form
        SaveDataCancel= False
        Set frm=mFrm
        If frm is nothing then Set frm = Application.CodeContextObject
        If frm.Dirty Then
            risposta = MsgBox("Salvare le modifiche?" & vbCrLf & "(Si=Salva, No=elimina modifice, Annulla=Continua modifiche", vbYesNoCancel, "Salva modifiche")
            If risposta = vbNo Then
                SaveDataCancel= True 
                frm.Undo
            Else
        End If
    End Function

    Da chiamare nell'evento BeforeUpdate:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    	Cancel = SaveData(Me) ' si può chiamare anche SaveData() ma io da dentro le form preferisco esplicitare
    End Sub

    Ora che questo abbia senso farlo in una Funzione comune e non nella Maschera… mah… a me non piace e lascia il tempo che trova, sicuramente prima di metterti a scrivere codice esterno impara a far funzionare le cose semplici…!!!

    Questto fa la stessa cosa:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
        If frm.Dirty Then
            If MsgBox("Salvare le modifiche?" & vbCrLf & "(Si=Salva, No=elimina modifice, Annulla=Continua modifiche", vbYesNoCancel, "Salva modifiche") = vbNo Then
                Cancel = True
                Me.Undo
            Else
        End If
    End Sub
  • Re: Evitare salvataggio automatico

    12/04/2023 - @Alex ha scritto:


    Ti ho già cercato di spiegare che se non ti inserisci in un evento transazionale di Form, quello che fai non funziona, avevi iniziato a scrivere una funzione potenzialmente usabile ma funzionalemente non corretta… ora scrivi questo codice che torna a capo come principio ma che concettualmente ha errori sostanziali di non comprensione del tema… boh…

    Non capiamo come e da che evento la chiami, cosa che ti ho chiesto 2 volte… insomma ti lascio sperimentare… con tutta tranquillità.

    Buon lavoro.

    Come avevo già scritto  richiamo la funzione  principalmente al clic su un pulsante poi anche su  Form_BeforeUpdate.
    Avevo usato vbYesNoCancel perchè voglio che se si fa clic su Annulla non succede nulla , niente salva, e si può contunuare con la modifica. 

    @Alex grazie del codice

    Alla risposta Yes devo rendere il modulo non modificabile, ma mi esce tale errore:

    Impossibile salvare i dati nel campo a causa della macro o funione impostata sulla proprieta PrimaDiAggiiornare o 
    ValidaSe di tale campo
  • Re: Evitare salvataggio automatico

    Per non rendere modificabile il Record, tu vorresti usare AllowEdits, ma lo vuoi usare in fase TRANSAZIONALE, cosa che se ci ragioni sopra… è quanto meno dubbia, come puoi rendere non editabile mentre devi salvare…?

    Non pensi non sia l'evento giusto…?

    Non conviene su Current, gestire la cosa…? Su current quando si scatena il record non è ancora toccato, quindi per modificarlo devi schiacciare qualche cosa che ne modifichi i permissivi… quindi la logica contorta che usi è fallimentare.

    Private Sub Form_Current()
    	If Not Me.NewRecord And Me.AllowEdits then Me.AllowEdits=False
    End Sub

    Questa riga blocca il record a prescindere se è sbloccato e quando si genera il Save si genera il Current…

    Io ripeto, tu dovresti prima di buttarti a scrivere codice, impiegare qualche momento per capire come funzionano gli eventi e la logica con cui si opera… altrimenti…

  • Re: Evitare salvataggio automatico

    Per semplificarmi sto facendo le prove su una maschera.

    Come mi ha scritto @Alex ho blocco le modifiche su Current

    Private Sub Form_Current()
    	If Not Me.NewRecord And Me.AllowEdits then Me.AllowEdits=False
    End Sub

    Su un pulsante rendo modificabile la maschera.

    Eseguo la funzione save_record su due eventi:

    Private Sub Form_BeforeUpdate(cancel As Integer)
    save_record
    End Sub
    
    Private Sub Salva_Click()
    save_record
    End Sub

    la funzione save_record

    Function save_record()
    If Me.Dirty Then
    Dim risposta
    risposta = MsgBox("Salvare le modifiche?" & vbCrLf & "(Si=Salva, No=Elimina modifice, Annulla=Continua modifiche", vbYesNoCancel, "Salva modifiche")
    If risposta = vbNo Then
    Me.Undo
    Me.SetFocus
    Me.Caption = Me.name
    Me.Modifica.Caption = "M&odifica"
    Me.Salva.Enabled = False
    Me.Refresh
    ElseIf risposta = vbCancel Then
    Exit Function
    Else
    Me.Caption = Me.name
    Me.Modifica.Caption = "M&odifica"
    Me.Salva.Enabled = False
    End If
    Else
    MsgBox "Nessuna modifica", vbInformation = vbOK, "Nessuna modifica"
    Me.Undo
    End If
    End Function

    Ora l'evento Form_BeforeUpdate si attiva sempre però vorrei che quando si fa click su SI la maschera deve essere nuovamente non modificabile e l'evento Form_BeforeUpdate non si deve attivare.

  • Re: Evitare salvataggio automatico

    Temo che tu abbia poca linearità di ragionamenti perchè, nononstante ti abbia suggerito di RAGIONARE… non lo fai.

    Perchè devi lanciare la funzione su SALVA_CLICK…?
    Quale motivo ti spinge a farlo…?

    Devi preoccuparti che venga eseguito il BeforeUpdate e basta, e questo lo ottieni se, su SALVA fai quello che dice il Button… SALVI.

    Private Sub Salva_Click()
    	DoCmd.RunCommand acCmdSaveRecord
    End Sub

    In questo modo forzi il Salvataggio, viene scatenato il BEFOREUPDATE e deciderai se salvare veramente o meno…

Devi accedere o registrarti per scrivere nel forum
16 risposte