1 / 1 / 0
Регистрация: 02.06.2015
Сообщений: 8
1

Код для кнопки "сохранить запись" на VBA

17.06.2015, 00:55. Показов 21158. Ответов 94
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Есть форма ввода. Нужно сделать на ней кнопку "сохранить".
Форма по-умолчанию открывается на "новой записи".
Одна кнопка закрывает форму и отменяет запись.
А другая сохраняет.

Функции сделаны макросами и, в принципе, работают, НО возникла необходимость запустить кнопкой "сохранить" еще код VBA на запуск запросов на изменение без сообщений и предупреждений, так что поменял "макрокоманды" на "процедуры обработки" и теперь нужно реализовать стандартную макрокоманду "СохранитьЗапись" в коде VBA.

Задача типовая, НО решения из интернета не привели к результату.
Не мог бы кто-нибудь предложить вариант кода?
Сейчас кнопка работает отлично и после создания записи еще и переход на новую запись происходит сразу (т.е. форма очищается)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2015, 00:55
Ответы с готовыми решениями:

VBA для вывода сообщения об ошибке для кнопки добавить запись на форме
Здравстуйте всем!!! Прошу помощи в следующем вопросе: дана таблица, содержащая поля - код,...

Код VBA для кнопки на листе Excel
Всем добрый день вечер ночь утро! Подскажите пожалуйста, может кто-нибудь знает чего прописать в...

Пожалуйста, дайте код vba для кнопки, для расчета нечетных чисел в заданном интервале
Ввод должен осуществляться с клавиатуры( ввод интервала) Заранее спасибо!

Код для кнопки "сохранить и выйти"
Ребята помогите пожалуста с кодом: у меня курсовая работа:для кнопки мне нужен код который...

Запись данных в таблицы только нажатием кнопки «Сохранить» на составной форме
Здравствуйте. Как можно осуществить запись данных в таблицы (главную и подчиненную) через связанную...

94
8859 / 5904 / 585
Регистрация: 27.03.2013
Сообщений: 19,567
17.06.2015, 01:02 2
Не сильно уверен, что понял суть вопроса, но мелкософт сделал так, что если к примеру переставищь курсор на новую запись, то ВСЁ АВТОМАТОМ СОХРАНЯЕТСЯ или у вас все поля имеют статус - СВОБОДНОЕ???
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.06.2015, 01:09 3
Лучший ответ Сообщение было отмечено alvk как решение

Решение

