Eliminazione record da codice vba

Anonimo
2018-09-14T17:51:09+00:00

Ciao ragazzi,

sono sempre alle prese con il mio dbase per la gestione della programmazione di progetti.

Con il validissimo aiuto di Vladimiro, abbiamo sviluppato il codice (abbastanza complesso) per gestire la programmazione.

Ora tra i vari controlli che esegue il codice già scritto e funzionante, c'è la possibilità di modificare l'importo di un finanziamento solo dopo aver eliminato il record già registrato ... tutto ciò avviene, naturalmente a mezzo codice ma l'eliminazione deve essere fatta manualmente.

Volevo implementare tale codice in modo che, al comparire della msgbox che mi avvisa della possibilità di modificare l'importo solo dopo aver eliminato il record corrente, l'eliminazione possa essere fatta a mezzo codice.

Questa la maschera che compare con il codice che sono riuscito a modificare:

e questo è il codice:

Private Sub IMPORTO_FINAN_PROG_BeforeUpdate(Cancel As Integer)

If Me!Verifica = 1 Then

    MsgBox "Attenzione, per modificare il record bisogna prima eliminarlo." & vbCrLf & "Vuoi eliminare il record corrente?", vbYesNo + vbCritical

    Cancel = True

    Me.Undo

    Exit Sub

End If

Naturalmente se rispondo SI dovrebbe comparire un ulteriore msgbox di richiesta conferma del tipo "Sei sicuro di voler eliminare il record?"

e dopo seguire il codice per l'eliminazione del record.

In caso rispondo NO l'operazione si annulla e il codice dovrebbe già essere scritto.

Grazie per il vostro prezioso aiuto!

Ciao

Luca

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-09-18T20:10:29+00:00

Ciao Vladimiro

sei un genio .... io non ci avevo pensato ... così è fantasticoooooo!!!

Grazie, grazie, grazie.....meno male che ci sei tu

Ciao

Luca

Ciao Vladimiro,

questa mattina, nel fare un ulteriore test di inserimento dato nel dbase che conosci, durante la fase di eliminazione di un record della Tabella FINANAZIAMENTO_PROGETTI mi compare un errore che nella prima stesura non è comparso.

Ti specifico, per chiarezza, che ieri ho utilizzato il Dbase su un pc con Access2010. Questa mattina invece l'ho aperto con Access2007.

E' possibile che l'errore si sia creato in relazione all'apertura del DB con access 2010.

Tieni conto che lo userò, appena decido di fermarmi nell'elaborazione, su un pc con access2007.

L'errore di cui parlo è quello raffigurato sotto:

ad ogni modo al link che ti posto trovi il db

https://1drv.ms/u/s!AtAJ5hV8tzhMjx-KIPFD2USXwns3

Ciao e grazie

Luca

Ciao Luca,

fortunatamente avevo in un vecchio computer la versione di Office 2007 :-)

Il problema risiede proprio nella versione 2007 in quanto non accetta il codice scritto in "Prima di aggiornare " della casella di testo "IMPORTO_FINAN_PROG".

Fai così,

elimina tutto il codice in "Prima di aggiornare" e "Su modifica", sostituisci il codice presente con questo:

If Len(ID_FINAN & "") = 0 Then

    Beep

    Me.Undo

    Exit Sub

End If

If Me!Verifica = 1 Then

   If MsgBox("Attenzione, per modificare il record bisogna prima eliminarlo, continuare?", _

    vbQuestion + vbCritical + vbYesNo) = vbNo Then

        Me.Undo

        Exit Sub

      Else

        Me.Undo

        DoCmd.OpenForm "ELIMINA_FINANZIAMENTO", , , "[ID_FINAN_PROG] = " & Me!ID_FINAN_PROG

        Exit Sub

    End If

If Me!IMPORTO_FINAN_PROG > Importo_Finanziamento And Parent!COLLAUDATO = 0 Then

    MsgBox "Attenzione, l'importo inserito è maggiore dell'attuale finanziamento scelto.", vbInformation

    Me.Undo

    Exit Sub

End If

End If

Vladimiro

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-09-15T18:59:42+00:00

Ciao Vladimiro,

in effetti il tuo suggerimento di ritornare alla maschera principale (NEW_PROGETTO) mi era venuto anche a me, ma purtroppo non sapevo come gestire l'evento.

