Passaggio di un valore da una maschera ad un’altra maschera

di il
21 risposte

Passaggio di un valore da una maschera ad un’altra maschera

Un saluto a tutti,
sono sempre alle prese con la realizzazione di un DB per il mio archivio musicale di opere liriche; ho già postato due altri argomenti e, recependo alcuni consigli, ho intrapreso lo studio sistematico del VBA su un ponderoso libro di tale Couch.

Nel frattempo, in attesa di completare lo studio, ho iniziato ugualmente a costruire il DB, dandomi come metodo la realizzazione di ciò che mi occorre nel modo più facile possibile o, per meglio dire, con gli strumenti per me più semplici allo stato attuale delle mie conoscenze: per fare un esempio, l’inserimento di nuovi dati (compositore, cantante, Direttore/M° del Coro, Orchestra/Coro) anziché impostarlo su un’unica maschera, con campi abilitati in funzione della scelta del tipo di nuovo Artista da inserire fatta in una cbo, lo sto realizzando molto più semplicemente (sebbene con maggiore quantità di oggetti) con uso di maschere. Ciò significa che ho un menù di inserimento nuovi dati con pulsanti diversi per ogni tipo di Artista da inserire, con cui apro la relativa maschera di inserimento. Quando avrò terminato lo studio del VBA, cercherò di modificare l’impostazione e rendere tutto più elegante.

Tutto ciò premesso, sono arrivato al punto in cui ho creato una maschera di inserimento per un nuovo titolo, da cui deve scaturire, ovviamente, un’altra maschera per l’inserimento dei personaggi di tale nuovo titolo. Nell'allegato è riportata la relazione tra le tabelle.

Mi chiedevo se fosse possibile con Access fare in modo che la prima maschera (InsNuovoTitolo) passi alla seconda (InsNuoviPersonaggi) il valore dell’IDTitolo, per evitare, per ogni personaggio del nuovo titolo, di dover selezionare da una cbo il titolo a cui si riferiscono i nuovi personaggi. Io penso di sì e ci vorrà sicuramente del codice: ma non sono sicuro, così facendo, che poi la maschera InsNuoviPersonaggi scriva l’IDTitolo nel relativo campo della tabella TabPersonaggi. Mi date una mano a capire se si può procedere in questa direzione e come?
Grazie.
Allegati:
28272_45268c84453a4c0b18c639e8ba1c1297.jpg
28272_45268c84453a4c0b18c639e8ba1c1297.jpg