Если форма основана на таблице, то команда сохранить запись:
Visual Basic
1
Me.Dirty=False
Или, как уже было сказано, просто перейти на другую запись.
2
8859 / 5904 / 585
Регистрация: 27.03.2013
Сообщений: 19,567
17.06.2015, 01:16 4
Цитата Сообщение от mobile Посмотреть сообщение
перейти на другую запись.
Я пользую команды процедур в основном так:
ОписаниеПример
ЗаписьПерваяDoCmd.GoToRecord , , acFirst
ЗаписьПредыдущаяDoCmd.GoToRecord , , acPrevious
ЗаписьСледующаяDoCmd.GoToRecord , , acNext
ЗаписьПоследняяDoCmd.GoToRecord , , acLast
ЗаписьНоваяDoCmd.GoToRecord , , acNewRec
ЗаписьУдалитьDoCmd.RunCommand acCmdDeleteRecord
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.06.2015, 01:25 5
Цитата Сообщение от kmv-puh Посмотреть сообщение
Я пользую команды процедур в основном так:
Не самые лучшие варианты. Дело в том, что здесь используются макрокоманды. А макрокоманды это всего лишь посредники между формой и данными и, соответственно занимают время и ресурсы. Все тоже самое лучше делать прямыми методами рекордсета
Описание Пример
ЗаписьПервая Me.Recordset.MoveFirst
ЗаписьПредыдущая Me.Recordset.MovePrevious
ЗаписьСледующая Me.Recordset.MoveNext
ЗаписьПоследняя Me.Recordset.MoveLast
ЗаписьНовая Me.Recordset.AddNew
5
8859 / 5904 / 585
Регистрация: 27.03.2013
Сообщений: 19,567
17.06.2015, 01:43 6
Цитата Сообщение от mobile Посмотреть сообщение
здесь используются макрокоманды.
Я если честно даже и разницы не вижу, ну разве что излишек запятых, но на скорость и производительность как мне кажется не влияет, хотя могу и ощибаться, т. к. только учусь.
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.06.2015, 02:08 7
Цитата Сообщение от kmv-puh Посмотреть сообщение
но на скорость и производительность как мне кажется не влияет
Влияет. При долгой и напряженной работе с формой, обилие макрокоманд заметно снижает производительность. Кэш команд забивается командами посредников и система вынуждена его постоянно чистить. При работе с рекордсетом такое случается очень редко.
1
8859 / 5904 / 585
Регистрация: 27.03.2013
Сообщений: 19,567
17.06.2015, 02:13 8
Цитата Сообщение от mobile Посмотреть сообщение
...Влияет....
СПАСИБО , Учту на будущее.
0
4064 / 1445 / 399
Регистрация: 07.08.2013
Сообщений: 3,616
17.06.2015, 04:02 9
а еще на форме есть специальная кнопочка (если конечно она не отключена)
расположена вдоль левой границы формы
Миниатюры
Код для кнопки "сохранить запись" на VBA  
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
Цитата Сообщение от mobile Посмотреть сообщение
Если форма основана на таблице, то команда сохранить запись:
Me.Dirty=False
Повесил на кнопку этот код, для сохранения записи. Но почему то он вызывает ошибку: "Предыдущая операция прервана пользователем" 2001.
У меня в Form_BeforeUpdate есть код, который проверяет заполненность обязательных полей. Так вот, при нажатии кнопки, запускается Form_BeforeUpdate и если какое нибудь поле не заполнено, то вылетает данная ошибка... Если же все обязательные поля заполнены, то Me.Dirty=False успешно выполняется и ошибки нет. Кстати, вы указали, что эта команда только для форм основанных на таблице, а если как у меня, на запросе из двух таблиц?

Добавлено через 11 минут
Можно конечно на колхозить и выполнить проверку на заполненность полей прямо на событии этой кнопки, и запускать Me.Dirty=False только в случае их заполненности, но в этом случае все равно запустится Form_BeforeUpdate и произойдет повторная проверка на обяз. поля, что не очень хотелось... Можно и этого избежать, с помощью флажка прекратить код в Form_BeforeUpdate. Но все же хотелось более изящного пути..)
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
16.09.2017, 23:10 12
Команда Сохранить запись (Dirty=False) находится в контексте всех операций с таблицами. И если заданы обязательные поля, то как может отработать Dirty? Не может, при попытке сохранения выйдет ошибка.

Обязательность полей, как мне кажется задавать не стоит. Достаточно частая ситуация когда нет каких-то важных данных, они будут завтра, потом. Ввод данных тем не менее не откладывается, но если указаны обязательные поля, то гарантирован конфликт. Есть множество практических рекомендаций как поступать в таких ситуациях. Мой опыт такой: обязательных полей нет, но есть служебная табличка со списком обязательных полей в всех таблицах. Время от времени админ БД или даже оператор запускает программу проверки ввода важных, обязательных данных. В некоторых случаях такая процедура запускается при старте БД. И если недостающие данные поступили, они вводятся. Конечно это рецепт не единственный и не всегда применимый. Только как вариант.

