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