【问题标题】:MS Access Inventory and Auto Increment ValuesMS Access 库存和自动增量值
【发布时间】:2018-08-15 06:26:22
【问题描述】:

我对 MS Access 还很陌生,但我正在尝试创建一个用户友好的数据库来维护血液制品的库存。

我需要跟踪几个不同的信息点。

DIN

血型

产品类型

有效期

我已经想出了一个使用表单将产品添加到表格的系统,但现在它并不是很适合我的需求。

为了提高跟踪能力,我希望能够将新的库存项目分配到不同的机架 #s 和存储单元。我有 15 个不同的存储单元,而且我可以装满数百个架子。

所以我遇到的问题是简化将我的单元逐步分配到不同机架的过程。我有一个执行此操作的 Excel 电子表格,但它对最终用户不友好。

所以我想做的是让我的表单接受来自产品的条形码扫描,其中包含我需要的所有信息,除了机架#和机架中的位置。我的想法是我希望能够使用表格将机架#放入,然后让表格在我扫描它们时自动增加机架中的插槽。

我已经知道如何从上一个表格中继承默认值,因此我不需要在装满机架时重新输入机架 # 或冷冻室 #。

我要采用的格式是 1-1、1-2、2-1、2-2 等等,直到我到达位置 8-2。每个机架可容纳 16 个单元。所以我希望插槽 # 自动递增到 8-2,然后重置并清除机架 # 字段。

任何帮助将不胜感激。

【问题讨论】:

    标签: ms-access inventory-management


    【解决方案1】:

    您可以简单地为每个读数增加一个数字。

    Dim n As Long
    Dim Position As String
    
    n = n + 1
    Position = (((n - 1) \ 2) Mod 8) + 1 & "-" & ((n - 1) Mod 2) + 1
    

    或者,不使用数字而是读取最后一个位置:

    n = Val(Split(LastPosition, "-")(0)) * 2 + Val(Split(LastPosition, "-")(1)) - 1
    Position = (((n - 1) \ 2) Mod 8) + 1 & "-" & ((n - 1) Mod 2) + 1
    

    编辑:

    如果您还没有这样做,请将 AutoNumber 字段添加到表名中,例如 Id

    创建一个这样的函数:

    Public Function RackPosition(ByVal Number As Long) As String
    
        Dim Index       As Long
        Dim Position    As String
    
        ' Avoid zero and negative numbers.
        Index = Abs(Number) + 1
    
        Position = (((Index - 1) \ 2) Mod 8) + 1 & "-" & ((Index - 1) Mod 2) + 1
    
        RackPosition = Position
    
    End Function
    

    然后,在您的表单中,包含一个文本框,以使用此表达式作为 ControlSource 来显示机架位置:

    =IIf(IsNull([Id]),Null,RackPosition(Nz([ID],0)))
    

    【讨论】:

    • 我把它放在更新后还是更新前?因为我不确定它是否能正确阅读。
    • 这取决于你。不知何故,您必须有扫描次数或最后一个位置,因此代码不会读取任何内容,只会根据您传递给它的值生成下一个位置。
    • 我希望我可以将我的数据库发送给您,以便您了解我的意思。
    • 好吧,您对表单的了解不多,但编辑后的答案中的方法应该有效。
    • drive.google.com/file/d/1PsglSJTEdEfjwz8P2s55ESR7l10pVr3B/… 我清理了它以寻找潜在的敏感信息,让您了解我打算如何使用它。
    【解决方案2】:

    这是怎么做的:

    1. 表格:将FreezerRack的数据类型改为Number, Integer

    2. Form:将三个文本框,Freezer、Rack 和 Position 调整为右对齐

    3. 模块:调整为如下所示:

    -

    Option Compare Database
    Option Explicit
    
    Public Function RackPosition(ByVal Number As Long) As String
        Dim Index       As Long
        Dim Position    As String
    
        ' Avoid zero and negative numbers.
        Index = Abs(Number) + 1
    
        Position = (((Index - 1) \ 2) Mod 8) + 1 & "-" & ((Index - 1) Mod 2) + 1
    
        RackPosition = Position
    
    End Function
    
    1. 表单模块:调整如下:

    -

    Private Sub SetPosition()
    
        Const Positions As Integer = 16
    
        Dim Number      As Integer
        Dim Criteria    As String
    
        If Nz(Me!Freezer.Value, 0) + Nz(Me!Rack.Value, 0) = 0 Then
            ' No rack data.
        ElseIf IsNull(Me!Position.Value) Then
            ' Calculate next available position.
            Criteria = "[Freezer] = " & Me!Freezer.Value & " And [Rack] = " & Me!Rack.Value & " And [Position] Is Not Null"
            Number = DCount("*", "Blood Inventory (Raw)", Criteria)
            If Number >= Positions Then
                MsgBox "This rack is full", vbInformation + vbOKOnly, "Position"
            Else
                Me!Position.Value = RackPosition(Number)
            End If
        End If
    
    End Sub
    
    Private Sub Freezer_AfterUpdate()
    
        SetPosition
    
    End Sub
    
    Private Sub Text42_AfterUpdate()
    
        SetPosition
    
    End Sub
    

    现在,当输入 Freezer and Rack 时,会自动填写 Position。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2013-03-05
      • 2010-12-07
      • 2011-05-09
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多