Ошибка перехвата формы в Access с использованием VBA - PullRequest
0 голосов
/ 31 января 2019

Итак, у меня есть форма, которая обновляет таблицу в Microsoft Access.Я использую вызов события BeforeUpdate, чтобы остановить обновление формы, если «имя» не было заполнено.

Я хочу, чтобы форма сохранялась только после того, как все заполнено, изатем переключитесь, чтобы увидеть обновленную таблицу (бит «Если не отменить»).

В настоящее время всплывающее окно с надписью «Вы должны ввести имя» корректно срабатывает, следующее всплывающее окно спрашивает, хочет ли пользовательотменить любые изменения пожаров.Но затем появляется всплывающее окно с надписью «Нет текущей записи», а затем представление меняется на таблицу.Я не уверен, почему это все происходит.

Option Compare Database

Private Sub Form_BeforeUpdate(Cancel As Integer)

   Cancel = False

' perform data validation
If IsNull(Me.customer_f_name) Then

   MsgBox "You must enter a First Name.", vbCritical, "Data entry error..."
   Me.customer_f_name.BorderColor = vbRed
   DoCmd.GoToControl "customer_f_name"

   Cancel = True

End If

If Not Cancel Then

    DoCmd.SelectObject acTable, "ticket_tracker_table"
    DoCmd.Requery
    DoCmd.GoToRecord acDataTable, "ticket_tracker_table", acLast

End If

' if the save has been canceled or did not pass the validation , then ask to Undo changes
If Cancel Then

    If MsgBox("Do you want to undo any changes?", vbYesNo, "Confirm") = vbYes Then
        Me.Undo
    End If

End If

End Sub

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

так, чтобы дополнить J7, с некоторым большим представлением изображения: «в основном, хотите, чтобы форма сохранялась только после того, как все было заполнено»….это плывет против течения;вот почему вам приходится писать много кода.Продукт вводит данные, как вы идете в основном.это основной дизайн.

это очень нормально делать проверки полей по мере того, как вы идете - обычно в событии AfterUpdate, применяется код проверки и, если он недействителен, генерировать окно сообщения и вызывать Undo плюс сброситьсосредоточиться назад на поле, которое они пытались покинуть.

Совершенно другой дизайн, в некоторых случаях он может оправдать временную локальную дубликат таблицы только для целей хранения входных данных формы - - этот подход позволяет очень тщательно продуматьпроверка (и) с данными в производственной базе данных;где, если действительно, запрос на добавление затем записывает данные в постоянную таблицу.

0 голосов
/ 31 января 2019

Обзор https://docs.microsoft.com/en-us/office/vba/api/Access.Form.BeforeUpdate(even)

Вместо GoToControl, используйте SetFocus.Я провел очень простой тест с вопросом «Отменить», и он действительно работает:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me.customer_f_name) Then
    MsgBox "Must enter customer name."
    Cancel = True
    If MsgBox("Do you want to undo edits?", vbYesNo) = vbYes Then Me.Undo
    Me.customer_f_name.SetFocus
End If
End Sub

Предложите поместить табличный код в событие AfterUpdate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...