Как сделать сообщение об ошибке в аксесс

Обновлено: 04.07.2024

В каждую функция или процедуру следует включать обработку ошибок. Без нее пользователь может оказаться глядящим на дефектный код в открытом редактороме VBA в полной версии Аксесс, а в рантайм версии приложение просто падает.. Более подробно обработка ошибок изложена в статье FMS Error Handling and Debugging.

Для задач, где есть возможность нескольких ошибок, строки 7-8 нужно заменить более подробным вариантом:

Ветка Case Else в этом примере вызывает пользовательскую функцию записи деталей ошибки в таблицу. Это позволит подробнее разобраться уже после того, как ошибка будет очищена. Таблицу можно назвать "tLogError" и состоять она будет из следующих полей:

Below is a procedure for writing to this table. It optionally allows recording the value of any variables/parameters at the time the error occurred. You can also opt to suppress the display of information about the error.

Ниже процедура для записи в эту таблицу. Она опционально позволяет записывать значения переменных/параметров во время возникновения ошибки. Можно также подавить вывод информации об ошибке на экран.

Замечания по функции:

Примечание переводчика: использование описанной и других подобных функций особенно удобно в сочетании с применением инструмента разработчика MZ_Tools, позволяющего (в числе прочего) настраивать шаблон обработчика ошибок с автогенерируемыми названиями текущей процедуры и модуля.

Метод Raise использует пять аргументов : Number, Source, Description, HelpFile и HelpContext. (Эти аргументы такие же, как и в объекте Err .) Синтаксис должен быть таким:

Err.Raise (Number, Source, Description, HelpFile, HelpContext)

При использовании именованных параметров можно указывать только необходимые аргументы, что делает код самоописательным:

Для изучения свойств и методов объекта Err необходимо воспользоваться браузером объектов. В любом модуле кода можно нажать клавишу F 2, выбрать библиотеку VBA и щелкнуть на объекте Err Object в списке классов. Затем можно просмотреть все свойства и методы. Для получения справки по тому или иному свойству либо методу необходимо на-

Реагирование на возникновение ошибок

Значительную часть кода в процедуре обработки ошибок должен занимать оператор Select Case . Следует попытаться учесть все возможные ошибки, которые могут произойти, и создать список номеров ошибок в выражении Select Case обработчика ошибок. Затем можно создать код обработки для каждой ошибки.

Ожидаемая ошибка может быть обработана различными способами:

• Ошибку можно проигнорировать и продолжить выполнение кода.

• Ошибку можно проигнорировать и выйти из процедуры.

• Можно принять меры по исправлению ошибки в коде для продолжения успешного выполнения кода.

• Можно осуществить переход в другое место кода. Приведенный ниже код иллюстрирует вышесказанное:

Select Case Err.Number

If MsgBox("You divided a number by zero, enter a " & _

" different number. Do you want to try again? ", _

vbQuestion + vbYesNo) = vbYes Then

MsgBox "An unexpected occurred. Error Number: " & _

Err.Number & " Error Description: " & Err.Description

Select Case Err.Number

' Общая процедура, обрабатывающая файловые ошибки.

MsgBox "An unexpected occurred. Error Number: " & _

Err.Number & " Error Description: " & Err.Description

Описанные ниже операторы Resume позволяют осуществить в программе переход к другим выражениям кода при возникновении ошибки.

Данное выражение передает управление в строку кода, следующую за той строкой, где произошел сбой. Таким образом, можно выполнить оставшийся код процедуры.

Приведенная на рис. 3 диаграмма иллюстрирует ход выполнения программы в случае использования разных операторов Resume :


РИСУНОК 3. Обработка ошибок с помощью оператора Resume .

Получение дополнительной информации об ошибках

Хотя объект Err предоставляет значительный объем информации, он не может охватить все, что нужно. Хороший обработчик ошибок должен предоставлять следующую дополнительную информацию об ошибке:

• Line number ( Номер строки ). Идентифицирует номер строки, в которой возникла ошибка. Следует учесть возможность использования определенного диапазона номеров строк в каждом модуле. Номера строк можно вставить в левой части модуля перед выражениями. С помощью опции глобального поиска, имеющейся в Access , можно быстро перейти к необходимой строке, в которой произошла ошибка, если номера строк не повторяются. В процедуре номера строк не обязательно должны следовать по порядку.

Объект Err не сообщает номер строки. Чтобы получить номер строки, необходимо применить функцию Ег1, которая используется в примерах данной статьи.

