我有一个访问数据库,我将用它来跟踪订单和跟踪库存水平。当我尝试将订单上的部件(sbfrmOrderDetails
)添加到我的库存表(tblInventory
)时,我的VBA代码没有按计划执行。
请注意,我已将代码和表格仅删除相关信息/值。下面发布的代码确实有效,只是没有预期的。我将在下面详细解释。
我创建了我的订单表单( frmOrder )作为单个表单。我的后续代码中引用了此表单,以使用 txtOrderID 控件确定订单号。当我链接子表单时,链接的主字段为 OrderID 。
在此表单中,我的订单详细信息子表单( sbfrmOrderDetails )是一个连续的表单。每个控件都绑定,并链接到父窗体。链接的子字段为 OrderID 。
照片1:这张照片可以更好地说明我的表格:
我所拥有的相关表格的结构如下:
TableName:tblOrders
TableColumns:OrderID
TableName:tblOrderDetails
TableColumns:ID | InvID | Qty | OrderID | DeliveryStatus
TableName:tblInventory
TableColumns:ID | InvID | Qty | OrderID
我尝试采取的操作发生在子窗体中,并且应该与当前记录隔离。当用户将ComboBox( Combo1 绑定控件)更改为tblOrderDetails.DeliveryStatus时,我的VBA代码将执行'INSERT INTO'SQL字符串,该字符串将当前记录中的InvID和Qty添加到库存表中(的 tblInventory )。
Combo1 AfterUpdate事件的VBA代码(在sbfrmOrderDetails上)
Private Sub Combo1_AfterUpdate()
Dim db As DAO.Database
Dim strSQL As String
Set db = CurrentDb
If Me.Combo1.Value = "Delivered" Then
strSQL = "INSERT INTO [tblInventory] ([InvID],[Qty])" _
& "SELECT " & Forms![frmOrder].Form![sbfrmOrderDetails].Form![txtInvID] & " AS InvID," & Forms![frmOrder].Form![sbfrmOrderDetails].Form![txtQty] & " AS Qty " _
& "FROM tblOrderDetails WHERE ((tblOrderDetails.OrderID)=(" & Forms![frmOrder]![txtOrderID] & "));"
Debug.Print strSQL
db.Execute strSQL, dbFailOnError
Else
'Other event
End If
End Sub
当Combo1(绑定控件)仅在记录ID#11上从null更改为“Delivered”时,它应该添加一个新记录。
照片2:预期结果:
当Combo1(绑定控件)仅在记录ID#11上从null更改为“Delivered”时,它将为子窗体中填充的每个记录添加新记录。
请参阅上面的照片2,将预期结果与实际结果进行比较。
您可以看到记录12和13中的数量是在记录11的InvID下转移的。
请参阅照片1查看样本数据,并参阅上面的照片2,以查看代码的实际结果。
我怀疑由于这是一个具有父/子链接的连续表单,因此表单为每个记录运行一次VBA代码(而不是当前记录的一次)。
我是否可以将我的VBA代码更改为仅按预期在当前记录上运行此代码一次?我希望这是完成这项任务的最佳方法。
答案 0 :(得分:0)
tblOrders.OrderID - >该表未在语句中引用,vba应该抛出错误
strSQL = "INSERT INTO [tblInventory] ([InvID],[Qty])" _
& "SELECT " & Forms![frmOrder].Form![sbfrmOrderDetails].Form![txtInvID] & " AS InvID," & Forms![frmOrder].Form![sbfrmOrderDetails].Form![txtQty] & " AS Qty " _
& "FROM tblOrderDetails WHERE ((tblOrders.OrderID)=
(" & Forms![frmOrder]![txtOrderID] & "));"
Debug.Print strSQL
答案 1 :(得分:0)
Debug.Print strSQL
的输出会有所帮助(参见How to debug dynamic SQL in VBA),但它会是这样的:
INSERT INTO tblInventory (InvID, Qty)
SELECT 14 AS InvID, 2 AS Qty
FROM tblOrderDetails
WHERE tblOrderDetails.OrderID = 5
您正在插入两个常量值,因此您也可以使用INSERT ... VALUES (...)
语法,根据定义,它只插入一条记录:
INSERT INTO tblInventory (InvID, Qty)
VALUES (14, 2)
您的语句插入多个记录的原因是WHERE tblOrderDetails.OrderID = 5
。多个记录(全部在子表单上)满足此子句。
您必须指定 OrderDetails ID ,才能获得一条记录:
INSERT INTO tblInventory (InvID, Qty)
SELECT 14 AS InvID, 2 AS Qty
FROM tblOrderDetails
WHERE tblOrderDetails.ID = <Forms![frmOrder]![sbfrmOrderDetails].Form![txtID]>