Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
#1

Почему не срабатывает событие удаления записи? - MS Access

29.12.2014, 13:14. Просмотров 1976. Ответов 44
Метки нет (Все метки)

Есть необходимость пересчета некоторых полей в форме ПОСЛЕ УДАЛЕНИЯ записи. Событие Удаление возникает фактически же ДО удаления? А событие "После подтверждения Del", я так понимаю, возникает после подтверждения удаления (т.е. когда программа выведет диалоговое окно и мы подтвердим удаление), а поскольку в настройках базы отключена выдача таких подтверждений - событие не возникает... Как "поймать" удаление записи в таком случае?...
2
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2014, 13:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему не срабатывает событие удаления записи? (MS Access):

Событие удаления или добавления поля n записи m в форме
Подскажите,пож-ста,какое событие происходит при добавлении или удалении...

Не срабатывает событие
Здравствуйте! Помогите разобраться. Создал с помощью конструктора форму с...

Событие Form_Delete: проблема при невозможности удаления
Хочется отслеживать удаление записей из некоторых таблиц и вести...

Как удалить или отследить событие удаления из формы, основанной на запросе на объединение?
Здравствуйте! В приложении БД, в которой форма основана на запросе на...

Подтверждение удаления записи
Здравствуйте! У меня БД есть список созданных таблиц. На событии "После...

Блокировка удаления записи
Подскажите как проще всего заблокировать возможность удаления записи через...

44
mobile
Эксперт MS Access
22496 / 12814 / 2613
Регистрация: 28.04.2012
Сообщений: 14,015
29.12.2014, 13:44 #2
Вам нужно воспользоваться параметром Cancel процедуры удаления Del. Если установить Cancel=True, то удаления не произойдет. То же действие на событии BeforeDelConfirm отменит удаление оставшихся записей, если выделены для удаления несколько записей.
0
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 14:10  [ТС] #3
mobile, Хм... Что-то недопонял. Так а если мне нужно, чтобы запись была удалена? Просто после ее удаления нужно изменить значение определенного поля в форме?.. То есть я не борюсь с удалением как бы)...

Добавлено через 19 минут
Вот смотрите. У меня есть форма. на ней - две подчиненные. В одной, допустим - записи с полями Дата и Сумма, во второй - привязанные к первой записи с расшифровкой суммы по статьям, т.е. например поля Статья и Сумма. Мне нужно, чтобы после любых изменений во второй подчиненной форме (добавления, изменения, удаления записей) в поле Сумма первой подчиненной формы обновлялась общая сумма. Я понимаю, что вцелом структура сделана слегка нелогично, но саму форму переделывать я не имею права, мне только нужно сделать, чтобы правильно обновлялась сумма в первой подчиненной форме. Так вот, путем хитрых запросов на группировку и обновление я добился, что сумма обновляется при изменении и добавлении записей во вторую форму. А вот при удалении - не обновляется...
Я уже как только ни пытался организовать обновление этой саммой итоговой суммы... И делал в примечании второй формы поле с итогом, пытался ссылаться на него, но получается, что данные в нем обновляются уже после событий добавления и изменения записей, ну да бог с ним. Вот кое-как решил вопрос через запросы на группировку и обновление, но смог посадить их только на события обновления записей, а удаление поймать не могу...
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
29.12.2014, 15:51 #4
Попробуйте после удаления запустить команду (мб сработает)
Visual Basic
1
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70 'обновить
Добавлено через 1 минуту
нужно обновлять форму,в кот хотите увидеть новый результат в модуле этой самой формы
0
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 16:23  [ТС] #5
commun, Да нет, тут суть не в обновлении, в общем-то... Если брать мой приведенный выше пример, то если бы я ПОСЛЕ УДАЛЕНИЯ записи в подчиненной форме 2 обновил запросом данные таблицы из подчиненной формы 1, то да, после команды обновления эти данные отобразились бы новыми. А так, поскольку удаление записи в форме 2 уже прошло, а данные в таблице 1 не были обновлены запросом на обновление (поскольку я так и не смог найти, на какое событие посадить выполнение этого запроса) - то сколько ни обновляй, данные в форме 1 (и соответственно, ее таблице 1) будут старыми.
Вся суть моего вопроса как бы - найти событие формы, которое бы происходило сразу ПОСЛЕ удаления (причем это не событие AfterDelConfirm, т.к. оно возникает только если программой выдается вопрос о подтверждении удаления - а у нас в параметрах отключено подтверждение удаления)... Капец, неужели ж таки нету какого-то способа "помать" событие, которое бы гарантированно происходило СРАЗУ ПОСЛЕ удаления записи - и посадить на него выполнение нужного мне запроса?..
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
29.12.2014, 17:17 #6
В книжке написано,что при удалении записи формы в ней последоват происходят 3 события (но я втек жизни я с ними если и работал,то уже не помню):Delete-BeforeDelConfirm-AfterDelConfirm. Так что есть еще 2 события и думаю,что Delete-то самое,искомое.
0
mobile
Эксперт MS Access
22496 / 12814 / 2613
Регистрация: 28.04.2012
Сообщений: 14,015
29.12.2014, 17:20 #7
Лучший ответ Сообщение было отмечено Kkarn как решение

