Как определить номер следующей записи (PK)? - PullRequest
0 голосов
/ 02 августа 2011

Я пытаюсь получить следующий номер в последовательности автонумерации для первичного ключа программно. Например, если последний номер в таблице был 10, мне нужно, чтобы он вернул 11. Раньше я использовал бы что-то вроде:

docmd.RunCommand acCmdRecordsGoToNew

, чтобы указать базе данных перейти к следующей записи, а затем я назначил бы ее элементу управления в форме, чтобы показать пользователю, какую запись он в данный момент вводит. Проблема в том, что эта функция перестала работать, когда я отключил кнопки навигации, установив для ее свойства значение «Нет» в окне свойств. Как получить следующую запись в vba без включенной навигационной панели?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Чтобы узнать реальное следующее значение, вам нужно найти значение SeedValue для вашего столбца Autonumber.Этот код делает это:

  Public Function GetSeedValue(strTable As String, strColumn As String) As Long
    Dim cnn As Object 'ADODB.Connection
    Dim cat As Object ' New ADOX.Catalog
    Dim col As Object ' ADOX.Column

    Set cnn = CurrentProject.Connection
    Set cat = CreateObject("ADOX.Catalog")
    cat.ActiveConnection = cnn

    Set col = cat.Tables(strTable).Columns(strColumn)
    GetSeedValue = col.Properties("Seed")

    Set col = Nothing
    Set cat = Nothing
    Set cnn = Nothing
  End Function

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

Обратите внимание, что в многопользовательской среде это может быть или не быть точным, поскольку к тому времени, когда вы его используете, он может быть обновлен другим пользователем.Однако у него нет проблемы с пропуском значений Autonumber, которые могут иметь Max () + 1.

Имейте в виду, однако, что если вы заботитесь о следующем значении Autonumber, это означает, что вы используетеЭТО НЕПРАВИЛЬНО.Значения автонумера являются суррогатными ключами, и вы никогда не должны заботиться о том, что это за значения.

0 голосов
/ 03 августа 2011

Оказывается, что есть функция VBA, которая будет взаимодействовать с базой данных и фактически возвращать значение.Вот что я в итоге сделал, чтобы получить следующий номер записи:

Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table") + 1

Неаккуратный, но эффективный для ситуации с одним клиентом.Также можно применить предложение where:

Dim nextRecord As Integer
nextRecord = DMax("ID", "my_table", "field =  value")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...