MS Access Query在数字存储在短文本字段中时查找序号中的间隙

时间:2018-06-13 14:44:40

标签: sql ms-access

我有一个带有PartNumber字段(短文本)的表(tblParts),它存储属于多个系列的部件的6位数部件号。这些系列由部件号的前两位数字表示(00,01,02等)。 (注意:我没有创建此表,此时无法更改它)

我需要在编号中找到空白,以便填写未使用的部件号。如果我的项目开始需要特定系列中的6个连续部件号,我想在该系列的第一个间隙中找到第一个未使用的数字。

这是一小部分数据。

(0, 'a')
(1, 'b')
worker
worker
callback
callback

如果我需要一个号码,查询应该找到020008.如果我需要3个号码,它应该找到0200015,如果我需要10个号码,它应该找到020020。

我的SQL知识非常有限,但我正在努力学习。我意识到如果信息存储得当,这会更容易,但我无法控制它。

1 个答案:

答案 0 :(得分:0)

我曾写过一篇关于这个主题的文章:

Find and Generate Missing Values in an Access Table

但这将填补任何差距,直到所有新数字都建立起来。因此,该代码需要使用外部循环进行扩展,以确保始终并列数字。

Private Sub btnSearch_Click()

' Read table/query sequentially to 
' record all missing IDs.
' Fill a ListBox with missing values.
' A reference to Microsoft DAO must be 
' present.

  ' Define search table or query.
  Const cstrTable As String = "Orders"
  Const cstrField As String = "OrderID"

  Dim dbs As DAO.Database
  Dim rst As DAO.Recordset
  Dim lst As ListBox
  Dim col As Collection

  Dim strSQL As String
  Dim strList As String
  Dim lngLast As Long
  Dim lngNext As Long
  Dim lngMiss As Long

  strSQL = "Select " & cstrField & "" _
   & " From " & cstrTable & _
   & " Order By 1;"  

  Set lst = Me!lstMissing
  Set col = New Collection
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset(strSQL)

  If rst.RecordCount = 0 Then
    'The recordset is empty.
    'Nothing to do.
  Else
    lngLast = rst(cstrField).Value
    rst.MoveNext
    While rst.EOF = False
      lngNext = rst(cstrField).Value
      For lngMiss = lngLast + 1 To _
       lngNext - 1
        col.Add (lngMiss)
      Next
      lngLast = lngNext
      rst.MoveNext
    Wend
      'Generate next value in sequence.
      'Discard if collecting only 
      'missing values.
      col.Add (lngLast + 1)
  End If
  rst.Close

  'Populate list box from collection.
  For lngMiss = 1 To col.Count
    If Len(strList) > 0 Then 
      strList = strList & ";"
    End If
    strList = strList & col(lngMiss)
    Debug.Print col(lngMiss)
  Next
  lst.RowSource = strList
  Debug.Print strList

  Set rst = Nothing
  Set dbs = Nothing
  Set col = Nothing
  Set lst = Nothing

End Sub