如何使用字母序列更新 MS Access 表,具体取决于其他记录字段显示的实例数

How to update MS Access table with a letter sequence dependent on the number of instances other record fields appear

提问人:MKB2013 提问时间:11/16/2023 最后编辑:June7MKB2013 更新时间:11/16/2023 访问量:23

问:

我正在MS Access中开发一个工具数据库,工具编号约定是一些区号,后跟装配字母(在表中写为装配编号)。区号和组装字母的组合为每条记录创建密钥。从本质上讲,我想要发生的是,每次重复一个区号时,都会将另一个字母永久分配给装配字母字段。例如,如果我有一个区号“7474”,并且它是表中 7474 的第一个实例,则会为其分配字母“A”,组合键为“7474 A”。如果我输入“7474”的第二个实例,则“B”将填充第二个记录的汇编字母字段。如果我随后输入新的区号“6852”,则“A”应填充其组装字母字段。我一次只添加一条记录,因此我使用占位符“-”来指示这是需要更新的记录。我目前正在运行一个更新查询,只要记录中有一个区号,它就会起作用,只要我添加另一个区号,我就会出现关键违规。出于同样的原因,我无法手动添加“A”,尽管组合是唯一的。它的作用就好像组装字母是记录的主键一样。

当我运行下面的代码时,它将正确计算每个区号的实例,并为每个区号输出生成的下一个可用字母。如果生成的字母已经出现在其他地方,它就不会将结果分配给区号。

这是我使用的 SQL 代码:

UPDATE [Tool Table] 
SET [Tool Table].[ASSEMBLY NUMBER] = CalculateAssemblyNumber([AREA CODE])
WHERE ((([Tool Table].[ASSEMBLY NUMBER]) Is Null Or ([Tool Table].[ASSEMBLY NUMBER])='-'));

这是我使用的VBA代码:

Function CalculateAssemblyNumber(AreaCode As Variant) As String
   Dim countMatch As Integer

    Debug.Print "AreaCode: " & AreaCode

    countMatch = DCount("*", "[Tool Table]", "[AREA CODE] = '" & AreaCode & "'")

    Debug.Print "CountMatch: " & countMatch

    CalculateAssemblyNumber = Chr(64 + countMatch)

    Debug.Print "Result: " & CalculateAssemblyNumber
End Function
SQL VBA 数据库 MS-Access

评论

0赞 June7 11/16/2023
因此,您希望将每个区域限制为 26 条连续记录?如果表不允许通过手动输入来复制字母,您期望任何代码如何实现这一点?不允许重复字母的表格设计是什么?你是如何定义主键的?您是否将面积和字母字段设置为复合索引?

答:

0赞 Zen 11/22/2023 #1

我猜你的问题是程序集字段被设置为唯一。当您从两个字段构建记录键时,没有一个字段必须是唯一的,只有键本身。检查这一点,您的问题应该得到解决。 另一个问题是如何处理您已经拥有组装字母“Z”的情况。那你会怎么做?