通过VBA运行操作查询时出现SQL语法错误



我正试图通过VBA构建这个查询,而不是在Access中构建它并运行docmd.openquery。在我看来,这是一个更简单的途径,但我想使用SQL。显然,如果我在这里的话,这并没有达到预期效果,哈哈。因此,我尝试将JobTicket表单上14个文本框的Date值插入到另一个表Tbl_Schedule中。此表不是作为JobTicket表单记录源的Query的一部分。我担心尝试在中添加此表会使Query过载,因为它已经满了。当我试图快速导航到Query中的最后一个字段时,文本会在其顶部写入,然后Access在清除文本并加载最后几个字段时没有响应。再增加56个字段似乎会带来灾难。我将在下面发布我写的SQL。

DoCmd.RunSQL "INSERT INTO Tbl_Schedule (Date_Scheduled1, Date_Scheduled2, Date_Scheduled3, Date_Scheduled4, Date_Scheduled5, Date_Scheduled6, Date_Scheduled7, " & _
"(Date_Scheduled8, Date_Scheduled9, Date_Scheduled10, Date_Scheduled11, Date_Scheduled12, Date_Scheduled13, Date_Scheduled14)" & _
"VALUES (#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled1_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled2_JobTicket] & "#, " & _
"(#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled3_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled4_JobTicket] & "#, " & _
"(#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled5_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled6_JobTicket] & "#, " & _
"(#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled7_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled8_JobTicket] & "#, " & _
"(#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled9_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled10_JobTicket] & "#, " & _
"(#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled11_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled12_JobTicket] & "#, " & _
"(#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled13_JobTicket] & "#,#" & [Forms]![Frm_JobTicket]![Txt_DateScheduled14_JobTicket] & "#)"

正在插入的表:Tbl_Schedule

正在插入的字段:Date_Scheduled1-到-Date_Schedued14

从文本框获取数据:Txt_DateScheduled1_JobTicket-到Frm_JobTicket上的Txt_DateScheduled14_JobTiket

任何其他有助于你帮助我的问题,请随时提问!提前感谢!

动态SQL有它的用途,但这不是其中之一。

使用DAO方法可以使您的代码更简单、更易于阅读和调试。

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim frm As Access.Form
' for readability
Set frm = Forms!Frm_JobTicket
' open table for adding record(s)
Set db = CurrentDb
Set rs = db.OpenRecordset("Tbl_Schedule", dbOpenDynaset, dbAppendOnly)
rs.AddNew
rs!Date_Scheduled1 = frm!Txt_DateScheduled1_JobTicket
rs!Date_Scheduled2 = frm!Txt_DateScheduled2_JobTicket
' etc.
rs.Update
rs.Close

有了这样的枚举字段名,您还可以使用一个循环:

Dim i As Long
rs.AddNew
For i = 1 To 14
rs("Date_Scheduled" & i) = frm("Txt_DateScheduled" & i & "_JobTicket")
Next i
rs.Update

这是一个很好的机会,可以考虑规范化数据,以便完全消除部分问题。与其使用DateScheduled1_JobTicket、DateScheduled2_JobTiket等,不如使用另一个垂直填充而不是水平填充的表,也许可以使用ID、Item、JobTicketNumber、ScheduledDate等字段。

然后,在该表中为每个项目/sku/product和日期填充一行。每个项目/sku/产品的预定票证将有14行,而不是14列,这也将解决您未来添加56个字段的问题。这样做的好处是,您可以使用连续表单(在列表中(来显示作业通知单计划行。更好的是,您可以将这个带有日期的连续表单作为子表单放在您的item/sku/product主表单上,然后它将显示为一个整洁的预定票证列表,当您滚动item/sku-products时,该列表将自动更改。

如果你不使用连续形式,你仍然可以像现在一样使用未绑定的方法。一个好处是,当你需要添加未来的JobTicket编号时,它会更容易,因为你可以添加更多的行,而不是添加字段和做额外的设计工作。

如果您想以构建表的扁平方式查看数据,可以使用Crosstab查询将其呈现为表中的数据,但底层数据最好以规范化格式存储。

请注意,您不需要像上面所做的那样连接字符串;只需离开表单!类型控件直接在查询中引用表达式,并且您有一个很好的参数化查询,只要这些控件(文本框、下拉框等(中有日期,它就会执行得很好。

前任。

Insert Into (MyDateField) Values (Forms!MyForm!MyDateControl);

不需要动态SQL。

相关内容

最新更新