2009-12-18 26 views
7

He estado luchando con este problema por mi cuenta, luego con algo de ayuda, luego busqué sobre él; pero no he tenido suerte Entonces decidí preguntar¿Cómo volver a consultar un subformulario desde otro formulario?

Tengo dos formas en Acceso 2007 llamémoslas MainForm y EntryForm.
MainForm tiene un subformulario y un botón. El botón abre el EntryForm en modo Agregar. Lo que quiero hacer es cuando el EntryForm guarda el nuevo registro que actualizaría (requery) el subformulario en MainForm.

He probar este código de configuración

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 

Ninguno de estos intentos parecen funcionar. ¿Hay alguna manera de hacer esta consulta? Gracias por la ayuda con anticipación.

+0

¿Qué muestra el subformulario? Un cuadro de lista, los detalles del formulario Agregar/Editar? –

+0

el subformulario muestra los registros del formulario de agregar/editar en la hoja de cálculo –

+0

docmd.save guarda el objeto y no el registro. Realmente desea 'If Not Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord ' –

Respuesta

9

Sólo un comentario sobre el método para lograrlo:

Está haciendo que su formulario de entrada esté vinculado de forma permanente al formulario desde el que lo está llamando. Creo que es mejor no tener formas vinculadas a un contexto como ese. Me quito la nueva consulta de la rutina Cerrar/Guardar y en lugar de abrir la EntryForm de forma modal, con el interruptor acDialog:

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

De esa manera, EntryForm no está atado a utilizar en un contexto. La alternativa es complicar a EntryForm con algo que sepa de qué forma lo abrió y qué necesita volver a consultar. Creo que es mejor mantener ese tipo de cosas lo más cerca posible del contexto en el que se usa y mantener el código del formulario llamado lo más simple posible.

Tal vez un principio aquí es que cada vez que está requiriendo un formulario utilizando la colección Forms de otra forma, es una buena indicación de que algo no está bien en su arquitectura; eso sucederá pocas veces, en mi opinión.

+0

Eso es genial, funcionó con el acDialog. Al principio estaba tratando de hacer todo esto desde el formulario principal, pero no se me ocurrió usar el acDialog, pero supongo que mi cerebro se frió para el final de esta semana. Gracias. –

12

Se debe usar el nombre del control de subformulario, no el nombre del subformulario, aunque éstos suelen ser los mismos:

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

O, si usted está en la forma principal:

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

Más información: http://www.mvps.org/access/forms/frm0031.htm

+0

La sintaxis posterior tendrá un mejor rendimiento. (Los operadores de Bang causan una conversión de tipo implícita). – Oorang

+1

No, si no se está ejecutando desde el formulario que contiene el subformulario, no :) – Fionnuala

+0

He intentado con el primero, como este 'Forms! [MainForm]! [SubformControl] .Form.Requery' y no necesita el subformulario. T El código está vinculado al otro botón de formulario. A menos que haya una manera de volver a consultar el subformulario desde el formulario principal cuando el otro formulario está cerrado, no puedo probar la sintaxis posterior. –

0

Al cerrar y abrir, el formulario principal normalmente ejecuta todas las consultas relacionadas (incluidas las relacionadas con el subformulario). Tuve un problema similar y lo resolví agregando lo siguiente al botón Guardar comando al hacer clic en evento.

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

Probé varias soluciones arriba, pero ninguna resolvió mi problema. Solución para actualizar un subformulario en un formulario después de guardar los datos en la base de datos:

Me.subformname.Requery

Trabajó muy bien para mí. Buena suerte.

Cuestiones relacionadas