MSAccess VBA AfterUpdate SQL代码针对每条记录而不是当前记录运行

时间:2017-05-25 01:52:08

标签: sql vba ms-access access-vba

我有一个访问数据库,我将用它来跟踪订单和跟踪库存水平。当我尝试将订单上的部件(sbfrmOrderDetails)添加到我的库存表(tblInventory)时,我的VBA代码没有按计划执行。

请注意,我已将代码和表格仅删除相关信息/值。下面发布的代码确实有效,只是没有预期的。我将在下面详细解释。

表格结构

我创建了我的订单表单( frmOrder )作为单个表单。我的后续代码中引用了此表单,以使用 txtOrderID 控件确定订单号。当我链接子表单时,链接的主字段为 OrderID

在此表单中,我的订单详细信息子表单( sbfrmOrderDetails )是一个连续的表单。每个控件都绑定,并链接到父窗体。链接的子字段为 OrderID

照片1:这张照片可以更好地说明我的表格:

Photo 1: This photo may better illustrate my form.

表结构

我所拥有的相关表格的结构如下:

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:预期结果:

Photo 2: Intended Results

实际结果

当Combo1(绑定控件)仅在记录ID#11上从null更改为“Delivered”时,它将为子窗体中填充的每个记录添加新记录。

请参阅上面的照片2,将预期结果与实际结果进行比较。

您可以看到记录12和13中的数量是在记录11的InvID下转移的。

请参阅照片1查看样本数据,并参阅上面的照片2,以查看代码的实际结果。

我怀疑由于这是一个具有父/子链接的连续表单,因此表单为每个记录运行一次VBA代码(而不是当前记录的一次)。

我是否可以将我的VBA代码更改为仅按预期在当前记录上运行此代码一次?我希望这是完成这项任务的最佳方法。

2 个答案:

答案 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]>