Sql 由于密钥冲突,无法追加

Sql 由于密钥冲突,无法追加,sql,ms-access,ms-access-2007,vba,Sql,Ms Access,Ms Access 2007,Vba,这是我第一次开发数据库,也是第一次使用MS Access!我试图通过链接到查询的表单将1条新记录附加到表中 Private Sub cmdAdjustStock_Click() 'Declare Vars Dim newqty As Long Dim Qty As Control Dim change As Control Dim BoxType As Control Dim sql As String 'Set form controls to vars Set Qty = Forms!fo

这是我第一次开发数据库,也是第一次使用MS Access!我试图通过链接到查询的表单将1条新记录附加到表中

Private Sub cmdAdjustStock_Click()
'Declare Vars
Dim newqty As Long
Dim Qty As Control
Dim change As Control
Dim BoxType As Control
Dim sql As String

'Set form controls to vars
Set Qty = Forms!formMain!txtQty
Set change = Forms!formMain!txtQtyChange
Set BoxType = Forms!formMain!txtBoxType

'Arithmetic and SQL
newqty = Qty + change
sql = "INSERT INTO tblHistory (BoxType, QtyChange, NewQty) VALUES ('&BoxType&','&change&','&newqty&')"

MsgBox "New Quantity = " & newqty & ", Box Type = " & BoxType 'For Debugging
DoCmd.RunSQL sql

End Sub
“TBL历史记录”包含以下字段:PID、logDate、BoxType、QtyChange、NewQty。所有字段都是必需的。“logDate”默认值=日期(),PID为自动编号。“tblHistory”目前没有任何记录,此追加将是第一次

“BoxType”位于与表“tblBoxList”的一对多关系的多端,该表包含BoxType(主)的主列表及其相应数量

My MsgBox显示正确的数量值和表格(即“RMA-834”)中与“tblBoxList”上的主箱型(“RMA-834”)匹配的箱型

通过MsgBox验证数据后,由于1个密钥冲突,追加失败。我假设这个冲突与PID(一个自动递增的数字)或从表单传递的BoxType Im不匹配tblBoxList中的主项有关。这是令人困惑的,因为MsgBox显示的值与主值相同


仅供参考:此项目中的表格已链接。我在网络的“后端”中有3个表。这是只包含表单的“前端”。

根据错误消息,这里显示的VB代码听起来与此无关。在MS Access中打开数据库文件,并首先在Access中执行查询。

检查请求Access执行的
INSERT
语句

sql=“插入TBL历史记录(BoxType、QtyChange、NewQty)值(‘&BoxType&’、‘&change&’、‘&NewQty&’)”
调试.打印sql
运行代码并检查即时窗口中的
INSERT
语句。你可以用Ctrl+g组合键去那里

您可以复制语句文本并将其粘贴到新Access查询的SQL视图中进行测试,这将帮助您诊断问题。如果您需要我们的帮助,请将陈述文本粘贴到您的问题中

还考虑将<代码> INSERT >代码转换为参数查询。您可以在VBA代码中使用该命名查询,并在运行时提供参数值

假设您创建并测试了一个与下面类似的参数查询,并将其命名为qryHistoryAppend,其中包括pBoxType、pQtyChange和pNewQty作为命名参数,您可以在VBA中打开该查询(
QueryDef
object),提供参数值并执行它

Const cstrQuery As String=“qryHistoryAppend”
Dim数据库作为DAO.Database
将qdf设置为DAO.QueryDef
Set db=CurrentDb
设置qdf=db.querydfs(cstrQuery)
qdf.Parameters(“pBoxType”)=表单!福尔曼!txtBoxType
qdf.Parameters(“pQtyChange”)=表格!福尔曼!txtQtyChange
qdf.参数(“pNewQty”)=表格!福尔曼!txtQty

qdf.executedbfailonerror'这将不起作用:

sql = "INSERT INTO tblHistory (BoxType, QtyChange, NewQty) VALUES ('&BoxType&','&change&','&newqty&')"
尝试将其更改为:

sql = "INSERT INTO tblHistory (BoxType, QtyChange, NewQty) VALUES ('" & BoxType & "','" & change & "','" & newqty & "')"

我希望能够使这项工作不使用VBA。我无法理解如何引用查询绑定的表单控件值并将它们作为参数附加到SQL附加字符串的第三个表“tblHistory”(例如,我的表单控件“txtBoxType”,它绑定到“BoxType”上的表“tblCaseList”和“tblBoxList”的内部联接查询)。因此,我同意使用“代码生成器”将表单控制值传递给局部子变量,然后引用我的sql追加字符串中的值,这非常有意义。我以为传递给sql语句的变量并非如此。如何将本地声明的、输入相关的变量的值传递为SQL Append参数@汉斯:谢谢你!谢谢你的帮助@HansUp!仅供参考。我在vba中使用对象引用时经历了一段糟糕的时光(可能是因为我是一个noob)。无论如何,在我用“&BoxType&”包围参数之前,我只是把它们称为“.Values(BoxType,)”等等。。。我会在运行时只提示'change'和'NewQuantity'值,并且可以成功地追加新记录。现在,我对access/vba对象引用的理解完全被头脑融化了,哈哈@汉苏比非常感谢你给我指明了正确的方向!我找到了这篇微软的文章。不客气。如果仍然遇到任何键冲突,请将插入值与已存储在具有唯一索引的字段中的值进行比较(主键是一种类型,但不是唯一的类型)。如果表中定义并强制了一个关系,那么其中的失败也会触发密钥冲突错误。这就是我的大部分问题所在。如何正确引用对象。你能给我解释一下
'&BoxType&'
'&BoxType&'
@Johnny bones之间的区别吗?你的变量必须在引号之外。首先关闭引号,然后用符号将变量括起来,然后重新打开引号。我很难解释,但一旦你认识到这种模式,它就非常有意义了。如果变量返回文本,则使用单引号;如果变量返回整数,则不使用引号。因此,如果BoxType是一个整数,那么它将是“&BoxType&”,如果它是一个文本,那么它将是“&BoxType&”(在单引号和双引号之间没有额外的空格,我只是将它们放进去,以便您可以看到它们)。