|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
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 вылетает ошибка. И вот сижу и думаю, как-же решить эту проблему. Неужели придётся костыли какие-то делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 14:24 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Вопрос: как красиво, по умному, обработать сообщение об ошибке после me.dirty = false, (после cancel = true в событии private sub form_beforeupdate(cancel as integer) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 14:26 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Nebo, может чё не понял-обычно так (или выполняйте проверку и по её результату запрещайте или разрешайте сохранять) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Если иначе-как Вы хотите использовать DIRTY? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 15:33 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Дело в том, что в событии Form_BeforeUpdate(Cancel As Integer) в моём случае нельзя использовать Me.Undo Нельзя сбрасывать данные на экране просто так. Всё должно оставаться на своих местах, но программа должна сказать, что не может сохранить запись. Она это и говорит. Но поскольку событие Form_BeforeUpdate инициируется через Me.Dirty = False, то понятно, что дальше вылетает ещё одно предупреждение 2101, что команда Me.Dirty = False не смогла отработать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 16:04 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
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 или не приступать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 16:43 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
__Michelle, Спасибо за обстоятельный подход) Это уже интересно. Логика в Ваших словах есть! Только надо покрутить эту связку dirty и beforeUpdate Есть ведь и закрытие формы по крестику. Там ведь наверное автоматически работает dirty Посмотрю в общем. в beforeUpdate блокирую вспомогательные таблицы. Чтобы по сети не меняли данные. Потом делаю разные проверки. Удобно с beforeUpdate . Знаю что именно в этом месте, железно, блокирую таблицы и что никто не зелезет в процесс, пока afterUpdate не снимет эти блокировки. В afterUpdate снимаю блокировки с таблиц. Вроде как так удобно получается при работе в сети. Как вообще сделать? Источник данных для формы - редактируемый. Перед записью в базу данные надо проверить. Для этого использую связку beforeUpdate afterUpdate В момент записи, остальные алгоритмы на других компах должны подождать какое-то время. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 17:08 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Access ведь автоматически сохраняет данных. Получается, что beforeUpdate формы, это единственное место, где я могу запустить проверки, устанавливать разные блокировки ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 17:11 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Я проверил. Открыл форму. Изменил данные. Нажал на крестик, чтобы закрыть окно. Попал в событие beforeUpdate После проверок в этом событии, предположим, надо сделать cancel = true Допустим сделаю. Тогда в другом случае для Me.dirty = false это вызовет ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 17:19 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
NeboЕсть ведь и закрытие формы по крестику. Там ведь наверное автоматически работает dirtyНет.NeboAccess ведь автоматически сохраняет данных.Нет. Пока в области выделения "какрандашик", данные не сохранены. Серия Esc'ов все отменит. Сохранятся при переходе в другую запись или по команде. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 17:30 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Написано в HELP: Свойство Dirty указывает, содержит ли текущая запись несохраненные изменения. Например, это свойство позволяет проверить, случайно или преднамеренно была изменена запись, и при необходимости, перейти на следующую запись без сохранения изменений. При сохранении записи свойство Dirty автоматически принимает значение False. Как только в запись будут внесены изменения, это свойство автоматически примет значение True. Не понимаю,в силу моей тупости, ЧТО дает насильственное присваивание этому свойству значения ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 20:52 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Ребята как бы Вы сделали? На экране есть форма. Источник данных для формы: запрос или таблица (динамический). Перед сохранением записи в базу данных нужно сделать несколько проверок. С учётом того, что по сети с базой работают другие пользователи. Если проверка не проходит - не сохранять данные. При проверке некоторые ресурсы должны быть заблокированы на микросекунды. То есть: проверка и сохранение с каком то смысле должны делаться монопольно доли секунды. Я не придумал ничего лучшего как блокировать специальную таблицу в событии beforeUpdate формы. Делать в этом событии проверки, отменять если что это событие. Если проверки проходят успешно. то дальше в событии afterUpdate ajhvs снимать блокировку. Такой подход работает. Он гарантирует, что пока код выполняется, другие не могут внести изменения, поскольку натыкаются на заблокированную вспомогательную таблицу. Случайно выяснил проблему с Me.Dirty Это не такая большая проблема. Пока я так думаю) Может ошибаюсь. Но решил исследовать ситуацию. Может я не совсем правильно, что-то делаю. Подскажите плиз всем, чем можете) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 21:15 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
sdku, авторНе понимаю,в силу моей тупости, ЧТО дает насильственное присваивание этому свойству значения Ну это просто. Так мы принудительно сохраняем запись в базе. Например Вы вносите данные. Решили чай попить. Форму закрывать не хочется. Me.Dirty = False помогает) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 21:16 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
Nebo, А что мешает выполнить проверку на BeforeUpdate с возможностью отмены. А блокировка(с существующей Акс не даст работать двум пользователям)для новых записей и не нужна-какая разница запись пользователя1 или пользователя2 сохранится раньше (на очень-очень малую долю секунды.Access,по-любому,в силу множества причин,отдаст предпочтение одной из записей и сохранит её первой) Имейте ввиду что проверка и сохранение не одно и то же. Проверять на afterUpdate а сохранять на beforeupdate Nebo.... Как же всё таки обойти эту проблему элегантно? Парень в статье советует решение, но оно не подходит. У него слишком просто всё. ....Всегда думал что в программировании элегантность и простота синонимы ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2016, 23:54 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
sdku, авторВсегда думал что в программировании элегантность и простота синонимы Да! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2016, 01:44 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
NeboПри проверке некоторые ресурсы должны быть заблокированы на микросекунды. То есть: проверка и сохранение с каком то смысле должны делаться монопольно доли секунды. Забей... не нужно ничего блокировать... - Напиши отдельную функцию проверки, которая возвращает (например) 0 если всё нормально и 1 если всё плохо - Сделай отвязанную форму, корректирующую БД сохраненными запросами или DAO. - Нажал кнопку, проверил функцию и дальше или делаешь или не делаешь Что там хоть у тебя за база такая, что за доли секунды может щемиться в одну запись куча юзеров ? Может это всё надумано ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2016, 15:17 |
|
How do I prevent an error 2101 in Access when I have a button to save a record on a form?
|
|||
---|---|---|---|
#18+
vmag, авторЗабей... не нужно ничего блокировать... Пожалуй это самый лучший совет:) автор- Напиши отдельную функцию проверки, которая возвращает (например) 0 если всё нормально и 1 если всё плохо Так тоже делаю. автор- Сделай отвязанную форму, корректирующую БД сохраненными запросами или DAO. Так тоже делаю. В этой форме нажимаю кнопку Cохранить, каюсь, дальше блокирую вспомогательные таблицы, после всех проверок, пишу в базу, снимаю блокировки, и уже после этого выдаю сообщения. авторЧто там хоть у тебя за база такая, что за доли секунды может щемиться в одну запись куча юзеров ? Может это всё надумано ? Просто перестраховываюсь, чтобы всё работало железобетонно) База правда серьёзная, бизнес-логика накрученная, учитываю все мыслимые и немыслимые ситуации, особенно при сетевой работе. Раньше проще делал, а по мере накопления опыта, код сам по себе начинает усложняться) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2016, 18:18 |
|
|
start [/forum/topic.php?desktop=1&fid=45&tid=1613373]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 156ms |
0 / 0 |