Name of the form or report ( Имя формы или отчета ). Сообщает имя формы или отчета, в котором произошла ошибка. Это всего лишь простая передача имени формы или отчета в обработчик ошибок.

Name of procedure ( Имя процедуры ). Сообщает имя процедуры, в которой произошла ошибка.

Name of active control (Имя активного элемента управления). Сообщает имя активного элемента управления в момент возникновения ошибки.

Value of active control (Значение активного элемента управления). Сообщает значение активного элемента управления в момент возникновения ошибки. Часто ошибка происходит только при определенных значениях, введенных в элемент управления. Если, например, ошибка возникает, когда в текстовое поле вводится значение больше 20000, данный тип ошибки можно легко идентифицировать, возвращая значение текстового поля для записи в обработчик ошибок.

Активный элемент управления передается в обработчик ошибок. Одни элементы управления содержат значение, другие — нет. Обработчик ошибок должен передать ActiveControl в процедуру, которая оценивает тип элемента управления с помощью встроенной функции TypeOf . Если элемент представляет собой текстовое поле, можно получить значение, записанное в текстовом поле, для обработчика ошибок. Однако, если, например, элемент является г командной кнопкой, не следует пытаться получить значение во избежание ошибок.

ID of current record (ID текущей записи ). Сообщает ID текущей записи формы в момент возникновения ошибки. Бывают случаи, когда некоторые записи о клиентах являются причиной большинства программных ошибок. Возвращая ID текущей записи, можно сравнить данную запись о клиенте с другими, не вызывающими ошибок. Часто причиной возникновения такой ошибки является то, что в обязательном поле отсутствуют данные.

Name of program ( Имя программы ). Сообщает имя приложения, в котором произошла ошибка.

Error level (Уровень ошибки). Произвольный набор значений ошибок, устанавливаемый разработчиком, например, 1-5. Получив данную информацию, можно судить о серьезности ошибки.

Вызов API Windows для получения информации о текущем пользователе Windows 95/98/NT проиллюстрирован примерами кода обработчика ошибок, приведенными в данной статье. (См. свойство UserName и функцию GetUserName,)

• Date and time ( Дата и время ). Дата и время возникновения ошибки. Эта информация полезна для анализа частоты возникновения ошибок. Простой график должен показывать, что со временем программные ошибки возникают реже.

Благодаря информации, которая может быть получена с помощью объекта Err и других методов, разработчики могут быстро и эффективно устранить ошибки рабочего цикла.

Комплексный обработчик ошибок

Теперь, разобравшись с составлением обработчика ошибок на уровне процедуры и получением информации об ошибке, можно создать комплексный обработчик ошибок.

Вначале необходимо принять решение о структуре обработчика ошибок и о том, куда следует помещать код. Конечно же обработчик ошибок можно целиком поместить в каждую процедуру. Однако такой подход совершенно неэффективен. Кроме того, при дальнейшей модификации обработчика ошибок пришлось бы вносить изменения в каждой процедуре.

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

Гораздо более эффективный подход — использование глобального обработчика ошибок для всего приложения Access . Глобальный обработчик ошибок представляет собой объект, созданный с помощью модуля класса.

Модуль класса (объект) ошибки

Модуль класса с именем сЕггог в коде данной главы содержит свойства и методы, необходимые для эффективного обработчика ошибок. Объект сЕггог включает в себя весь код модуля класса. Благодаря технологии Microsoft IntelliScnsc использование данного объекта является очень простым.

Свойства объекта сЕггог

Объект сЕггог содержит свойства, значения которых могут быть использованы обработчиком ошибок. Описание приводится в табл. 1.

Таблица 1. Свойства сЕггог.

Название программы, создавшей приложение (например, MS Access ).

Имя и полный путь к видеофайлу AVI , который используется для предупреждения об ошибке в форме или диалоговом окне.

Имя модуля класса.

Имя компьютера, на котором произошла ошибка.

Общий объем памяти, установленный в компьютере.

Объем доступной памяти в компьютере.

Информация об операционной системе и версии.

Информация о процессоре компьютера.

Имя активного элемента управления.

Значение активного элемента управления.

ID текущей записи.

Описание ошибки, возвращаемое объектом Егг.

Имя и полный путь к базе данных (например, базе данных Access или SQL Server ), содержащей таблицу ошибок.

Номер ошибки, возвращаемы объектом Err .

