Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / How do I prevent an error 2101 in Access when I have a button to save a record on a form? / 17 сообщений из 17, страница 1 из 1
09.07.2016, 14:24
    #39271092
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
http://stackoverflow.com/questions/1826241/how-do-i-prevent-an-error-2101-in-access-when-i-have-a-button-to-save-a-record-o


Как же всё таки обойти эту проблему элегантно?

Парень в статье советует решение, но оно не подходит. У него слишком просто всё.
В моём случает в событии beforeupdate я блокирую некоторые таблицы в базе, делаю после этого проверки.

Скажем так, я в событии формы form_beforeupdate делаю разные проверки, на основе которых принимается решение не сохранять запись. Делаю cancel = true и после это на строчке me.dirty = false вылетает ошибка.

И вот сижу и думаю, как-же решить эту проблему. Неужели придётся костыли какие-то делать?
...
Рейтинг: 0 / 0
09.07.2016, 14:26
    #39271093
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Вопрос: как красиво, по умному, обработать сообщение об ошибке после me.dirty = false, (после cancel = true в событии private sub form_beforeupdate(cancel as integer) ?
...
Рейтинг: 0 / 0
09.07.2016, 15:33
    #39271102
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Nebo,
может чё не понял-обычно так (или выполняйте проверку и по её результату запрещайте или разрешайте сохранять)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim vopros
vopros = MsgBox("Изменяете запись. Сохранить?", vbYesNo)
If Me.Dirty Then
      If vopros = vbNo Then
            Cancel = True
            Me.Undo
       End If
End If
End Sub

Если иначе-как Вы хотите использовать DIRTY?
...
Рейтинг: 0 / 0
09.07.2016, 16:04
    #39271105
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Дело в том, что в событии Form_BeforeUpdate(Cancel As Integer) в моём случае нельзя использовать Me.Undo

Нельзя сбрасывать данные на экране просто так.

Всё должно оставаться на своих местах, но программа должна сказать, что не может сохранить запись.
Она это и говорит.

Но поскольку событие Form_BeforeUpdate инициируется через Me.Dirty = False,
то понятно, что дальше вылетает ещё одно предупреждение 2101, что команда Me.Dirty = False не смогла отработать.
...
Рейтинг: 0 / 0
09.07.2016, 16:43
    #39271118
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
NeboДело в том, что в событии Form_BeforeUpdate(Cancel As Integer) в моём случае нельзя использовать Me.Undo

Нельзя сбрасывать данные на экране просто так.

Всё должно оставаться на своих местах, но программа должна сказать, что не может сохранить запись.
Она это и говорит.

Но поскольку событие Form_BeforeUpdate инициируется через Me.Dirty = False,
то понятно, что дальше вылетает ещё одно предупреждение 2101, что команда Me.Dirty = False не смогла отработать.То есть, Вы знаете, что вслед за Me.Dirty = False начинает действовать процедура Form_BeforeUpdate,
содержащая проверки, результаты которых могут отменить Me.Dirty = False?
А зачем же доводить до необходимости отмены начатого действия?
Зачем отменять, когда можно вообще не начинать?
То есть, выполнять эти критические проверки непосредственно перед Me.Dirty = False.
И уже по результатам приступать к выполнению Me.Dirty = False или не приступать.
...
Рейтинг: 0 / 0
09.07.2016, 17:08
    #39271121
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
__Michelle,

Спасибо за обстоятельный подход) Это уже интересно.

Логика в Ваших словах есть! Только надо покрутить эту связку dirty и beforeUpdate
Есть ведь и закрытие формы по крестику. Там ведь наверное автоматически работает dirty

Посмотрю в общем.


в beforeUpdate блокирую вспомогательные таблицы. Чтобы по сети не меняли данные. Потом делаю разные проверки.

Удобно с beforeUpdate . Знаю что именно в этом месте, железно, блокирую таблицы и что никто не зелезет в процесс, пока

afterUpdate не снимет эти блокировки.

В afterUpdate снимаю блокировки с таблиц. Вроде как так удобно получается при работе в сети.

Как вообще сделать? Источник данных для формы - редактируемый. Перед записью в базу данные надо проверить.
Для этого использую связку beforeUpdate afterUpdate

В момент записи, остальные алгоритмы на других компах должны подождать какое-то время.
...
Рейтинг: 0 / 0
09.07.2016, 17:11
    #39271123
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Access ведь автоматически сохраняет данных.

Получается, что beforeUpdate формы, это единственное место, где я могу запустить проверки, устанавливать разные блокировки ?
...
Рейтинг: 0 / 0
09.07.2016, 17:19
    #39271124
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Я проверил. Открыл форму. Изменил данные. Нажал на крестик, чтобы закрыть окно.

Попал в событие beforeUpdate

После проверок в этом событии, предположим, надо сделать cancel = true


Допустим сделаю.

