Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Kkarn
831 / 235 / 36
Регистрация: 02.12.2014
Сообщений: 1,030
#1

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

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

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

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

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

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

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

Закрытие access при закрытии формы
В общем такая проблема Вешаю на событие закрытия формы макрос ВыйтиИзAccess,...

46
ltv_1953
Эксперт MS Access
12801 / 5795 / 1099
Регистрация: 21.06.2012
Сообщений: 10,427
12.12.2014, 19:18 #2
Цитата Сообщение от Kkarn Посмотреть сообщение
Я так понимаю, нужно посадить на события формы, которые связаны с сохранением записи,
Именно так, все проверяется в событии Form_BeforeUpdate, отменяя сохранение записи, если условия не выполнены.
1
Kkarn
831 / 235 / 36
Регистрация: 02.12.2014
Сообщений: 1,030
12.12.2014, 21:31  [ТС] #3
Хорошо, а можно я тогда переформулирую вопрос? Допустим, мне нужно сделать так: если пользователь вводил данные в форму, потом нажал кнопку Закрыть, НЕ НАЖАВ при этом кнопку "Сохранить данные", которую я специально создал для этого в форме - то мне нужно, чтобы эти данные НЕ СОХРАНЯЛИСЬ в таблицу вообще, независимо от того, даже если пользователь ввел все нужные данные. Не нажал, закрыл - получай то, что данные не сохранились. Как такое реализовать правильно? Подскажите, пожалуйста, че-то я уже совсем заработался, не могу сообразить...
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 863
12.12.2014, 22:07 #4
Если обновлено поле КодЗаписи, то запись уже сохранена и в дальнейшем Вы только изменяете значения др.полей. Можно применять Условие на значение для нужных полей формы,но нужно, чтобы польз-ль захотел их посетить,а это можно с одним полем ,сделав ему 0-е Tab
0
Kkarn
831 / 235 / 36
Регистрация: 02.12.2014
Сообщений: 1,030
12.12.2014, 22:14  [ТС] #5
Я понимаю, что если обновлено поле КодЗаписи, то запись уже сохранена. Мне нужно, чтобы если пользователь не нажал мою кнопку Сохранить и просто закрыл форму - эта запись была УДАЛЕНА из таблицы.
0
mobile
Эксперт MS Access
22566 / 12884 / 2634
Регистрация: 28.04.2012
Сообщений: 14,090
12.12.2014, 22:37 #6
Когда Вы нажимаете крестик для выхода из формы, то запись уже в таблице. Уже сохранена. Восстановить (Undo) уже невозможно. Но можно удалить. Для удаления нужно точно знать какую запись удалять. Если в таблице есть уникальное поле, то это сделать нетрудно.
Например, можно с двумя глобальными (или уровня формы) переменными ID - уникальный номер записи и DRT - признак того, что была редакция записи. Тогда необходимые действия будут такими
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
Dim drt As Boolean, ID 'Объявляем переменные уровня формы
 
Private Sub Form_BeforeUpdate(Cancel As Integer) 'Событие формы До обновления
'Взводим флажок и запоминаем ид
    drt = True
    ID = Me.id
End Sub
 
Private Sub Сохранить_Click() 'Кнопка сохранить
'Снимаем флажок
    drt = False
End Sub
 
Private Sub Form_Current() 'Текущая запись
'Снимаем флажок
    drt = False
End Sub
 
Private Sub Form_Unload(Cancel As Integer) 
'На событии Выгрузка, если флажок взведен, то удалить запись
    If drt Then
        CurrentDb.Execute "delete * from Таблица where id=" & ID
    End If
End Sub
1
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 863
12.12.2014, 22:54 #7
ну а если так
0
Вложения
Тип файла: rar Контроль.rar (387.0 Кб, 20 просмотров)
Волшебник 307
1381 / 317 / 44
Регистрация: 16.04.2013
Сообщений: 756
Записей в блоге: 2
12.12.2014, 23:41 #8
Или сделать поля свободными.
Тогда ничего не сохранится.

А по кнопке Сохранить
выполнить запрос на добавление.
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 863
12.12.2014, 23:48 #9
Это еще правильнее,только запрос на добавление выполнится медленнее, чем код VBA
0
Волшебник 307
1381 / 317 / 44
Регистрация: 16.04.2013
Сообщений: 756
Записей в блоге: 2
12.12.2014, 23:58 #10

Запрос написать в коде VBA.
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 863
13.12.2014, 00:14 #11
это не меняет дела ни на одну нсек
0
Kkarn
831 / 235 / 36
Регистрация: 02.12.2014
Сообщений: 1,030
13.12.2014, 00:28  [ТС] #12
mobile, Спасибо большое, Вы меня в очередной раз выручаете, это оказалось как раз то, что нужно!
0
mobile
Эксперт MS Access
22566 / 12884 / 2634
Регистрация: 28.04.2012
Сообщений: 14,090
13.12.2014, 00:34 #13
Цитата Сообщение от Волшебник 307 Посмотреть сообщение
Или сделать поля свободными.
Тогда ничего не сохранится.
А по кнопке Сохранить
выполнить запрос на добавление.
Когда студенты создают свободные формы, я понимаю - это их максимум. Но когда Волшебник... А тот ли это волшебник?

