【问题标题】:AfterUpdate - combine multiple actionsAfterUpdate - 组合多个操作
【发布时间】:2018-05-18 15:15:42
【问题描述】:

希望您能帮上忙,我是 VBA 新手,但渴望学习。我创建了一个向我的数据库添加文档编号的表单(字段名称 DocNum)。我为该字段创建了一个“更新后”事件,以在每个表上创建相应的记录,该记录将保存该文档 ID 的附加信息。在此处查看代码:

Private Sub DocNum_AfterUpdate()
Dim TBL_3_ManuscriptPrimaryReviewer As DAO.Recordset

Set TBL_3_ManuscriptPrimaryReviewer = CurrentDb.OpenRecordset("Select * FROM    [TBL_3_ManuscriptPrimaryReviewer]")
TBL_3_ManuscriptPrimaryReviewer.AddNew
TBL_3_ManuscriptPrimaryReviewer![Manuscript_Number] = Me.DocNum.Value
TBL_3_ManuscriptPrimaryReviewer.Update
TBL_3_ManuscriptPrimaryReviewer.Close
Set TBL_3_ManuscriptPrimaryReviewer = Nothing
End Sub

Private Sub DocNum_AfterUpdate()

Dim TBL_4_ManuscriptSTATReviewer As DAO.Recordset

Set TBL_4_ManuscriptSTATReviewer = CurrentDb.OpenRecordset("Select * FROM [TBL_4_ManuscriptSTATReviewer]")
TBL_4_ManuscriptSTATReviewer.AddNew
TBL_4_ManuscriptSTATReviewer![Manuscript_Number] = Me.DocNum.Value
TBL_4_ManuscriptSTATReviewer.Update
TBL_4_ManuscriptSTATReviewer.Close
Set TBL_4_ManuscriptSTATReviewer = Nothing
End Sub

Private Sub DocNum_AfterUpdate()

Dim TBL_5_ManuscriptSCReview As DAO.Recordset

Set TBL_5_ManuscriptSCReview = CurrentDb.OpenRecordset("Select * FROM [TBL_5_ManuscriptSCReview]")
TBL_5_ManuscriptSCReview.AddNew
TBL_5_ManuscriptSCReview![Manuscript_Number] = Me.DocNum.Value
TBL_5_ManuscriptSCReview.Update
TBL_5_ManuscriptSCReview.Close
Set TBL_5_ManuscriptSCReview = Nothing
End Sub

Private Sub DocNum_AfterUpdate()

Dim TBL_6_ManuscriptPublications As DAO.Recordset

Set TBL_6_ManuscriptPublications = CurrentDb.OpenRecordset("Select * FROM [TBL_6_ManuscriptPublications]")
TBL_6_ManuscriptPublications.AddNew
TBL_6_ManuscriptPublications![Manuscript_Number] = Me.DocNum.Value
TBL_6_ManuscriptPublications.Update
TBL_6_ManuscriptPublications.Close
Set TBL_6_ManuscriptPublications = Nothing

End Sub

但是,当我尝试使用表单时出现以下错误:

“作为事件属性设置输入的更新后表达式产生了以下错误:检测到不明确的名称:DocNum_AfterUpdate。”

在做了一些研究之后,我尝试将代码重写为一个 Private Sub,而不是四个,如下所示:

Private Sub DocNum_AfterUpdate()
Dim TBL_3_ManuscriptPrimaryReviewer As DAO.Recordset

Set TBL_3_ManuscriptPrimaryReviewer = CurrentDb.OpenRecordset("Select * FROM [TBL_3_ManuscriptPrimaryReviewer]")
TBL_3_ManuscriptPrimaryReviewer.AddNew
TBL_3_ManuscriptPrimaryReviewer![Manuscript_Number] = Me.DocNum.Value
TBL_3_ManuscriptPrimaryReviewer.Update
TBL_3_ManuscriptPrimaryReviewer.Close
Set TBL_3_ManuscriptPrimaryReviewer = Nothing

Dim TBL_4_ManuscriptSTATReviewer As DAO.Recordset

Set TBL_4_ManuscriptSTATReviewer = CurrentDb.OpenRecordset("Select * FROM [TBL_4_ManuscriptSTATReviewer]")
TBL_4_ManuscriptSTATReviewer.AddNew
TBL_4_ManuscriptSTATReviewer![Manuscript_Number] = Me.DocNum.Value
TBL_4_ManuscriptSTATReviewer.Update
TBL_4_ManuscriptSTATReviewer.Close
Set TBL_4_ManuscriptSTATReviewer = Nothing

Dim TBL_5_ManuscriptSCReview As DAO.Recordset

Set TBL_5_ManuscriptSCReview = CurrentDb.OpenRecordset("Select * FROM [TBL_5_ManuscriptSCReview]")
TBL_5_ManuscriptSCReview.AddNew
TBL_5_ManuscriptSCReview![Manuscript_Number] = Me.DocNum.Value
TBL_5_ManuscriptSCReview.Update
TBL_5_ManuscriptSCReview.Close
Set TBL_5_ManuscriptSCReview = Nothing

