增量ID#MS Access VBA

时间:2013-10-07 20:00:19

标签: date count access-vba ms-access-2010 ms-access-2013

我需要能够创建一个唯一的ID#,它使用在文本框中选择的日期。当有一个月/年的记录时,我需要它来计算该月份和年份的记录数量,并创建一个增加1的ID。因此,如果2013年10月有4个案例,我需要按照以下方式创建ID:

  • CEF-1013-1
  • CEF-1013-2
  • CEF-1013-3
  • CEF-1013-4

如果有以下代码:

Private Sub Text0_AfterUpdate()
    'Creates a custom case number based on date and how many have been entered in that month/year
    Dim caseNum As String
    Dim caseCount As Integer
    caseNum = Format(Forms!frmEnterCase!Text0, "mmyy")
    caseCount = DCount("CaseID", "case", Format(Table!Case!CaseID, "mmyy") = caseNum)
    caseNum = "CEF-" & caseNum & "-" & (caseCount + 1)
    Forms!frmEnterCase!Text31 = caseNum

End Sub

2 个答案:

答案 0 :(得分:2)

你应该可以这样做:

Private Sub Text0_AfterUpdate()
    Forms!frmEnterCase!Text31 = GetNextCaseNum()
End Sub

Public Function GetNextCaseNum() As String
    Dim rs as DAO.Recordset, sSQL as String
    sSQL = "SELECT TOP 1 CaseID FROM case WHERE CaseID LIKE 'CEF-" & Format(Date, "mmyy") & "-*' ORDER BY CaseID DESC"
    Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenSnapshot)
    If Not (rs.EOF and rs.BOF) Then
        GetNextCaseNum = "CEF-" & Format(Date, "mmyy") & Format(Cstr(Clng(Right(rs("CaseID"), 2))+1), "00")
    Else
        GetNextCaseNum = "CEF-" & Format(Date, "mmyy") & "-01"
    End If
    rs.close
    Set rs = Nothing
End Function

请注意,我没有测试代码。它可能需要一些调整/调试。基本概念仍然存在。

最好在这样的场景中创建用于获取/创建ID的函数。

另外,我可能会提到我通常会将一个无意义的自动编号字段指定为这样的表的主键,然后可能仍然使用类似于您在此处所做的有意义的CaseCode字段。数字主键表现更好。虽然您确实看到了很多,但使用有意义的主键字段通常被认为是一种糟糕的设计习惯。

答案 1 :(得分:1)

对于它的价值,我建议你将你得到的序列号保存在一个单独的数字字段中,如下所示:

CasePK  CaseDate    CaseMonthSeq
------  ----------  ------------
   101  2013-10-01             1

通过这种方式,您可以简化流程以获取新的序列号,并且可以轻松地从其组成部分构建“CaseID”字符串。 (也就是说,将字符串粘合在一起比将它们分开更容易。)

以下测试代码说明了在将记录插入表格时如何派生序列号。因为派生是在INSERT语句中完成的,所以应该在隐式事务中完成,因此适用于多用户环境

Sub CaseSeqTest()
Dim cdb As DAO.Database, SQL As String
Dim dtCaseDate As Date
dtCaseDate = DateSerial(2013, 10, 3)  ' sample date for testing
Set cdb = CurrentDb
SQL = _
        "INSERT INTO Cases (" & _
                "CaseDate, " & _
                "CaseMonthSeq " & _
            ") VALUES (" & _
                "#" & Format(dtCaseDate, "yyyy-mm-dd") & "#, " & _
                "Nz(DMax(""CaseMonthSeq"", ""Cases"", ""Format(CaseDate, """"yymm"""") = """"" & Format(dtCaseDate, "yymm") & """""""), 0) + 1 " & _
            ")"
Debug.Print SQL
cdb.Execute SQL, dbFailOnError
Set cdb = Nothing
End Sub

Debug.Print语句只打印要执行的SQL命令,在本例中为...

INSERT INTO Cases (CaseDate, CaseMonthSeq ) VALUES (#2013-10-03#, Nz(DMax("CaseMonthSeq", "Cases", "Format(CaseDate, ""yymm"") = ""1310"""), 0) + 1 )

...并将记录插入表中,如下所示:

CasePK  CaseDate    CaseMonthSeq
------  ----------  ------------
   101  2013-10-01             1
   102  2013-10-03             2

如果您想显示CaseID,那么您可以随时“动态”将它拼凑在一起,就像这样......

SELECT
    CasePK,
    CaseDate,
    "CEF-" & Format(CaseDate, "yymm") & "-" & CaseMonthSeq AS CaseID
FROM Cases

...返回

CasePK  CaseDate    CaseID    
------  ----------  ----------
   101  2013-10-01  CEF-1310-1
   102  2013-10-03  CEF-1310-2

...或者,由于您使用的是Access 2010(或更高版本),您可以使用表达式

更改[Cases]表以将[CaseID]创建为计算字段
"CEF-" & Right(Year([CaseDate]),2) & IIf(Month([CaseDate])>9,"","0") & Month([CaseDate]) & "-" & [CaseMonthSeq]

所以你可以直接检索[CaseID],并且每次你想在查询或报告中使用它时都不必重新创建逻辑来组装CaseID。