Mi spiego, nel momento in cui veniva eliminato il record, non avevo più il riferimento all'ID_PROG per ritornare alla maschera iniziale il codice che conoscevo io  

DoCmd.OpenForm "NEW_PROGETTO", , , "[ID_PROG] = " & Me!ID_PROG. non funziona in modo corretto.

Chiaramente con il tuo codice e l'introduzione della chiave=ID_PROG la cosa è fattibile.

Grazie mille delle soluzioni (sempre appropriate) e dei suggerimenti ..... adesso è veramente quasi perfetto il dbase !!!

Un saluto e .... alla prossima

Luca

Ciao Luca,

mi è venuto un flash :-)

Stavo pensando una cosa,

non sarebbe più corretto, in fase di chiusura maschera "ELIMINA_FINANZIAMENTO", ritornare nella scheda "Finanziamenti" da dove realmente hai aperto la maschera di eliminazione record?

Private Sub Form_Close()

    'DoCmd.OpenForm "HOME_PROGETTI"

    DoCmd.OpenForm "NEW_PROGETTO", , , "[ID_PROG] = " & Chiave

    DoCmd.GoToControl "PagFinanz"

End Sub

Vladimiro

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-09-15T15:55:17+00:00

Ciao Vladimiro,

grazie a parte del tuo codice avrei risolto il problema che ho risolto nella versione del dbase che ti allego.

Se hai voglia e tempo di darci una occhiata ... mi dici cosa ne pensi ... se può essere un metodo valido.

Grazie

Luca

https://1drv.ms/u/s!AtAJ5hV8tzhMjkkyHhX2jZREEO1G

Ciao Luca,

hai visto che alla fine hai trovato una scappatoia?

Complimenti!!!

Per quanto riguarda la routine, ho lasciato un commento alle cose utili da sapere, più un nuovo accorgimento che al posto tuo adotterei e cioè:

siccome ho notato che quando chiudi la maschera di eliminazione, non ritorni al punto in cui l'hai aperta, non sarebbe più corretto farlo? 

Ti incollo tutto il codice presente nella maschera "ELIMINA_FINANZIAMENTO" compreso quello che ho reso non eseguibile e che dovrai sostituire al posto di quello presente (Modifica/Seleziona tutto/Incolla)

Option Compare Database

Option Explicit

'la seguente variabile la devi dichiarare nel modulo della maschera in modo da poterla richiamare in qualsiasi punto della suddetta maschera

Dim Chiave As Integer

Private Sub Form_Close()

    'DoCmd.OpenForm "HOME_PROGETTI"

    DoCmd.OpenForm "NEW_PROGETTO", , , "[ID_PROG] = " & Chiave

End Sub

Private Sub Form_Open(Cancel As Integer)

    Chiave = Me!ID_PROG

    DoCmd.Close acForm, "NEW_PROGETTO"

    DoCmd.Close acForm, "HOME_PROGETTI"

End Sub

Private Sub Nuovo_Click()

    If MsgBox("Sei sicuro di voler eliminare questo record?", _

    vbQuestion + vbCritical + vbYesNo) = vbNo Then

     ' non serve ->   Me.Undo

     ' non serve in quanto la "Sub" corrente ha un solo evento  ->   Exit Sub

      Else

         DoCmd.SetWarnings False

         DoCmd.RunCommand acCmdDeleteRecord

         DoCmd.SetWarnings True

         DoCmd.Close

     'non serve in quanto la seguente azione la trovi in chiusura maschera -> DoCmd.OpenForm "HOME_PROGETTI"

     ' ->   Exit Sub

    End If

End Sub

Vladimiro

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2018-09-14T22:14:42+00:00

Ciao ragazzi,

sono sempre alle prese con il mio dbase per la gestione della programmazione di progetti.

Con il validissimo aiuto di Vladimiro, abbiamo sviluppato il codice (abbastanza complesso) per gestire la programmazione.

Ora tra i vari controlli che esegue il codice già scritto e funzionante, c'è la possibilità di modificare l'importo di un finanziamento solo dopo aver eliminato il record già registrato ... tutto ciò avviene, naturalmente a mezzo codice ma l'eliminazione deve essere fatta manualmente.

