Condizione che blocca l’apertura di una maschera collegata

di il
2 risposte

Condizione che blocca l’apertura di una maschera collegata

Salve a tutti. Mi ricollego ad un post precedente, https://www.iprogrammatori.it/forum-programmazione/access/criticita-pulsante-apertura-maschera-t42438.html nel quale è stato affrontato e parzialmente risolto il problema del funzionamento di un pulsante di apertura di una maschera collegata (form2), collocato nella maschera principale (form1). Mi scuso se ritorno parzialmente sull’argomento (spero non violi le regole), ma non mi riesce di implementare correttamente la routine evento iniziata.
La relazione tra la maschera principale e la secondaria è semplice: 1 a molti su campo ID_BIBL, come nelle rispettive tabelle dati. Il problema ora è quello di inibire l’apertura della maschera secondaria (form2) in caso di errore, ossia quando il campo ID_BIBL della maschera principale (form1) è Null. L'esigenza si manifesta infatti nella sola modalità di inserimento nuovo record (in modalità modifica record funziona tutto al meglio). Per comodità vorrei evitare la predisposizione di due maschere separate, una per l'inserimento dei nuovi dati e l'altra per la modifica di quelli già esistenti, ma usare sempre la stessa per tutte le modalità.
Pertanto, per evitare la creazione di record non associati nella maschera secondaria collegata, vorrei impedire che questa si apra (quando la principale è vuota, o anche soltanto non sia valorizzato il campo ID_BIBL della chiave primaria) e ricordare quindi al compilatore che prima di passare a form2 (cliccando sul relativo pulsante) deve avere sempre creato il nuovo record compilando i campi di form1.
La prima parte della routine, quella che restituisce il messaggio di errore, potrebbe essere questa:
If ID_BIBL.Value & "" = "" Then
MsgBox "Devi inserire prima i Dati di Esemplare"
End If 
Chiederei adesso un piccolo aiuto nella sintassi del comando che è preferibile utilizzare per bloccare l’apertura della maschera (laddove non soddisfi le condizioni previste sopracitate) e sul dove collocare il blocco di testo. Ho provato a chiudere form2 con DoCmd.Close, ma sbaglio ancora qualcosa.
Grazie ancora a chi vorrà intervenire.

2 Risposte

  • Re: Condizione che blocca l’apertura di una maschera collegata

    
    If IsNull(Me.ID_BIBL) Then
         MsgBox "Devi inserire prima i Dati di Esemplare"
    End If 
    
  • Re: Condizione che blocca l’apertura di una maschera collegata

    Ti ringrazio molto per la risposta. Ho effettuato alcune prove e Il tuo codice effettivamente funziona meglio del mio.
    L'unica cosa che manca ancora, però è l'istruzione per la chiusura della maschera secondaria collegata. L'interruttore di collegamento, infatti, apre la maschera collegata (restituendo correttamente il messaggio di errore quando non risulta compilata la chiave nella maschera principale), ma non chiude la maschera secondaria. Vorrei però evitare all'utente la tentazione di compilare ugualmente la maschera collegata (creando record non associati) rimandandolo nella maschera principale. Come dicevo, ho provato con DoCmd.Close, creando però problemi al codice funzionante.
    Posto per didattica il codice di tutto il pulsante (interruttore di collegamento), così come modificato (spero bene):
    Sub InterruttoreCollegamento_Click()
    On Error GoTo InterruttoreCollegamento_Click_Err
        If ChildFormIsOpen() Then
            CloseChildForm
        Else
            OpenChildForm
            FilterChildForm
        End If
    InterruttoreCollegamento_Click_Exit:
        Exit Sub
    InterruttoreCollegamento_Click_Err:
        MsgBox Error$
        Resume InterruttoreCollegamento_Click_Exit
    End Sub
    Private Sub FilterChildForm()
        If Me.NewRecord Then
            Forms![form2].DataEntry = True
        Else
            Forms![form2].Filter = "[ID_BIBL] = " & Me.[ID_BIBL]
            Forms![form2].FilterOn = True
        End If
    End Sub
    Private Sub OpenChildForm()
            DoCmd.RunCommand acCmdSaveRecord
                DoCmd.OpenForm "form2"
        If Not Me.[InterruttoreCollegamento] Then Me![InterruttoreCollegamento] = True
        If IsNull(Me.ID_BIBL) Then
         MsgBox "Devi inserire prima i Dati di Esemplare"
    End If
    End Sub
    Private Sub CloseChildForm()
        DoCmd.Close acForm, "form2"
        If Me![InterruttoreCollegamento] Then Me![InterruttoreCollegamento] = False
    End Sub
    Private Function ChildFormIsOpen()
        ChildFormIsOpen = (SysCmd(acSysCmdGetObjectState, acForm, "form2) And acObjStateOpen) <> False
    End Function
    Grazie ancora.
Devi accedere o registrarti per scrivere nel forum
2 risposte