Форум программистов, компьютерный форум, киберфорум
Наши страницы

MS Access

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Kkarn
807 / 211 / 32
Регистрация: 02.12.2014
Сообщений: 976
#1

При каких событиях формы Access сохраняет запись? - MS Access

12.12.2014, 19:13. Просмотров 2280. Ответов 46
Метки нет (Все метки)

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

Столкнулся с проблемой при создании главной формы в access 2010, точнее не могу сделать картинку в размер формы - MS Access
Всем доброго времени суток=) Столкнулся с проблемой при создании главной формы в access 2010, точнее не могу сделать картинку в размер...

MS Access 2010. Запись из одной формы в другую форму с подчиненной формой - MS Access
Здравствуйте. У меня уже едет крыша. Но мне нужна помощь. Форм там много но я напишу названия тех которые должны взаимодействовать. В...

запись кода в процедуру обработки событий свойства поля формы в VB ACCESS - MS Access
есть форма состоящая из 2 полей и кнопке ок: 1 поле последняя дата, должна читаться из таблицы базы данных; 2 поле мы вводим новую...

Не сохраняет данные в базе Access - MS Access
Добрый вечер, Замечаю неоднократно, что после ввода данных в базу, не сохраняются данные. Сначала списал на свою невнимательность и...

Закрытие access при закрытии формы - MS Access
В общем такая проблема Вешаю на событие закрытия формы макрос ВыйтиИзAccess, всё работает, но при переходе в режим конструктора этой...

При запуске access остается последняя запись на форме - MS Access
при запуске access остается последняя запись на форме при запуске всегда было пустым. как убрать?

46
Kkarn
807 / 211 / 32
Регистрация: 02.12.2014
Сообщений: 976
23.12.2014, 09:52  [ТС] #31
commun, Окей, пример из жизни). Есть форма "Заказ", где в основной форме пишутся реквизиты заказа (ну там, поставщик, номер-дата заказа), а в подчиненной - состав заказа, т.е. товары, которые входят в заказ, несколько строк.
Так вот, ситуация. Пользователь заходит в форму для создания нового заказа, и, НЕ ЗАПОЛНЯЯ полей главной формы (не выбирая поставщика, не ставя номер и т.д.), например, тупо клацает в подчиненной форме - например, чтобы посмотреть перечень доступных товаров из выпадающего списка. Имеем - при переходе в подчиненную форму запись из главной формы АВТОМАТИЧЕСКИ сохраняется в таблице, причем она ПУСТАЯ, есть только поле счетчика, сгенерированное автоматом. Теперь пользователь, допустим, НЕ ХОЧЕТ сохранять новый заказ, что он делает? Правильно, клацает на кнопку закрытия формы, ожидая, что его действия просто ничего не значили, он же нигде ничего не ввел - а мы-то имеем пустую запись в таблице заказов, которая там и даром не нужна. (Да, еще существенный момент. Мне могли бы предложить поставить условия обязательности полей, чтобы оно не выпустило пользователя, пока он не заполнит все обязательные поля... Да, таким образом мы как бы страхуемся от пустых записей в таблице заказов, но в данном случае заказчик базы настаивает на том, чтобы логика работы была именно "мягкой", т.е. если поле не заполнено, значит и не нужно задалбывать пользователя лишними вопросами... В то же время и совершенно пустые записи, появляющиеся в результате "просто потыкать" от пользователя - тоже не нужны... В то же время, если пользователь внес какие-то изменения в уже существующий заказ и не нажал кнопку "Сохранить" - изменения не должны сохраняться. Ну, не мне обсуждать логику заказчика).
Так вот, по алгоритму, предложенному mobile, такие случаи замечательно отрабатывались в простых формах, которые не имеют подчиненных. А вот с формами, где есть подчиненные формы - начинаются проблемы...
0
commun
372 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
23.12.2014, 10:26 #32
Kkarn, Да, Вы правы, такая проблема была, и её я решал условием обязательности полей. А здесь есть над чем помыслить
0
boby104
864 / 335 / 83
Регистрация: 21.03.2013
Сообщений: 846
23.12.2014, 10:32 #33
Цитата Сообщение от Kkarn Посмотреть сообщение
Окей, пример из жизни
Для любого примера из жизни нужно создать свой алгоритм
1. если форма основана на данных таблицы или запроса, то поля(форма) со связанными данными должна появляться на экране (видимой) после заполнения нужного поля
2. в вашем случае (если так хочет заказчик) формы должны быть пустыми и по кнопке сохранить данные из полей должны сохраняться (или изменяться) в соответствующих таблицах
Я сам пользуюсь вторым способом - хоть и более геморройный, нужно постоянно менять источники данных для форм и полей, а потом менять их на пустые по надобности (но это только один раз нужно выписать все правильно)
0
commun
372 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
23.12.2014, 11:12 #34
Kkarn, Хотя принцип тот же: при введении обновлений в запись формы всегда возникает,напр,событие AfterUpdate (после обновления) формы, которого при простом переходе с одной записи на другую не бывает. Вот при этом событии и нужно проверить, те ли данные получены и нажата ли кн Сохранить. А что конкретно проверять и какие выводы делать - дело конкретное. При событии BeforeUpdate (до сохранения), которого при простом переходе по записям тоже не бывает-можно получить все состояние формы до обновления данных (а их могут быть сотни) и потом восстановить-ну такие задачи пока в жизни не возникали.
0
Kkarn
807 / 211 / 32
Регистрация: 02.12.2014
Сообщений: 976
23.12.2014, 12:53  [ТС] #35
commun, Вот примерно в эту сторону я и думаю...