Dim TBL_6_ManuscriptPublications As DAO.Recordset

Set TBL_6_ManuscriptPublications = CurrentDb.OpenRecordset("Select * FROM [TBL_6_ManuscriptPublications]")
TBL_6_ManuscriptPublications.AddNew
TBL_6_ManuscriptPublications![Manuscript_Number] = Me.DocNum.Value
TBL_6_ManuscriptPublications.Update
TBL_6_ManuscriptPublications.Close
Set TBL_6_ManuscriptPublications = Nothing

End Sub

但是,这也不起作用。它只更新 TBL_6_ManuscriptPublications,而不是表 3、4 或 5。

我已经搜索了大约 2 个小时来了解如何进行多个更新后事件,但似乎没有任何帮助。 If>Then 似乎不适用,For>Next 也不适用。

我很想得到一些帮助,谢谢! -德布

【问题讨论】:

  • 我相信您的AfterUpdate sub 应该位于检测文档编号更改的源表的表对象中。如果事件捕获器 (AfterUpdate) 在用户表单对象中或在独立子(在模块中)中,则与您尝试触发的实际表没有直接联系。

标签: vba ms-access


【解决方案1】:

只需运行操作追加查询,无需任何记录集。由于您是从用户输入表单中传递值,因此请考虑使用QueryDefs 进行参数化。为了保持它是一个 DRY-er 解决方案(Don't Repeat Yourself),每个查询调用都可以使用一个函数.

Private Sub DocNum_AfterUpdate()
   Dim strSQL

   ' TBL_3_ManuscriptPrimaryReviewer APPEND
   strSQL = "PARAMETERS DocNumParam TEXT(255);" _
            & " INSERT INTO [TBL_3_ManuscriptPrimaryReviewer] ([Manuscript_Number]) " _
            & " VALUES (DocNumParam)"

   Call RunQuery(strSQL)

   ' TBL_4_ManuscriptSTATReviewer APPEND
   strSQL = "PARAMETERS DocNumParam TEXT(255);" _
            & "INSERT INTO [TBL_4_ManuscriptSTATReviewer] ([Manuscript_Number]) " _
            & " VALUES (DocNumParam)"

   Call RunQuery(strSQL)

   ' TBL_5_ManuscriptSCReview APPEND
   strSQL = "PARAMETERS DocNumParam TEXT(255);" _
            & "INSERT INTO [TBL_5_ManuscriptSCReview] ([Manuscript_Number]) " _
            & " VALUES (DocNumParam)"

   Call RunQuery(strSQL)

   ' TBL_6_ManuscriptPublications APPEND
   strSQL = "PARAMETERS DocNumParam TEXT(255);" _
            & "INSERT INTO [TBL_6_ManuscriptPublications] ([Manuscript_Number]) " _ 
            & " VALUES (DocNumParam)"

   Call RunQuery(strSQL)

End Sub

Public Function RunQuery(stmt As String)
    Dim qdef As QueryDef

    Set qdef = CurrentDb.CreateQueryDef("", stmt)

    ' BIND PARAM VALUE
    qdef!DocNumParam = Me.DocNumValue

    ' EXECUTE ACTION
    qdef.Execute, dbFailOnError

    Set qdef = Nothing
End Function

但是,您的数据库设计可以通过规范化进行优化。使用带有 Type 等指示符的 一个 表(即TBL_REVIEWERS),而不是需要更新和维护的多个类似结构的表。此外,查询数据会容易得多。

ID   Type                       Manuscript_Number      ...
1    PrimaryReviewer            12345
2    ManuscriptSTATReviewer     12345
3    ManuscriptSCReview         12345
4    ManuscriptPublications     12345

然后您的附加查询将针对同一查询调用修改两个值(甚至是 DRY-er)。

Private Sub DocNum_AfterUpdate()
    Dim var As Variant 
    Dim strSQL As String

    strSQL = "PARAMETERS TypeParam TEXT(255), DocNumParam TEXT(255);" _
                & " INSERT INTO [TBL_Reviewers] ([Type], [Manuscript_Number]) " _
                & " VALUES (TypeParam, DocNumParam)"

    ' RUN APPEND QUERIES
    For Each var In Array("PrimaryReviewer", "ManuscriptSTATReviewer" _
                          "ManuscriptSCReview", "ManuscriptPublications")
        Call RunQuery(strSQL, var)
    Next var
End Sub

Public Function RunQuery(strSQL As String, strType As String)
    Dim qdef As QueryDef

    Set qdef = CurrentDb.CreateQueryDef("", strSQL)

    ' BIND PARAM VALUES
    qdef!TypeParam = strType
    qdef!DocNumParam = Me.DocNumValue

    ' EXECUTE ACTION
    qdef.Execute, dbFailOnError

    Set qdef = Nothing
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2021-04-22
    • 2016-05-12
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多