【问题标题】:Run Update query within VBA code在 VBA 代码中运行更新查询
【发布时间】:2012-09-13 14:01:21
【问题描述】:

我正在尝试使用 Access 制作一个小型库存程序,但我没有太多知识,到目前为止我所做的一切都是通过谷歌搜索。我已经设法编写代码来使用未绑定的表单存储数据,现在我想通过在另一个表的未绑定表单中输入的数据来更新表的某些特定字段。有问题的 2 个表是 Transaction 和 Stock。库存有 3 个字段 PartNo、Location 和 Qty。我希望将库存数量从库存移出的位置中扣除,并添加到它要去的位置。

Stock中的样本数据

Stock_PartNo    Stock_Location  Stock_Qty
2288            SAWRH001        85
2288            SAWRH002        54
3214            SAWRH003        544
4567            SAWRH001        32
5555            SAWRH002        128
5555            SAWRH005        874
5678            SAWRH002        321
6544            SAWRH004        465
6666            SAWRH003        45
6666            SAWRH004        87
7777            SAWRH003        365
7890            SAWRH002        352
8765            SAWRH005        57
8888            SAWRH004        54
9999            SAWRH005        21

这是我的未绑定表单代码:

Private Sub Command39_Click()

Dim db As Database, rsCust As Recordset


    Set db = CurrentDb
    Set rsCust = db.OpenRecordset("Transaction", DB_OPEN_DYNASET)

        rsCust.AddNew
        rsCust("Trans_PartNo") = Me!Combo52
        rsCust("Trans_Desc") = Me!Text19
        rsCust("Trans_Disp") = Me!Text21
        rsCust("Trans_Recv") = Me!Text23
        rsCust("Trans_Qty") = Me!Text25
        rsCust("Trans_Date") = Me!Text29
        rsCust.Update

        MsgBox "Material transfer information has been updated"

        Call ClearControls

    rsCust.Close
    db.Close
End Sub

这些数据将存储在一个名为 Transaction 的表中,该表只是记录从一个地方移动到另一个地方的历史记录。我想要的是表 Stock 应该使用这个表格更新,所以如果 PartNo 2288 从 SAWRH001 转移到 SAWRH005 那么它应该自动更新表 Stock。据我了解,我需要嵌入一个 SQL 查询,但我不知道如何在 VBA 中做到这一点。

【问题讨论】:

    标签: sql vba ms-access-2010


    【解决方案1】:

    带参数:

    Dim db As Database
    Dim qdf As QueryDef
    
    Set db = CurrentDb
    sSQL = "UPDATE Stock SET Stock_Qty = Stock_Qty + [p1] " & _
         " WHERE Stock_PartNo = [p2] AND Stock_Location = [p3]"
    
    ''Temporary query
    Set qdf = db.CreateQueryDef("", sSQL)
    ''No need to worry about quotes etc
    qdf.Parameters("p2") = Me!Combo52
    
    ''Subtract
    qdf.Parameters("p1") = Me.Text25 * -1
    qdf.Parameters("p3") = Me.From
    qdf.Execute dbFailOnError
    
    ''Add
    qdf.Parameters("p1") = Me.Text25
    qdf.Parameters("p3") = Me.To
    qdf.Execute dbFailOnError
    

    【讨论】:

    • 感谢Remou的回答,但是需要更新的表是Stock而不是Transaction。事务表只是一个日志。我想要的是当我的表单代码完成时,以下值用于更新表 Stock rsCust("Trans_Disp") = Me!Text21 rsCust("Trans_Recv") = Me!Text23 rsCust("Trans_Qty") = Me !Text25 现在我正在寻找可以使用部件号在两端更新 Stock 的东西。减去数据已经流出的仓库中的库存,然后将库存添加到它将去的仓库中。谢谢大家的帮助:)
    • 您在上面有一个如何做到这一点的示例。只需适当更改字段和控件名称即可。
    • 谢谢这位朋友 :) 我错过了阅读您发布的链接,当我阅读后返回此页面后,我注意到您已经自己更改了参数 :)
    【解决方案2】:
    db.Execute "UPDATE Transaction SET Stock_Qty = Stock_Qty - " & Val(Me!Text25) _
    & " WHERE Stock_PartNo = '" & Me!Combo52 _
    & "' AND Stock_Location = '" & fromLocation & "'", dbFailOnError
    
    db.Execute "UPDATE Transaction SET Stock_Qty = Stock_Qty + " & Val(Me!Text25) _
    & " WHERE Stock_PartNo = '" & Me!Combo52 _
    & "' AND Stock_Location = '" & toLocation & "'", dbFailOnError
    

    示例代码参考链接here

    【讨论】:

    • 可以在 MS Access 中使用参数,这甚至是一个好主意。您忘记了 dbfailonerror。
    • @Remou:我想参数可以与 querydef 对象一起使用。为此,OP 必须创建一个 querydef。正确的?对于我错过的任何内容,请随时编辑答案。
    • 请注意,Val 经常很危险。
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2013-04-28
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多