如何在Access查询中为BOM物料的关联部件生成分组重置的ItemNo编号
Access BOM清单生成分组序号(ItemNo)操作指南
新手优先方案:子查询法(无需写VBA)
这个方法不用额外创建表或者写代码,直接修改现有查询的SQL语句即可:
- 打开你已经做好的包含
Material和BOMPart字段的BOM查询 - 点击查询窗口右下角的SQL视图按钮,切换到SQL编辑模式
- 把原有SQL语句替换为以下内容,注意把语句里的
你的现有BOM查询名替换成你自己实际保存的查询名称:
SELECT t1.Material, t1.BOMPart, ( SELECT COUNT(*) FROM 你的现有BOM查询名 AS t2 WHERE t2.Material = t1.Material AND t2.BOMPart <= t1.BOMPart ) AS ItemNo FROM 你的现有BOM查询名 AS t1 ORDER BY t1.Material, t1.BOMPart;
- 切换回数据表视图,就能看到自动生成的ItemNo列,切换物料时序号会自动从1开始计数。
规则调整说明
如果你的部件不需要按BOMPart的字母/数字顺序排序,只要修改子查询里的t2.BOMPart <= t1.BOMPart条件,换成你要排序的对应字段比较规则即可。
大数据量备选方案:VBA法(运行速度更快)
如果你的BOM数据超过1万行,子查询运行速度会变慢,可以用临时表加VBA的方式实现:
- 先把现有BOM查询的结果生成一张临时表,额外添加一个数字类型的
ItemNo字段 - 按下
Alt+F11打开VBA编辑器,插入一个新模块,粘贴以下代码,替换掉里面的你的临时表名后运行即可:
Sub 生成BOM序号() Dim rs As Recordset Dim 当前物料号 As Long, 序号 As Integer Set rs = CurrentDb.OpenRecordset("SELECT * FROM 你的临时表名 ORDER BY Material, BOMPart") 当前物料号 = -1 序号 = 0 Do While Not rs.EOF If rs!Material <> 当前物料号 Then 当前物料号 = rs!Material 序号 = 1 Else 序号 = 序号 + 1 End If rs.Edit rs!ItemNo = 序号 rs.Update rs.MoveNext Loop rs.Close Set rs = Nothing End Sub
内容的提问来源于stack exchange,提问作者CJJones
相关产品推荐
相关产品推荐

