Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Передать cancel=true обратно в событие формы / 12 сообщений из 12, страница 1 из 1
06.02.2019, 11:21
    #39770012
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
Всем добрый день. Решил на форму на before_update поставить обычное предупреждение для пользователя, о том нужно ли сохранять или нет данные если они изменились при переходе на другую запись

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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



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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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. Заранее благодарю за подсказку
...
Рейтинг: 0 / 0
06.02.2019, 11:32
    #39770022
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
попутно еще один вопрос: есть ли в VBA штатная возможность узнать в какие конкретно контролы внесены изменения до UPDATE? или же нет такой функции (я, по крайней мере, не встречал нигде в книжках и справках)? теоретически чтобы сделать UNDO система "должна помнить", какие конкретно поля изменены, чтобы откатить их. зачем нужно, чтобы при возникновении события BeforeUpdate подсветить пользователю то, что было изменено, вроде как для наглядности :-)
...
Рейтинг: 0 / 0
06.02.2019, 11:37
    #39770035
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
Ганов АлександрНе пойму как Cancel = True передать обратно в событие формы, чтобы отменить UPDATE
Переделай свою Sub на Function и возвращай что хочешь
Ганов Александресть ли в VBA штатная возможность узнать в какие конкретно контролы внесены изменения до UPDATE
У контролов есть свойство OldValue. Вот если оно не равно Value - то "внесены"
...
Рейтинг: 0 / 0
06.02.2019, 11:52
    #39770057
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
вот спасибо!! переделал вот так - все работает

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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
...
Рейтинг: 0 / 0
06.02.2019, 11:56
    #39770063
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
Ганов Александр, либо prcКонтрольИзмененийФормы сделать функцией as boolean, либо в sub ввести переменную, состояние которой будете отслеживать в основной процедуре, - проще при изменениях менять .tag.
...
Рейтинг: 0 / 0
06.02.2019, 11:57
    #39770066
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
Function fncКонтрольИзмененийФормы(frmName As String) as boolean
...
Рейтинг: 0 / 0
06.02.2019, 12:03
    #39770072
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
alecko, все понял. с tag тоже отличная идея. замечание насчет bool принял. Благодарю
...
Рейтинг: 0 / 0
06.02.2019, 12:14
    #39770080
4d_monster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
Ганов Александр,

Можно и так
Код: vbnet
1.
Public Sub prcКонтрольИзмененийФормы(frmName As String, ByRef Cancel As Integer)
...
Рейтинг: 0 / 0
06.02.2019, 14:03
    #39770149
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
4d_monster, во как, спасибо, то есть передаем сразу по ссылке. не знал. благодарю за такой способ
...
Рейтинг: 0 / 0
06.02.2019, 14:04
    #39770151
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
век живи - век учись :-)
...
Рейтинг: 0 / 0
11.02.2019, 10:31
    #39772052
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
Ганов Александр...
Не пойму как Cancel = True передать обратно в событие формы, чтобы отменить UPDATE. Заранее благодарю за подсказку
Добавьте вот этот код и у Вас программа не позволит сохранить изменения (если они были внесены). Аналог кода Cancel = True .
Код: vbnet
1.
DoCmd.CancelEvent
...
Рейтинг: 0 / 0
11.02.2019, 12:25
    #39772148
Ганов Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передать cancel=true обратно в событие формы
studieren, благодарю за подсказку. воспользуюсь советом
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Передать cancel=true обратно в событие формы / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]