【问题标题】:Basic Inventory Setup with Access具有访问权限的基本库存设置
【发布时间】:2016-04-13 16:15:48
【问题描述】:

所以我是一个新手,需要帮助完成我的库存数据库。

目前我有以下表格和其中的字段: (表:字段,第一个字段为主键)

项目:项目编号、项目描述、项目规格重新订购级别、要重新订购的数量、现有数量

Materials_Used:ID(只是一个自动编号字段)、项目、项目#、金额

项目:项目

Purchase_Orders:PONum,收到日期

Receiving_Amount:ID(再次自动编号)、Item#、Amount、PONum

我在 2 个方面遇到问题:

  1. 将 PONum 与接收金额绑定:目前我有一个 Purchase_Orders 表单,要求用户输入 datePOnum 以及数据表表单中接收金额的子表单。事情是在我输入datePONum 之后,向下移动到输入我收到的项目并输入参数值框Purchase_Orders.ID 和Purchase_Orders.PONumber ------ 感谢Wayne,这个问题得到了解决!

  2. 一旦通过 PO 表单(添加)和使用的材料表单(减去)接收到项目,就会自动更新项目表的现有数量

Database Relationship

【问题讨论】:

  • 您上面的表格和字段定义不正确,或者您的参数值有错字。您显示表“Purchase_Orders”和一些字段,但在 Receiving_Amount 之后有一个冒号 (:)。 Purchase_Orders 中是否有一个名为“ID”的字段?至于更新,我建议点击按钮来强制运行一些 vba 代码来更新 QTY 和 Materials Used。
  • 上面的 Purchase_Orders 表不正确,我只是进行了编辑以反映它。 Purchase_Orders 没有名为 ID 的字段,只有 PONumReceived Date。对于更新,我正在考虑这一点,但不太确定如何为其编写代码,我知道它需要将该值传递到 Items 表下的正确行
  • 您的“问题 1”是由于主表单和子表单之间的链接或查询中的字段名称错误...没有“ID”字段...如果没有看到您的完整语法,也许您打算使用 PONum?至于“问题2”,您的子表单用于什么?用户是否输入订单中每个项目收到的数量?如果是这样,我可以提供一些 vba 代码来更新关联的表。
  • 我刚刚修复了我的第一个问题。我最终用不同的名称和新的表格重新创建了表格,你知道它的工作原理是什么……它使用正确的 PO 来跟踪项目。现在我只需要帮助更新手头的数量。
  • 是的,Wayne,你明白了我的想法,子表单在那里,因此用户可以输入在该特定 PO 下收到的项目。所以基本上一旦输入项目,我希望它添加到项目表下的qty on hand

标签: ms-access ms-access-2007 inventory-management


【解决方案1】:

由于您将在多用户更新环境中工作,因此您需要确保与其他用户没有冲突。最安全的方法是使用 TRANSACTION。

接下来,您需要决定如何以及何时对您的两个表进行更新。让我们使用“选项 1”,即用户在完成后单击的按钮。当他们单击按钮时,您需要调用以下子例程。如果用户对子表单进行了任何更改,但忘记单击“保存”按钮,您还应该跟踪。

那么我强烈建议您跟踪您所做的更改。例如,用户输入 qty of 5,保存更改。明天,查看数据,看到 5 并想将其更改为 6……这将破坏真实库存。一种防止方法是为订单行项目设置一个“标志”,表明它们已被处理并防止再次更新。

以下代码只是一个示例...我编写了我认为应该是输入和输出记录集的代码,但是您需要确保选择正确的输入行进行处理,然后选择输出行桌子。

查找其中带有## 的 cmets....修复代码以使用您的控件名称。

如果您需要更多解释,请告诉我。

Option Compare Database
Option Explicit

'   BeginTrans, CommitTrans, Rollback Methods Example
'   After the BeginTrans method starts a transaction that isolates all the changes made,
'   the CommitTrans method saves the changes.
'   Notice that you can use the Rollback method to undo changes that you saved using
'   the Update method. Furthermore, the main transaction is nested within another transaction
'   that automatically rolls back any changes made by the user during this example.

'   One or more table pages remain locked while the user decides whether or not to accept the changes.
'   For this reason, make sure you only execute the transaction on some event - don't allow a user
'   to be interactive, else he may go to lunch and may lock pages someone else needs!

