Как перейти к следующей записи в MS Access - PullRequest
0 голосов
/ 19 июля 2011

Я новичок в программировании MS Access 2007. Я хочу получать информацию из базы данных один за другим. Но код, который я использую, не выполняет этого.Если я на первой записи, то она напрямую переходит к последней записи, которую я не хочу.Я хочу перейти к следующей записи. Вот мой код:

Private Sub MoveNextBttn_Click()
    Dim db As Database
    Set db = CurrentDb
    Dim str As String
    str = "SELECT * FROM Table_Emp_Info"
    Dim rst As Recordset
    Set rst = db.OpenRecordset(str)
    Dim xxx As Integer
    xxx = 1

    'If the recordset is empty, exit.
    If rst.EOF Then
       Exit Sub
    End If

    Do Until rst.EOF
        Emp_ID_Text.Value = rst.Fields("EmpID")
        Rowsource_Designation.Value = rst.Fields("Designation")
        RowSource_Dept.Value = rst.Fields("Dept")
        DOJ_Text.Value = rst.Fields("Date_Of_Joining")
        rst.MoveNext
         'xxx = xxx + 1
    Loop

    rst.Close

End Sub

Ответы [ 5 ]

3 голосов
/ 19 июля 2011

Вам нужно использовать связанную форму вместо несвязанной формы.

Похоже, вы пытаетесь заново изобрести функциональность, встроенную в Access.Чтобы изменить форму с несвязанной формы на связанную форму, выполните следующие действия:

  1. Откройте форму в режиме конструктора.
  2. Нажмите клавишу F4, чтобы открыть лист свойств формы.
  3. Перейдите на вкладку «Данные».
  4. Введите SELECT * FROM Table_Emp_Info в свойстве RecordSource (вы также можете просто ввести Table_Emp_Info, чтобы связать форму непосредственно с базовой таблицей запроса).
  5. Нажмите на вкладку «Формат» и убедитесь, что для кнопок навигации установлено значение «Да» (по умолчанию).
  6. Избавьтесь от всего ненужного кода, который вы написали.

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

Для получения дополнительной информации ищите «ms access bound form».

1 голос
/ 19 июля 2011

Ваш код выглядит нормально, но вы записываете значения из Table_Emp_Info в одни и те же места на каждой итерации:

    Emp_ID_Text.Value = rst.Fields("EmpID")
    Rowsource_Designation.Value = rst.Fields("Designation")
    RowSource_Dept.Value = rst.Fields("Dept")
    DOJ_Text.Value = rst.Fields("Date_Of_Joining")
    rst.MoveNext

Это делает расположения, содержащие значения последней строки в концепетля.Было ли это вашим намерением, или вы хотели что-то другое?

Редактировать

Судя по вашему комментарию, вы хотите пройти через наборы Table_Emp_Info.В этом случае вы не хотите цикл - щелчок должен сделать rst.MoveNext и обновить поля, в которых отображаются данные.

Нечто подобное может сработать, но есть отказ от ответственности: я почти ничего не знаю о том, как работает модель Access.

private rst As Recordset

Private Sub Form_Open(Cancel As Integer)
    set rst = CurrentDb.OpenRecordset("SELECT * FROM Table_Emp_Info")
    call UpdateForm()
End Sub

private sub UpdateForm()
    if not rst.EOF
        Emp_ID_Text.Value = rst.Fields("EmpID")
        Rowsource_Designation.Value = rst.Fields("Designation")
        RowSource_Dept.Value = rst.Fields("Dept")
        DOJ_Text.Value = rst.Fields("Date_Of_Joining")
    end if
end sub

private sub MoveNextBttn_Click()
    if not rst.EOF then
        rst.MoveNext
        call UpdateForm()
    end if
end sub
0 голосов
/ 24 августа 2017

Попробуйте сделать это до цикла do:

rst.movelast

rst.movefirst
0 голосов
/ 21 июля 2011

Мне кажется, что вы должны использовать одну инструкцию SQL UPDATE для обновления, а не проходить через форму и набор записей и копировать данные запись за записью.

Однако выне дайте мне достаточно информации, чтобы предоставить пример SQL, поскольку у меня нет возможности узнать, как ваша форма назначения соотносится с вашими исходными данными.

Возможно, вы создаете новые записи и копируетеданные из набора записей, и в этом случае вы бы использовали оператор SQL INSERT вместо ОБНОВЛЕНИЯ, но здесь просто недостаточно информации для продолжения.

ASIDE:

ByКстати, в качестве защитного предложения, запрещающего выполнение цикла, когда набор записей ничего не возвращает, обычный метод в DAO - проверить, имеет ли свойство .Recordcount набора записей значение 0:

  'If the recordset is empty, skip the loop.
  If rst.RecordCount <> 0 Then
     Do Until rst.EOF
       Emp_ID_Text.Value = rst.Fields("EmpID")
       Rowsource_Designation.Value = rst.Fields("Designation")
       RowSource_Dept.Value = rst.Fields("Dept")
       DOJ_Text.Value = rst.Fields("Date_Of_Joining")
       rst.MoveNext
       'xxx = xxx + 1
     Loop
  End If
  rst.Close
  Set rst = Nothing ' you omitted this step

Вы действительно не хотитеEXIT, потому что вы не закрыли свой набор записей, если вы это сделаете.

0 голосов
/ 19 июля 2011
Do while not rst.EOF
        Emp_ID_Text.Value = rst.Fields("EmpID")
        Rowsource_Designation.Value = rst.Fields("Designation")
        RowSource_Dept.Value = rst.Fields("Dept")
        DOJ_Text.Value = rst.Fields("Date_Of_Joining")
        rst.MoveNext
         'xxx = xxx + 1
    Loop
...