Цитата Сообщение от sana555 Посмотреть сообщение
вы указали, что эта команда только для форм основанных на таблице, а если как у меня, на запросе из двух таблиц?
Это неважно. Команда Dirty отрабатывает при попытке редакции набора данных формы. А уж какой он этот набор, для дирти неважно.
2
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
16.09.2017, 23:32 13
Вы скорее всего правы, но в моем случае обязательных полей всего 5 из примерно 40. А самое главное, эти поля пользователь должен знать в любом случае, иначе смысл даже начинать заполнять новый договор... К примеру, есть поле источник информации, и если поле было бы не обязательное, то по прошествии достаточного периода времени, не каждый вспомнит что это был за источник такой...) А статистика нужна, и не просто статистика, а реальная, а не от балды, которую потом заставят вписать..)

Добавлено через 7 минут
А какой у вас опыт по использованию составного индекса в таблице? Вы им пользуетесь или тоже проблемы встречаются?
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
16.09.2017, 23:40 14
Если есть действительно обязательные поля, то в BeforeUpdate они опрашиваются на валидность и заполненность. И если не соответствуют, то задается Cancel=True, запись не сохраняется, курсор остается на незаконченной записи. Как правило при этом переводят фокус на первое пустое поле из обязательных.
В этих случаях, кстати, очень полезно визуально выделять незаполненные поля. Цветом, миганием. Надо чтобы юзер обратил на них внимание, особенно когда полей много и внимание рассеивается.

Добавлено через 2 минуты
Цитата Сообщение от sana555 Посмотреть сообщение
А какой у вас опыт по использованию составного индекса в таблице? Вы им пользуетесь или тоже проблемы встречаются?
Да, конечно пользуюсь. И часто. В основном для того, чтобы обеспечить уникальность набора полей, входящих в индекс. Также для повышения скорости запросов.
3
10445 / 5445 / 1374
Регистрация: 05.10.2016
Сообщений: 15,424
16.09.2017, 23:50 15
Цитата Сообщение от mobile Посмотреть сообщение
Если есть действительно обязательные поля, то в BeforeUpdate они опрашиваются на валидность и заполненность. И если не соответствуют, то задается Cancel=True, запись не сохраняется, курсор остается на незаконченной записи.
Как вариант использовать локальную функцию для проверки сохраняемых значений.
Что -то типа :
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Function CheckFormValues () As Boolean
'Проверка значений данных формы
    If IsNull(Me!ИмяПоля)= True then
        MsgBox "Нет значения в ..."
        Me!ИмяПоля.SetFocus
        Exit Function
    End if
 
    ' и т.д.
 
    CheckValues = True 'все проверки пройдены = OK!
End Function
И вызываем ЭТО во всех местах где сохранение ....
1
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
16.09.2017, 23:51 16
Цитата Сообщение от mobile Посмотреть сообщение
Если есть действительно обязательные поля
Действительно, но только не заданные в таблице, а отдельный код с массивом обяз. полей, вы по моему мне как то давали.
Цитата Сообщение от mobile Посмотреть сообщение
Как правило при этом переводят фокус
Да, так и сделал.
Цитата Сообщение от mobile Посмотреть сообщение
миганием.
А это как сделать?
Цитата Сообщение от mobile Посмотреть сообщение
Да, конечно пользуюсь. И часто. В основном для того, чтобы обеспечить уникальность набора полей, входящих в индекс.
Вот и я, до поры до времени им пользовался, и был очень рад, пока не словил ошибку по моему: Update cansel update. Вот после этой ошибки пришлось отказаться от индексов и встроенных в таблицу обяз. полей.
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.09.2017, 00:21 17
Цитата Сообщение от sana555 Посмотреть сообщение
Вот и я, до поры до времени им пользовался, и был очень рад, пока не словил ошибку по моему: Update cansel update. Вот после этой ошибки пришлось отказаться от индексов и встроенных в таблицу обяз. полей.
Никогда не попадалось. Ничего не знаю о таком. Посмотрел сейчас список ошибок и не нашел ничего подходящего.
Цитата Сообщение от sana555 Посмотреть сообщение
Сообщение от mobile
миганием.

А это как сделать?
Используя таймер формы. Сделать просто. Но чтобы было удобно потребуется много возни. А в простейшем случае все элементарно, особенно для для простой, не многозаписной (табличной, ленточной) формы

