2010-03-11 3 views
2

Это должно быть легко. Эта форма фильтруется с помощью [Dismissed] = "N". Когда пользователь нажимает кнопку «Отклонить», поле [Уволено] меняется на «Y». После запроса, форма должна вернуться в ту же строку, где ранее был пользователь.В форме доступа, как вернуться к предыдущей записи после запроса

Private Sub DismissButton_Click() 
    Me!Dismissed = "Y" 
    MsgBox "Dismissed!", vbOKOnly 
    Dim GoBackToThisRecord As Integer 
    GobacktothisRecord = Me.CurrentRecord 
    Me.Requery 
    Set Me.CurrentRecord=GoBackToThisRecord 
End Sub 

Однако, несмотря на то, что встроенные в файлы справки говорят, что CurrentRecord для чтения/записи свойство, я получаю «Invalid использование собственности» сообщение об ошибке на этой последней строке.

После установки [Dismiss] = "Y" и запроса формы, как мне вернуть пользователя в его/ее предыдущее место в форме?

+0

Я не понимаю, как это может если форма отфильтрована до значения, которое отредактированная запись больше не совпадает. Я бы никогда не сделал этого таким образом, так как количество записей могло измениться с требованием, и позиция в наборе записей могла измениться. Вы действительно должны использовать ПК. –

+1

Хотя это вряд ли будет проблемой, я бы рекомендовал Dimming GoBackToThisRecord как длинный. –

ответ

2

Я не понимаю, как ваше решение не может работать, если форма фильтруется до значения, отредактированные записи больше не соответствует - если вы фильтруется на [Уволен] = «N», а затем изменение поля «Отклонено» текущей записи на «Y» должно заставить запрашиваемую форму исключать только что обновленную запись.

В стороне, я бы никогда не сделал это так, как вы это сделали, поскольку Me.CurrentRecord возвращает число, представляющее позицию в записи. Поскольку запрос может привести к изменению количества записей (например, кто-то еще редактирует или добавляет или удаляет запись, в результате чего она будет включена/исключена из набора записей формы), и позиция искомой записи изменится, я буду использовать вместо ПК.

Dim lngPK as Long 

    lngPK = Me!MyPKID 
    Me.Requery 
    With Me.RecordsetClone 
    .FindFirst "[MyPKID]=" & lngPK 
    If Not .NoMatch Then 
     If Me.Dirty Then 
      Me.Dirty = False 
     End If 
     Me.Bookmark = .Bookmark 
    End If 
    End With 

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

+0

Моя цель состоит в том, чтобы оставить пользователя в той же части набора записей, что и прежде, чем они будут отправлены (что, как вы знаете, возвращает вас к первой записи). Поскольку команда Dismiss, очевидно, удалит эту конкретную запись из представления, пользователь в идеале окажется в следующей записи в наборе. – PowerUser

+0

Ну, это не то, что вы описали как свою цель. Фактически, если набор записей не изменился иначе, вы попадете в запись * после * тот, который больше не отображается. Если бы я хотел сделать то, что вы предлагаете, я бы по-прежнему использовал тот же подход, т. Е. Получил бы PK следующей (или предыдущей) записи, сохранил это, requery, а затем вернусь к нему через RecordsetClone , Имейте в виду, что ваш подход вызовет проблемы, если удаляемая запись является последней в наборе записей, тогда как при использовании PK не имеет значения, где в наборе записей отображается искомая запись. –

+0

Ну, прошло около 13 месяцев с тех пор, как вы это предложили, и теперь я работаю над совершенно другой базой данных, но теперь понимаю значение вашего предложения :) – PowerUser

1

Nevermind. Исправлено. Последняя строка теперь:

Me.Recordset.Move GoBackToThisRecord 
1

Правильный путь для перехода к предыдущей записи, будь то новый или нет,

Me.Recordset.Move GoBackToThisRecord -1 
1

Я использую эту функцию:

Public Sub RequeryFormAndKeepCurrentlySelectedRecord(f As Form) 
Dim Position As Long 
    Position = f.CurrentRecord 
    f.Requery 
    If Position > 1 Then 
    f.Recordset.move Position - 1 
    End If 
End Sub 
Смежные вопросы