На сегодняшний день это было неприятное путешествие, и я интуитивно понимаю, что решение очевидно, но я не вижу деревьев для леса.
У меня есть база данных MS Access, которая открывается в разделенную форму. Таблица данных находится внизу с верхней частью формы, содержащей кнопки для добавления или экспорта, и другие вещи. Чтобы добавить новую запись, пользователь нажмет кнопку и откроет пустую связанную подчиненную форму «новый студент».
Если пользователь щелкнет запись на стороне таблицы данных (action:DoCmd.OpenForm "New Student", , , "[ID]=" & Me.ID, , acDialog
), откроется та же форма, заполненная информацией из таблицы данных; используя идентификатор. Работает как чемпион.
запрос состоит в том, чтобы включить в эту подчиненную форму кнопку «новый студент», которая перейдет к следующей записи в «списке студентов». Должно быть легко. У меня есть код, который работает, за исключением случаев, когда есть пробел в списке столбца ID. Идентификационная запись «Первичный ключ» установлена на автоматическую нумерацию c. Если пользователь удаляет запись, что разрешено, в этом списке есть пробел.
Да, я попробовал кнопку «Создать», затем выбрал следующий или предыдущий трюк с записью, но это не сработало вообще, независимо от разрыва нумерации ID.
Как мне преодолеть разрыв в нумерации или есть лучший способ открыть «следующую запись». Код, который у меня есть, находится ниже. Я пробовал несколько итераций одного и того же процесса с ограниченным успехом.
Dim rs As dao.Recordset
On Error GoTo ErrorHandle
Set rs = Forms![Student Listing].Form.RecordsetClone
'MsgBox rs.RecordCount
rs.Bookmark = Me.Bookmark
If (Me.CurrentRecord < rs.RecordCount) And (Me.CurrentRecord <> 1) Then
DoCmd.GoToRecord , , acNext
ElseIf (Me.CurrentRecord < rs.RecordCount) And (Me.CurrentRecord = 1) Then
DoCmd.GoToRecord , , acGoTo, 1
Else
ErrorHandle:
MsgBox "At the first record, will re-start at the last record.", vbOKOnly, "First Record"
DoCmd.GoToRecord , , acLast
End If
Вариация темы:
Dim rs As dao.Recordset
On Error GoTo ErrorHandle
Set rs = Forms![Student Listing].Form.RecordsetClone
rs.Bookmark = Me.Bookmark
'MsgBox "Open Record: " & Me.CurrentRecord, vbOKOnly
If (Me.CurrentRecord < rs.RecordCount) And (Me.CurrentRecord <> rs.RecordCount) Then
rs.MoveNext
'DoCmd.GoToRecord , , acNext
ElseIf (Me.CurrentRecord = rs.RecordCount) Then
DoCmd.GoToRecord , , acGoTo, Me.CurrentRecord
Else
ErrorHandle:
MsgBox "At last record, will re-start at first record.", vbOKOnly, "Last Record"
DoCmd.GoToRecord , , acFirst
End If
Set rs = Nothing
'Ниже работает, но переходит к следующему доступному номеру' простого ключа ', если ему нужно пропустить идентификационный номер:
Dim val As Integer
On Error GoTo ErrorHandler
val = Me.ID.Value
val = val + 1
DoCmd.OpenForm "New Student", , , "[ID]=" & val, , acDialog
ErrorHandler:
Resume Next
val = 0
Приношу свои извинения, если моя запись немного многословна, я какое-то время работал над этой конкретной задачей.
Спасибо за любую помощь.