Ms access MS Access库存和自动增量值

Ms access MS Access库存和自动增量值,ms-access,inventory-management,Ms Access,Inventory Management,我对MS Access相当陌生,但我正在尝试建立一个用户友好的数据库来维护血液制品的库存 我需要追踪几个不同的信息点 喧闹 血型 产品类型 有效期 我已经想出了一个使用表单将产品添加到表中的系统,但现在它并不是非常适合我的需要 为了提高跟踪能力,我希望能够将新的库存项目分配给不同的机架和存储单元。我有15个不同的存储单元,我有上百个可以填充的机架 因此,我遇到的问题是,如何简化将我的单元增量分配到不同机架的过程。我有一个excel电子表格可以做到这一点,但它对最终用户不友好 因此,我想做的是让我

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

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

喧闹

血型

产品类型

有效期

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

为了提高跟踪能力,我希望能够将新的库存项目分配给不同的机架和存储单元。我有15个不同的存储单元,我有上百个可以填充的机架

因此,我遇到的问题是,如何简化将我的单元增量分配到不同机架的过程。我有一个excel电子表格可以做到这一点,但它对最终用户不友好

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

我已经知道如何从上一个表单中保留默认值,因此在填充机架时不需要重新键入机架或冷冻柜

我选择的格式是1-1,1-2,2-1,2-2等等,直到我到达位置8-2。每个机架可容纳16个单元。所以我想让插槽#自动增加到8-2,然后重置并清除rack#字段


如蒙协助,将不胜感激

每次读取时,只需将数字增加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
编辑:

如果尚未完成,请在表名中添加一个自动编号字段,例如,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
然后,在表单中,包含一个文本框,以使用此表达式作为控制源显示机架位置:

这就是要做的:

  • 表:将冷冻柜和机架的数据类型更改为数字、整数

  • 形式:调整三个文本框、冷冻柜、机架和位置,使其完全对齐

  • 模块:调整为如下所示:

  • 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
    
    -

  • 表单模块:调整如下:
  • -


    现在,当输入冷冻柜和机架时,位置会自动填写。

    我是在更新后还是更新前填写?因为我不确定它是否能正确阅读,这取决于你。不知何故,你必须知道扫描的次数或最后一个位置,这样代码就不会读取任何内容,只会根据你传递给它的值生成下一个位置。我希望我能将我的数据库发送给你,这样你就可以明白我的意思了。好吧,你不需要告诉太多关于你的表单的信息,但是编辑后的答案中的方法应该有效。我擦洗了它的潜在敏感信息,让你知道我打算如何使用它。
    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
    
    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