1 / 1 / 0
Регистрация: 02.06.2015
Сообщений: 8
|
|
1 | |
Код для кнопки "сохранить запись" на VBA17.06.2015, 00:55. Показов 21209. Ответов 94
Метки нет (Все метки)
Здравствуйте.
Есть форма ввода. Нужно сделать на ней кнопку "сохранить". Форма по-умолчанию открывается на "новой записи". Одна кнопка закрывает форму и отменяет запись. А другая сохраняет. Функции сделаны макросами и, в принципе, работают, НО возникла необходимость запустить кнопкой "сохранить" еще код VBA на запуск запросов на изменение без сообщений и предупреждений, так что поменял "макрокоманды" на "процедуры обработки" и теперь нужно реализовать стандартную макрокоманду "СохранитьЗапись" в коде VBA. Задача типовая, НО решения из интернета не привели к результату. Не мог бы кто-нибудь предложить вариант кода? Сейчас кнопка работает отлично и после создания записи еще и переход на новую запись происходит сразу (т.е. форма очищается)
0
|
17.06.2015, 00:55 | |
Ответы с готовыми решениями:
94
VBA для вывода сообщения об ошибке для кнопки добавить запись на форме Код VBA для кнопки на листе Excel Пожалуйста, дайте код vba для кнопки, для расчета нечетных чисел в заданном интервале Код для кнопки "сохранить и выйти" Запись данных в таблицы только нажатием кнопки «Сохранить» на составной форме |
8860 / 5908 / 585
Регистрация: 27.03.2013
Сообщений: 19,574
|
|
17.06.2015, 01:02 | 2 |
Не сильно уверен, что понял суть вопроса, но мелкософт сделал так, что если к примеру переставищь курсор на новую запись, то ВСЁ АВТОМАТОМ СОХРАНЯЕТСЯ или у вас все поля имеют статус - СВОБОДНОЕ???
0
|
8860 / 5908 / 585
Регистрация: 27.03.2013
Сообщений: 19,574
|
|||||||||||||||
17.06.2015, 01:16 | 4 | ||||||||||||||
Я пользую команды процедур в основном так:
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|||||||||||||
17.06.2015, 01:25 | 5 | ||||||||||||
Не самые лучшие варианты. Дело в том, что здесь используются макрокоманды. А макрокоманды это всего лишь посредники между формой и данными и, соответственно занимают время и ресурсы. Все тоже самое лучше делать прямыми методами рекордсета
5
|
8860 / 5908 / 585
Регистрация: 27.03.2013
Сообщений: 19,574
|
|
17.06.2015, 01:43 | 6 |
Я если честно даже и разницы не вижу, ну разве что излишек запятых, но на скорость и производительность как мне кажется не влияет, хотя могу и ощибаться, т. к. только учусь.
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
17.06.2015, 02:08 | 7 |
Влияет. При долгой и напряженной работе с формой, обилие макрокоманд заметно снижает производительность. Кэш команд забивается командами посредников и система вынуждена его постоянно чистить. При работе с рекордсетом такое случается очень редко.
1
|
8860 / 5908 / 585
Регистрация: 27.03.2013
Сообщений: 19,574
|
|
17.06.2015, 02:13 | 8 |
0
|
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,617
|
|
17.06.2015, 04:02 | 9 |
а еще на форме есть специальная кнопочка (если конечно она не отключена)
расположена вдоль левой границы формы
0
|
1 / 1 / 0
Регистрация: 02.06.2015
Сообщений: 8
|
|
17.06.2015, 12:18 [ТС] | 10 |
Спасибо. Применил, записи создаются. А не подскажете команду VBA, чтобы после этого как бы "перезагрузить" форму? У нее макрокомандой стоит запуск с открытием новой записи просто и таким образом поля будут чистые сразу после сохранения новой записи. Я так думаю.
0
|
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
|
|
16.09.2017, 23:04 | 11 |
Повесил на кнопку этот код, для сохранения записи. Но почему то он вызывает ошибку: "Предыдущая операция прервана пользователем" 2001.
У меня в Form_BeforeUpdate есть код, который проверяет заполненность обязательных полей. Так вот, при нажатии кнопки, запускается Form_BeforeUpdate и если какое нибудь поле не заполнено, то вылетает данная ошибка... Если же все обязательные поля заполнены, то Me.Dirty=False успешно выполняется и ошибки нет. Кстати, вы указали, что эта команда только для форм основанных на таблице, а если как у меня, на запросе из двух таблиц? Добавлено через 11 минут Можно конечно на колхозить и выполнить проверку на заполненность полей прямо на событии этой кнопки, и запускать Me.Dirty=False только в случае их заполненности, но в этом случае все равно запустится Form_BeforeUpdate и произойдет повторная проверка на обяз. поля, что не очень хотелось... Можно и этого избежать, с помощью флажка прекратить код в Form_BeforeUpdate. Но все же хотелось более изящного пути..)
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
16.09.2017, 23:10 | 12 |
Команда Сохранить запись (Dirty=False) находится в контексте всех операций с таблицами. И если заданы обязательные поля, то как может отработать Dirty? Не может, при попытке сохранения выйдет ошибка.
Обязательность полей, как мне кажется задавать не стоит. Достаточно частая ситуация когда нет каких-то важных данных, они будут завтра, потом. Ввод данных тем не менее не откладывается, но если указаны обязательные поля, то гарантирован конфликт. Есть множество практических рекомендаций как поступать в таких ситуациях. Мой опыт такой: обязательных полей нет, но есть служебная табличка со списком обязательных полей в всех таблицах. Время от времени админ БД или даже оператор запускает программу проверки ввода важных, обязательных данных. В некоторых случаях такая процедура запускается при старте БД. И если недостающие данные поступили, они вводятся. Конечно это рецепт не единственный и не всегда применимый. Только как вариант. Это неважно. Команда Dirty отрабатывает при попытке редакции набора данных формы. А уж какой он этот набор, для дирти неважно.
2
|
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
|
|
16.09.2017, 23:32 | 13 |
Вы скорее всего правы, но в моем случае обязательных полей всего 5 из примерно 40. А самое главное, эти поля пользователь должен знать в любом случае, иначе смысл даже начинать заполнять новый договор... К примеру, есть поле источник информации, и если поле было бы не обязательное, то по прошествии достаточного периода времени, не каждый вспомнит что это был за источник такой...) А статистика нужна, и не просто статистика, а реальная, а не от балды, которую потом заставят вписать..)
Добавлено через 7 минут А какой у вас опыт по использованию составного индекса в таблице? Вы им пользуетесь или тоже проблемы встречаются?
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
16.09.2017, 23:40 | 14 |
Если есть действительно обязательные поля, то в BeforeUpdate они опрашиваются на валидность и заполненность. И если не соответствуют, то задается Cancel=True, запись не сохраняется, курсор остается на незаконченной записи. Как правило при этом переводят фокус на первое пустое поле из обязательных.
В этих случаях, кстати, очень полезно визуально выделять незаполненные поля. Цветом, миганием. Надо чтобы юзер обратил на них внимание, особенно когда полей много и внимание рассеивается. Добавлено через 2 минуты Да, конечно пользуюсь. И часто. В основном для того, чтобы обеспечить уникальность набора полей, входящих в индекс. Также для повышения скорости запросов.
3
|
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,476
|
||||||
16.09.2017, 23:50 | 15 | |||||
Как вариант использовать локальную функцию для проверки сохраняемых значений.
Что -то типа :
1
|
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
|
|
16.09.2017, 23:51 | 16 |
Действительно, но только не заданные в таблице, а отдельный код с массивом обяз. полей, вы по моему мне как то давали.
Да, так и сделал. А это как сделать? Вот и я, до поры до времени им пользовался, и был очень рад, пока не словил ошибку по моему: Update cansel update. Вот после этой ошибки пришлось отказаться от индексов и встроенных в таблицу обяз. полей.
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
17.09.2017, 00:21 | 17 |
Никогда не попадалось. Ничего не знаю о таком. Посмотрел сейчас список ошибок и не нашел ничего подходящего.
Используя таймер формы. Сделать просто. Но чтобы было удобно потребуется много возни. А в простейшем случае все элементарно, особенно для для простой, не многозаписной (табличной, ленточной) формы
Добавлено через 9 минут Жаль, что не помните точно ситуацию. Важная вещь, хотелось бы избежать в будущем
1
|
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
|
|
17.09.2017, 00:22 | 18 |
"update или cancelupdate без addnew или edit", тогда вы сказали, что возникает из за того что у меня форма основана на запросе из двух таблиц. Кстати тогда же я попробовал изменить формат с accdb на mdb. Так вот на mdb такой ошибки не было... Блин надо было тогда и остаться на mdb...) Сейчас уже риббон меню сделал, жалко..)
А все же не понял за счет чего мигает, цвет поля .BackColor по таймеру меняется что ли, или цвет границы меняется по таймеру?
0
|
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
|
|
17.09.2017, 00:33 | 19 |
Ага, это понятно. Но причем здесь составной индекс?
Любой вариант. Цвет шрифта, цвет фона, цвет границы. Или все вместе. По таймеру. Но надо чтобы после заполнения поля пропадало мигание на нем. Отвлекает.
1
|
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
|
|
17.09.2017, 00:56 | 20 |
Когда я словил эту ошибку, то у меня были обязательные поля(заданные прямо в таблице) и составной индекс. После удаления обязательных полей ошибка не пропала, а исчезла только тогда когда я убрал составной индекс. Вот уже больше года эта ошибка не появляется, но и пользоваться индексом и встроенными обяз. полями я не могу. У меня осталась та база данных с этой ошибкой, можете посмотреть на досуге. Ошибка появляется по разному и не всегда под одними и теми же действиями, но так появляется почти без отказно: попробуйте не заполнить поле Статус, нажмите кнопку закрыть и вернитесь заполнить это поле, потом снова закройте и после этого должна всплыть эта ошибка.
Можно на ОбязательноеПоле_AfterUpdate, повесить проверку на заполненность и если заполнено, то вырубать таймер и приводить цвета в норму.
0
|
17.09.2017, 00:56 | |
17.09.2017, 00:56 | |
Помогаю со студенческими работами здесь
20
Переписать код с С++ на VBA (сортировка массивов и запись в файл) Vba для кнопки Перевести код макроса VBA в код скрипта для гугл таблицы Кнопки для взаимодействия в базой данных: сохранить (изменения), удалить Как сделать исключение для кнопки сохранить у функции window.onbeforeunload? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |