2010-04-13 120 views
5

Tengo un formulario principal con un control de pestañas que contiene múltiples subformularios. Necesito estar seguro de que los datos en un subformulario se guardan cuando el usuario cambia las pestañas. El problema es que DoCmd.RunCommand acCmdSaveRecord parece que solo se aplica al formulario actual, por lo que no guarda los datos en el subformulario.Ms Acceso Guardar registro en el subformulario

He intentado diferentes eventos en el subformulario, como desactivar, OnLostFocus, etc., pero no se disparan hasta que otro campo en otro lugar obtiene el foco.

La solución ideal sería colocar algo en el evento OnChange del control de tabulación para asegurarse de que se guardan todos los datos. Esa es mi pregunta, ¿cómo puedo guardar el registro en un subformulario?

Respuesta

2

En Access, el valor predeterminado es guardar, por lo tanto, a menos que haya hecho algo bastante complicado para evitarlo, al mover el foco desde un subformulario se guardará automáticamente el registro. Puedes probar esto agregando un registro, moviéndote desde el subformulario y luego revisando la tabla.

+0

Tengo una solución resuelta. Necesito ejecutar algún código para actualizar otros campos cuando se cambian ciertos datos. Lo que sucedía era que esto no estaba disparando cuando se suponía que ... ¡Gracias por la entrada! – Icode4food

+0

Para eso, puede considerar los eventos LostFocus de los controles de subformulario. –

1

No tiene que hacer nada en absoluto, ya que el subformulario se guarda tan pronto como pierde el foco (cuando el control de tabulación cambia).

Pero como ejercicio, he esbozado el código que escribiría si lo necesitara.

Puede guardar cualquier forma configurando su propiedad .Dirty en False. Para algo como esto que va a funcionar mucho, creo que escribiría un sub para recorrer los subformularios, verifica si alguno está sucio y guardar los sucios. Algo como esto:

Public Sub SaveSubFormsOnTab() 
    Dim pge As Control 
    Dim ctl As Control 

    For Each pge In Me!ctlTab.Pages 
     Debug.Print pge.Name 
     For Each ctl In pge.Controls 
     If ctl.ControlType = acSubform Then 
      If ctl.Form.Dirty Then 
       ctl.Form.Dirty = False 
      End If 
      Debug.Print ctl.Name 
     End If 
     Next ctl 
    Next pge 
    Set ctl = Nothing 
    Set pge = Nothing 
    End Sub 

Ahora, que en realidad es bastante ineficaz en los casos donde hay un montón de controles de su tarjeta de registro que no son subformularios. Si su pestaña no tiene más que subformularios, será bastante eficiente. En cualquier caso, es mucho más eficiente utilizar una colección personalizada poblada en el evento OnLoad del formulario, y luego recorrería esa colección que incluye nada más que los subformularios del control de pestañas, y guardará los que estén sucios.

Cualquiera de estos es preferible al uso del evento OnChange de la pestaña, ya que cada vez que agrega una pestaña con un subformulario o cambia el nombre de un control de subformulario, debe modificar el evento OnChange.

-2

Establecer la propiedad sucia en falso puede forzar el acceso para guardar los datos en la base de datos, pero omite el evento before_update. Esto significa que si ha utilizado este evento para validación u otros fines, ahora puede tener datos incorrectos en su base de datos.

+2

Eso no es verdad: todos los eventos de actualización de FORMA se activan (acabo de probar). Sin embargo, los eventos de los controles individuales no necesariamente se disparan (porque no se activarán simplemente guardando el registro). –

0

Estaba teniendo un problema similar en el que necesitaba varios códigos para ejecutar en el subformulario y valores en el formulario principal, que se basaban en los valores del subformulario, para volver a calcular. Esto es lo que finalmente funcionó:

Este es un ejemplo con una forma principal llamada 'frmCustomers' que contiene un subformulario 'sfmTransaction', que a su vez tiene un subformulario llamado 'sfmOrderLine'. Los formularios tienen un botón 'cmdSave' que solo está visible cuando el usuario hace clic en el botón 'cmdEdit' (cuyo objetivo es bloquear todos los controles hasta que el usuario haga clic en el botón editar, y luego volver a bloquearlos cuando hace clic guardar):

En el formulario principal ('frmCustomer') vaya al evento de salida del subformulario, y agregue 'me.recálculo' dos veces, así:

Private Sub sfmTransaction_Exit(Cancel As Integer) 
    If (Not Form_sfmTransaction.NewRecord And Form_sfmTransaction.cmdSave.Visible) Or (Not Form_sfmOrderLine.NewRecord And Form_sfmOrderLine.cmdSave.Visible) Then 
     'To save subforms 
     Me.Recalc 
     Me.Recalc 
    End If 
End Sub 

En el subformulario ('sfmTransaction') van evento de salida de subformulario del subformulario, y añadir 'me.recalc' dos veces, así:

Private Sub sfmOrderLine_Exit(Cancel As Integer) 
    If Not Form_sfmOrderLine.NewRecord And Form_sfmOrderLine.cmdSave.Visible Then 
     'To save subform 
     Me.Recalc 
     Me.Recalc 
    End If 
End Sub 

Espero que esto ayude.

Cuestiones relacionadas