'   Add to: Receiving_Amount: ID(again autonumber), Item#, Amount, PONum
'   Subtract from: Materials_Used: ID(just an Autonumber field), Project, Item#, Amount

Sub BeginTransX_Update_Inventory()
    On Error GoTo Error_trap

    Dim wrkDefault      As DAO.Workspace
    Dim dbs             As DAO.Database
    Dim tblInput        As DAO.recordSet
    Dim tblItems        As DAO.recordSet
    'Dim tblMaterials    As DAO.recordSet

    ' Get default Workspace.
    Set wrkDefault = DBEngine.Workspaces(0)
    Set dbs = CurrentDb

    ' ## Change the following line to use the name of the form control that has your PONum
    Set tblInput = dbs.OpenRecordset("select * from MaterialsRec where PONum = " & Me.txtPONum & ";")            '<<< This will be the source of your changes. Can use a query to filter exact rows.

    ' Start transaction.
    wrkDefault.BeginTrans

    Do While Not tblInput.EOF

        Set tblItems = dbs.OpenRecordset("select * from [Items] where [Item#] = " & tblInput![item] & ";")    ' <<< This will be where the updates are applied.

        ' Increase Qty on Hand
        tblItems.Edit
        tblItems![Qty on Hand] = tblItems![Qty on Hand] + tblInput!Amount
        tblItems.Update

        '## Add a text field named 'ProcStatus' to table MaterialsRec, or delete the following update ... your choice...
        tblInput.Edit
        tblInput!ProcStatus = "updated"
        tblInput.Update

        tblInput.MoveNext
    Loop

    ' You can remove the following code if desired...
    ' Ask if the user wants to commit to all the changes made above.
    If MsgBox("Save changes?", vbYesNo) = vbYes Then
        wrkDefault.CommitTrans
    Else
        wrkDefault.Rollback
    End If

    tblInput.Close
    tblItems.Close
    'tblMaterials.Close
    Set tblItems = Nothing
    'Set tblMaterials = Nothing
    Set dbs = Nothing
    Set wrkDefault = Nothing
    Exit Sub

Error_trap:
    wrkDefault.Rollback
    MsgBox "An error was encountered, but all changes were rolled back." & vbCrLf & _
            "Err: " & Err.Number & vbCrLf & _
            "Desc: " & Err.Description
End Sub

【讨论】:

  • 是的,我需要更多解释,看起来我必须创建 3 个查询,对吗?第一个选择导致更改的原因,但接下来的 2 个查询我无法确定它应该做什么
  • 请回答每个问题: (1) 我假设您的子表单绑定到 PO 的行项目记录集? (2) 用户可以更新一个或多个行项目的数量吗? (3) 您需要更新另外两个表来增加和减少数量吗? (4) 表 Projects 与您的 PO 有什么关系?我没有看到要匹配的键? (5) 您的表单具有以下键:PONum、ReceivedDate、Item# 和 AMT(数量?)。在我的示例中,“输入查询”将为您正在处理的采购订单选择行项目。在不知道如何从“使用的材料”中检索行的情况下,我被卡住了..
  • 1:是的,对于输入的每个编号的采购订单,可以有多个项目。因此,在 Purchased_order 表中,您可以看到与该 PO 关联的那些项目的所有项目数量
  • 2.是的,3. Receiving_Amounts 表将添加到 Items 表中的特定项目,Materials_used 将从同一个表中减去。 4. 项目表与采购订单无关,它的目的是生成一份关于特定项目使用了多少每种材料的查询的报告。 5. 对于 Materials_used,我使用 Item# 将其与 items 表相关联。我会开始和你聊天,这样我就可以给你发送一个我的 Access DB 的链接,但我排名低
  • 您对#1 的解释不正确。您的表“Purchase_Orders”没有订单项。您真的是说这些行项目在相关表“Receiving_Amount”中(这是唯一一个具有将链接回 PO 表的 PO # 的其他表)。然后对于#3,您想更新“Materials_Used”,但没有我能理解的关系。请解释一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 2015-01-24
  • 1970-01-01
  • 2019-05-05
相关资源
最近更新 更多