AfterUpdate - объединить несколько действий - PullRequest
0 голосов
/ 18 мая 2018

Я надеюсь, вы можете помочь, я новичок в VBA, но хочу учиться.Я создал форму, которая добавляет номер документа в мою базу данных (имя поля DocNum).Я создал событие "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
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 часов, как создать несколько событий afterupdate, но, похоже, ничего не помогает.Похоже, что If> Then не применимо, и For> Next.

Я бы хотел помочь, спасибо!-Deb

1 Ответ

0 голосов
/ 18 мая 2018

Просто запустите действие и добавьте запросы без каких-либо наборов записей.А поскольку вы передаете значения из пользовательских форм ввода, рассмотрите возможность параметризации с помощью QueryDefs .И чтобы сохранить его в СУХОМ решении ( D on't R epeat Y self), можно использовать функцию для каждого вызова запроса.

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_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...