Добавлено через 2 минуты
boby104, да, на крайний случай второй описанный Вами подход тоже имеет право на жизнь) Буду параллельно думать и над таким подходом, спасибо.
1
sana555
338 / 38 / 2
Регистрация: 02.03.2016
Сообщений: 436
06.04.2016, 16:55 #36
Цитата Сообщение от mobile Посмотреть сообщение
Visual Basic
1
Private Sub Form_BeforeUpdate(Cancel As Integer) 'Событие формы До обновления 'Взводим флажок и запоминаем ид drt = True ID = Me.id End Sub
А есть ли возможность, принудительно взвести флажок на событие До обновления, без наличия каких либо изменений в главной форме, а только при изменениях в подчиненной?
0
texnik-san
шапоклякистка 8-го дня
3557 / 2188 / 389
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.04.2016, 17:25 #37
Цитата Сообщение от sana555 Посмотреть сообщение
А есть ли возможность, принудительно взвести флажок на событие До обновления,
Если есть перемення - есть и возможность присвоить ей значение. Но в чем вы видите смысл этого действия?
1
sana555
338 / 38 / 2
Регистрация: 02.03.2016
Сообщений: 436
06.04.2016, 17:33 #38
В продолжении темы: Внесение текущего пользователя в поле формы, при изменении им данных
Хочу адаптировать для формы с подчиненной, поскольку с одиночной не все гладко получается.
Имею главную форму с подчиненной. Нужно произвести проверку делались ли изменения в главной и подчиненной форме, и если делались, то произвести запись кто и когда делал. В данном случае столкнулся с тем, что если в подчиненной форме делали изменения, а в главной нет, то код на событие До обновления не срабатывает, поскольку в главной то не было зафиксировано ни каких изменений.
0
texnik-san
шапоклякистка 8-го дня
3557 / 2188 / 389
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.04.2016, 17:37 #39
Так в подчиненной форме должен быть свой код, обрабатывающий ее события. При чем тут флажок главной формы?
0
sana555
338 / 38 / 2
Регистрация: 02.03.2016
Сообщений: 436
06.04.2016, 18:01 #40
Я имею ввиду подчиненная: (подформа в главной).

Добавлено через 9 минут
Для обязательных полей у меня получилось сделать, без кода в подчиненной, правда на Выгрузку:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Private Sub Form_Unload(Cancel As Integer) 'На событие Выгрузка, если флажки взведены, то показать сообщение с вариантами: ввести значение или удалить запись
    If sDrt And sNewRec Then
        'цикл для главной формы:
         Dim i, arr
 
        'Массив имен обязательных полей записанных в нужном порядке
        arr = Array("КодТипНедвижимости", "КодУлица", "№Дома")
 
        For i = 0 To UBound(arr)                                 'Цикл по массиву имен
            Debug.Print i, arr(i), Me.Controls(arr(i)).Name      'Распечатка последовательности прохода
            'Нужно прописать по пути: Окно свойств-другие-доплнительные сведения - значение "Обязательное"
            If Me.Controls(arr(i)).Tag = "обязательное" And IsNull(Me.Controls(arr(i))) Then
                Select Case MsgBox("Заполните поле " & Me.Controls(arr(i)).Name, vbOKCancel + vbExclamation + vbDefaultButton1)
                Case vbOK
                    Cancel = True 'отмена закрытия, возврат в форму
                    Me.Controls(arr(i)).SetFocus 'Me.Controls(arr(i)).SetFocus равнозначно Me![КодКлиент].SetFocus
            Exit Sub 'выходим из процедуры, иначе будут перебираться все контролы(поля)
                Case vbCancel
                    CurrentDb.Execute "delete * from Договора where КодНедвижимость=" & sID 'Удаляем только в такой последовательности:сначала подчиненная таблица, потом главная
                    CurrentDb.Execute "delete * from Недвижимость where КодНедвижимость=" & sID
                End Select
            Exit Sub 'выходим из процедуры, иначе будут перебираться все контролы(поля)
            End If
        Next
        'цикл для подчиненной формы:
        Me![ПодформаДоговора].SetFocus 'обязательно задаем фокус на подформу, иначе форма закроется и запись будет только в главной таблице, что нам не нужно!
        'Массив имен обязательных полей записанных в нужном порядке
        arr = Array("№Договора", "ДатаДоговора", "КодОперация", "КодКлиент", "КодСотрудник", "КодИсточникИнформации", "КодСтатус")
        For i = 0 To UBound(arr)                                 'Цикл по массиву имен
            Debug.Print i, arr(i), Me.[ПодформаДоговора].Controls(arr(i)).Name      'Распечатка последовательности прохода
            'Нужно прописать по пути: Окно свойств-другие-доплнительные сведения - значение "Обязательное"
            If Me.[ПодформаДоговора].Controls(arr(i)).Tag = "обязательное" And IsNull(Me.[ПодформаДоговора].Controls(arr(i))) Then
                Select Case MsgBox("Заполните поле " & Me.[ПодформаДоговора].Controls(arr(i)).Name, vbOKCancel + vbExclamation + vbDefaultButton1)
                Case vbOK
                    Cancel = True 'отмена закрытия, возврат в форму
                    Me.[ПодформаДоговора].Controls(arr(i)).SetFocus 'Me.[ПодформаДоговора].Controls(arr(i)).SetFocus равнозначно Me![КодКлиент].SetFocus
            Exit Sub 'выходим из процедуры, иначе будут перебираться все контролы(поля)
                Case vbCancel
                    CurrentDb.Execute "delete * from Договора where КодНедвижимость=" & sID 'Удаляем только в такой последовательности:сначала подчиненная таблица, потом главная
                    CurrentDb.Execute "delete * from Недвижимость where КодНедвижимость=" & sID
                End Select
            Exit Sub 'выходим из процедуры, иначе будут перебираться все контролы(поля)
            End If
        Next
