Maschera Access: evento "Su uscita" da un campo e pressione di un "pulsante di comando" ("Uscita")

Anonimo
2019-11-20T20:08:46+00:00

Ho il seguente problema:

semplice maschera anagrafica (Origine record: tblAnagrafica) con un campo “nominativo” (per semplificare). 

Inserendo un nuovo nominativo - con questa maschera - nella tabella Anagrafica, dovrei però inserire parallelamente anche un record, con il nominativo in questione, in una “tabella collegata”. Per questo ho definito, in corrispondenza dell’evento “Su uscita” del campo “nominativo” una routine VBA che memorizza anche il record nella tabella collegata.

Problema: l’utente si è sbagliato e, dopo aver inserito il nominativo “Mario Rossi”, preme il tasto “Uscita” della maschera (con evento associato -> Docmd.Close). Succede però che viene intercettato l’evento “Su uscita”, il record ancora non c’è in Anagrafe e quindi la routine VBA mi dà errore. Anzi – se non mi è sfuggito qualcosa – l’evento in corrispondenza ad “Uscita” non viene per nulla attivato.

Come posso risolvere il problema? (Se venisse intercettato per primo il tasto “Uscita”, sarei a posto).

Al momento non mi è venuta in mente nessuna soluzione.

Grazie per i suggerimenti

Ivo

Ps: scusate, ma non mi è venuto un titolo migliore

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

4 risposte

