Вопрос MS Access об открытии следующей записи в разделенной форме - PullRequest
0 голосов
/ 25 февраля 2020

На сегодняшний день это было неприятное путешествие, и я интуитивно понимаю, что решение очевидно, но я не вижу деревьев для леса.

У меня есть база данных 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

Приношу свои извинения, если моя запись немного многословна, я какое-то время работал над этой конкретной задачей.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Если форма открыта отфильтрована в одну запись, то нет ни предыдущей, ни следующей записи для перехода. Однако код может изменить критерии фильтрации, установив свойство Filter формы.

Параметры кода для NewStudent:

DoCmd.GoToRecord acDataForm, "StudentListing", acNext
Me.Filter = "ID=" & Forms!StudentListing.ID

Или

With Forms!StudentListing.RecordsetClone
.FindFirst "ID=" & Me.ID
.MoveNext
Me.Filter = "ID=" & !ID
End With

Не рекомендуется использовать пробелы в соглашение об именах.

0 голосов
/ 26 февраля 2020

Я нашел решение, которое работает для меня:

 Dim cBox As Control   
 Set cBox = Me.ActiveControl
 If cBox <> 0 Then
 With Me.RecordsetClone
 .FindFirst "ID =" & ctrl.Column(1) ' <-- the ID column from the query results
 If Not .NoMatch Then
 Me.Bookmark = .Bookmark
 End If
 End With

 End If 

CTRL начинается с нуля и представляет собой комбинированное окно с двумя столбцами. Источник комбинированного списка - это запрос, который содержит полное имя и связанный идентификатор.

Быстро и чисто.

Спасибо за поддержку!

...