Имя и полный путь к текстовому файлу, содержащему информацию об ошибке.

ID статьи файла справки, возвращаемый объектом Егг.

Имя и полный путь к файлу справки, возвращаемые объектом Err .

Код системной ошибки для последнего вызова DLL .

Произвольно установленное значение для определения уровня срочности реагирования на ошибку.

Номер строки оператора, в котором возникла ошибка.

Примечание пользователя о том, что он делал во время возникновения ошибки.

Дата и время возникновения ошибки.

Имя и полный путь к звуковому файлу.

Имя объекта или приложения, сгенерировавшего ошибку.

Имя пользователя, у которого произошла ошибка.

Флаг, использующийся в целях установки состояния ожидания, необходимого для останова выполнения кода

Флаг, указывающий, поступал ли пользователю запрос на ввод примечания относительно ошибки.

Методы объекта cError

Методы объекта сЕггог обеспечивают разработчиков полезной информацией об ошибке. Например, информация об ошибке может быть отправлена разработчику по электронной почте или записана в базу данных . Методы объекта cError описаны в табл. 2.

Таблица 2. Методы cError.

Добавляет информацию об ошибке в календарь Outlook , вызвавший Error Handler .

Очищает объект Егг.

Получает значение активного элемента управления при возникновении ошибок.

При возникновении ошибки вызывает Office Assistant (помощника) и спрашивает пользователя, не желает ли он ввести примечание, относящееся к ошибке.

Воспроизводит звук при возникновении ошибки для привлечения внимания пользователя.

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

Вызывает форму, включающую AVI-файл, для оповещения пользователей о возникновении ошибки

Отображает окно ввода для пользователя, чтобы они могли ввести свои замечания.

Создает состояние ожидания для остановки выполнения кода.

Записывает информацию об ошибке в таблицу ошибок базы данных.

Записывает информацию об ошибке в текстовый файл.

Просмотр объекта cError в браузере объектов

Объект cError, приведенный в коде данной главы, содержит много свойств и методов. Для быстрого просмотра свойств и методов объекта необходимо открыть браузер объектов и выбрать модуль класса cError (рис. 4).


РИСУНОК 4 . Объект cError в браузере объектов .

При возникновении программной ошибки обработчик ошибок в процедуре передает информацию в Объект сЕггог. Метод ProssesError определяет, как обрабатывается ошибка. Данный метод отсылает к таблице tbIErrorOptions (которая рассматривается далее в данной главе) за дополнительной информаци-ей, например, о том, вводили ли пользователи примечания об ошибке и было ли отослано электронное сообшение с информацией об ошибке. Ниже приводится код метода ProssesError :

Public Sub ProcessErrorO

Dim rst As ADODB. Recordset

Dim strSQL As String

Dim strVal As String

strSQL = "SELECT * FROM tbIErrorOptions"

' Создание набора записей ADO .

Set rst = New ADODB.Recordset

' Открытия набора записей ADO .

rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, _

Me.AVIFileLocation = CurrentProject.Path & rst!AVIFileLocation

Me.SoundFile = CurrentProject.Path & rst!SoundFile

If rat!PlaySound Then

' Воспроизведение звука при возникновении ошибки.

If rst!ShowOfficeAssistant Then

If rst!ShowAVIForm Then

' Вызов AVI -формы.

' Состояние ожидания до закрытия формы.

' Закрытие AVI -формы.

DoCmd.Close acForm, "frmErrorAVI", acSaveNo

' Открытие формы для ввода примечания пользователя.

DoCmd.OpenFonn "frmErrorNote", acNormal

' Состояние ожидания до закрытия формы. Me.WaitState (True)

' Закрытие формы для примечания.

DoCmd.Close acForm, "frmErrorNote", acSaveNo

If rst!ErrorsToAccessTable Then

' Запись ошибки в таблицу ошибок Access .

If rst!ErrorsToTextFile Then

' Запись ошибки в текстовый файл.

If rst!ErrorsToTextFile Then

If rst!AddToErrorHandlerCalendar Then

If ret!ShowMsgBoxErrors Then

' Отображение формы, которая сообщает пользователю, безопасно

' ли продолжать работу. Форма автоматически закрывается

' с помощью таймера.

DoCmd.OpenForm "fnnErrorDoir", acNormal

Set rst = Nothing

Данный метод полагается на свойства, а также другие методы объекта сЕггог. Дополнительную информацию можно найти в коде модуля класса сЕггог.

