I am receiving two errors when attempting to create a query which updates my audit log after an update is made to a record.
First I am prompted to enter a Parameter Value where I believed my ME.
code would point to any record with the current value of field [Corrected Med Ed ID]
.
Secondly I receive message:
Syntax error in INSERT INTO statement.
My form’s code is –
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
Advertisement
Answer
Simply use parameterized queries and avoid the need to concatenate SQL string in VBA. Specifically, save below two SQL statements as stored Access queries. Then bind parameters using QueryDefs in VBA for cleaner, readable, and maintainable code.
Note: the two update queries can be combined into one. Also, the table alias, t, is used. When using Query Design, Access will not allow you to save queries with syntax error. Below assumes parameter will be a string/text value.
SQL
Update Query
PARAMETERS idparam TEXT(255); UPDATE tbl_InterfaceLog t SET t.[LastUpdated] = Date(), t.[LastUpdatedBy] = Username() WHERE [CorrectedMedEdID] = idparam;
Append Query
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 (no concatenation)
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
Or DRY-er approach:
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