Тогда в другом случае для Me.dirty = false это вызовет ошибку.
...
Рейтинг: 0 / 0
09.07.2016, 17:30
    #39271126
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
NeboЕсть ведь и закрытие формы по крестику. Там ведь наверное автоматически работает dirtyНет.NeboAccess ведь автоматически сохраняет данных.Нет. Пока в области выделения "какрандашик", данные не сохранены.
Серия Esc'ов все отменит.
Сохранятся при переходе в другую запись или по команде.
...
Рейтинг: 0 / 0
09.07.2016, 20:52
    #39271191
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Написано в HELP: Свойство Dirty указывает, содержит ли текущая запись несохраненные изменения. Например, это свойство позволяет проверить, случайно или преднамеренно была изменена запись, и при необходимости, перейти на следующую запись без сохранения изменений.
При сохранении записи свойство Dirty автоматически принимает значение False. Как только в запись будут внесены изменения, это свойство автоматически примет значение True.
Не понимаю,в силу моей тупости, ЧТО дает насильственное присваивание этому свойству значения
...
Рейтинг: 0 / 0
09.07.2016, 21:15
    #39271202
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Ребята как бы Вы сделали?

На экране есть форма. Источник данных для формы: запрос или таблица (динамический).

Перед сохранением записи в базу данных нужно сделать несколько проверок.
С учётом того, что по сети с базой работают другие пользователи.
Если проверка не проходит - не сохранять данные.

При проверке некоторые ресурсы должны быть заблокированы на микросекунды.
То есть: проверка и сохранение с каком то смысле должны делаться монопольно доли секунды.

Я не придумал ничего лучшего как блокировать специальную таблицу в событии beforeUpdate формы.
Делать в этом событии проверки, отменять если что это событие.

Если проверки проходят успешно. то дальше в событии afterUpdate ajhvs снимать блокировку.

Такой подход работает. Он гарантирует, что пока код выполняется, другие не могут внести изменения, поскольку натыкаются на заблокированную вспомогательную таблицу.

Случайно выяснил проблему с Me.Dirty
Это не такая большая проблема. Пока я так думаю) Может ошибаюсь.
Но решил исследовать ситуацию.

Может я не совсем правильно, что-то делаю. Подскажите плиз всем, чем можете)
...
Рейтинг: 0 / 0
09.07.2016, 21:16
    #39271204
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
sdku,

авторНе понимаю,в силу моей тупости, ЧТО дает насильственное присваивание этому свойству значения

Ну это просто. Так мы принудительно сохраняем запись в базе.
Например Вы вносите данные. Решили чай попить. Форму закрывать не хочется.

Me.Dirty = False помогает)
...
Рейтинг: 0 / 0
09.07.2016, 23:54
    #39271232
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
Nebo,
А что мешает выполнить проверку на BeforeUpdate с возможностью отмены. А блокировка(с существующей Акс не даст работать двум пользователям)для новых записей и не нужна-какая разница запись пользователя1 или пользователя2 сохранится раньше (на очень-очень малую долю секунды.Access,по-любому,в силу множества причин,отдаст предпочтение одной из записей и сохранит её первой) Имейте ввиду что проверка и сохранение не одно и то же. Проверять на afterUpdate а сохранять на beforeupdate
Nebo....
Как же всё таки обойти эту проблему элегантно?
Парень в статье советует решение, но оно не подходит. У него слишком просто всё.
....Всегда думал что в программировании элегантность и простота синонимы
...
Рейтинг: 0 / 0
10.07.2016, 01:44
    #39271243
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
sdku,

авторВсегда думал что в программировании элегантность и простота синонимы

Да! :)
...
Рейтинг: 0 / 0
10.07.2016, 15:17
    #39271365
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
NeboПри проверке некоторые ресурсы должны быть заблокированы на микросекунды.
То есть: проверка и сохранение с каком то смысле должны делаться монопольно доли секунды.

Забей... не нужно ничего блокировать...
- Напиши отдельную функцию проверки, которая возвращает (например) 0 если всё нормально и 1 если всё плохо
- Сделай отвязанную форму, корректирующую БД сохраненными запросами или DAO.
- Нажал кнопку, проверил функцию и дальше или делаешь или не делаешь

Что там хоть у тебя за база такая, что за доли секунды может щемиться в одну запись куча юзеров ?
Может это всё надумано ?
...
Рейтинг: 0 / 0
10.07.2016, 18:18
    #39271442
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
vmag,

авторЗабей... не нужно ничего блокировать...

Пожалуй это самый лучший совет:)

автор- Напиши отдельную функцию проверки, которая возвращает (например) 0 если всё нормально и 1 если всё плохо

Так тоже делаю.

автор- Сделай отвязанную форму, корректирующую БД сохраненными запросами или DAO.

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

авторЧто там хоть у тебя за база такая, что за доли секунды может щемиться в одну запись куча юзеров ?
Может это всё надумано ?

Просто перестраховываюсь, чтобы всё работало железобетонно) База правда серьёзная, бизнес-логика накрученная,
учитываю все мыслимые и немыслимые ситуации,
особенно при сетевой работе.

Раньше проще делал, а по мере накопления опыта, код сам по себе начинает усложняться)
...
Рейтинг: 0 / 0
11.07.2016, 12:31
    #39271716
Nebo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
up)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / How do I prevent an error 2101 in Access when I have a button to save a record on a form? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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