2010-04-13 80 views
5

我有一个包含多个子表单的选项卡控件的主窗体。我需要确保在用户切换选项卡时保存子窗体中的数据。问题是DoCmd.RunCommand acCmdSaveRecord似乎只适用于当前窗体,因此它不会保存子窗体中的数据。女士访问存储子表格中的记录

我已经尝试了子窗体上的不同事件,如停用,OnLostFocus等,但他们不会开火,直到另一个字段在其他地方获得焦点。

理想的解决方案似乎是将某些东西放在选项卡控件的OnChange事件上,以确保所有数据都已保存。这是我的问题,如何保存记录在子窗体中?

回答

2

在Access中,默认是保存,所以除非你做了一些非常复杂的操作来防止这种情况,否则从一个子窗体移动焦点将自动保存该记录。您可以通过添加一条记录,从子窗体移动,然后检查表来测试。

+0

我找到了一个解决方案。当某些数据发生变化时,我需要运行一些代码来更新其他字段。发生了什么事情是因为它应该是没有开火......感谢您的输入! – Icode4food 2010-04-13 12:55:19

+0

为此,您可以考虑子窗体控件的LostFocus事件。 – 2010-04-14 01:05:08

1

根本没有必要做任何事情,因为一旦失去焦点(当选项卡控件更改时),就会保存子窗体。

但是作为一个练习,我已经概述了如果需要的话你会写的代码。

您可以通过将它的.Dirty属性设置为False来保存任何表单。对于这样的事情,我想我会写一个sub来遍历子表单,检查是否有脏,并保存脏的东西。事情是这样的:现在

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 

,这其实在你有很多的控制你的标签控制不属于子窗体的情况下非常低效的。如果你的标签除了子表单之外什么都没有,它将会非常高效。无论哪种情况,使用表单的OnLoad事件中填充的自定义集合效率更高,然后您将遍历除集合标签控件的子表单以外的任何集合,并保存任何非常脏的集合。

这两种方法都优于使用选项卡的OnChange事件,因为每次使用子窗体添加选项卡页或更改子窗体控件的名称时,都必须更改OnChange事件。

-2

将dirty属性设置为false可能会强制Access将数据保存到数据库,但会绕过before_update事件。这意味着如果您已将此事件用于验证或其他目的,则您现在可以在数据库中拥有错误的数据。

+2

这是不正确的 - FORM更新事件全部火(我刚刚测试)。但是,单个控件的事件不一定会触发(因为它们不会仅仅通过保存记录来激活)。 – 2011-07-07 20:18:09

0

我有一个类似的问题,我需要各种代码在子窗体中运行,并且主窗体中的值(基于子窗体中的值)需要重新计算。这是什么最终工作:

这是一个名为'frmCustomers'包含子窗体'sfmTransaction',其中又有一个子窗体称为'sfmOrderLine'的主窗体的一个例子。这些表单有一个'cmdSave'按钮,只有当用户点击'cmdEdit'按钮(其目的是锁定所有的控件,直到用户点击编辑按钮,然后在点击时重新锁定它们保存):

主窗体('frmCustomer')去子窗体的退出事件,并添加'我。重新计算” 两次,像这样:

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 

子窗体( 'sfmTransaction')去子窗体的窗体的退出事件,并添加 'me.recalc' 两次,像这样:

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 

希望这会有所帮助。