Criticità su pulsante di apertura maschera

di il
7 risposte

Criticità su pulsante di apertura maschera

Salve a tutti, ringrazio gli admin per aver accettato la mia iscrizione. Sto imparando a scrivere un po’ di codice e chiedo cortesemente un aiuto per capire dove sto sbagliando.
Ho creato con Access un database di classificazione di libri composto da tre tabelle:
1_Dati Esemplari (relativo ai libri) = tab1
2_Dati Incisioni (relativo alle incisioni contenute nei libri) = tab2
3_Dati immagini (relativo alle immagini delle incisioni) = tab3.

Tab1 ha la chiave ID_BIBL (contatore) più altri 10 campi;
tab2 ha la chiave ID_INC (contatore), ID_BIBL (numerico) più altri 20 campi
tab3 ha la chiave ID_FOTO (contatore), ID_INC (numerico) più 1 altro campo per il link alla immagine.

Relazione: 1 a molti tra ID_BIBL di tab1 e ID_BIBL di tab2 (integrità referenziale, record correlati a catena);
Relazione 1 a molti tra ID_INC di tab2 e ID_INC di tab3 (integrità referenziale, record correlati a catena).

I campi sono troppi da gestire tutti insieme in una sola maschera e anche col sistema delle sottomaschere non riesco a vedere tutti i record, né ad inserirne di nuovi (la maschera è a schede e non tabellare).
Non so se ho adottato la soluzione giusta, ma ho deciso di creare le maschere corrispondenti alle tre tabelle (form 1, 2, 3) e di collegarle tramite pulsanti. Per poter andare in inserimento e modifica dati, ho creato su form1 un pulsante che mi apre form 2 e mi va al record corrispondente della relazione 1 a molti (chiave ID_BIBL); in questo modo, non appena creato o modificato un record di tab1 (su form1), posso passare a inserire i record correlati di tab2 (su form2).
Il codice del pulsante (in Evento su click) è il seguente:

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.OpenForm " Form2"
If Not Me.[InterruttoreCollegamento] Then Me![InterruttoreCollegamento] = True
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

Per far sì che mi si aggiorni la chiave corrispondente (ID_BIBL) nella tabella madre tab1 ogni volta che aggiungo un nuovo record in tab2 (da form2), ho impostato in form2 il campo chiave ID_BIBL con il seguente Valore predefinito:
=[Maschere]![01_Dati esemplare]![ID_BIBL]
Spero anche in questo caso di aver adottato la soluzione migliore.

La stessa procedura vorrei ripeterla per un secondo pulsante, che da form2 aprirà la maschera form3, al fine di poter inserire anche i records all’interno di tab3.
Dopo alcuni errori iniziali, la cosa ora sembra funzionare, ma c’è ancora un problema:
il codice funziona solo in modalità modifica dati, mentre presenta criticità in modalità inserimento nuovi record. Se infatti prima ancora di aver inserito un nuovo record in form1 premo inavvertitamente il pulsante di apertura di form 2, giungo in form2 senza aver compilato la chiave primaria nella tabella madre e quindi non posso più associare i record correlati (o meglio, i record correlati si scrivono fisicamente in tab2, ma senza compilare il valore della chiave primaria ID_BIBL).
Vorrei inserire nella routine una condizione che non mi fa aprire form2 se prima non ho valorizzato i campi di form1 (in sostanza se non è stata creata la chiave primaria del nuovo record) e che mi restituisca un messaggio di errore.
Potrei inserire nel codice

If ID_BIBL.Value & "" = "" Then
MsgBox "Devi inserire prima i Dati di Esemplare"
End If

dando per scontato che imposti la condizione sul campo chiave ID_BIBL (o forse la condizione va impostata per tutti i campi del record?); nel caso, è preferibile usare Null al posto di “”, e, infine, come evitare l’apertura di form2 in caso di errore (e non dover ritornare a mano su form1)?.
Mi scuso per il lungo preambolo. Un grazie di cuore a chi vorrà aiutarmi.

7 Risposte

  • Re: Criticità su pulsante di apertura maschera

    Prima di aprire la "maschera successiva" metti questa istruzione
    DoCmd.RunCommand acCmdSaveRecord
  • Re: Criticità su pulsante di apertura maschera

    Grazie, provo subito a vedere come va. Un saluto.
  • Re: Criticità su pulsante di apertura maschera

    OsvaldoLaviosa ha scritto:


    Prima di aprire la "maschera successiva" metti questa istruzione
    DoCmd.RunCommand acCmdSaveRecord
    Grazie, allora, ho provato ma non funziona (si apre lo stesso la la mascxhera figlia, restituendo il messaggio di errore generico), ma forse perché non ho ben chiaro il punto esatto in cui inserire la stringa.
  • Re: Criticità su pulsante di apertura maschera

    Prova a metterla qui in mezzo
    Private Sub OpenChildForm()
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.OpenForm "Form2"
    P.S.: In base al regolamento del forum, quando devi postare un codice VBA o SQL, abbi cura di cliccare sul pulsante in basso "Editor completo & Anteprima", poi selezioni tutto il codice, poi clicchi in alto sul tasto </> [codice] per farlo apparire con i tipici caratteri monotype più familiari ai programmatori.
  • Re: Criticità su pulsante di apertura maschera

    Grazie mille per la risposta. Mi scuso per l'inconveniente, vado a vedere subito come si fa.
  • Re: Criticità su pulsante di apertura maschera

    Purtroppo la routine non funziona. In sostanza restituisce il messaggio di errore, ma non impedisce l'apertura della maschera contenente figlia (ovviamente vuota).
  • Re: Criticità su pulsante di apertura maschera

    OsvaldoLaviosa ha scritto:


    Prova a metterla qui in mezzo
    Private Sub OpenChildForm()
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.OpenForm "Form2"
    Eureka! Ho risistemato il database e ho trovato degli errori che avevo riportati da una maschera precedente. Ora finalmente il codice funziona in aggiornamento record con la stringa che mi hai suggerito.
    Non riesco però ancora a capire come inibire il funzionamento dell'interruttore di collegamento nel caso di errore prospettato:
    If ID_BIBL.Value & "" = "" Then
    MsgBox "Devi inserire prima i Dati di Esemplare"
    End If
    Come posso evitare che il childform si apra ugualmente dopo aver cliccato sul messaggio di errore?
    Grazie in anticipo per la pazienza.
Devi accedere o registrarti per scrivere nel forum
7 risposte