Ordina per: Più utili
  1. Anonimo
    2019-12-07T08:11:04+00:00

    Ciao, Sandro,

    grazie per la risposta. Apprezzo il tuo suggerimento, ma ho risolto andando a controllare (DlookUp()) se il record è inserito oppure no: se non è inserito è evidentemente perché è stato premuto "il tasto sbagliato", anziché "uscire" correttamente dal campo che si stava valorizzando. Inibire il tasto è un tantino più complesso, anche perché di tasti in realtà non ce n'è uno solo: ho, in particolare, inserito anche i "tasti di navigazione avanti-indietro, ecc. (nella domanda ho, ovviamente, semplificato il problema).

    Grazie ancora e buona giornata

    Ivo

    ps: hai perfettamente ragione per le "tabelle collegate", ma mi sono lasciato fuorviare da Excel (PowerPivot, nella fattispecie). Buona giornata

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-11-22T11:08:08+00:00

    ciao Ivo53,

    la tabella lato molti generalmente viene definita foreign table, tabella esterna, alla stregua della FK chiave esterna, foreign key.

    Per tabella collegata si intende dal BE al FE.

    Nel caso la tabella anagrafica sia l'input che genera i nominativi che ti consentono poi la gestione di una master details come descritta,  valuta quanto segue :

    la form e' impostata con consenti aggiunte e modifche a no, perche' queste proprieta' vengono, a quando serve, modificate consentendo aggiunte e modifiche.

    Aggiungengo un nuovo record, tramite il pulsante edit, il pulsante chiudi diventa non abilitato e quella salva abilitato in modo da impedire uscite clamorose e non controllate.

    All'inserimento della riga nella tabella impiegati, si scatena l'evento after insert delle form che inserisce una riga nella tabella ordini ( nel tuo caso clienti) e una nella tabella dettagli ordini ( nel tuo caso libri) per ottenere quanto richiedi.

    Option Compare Database

    Option Explicit

    Private Sub cmdClose_Click()

    DoCmd.Close objecttype:=acForm, _

                objectName:=Me.Name

    End Sub

    Private Sub cmdEdit_Click()

    With Me

        .cmdEdit.Enabled = False

        .cmdClose.Enabled = False

        .cmdSave.Enabled = True

        .AllowAdditions = True

        .AllowEdits = True

    End With

    End Sub

    Private Sub cmdSave_Click()

    With Me

        .Dirty = False

        .cmdSave.Enabled = False

        .cmdClose.Enabled = True

        .cmdEdit.Enabled = True

        .AllowAdditions = False

        .AllowEdits = False

    End With

    End Sub

    Private Sub Form_AfterInsert()

    With DBEngine(0)(0)

        .Execute "insert into ordini ([ID Impiegato]) values (" & Me.IDImpiegato & ")", &H80

        .Execute "insert into [Dettagli ordini] ([IDOrdine]) select max(idordine) as mID from ordini", &H80

    End With

    End Sub

    Private Sub Form_Current()

    Me.cmdClose.Enabled = True

    End Sub

    Private Sub Form_Dirty(Cancel As Integer)

    With Me

        .cmdClose.Enabled = False

        .cmdSave.Enabled = True

    End With

    End Sub

    il codice qui sopra e' decisamente semplice da testare perche' e' sufficinete creare una form a visualizzazione singola dalla tabella impiegati del db di esempio NorthWind.

    Inizialmente il pulsante salva e' disabitlitato mentre chiudi e edit abilitati.

    HTH.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-11-21T14:44:27+00:00

    Ciao, Sandro,

    perfettamente d’accordo sul fatto che in un DB i dati non devono essere ridondanti, ma “unici” (sane regole di analisi dati che ripeto sempre quando faccio qualche corso su questi argomenti!) – io, infatti, parlo di “tabella collegata” (per capirci, quelle che si usano per gestire le relazioni N-M, con integrità referenziale, aggiorna/campi campi correlati a catena)) – qualcosa del tipo: “Cliente-Libri” -> tabella cliente, tabella Libro, tabella intermedia “Cliente-Libro”, che punta (campo ID, o simile) al Cliente ed al Libro.

    Vero che sarebbe corretto inserire prima il record anagrafico e poi valorizzare i dati nella tabella collegata, ma mi si chiede di avere comunque un “collegamento di default” preimpostato (una cosa del tipo: al cliente appena censito, io comunque regalo un libro). Per questo, appena censisco un nuovo cliente, vorrei inserire in automatico questo “record collegato” di default. Quando e come lo faccio? In corrispondenza all’evento “su uscita” del nominativo (o, se preferisci, dell’ultimo campo della maschera di censimento).

    Il problema si pone se l’utente ha sbagliato e preme “Esci” prima di completare il campo.

    C’è qualche altro evento da gestire? Forse non ho cercato abbastanza, ma non l’ho trovato.

    Non vorrei gestire anche l’inserimento via VBA e cercavo quindi una “via veloce” per gestire il tutto.

    Grazie e buona giornata

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2019-11-21T06:37:17+00:00

    ciao Ivo53,

    provo ad esprimere qualche parere mi dici dove sbaglio.

    Sono un po' perplesso sul fatto che serva inserire due volta la stessa informazione in due tabelle diverse, una solamente dovrebbe essere sufficiente e dovrebbe consentirti di estrarre il dato alla bisogna.

    La ridondanza dei dati è segno generalmente di una non buona progettazione della base dati.

    Inoltre...supponiamo che tu vada a scrivere effettivamente il dato nell'altra tabella….se poi lo modifichi nella tabella originaria cosa succede? se invece lo modifichi nella tabella collegata cosa succede? provvedi ad aggiornare la riga sia in un verso che nell'altro le modifiche? 

    se cancelli lo stesso ?

    Per quanto all'errore.

    Non mi è chiarissimo l'errore che si genera ed il motivo che lo genera, ci sono altre istruzioni che vanno in conflitto con la scrittura della riga nell'altra tabella?

    Si potrebbe agire inibendo il command button fino a che la riga non è scritta oppure meglio ancora valutare un altro evento su cui eseguire l'istruzione magari dopo aggiornamento o dopo inserimento...su uscita non mi piace così tanto.

    Prova a darci qualche informazione aggiuntiva magari si riesci ad indirizzare meglio il tutto.

    Facci sapere!

    Buona giornata.

    Ciao, Sandro

    La risposta è stata utile?

    0 commenti Nessun commento