【问题标题】:MS Access - How to generate autonumber with sub-autonumberMS Access - 如何使用子自动编号生成自动编号
【发布时间】:2016-10-31 20:42:51
【问题描述】:

我是 MS Access 的新手。目前我需要创建一个序列号,一个带有子自动编号的自动编号对。像 M1-1,M1-2,M1-3,... M2-1,M2-2,M2-3,... M3-1,M3-2,... 数字必须是唯一的。 我为 M1、M2、M3 的主要运行编号创建了一个表,... 创建一个索引以使其唯一。然后是子编号的另一个表,1,2,3,4,... 之后是 MainNum 外键(关系)和另一个索引以使其唯一。 但问题是第二张表我想不出办法让它成为自动编号/运行编号,因为它可能会重复自己。

目前不知道,需要一些帮助。

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    我建议不要将序列号用作表中的主键/外键。为此使用数字字段:主要的自动编号和外国的数字。它的工作速度更快、更自动。

    为了生成序列号,创建公共函数,它可以根据参数返回下一个值或可选的当前值。序列号第一部分和第二部分的当前值存储在表中,生成新编号时将其锁定,即使在多用户环境下也能保证下一个编号唯一。您也可以将所有生成的数字存储在表中,并在两个数字上使用复合唯一索引。

    【讨论】:

    • 所以第一个表我有一个主要的自动编号和一个外国号码。那么第二张表我如何使用公共功能生成序列号?当您提到“锁定它”时,究竟如何锁定数字?
    【解决方案2】:

    将您的 PK 设为自动编号,并将其用于任何关系。对于您的序列号,请使用两个长整数字段(SN1、SN2)。在表单的 before_update 事件中,对于新记录,调用公共函数以生成新的“序列号”。

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim lngSN1 AS Long
    Dim lngSN2 as Long
    If Me.NewRecord Then
    'if SN1 is not to be incremented, set it here to whatever you want
    If GetSerials(SN1, SN2) Then
    Me!SN1 = lngSN1
    Me!SN2 = lngSN2
    Else
    Cancel = True
    End If
    End If
    End Sub
    
    Public Function GetSerials(ByRef SN1 as Long, ByRef SN2 as Long) AS Boolean
    If SN1 = 0 Then
    SN1 = Nz(DMax("SN1","<yourTable>"), 0) + 1
    SN2 = 1
    Else 
    SN2 = DMax("SN2", "<yourtable>","SN1=" & SN1) + 1
    End IF
    GetSerials = True
    End Function
    

    使用计算字段构建查询以创建复合“序列号”。

    SELECT *, "M" & SN1 & "-" & SN2 as SerialNumber FROM <yourtable>
    

    在要显示序列号的任何地方使用该查询。

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 2018-11-25
      • 1970-01-01
      • 2017-09-22
      • 2015-03-13
      • 1970-01-01
      相关资源
      最近更新 更多