对表单保存的操作

时间:2015-05-18 18:45:37

标签: access-vba ms-access-2010

我们有一个Access 2010数据库,它充当MS SQL数据库的前端。当我们编辑表单中的数据时,需要运行一个过程,以便将某些数据正确地保存回SQL。

我们的DB程序员添加了一个“保存按钮”来执行此操作。但这会导致另一个问题 - 在Access中有多种方法可以保存表单 -

  • 导航到下一条记录
  • 点击左侧的确认栏
  • 创建新记录
  • 搜索新记录
  • 使用功能区中的命令

有没有办法将程序附加到实际的保存操作,这样无论一个人如何移动到下一个表单,程序就会运行?

[更新]

这是幕后的代码:第一个子附加到“保存”按钮。当然,第二个附加到BeforeUpdate形式。

Private Sub SaveRecord_Click()
'From NAME form
Form_BeforeUpdate False
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
'used by NAME form
    [Last_Update] = Now
    '*********************
    Save_Record
    '*********************
    MName_ID = Me.Name_ID
    Me.Undo
    Cancel = True
    If Not IsNull(MName_ID) Then
        Jump_to_Name_ID MName_ID, True
    Else
    End If
End Sub

我想我只是不明白按钮的用途。

2 个答案:

答案 0 :(得分:3)

所以我安装了MS Access 2010试用版,最终找到了解决问题的方法。它包括数据宏和hidden gem,它花了我很长时间才找到。

以下是表格更改时运行VBA的方式:

  1. 使用公共函数创建一个普通的模块(没有尝试过的类模块):
  2. 模块名称: EventHandlers

    Public Function InsertEvent(ByVal id As Integer)
        MsgBox "inserted: " + CStr(id)
    End Function
    
    1. 打开表格,修改后应运行VBA并转到"表格"在功能区中。

    2. 点击"插入"

    3. 在"添加新操作" - 选择框中,选择SetLocalVar(或从操作目录中选择)。

    4. 在名称字段中,插入模块的名称(在本例中为EventHandlers,如前所述)

    5. 在表达式字段中,写下函数的名称:InsertEvent([id])(其中[id]是您要为其添加数据宏的表中的实际列)

    6. 保存并关闭

    7. 每当向表中插入某些内容时,都会显示一个带有id的消息框。

      您可以对更新事件执行相同操作。功能可能是这样的:

      Public Function UpdateEvent(ByVal oldValue As String, ByVal newValue As String)
          MsgBox oldValue + " changed to: " + newValue
      End Function
      

      ,数据宏将是

      行动:SetLocalVar

      姓名:EventHandlers

      表达式:UpdateEvent([Old].[your_column_name];[your_column_name])

      注意:执行带有更新,插入或删除的DoCmd.RunSQL将执行数据宏,然后询问用户他或她是否实际更新/插入/删除该行。如果用户单击取消,则不会更改任何内容,但仍会执行数据宏。如果您还没有,则应该在实现数据宏之前禁用此检查。

答案 1 :(得分:0)

好吧,我无法使用Sommer先生的解决方案,因为由于它们是只读的,因此无法将事件处理程序添加到链接表中。但是,我确实制定了一个似乎运作良好的简单程序。

所以,我实际上已经在使用BeforeUpdate事件了,所以我在这里捕捉正确的事件 - 这是捕获保存的事件,无论是更改导航还是保存 - 左边的记录栏。但是,在Application.Echo False发生时,使用Me.Undo阻止Access将旧数据发回控件后,会出现一些问题。

因此我们使用cancel=true来阻止BeforeUpdate事件进行正常处理,我们使用Me.Undo来阻止Access尝试将数据保存到链接表。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = True

    [Last_Update] = Now
    '*********************
    Save_Record '-->This will save the data back to SQL
    '*********************
    MName_ID = Me.Name_ID
    Application.Echo False  'don't show the undo in the controls
    Me.Undo

    If Not IsNull(MName_ID) Then    'used for the navigation buttons
        Jump_to_Name_ID MName_ID, True
    Else
    End If

    Application.Echo True   'turn the control refresh back on
    Me.Repaint
End Sub