Pulsante annulla

di il
41 risposte

Pulsante annulla

Ciao a tutti, ho un problema con la programmazione del pulsante annulla

Ho una maschera in cui vengono visualizzati i dati di una tabella, il campo codice fiscale è bloccato perchè non deve essere mai modificato, tutti gli altri campi sono modificabili. 

Nella maschera ho inserito il pulsante salva che fa un refresh del record, in modo da salvare i dati inseriti al posto di quelli precedenti (anche se ho visto che pur non mettendo il comando refresh, i dati nella tabella vengono lo stesso modificati)

Poi ho creato il pulsante annulla che dovrebbe chiudere la maschera senza apportare modifiche nella tabella, quindi anche se l'utente ha modificato un campo, tale modifica non deve essere presa in considerazione. Come posso impedire che vengano aggiornati?

41 Risposte

  • Re: Pulsante annulla

    01/03/2024 - fogliolina ha scritto:


    il campo codice fiscale è bloccato perchè non deve essere mai modificato,

    Speriamo che l'utente non sbagli mai ad inserirlo…

    Se trattasi di cf giuridico, speriamo che non faccia mai fusioni o trasformazioni perché il cf potrebbe cambiare.

    01/03/2024 - fogliolina ha scritto:


    anche se ho visto che pur non mettendo il comando refresh, i dati nella tabella vengono lo stesso modificati)

    Sei in monoutenza?

    01/03/2024 - fogliolina ha scritto:


    Poi ho creato il pulsante annulla che dovrebbe chiudere la maschera senza apportare modifiche nella tabella, quindi anche se l'utente ha modificato un campo, tale modifica non deve essere presa in considerazione. Come posso impedire che vengano aggiornati?

    Che codice hai per editare e che codice per annullare?

  • Re: Pulsante annulla

    Nel mio caso il codice fiscale non può variare in nessun caso, per questo ho inserito il blocco.

    il database lo sto creando io ma poi verrà utilizzato da più persone.

    avevo creato il pulsante salva che semplicemente fa questo

     DoCmd.RefreshRecord
       MsgBox "Dati ente modificati", 48, "Messaggio"
       DoCmd.Close acForm, "maschera_modifica_dati_ente"
       DoCmd.OpenForm "maschera_principale", acNormal, "", "", , acNorma

    mentre il pulsante annulla differiva per l'assenza della prima riga di codice (il refresh)

    ho capito però che access salva in automatico, tanto che se nel codice del pulsante salva vado a cancellare la prima riga che ho scritto sopra (il refresh) comunque viene salvata la modifica dei campi

    ora ho trovato una soluzione, non so se sia una strategia corretta, ma è l'unica che mi è venuta in mente per aggirare il salvataggio automatico. 

    semplicemente carico un recordset con la tabella interessata dal database corrente

    Set db = CurrentDb
       Set rsEnte = db.OpenRecordset("ente", DB_OPEN_DYNASET)

    poi cerco in rsEnte il record in cui il codice fiscale è quello inserito nella ricerca e quando lo trova modifico i dati della maschera con i dati del recordset in modo che se nella maschera erano stati cambiati io sovrascrivo la modifica. poi procedo con la chiusura della maschera e apro la maschera principale. non li scrivo tutti che diventa lungo e ripetitivo, ne riporto uno e poi l'ho ripetuto per tutti i campi cambiando il nome del campo

    rsEnte.MoveFirst
       Do Until rsEnte.EOF
           If rsEnte("CODICE_FISCALE") = CODICE_FISCALE Then
               denominazione = rsEnte("denominazione")       ……….e così via per tutti gli altri campi

    infine

    End If
           rsEnte.MoveNext
       Loop
       rsEnte.Close
           
       DoCmd.Close acForm, "maschera_modifica_dati_ente"
       DoCmd.OpenForm "maschera_principale", acNormal, "", "", , acNormal

    cosa ne pensate di questa soluzione? 

    io l'ho testata e funziona, se anche per voi è una buona soluzione, potrebbe essere allora d'aiuto a coloro che si troveranno in una situazione simile alla mia

  • Re: Pulsante annulla

    Uhm… cantava la rettore “dammi una lametta che mi taglio le vene”.

    rsEnte.MoveFirst
    Do Until rsEnte.EOF 

    speriamo che ci siano solo 10 record… sei già al record da modificare.

    lo hai preso da qua?

    https://learn.microsoft.com/en-us/office/vba/access/concepts/data-access-objects/modify-an-existing-record-in-a-dao-recordset

  • Re: Pulsante annulla

    No, non l'ho preso da nessuna parte. 

    Non capisco perché sia un problema aver usato un ciclo, in programmazione per controllare una lista si usano i cicli, perché qui non va bene?

  • Re: Pulsante annulla

    01/03/2024 - fogliolina ha scritto:


    No, non l'ho preso da nessuna parte. 

    Non capisco perché sia un problema aver usato un ciclo, in programmazione per controllare una lista si usano i cicli, perché qui non va bene?

    Il codice che usi non serve a nulla ed è concettualmente sbagliato, diciamo che quando si modifica un Record, prima di Salvare si può annullare, quindi basta intercettare correttamente l'evento BeforeUpdate di Maschera, ed usare il parametro Transazionale CANCEL del codice.

    Detto questo la maschera ha già il suo Recordset, quindi Aprire un Rs esterno, oltre che essere sbagliato non ha senso in quanto se il salvataggio è stato attuato, non può esserci difformità tra i 2.

  • Re: Pulsante annulla

    Mi scuso se non sono stata più precisa all'inizio, rimedio ora così avete un quadro preciso del mio caso

    Ho una tabella ente che è stata precedentemente alimentata tramite apposita maschera. 

    Nel tempo si possono variare i dati inseriti, tranne il codice fiscale, tramite una seconda maschera (devo necessariamente usare una seconda maschera differente da quella dell'inserimento iniziale).

    Per modificare l'ente devo cercarlo tramite codice fiscale, quindi ho una maschera principale con un pulsante “modifica dati”, da qui si apre la maschera “inserisci codice fiscale” in cui c'è il pulsante “cerca” e il pulsante “annulla”. Quando clicco sul pulsante “cerca” vado nella maschera “modifica dati”, questa maschera è basata su una query che preleva dalla tabella il record che contiene il codice fiscale immesso. Nella maschera quindi vedrò poi quasi tutti i dati della tabella (alcuni li ho esclusi, ma non entro in merito a questo per non dilungarmi) e li posso modificare e poi ho due pulsanti “salva” e “annulla” che prevedono il codice che ho scritto sopra. 

    Ho visto che i dati vengono cambiati comunque, non appena viene chiusa la maschera, io vorrei evitare proprio questo. Vorrei che i dati vengano aggiornati nella tabella con i dati modificati solo se clicco su “salva” e se clicco “annulla” non vengano modificati.

  • Re: Pulsante annulla

    Chiedo scusa in anticipo se qualche dettaglio della discussione mi sia sfuggito. Se non associ i campi  delle  tabelle ai vari controlli e prevedi dei pulsanti inserisci e salva che eseguono delle query action del tipo update ed inserti into, non ottieni quello che cerchi?

  • Re: Pulsante annulla

    01/03/2024 - Antony73 ha scritto:


    Chiedo scusa in anticipo se qualche dettaglio della discussione mi sia sfuggito. Se non associ i dati delle  tabelle ai vari controlli e prevedi dei pulsanti inserisci e salva che eseguono delle query action del tipo update ed inserti into, non ottieni quello che cerchi?

    Perdonami ma non so se ho ben capito.

    Tu dici di creare una maschera relativa alla tabella con i pulsanti inserisci per inserire un nuovo record e salva per aggiornare? Se così fosse non va bene, devo per forza separare l'inserimento dei dati di un nuovo ente da una eventuale modifica futura dei dati di un ente già presente 

  • Re: Pulsante annulla

    01/03/2024 - fogliolina ha scritto:


    Se così fosse non va bene, devo per forza separare l'inserimento dei dati di un nuovo ente da una eventuale modifica futura dei dati di un ente già presente 

    Cosa centra questo? Puoi fare quello che vuoi a patto di aver chiaro i concetti necessari. Mostra tabelle, campi e relazioni.

  • Re: Pulsante annulla

    01/03/2024 - Antony73 ha scritto:


    01/03/2024 - fogliolina ha scritto:


    Se così fosse non va bene, devo per forza separare l'inserimento dei dati di un nuovo ente da una eventuale modifica futura dei dati di un ente già presente 

    Cosa centra questo? Puoi fare quello che vuoi a patto di aver chiaro i concetti necessari. Mostra tabelle, campi e relazioni.

    Ho il pc in ufficio e fino a lunedì non posso accedere al database. Comunque nel problema che sto affrontando l'unica tabella che viene presa in considerazione è la tabella ENTE. La tabella ente ha una chiave primaria CODICE_FISCALE e poi vari campi tra cui “denominazione”, “sezione”, “cognome”, “nome” e così via e un campo “stato” che è chiave esterna della tabella STATO_ENTE ma che non faccio visualizzare nella maschera di modifica dati perché non si deve modificare da lì. I campi che si possono modificare tramite questa maschera sono solo denominazione, sezione, cognome e così via, tutti campi testo.

  • Re: Pulsante annulla

    01/03/2024 - fogliolina ha scritto:


    No, non l'ho preso da nessuna parte. 

    Non capisco perché sia un problema aver usato un ciclo, in programmazione per controllare una lista si usano i cicli, perché qui non va bene?

    A che ti serve un ciclo sestai lavorando su un singolo record?

    Tabella.FindFirst( testodatrovare ) per posizionarti al record da modificare

    Poi 

    Tabella.Edit

    Modifichi quello che vuoi

    Poi se annulli (pulsante annulla)

    Tabella.cancelUpdate

    Se confermi (pulsante ok)

    Tabella.Update

    In caso di conferma modifiche, Se sei in altro form fai un refresh della tabella del primo form

    Ti riposizioni al record corrente della tabella del primo form supponendo che si chiami tabellaview con

    Tabellaview.FindFirst( sempre lo stesso testo ) per posizionarti al record modificato

    Chiudi la seconda form et voilà!

    Tratto dal link che ti avevo dato:

    If you don't use the Edit method before you try to change a value in the current record, a run-time error occurs. If you edit the current record and then move to another record or close the Recordset object without first using the Update method, your changes are lost without warning. For example, omitting the Update method from the preceding example results in no changes being made to the Employees table.

    You can also terminate the Edit method and any pending transactions without saving changes by using the CancelUpdate method. While you can terminate the Edit method just by moving off the current record, this is not practical when the current record is the first or last record in the Recordset, or when it is a new record. It's generally simpler to use the CancelUpdate method.

    Il fatto che ti applica le modifiche anche senza post deriva dal fatto che non vai in edit.

    Questo per il modus operandi, Poi ascolta i consigli di alex e antony73 che sono molto piu ferrati di me in access.

  • Re: Pulsante annulla

    Innanzitutto spero che tu abbia previsto una chiave primaria numerica con incremento automatico… ma ho l'impressione che tu non lo stia facendo. Poi hai una sola tabella? Cosa intendi per chiave esterna?

  • Re: Pulsante annulla

    01/03/2024 - sihsandrea ha scritto:


    01/03/2024 - fogliolina ha scritto:


    No, non l'ho preso da nessuna parte. 

    Non capisco perché sia un problema aver usato un ciclo, in programmazione per controllare una lista si usano i cicli, perché qui non va bene?

    A che ti serve un ciclo sestai lavorando su un singolo record?

    Tabella.FindFirst( testodatrovare ) per posizionarti al record da modificare

    Poi 

    Tabella.Edit

    Modifichi quello che vuoi

    Poi se annulli (pulsante annulla)

    Tabella.cancelUpdate

    Se confermi (pulsante ok)

    Tabella.Update

    In caso di conferma modifiche, Se sei in altro form fai un refresh della tabella del primo form

    Ti riposizioni al record corrente della tabella del primo form supponendo che si chiami tabellaview con

    Tabellaview.FindFirst( sempre lo stesso testo ) per posizionarti al record modificato

    Chiudi la seconda form et voilà!

    Tratto dal link che ti avevo dato:

    If you don't use the Edit method before you try to change a value in the current record, a run-time error occurs. If you edit the current record and then move to another record or close the Recordset object without first using the Update method, your changes are lost without warning. For example, omitting the Update method from the preceding example results in no changes being made to the Employees table.

    You can also terminate the Edit method and any pending transactions without saving changes by using the CancelUpdate method. While you can terminate the Edit method just by moving off the current record, this is not practical when the current record is the first or last record in the Recordset, or when it is a new record. It's generally simpler to use the CancelUpdate method.

    Il fatto che ti applica le modifiche anche senza post deriva dal fatto che non vai in edit.

    Questo per il modus operandi, Poi ascolta i consigli di alex e antony73 che sono molto piu ferrati di me in access.

    Lunedì mattina studio bene tutto con il database davanti e vedo come applicarlo. Grazie mille

  • Re: Pulsante annulla

    01/03/2024 - Antony73 ha scritto:


    Innanzitutto spero che tu abbia previsto una chiave primaria numerica con incremento automatico… ma ho l'impressione che tu non lo stia facendo. Poi hai una sola tabella? Cosa intendi per chiave esterna?

    La tabella ente ha come chiave primaria il codice fiscale in quanto è un codice univoco e non ammette duplicati, un ulteriore campo da usare come chiave primaria è superfluo

    Non ho una sola tabella, ho più tabelle ma ora in questo caso viene presa solo la tabella ente per le modifiche quindi che esistano altre tabelle è ininfluente.

    Chiave esterna è il campo che richiama la chiave primaria di un'altra tabella, in questo caso ho la tabella stato_ente che ha la chiave primaria numerica con incremento automatico e ha il campo stato, un campo testo che descrive lo stato. Nella tabella ente c'è il campo stato che è un intero il cui valore corrisponde al valore della chiave primaria della tabella stato_ente

Devi accedere o registrarti per scrivere nel forum
41 risposte