Riportare ID_Secondario su nuovo record

di il
15 risposte

Riportare ID_Secondario su nuovo record

Scusate ma mi sto scontrando con i miei ovvi limiti e devo chiedere ancora il vostro aiuto.

Tabella A - ID_A
Tabella B - ID_B + ID_A (relazionato)
Tabella A 1 a molti Tabella B

da Form creato su Tabella A apro un'altra Form creato su dati Tabella B in maschera continua
Imposto che ID_A sia l'ovvio collegamento e funziona.
Mi filtra i campi di tabella B in cui l'ID_A è quello della 1 maschera iniziale.

Essendo la Form di Tab B una maschera continua l'ultimo record è vuoto... Vorrei che l'ID_A fosse compilato automaticamente in base a quello che mi ha filtrato la maschera. Affinché il record aggiunto sia ovviamente collegato, un po' come avverrebbe se fossero Form/SubForm..

E' possibile? Premetto che per ragioni varie non posso utilizzare Form e Suboform.. Che ovviamente sarebbe più facile

grazie
Crodino

15 Risposte

  • Re: Riportare ID_Secondario su nuovo record

    Crodino ha scritto:


    ...Vorrei che l'ID_A fosse compilato automaticamente in base a quello che mi ha filtrato la maschera. Affinché il record aggiunto sia ovviamente collegato, un po' come avverrebbe se fossero Form/SubForm..
    Taaaanto tempo fa ho imparato a come si fa... aspetta che trovo su questo forum il thread molto dettagliato.
    Eccolo: https://www.iprogrammatori.it/forum-programmazione/access/nuovo-record-con-campo-pre-inserito-t23699.html
    Gira tutto sul parametro OpenArgs, da leggere all'apertura della seconda maschera, già nell'evento Load e impostare il DefaultValue del controllo associato alla chiave esterna.
    Versione ultra concentrata: https://www.iprogrammatori.it/forum-programmazione/access/equivalente-maschera-sottomaschera-t25039.html
  • Re: Riportare ID_Secondario su nuovo record

    Grazie mille... davvero!
  • Re: Riportare ID_Secondario su nuovo record

    Per me, se si considera che B non lo apriresti mai da solo, ma sempre "subito dopo" A, impostare il Valore predefinito sul campo B.ID_A con
    [Maschere]![A]![ID_A]
    è più che sufficiente.
  • Re: Riportare ID_Secondario su nuovo record

    Non ottengo comunque il risultato...
    Come si può vedere dalla foto il record nuovo non ha riportato il codice 5 che è l'ID primario della form principale e secondario per questa form...

    Tra l'altro avevo già comunque collegato le due maschera usando invece di OpenArgs direttamente il WHERE del filtro nell'Open Form...
    Ma fa solo il filtro..
  • Re: Riportare ID_Secondario su nuovo record

    Io ho un esempio simile dove la maschera collegata è in foglio dati (non credo sia questa la differenza), il Valore predefinito preimpostato e mi mostra l'ID_A corrispondente anche su RecordNuovo.
  • Re: Riportare ID_Secondario su nuovo record

    Proverò a fare qualche prova con qualche maschera ex novo
  • Re: Riportare ID_Secondario su nuovo record

    Crodino ha scritto:


    Tra l'altro avevo già comunque collegato le due maschera usando invece di OpenArgs direttamente il WHERE del filtro nell'Open Form...
    Sono due utilizzi diversi e forse servono entrambi.
    Che codice usi per aprire la maschera? Che codice hai usato per leggere OpenArgs e in quale evento l'hai scritto?
  • Re: Riportare ID_Secondario su nuovo record

    Il codice che uso per aprire la maschera è questo.
    DoCmd.OpenForm "M_Reparti", , , "ID_Modello=" & ID_Modello, , acDialog
    Dopo il tu suggerimento ho provato con:
    DoCmd.OpenForm "M_Reparti", , , , , acDialog, Me.ID_Modello
    E sull'Open Form
        If Not Me.OpenArgs = "" Then
            		ID_Modello = Me.OpenArgs
        	      End If
        
        		Me.Filter = "ID_Modello= " & Me.OpenArgs
        		Me.FilterOn = True
        		Me.Requery
        
  • Re: Riportare ID_Secondario su nuovo record

    Ho pensato che al massimo posso creare una txt non visibile sulla maschera a cui all'aperta assegno lo stesso valore di ID_Modello (passandolo da OpenArgs) e che sul evento Current della Form se il campo ID_Modello è null copia il valore da txt..
    Sicuramente è un palliativo e funziona ma non so se è la strada più corretta...
  • Re: Riportare ID_Secondario su nuovo record

    Crodino ha scritto:


    Il codice che uso per aprire la maschera è questo.
    Tanti errori.

    La Where Condition andava bene: la maschera che si apre deve contenere solo i record relativi all'ID_Modello che vuoi, anche se con quel codice in apertura della maschera, dove popoli la proprietà Filter raggiungi lo stesso il risultato. Però usa la Where Condition già in OpenForm e ti liberi del pensiero.

    Questa riga
    If Not Me.OpenArgs = "" 
    è rispettata anche se la maschera in cui c'è OpenForm non ha il parametro OpenArgs valorizzato perché OpenArgs è Variant e può essere Null. Non è così che vuoi fare perché se l'intenzione è quella di utilizzare OpenArgs solo quando è valorizzato (perché altrimenti non c'è niente da utilizzare) non devi limitarti a verificare che non sia una ZLS (Zero Length String, che è meglio indicare come vbNullString e non come due doppiapici consecutivi).

    Nella mia prima risposta ho scritto
    Gira tutto sul parametro OpenArgs, da leggere all'apertura della seconda maschera, già nell'evento Load e impostare il DefaultValue del controllo associato alla chiave esterna.
    Nel tuo codice non vedo nessun DefaultValue tirato in ballo. Se non agisci su quello non si va da nessuna parte.
    Tra l'altro il controllo associato non deve essere modificabile dall'utente. Se vuoi puoi lasciarlo visibile ma non deve essere consentito metterci le mani.
    Rileggi i due thread che ti avevo indicato.
  • Re: Riportare ID_Secondario su nuovo record

    Nel tuo codice non vedo nessun DefaultValue tirato in ballo. Se non agisci su quello non si va da nessuna parte.
    Avevo perso un pezzo.. chiedo scusa per avervi fatto perdere del tempo.
    Ora funziona con il codice così:

    Nella maschera principale
    Private Sub txtReparti_Enter()
        DoCmd.OpenForm "M_Reparti", , , , , acDialog, Me.ID_Modello
        Me.Requery
    End Sub
    Private Sub Form_Load()
        If Not IsNull(Me.OpenArgs) Then
            ID_Modello.DefaultValue = Me.OpenArgs
        End If
        Me.Filter = "ID_Modello= " & Me.OpenArgs
        Me.FilterOn = True
        Me.Requery
    End Sub

    Tanti errori.
    Non ho ben capito cosa intendi... ci sono tanti errori in questa riga di codice?
    DoCmd.OpenForm "M_Reparti", , , "ID_Modello=" & ID_Modello, , acDialog
    A questo punto non la uso più e uso quella sopra, ma vorrei capire in cosa è sbagliata se puoi spiegarmi..
    grazie
  • Re: Riportare ID_Secondario su nuovo record

    A onor di cronaca funziona anche così:

    nella form principale
    DoCmd.OpenForm "M_Reparti", , , "ID_Modello=" & ID_Modello, , acDialog
    nella form secondaria
    Private Sub Form_Load()
        ID_Modello.DefaultValue = ID_Modello
    End Sub
    
    con molte meno righe di codice..
    Correggetemi se non va bene, però funziona.
  • Re: Riportare ID_Secondario su nuovo record

    Crodino ha scritto:


    Tanti errori.
    Non ho ben capito cosa intendi... ci sono tanti errori in questa riga di codice?
    DoCmd.OpenForm "M_Reparti", , , "ID_Modello=" & ID_Modello, , acDialog
    A questo punto non la uso più e uso quella sopra, ma vorrei capire in cosa è sbagliata se puoi spiegarmi..
    grazie
    Tanti errori in quel poco codice che avevi scritto, non in quella riga specifica.
    Sistemata la questione IsNull di OpenArgs e l'uso della proprietà DefaultValue, ora devi decidere se al momento dell'apertura della maschera vuoi che vengano visualizzati solo i record che hanno quell'ID_Modello, come sembra che sia visto che usi la proprietà Filter. Nel thread più prolifico non si affrontava quell'aspetto perché all'utente interessava solo inserire un nuovo record con un campo specifico predefinito.

    Ripeto: usa la OpenForm sia con la Where Condition (come facevi prima) sia valorizzando OpenArgs (come hai fatto adesso); a questo punto la maschera che si apre è già filtrata per ID_Modello e non hai bisogno di scrivere niente sulla proprietà Filter (ed annessi).
    Su DoCmd.OpenForm "devi aggiungere", sull'evento Load della maschera M_Reparti "devi togliere".

    Crodino ha scritto:


    A onor di cronaca funziona anche così:
    ...
    Private Sub Form_Load()
        ID_Modello.DefaultValue = ID_Modello
    End Sub
    
    Finché l'uso è solo ed esclusivamente quello attuale.
  • Re: Riportare ID_Secondario su nuovo record

    Ok, perfetto, credo di aver capito e risolto.
    grazie mille per il prezioso aiuto!

    Crodino
Devi accedere o registrarti per scrivere nel forum
15 risposte