Почему мой ЯСсылка и INSERT INTO вызывает ошибку? - PullRequest
0 голосов
/ 25 сентября 2019

Я получаю две ошибки при попытке создать запрос, который обновляет мой журнал аудита после обновления записи.

Сначала мне предлагается ввести значение параметра, в котором я полагал, что мой код ME. будет указывать на любую запись с текущим значением поля [Corrected Med Ed ID].

Во-вторых, я получаю сообщение:

Синтаксическая ошибка в операторе INSERT INTO.

Код моей формы -

Private Sub Form_AfterUpdate()
    Dim UserName As String

    DoCmd.SetWarnings False
    'updates date
    DoCmd.RunSQL "update tbl_InterfaceLog SET tbl_InterfaceLog.[LastUpdated] = Date() Where [Corrected Med Ed ID] = " & Me.[Corrected Med Ed ID]
    'stamps username
    DoCmd.RunSQL "update tbl_InterfaceLog SET tbl_InterfaceLog.[LastUpdatedBy] = Username() Where [Corrected Med Ed ID] = " & Me.[Corrected Med Ed ID]
    'Adds the record to log
    DoCmd.RunSQL "INSERT INTO tbl_AuditLog (Status, Comments, Owner, [corrected med ed ID], [Upload File Name], [Submission Method], AirfareStatus, GroundStatus, MealsStatus, AccomodationStatus, AirfareComment, GroundComment, MealsComment, AccommodationComment, Coordinator, SupportRequested, LastUpdated, Reviewed, ReviewerComment, RequiredChange, EventDate, ProductsMatch, SubmissionMethod, TravelDestination, LastUpdatedBy" _
    & " SELECT tbl_InterfaceLog.Status, tbl_InterfaceLog.Comments, tbl_InterfaceLog.Owner, tbl_InterfaceLog.[corrected med ed ID], tbl_InterfaceLog.[Upload File Name], tbl_InterfaceLog.[Submission Method], tbl_InterfaceLog.AirfareStatus, tbl_InterfaceLog.GroundStatus, tbl_InterfaceLog.MealsStatus, tbl_InterfaceLog.AccomodationStatus, tbl_InterfaceLog.AirfareComment, tbl_InterfaceLog.GroundComment, tbl_InterfaceLog.MealsComment, tbl_InterfaceLog.AccommodationComment, tbl_InterfaceLog.Coordinator, tbl_InterfaceLog.SupportRequested, tbl_InterfaceLog.LastUpdated, tbl_InterfaceLog.Reviewed, tbl_InterfaceLog.ReviewerComment, tbl_InterfaceLog.RequiredChange, tbl_InterfaceLog.EventDate, tbl_InterfaceLog.ProductsMatch, tbl_InterfaceLog.SubmissionMethod, tbl_InterfaceLog.TravelDestination, tbl_InterfaceLog.LastUpdatedBy" _
    & " FROM tbl_InterfaceLog" _
    & " WHERE [Corrected Med Ed ID] = " & Me.[Corrected Med Ed ID]
    DoCmd.SetWarnings True
End Sub

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Просто используйте параметризованные запросы и избегайте необходимости объединять строки SQL в VBA.В частности, сохраните ниже двух операторов SQL в качестве сохраненных запросов доступа.Затем свяжите параметры, используя QueryDefs в VBA для более чистого, удобочитаемого и обслуживаемого кода.

Примечание: два запроса на обновление могут быть объединены в один.Также используется псевдоним таблицы t .При использовании Query Design Access не позволяет сохранять запросы с синтаксической ошибкой.Ниже предполагается, что параметром будет строковое / текстовое значение.

SQL

Обновление запроса

PARAMETERS idparam TEXT(255);
UPDATE tbl_InterfaceLog t
   SET t.[LastUpdated] = Date(),
       t.[LastUpdatedBy] = Username()
WHERE [CorrectedMedEdID] = idparam;

Добавление запроса

PARAMETERS idparam TEXT(255);
INSERT INTO tbl_AuditLog ([Status], [Comments], [Owner], [corrected med ed ID], 
                          [Upload File Name], [Submission Method], AirfareStatus,
                          GroundStatus, MealsStatus, AccomodationStatus, 
                          AirfareComment, GroundComment, MealsComment, 
                          AccommodationComment, Coordinator, SupportRequested, 
                          LastUpdated, Reviewed, ReviewerComment, RequiredChange, 
                          EventDate, ProductsMatch, SubmissionMethod, 
                          TravelDestination, LastUpdatedBy)

SELECT t.Status, t.Comments, t.Owner, t.[corrected med ed ID], t.[Upload File Name],
       t.[Submission Method], t.AirfareStatus, t.GroundStatus, t.MealsStatus, 
       t.AccomodationStatus, t.AirfareComment, t.GroundComment, t.MealsComment, 
       t.AccommodationComment, t.Coordinator, t.SupportRequested, t.LastUpdated, 
       t.Reviewed, t.ReviewerComment, t.RequiredChange, t.EventDate, t.ProductsMatch, 
       t.SubmissionMethod, t.TravelDestination, t.LastUpdatedBy
FROM tbl_InterfaceLog t
WHERE t.[CorrectedMedEdID] = idparam;

VBA (без объединения)

Private Sub Form_AfterUpdate()
    Dim UserName As String
    Dim qdef as QueryDef

    ' UPDATE QUERY 
    Set qdef = CurrentDb.QueryDefs("myUpdateQuery")        
    qdef!idparam = Me.[Corrected Med Ed ID]             ' BIND PARAM
    qdef.Execute dbFailOnError                          ' EXECUTE QUERY
    Set qdef = Nothing    

    ' APPEND QUERY
    Set qdef = CurrentDb.QueryDefs("myAppendQuery")        
    qdef!idparam = Me.[Corrected Med Ed ID]             ' BIND PARAM
    qdef.Execute dbFailOnError                          ' EXECUTE QUERY
    Set qdef = Nothing
End Sub

Или подход DRY-er:

Private Sub Form_AfterUpdate()
    Dim UserName As String, qry As Variant
    Dim qdef as QueryDef

    ' RUN ACTION QUERIES
    For Each qry in Array("myUpdateQuery", "myAppendQuery")
        Set qdef = CurrentDb.QueryDefs(qry)  
        qdef!idparam = Me.[Corrected Med Ed ID]         ' BIND PARAM
        qdef.Execute dbFailOnError                      ' EXECUTE QUERY
        Set qdef = Nothing    
    Next qry

    Set qdef = Nothing
End Sub
0 голосов
/ 25 сентября 2019

Проверяли ли вы и исследовали ли имена столбцов SQL в базе данных с учетом регистра при разделении?То есть на этом столе создание.Если это так, [corrected med ed ID][Corrected Med Ed ID]

Вы можете попытаться исправить Case и посмотреть, работает ли он.

...