如何在MS Access中基于年份、年日数生成患者就诊自动序列号
MS Access诊所就诊自动序列号生成方案
一、明确序列号规则
你需要的8位序列号格式:两位年份+三位年日数+三位当日就诊序号,比如2023年1月31日第12位患者是23031012,拆解细节:
- 两位年份:取就诊年份后两位(2023→23)
- 三位年日数:若按自然年计算则取当日在当年的天数(1月31日是第31天→031);若按自定义起始日(比如诊所财年)计算,则用你原公式算出天数后补前导零
- 三位当日就诊序号:当天已录入的患者数+1,补前导零(第12位→012)
二、YearStartDate的优化输入方式
不要直接在表或查询中写固定值,建议做全局设置表方便修改:
- 创建表
Setting_T,仅需一个字段:YearStartDate(日期/时间类型) - 往表里录入一条记录,比如填
01-Jan-2023(自然年起始)或你需要的自定义起始日 - 创建表单
frm_Setting,绑定Setting_T表,只放一个日期控件绑定YearStartDate,后续修改起始日直接打开这个表单操作即可
三、自动生成VisitNumber的两种实用方法(无需复杂编码)
方法1:更新查询批量补录(适合已有记录或手动触发)
- 新建查询,选择
VisitList_T表 - 切换到「更新查询」模式
- 选中
VisitNumber字段,在「更新到」行输入以下公式:
若按自然年算年日数,直接替换为:Format([VisitDate],"yy") & Format([VisitDate]-DLookup("YearStartDate","Setting_T")+1,"000") & Format(DCount("*","VisitList_T","VisitDate = #" & [VisitDate] & "#"),"000")Format([VisitDate],"yy") & Format(Format([VisitDate],"y"),"000") & Format(DCount("*","VisitList_T","VisitDate = #" & [VisitDate] & "#"),"000") - 运行查询,所有记录的
VisitNumber会自动填充
方法2:表单自动填充(新增记录时自动生成,推荐)
假设你用表单frm_VisitList录入患者信息:
- 打开表单的设计视图
- 右键表单空白处→「属性」→切换到「事件」选项卡
- 找到「Before Insert」事件,点击右侧的
...按钮,选择「代码生成器」 - 在弹出的VBA编辑器里,粘贴以下代码(直接复制使用,无需修改):
Private Sub Form_BeforeInsert(Cancel As Integer) ' 获取自定义起始日 Dim startDate As Date startDate = DLookup("YearStartDate", "Setting_T") ' 计算年日数(补零到3位) Dim dayCount As String dayCount = Format(Me.VisitDate - startDate + 1, "000") ' 如果按自然年算,替换成下面这行: ' dayCount = Format(Format(Me.VisitDate, "y"), "000") ' 计算当日就诊序号(补零到3位) Dim dailySeq As String dailySeq = Format(DCount("*", "VisitList_T", "VisitDate = #" & Me.VisitDate & "#") + 1, "000") ' 组合生成最终序列号 Me.VisitNumber = Format(Me.VisitDate, "yy") & dayCount & dailySeq End Sub - 保存代码,关闭编辑器,回到表单视图。以后新增患者记录时,
VisitNumber会自动生成
四、注意事项
- 为避免多人同时录入导致序号重复,可在
VisitList_T表的VisitNumber字段设置唯一索引:打开表设计视图,选中VisitNumber→右键→「索引」→设置「唯一」为是 - 测试时先录入几条记录,核对序列号是否符合预期,比如按自然年计算的话,2023年1月31日第12位患者应生成
23031012
内容的提问来源于stack exchange,提问作者Nouman
相关产品推荐
相关产品推荐