Решение

Если по каким-то причинам Вам не удается использовать событие AlterDelConfirm, то можно и нужно использовать стандартную последовательность событий формы. После удаления записи обязательно наступает событие Текущая запись. Возможно, что именно там Вам будет уместно задавать дальнейшие телодвижения для формы. Может быть с проверкой, скажем публичной переменной, которой задается True на событии удаления и False на текущей записи.
1
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 17:23  [ТС] #8
commun, Я про них уже тоже много чего начитал)... событие Delete - происходит ДО фактического удаления записи. То есть тогда, когда она еще есть в таблице... И если в это время сделать запрос к таблице, то данные о сумме еще будут в ней, и соответственно, пойдут в общую сумму. Вот уж не думал, что в Access может быть такой странный затык. Либо я как-то не понимаю логику этих самых событий... Про другие два события, связанные с удалением - та же фигня, они происходят одно - перед удалением, а второе - после, но только если пользователь подтверждает удаление в сообщении, которое выдает Access. А выдача таких сообщений у меня в базе в данном случае отключена... Какой-то тупик получается.

Добавлено через 54 секунды
mobile, Спасибо, а вот это и правда мысль)) Буду проверять.
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
29.12.2014, 17:33 #9
ни в коем случае,не буду спорить про Delete, но при событии Before.. пользователь может только запомнить данные до удаления,но самих данных уже нет
0
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 20:06  [ТС] #10
commun, то есть фактически данных уже нет в таблице, когда наступает событие BeforeDelConfirm?.. Хм, тоже не буду спорить, я вроде бы читал, что это событие идет до фактического удаления... Ну, если и правда так, то у меня есть еще один вариант действий для проверки. Спасибо)

Добавлено через 2 часа 8 минут
Похоже, я таки чего-то не понимаю... Скажите, когда уже ПОСЛЕ удаления в форме наступает событие Текущая запись - данные из таблиц УЖЕ УДАЛЕНЫ окончательно?.. Я только что столкнулся с вот чем. Как и советовал mobile, я сделал в форме глобальную переменную, на событие удаления в форме присваиваю ей True, в событии Текущая запись прописываю сначала исполнение нужных запросов на обновление данных в таблице 1... И ни черта не обновляется! При этом я еще напихал в код мсжбоксов для контроля прохождения - так вот, по ним выходит, что событие Текущая запись настало, все запросы на обновление благополучно отработали, но данные в таблице при этом ОСТАЛИСЬ ПРЕЖНИЕ! То есть выходит, что на момент выполнения запросов еще оставались удаленные данные? Ведь итоговая сумма не изменилась, а должна была уменьшиться на сумму из удаленной записи... Я вообще ничего не понимаю.
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
29.12.2014, 20:19 #11
Событие Current возникает только при открытии, закрытии формы и при переходе от одной записи к другой.Причем еще надо каждый раз четко разбираться-это какая текущая запись? это событие этой записи или записи, к которой совершен переход. При чем здесь удаление? Я свое мнение уже ясно изложил. Да, ведь можно удалить последнюю запись, и где же Вы тогда возьмете текущую?
0
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 20:58  [ТС] #12
commun, Ок, я проверил заодно и событие BeforeDelConfirm... Не знаю, каким чудным образом, но данные все равно остаются... То есть на момент события данные в таблице ЕСТЬ, и запрос их видит, потому и итоговая сумма не изменяется. Ужас какой-то просто. Этом при добавлении и изменении строк - запросы работают идеально, значит дело не в них...

Добавлено через 5 минут
Я, наверное, сейчас смоделирую ситуацию и выложу файл примера. Я ж теперь ночь спать не буду, пока не пойму, почему не работает...
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
29.12.2014, 21:25 #13
Если форма на запросе, то имейте в виду, что запрос на момент открытия формы выполняется 1 раз и выдает данные,проверьте саму таблицу, запрос-это фото прежних данных, для получения новых нужно выполнять запрос еще раз

Добавлено через 33 секунды
те обновлять форму

Добавлено через 20 минут

Не по теме:

Цитата:"среди разработчиков бытует мнение, что запросы, формы и отчеты могут врать, а таблицы-никогда"



