Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Обработка ошибок


Автор: Yashustik 26.8.2008, 14:57
Помогите решить такую проблему: у меня есть таблица с обязательными для ввода полями, при попытке закрытия таблицы Access ругается если хотя бы одно из этих полей не заполнено. Как можно обработать эту ошибку, чтобы в корректной форме пользователь мог отказать от сохренения такой записи.

Автор: Akina 26.8.2008, 15:07
А почему пользователю вообще дозволено напрямую работать с таблицами??? для этого существуют формы ввода - связанные или свободные.

Автор: Yashustik 26.8.2008, 15:10
Так он и работает через ленточную форму, данных вводить надо много, в какой то момент он передумал заводить все доконца и решил закрыть форму, вот тут то ошибки и побежали, пользователь пугается, нельзя ли его более корректно предупредить что данные не сохранятся(точнее только последняя запись)

Автор: Akina 26.8.2008, 15:53
А вы используйте Default Value для каждого поля - никаких предупреждений и не будет. А если дефолтные значения будут формально валидны, но смысловО нелогичны - выслеживание таких "недоделанных" записей, случайно попавших в таблицы, станет очень простым делом. Их можно будет и исключить из обработки, и предлагать на редактирование при следующем открытии формы ввода.

Хотя по-хорошему надо бы оторвать форму от таблицы и записывать туда сразу всю запись со всеми полями. Программненько. По кнопочке. А заодно проверять, чего там оператор навносил...

Автор: Yashustik 26.8.2008, 16:02
Попробовала везде по умолчанию забить нули, но ошибка все равно вываливается...:(

Автор: Yashustik 26.8.2008, 16:35
Попробовала сделать так, но даже после закрытия формы сообщение об ошибке все равно вылетает :(
Код

Private Sub Form_Error(DataErr As Integer, Response As Integer)
Dim strMsg As String
DoCmd.SetWarnings False
    strMsg = "Заполнены не все обязательные поля!"
    strMsg = strMsg & " Нажмите ДА для редактирования или НЕТ для отмены изменений и закрытия формы."
    If MsgBox(strMsg, vbQuestion + vbYesNo, "Редактировать данные?") = vbYes Then
        'do nothing
    Else
        DoCmd.RunCommand acCmdUndo
        DoCmd.Close
        
    End If
    DoCmd.SetWarnings True
End Sub

Автор: bopoha 26.8.2008, 16:50
А как именно аксес рукгается?

Цитата(Yashustik @  26.8.2008,  16:02 Найти цитируемый пост)
Попробовала везде по умолчанию забить нули, но ошибка все равно вываливается...:( 


Есть подозрение, что не на обязательное поле ругается. 
Возможные шаги для решения:
1. Обратите внимание на текстовые поля. Например, Null вводить нельзя, а он естественно вводится. Или нельзя вводить пустые значения.
2. При этом еще проверте по структуре таблицы условия на значения полей.
3. Найдите это поле (или несколько), при не заполнении которого, происходит ошибка.

Автор: Yashustik 26.8.2008, 16:54
Мне в принципе не важно на что ругается, главное, чтобы была возможность у пользователя несохранять недоделанную по каким бы то причинам запись, откатиться назад, либо просто выйти без сохранения.

Автор: Akina 26.8.2008, 17:10
Цитата(Yashustik @  26.8.2008,  17:35 Найти цитируемый пост)
даже после закрытия формы сообщение об ошибке все равно вылетает 

А сообщение об ошибке не связано с формой, оно генерируется подсистемой контроля целостности данных.

Цитата(Yashustik @  26.8.2008,  17:02 Найти цитируемый пост)
Попробовала везде по умолчанию забить нули, но ошибка все равно вываливается

Значит, где-то что-то пропускаете. Забивайте не тупые нули, а осмысленные формально валидные значения. А то ноль, скажем, в дате, ну никак контроля не пройдет...

Добавлено через 52 секунды
Цитата(Yashustik @  26.8.2008,  17:54 Найти цитируемый пост)
несохранять недоделанную по каким бы то причинам запись, откатиться назад, либо просто выйти без сохранения. 

Код

Me.Undo

Автор: bopoha 26.8.2008, 17:13
Нужно же понять почему и где.
Попробуйте обработать ошибку (штатными средствами VB - On error) в события до вставки и до обновления (только я не уверен, что это может помочь).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)