MS Access Query для поиска пробелов в последовательных числах, когда числа хранятся в поле Short Text - PullRequest
0 голосов
/ 13 июня 2018

У меня есть таблица (tblParts) с полем PartNumber (Short Text), в котором хранятся 6-значные номера деталей для деталей, принадлежащих нескольким семействам.Семейства обозначаются первыми 2 цифрами номера детали (00, 01, 02 и т. Д.).(ПРИМЕЧАНИЕ: я не создавал эту таблицу и не могу изменить ее в настоящее время)

Мне нужно найти пробелы в нумерации, чтобы заполнить неиспользуемые номера деталей.Если у меня есть проект, в котором требуется 6 последовательных номеров деталей в определенном семействе, я хочу найти первое неиспользуемое число в первом промежутке этого размера или больше в этом семействе.

Вот небольшое подмножестводанные.

PartNumber
020001
020002
020003
020004
020005
020006
020007
020009
020010
020011
020012
020013
020014
020019
020101

Если мне нужно одно число, запрос должен найти 020008. Если мне нужно 3 числа, он должен найти 0200015, а если мне нужно 10 чисел, он должен найти 020020.

МойЗнание SQL очень ограничено, но я пытаюсь учиться.Я понимаю, что было бы намного проще, если бы информация хранилась правильно, но я не могу ее контролировать.

1 Ответ

0 голосов
/ 13 июня 2018

Однажды я написал статью на эту тему:

Найти и сгенерировать пропущенные значения в таблице доступа

, но это заполнит любой пробел до появления всех новых чиселбыли созданы.Таким образом, этот код будет нуждаться в расширении с помощью внешнего цикла, чтобы постоянно сопоставлять числа.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...