我有一个记录金融交易的 MS Access 数据库。它有一个名为frmDeposits
table的表单tblDep
。该表单上的一个按钮运行一个过程,该过程将数据从当前记录插入另一个表tblAccount
,使用DoCmd.RunSql
。代码如下所示:
DoCmd.RunSQL "INSERT INTO tblAccount ([Date], CheckNo, Amount, Vendor, Cleared, Deposit, Printed, Misc) " _
& "SELECT [Date], CheckNo, Amount, Vendor, Cleared, " & ident & " AS Deposit, Printed, Misc " & _
& "FROM tblDep WHERE Form=" & formnum & ";"
该formnum
变量在别处设置,并标识表单中的当前记录。该ident
变量也在别处定义。
不知怎的,在调试我的其他部分代码的过程中,这条SQL语句的最后一行被删除了,留下:
DoCmd.RunSQL "INSERT INTO tblAccount ([Date], CheckNo, Amount, Vendor, Cleared, Deposit, Printed, Misc) " _
& "SELECT [Date], CheckNo, Amount, Vendor, Cleared, " & ident & " AS Deposit, Printed, Misc"
令人惊讶的是,表单继续正确运行!此 RunSQL 语句仍在从frmDeposits
tblAccount 表中提取当前记录并将其插入。
我的问题是,为什么这行得通?我认为带有 SELECT 的 SQL 语句必须有一个 FROM 子句。我知道您可以使用不带 FROM 的 INSERT INTO ... VALUES 来插入一条记录,但即便如此,您也必须提供实际值而不是字段名称。
我注意到的另一件事:这似乎只适用于表单模块中的代码。如果我将 SQL 字符串粘贴到查询设计中并运行它,或者在表单范围之外运行类似的代码,我会得到每个字段的“输入参数值”弹出框。VBA 是否预先解析 SQL 字符串,并获取参数的表单字段或文本框?还是将 FROM 默认为表单的 RecordSource?对于 SQL 字符串中引用的所有字段,我在表单上没有文本框,尽管它们都存在于表单的基础表中。
顺便说一句,这是在 Access 2000 中运行的。是的,我知道这是一个过时的版本,但这是我必须使用的。
* *Edit - 添加一个注释,此行为仅在使用 DoCmd.RunSQL 时出现。如果我将相同的 SQL 字符串放入 db.Execute,它会返回“参数数量错误”错误。