Volevo implementare tale codice in modo che, al comparire della msgbox che mi avvisa della possibilità di modificare l'importo solo dopo aver eliminato il record corrente, l'eliminazione possa essere fatta a mezzo codice.

Questa la maschera che compare con il codice che sono riuscito a modificare:

e questo è il codice:

Private Sub IMPORTO_FINAN_PROG_BeforeUpdate(Cancel As Integer)

If Me!Verifica = 1 Then

    MsgBox "Attenzione, per modificare il record bisogna prima eliminarlo." & vbCrLf & "Vuoi eliminare il record corrente?", vbYesNo + vbCritical

    Cancel = True

    Me.Undo

    Exit Sub

End If

Naturalmente se rispondo SI dovrebbe comparire un ulteriore msgbox di richiesta conferma del tipo "Sei sicuro di voler eliminare il record?"

e dopo seguire il codice per l'eliminazione del record.

In caso rispondo NO l'operazione si annulla e il codice dovrebbe già essere scritto.

Grazie per il vostro prezioso aiuto!

Ciao

Luca

Ciao Luca,

ci sono diversi problemi che ostacolano l'eliminazione del record corrente tramite codice VBA.

Primo problema è che la routine che hai mostrato si trova su "Prima di aggiornare" il che significa che l'eliminazione del record non può avvenire in quanto si trova ancora in fase di esecuzione, cioè non è un record già salvato in memoria.

Potresti eventualmente eseguire l'eliminazione del record su "Modifica" -> Private Sub IMPORTO_FINAN_PROG_Change()

ma conoscendo il database te lo sconsiglio in quanto le routine che si trovano in ogni controllo, in fase di esecuzione, andrebbero ad ostacolare la corretta eliminazione del record corrente.

Secondo problema è che hai la visualizzazione della sottomaschera impostata a "Foglio dati" per cui, anche volendo inserire un pulsante di eliminazione, non riusciresti comunque a visualizzarlo.

Dopo questa breve premessa, se trovi un sistema per risolvere, la routine che chiedi è la seguente:

If MsgBox("Attenzione, per modificare il seguente record bisogna prima eliminarlo., continuare?", _

        vbQuestion + vbCritical + vbYesNo) = vbNo Then

        Me.Undo

        Exit Sub

    ElseIf MsgBox(" Dopo l'eliminazione non si può più annullare.Continuare?", _

        vbQuestion + vbCritical + vbYesNo, "Azzeramento dati in corso") = vbNo Then

        Me.Undo

        Exit Sub

    Else

        DoCmd.SetWarnings False

        DoCmd.RunCommand acCmdDeleteRecord

        DoCmd.SetWarnings True

        Exit Sub

    End If

Vladimiro

La risposta è stata utile?

0 commenti Nessun commento

6 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2018-09-15T08:22:48+00:00

    Ciao Vladimiro,

    grazie per la risposta,

    però volevo solo fare qualche precisazione in merito alle tue precisazioni.

    Primo problema è che la routine che hai mostrato si trova su "Prima di aggiornare" il che significa che l'eliminazione del record non può avvenire in quanto si trova ancora in fase di esecuzione, cioè non è un record già salvato in memoria.

    In merito alla tua osservazione ciò che asserisci è vero, però volevo ricordarti che la routine che ho mostrato, pur trovandosi su "Prima di aggiornare" della casella IMPORTO_FINAN_PROG il record è già registrato nella tabella.

    Infatti se tento di cambiare l'importo già registrato il controllo tramite routine mi impedisce la modifica se prima non elimino il record.

    Ecco il motivo per cui cercavo il modo per poter, eventualmente, procedere con l'eliminazione del record. Tieni conto che, in tutta probabilità, questo dbase lo utilizzerà anche un mio collega che però ha a disposizione la versione di access runtime, quindi mi sorge il dubbio che possa procedere con l'eliminazione del record nel caso di errore o di necessità di modifica degli importi già registrati nella tabella.

    Secondo problema è che hai la visualizzazione della sottomaschera impostata a "Foglio dati" per cui, anche volendo inserire un pulsante di eliminazione, non riusciresti comunque a visualizzarlo.

    Per questa possibilità, potrei eventualmente cambiare la sottomaschera da visualizzazione dati in maschere continue. Tu cosa mi consigli?

    Grazie

    Luca

    La risposta è stata utile?

    0 commenti Nessun commento