Добавлено через 3 минуты
Запрос выполняется еще и после изменения или удаления данных в таблице
0
mobile
Эксперт MS Access
22496 / 12814 / 2613
Регистрация: 28.04.2012
Сообщений: 14,015
29.12.2014, 21:43 #14
Kkarn, посмотрите пример. Выполняется удаление записи по предложенному выше варианту. При этом, исключительно для иллюстрации, в поле Оклад1 записывается значение оклада удаленного сотрудника, деленное на количество оставшихся :-)
0
Вложения
Тип файла: zip delete.zip (38.5 Кб, 9 просмотров)
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 21:47  [ТС] #15
Собственно, вот. Есть форма, в ней - две связанные через поле связи подформы - Таблица 1 и таблица 2. Я для примера заполнил их. в Таблице 1 стоит одна дата, а поле сумма - заблокировано, оно должно обновляться запросами автоматически. Вот при добавлении записей в Таблицу 2, а так же при их изменении - запросы работают и обновляют поле итоговой суммы в выбранной записи таблицы 1. А при удалении - хоть убейся, куда я только не пытался прилепить выполнение запросов... Запросов там три штуки, поскольку натолкнулся на "В выражении должен использоваться обновляемый запрос", а у меня там фигурирует запрос группировки, который не есть обновляемый, пришлось задействовать временную таблицу тмп, в которую сначала заносятся сгруппированные данные. но не суть, факт что запросы работают при добавлении и изменении полей, а при удалении - нивкакую, на какое бы событие я не лепил их выполнение... Помогите, пожалуйста, я уже не знаю, в какую сторону еще думать... Заранее большое спасибо)
0
Вложения
Тип файла: rar Пример.rar (26.8 Кб, 6 просмотров)
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
29.12.2014, 22:54 #16
Я посмотрел.И чего Вы хотите? Таблица2 является подчиненной по отнош к Таблице1. В ней мб много записей с КодТаблицы1,и требовать, чтобы при удалении только одной из них удалялось это значение кода из Таблицы1 - удалять и все подчиненные записи из Таблицы2, а затем переходить снова к расчету суммы. А предлагаемые запросы должны работать с двумя осн табл или нужен код VBA (работа по записям).Короче,временная таблица-лишняя.

Добавлено через 1 минуту

Не по теме:

На сегодня у меня все

0
Kkarn
810 / 214 / 32
Регистрация: 02.12.2014
Сообщений: 978
29.12.2014, 23:04  [ТС] #17
Хмм... я немного не понял, я вроде бы нигде не "требовать, чтобы при удалении только одной из них удалялось это значение кода из Таблицы1" - где это у меня такое было вообще?.. При удалении должна ОБНОВЛЯТЬСЯ СУММА в записи с соответствующим кодом. И это замечательно происходит при добавлении записей или изменении, и не работает при удалении. При чем здесь "чтобы удалялось это значение кода из Таблицы1"?..

Добавлено через 5 минут
Я уже не знаю, какими словами еще возможно вообще объяснить, если уже и пример есть - а меня все равно неправильно понимают... Ладно, подойдем с другой стороны. Допустим, мы сделаем во второй форме в примечании - итоговое поле, в котором будет суммироваться поле Сумма. Так вот, оно замечательно обновляется при любых действиях с записями таблицы - добавляй, меняй, удаляй... Внимание, вопрос - оно, это поле, же тоже как-то обновляется по какому-то событию? А вот все мои запросы, куда бы я их не лепил, получается, выполняются РАНЬШЕ, чем данные реально удаляются из таблицы... Потому что я точно знаю, что запросы - выполняются. А раз выполняются, а данные не меняются - значит эти данные на момент выполнения запроса еще не удалились из таблицы, правильно?.. Короче, это какой-то кошмар. На сегодня оно у меня уже в печенках, но если кто-нибудь реально может посоветовать что-то конкретно рабочее именно по моему примеру - буду очень признателен. Или хотя бы подсказать, почему именно в конкретном примере не работает обновление поля ИтоговаяСумма в Таблице 1 при удалении строк из таблицы 2.
0
mobile
Эксперт MS Access
22496 / 12814 / 2613
Регистрация: 28.04.2012
Сообщений: 14,015
29.12.2014, 23:41 #18
Kkarn, смотрите вложение

Поле txtSum это свободное сумовое поле в примечании Таблица2
0
Вложения
Тип файла: zip Пример.zip (33.4 Кб, 7 просмотров)
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
30.12.2014, 00:06 #19
формы просто нужно разуть и все события возникнут
0
Вложения
Тип файла: rar Пример.rar (76.0 Кб, 7 просмотров)
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
30.12.2014, 00:11 #20
те показать все поля (отправил перв раз не со всеми изменениями,а сейчас почта не хочет)
0
30.12.2014, 00:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2014, 00:11
Привет! Вот еще темы с решениями:

Почему не срабатывает SQL запрос в VBA?
Уже второй час сижу с ним - не могу понять проблемы. Смотрите: var =...

Почему иногда не срабатывает функция итогов в табличной форме?
Добрый день всем. Неоднократно натыкался на подобное, в конце концов решил...

Применение кнопки удаления записи в подчинённых формах
Имеется главная форма с подчинёнными формами. Необходимо добавить кнопку...

Код на заполнение Word срабатывает только один раз. Почему?
Код на заполнение Word срабатывает только один первый раз. Потом нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru