2009-12-18 11 views
7

Ho difficoltà con questo problema da solo, quindi con un po 'di aiuto, quindi la ricerca su di esso; ma non ho avuto fortuna. Quindi ho deciso di chiedere.Come richiedere una sottomaschera da un altro modulo?

ho due forme in Access 2007 consente chiamarli MainForm e EntryForm.
MainForm ha una sottomaschera e un pulsante. Il pulsante apre EntryForm in modalità Aggiungi. Quello che voglio fare è quando lo EntryForm salva il nuovo record che aggiornerebbe (requery) la sottomaschera in MainForm.

Ho provare questo codice di impostazione

Private Sub cmdSaveAndClose_Click() 
    DoCmd.Save 

    'requery list 
    Forms![MainForm]![subformName].Requery 

    '' I've also tried these 
    'Forms![MainForm]![subformName].Form.Requery 
    'Forms.("MainForm").[subformName].Requery 
    'Forms.("MainForm").[subformName].Form.Requery 


    DoCmd.Close 
End Sub 

Nessuno di questi tentativi sembra funzionare. C'è un modo per fare questa domanda? Grazie per l'aiuto in anticipo.

+0

Che cosa viene visualizzata la sottomaschera? Una listbox, i dettagli dal modulo Aggiungi/Modifica? –

+0

la sottomaschera visualizza i record dal modulo di aggiunta/modifica nel foglio di calcolo –

+0

docmd.save salva l'oggetto e non il record Si desidera realmente 'If Not Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord' –

risposta

9

Solo un commento sul metodo di realizzazione di questo:

Stai rendendo il tuo EntryForm legato in modo permanente al modulo da cui lo stai chiamando. Penso che sia meglio non avere forme legate al contesto come questo. Mi piacerebbe rimuovere il requery dal Salva/Chiudi routine e invece aprire l'EntryForm modale, con l'interruttore acDialog:

DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog 
    Me!SubForm.Form.Requery 

In questo modo, EntryForm non è legato ad utilizzare in un contesto. L'alternativa è di complicare EntryForm con qualcosa che è ben informato su quale forma lo ha aperto e che cosa è necessario richiedere. Penso che sia meglio mantenere questo tipo di cose il più vicino possibile al contesto in cui viene utilizzato e mantenere il codice del modulo chiamato il più semplice possibile.

Forse un principio qui è che ogni volta che si richiama un modulo utilizzando la raccolta Forms da un altro modulo, è una buona indicazione che qualcosa non è giusto sulla tua architettura - questo dovrebbe accadere di rado, secondo me.

+0

È fantastico che abbia funzionato con acDialog. All'inizio cercavo di fare tutto questo dal form principale, ma non mi è venuto in mente di usare l'acDialog, ma immagino che il mio cervello sia stato fritto entro la fine di questa settimana. Grazie. –

12

È necessario utilizzare il nome del controllo di sottomaschera, non il nome della sottomaschera, anche se questi sono spesso gli stessi:

Forms![MainForm]![subform control name Name].Form.Requery 

Oppure, se siete nella maschera principale:

Me.[subform control name Name].Form.Requery 

Ulteriori informazioni: http://www.mvps.org/access/forms/frm0031.htm

+0

La sintassi successiva funzionerà meglio. (Operatori Bang causano una conversione di tipo implicita.) – Oorang

+1

No, se non sono in esecuzione dalla forma che contiene la sottomaschera non sarà :) – Fionnuala

+0

ho provato la prima, come questo 'Forms! [MainForm]! [SubformControl] .Form.Requery' e non richiede la sottomaschera. T Il codice è associato all'altro pulsante del modulo. A meno che non vi sia un modo per richiedere la sottomaschera dal modulo padre quando l'altro modulo è chiuso, non posso provare la sintassi successiva. –

0

Chiudendo e aprendo, il modulo principale di solito esegue tutte le query correlate (comprese quelle relative alla sottomaschera). Ho avuto un problema simile e l'ho risolto aggiungendo quanto segue al pulsante Salva comando su evento click.

DoCmd.Close acForm, "formname", acSaveYes 
DoCmd.OpenForm "formname" 
2

Ho provato diverse soluzioni sopra, ma nessuno ha risolto il mio problema. soluzione per aggiornare una sottomaschera in un modulo dopo il salvataggio dei dati nel database:

Me.subformname.Requery

Ha funzionato bene per me. In bocca al lupo.

Problemi correlati