21 Risposte

  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Vedi come si impiega la proprietà OpenArgs:
    https://docs.microsoft.com/en-us/office/vba/api/access.form.openargs

    https://www.fmsinc.com/microsoftaccess/Forms/openargs/index.htm
    http://www.databasedev.co.uk/multiple-openargs.htm
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Titoli è uno-a-molti Personaggi. Se hai maschera/sottomaschera Titoli/Personaggi, il campo IDTitolo si compilerà automaticamente in Personaggi. Idem dicasi se vuoi gestire invece di maschera/sottomaschera, come 2 maschere collegate.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Se hai maschera/sottomaschera Titoli/Personaggi, il campo IDTitolo si compilerà automaticamente in Personaggi. Idem dicasi se vuoi gestire invece di maschera/sottomaschera, come 2 maschere collegate.
    Ho provato, ma nel campo IDTitolo della tabella Personaggi non viene scritto nulla; ho tentato anche non facendo chiudere la prima maschera, ma niente.

    Ora sto provando ad utilizzare la proprietà OpenArgs e riporto qui il codice che ho scritto:
    Private Sub Salva_Click()
    Dim IsValid As Boolean
    IsValid = True
    If (IsNull(Me.Titolo)) Then
       MsgBox "Attenzione! Campo TITOLO obbligatorio."
       Me.Titolo.SetFocus
       IsValid = False
    Exit Sub
    End If
    
    If (IsNull(Me.cboCompositore)) Then
       MsgBox "Attenzione! Campo COMPOSITORE obbligatorio."
       Me.Titolo.SetFocus
       IsValid = False
    Exit Sub
    End If
    
    DoCmd.RunCommand Command:=acCmdSaveRecord
    
    DoCmd.OpenForm "MasInsNuoviPersonaggi", OpenArgs:="cboIDTitolo|" & txtIDTitolo
    DoCmd.GoToRecord , , acNewRec
    
    Me.Refresh
    End Sub
    Sicuramente sto sbagliando qualcosa, ma dove?
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Donizetti ha scritto:


    Ho provato, ma nel campo IDTitolo della tabella Personaggi non viene scritto nulla
    In che situazione ti trovi? Maschera/sottomaschera o Maschere collegate?

    Il discorso di OpenArgs (secondo me) ha ingannato willy55 perché hai usato la terminologia "passare il valore" che è una caratteristica tipica di OpenArgs, ma in questo caso non c'entra.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    In che situazione ti trovi? Maschera/sottomaschera o Maschere collegate?
    Maschere collegate, nel senso che la maschera InsNuovoTitolo, attraverso il comando SALVA, apre la maschera InsNuoviPersonaggi.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Io ti consiglio di impostare al campo IDTitolo nella maschera Personaggi
    Valore predefinito: [Maschere]![InsNuovoTitolo]![IDTitolo]
    e anche nel codice VBA che apre maschera InsNuoviPersonaggi
    DoCmd.OpenForm "InsNuoviPersonaggi", , , "[IDTitolo] = " & Me![IDTitolo]
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Avevo impostato IDTitolo come combobox... forse è qui il problema... Provo come mi hai suggerito.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Non è determinante se IDTitolo sia o non sia combobox.

    Ti faccio notare che il mio suggerimento ha un senso e mira in maniera radicale affinché la maschera InsNuoviPersonaggi sia sempre aperta partendo da InsNuovoTitolo. Se tenterai di aprire InsNuoviPersonaggi da sola, ti chiederà una finestra parametro dove dover inserire un IDTitolo...che in quel momento non sarai in grado di sapere dove andare a prenderlo.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Ho provato e funziona, ti ringrazio Osvaldo.

    Credo che potrò arrivare a conoscere il VBA e Access e quindi a migliorare la capacità di realizzare un buon DB quando sarò in grado di capire il perché una determinata soluzione da me adottata non funziona: al momento non ci riesco ancora.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Giusto per ribadire, la connessione fra due maschere, al fine di avere un legame fra loro, può essere effettuata con:
    - maschera e sotto-maschera (collegando campi master e secondari);
    - aprire la prima maschera, da questa aprire la seconda e su questa far riferimento ad un controllo della prima;
    - dalla prima maschera, aprire la seconda fornendo OpenArgs e questo valore verrà letto (ed impiegato, tramite VBA) dalla seconda all'atto del suo caricamento.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Grazie anche a te, Willy: l’unione delle vostre idee e dei vostri suggerimenti mi aiuta a comprendere…

    … ma fino ad un certo punto, essendo il limite nelle mie conoscenze ancora troppo parziali e non certo nella vostra sapienza.

    Sulla scorta di quanto fatto per l’inserimento di un nuovo Titolo, con un comando che apre la maschera di inserimento dei nuovi personaggi di quel titolo passando con OpenArgs l’IDTitolo, vorrei realizzare lo stesso schema con la maschera di inserimento di una nuova edizione da cui aprire poi la maschera per l’inserimento dei relativi cantanti. Qui, però, ho un problema: OpenArgs può contenere solo un valore (almeno così ho capito): potrei, è vero, passare solo l’IDEdizione, essendo sicuro che è univoco, ma per una questione di chiarezza nelle maschere, vorrei che nella maschera di inserimento degli interpreti mi comparisse almeno una parte dei valori dell’edizione a cui ci si riferisce (per esempio, compositore – titolo – direttore – anno).

    Avevo pensato di creare una variabile String in cui memorizzare i 4 campi sopra detti e poi passare questa var con OpenArgs, ma non sono sicuro che si possa fare e, ammesso di sì, non saprei come scriverlo nel codice: in particolare, non saprei come legare la var ad un controllo della maschera. Per esempio:
    DoCmd.OpenForm " InsNuoveInterpretazioni ", , , "[InsNuoveInterpretazioni.nomecampo] = " & Me![stringa]
    si può fare?
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Credo che questo sia un altro discorso.
    1. Sicuramente a Interpretazioni devi passare IDEdizione.
    2. In maschera Interpretazioni puoi fare in modo che la "casella combinata" IDEdizione riporti tutte le informazioni che tu desideri. Per fare questo la proprietà "Origine riga" della casella combinata sarà una query o SELECT equivalente che prende in considerazione più tabelle. Nel tuo caso Edizioni e Titoli. Quindi i campi che ti servono.
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Ora che ci penso: in realtà la InsNuoveInterpretazioni dovrà essere una maschera continua, che conterrà esclusivamente i personaggi di quel certo titolo di cui sto inserendo una nuova edizione/interpretazione: posso filtrare la TabPersonaggi in base al Titolo, secondo lo schema allegato.

    Schema.JPG
    Schema.JPG

    In maschera Interpretazioni puoi fare in modo che la "casella combinata" IDEdizione riporti tutte le informazioni che tu desideri. Per fare questo la proprietà "Origine riga" della casella combinata sarà una query o SELECT equivalente che prende in considerazione più tabelle. Nel tuo caso Edizioni e Titoli. Quindi i campi che ti servono.
    Mi occorrerà anche TabPersonaggi, filtrata da IDTitolo o no?
  • Re: Passaggio di un valore da una maschera ad un’altra maschera

    Aspetta, la cosa si fa complessa e occorre ragionare per piccoli passi.
    Interpretazioni e Personaggi sono disgiunte e lontane, ma contengono (per ogni singolo IDTitolo) gli stessi RuoloInterprete=Personaggio. Assodato che Interpretazioni deve ricevere IDEdizione che quindi devi considerare e filtrare/memorizzare in qualche modo, io ci vedrei una query di accodamento che preleva i Personaggi (mi raccomando, quelli filtrati da IDTitolo che stai considerando in quel momento) e li accoda automaticamente in Interpretazioni. Così facendo Interpretazioni si autocompilerà di tutti i Personaggi e di IDEdizione. Poi non ti resta che compilare solo gli IDInterprete manualmente.
Devi accedere o registrarti per scrivere nel forum
21 risposte