You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Access数据库:下拉选单关联库存比对与更新需求

MS Access 维修工单物料库存比对与更新实现方案

以下是针对你需求的具体实现步骤和VBA代码示例,直接适配Access表单逻辑:

一、物料选择后库存检查与扣减(下拉选单AfterUpdate事件)

假设你的下拉选单名为cboItemID,维修物料表名为维修物料表,库存字段为OnHandQuantity,工单表存储选中物料ID的字段为ItemID,工单状态字段为Status。

在表单的VBA编辑器中,添加下拉选单的AfterUpdate事件代码:

Private Sub cboItemID_AfterUpdate()
    Dim strItemID As String
    Dim intOnHand As Integer
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Set db = CurrentDb
    ' 获取选中的物料ID(如果是数字类型,去掉单引号)
    strItemID = Me.cboItemID.Value
    
    ' 用Recordset读取库存,避免DLookup的并发问题
    Set rs = db.OpenRecordset("SELECT OnHandQuantity FROM 维修物料表 WHERE ItemID = '" & strItemID & "'", dbOpenDynaset)
    
    If Not rs.EOF Then
        intOnHand = Nz(rs!OnHandQuantity, 0)
        If intOnHand > 0 Then
            ' 开启事务,确保数据一致性
            db.BeginTrans
            On Error GoTo Rollback
            
            ' 变更工单状态(替换为你已有的状态变更逻辑)
            Me.Status = "已领用物料"
            ' 更新库存数量减1
            rs.Edit
            rs!OnHandQuantity = rs!OnHandQuantity - 1
            rs.Update
            
            ' 提交事务,确认变更
            db.CommitTrans
            MsgBox "物料领用成功,库存已更新", vbInformation
        Else
            MsgBox "该物料库存不足,无法领用!", vbExclamation
            Me.cboItemID.Value = Null
        End If
    Else
        MsgBox "未找到对应物料记录", vbCritical
        Me.cboItemID.Value = Null
    End If
    
    ' 清理对象
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    Exit Sub
    
Rollback:
    ' 出错时回滚所有变更
    db.Rollback
    MsgBox "操作失败:" & Err.Description, vbCritical
    Me.cboItemID.Value = Null
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

二、未审批时库存回滚(状态变更事件)

当工单状态变为“未审批”时,需要将之前领用的物料库存加回。假设状态选择控件名为cboStatus,添加其AfterUpdate事件代码:

Private Sub cboStatus_AfterUpdate()
    Dim strItemID As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    If Me.Status = "未审批" Then
        Set db = CurrentDb
        strItemID = Me.ItemID.Value ' 读取工单关联的物料ID
        
        Set rs = db.OpenRecordset("SELECT OnHandQuantity FROM 维修物料表 WHERE ItemID = '" & strItemID & "'", dbOpenDynaset)
        If Not rs.EOF Then
            db.BeginTrans
            On Error GoTo Rollback
            
            rs.Edit
            rs!OnHandQuantity = rs!OnHandQuantity + 1
            rs.Update
            
            db.CommitTrans
            MsgBox "已回滚该物料库存", vbInformation
        Else
            MsgBox "未找到对应物料记录", vbCritical
        End If
        
        rs.Close
        Set rs = Nothing
        Set db = Nothing
    End If
    Exit Sub
    
Rollback:
    db.Rollback
    MsgBox "库存回滚失败:" & Err.Description, vbCritical
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

关键注意事项

  • 数据类型适配:如果你的ItemID是数字类型,删除代码中ItemID = '" & strItemID & "'的单引号,改为ItemID = " & strItemID。
  • 事务处理:代码中加入事务是为了避免中途出错导致库存和工单状态不一致,必须保留。
  • 字段/表名替换:根据你数据库的实际表名、字段名修改代码中的对应内容。
  • Nz函数:用于处理库存为Null的情况,避免运行时错误。

内容的提问来源于stack exchange,提问作者Andrew Bracken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:22:19