Vba AfterUpdate-组合多个操作

Vba AfterUpdate-组合多个操作,vba,ms-access,Vba,Ms Access,我希望你能帮助我,我是VBA新手,但渴望学习。我创建了一个表单,将文档编号添加到我的数据库中(字段名DocNum)。我为该字段创建了一个“afterupdate”事件,以在每个表上创建一个相应的记录,该记录将保存该文档ID的附加信息。请参见此处的代码: Private Sub DocNum_AfterUpdate() Dim TBL_3_ManuscriptPrimaryReviewer As DAO.Recordset Set TBL_3_ManuscriptPrimaryReviewer

我希望你能帮助我,我是VBA新手,但渴望学习。我创建了一个表单,将文档编号添加到我的数据库中(字段名DocNum)。我为该字段创建了一个“afterupdate”事件,以在每个表上创建一个相应的记录,该记录将保存该文档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\u AfterUpdate。”

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

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_出版物,而不是表3、4或5

我已经搜索了大约2个小时关于如何有多个afterupdate事件,但似乎没有任何帮助。If>Then似乎不适用,For>Next也不适用

我想要一些帮助,谢谢!
-Deb

只需在没有任何记录集的情况下运行操作附加查询。由于您正在从用户输入窗体传递值,所以请考虑使用。为了使它成为一个干燥的er解决方案(Don'tRepeatYourself),每个查询调用都可以使用一个函数

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

但是,您的数据库设计可以通过规范化进行优化。与需要更新和维护的多个结构类似的表不同,使用一个带有类型等指标的表(即,
TBL\u审阅者)。此外,查询数据将更加容易

ID   Type                       Manuscript_Number      ...
1    PrimaryReviewer            12345
2    ManuscriptSTATReviewer     12345
3    ManuscriptSCReview         12345
4    ManuscriptPublications     12345
然后,您的追加查询将修改同一查询调用的两个值(甚至是DRY-er)


我相信您的
AfterUpdate
sub应该位于检测文档编号更改的源表的表对象中。如果事件捕捉器(
AfterUpdate
)位于userform对象或独立子对象(在模块中)中,则与您尝试触发的实际表没有直接连接。
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