Ошибки с точки зрения конечного пользователя

Как должна выглядеть обработка ошибок для конечного пользователя? Во-первых, необходимо привлечь внимание пользователя, чтобы он немедленно прекратил работу. Следует помнить, что ошибка может оказаться критической и стать причиной записи поврежденных данных в базу данных.

Путем вызова нескольких методов сЕггог можно отобразить Office Assistant , AVI-форму и воспроизвести звуковой файл для уведомления пользователя об ошибке (рис. 5). В коде главы приведена AVI-форма, сообщающая пользователю об ошибке (рис. 6). Если воспользоваться модулем класса сЕггог, соответствующий код должен быть таким:

CError.OfficeAssistant cError.AVIFonn сЕггог .Sound



Затем можно использовать объект сЕггог для отображения формы примечания об ошибке или окна ввода, которые позволяют пользователям описать свои действия во время возникновения ошибки (рис. 7). Вполне вероятно, что многие пользователи с удовольствием воспользуются возможностью помочь разработчику. Форма Error Note указывает, что ввод примечания необязателен.


РИСУНОК 7. Форма позволяет пользователям ввести примечание.


Последний шаг — сообщить пользователю, что ошибка записана и можно продолжать работу (рис. 9). Эту задачу выполняет форма, автоматически закрывающаяся через три секунды.


Обнаружение проблем, возникающих при работе компьютеров

Бывают случаи, когда некоторые компьютеры в офисе постоянно генерируют программные ошибки. Эту проблему, возможно, сложнее всего решить. Проблема может быть связана с аппаратным обеспечением, конфигурацией компьютера, конфликтами с другими приложениями или еще чем-нибудь другим.

Обратите внимание, что обработчик ошибок содержит несколько методов для решения данных проблем. Объект сЕггог включает свойства (см. табл. 1) для получения сведений об имени компьютера, объеме общей и доступной памяти в компьютере, операционной системе и типе процессора.

Вся эта информация может оказаться полезной при попытках определить, почему одна рабочая станция генерирует ошибки, в то время как другие компьютеры в организации работают нормально. Наиболее часто возникают проблемы с памятью, поэтому при появлении ошибки необходимо проверить объем общей и свободной памяти.

После рассмотрения процесса обработки ошибок с точки зрения пользователя необходимо ознакомиться с тем, что же дает обработчик ошибок разработчику. С помощью объекта сЕггог можно скомпилировать и проанализировать программные ошибки несколькими способами:

• Error handler Access report ( Отчет Access об обработке ошибок ). Отчет обработчика ошибок в базе данных Access содержит всю информацию из таблицы ошибок для всех ошибок (рис. 10).


РИСУНОК 10. Отчет Access обо всех ошибках


• Save error information in an Access database ( Сохранение информации об ошибках в базе данных Access). С помощью метода WriteErrorToTable при каждом возникновении ошибки можно записать ошибку в таблицу ошибок в базе данных Access .

• 5 ave error information in a text file (Сохранение информации об ошибках в текстовом файле). С помощью метода WriteErrorToTextFile можно записать все ошибки в выбранный текстовый файл для последующего анализа.

• Save error information or an Outlook calendar ( Сохранение информации об ошибках в календаре Outlook). Все ошибки можно записать в календарь Outlook , так что данные могут быть отображены в различных встроенных представлениях Outlook либо в пользовательском представлении. Метод AddToErrorHandlerOutlookCalendar упрощает отправку всей информации об ошибках в календарь обработчика ошибок (рис. 12).


РИСУНОК 12. Календарь обработчика ошибок Outlook .

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

Опции обработки ошибок

Комплексный обработчик ошибок обладает множеством опций и возможностей. В одних организациях могут понадобиться все опции, содержащиеся в объекте сЕггог, в других — лишь часть из них. Все опции записаны в таблице tbIErrorOptions .

Есть созданая в Access БД, там есть таблица, так вот при попытке занести в таблицу значение выдаёт сообшение о не возможности модификации поля.

Поле является ключевым, имеет связь, тип:Числовой

Form1.ADOTable1.Insert;
Form1.ADOTable1.Fields[0].AsInteger:=Form1.ADOTable1.RecordCount+1;//ВОТ СЮДА РУГАЕТСЯ.
Form1.ADOTable1.Fields[1].AsString:=Edit1.Text;
Form1.ADOTable1.Fields[2].AsString:=Edit2.Text;
Form1.ADOTable1.Fields[3].AsString:=Edit3.Text;
Form1.ADOTable1.Fields[4].AsInteger:=StrTOINt(Edit4.Text);
Form1.ADOTable1.Post;

