+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

Aiuto per conferma modifica dati dopo aggiornamento di un campo con VBA..

  1. #1
    Lothar non è in linea Novello
    Salve ragazzi, avrei bisogno di un piccolo aiuto per la gestione di un db in access. Molto semplicemente ho una maschera con diversi campi, alcuni dei quali sono caselle combinate col classico menu a tenda. Per evitare errori di inserimento casuali degli utenti (tipo mouse che sfugge e clic accidentale che cambia un valore in una casella..), vorrei che dopo il primo inserimento, in alcuni campi, comparisse un messaggio di scelta per l'utente che lo avvisa che è già stato inserito un valore almeno una volta e chieda conferma della modifica. Penso sia un problema abbastanza comune nei database.. Ho cercato un pochino in giro ma senza trovare esattamente lo stesso problema. Sto provando col VBA in questo modo, con una combobox che ha solo 2 scelte , supponiamo : bianco/nero :

    Private Sub miacombobox_AfterUpdate()


    If MsgBox("Stai modificando un valore già immesso. Sei sicuro della modifica?", vbYesNo) = vbNo Then
    Me.Undo
    Cancel = True


    End If
    End Sub
    Allora funziona solo in parte,innanzi tutto funziona solo per la prima modifica dall'apertura della form! cioè, se ad esempio, aperta la maschera il valore è impostato su BIANCO e cerco di passare a NERO appare il messaggio di conferma , se scelgo "NO" tutto ok la casella resta su BIANCO. Se pero' cambio a NERO una sola volta, poi il comando non funziona piu' e se scelgo SI (quindi consenti passaggio a bianco) mi resta sempre su NERO. Dove è l'errore?
    Alcuni chiarimenti poi...

    1. Che differenza c'è nel mettere questa piccola routine su Beforeupdate o metterla su Afterupdate della casella?

    2. Dal momento che la prima volta che si apre una form vuota i campi sono vuoti, nulli ,risulta fastidioso per l'utente questo messaggio che compare anche al primo inserimento, come si potrebbe far si che il BOX di conferma modifica compaia solo dopo il primo inserimento?

    Grazie mille a chi saprà darmi una mano

  2. #2
    monello non è in linea Scribacchino
    Prova con Me.dirty

    If Me.Dirty Then Me.Undo
    ℹ️ Leggi di più su monello ...

  3. #3
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    [AfterUpdate], anche per i meno Anglofoni, significa DOPO AGGIORNAMENTO... ti dice nulla, oltretutto Cancel non vedi che non è esposto...???

    Usa BeforeUpdate e vedrai che hai a disposizione anche il CANCEL...

    Se leggessi l'Help queste cose ti verrebbero immediate....
    ℹ️ Leggi di più su @Alex ...

  4. #4
    Lothar non è in linea Novello
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    [AfterUpdate], anche per i meno Anglofoni, significa DOPO AGGIORNAMENTO... ti dice nulla, oltretutto Cancel non vedi che non è esposto...???

    Usa BeforeUpdate e vedrai che hai a disposizione anche il CANCEL...

    Se leggessi l'Help queste cose ti verrebbero immediate....
    grazie , si lo so che vuol dire afterupdate, ma intendevo se era corretto usare appunto before o after, provo a correggere e vi faccio sapere,

  5. #5
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    La mia risposta era per sottolineare che AFTER significando DOPO preclude il fatto di poter tornare indietro... in quanto l'evento si scatena DOPO l'aggiornamento quindi non ANNULLABILE, mentre il BEFORE viene generato prima dell'aggiornamento e può essere ANNULLATO...!!!!!
    ℹ️ Leggi di più su @Alex ...

  6. #6
    Lothar non è in linea Novello
    ok inserendo la routine su Beforeupdate sembra funzionare! Grazie ragazzi, ora però rimane il problema dei primi inserimenti, dal momento che nella maschera ci sono tante caselle di testo che vanno compilate tutte per la prima volta, vorrei far si che questo messaggio non compaia per il primo inserimento, ma soltanto se è gia' stato immesso un valore in precedenza nella casella (per evitare cambiamenti accidentali appunto), poichè sarebbe fastidioso per l'utente stare sempre a dare conferma. Secondo voi come si puo' fare? riporto il codice attuale se puo' essere utile ad altri:


    Private Sub miacombobox_BeforeUpdate()
    If MsgBox("Stai modificando un valore già immesso. Sei sicuro della modifica?", vbYesNo) = vbNo Then
    Me.Undo
    Cancel = True


    End If
    End Sub
    Grazie

  7. #7
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Mi chiedo perchè di tanta supereficialità...!!!!^????
    Quello che hai scritto è INVENTATO..!!
    L'evento BeforeUpdate non è quello che hai scritto, espone il parametro CANCEL, che poi peraltro usi senza nemmeno aver capito come e perchè, nel codice...!
    Cosa costa almeno scrivere le cose giuste invece che buttare li la prima cosa che viene in mente...?

    Se ti venissero date risposte con la medesima superficialità con cui tu dai feedback ne saresti infastidito, quindi cerca di considerare i frequentatori allo stesso modo.

    L'evento corretto è questo:
    Private Sub miacombobox_BeforeUpdate(Cancel As Integer)
    ....
    End Sub
    
    Per rispondere alla domanda devi verificare la proprietà OldValue ed in base a quella decidi.
    ℹ️ Leggi di più su @Alex ...

  8. #8
    Lothar non è in linea Novello
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Mi chiedo perchè di tanta supereficialità...!!!!^????
    Quello che hai scritto è INVENTATO..!!
    L'evento BeforeUpdate non è quello che hai scritto, espone il parametro CANCEL, che poi peraltro usi senza nemmeno aver capito come e perchè, nel codice...!
    Cosa costa almeno scrivere le cose giuste invece che buttare li la prima cosa che viene in mente...?

    Se ti venissero date risposte con la medesima superficialità con cui tu dai feedback ne saresti infastidito, quindi cerca di considerare i frequentatori allo stesso modo.

    L'evento corretto è questo:
    Private Sub miacombobox_BeforeUpdate(Cancel As Integer)
    ....
    End Sub
    
    Per rispondere alla domanda devi verificare la proprietà OldValue ed in base a quella decidi.
    Hai ragione, cercherò di essere piu' preciso in futuro, con il VBA sono alle prime armi, scusatemi. Provo a vedere come usare la proprietà OldValue come suggerito..grazie

  9. #9
    Lothar non è in linea Novello
    Ok ragazzi forse ci siamo!! ci ho messo un'ora a capire fra tentativi vari ma che volete farci col VBA sono imbranatissimo

    allora posto il codice che almeno nella mia maschera sembra funzionare, perdonate eventuali errori!
    Private Sub miocampo_BeforeUpdate(Cancel As Integer)

    If IsNull(Me.miocampo.OldValue) Then

    Exit Sub

    Else

    If MsgBox("Stai modificando un valore già immesso almeno una volta. Sei sicuro della modifica?", vbYesNo) = vbNo Then
    Me.miocampo.Undo
    Cancel = True

    End If
    End If

    End Sub
    Bene, in tal modo se si apre la maschera per la prima volta e si modifica il campo la routine viene terminata (non compare nessun messaggio) perchè è la prima volta che si inserisce il valore ed il campo è vuoto (confronto con OldValue come diceva Alex penso), se invece si esce dalla maschera e si rientra al primo tentativo di modifica compare il messaggio di scelta e premendo "no" la modifica è annullata. Unico neo è che si possono fare quante modifche si vuole alla prima apertura della maschera senza che compaia messaggio di avviso, ma direi che per ora è sufficiente...
    Spero che possa servire a qualcun altro, e perdonate eventuali errori!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. vba update campo tabella dopo aggiornamento
    Da red_apple nel forum Microsoft Access
    Risposte: 3
    Ultimo Post: 21-06-2014, 09:22
  2. modifica campo dopo aver eseguito una query
    Da red_apple nel forum Microsoft Access
    Risposte: 9
    Ultimo Post: 05-05-2014, 20:23
  3. [VB2010E] Aggiornamento DataSet dopo modifica DB esterna
    Da TheFedex87 nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 22-01-2013, 18:01
  4. Risposte: 5
    Ultimo Post: 22-03-2012, 10:03
  5. Risolto: Modifica dati dopo filtro su bindingsource
    Da vergo77 nel forum Visual Basic .Net
    Risposte: 3
    Ultimo Post: 01-02-2011, 22:27