End If
End Sub
0
texnik-san
шапоклякистка 8-го дня
3557 / 2188 / 389
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.04.2016, 18:48 #41
Я не знаю, что вам сказать. Я вообще не понимаю вашу задумку. При чем тут событие "выгрузка" к сохранению записи, как можно проверять заполнение полей разных форм в одной процедуре. И, только не обижайтесь пожалуйста, сейчас я не в состоянии вникать в чужую задачу. Мне бы вникнуть в свою собствненую.
0
sana555
338 / 38 / 2
Регистрация: 02.03.2016
Сообщений: 436
06.04.2016, 19:08 #42
Что вы, что вы...) Я вообще то, ни кого не принуждаю отвечать, у кого нет времени, а тем более желания - это дело сугуболичное... Какая может быть обида..., у всех свои заботы - на первом месте!
Цитата Сообщение от texnik-san Посмотреть сообщение
При чем тут событие "выгрузка" к сохранению записи, как можно проверять заполнение полей разных форм в одной процедуре.
Это я привел просто пример к тому, что возможно не применять код в подчиненной форме, и при этом проверять заполнение обязательных полей в главной и подчиненной. И это работает! Могу показать.
Цитата Сообщение от texnik-san Посмотреть сообщение
Я вообще не понимаю вашу задумку.
Цитата Сообщение от sana555 Посмотреть сообщение
Нужно произвести проверку делались ли изменения в главной и подчиненной форме, и если делались, то произвести запись кто и когда делал.
Можете не отвечать, я просто пояснил.
0
commun
372 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
06.04.2016, 21:30 #43
Нет,если нужна мягкая работа безо всяких обязательных полей и аварийных завершений, то нужно делать и вторую форму - такую же со свободными полями и кн. Ввод. Анализировать, что пользователь хочет ввести или изменить, и принимать решение или указывать на ошибки. Если форма небольшая, ленточная, то свободные поля можно разместить и в заголовке, а вторую форму не делать.
1
sana555
338 / 38 / 2
Регистрация: 02.03.2016
Сообщений: 436
06.04.2016, 21:48 #44
Как раз таки большая около 40 полей..), и не ленточная, а простая. Напомню что у меня форма с подформой, в обе из которых, одновременно вводятся значения. Подформа тоже простая, не ленточная или табличная. Правильно ли я вас понимаю, что вы предлагаете сделать форму клон, из которой данные попадают в две обычные формы, по нажатию кнопки? А тогда где будут находится эти две формы, в скрытом состоянии?
0
commun
372 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 857
06.04.2016, 23:35 #45
Формы не надо скрывать, их нужно делать видимыми или нет. А данные будет получать,анализировать и записывать экземпляр модуля класса,который Вы создадите.
0
06.04.2016, 23:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2016, 23:35
Привет! Вот еще темы с ответами:

Очистка поля при открытии формы - MS Access - MS Access
В поле вводится число и каждый раз разное. Нужно, чтобы при открытии формы поле очищалось. То есть число записывается, по кнопке данные...

Открытие формы с информацией при нажатии на запись в списке - MS Access
всем привет! помогите пожалуйста с курсовой, а то застряла на этом моменте... вопрос такой: возможно ли сделать так, чтобы в форме...

Access 2010 копирование данных ячеек при обновлении формы - MS Access
Здравствуйте, не получается скопировать данные из ячеек при обновлении формы ввода.. Подскажите, как это можно сделать?

Связать две формы при добавлении данных Access 2010 - MS Access
Доброго дня, тапками не кидаться, я только постигаю азы. Суть проблемы в следующем: Есть таблица/формы пользователи и сеть. В форме...


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

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

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