Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
Всем добрый день. Решил на форму на before_update поставить обычное предупреждение для пользователя, о том нужно ли сохранять или нет данные если они изменились при переходе на другую запись

Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Error_Handler 'обработчик ошибок
'====================================

If MsgBox("В форму внесены изменения, сохранить?", vbYesNo + vbExclamation + vbDefaultButton1, "Предупреждение") = vbNo Then
     Cancel = True
     Me.Undo
End If

'======================
Exit_Sub: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     If Err.Number = 0 Then
          Resume Next
     Else
          Call prcОбработкаОшибок(Err.Number, Err.Description, Err.Source, Erl)
     End If
     Resume Exit_Sub
     Resume
End Sub


Чтобы не "лепить" то же самое для каждой формы решил что надо вынести в публичную процедуру в модуль, а из события просто вызывать процедуру

Public Sub prcКонтрольИзмененийФормы(frmName As String)
Dim frm As Form

Set frm = Forms(frmName)


If MsgBox("В форму внесеные измнения, сохранить?", vbYesNo + vbExclamation + vbDefaultButton1, "Предупреждение") = vbNo Then
   'Cancel = True КАК ВОТ ЭТУ СТРОКУ ПЕРЕДАТЬ ОБРАТНО В СОБЫТИЕ ФОРМЫ, чтобы отменить UPDATE
   frm.Undo
End If

End Sub


Не пойму как Cancel = True передать обратно в событие формы, чтобы отменить UPDATE. Заранее благодарю за подсказку
6 фев 19, 11:21    [21802488]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
попутно еще один вопрос: есть ли в VBA штатная возможность узнать в какие конкретно контролы внесены изменения до UPDATE? или же нет такой функции (я, по крайней мере, не встречал нигде в книжках и справках)? теоретически чтобы сделать UNDO система "должна помнить", какие конкретно поля изменены, чтобы откатить их. зачем нужно, чтобы при возникновении события BeforeUpdate подсветить пользователю то, что было изменено, вроде как для наглядности :-)
6 фев 19, 11:32    [21802502]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
court
Member

Откуда:
Сообщений: 1646
Ганов Александр
Не пойму как Cancel = True передать обратно в событие формы, чтобы отменить UPDATE

Переделай свою Sub на Function и возвращай что хочешь
Ганов Александр
есть ли в VBA штатная возможность узнать в какие конкретно контролы внесены изменения до UPDATE

У контролов есть свойство OldValue. Вот если оно не равно Value - то "внесены"
6 фев 19, 11:37    [21802517]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
вот спасибо!! переделал вот так - все работает

Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Error_Handler 'обработчик ошибок
'====================================

Cancel = fncКонтрольИзмененийФормы(Me.Name)

'======================
Exit_Sub: 'обработчик ошибок
     On Error Resume Next
     Exit Sub
Error_Handler:
     If Err.Number = 0 Then
          Resume Next
     Else
          Call prcОбработкаОшибок(Err.Number, Err.Description, Err.Source, Erl)
     End If
     Resume Exit_Sub
     Resume
End Sub


и вместо SUB сделал Function

Public Function fncКонтрольИзмененийФормы(frmName As String)
Dim frm As Form

Set frm = Forms(frmName)

If frm.Dirty = True Then
     If MsgBox("В форму внесеные измнения, сохранить", vbYesNo + vbExclamation + vbDefaultButton1, "Предупреждение") = vbNo Then
          frm.Undo
          fncКонтрольИзмененийФормы = True
     End If
End If

End Function
6 фев 19, 11:52    [21802544]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 453
Ганов Александр, либо prcКонтрольИзмененийФормы сделать функцией as boolean, либо в sub ввести переменную, состояние которой будете отслеживать в основной процедуре, - проще при изменениях менять .tag.
6 фев 19, 11:56    [21802551]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 453
Function fncКонтрольИзмененийФормы(frmName As String) as boolean
6 фев 19, 11:57    [21802554]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
alecko, все понял. с tag тоже отличная идея. замечание насчет bool принял. Благодарю
6 фев 19, 12:03    [21802562]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1507
Ганов Александр,

Можно и так
Public Sub prcКонтрольИзмененийФормы(frmName As String, ByRef Cancel As Integer)
6 фев 19, 12:14    [21802573]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
4d_monster, во как, спасибо, то есть передаем сразу по ссылке. не знал. благодарю за такой способ
6 фев 19, 14:03    [21802676]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
век живи - век учись :-)
6 фев 19, 14:04    [21802679]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
studieren
Member

Откуда: Tashkent, Uzbekistan
Сообщений: 2823
Ганов Александр
...
Не пойму как Cancel = True передать обратно в событие формы, чтобы отменить UPDATE. Заранее благодарю за подсказку

Добавьте вот этот код и у Вас программа не позволит сохранить изменения (если они были внесены). Аналог кода Cancel = True .
DoCmd.CancelEvent
11 фев 19, 10:31    [21806130]     Ответить | Цитировать Сообщить модератору
 Re: Передать cancel=true обратно в событие формы  [new]
Ганов Александр
Member

Откуда: Петропавловск-Камчатский
Сообщений: 150
studieren, благодарю за подсказку. воспользуюсь советом
11 фев 19, 12:25    [21806258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить