Ms子窗口中的Access保存记录

时间:2010-04-13 12:35:10

标签: ms-access vba access-vba

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

我在子窗体上尝试过不同的事件,例如deactivate,OnLostFocus等,但是在其他地方获得焦点之前它们不会触发。

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您根本无需执行任何操作,因为子窗体在失去焦点时会立即保存(当制表符控件发生更改时)。

但作为练习,如果需要,我已经概述了你要编写的代码。

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

  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 :(得分:1)

我遇到了类似的问题,我需要在子窗体中运行各种代码,并且需要重新计算主窗体中的值(基于子窗体中的值)。以下是最终奏效的内容:

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

主窗体('frmCustomer')上转到子窗体的退出事件,并添加'me.recalc'两次,如下所示:

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

希望这有帮助。

答案 3 :(得分:-2)

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