【问题标题】:Microsoft access auto generate student id based on first and last name + a numberMicrosoft access 根据名字和姓氏+数字自动生成学生ID
【发布时间】:2016-12-28 22:17:44
【问题描述】:

我有一个带有学生表的 Access 数据库。表中的前三个字段是 studentID、ForeName 和 LastName。

该表已包含大约 35 条学生记录。学生证的格式为 AA0000。前两个字符由姓氏和名字的第一个字母组成。 0000 是一个 4 位数字。

我创建了一个表格,用于将数据输入到学生表中。我希望根据以下规则自动生成学生证

  • 前两个字符分别是姓氏和名字的第一个字母
  • 4 位数字比已使用的最大 4 位数字大 1

所以比如我表中只有学生证的AA1256、BC1267和OK1288,那么我添加的下一条记录的编号应该是1289。

是否可以仅通过更改我创建的表单上的 sutdentID 文本框的控制源来实现。

我已经尝试将以下代码放在 studentID 的控制源中(虽然不起作用) =Left(LastName,1) & left(forename,1) & (max(right(studentID,4))+1)

感谢任何帮助。 谢谢

【问题讨论】:

  • 我认为这种尝试很接近,但仅指当前记录中的 studentID - 您需要一种方法来获取完整表中的最大 studentID。一种简单的方法可能是准备一个查询以自行获取该值,然后在您的表单中使用该新查询。
  • 实际上这就是我刚刚尝试过的,但即使这样也会给我一个错误。
  • 什么中断?新查询是否返回正确的结果?如果是这样,您可以发布使用它的新代码吗?如果没有,那么您需要首先对该查询进行故障排除。
  • 实际上这就是我刚刚尝试过的,但即使这样也给了我一个错误。我有一个查询给我 maxNum+1 我尝试放入控制源的内容现在类似于 Left(LastName,1) & left(forename,1) & CurMaxNum!Expr1 但这给了我一个 #Name 错误: (
  • 查询中的代码是SELECT Max(Right([StudentID],4))+1 AS Expr1 FROM Student;

标签: ms-access


【解决方案1】:

我认为原因是因为您的公式在字段名称周围没有方括号。

试试:

Left([LastName],1) & left([forename],1) & (max(right([studentID],4))+1)

【讨论】:

    【解决方案2】:

    控制源需要保持 studentid 并且应该被禁用或锁定。我会将表单的“Before Insert”属性设置为“[Event Procedure]”,并在自动创建的 Form_BeforeInsert 子程序中输入以下 VBA 代码:

    studentid=left(LastName,1) & left(ForeName,1) & _
        Right("0000" & CStr(CInt(Nz(DMax("right(studentid,4)","Student"),0))+1),4)
    

    我看到一个问题,如果学生姓名发生更改(如在添加后立即更正),则 ID 需要更改。如果它是主键,您需要使用新键删除并重新添加记录。如果没有,您可以使用类似代码在“插入前”事件处理程序中更新 studentid。我也会注意学生姓名中的空值。

    【讨论】:

    • 嗨,谢谢。这种作品。我想我会将代码放在命令按钮“生成学生 ID”下。我需要查看 DMax 和 Nz 之类的东西,这些不是我以前用过的东西。有没有办法在 VBA 中引用查询。因为我有一个名为 CurMaxNum 的查询,其中包含我要使用的下一个数字!非常感谢您的帮助。
    • DMax 函数将给出最大值,而无需创建单独的查询。如果 Student 中没有记录,Nz 函数(Null 到零)只是防止代码行失败。它的其余部分负责将最后一个数字从字符串转换为整数,将其递增,然后将其转换回零填充数字字符串。
    【解决方案3】:

    可能是“添加”一个字符串和数字 1 不起作用。

    所以尝试在数值上使用 Max,加 1,并格式化为四位数:

    =Left(LastName,1) & Left(ForeName,1) & Format(Max(Val(Right(studentID,4)))+1,"0000")
    

    【讨论】:

    • 您好,感谢您的评论,但这不太奏效。就像下面提到的Kevin一样,控制源需要保留StudentID,以便将值存储在表中。他的建议奏效了。非常感谢您的帮助。
    【解决方案4】:

    实际上我认为这里真正的答案是不要打扰,只需计算 ID 并将其显示在您需要的任何地方。毕竟你知道所涉及的所有价值观。

    将其他所有内容都引用回唯一的 PK,即数字 StudentID。这样,如果有人更改姓名、结婚等,唯一 ID 并没有改变您所显示的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2023-03-08
      • 2019-09-08
      • 2023-04-03
      相关资源
      最近更新 更多