使用VBA分配自动编号以查询结果

时间:2014-05-22 15:06:32

标签: sql database vba access-vba ms-access-2010

我有一个Access数据库文件,我用它来处理CAD包中的物料清单输出。我不是完全使用它作为关系数据库,更像是一些数据的中间处理步骤,以便输出一些条形码来识别我们工作室中的部分,然后链接回一些CNC加工代码文件,我将根据每个零件的PARAMETERS生成。

基本上,我所处的阶段是我有一个表格,其中包含如下数据:

REF     NB     JOB_ID     PART_ID    DESIGNATION     PARAMETERS
A       4      00001                 RAFTER          L=500 W=56
B       6      00001                 RAFTER          L=700 W=56 P=25
B       2      00001                 DOOR JAMB       FH=2090 W=66 OD=0
A       2      00123                 SASH STILE      SH=500 SSW=56 HANG=3
A       2      00123                 SASH RAIL       SH=500 SRD=66 HANG=3

对于几个不同的JOB_ID值,可以有数百个部分,可以选择不同的参数。

我之后在访问中保存了一个查询,其中包含以上所有字段和排序:JOB_ID,然后是DESIGNATION,然后是REF。我当时需要做的是查看查询并为每条记录分配PART_ID,以便JOB_IDPART_ID的组合是唯一的。因此,对于上面的示例,我可能最终得到(在排序和分配PART_ID之后):

REF     NB     JOB_ID     PART_ID    DESIGNATION     PARAMETERS
B       2      00001      00001      DOOR JAMB       FH=2090 W=66 OD=0
A       4      00001      00002      RAFTER          L=500 W=56
B       6      00001      00003      RAFTER          L=700 W=56 P=25
A       2      00123      00001      SASH RAIL       SH=500 SRD=66 HANG=3
A       2      00123      00002      SASH STILE      SH=500 SSW=56 HANG=3

我需要帮助以解决这个问题的最佳方法。大概我需要用查询打开一个记录集,遍历记录并分配一个递增的PART_ID。

具体来说,我该怎么做:

使用查询打开记录集?我知道如何用桌子做这件事。 以最有效的方式遍历该记录集? 将更新保存到基础表?

我也愿意接受有关更好方法的建议。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您必须了解的一件事是,除非在创建表时明确排序,否则Access中的表数据不会被排序。通常,您在屏幕上看到的表格排序是一个谎言。

  • 使用所有表格数据创建新查询,按JOB_ID升序排序 并保存查询。

  • 创建第二个查询并使用第一个查询作为源数据。 我们将第一个查询视为现在是一个表。访问是 好的,这个。继续并将所有表列放入 现在。

  • 在现有JOB_ID字段旁边创建一个新列。这样做 将一些随机字段从向下拖动到JOB_ID旁边的网格。

  • 输入该字段名称: TEST_PART_ID:RunningCount([JOB_ID])

  • 打开VBE编辑器(Alt-F11)并在新的中输入以下代码 模块。

代码:

Function RunningCount(WhatToCount As String) As Integer  

Static CountSoFar As Long, var  As String  

If var <> WhatToCount Then  
    CountSoFar = 0  
    var = WhatToCount 
End If  

CountSoFar = CountSoFar + 1  
RunningCount = CountSoFar  

End Function
  • 保存模块,然后返回查询并预览查询 结果。如果结果正是您所期待的,请放弃这一点 查询作为成功的测试,并使用这两个查询+ VBA解决方案 在原始表上进行更新查询。更新现有的 PART_ID栏。

答案 1 :(得分:0)

@tbur非常感谢,你的回答非常有效。

然而,我做了以下改变:

Function RunningCount(WhatToCount As String, NumDigits As Integer) As String

Static CountSoFar As Long, var As String

If var <> WhatToCount Then
    CountSoFar = 0
    var = WhatToCount
End If

CountSoFar = CountSoFar + 1
RunningCount = Left("00000000000000000000", NumDigits - Len(CStr(CountSoFar))) & CountSoFar

End Function

这给了我输出,包括前导零,因为我需要它们(我想将每个ID保持为5位以帮助稍后的条形码处理,但我添加了一个变量来选择输出应该有多少位数)。