в чём проблема и как её можно решить?
Заранее спасибо.

попробуй так:
[highlight=delphi]
with Form1.ADOTable1 do
begin
a := RecordCount + 1;
Insert;
Fields[0].AsInteger := a;
Fields[1].AsString:=Edit1.Text;
Fields[2].AsString:=Edit2.Text;
Fields[3].AsString:=Edit3.Text;
Fields[4].AsInteger:=StrToInt(Edit4.Text);
Post;
end;
[/highlight]

Оно, случайно, не автоинкрементальное? Тогда задавать его не надо. Кстати, если там числа идут не по порядку(допустим 1,2,3,5), то RecordCount+1 даст повторение.

если инкрементальное, тогда просто сделать так:
[highlight=delphi]
with Form1.ADOTable1 do
begin
insert;
Fields[1].AsString:=Edit1.Text;
Fields[2].AsString:=Edit2.Text;
Fields[3].AsString:=Edit3.Text;
try
Fields[4].AsInteger:=StrToInt(Edit4.Text);
except
ShowMessage('Вы ОБЯЗАНЫ ввести число, неужели не понятно?!');
exit;
end;
post;
end;
[/highlight]
и переименуй эти ужасные EditX, FormX, ADOQueryX. Ведь гораздо удобнее было бы TextEdit, MainForm и т.д.

Ошибка - поле не может быть модифицированио. А в структуре мы видим, что поле индексировано - совпадения не допускаются. Что это значит? Ты пытаешься присвоить этой ячейке значение, которое уже имеется в этом поле. попробуй сделать так, как написано в моем посте выше.

по любому попробуй не изменять это поле. сделай его вообще счетчиком и будет тебе радость. и вообще, ты сам то как-нибудь экспериментируй, котгда ошибки появляются. тычь в небо почаще ;) например выясни после insert'a вставь ShowMessage(IntToStr(Form1.ADOTable1.RecordCount)); посмотри, что там будет

С методом научного тыка знаком давно

Делал, там всё вроде как гуд.

Ша попробую счётчик, но он мне не очень подойдёт.

почему? просто если ты будешь изменять другие таблицы определяй id этого человека из таблицы Tab1 и вноси его в другие. ну типа

Как триггеры Runtime Error 0 и что это такое?

Ошибка 0 Crash - программа обнаружила ошибку 0 из-за указанной задачи и завершила работу программы. Если данный ввод недействителен или не соответствует ожидаемому формату, Microsoft Access (или OS) завершается неудачей.

Ошибка 0 Logic Error - Компьютерная система создает неверную информацию или дает другой результат, даже если входные данные являются точными. Он материализуется, когда исходный код Microsoft Corporation ошибочен из-за неисправного дизайна.

Такие проблемы Access 2007 Error 0 обычно вызваны повреждением файла, связанного с Microsoft Access, или, в некоторых случаях, его случайным или намеренным удалением. Большую часть проблем, связанных с данными файлами, можно решить посредством скачивания и установки последней версии файла Microsoft Corporation. Запуск сканирования реестра после замены файла, из-за которого возникает проблема, позволит очистить все недействительные файлы Access 2007 Error 0, расширения файлов или другие ссылки на файлы, которые могли быть повреждены в результате заражения вредоносным ПО.

Ошибки Access 2007 Error 0

Общие проблемы Access 2007 Error 0, возникающие с Microsoft Access:

  • «Ошибка программного обеспечения Access 2007 Error 0. «
  • «Недопустимый файл Access 2007 Error 0. «
  • «Извините, Access 2007 Error 0 столкнулся с проблемой. «
  • "Файл Access 2007 Error 0 не найден."
  • "Access 2007 Error 0 не найден."
  • «Ошибка запуска в приложении: Access 2007 Error 0. «
  • «Не удается запустить Access 2007 Error 0. «
  • «Access 2007 Error 0 остановлен. «
  • "Неверный путь к приложению: Access 2007 Error 0."

Истоки проблем Access 2007 Error 0

Эти проблемы Access 2007 Error 0 создаются отсутствующими или поврежденными файлами Access 2007 Error 0, недопустимыми записями реестра Microsoft Access или вредоносным программным обеспечением.

Читайте также: