Vba AfterUpdate-组合多个操作
我希望你能帮助我,我是VBA新手,但渴望学习。我创建了一个表单,将文档编号添加到我的数据库中(字段名DocNum)。我为该字段创建了一个“afterupdate”事件,以在每个表上创建一个相应的记录,该记录将保存该文档ID的附加信息。请参见此处的代码: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
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