Акцесс это реляционная база данных + формы, основанные на данных (исключение формы-контейнеры; свободные формы для поиска, фильтрации, задания параметров; кнопочные формы). Все остальное когда выполнены эти 2 условия. Если не выполнены, то акс не нужен. Есть масса других средств, более подходящих для решения таких задач.
0
Волшебник 307
1381 / 317 / 44
Регистрация: 16.04.2013
Сообщений: 756
Записей в блоге: 2
13.12.2014, 00:40 #14
на них и ориентируемся.
0
mobile
Эксперт MS Access
22566 / 12884 / 2634
Регистрация: 28.04.2012
Сообщений: 14,090
13.12.2014, 01:39 #15
Цитата Сообщение от Kkarn Посмотреть сообщение
Вы меня в очередной раз выручаете, это оказалось как раз то, что нужно!
А вот и нет

В предложенном выше решении был вариант только для новой записи. А если редактировалась существующая запись, то она бы тоже удалилась. Что наверное, никак не входит в Ваши планы.

Вот вариант с учетом редакции существующей записи. При этом все поля запоминаются в массиве на событии Текущая запись и, если не нажата кнопка Сохранить, то запись обновляется из массива
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
Dim drt As Boolean, ID, NewRec As Boolean, Rec 'Объявляем переменные уровня формы
 
Private Sub Form_BeforeUpdate(Cancel As Integer) 'Событие формы До обновления
'Взводим флажок и запоминаем ид
    drt = True
    ID = Me.id
End Sub
 
Private Sub Сохранить_Click() 'Кнопка сохранить
'Снимаем флажок
    Me.Dirty = False
    drt = False
End Sub
 
Private Sub Form_Current() 'Текущая запись
'Снимаем флажок. Если запись новая, взводим флажок NewRec
    Dim i
    NewRec = False
    drt = False
    If Me.NewRecord Then
        NewRec = True
    Else
        ReDim Rec(Me.Recordset.Fields.Count - 1)
        For i = 0 To UBound(Rec)
            Rec(i) = Me.Recordset.Fields(i)
        Next
    End If
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
'На событии Выгрузка, если флажок взведен, то удалить запись
    Dim i
    If drt And NewRec Then
        CurrentDb.Execute "delete * from Таблица where id=" & ID
    ElseIf drt And Not NewRec Then
        With Me.Recordset
            .Edit
            For i = 0 To UBound(Rec)
                .Fields(i) = Rec(i)
            Next
            .Update
        End With
    End If
End Sub
3
Kkarn
831 / 235 / 36
Регистрация: 02.12.2014
Сообщений: 1,030
13.12.2014, 14:17  [ТС] #16
mobile, Еще раз большое спасибо) Но, в принципе, у меня такой подход используется только в форме для добавления новых записей, эта форма не используется для редактирования других записей) Так что, в принципе, и старый вариант алгоритма работает хорошо. А за новый - отдельное спасибо, заберу, может где нибудь тоже подойдет)

Добавлено через 1 час 15 минут
Более того, уже пригодилось) Еще раз огромное спасибо!
0
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 863
13.12.2014, 17:19 #17
согласен,решение было сработано "на время"
0
Kkarn
831 / 235 / 36
Регистрация: 02.12.2014
Сообщений: 1,030
16.12.2014, 00:15  [ТС] #18
Это опять я) Мистика продолжается...
Применяя вышеуказанный код, натыкаюсь на ошибку времени исполнения Невозможно обновить поле, с остановкой программы на строке
.Fields(i) = Rec(i)
То есть в момент "возврата" старых значений из массива в запись. И что ему мешает?...

У меня тут другая мысль возникла. А как правильно присобачить на форму обыкновенное окно сообщения типа "Сохранить внесенные изменения? Да, Нет, Отмена" ?...
0
mobile
Эксперт MS Access
22566 / 12884 / 2634
Регистрация: 28.04.2012
Сообщений: 14,090
16.12.2014, 01:58 #19
Цитата Сообщение от Kkarn Посмотреть сообщение
Мистика продолжается...
Боюсь, что без самой бдшки не разобраться. Надо видеть ситуацию.

Цитата Сообщение от Kkarn Посмотреть сообщение
А как правильно присобачить на форму обыкновенное окно сообщения типа "Сохранить внесенные изменения? Да, Нет, Отмена" ?...
Используется Msgbox с параметром vbYesNoCancel. Анализируется ответ юзера (vbYes, vbNo, vbCancel) и принимается соответствующее решение. В хелпе и по форуму примеров немеряно
1
commun
426 / 217 / 10
Регистрация: 29.10.2014
Сообщений: 863
16.12.2014, 12:04 #20
И что за свойство Me.id? из какой библиотеки?
0
16.12.2014, 12:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2014, 12:04

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

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

Авторизация в Access при входе в свою учетную запись на ПК + пароль
Всем привет! Нашел одну из интересных примеров авторизации в Access. В Форме...


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

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

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