Добавлено через 9 минут
Цитата Сообщение от sana555 Посмотреть сообщение
Вот и я, до поры до времени им пользовался, и был очень рад, пока не словил ошибку по моему: Update cansel update. Вот после этой ошибки пришлось отказаться от индексов и встроенных в таблицу обяз. полей.
Жаль, что не помните точно ситуацию. Важная вещь, хотелось бы избежать в будущем
1
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
17.09.2017, 00:22 18
Цитата Сообщение от mobile Посмотреть сообщение
Никогда не попадалось.
"update или cancelupdate без addnew или edit", тогда вы сказали, что возникает из за того что у меня форма основана на запросе из двух таблиц. Кстати тогда же я попробовал изменить формат с accdb на mdb. Так вот на mdb такой ошибки не было... Блин надо было тогда и остаться на mdb...) Сейчас уже риббон меню сделал, жалко..)
Цитата Сообщение от mobile Посмотреть сообщение
А в простейшем случае все элементарно
А все же не понял за счет чего мигает, цвет поля .BackColor по таймеру меняется что ли, или цвет границы меняется по таймеру?
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
17.09.2017, 00:33 19
Цитата Сообщение от sana555 Посмотреть сообщение
update или cancelupdate без addnew или edit"
Ага, это понятно. Но причем здесь составной индекс?

Цитата Сообщение от sana555 Посмотреть сообщение
А все же не понял за счет чего мигает, цвет поля .BackColor по таймеру меняется что ли, или цвет границы меняется по таймеру?
Любой вариант. Цвет шрифта, цвет фона, цвет границы. Или все вместе. По таймеру. Но надо чтобы после заполнения поля пропадало мигание на нем. Отвлекает.
1
430 / 38 / 1
Регистрация: 02.03.2016
Сообщений: 436
17.09.2017, 00:56 20
Цитата Сообщение от mobile Посмотреть сообщение
Но причем здесь составной индекс?
Когда я словил эту ошибку, то у меня были обязательные поля(заданные прямо в таблице) и составной индекс. После удаления обязательных полей ошибка не пропала, а исчезла только тогда когда я убрал составной индекс. Вот уже больше года эта ошибка не появляется, но и пользоваться индексом и встроенными обяз. полями я не могу. У меня осталась та база данных с этой ошибкой, можете посмотреть на досуге. Ошибка появляется по разному и не всегда под одними и теми же действиями, но так появляется почти без отказно: попробуйте не заполнить поле Статус, нажмите кнопку закрыть и вернитесь заполнить это поле, потом снова закройте и после этого должна всплыть эта ошибка.
Цитата Сообщение от mobile Посмотреть сообщение
Но надо чтобы после заполнения поля пропадало мигание на нем.
Можно на ОбязательноеПоле_AfterUpdate, повесить проверку на заполненность и если заполнено, то вырубать таймер и приводить цвета в норму.
Вложения
Тип файла: 7z Database1.7z (63.0 Кб, 56 просмотров)
0
17.09.2017, 00:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.09.2017, 00:56
Помогаю со студенческими работами здесь

Переписать код с С++ на VBA (сортировка массивов и запись в файл)
#include <algorithm> #include <iostream> #include<windows.h> using namespace std; //newGap...

Vba для кнопки
Здравствуйте, у меня есть форма и на ней есть: выпадающий список, который состоит из дней недель;...

Перевести код макроса VBA в код скрипта для гугл таблицы
Ребят, помогите пожалуйста перевести маленький кусок кода из VBA в JS для гугл таблицы. Программа...

Кнопки для взаимодействия в базой данных: сохранить (изменения), удалить
Здравствуйте. Какой код нужно прописывать к кнопкам (сохранить, удалить), если я подключил данные...

Как сделать исключение для кнопки сохранить у функции window.onbeforeunload?
Есть кнопка сохранить которая сохраняет данные кнопки и на событие onclik стоит функция запрещающая...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru