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
相关产品推荐
相关产品推荐

