Отправка электронного сообщения об отдельной программной ошибке.
• Email all errors (Электронное сообщение обо всех ошибках). Можно отправить по электронной почте всю информацию об ошибках в таблице ошибок в качестве вложения в сообщение Outlook с помощью метода
Таблица ошибок сохраняется как таблица Excel и вкладывается в электронное сообщение.
• Save error information in an Access database (Сохранение информации об ошибках в базе данных Access). С помощью метода
при каждом возникновении ошибки можно записать ошибку в таблицу ошибок в базе данных Access.
• 5ave error information in a text file (Сохранение информации об ошибках в текстовом файле). С помощью метода
можно записать все ошибки в выбранный текстовый файл для последующего анализа.
• Save error information or an Outlook calendar (Сохранение информации об ошибках в календаре Outlook). Все ошибки можно записать в календарь Outlook, так что данные могут быть отображены в различных встроенных представлениях Outlook либо в пользовательском представлении. Метод
упрощает отправку всей информации об ошибках в календарь обработчика ошибок (рис. 12).
РИСУНОК 12. Календарь обработчика ошибок Outlook.
Пользуясь одним или несколькими из указанных методов, можно получить немедленное уведомление о возникновении ошибки. Будет собрана вся необходимая для обнаружения и исправления ошибки информация, которую, кроме того, можно использовать при дальнейшем анализе.
Отключение панели задач
Отключение панели задач
Ранее в этой главе описывалось, как использовать ссылки панели задач для открытия или создания файлов. Панель задач отображается автоматически при запуске Access и содержит ссылки для открытия и создания не только базы данных, но и некоторых проектов Access. При необходимости отключить панель задач выполните такие действия.
1. Выберите команду Сервис >Параметры.
Отладка с помощью окон сообщений
Раньше при отладке часто использовались окна сообщений. Идея заключается в том, чтобы разместить в окне кода окна сообщений для более легкого способа обнаружения ошибки:
Sub Demo()
MsgBox 1
Select Case rst.States
MegBox 2
Case "Washington"
MsgBox 3
MsgBox "Washington"
MsgBox 4
Case "Oregon"
MsgBox 5
MsgBox "Oregon"
MsgBox 6
Case "California"
MsgBox 7
MsgBox "California"
MsgBox 8
End Select
MsgBox 9
End Sub
Наблюдая за тем, какое окно сообщений появляется перед сбоем, разработчик может определить строку кода, содержащую ошибку. Гораздо более удобный подход — установить точку прерывания и выполнять код в режиме прерываний. Установка точки прерывания более удобна, потому что:
• Установить прерывание гораздо быстрее, чем вводить массу окон сообщений.
• Окна сообщений модальны, поэтому нельзя переключиться в окно кода для просмотра.
• При выполнении кода в режиме прерываний можно наблюдать значения переменных, изменять их и т.д.
• После исправления ошибки не нужно удалять окна сообщений.
• Можно не беспокоиться о случайном распространении приложения с оставшимися окнами сообщений.
Отсчет с 0 или 1?
В VBA для одних элементов отсчет начинается с 0, а для других — с I. Например, массивы начинают отсчет с 0, а множества — с 1. Если неизвестно, с какого значения начинается нумерация, это необходимо обязательно выяснить. Неправильная догадка может стать причиной ошибки.
Панель инструментов База данных
Панель инструментов База данных
Познакомимся с панелью База данных, которая появляется на экране после запуска Access (рис. 2.13). Даже когда открыта какая-либо база данных, большая часть из представленных здесь значков отключена. Более того, состав доступных элементов панели инструментов автоматически обновляется при переходе от одного объекта Access к другому. В табл. 2.2 описаны все значки указанной панели (перечислены в порядке следования).
Переключение True и False
Установку флага в положение "истинно" (true) или "ложно" (false) не обязательно проверять с помощью условия
If...Then...Else. Можно сохранить время и уменьшить объем кода, изменив значение на обратное с помощью оператора NOT. Установив булеву переменную в значение, которое не присвоено данной переменной, получим обратное значение. Ниже приводится соответствующий пример кода:
Вместо этого фрагмента:
If bFlag = False then
bFlag=True
Else
BFlag=False
EndIF
можно использовать строку:
bFlag=Not bFlag
Выполнение одной строки кода занимает намного меньше времени, чем выполнение нескольких строк с оценкой.
Перемещение в окне отладки
Для передвижения курсора используются мышь и клавиши со стрелками. С помощью клавиши Home можно передвинуть курсор к началу текущей строки кода, а с помощью клавиши End — к концу строки.
Клавиши Page Up и Page Down позволяют переместиться на страницу вверх и вниз соответственно. Для установки курсора в начало окна Immediate необходимо нажать клавиши Ctrl+Home. Для перехода в конец окна отладки используется комбинация клавиш Ctrl+End.
Переносимость кода
Поскольку модуль класса является автономной единицей кода, его с легкостью можно использовать в разных приложениях Access.
Подведем итоги...
Подведем итоги...
В этой главе мы познакомились с главным рабочим окном Access, панелью инструментов, строкой меню и панелью задач (в следующих главах приводится более подробное описание этих элементов). Кроме того, вы узнали:
- как запустить Access;
- как открыть и создать файл базы данных;
- что такое элементы интерфейса главного рабочего окна Access.
Полезные функции обработки ошибок
Ниже приводятся полезные функции обработки ошибок:
• IsError
— используется для определения того, является ли Variant типом данных ошибки (возвращает булево значение).
• CVErr
— преобразовывает значение
в тип данных ошибки, присваивая его переменной типа Variant.
Полезные советы
Поскольку значительную часть времени разработчик проводит в работе с окном Immediate, приведенные ниже советы могут оказаться полезными.
Получение дополнительной информации об ошибках
Обработчик ошибок должен автоматически записывать всю информацию об ошибках, которая необходима разработчику. Чем больше информации соберет обработчик ошибок, тем легче разработчику обнаружить и исправить ошибку.
Хотя объект
Err предоставляет значительный объем информации, он не может охватить все, что нужно. Хороший обработчик ошибок должен предоставлять следующую дополнительную информацию об ошибке:
• Line number (Номер строки). Идентифицирует номер строки, в которой возникла ошибка. Следует учесть возможность использования определенного диапазона номеров строк в каждом модуле. Номера строк можно вставить в левой части модуля перед выражениями. С помощью опции глобального поиска, имеющейся в Access, можно быстро перейти к необходимой строке, в которой произошла ошибка, если номера строк не повторяются. В процедуре номера строк не обязательно должны следовать по порядку.
Построение конструкции Select Case
При использовании конструкции Select
Case наиболее часто встречающиеся случаи следует разместить в верхней части структуры. Поскольку проверяется каждый случай по порядку, такая компоновка позволяет обеспечить максимально быстрый выход из структуры.
Повторное выполнение кода
После обнаружения и исправления ошибки в пошаговом режиме можно выполнить код повторно, не останавливаясь и не перезапуская приложение. Желтая стрелка на левой границе показывает, какой оператор кода будет выполнен следующим. Можно щелкнуть на желтой стрелке, перетащить се вверх к предыдущей строке кода и выполнить код повторно.
Повышение производительности запросов
Хотя пользователи могут никогда и не увидеть запрос в приложении, большую часть работы выполняют именно запросы. Реляционная база данных была бы бесполезной без возможности выполнять запросы к данным. Однако запросы создаются по-разному. Даже если разработчик принял все меры для нормализации данных и создал все необходимые индексы, можно иметь запросы, которые выполняются не так быстро, как могли бы. Может даже существовать два запроса, дающие идентичный результат, но выполняющиеся по-разному.
Чтобы понять, как оптимизировать запросы, необходимо понимать,
как их обрабатывает
Jet
. Каждый запрос проходит четыре этапа:
1. Определение — создается SQL-оператор с помощью одного из нескольких инструментальных средств.
2. Компиляция — SQL-строка разбивается на составные части.
3. Оптимизация — используя алгоритм оценки стоимости. Jet формулирует и тестирует несколько различных способов получения результата, который удовлетворяет данному SQL-оператору.
4. Выполнение — используя план оптимизации, Jet передает результирующий набор пользователю.
Можно определить запрос с помощью QBE Grid, SQL-строки, выполняющейся в коде, SQL-строки в свойстве источника формы, отчета или элемента управления либо с помощью любого другого средства, которое способно создавать SQL-операторы.
Jet размещает составные части строки в иерархической внутренней структуре. Эти части весьма напоминают ключевые слова SQL-оператора. В основе лежат базовые таблицы, используемые запросом (Из). Потом устанавливаются столбцы результата (Выбор). Далее следуют условия отбора или ограничения, заданные запросом (Где). Затем оцениваются отношения базовых таблиц (Объединение). Наконец, происходит сортировка результирующего набора (Сортировка). Такая структура переходит в фазу оптимизации.
Оптимизация представляет собой самый сложный этап. Jet оценивает и рассчитывает стоимость каждого возможного подхода. Это делается путем рассмотрения запроса под двумя различными углами: с точки зрения доступа к базовым таблицам и с точки зрения исследований связей между ними. Понимание действий Jet может способствовать разработке более быстрых запросов в дальнейшем.
Для Jet существует три способа получения строк данных из таблиц:
• Сканирование. Это самый дорогостоящий подход. При сканировании Jet должен прочесть каждую строку информации без использования индекса. Запрос вынуждает Jet сканировать таблицу, если запрос ограничен неиндексированными полями или условие отбора запроса удовлетворяется большей частью строк в таблице.
• Индекс. Jet использует индекс таблицы для чтения строк таблицы. Хотя Jet может считывать страницу данных больше чем один раз, такой подход работает намного быстрее, чем сканирование.
• Срочная оптимизация (Rushmorc Optimizations). Этот способ доступен только в
тех случаях, когда установлены ограничения более чем для одного индекса в запросе. Срочная оптимизация позволяет Jet считать намного меньше страниц данных, иногда вообще ни одной. При использовании способа срочной оптимизации Jet читает только индексные страницы,
что весьма эффективно.
Очевидно, что сканирования следует избегать при любой возможности и попытаться воспользоваться индексами. Но как проверить, будет ли для данного запроса действовать лучший способ — срочная оптимизация? Срочную оптимизацию нельзя просто включить или выключить, и не существует какого-то явного индикатора для определения этого. Она всегда включена, но лишь определенные виды запросов могут воспользоваться преимуществами данного способа. Для того чтобы была реализована срочная оптимизация, должны удовлетворяться следующие три условия:
• Запросы должны содержать множественные индексы.
• Для данных индексированных полей должны быть заданы условные ограничения.
При установке критерия отбора данные индексы должны использоваться одним из трех способов:
• Перекрытие индексов. Условие отбора с оператором AND. Jet может применить способ срочной оптимизации на данном наборе ограничений, поскольку индексированы оба поля.
WHERE CompanyName='Ernst Handle' And City='Graz'
• Объединение индексов. Условие отбора с оператором "OR". Jet может применить способ срочной оптимизации на данном наборе ограничений, поскольку индексированы оба поля.
WHERE CompanyName='Ernst Handle' Or City='Graz'
• Счетчики индексов. Составные запросы, возвращающие только счетчик записей. При срочной оптимизации обрабатывается каждый запрос, даже если не существует набора ограничений в условии
Where.
SELECT Count(*) FROM Customers
Необходимо убедиться в том, что существуют и множественные индексы для всех таблиц, которые также выигрывают от этого. Кроме того, следует попытаться выразить запросы таким образом, который предполагает перекрытие или объединение данных индексов. Такой подход способствует оптимальному выполнению операций над базовыми таблицами в плане выполнения запроса.
После того как Jet определит способ доступа к данным в отдельных таблицах, он должен определить отношения таблиц между собой. Начинается этап объединения процесса оптимизации. Учитывая сведения о типах соединения, приведенные в табл. 2, можно определить вероятные стратегии соединения плана выполнения.
Таблица 2. Типы объединения: принцип работы и отличительные признаки.
Тип объединения
|
Принцип работы
|
Отличительные признаки
|
Возможное использование
|
Индексное слияние
|
Основную работу выполняют индексы.
|
С обеих сторон связи используются индексы. По крайней мере, один из индексов не допускает нулевых значений (начальное значение). Все таблицы должны соответствовать собственному формату Jet.
|
Везде, где возможно.
|
Индекс
|
Первая таблица сканируется, а затем строки второй таблицы выбираются по индексу.
|
Существует индекс для связанных полей второй таблицы. В данных индексах разрешены нулевые значения. Ограничения не используют индексы.
|
Если во второй таблице мало записей, если ее записи не отображаются в результирующем наборе или если условие отбора для первой таблицы слишком ограничительное.
|
Слияние
|
Обе таблицы сканируются
одновременно
|
Две таблицы сортируются по связанным полям. В результирующем наборе отображены данные из обеих таблиц.
|
Обе таблицы достаточно большие и сортируются по связанным полям.
|
Выборка
|
Вторая таблица сканируется и сортируется перед объединением.
|
Нет индексов для связанных полей таблицы.
|
Когда вторая таблица имеет небольшие размеры и для связанных полей второй таблицы не существует индексов.
|
Вложенная итерация
|
Построчная итерация по каждой таблице в отношении.
|
Ни с одной стороны объединения не существует индексов.
|
Только для очень малых таблиц и если нет другого выбора.
|
|
|
|
|
|
Jet выбирает один из этих планов в зависимости от таких факторов, как:
• Число записей в каждой базовой таблице,
• Число страниц данных, используемых базовыми таблицами,
• Местонахождение и тип таблицы — локальная ISAM или ODBC,
• Избирательность индексов таблиц — разрешены ли нулевые значения или повторения,
• Число страниц индекса.
Повышение скорости печати отчетов
Какой смысл в быстродействующей базе данных, если она целый день распечатывает отчет? Единственная большая и оказывающая влияние на производительность разница между формами и отчетами заключается в способе обработки разделов. В форме существует заголовок формы, область данных и примечание формы. В отчете имеются заголовок и примечание отчета, заголовок и примечание страницы, заголовки и примечания разделов, а также область данных. При открытии формы запрос, на котором она основана, выполняется только один раз. При открытии отчета он должен создать запрос (основываясь на запросе в источнике записей) для каждого раздела. Если запрос очень сложен, отчет должен выполнять его или ^некоторые его части несколько раз.
Ниже приводятся советы, следуя которым можно повысить скорость создания отчетов.
• Запрос, на котором основывается отчет, должен быть как можно более простым.
• Рекомендуется перенести вычисления в отчет. Если поместить вычисления в запрос, они будут выполняться для каждой строки. Однако, если поместить вычисления в отчет, они будут выполняться только при необходимости и пользователь сразу после расчета одной страницы данных Access увидит результат.
• Следует основывать запрос на возможно меньшем количестве таблиц. Поскольку отчет выполняет запрос больше чем один раз, может оказаться полезным создать таблицу необходимого результирующего набора. Отчет может обработать эту таблицу гораздо быстрее, чем снова выполнить запрос. Данный подход особенно полезен в том случае, если отчет основан на запросах с подчиненными запросами.
• Необходимо избегать использования подчиненных запросов в источнике отчета. Отчетам необходим большой объем памяти, а запрос с подчиненными запросами поглощает больше памяти, чем требуется в действительности.
• Следует проверить, необходим ли на самом деле подчиненный отчет. Подчиненные отчеты не только усложняют форматирование вывода, но и поглощают память, а также снижают производительность отчета. Тем не менее, подчиненные отчеты имеют широкое применение. Если существует несколько доменных функций, может оказаться,
что подчиненный отчет выполняется быстрее, чем несколько вызовов данных функций.
• Необходимо избегать сортировки или группировки выражений. Чтобы правильно отображать сортировку или группировку. Access будет вынужден просчитывать каждое выражение больше чем один раз. Значения следует рассчитать до того, как они перейдут в отчет.
• Рекомендуется индексировать все поля, использующиеся для сортировки или группировки. Поскольку индексы по умолчанию сортируют записи, отчет без особых сложностей
может отсортировать и сгруппировать данные непосредственно из индексированных полей.
• Источник записей не должен содержать агрегирующие доменные функции (DIookup). Снова это вынуждает отчет выполнять дополнительную обработку данных, что задерживает отображение отчета.
• Нет смысла в отображении для пользователей пустого отчета с записями
#Еггог. Если отчет не содержит данных, следует отправить пользователю соответствующее сообщение и закрыть отчет. Определить, содержит ли отчет данные для отображения, можно с помощью свойств
HasData или
NoData.
Многие из методик, которые используются для повышения производительности форм, можно использовать и для отчетов. В данном разделе были описаны только те подходы, которые ограничиваются отчетами.
Повышение скорости выполнения запросов
Оптимизация запросов в Jet — процесс довольно сложный, но это не значит, что в нем невозможно разобраться. Ниже приведены советы, которые помогут ускорить выполнение запросов:
• Рекомендуется создавать индексы для всех полей, которые будут использованы для определения критерия отбора.
• Необходимо создавать индексы с обеих сторон связей в запросах.
• Вместо уникальных индексов лучше пользоваться начальными значениями. Поскольку начальные значения запрещают использование пулевых значений, запрос может использовать преимущества большего количества типов объединения.
• В результирующем наборе не следует отображать
какие-либо лишние столбцы. Обработка и отображение каждого столбца занимает дополнительное время.
• Рекомендуется воздерживаться от употребления сложных выражений в запросах.
• Следует избегать функции
IIF() (немедленное IF).
IIF() оценивает и истинное, и ложное значения перед тем, как выдать результат. Если выполнять данную операцию для каждой записи, это может
сильно повлиять на производительность.
• При использовании вложенных запросов рекомендуется записывать все вычисления в последнем запросе серии.
• Вместо
Count([Customer]) лучше применять
Count(*),
поскольку при срочной оптимизации
Count(*) обрабатывается быстрее — перед подсчетом не нужно проверять нулевые значения.
• По возможности следует пользоваться оператором Between для уменьшения количества строк в результирующем наборе вместо операторов "больше чем" и "меньше чем".
• Обычно размещение условия со стороны "один" отношения "один-ко-многим" — самый эффективный способ, но не всегда. Можно попробовать передвинуть ограничение к стороне "многие", чтобы проверить, не изменится ли производительность. После каждого изменения условий отбора необходимо тщательно проверять результирующий набор.
• Нормализованные таблицы могут хранить данные с использованием меньшего количества страниц данных и страниц индекса. Нормализация должна стать правилом, и нарушать ее можно лишь при отсутствии другой альтернативы.
• Рекомендуется по возможности поэкспериментировать с подчиненными запросами вместо исполь зования объединений или сложных условий OR. Оптимальный выбор зависит от многих дискретных факторов, и только эксперимент поможет решить, какой подход использовать.
• Внешние связи следует использовать только при крайней необходимости, поскольку они автоматически требуют проведения сканирования доминантной (сохраняемой) таблицы в объединении.
• Вместо SQL-операторов в коде рекомендуется использовать сохраненные запросы с параметрами. Jet уже скомпилировал запросы с параметрами и создал для них план выполнения (хотя эти планы недоступны в SHOWPLAN.OUT). Использование скомпилированных и сохраненных запросов устраняет необходимость оценки и оптимизации SQL-строки. Access компилирует SQL-строки, использующиеся в качестве источника записей или источника строк для форм, отчетов или элементов управления, поэтому они остаются нетронутыми.
• Рекомендуется всегда использовать скомпилированные запросы.
• Для манипуляций с данными вместо DAO по возможности следует пользоваться запросами. Для решения этих задач запросы (SQL) всегда выполняются быстрее, чем DAO.
• Типы наборов записей следует выбирать с осторожностью. Если необходимо добавить или отредактировать данные, требуется динамическое множество. Снимок или однонаправленный снимок данных может понадобиться в том случае, когда необходимо только считать данные. Снимки дольше открываются, но прокручиваются быстрее.
• При открытии набора записей только для добавления данных следует
использовать опцию
dbAppendOnly.
При этом строки не считываются.
• При использовании данных клиент/сервер необходимо тестировать запросы к серверу. Кроме того, рекомендуется ознакомиться с новыми возможностями Access 2000, имеющими отношение к архитектуре клиент/сервер. Запросы к серверу не всегда выполняются быстрее, чем запросы к вложенным серверным таблицам, но сетевой трафик при их использовании меньше.
• Большие запросы действия могут выполняться лучше, если присвоить свойству
UseTransaction значение False. При проведении транзакций Access создает временные файлы. Иногда эти таблицы становятся слишком большими и уменьшают скорость выполнения запросов.
• При запрашивании данных с сервера необходимо применять методы
CacheStart, FillCache и EndCache для
обработки данных, поступающих с сервера.
• При работе с серверными данными следует избегать локальной обработки. Локальная обработка напоминает использование сложного выражения
Group By с ключевым словом
Distinct,
использование оператора LIKE в текстовых полях или полях заметок, множественных агрегирующих функций в перекрестном запросе или перекрестных запросов без условий
ORDER.
Кроме того, следует избегать сложных внешних и внутренних комбинаций связей. Такие конструкции вынуждают сервер посылать громадные объемы данных на локальный PC для обработки, что значительно снижает производительность.
• Необходимо регулярно сжимать базу данных и проверять статистические показатели, используемые механизмом Jet для оптимизации запросов.
• Если это возможно, следует заполнить приложение таким же количеством тестовых данных, которое будет использоваться при работе с пользователями. Механизм Jet сможет оптимизировать запросы, используя те статистические показатели, которые точно отражают реальные условия выполнения запросов.
• Рекомендуется индексировать поля для сортировки.
• Если данные являются в основном статичными, следует рассмотреть возможность создания табличного запроса к необходимым данным вместо неоднократного запрашивания базы данных.
• Необходимо избегать использования доменных агрегирующих функций (DIookupO) для таблиц, которых нет в запросе.
Запросы представляют собой наиболее сложный аспект Access. К счастью, большую часть работы по оптимизации запросов выполняет механизм Jet. Информация, изложенная в данном разделе, поможет разработчику оказать механизму Jet содействие при оптимизации. Следует проверить результаты экспериментов в SHOWPLAN и с помощью подпрограмм
PrintStats и
QueryTimer,
чтобы определить, какая комбинация решений выполняется с максимальной производительностью.
Правильное использование закладок
Для возврата к предыдущей записи рекомендуется пользоваться закладками. Закладки представляют собой исключительно быстрый способ передвижения по записям в интерфейсе. Следует помнить, что существует два различных вида закладок: один — для форм, а другой — для наборов записей. Закладка формы представляет собой массив переменных, динамически присваиваемых каждой записи в базовой копии набора записей. Закладка DAO — это байтовый массив, идентифицирующий каждую запись в наборе записей. Закладки являются удобными средствами навигации, они разрушаются и воссоздаются вместе с наборами записей и копиями. Не следует на них полагаться, за исключением полностью контролируемых или простых ситуаций. Закладки не представляют собой записи и не имеют никакого отношения к начальному значению. Они представляют только временное положение записи в наборе строк. Любая манипуляция с данными должна проводиться с учетом методик разработки реляционной базы данных, а не с учетом текущего положения в наборе записей или копии. Поскольку разработчик должен всегда пользоваться методом повторного запроса после обновлений и удалений, он каждый раз разрушает и воссоздаст закладки. Если интерфейс использует закладки в таких обстоятельствах, необходимо тщательно отслеживать удаления и обновления.
Приведенный ниже код может использовать закладку формы для возврата к предыдущей записи после обновления:
Private Sub Findit_AfterUpdate()
Dim redone As Recordset
Dim recordID As Variant
Dim IDValue As Long
Set rsclone = Me.RecordsetClone
IDValue = Me![Findit]
recordID = "ID = " & IDValue
rsclone.FindFirst recorded
cm = rsclone.Bookmark
Me.Bookmark = bm
End Sub
Использование закладки для возврата к предыдущей записи позволяет ускорить выполнение на 1300% по сравнению с использованием
FindFirst
для решения той же задачи.
ПРЕДОСТЕРЕЖЕНИЕ
Рекомендуется всегда объявлять операторы
Dim и Set в отдельных строках. Не следует комбинировать данные операторы в одной строке, как, например,
Dim objUser = New cUser. При этом код выполняется медленнее и момент и, образования объекта (записи в память) определить невозможно.
Преимущества использования объектов
Существует много преимуществ использования объектов, среди которых возможность создания сложного программного кода, использования IntelliSense, упрощенное создание и поддержка программного кода и т.д.
Преобразование формата базы данных
Преобразование формата базы данных
В Access 2003 по умолчанию используется формат файлов Access 2000, необходимый для обеспечения обратной совместимости с базами данных предыдущих версий. Для того чтобы изменить формат файлов открытой базы данных, выберите команду Сервис > Служебные программы>Преобразовать базу данных и укажите нужный формат в последнем подменю (рис. 2.10). Появится запрос на ввод нового имени для преобразованной базы, и когда вы это сделаете, щелкните на кнопке Сохранить. Учтите, что преобразование файла в формат более старой версии может стать причиной недоступности некоторых функций, не поддерживаемых этой версией Access.
Используемый по умолчанию формат файлов каждой новой базы данных также можно изменить. Для этого выберите команду Сервис >Параметры, щелкните на вкладке Другие и укажите в списке Формат файла по умолчанию (в правой части вкладки) формат Access 2002—2003, как показано на рис. 2.11 (для получения доступа к меню Сервис необходимо предварительно открыть какую-либо базу данных). Этот формат следует выбирать в том случае, если планируется совместное использование базы данных только с пользователями, применяющими Access версий 2002 и 2003 (но не версии 2000 или еще более ранней!). Изменение формата позволяет в полной мере задействовать все возможности Access 2003.
Преобразования в архитектуре клиент/сервер
При разработке приложения следует учитывать возможность преобразований в SQL-Server или Oracle. При этом можно применить запросы к серверу и использовать хранимые процедуры на сервере. Данный подход позволяет значительно повысить производительность.
Если приложение использует источник данных
Если приложение использует источник данных ODBC, установки в системном реестре следует искать в ключе д., t- \HKEY_LOCAL_MACHINES\SOFTWARE\MICROSOFT\JET\4.0\ENGINES\ODBC.
Применение объекта обработчика ошибок
Рассмотрим пример кода из статьи «Профессиональная обработка ошибок.». Модуль класса обеспечивает обширную обработку ошибок, включая:
• Регистрацию ошибок в таблице Access
• Регистрация ошибок в текстовом файле
• Обработку ошибок электронной почты
• Обработку ошибок записей в календаре Outlook
Рассмотрим объект
сЕггог в браузере объектов, как показано на рис. 13.
РИСУНОК 13. Объект сЕггог и браузере объектов
Присваивание объектной переменной объекту
Для установки ссылки объектной переменной на объект используется ключевое слово
Set. Например:
Set objUser = New cUser
Private Declare Function sndPlaySound Lib "winmm.dll" Alias _
"sndPlaySoundA" (ByVal IpszSoundName As String, ByVal uFlags As Long) As Long
Public Sub PIaySound(SoundFile As String)
' Воспроизведение звукового файла.
sndPlaySound SoundFile, 1
End Sub
Следующий код инициализирует и обрабатывает объект
objSound (рис. 11):
Dim objSound As cSound
Set objSound = New Sound
' При использовании Windows NT необходимо указывать путь "C:\WINMT".
objSound.PIaySound "C:\Windows\chimes.wav"
Set objSound = Nothing
РИСУНОК 11. Пример объекта Sound.
Процедура Property Get
Процедура
Property Get
позволяет получить значение свойства. Если не нужно, чтобы другие пользователи могли получить значение свойства, не следует включать оператор
Property Get.
Оператор
Property Get получает значение, хранящееся в приватной переменной, и возвращает его в качестве значения свойства. Приведенный ниже пример представляет собой оператор
Property Get для свойства
Name объекта
cUser:
Public Property Get Name () as String
' Получение значения, записанного в приватной переменной (mstrName),
' и запись его в значение свойства.
Name = mstrName
End Property
Пользователь легко может получить значение свойства (если существует выражение
Property Get), воспользовавшись следующим кодом:
MsgBox cUser.Name
Процедура Property Let
Процедура
Property Let
используется для установки значения свойства. Если не нужно, чтобы другие пользователи устанавливали значение свойства, не следует включать процедуру
Property Let. Ниже приведен пример создания процедуры
Property Let для свойства
Name объекта
cUser:
Public Property Let Name (UserName as String)
' Принимается значение, передаваемое в UserName, и сохраняется
' в приватной переменной (mstxName).
mstrName = UserName
End Property
Рассмотрим данную процедуру подробнее. Во-первых, поскольку существует процедура Property
Let, можно устанавливать свойство Name, так как данное свойство отображается вне модуля. Разработчик мог бы присвоить этому свойству следующее значение:
cUser.Name = "James"
Значение
James, передаваемое в процедуру свойства, сохраняется в переменной
UserName.
Процедура
Property Let принимает значение переменной
UserName (James) и записывает его в приватной переменной модуля
mstrName. Рассматриваемая процедура передает один параметр, хотя на самом деле процедуры свойств могут передавать много параметров. Значение свойства может быть получено только в том случае, когда существует процедура
Property Get.
Процедура Property Set
Процедура
Property Set позволяет создать процедуру свойства, в ходе которой устанавливается ссылка на объект. При присваивании объекта в процедуре
Property Set используется ключевое слово
Set.
В данном примере используется объект
cForm. Объект
cForm
содержит свойство
Form, которое должно быть передано как объект
Form. Код в модуле класса
cForm приведен ниже:
Option Compare Database
' Объявление приватной переменной на уровне модуля.
Private mobjForm As Form
Public Property Get Form() As Variant
' Получение объекта, скрытого в приватной переменной (mobjForm) ,
' и запись его в значение свойства.
Set Form = mobjForm
End Property
Public Property Set Form(FormObject)
' Получение переданного объекта (FonnObject)
' и запись его в приватную переменную (mobjForm).
Set mobjForm = FormObject
End Property
При загрузке
frmPropertySet форма передается в свойство
Form. Поскольку это объект, используется ключевое слово
Set. Затем можно получить имя объекта формы для окна сообщений. Ниже приведен код для формы
frmPropertySet:
' В данном примере используется объект "cForm" . Об"ьект "cForm"
' содержит свойство "Form". При загрузке этой формы (frmPropertySet) она
' передается как объект в свойство "Form". При щелчке на кнопке
' "Property Set" считывается имя формы.
Private mobjForm As cForm Private Sub cmdClose_Click()
DoCmd.Close acForm, "frmPropertySet", acSaveNo
End Sub
Private Sub cmdPropertySet_Cliclt()
MsgBox "The form object (in the 'Form' property) has a name of: " _
mobjForm.Form.Name, vblnfonnation, "Property Set Example"
End Sub
Private Sub Form_Load()
Set mobjForm = New cForm
Set mobjForm.Form = Forms!frmPropertySet End Sub
Private Sub Form_Unload(Cancel As Integer)
Set mobjForm = Nothing
End Sub
Процедуры события ошибки
Формы и отчеты Access содержат процедуру события
ОпЕггог, которая полезна для отображения собственных сообщений об ошибках при возникновении ошибки Access. Процедура события
ОпЕггог
использует два аргумента:
• DataErr — номер ошибки, возвращаемый объектом
Err. Используя данный аргумент, можно обработать соответствующий тип ошибки. Если, например,
DataErr равен 11, значит, произошло деление на нуль.
• Response — определяет, отображено ли сообщение об ошибке. Используя данный аргумент, можно контролировать отчетность. Чтобы проигнорировать ошибку и отобразить собственное сообщение об ошибке, необходимо воспользоваться константой
acDataErrContinue.
Для отображения сообщения об ошибке, принятого в Access по умолчанию, можно воспользоваться константой
acDataErrDisplay.
Ниже приводится типичный пример соответствующего кода:
private Sub FormError(DataErr As Integer, Response As Integer)
Dim strMessage As String
If DataErr = 11 Then
Response = acDataErrContinue
strttoisage = "Check the value, you have divided a number by zero."
MsgBox strMessage
End If
End Sub
Продолжение выполнения кода
После тестирования кода в пошаговом режиме можно продолжить выполнение кода с нормальной скоростью. Для этого в меню необходимо выбрать команду Run | Continue (Выполнить | Продолжить) или нажать клавишу F5.
Project Explorer
Project Explorer (Проводник проектов) отображает список форм, отчетов и модулей класса в данном приложении Access (рис. 2). Для просмотра кода необходимо щелкнуть правой кнопкой мыши на каком-либо из этих объектов или перейти в режим конструктора формы. Чтобы открыть Project Explorer, необходимо в меню выбрать команду View | Project Explorer (Вид | Проводник проектов) или использовать комбинацию клавиш Ctrl+R.
РИСУНОК 2. Окно Project Explorer.
Просмотр объекта 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, _
adLockOptimistic
Me.ErrorTextFile = rst!ErrorTextFileName
Me.UserEnterNoteFlag = rst!UserEnterNoteAboutError
Me.AVIFileLocation = CurrentProject.Path & rst!AVIFileLocation
Me.SoundFile = CurrentProject.Path & rst!SoundFile
Me.OfficeID = rst!OfficeID
Me.OfficeName = rst!OfficeName
Me.OfficePhoneNuitiber =
rst!OfficePhoneNumber
Me.OfficeFaxNumber = rst!OfficeFaxNumber
If rat!PlaySound Then
' Воспроизведение звука при возникновении ошибки.
CError.PlaySound
End If
Просмотр объектов в браузере объектов
Упаковка кода в классы позволяет разработчикам использовать Object Browser (Браузер объектов) для просмотра свойств, методов и другой информации. Далее в данной статье будет представлен пользовательский объект, просматриваемый с помощью браузера объектов.
Просмотр в окне Call Stack
Приложение может включать процедуры, которые вызывают другие процедуры, а те, в свою очередь, вызывают третьи процедуры и т.д. При отладке приложения можно попасть в безвыходную ситуацию или запутаться в списке выполненных процедур. В таких случаях можно воспользоваться окном Call Stack (Вызов стека).
Окно вызова стека можно представлять себе следующим образом. При выполнении кода точка наблюдения передвигается в будущее. Call Stack представляет собой окно истории. Оно показывает, какие процедуры уже были выполнены (рис. 12). Чтобы открыть окно Call Stack, необходимо в меню выбрать команду View | Call Stack (Вид | Вызов стека) или использовать комбинацию клавиш Ctrl+L.
РИСУНОК 12. Окно Call Stack используется для отображения списка выполненных процедур
Простой обработчик ошибок
Перед рассмотрением сложного обработчика ошибок приведем простой пример:
Sub Demo ( )
Dim I as Integer
On Error GoTo ErrorHandler
' Программная ошибка в этой строке кода. ExitHere:
Exit Sub ErrorHandler:
MsgBox "An error occurred"
Resume ExitHere
End Sub
Данный простой обработчик ошибок следует обычным программным соглашениям, которые описаны далее.
Проверка эффективности транзакций
Транзакции не всегда экономят время. В одном случае можно рассчитывать на то, что транзакция увеличит скорость выполнения запросов. В другом случае это уже будет не так. Хотя транзакции, уменьшая количество обращений к диску, используют кэширование для повышения производительности запросов, они могут также замедлить их, создавая временные файлы данных на диске в ожидании возврата к пройденной точке. Транзакции по умолчанию неявны, поэтому узнать, повышают ли они производительность, можно только с помощью тестирования на реалистичном наборе данных в каждом отдельном случае.
Работа с модулями
Перед выполнением модулей
VBA должен скомпилировать их. Это не значит, что модули не будут работать, если их специально не скомпилировать, просто перед выполнением модуля VBA будет вынужден временно скомпилировать его. Кроме того, модуль будет компилироваться каждый
раз, когда его необходимо выполнить. Это может сильно сказаться на производительности.
При компиляции модуля VBA преобразовывает его в гораздо более меньший по размеру, быстрее выполняющийся блок. Хотя исходный код всегда хранится в файле .MDB, Access загружает и выполняет только скомпилированный код VBA. Код VBA, кроме того, не содержит пробелов, комментариев, заголовков и занимает гораздо меньший объем памяти, чем созданный разработчиком исходный код. При попытке выполнить нескомпилированную процедуру VBA должен загрузить весь исходный код (с пробелами, комментариями и невыполняемым кодом) в память и скомпилировать перед выполнением. То же самое происходит при выполнении кода форм и отчетов.
Работа с объектом Debug
Объект
Debug содержит два метода, которые могут оказаться полезными при отладке приложений:
Debug.Print и Debug.Assert.
Работа в среде разработки Visual Basic (IDE)
Среда разработки в Access 2000 претерпела радикальные изменения. В настоящее время в Access включена Integrated Development Environment (IDE) (интегрированная среда разработки) Visual Basic, имеющиеся также в Visual Basic 5/6, Word 97 и других программных продуктах Office 97/2000. Эта среда редактирования включает стандартные средства разработки приложений для различных программных продуктов. Методики отладки, описанные в данной статье, с одинаковым успехом могут использоваться как в разработках Access, так и в разработках Visual Basic и Microsoft Office. Чтобы открыть IDE, находясь в режиме конструктора, необходимо в меню выбрать команду View | Code (Вид | Код). Среда IDE включает различные окна, которые можно открывать и закрывать, например, окно Project (Проект), окно Properties (Свойства), окно Immediate (Отладка) и др. Чтобы открыть окно в IDE, необходимо выбрать данное окно в меню View. Закрыть окно можно, щелкнув на кнопке закрытия окна в верхнем правом углу окна. При следующем запуске IDE все окна будут отображены в том же состоянии, в котором они находились в момент выхода из среды IDE. Когда в окне Design (Конструктор) открыта форма, можно работать с элементами управления и свойствами, как и в предыдущих версиях Access. Однако для просмотра кода формы необходимо открыть IDE Visual Basic (рис. 1). На самом деле это совершенно отдельное от Access приложение.
РИСУНОК 1. Интегрированная среда разработки (IDE) Visual Basic.
Хотя IDE Visual Basic является отдельным приложением, оно работает вместе с Access. Если IDE Visual Basic открыта, при выходе из Access она закрывается. Чтобы закрыть IDE Visual Basic, необходимо в меню выбрать пункты File | Close | Return to Microsoft Access (Файл | Закрыть | Вернуться в Microsoft Access).
Рассмотрим окна IDE Visual Basic.
Раннее создание отношений для повышения производительности
Отношения между таблицами рекомендуется устанавливать в окне Relationships (Отношения). При создании отношения в этом окне разработчик имеет возможность определить свойства данного отношения. Кроме того, при этом Jet узнает о существовании отношения. Jet может использовать всю эту информацию для создания более эффективного плана оптимизации при запросах к данным. Это значительно повышает производительность.
Итак, следует нормализовать данные, создать индексы там, где они необходимы, экономно обращаться с типами данных и размерами и помнить о том, что таблицы должны быть простыми. Таблицы существуют для хранения данных, а не для их отображения.
Разрушение объектных переменных
Разрушение объектных переменных позволяет уменьшить вероятность ошибок ресурсов. Если существует объектная переменная с именем objWord, необходимо разрушить ее в конце процедуры с помощью выражения Set objWord = Nothing.
Реагирование на возникновение ошибок
Значительную часть кода в процедуре обработки ошибок должен занимать оператор
Select Case.
Следует попытаться учесть все возможные ошибки, которые могут произойти, и создать список номеров ошибок в выражении
Select Case обработчика ошибок. Затем можно создать код обработки для каждой ошибки.
Ожидаемая ошибка может быть обработана различными способами:
• Окно сообщения может предупредить пользователя об ошибке.
• Окно сообщения может предоставить пользователю информацию, необходимую для исправления ошибки (например.
There is no disk in the disk drive (В этом дисководе нет диска)).
• Ошибку можно проигнорировать и продолжить выполнение кода.
• Ошибку можно проигнорировать и выйти из процедуры.
• Можно принять меры по исправлению ошибки в коде для продолжения успешного выполнения кода.
• Можно осуществить переход в другое место кода. Приведенный ниже код иллюстрирует вышесказанное:
ErrorHandler:
Select Case Err.Number
Case 11
If MsgBox("You divided a number by zero, enter a " & _
" different number. Do you want to try again? ", _
vbQuestion + vbYesNo) = vbYes Then
Resume
Else
Resume ExitHere
End If
Case Else
MsgBox "An unexpected occurred. Error Number: " & _
Err.Number & " Error Description: " & Err.Description
Resume ExitHere
End Select
End Sub
Можно даже создать общую процедуру обработки ошибок определенного типа. Например, если просмотреть таблицу ошибок Access и Jet в файле Access and Jet Database Errors, mdb, можно заметить, что ошибки с номерами 58-76 относятся к файловым ошибкам. Сюда входят
File already exists. Disk Full, Too many files и другое. Можно создать общую процедуру, работающую с данной группой ошибок, и вызывать эту процедуру из выражения
Case Select обработчика ошибок:
ErrorHandler:
Select Case Err.Number
Case 58 To 76
' Общая процедура, обрабатывающая файловые ошибки.
Call FileTypeErrors
Case Else
MsgBox "An unexpected occurred. Error Number: " & _
Err.Number & " Error Description: " & Err.Description
Resume ExitHer
End Select
End Sub
Resume ExitHere
Данное выражение позволяет передать управление коду
ExitHere.
Resume Next
Данное выражение передает управление в строку кода, следующую за той строкой, где произошел сбой. Таким образом, можно выполнить оставшийся код процедуры.
Приведенная на рис. 3 диаграмма иллюстрирует ход выполнения программы в случае использования разных операторов
Resume:
РИСУНОК 3. Обработка ошибок с помощью оператора
Resume.
Resume
Оператор Resume передает управление в ту же строку, где произошел сбой. Если обработчик ошибок сообщает пользователю, как исправить данную ошибку, можно воспользоваться оператором Resume для возврата к коду, сгенерировавшему ошибку. Данный подход применяется, когда причина программной ошибки устранена и необходимо возвратиться к исходному коду.
В данной главе описаны методики
В данной главе описаны методики оптимизации приложения. Время реакции хорошо работающего приложения обычно составляет менее одной секунды для большинства операций получения данных. Методики, изложенные в данной главе, помогут разработчику придерживаться такого стандарта.
Простейший способ обеспечения быстрой работы приложения заключается в модернизации компьютера, на котором оно выполняется. Кроме того, можно изменить установки в системном реестре, чтобы они соответствовали требованиям выполняющегося процесса. В этой главе подробно описано составление таблиц и запросов, обеспечивающее приложению основу для достижения высокой производительности. Рассмотрены подходы к дизайну интерфейса, помогающие создать надлежащий вид приложения и позволяющие уведомить пользователей о ходе процесса. Наконец, изложены способы кодирования, обеспечивающие использование каждой миллисекунды для повышения быстродействия приложения.
Начав с аппаратного обеспечения, пробуя различные описанные подходы и проверяя их в той или иной ситуации, разработчик сможет добиться самой высокой производительности приложения. Совокупное применение приведенных методик может иметь поразительный эффект в каждом конкретном случае.
Access. Программирование на VBA. Часть 2.
Отладка приложений Access.
Access 2000 содержит мощные средства
Access 2000 содержит мощные средства отладки. Изучение работы данных средств является обязательным для любого разработчика Access. В данной статье приведены советы и подсказки по использованию интегрированной среды разработки (IDE), окна отладки, окна переменных и окна наблюдения. Рассматриваются отладчик и различные методики отладки. Кроме того, рассмотрена условная компиляция и приведены советы по написанию надежного кода. Использование информации и методик, изложенных в данной статье, упрощает и ускоряет процесс создания приложения и работу с ними.
Access. Программирование на VBA. Часть 3.
Профессиональная обработка ошибок.
Обработка ошибок имеет решающее значение.
Обработка ошибок имеет решающее значение. Профессиональное приложение, элегантно обрабатывающее программные ошибки, обеспечивает удобство работы для пользователей. Кроме того, обработка ошибок — лучший способ сохранить время, затрачиваемое на обнаружение и исправление программных ошибок. Можно надеяться, что комплексный обработчик ошибок, включенный в код данной главы, окажется полезным в различных ситуациях, возникающих при работе многих приложений.
Создание объектов представляет собой эффективный
Создание объектов представляет собой эффективный способ написания и работы с приложениями. Это значительно улучшает организацию кода, упрощает его написание и использование, в том числе с помощью технологии IntelliSense, а также делает код переносимым. Кроме того, можно скрыть сложную "начинку" от разработчиков, использующих объект. Разработчики могут создавать многочисленные экземпляры данного объекта.
Access. Программирование на VBA. Часть 4.
Оптимизация приложений.
Set Next Statement
При пошаговом выполнении кода можно установить следующий оператор, который необходимо выполнить. Для этого нужно щелкнуть правой кнопкой мыши на той строке кода, которую необходимо выполнить следующей. Затем в контекстном меню следует выбрать пункт Set Next Statement (Установить следующий оператор).
Сохранение стекового пространства с помощью строковых переменных
Строковая переменная — один из наиболее часто употребляемых в коде типов данных. Их можно разделить на три вида:
• Локальные фиксированной длины (не более 64 символов) — эти переменные используют два байта на символ и не используют область динамической памяти.
• Локальные фиксированной длины (более 65 символов) — эти строки также используют два байта на символ, но в динамической памяти. Кроме того, им нужны четыре байта в стеке для указания на переменную в динамической структуре.
• Локальные переменной длины (длина не имеет значения) —
объем динамической памяти зависит
от длины строки. Для указания на переменную в динамической структуре используется четыре байта стека.
При работе со строками необходимо стремиться к уменьшению объема используемого стека. Можно попытаться изменить строки на локальные строки переменной длины или на статические строки фиксированной длины. Ниже приведен пример строки переменной длины, объявленной как статическая строка фиксированной длины для сохранения стековой памяти.
Dim strString as string
Static strString as string * 30
Сокрытие сложного программного кода
Возможность сокрытия сложного программного кода является одним из преимуществ использования объектов. Опытный разработчик может создавать сложные программы, такие как процедуры Windows API, процедуры доступа к данным, обработки строк и т.д. Менее опытные разработчики могут воспользоваться преимуществами объекта, используя вызов его свойств и методов. При этом нет необходимости разбираться в рабочем коде объекта.
Составление файла .MDE
Самый надежный способ удостовериться в том, что приложение остается в скомпилированном состоянии для пользователя — это создать файл .MDE для распространения. MDE-файл не содержит исходного кода и не декомпилируется.
Кроме методик группировки, управления памятью и компиляции на уровне модуля, существует несколько специфических подходов к написанию кода, которые могут помочь создавать более быстродействующие приложения.
Составление таблиц данных
Кроме обычных правил оптимизации,
при построении таблиц необходимо помнить о следующем:
• При работе
со связанными таблицами следует создавать постоянные связи.
• Использование простых подтаблиц в таблицах, где подтаблица является другой таблицей, а связи главный/подчиненный используют индексированные поля, оказывает ничтожно малое отрицательное влияние на производительность; однако более сложная подтаблица может значительно уменьшить скорость выполнения приложения. Вместо таблиц в запросах следует использовать подтаблицы. В данном случае они используются только при необходимости, а не каждый раз при открытии таблицы.
• Шаблоны ввода, поиска и правила верификации также должны использоваться только там, где они действительно необходимы, — в формах. Лучше всего создавать как можно более простые и легкие таблицы.
• Не рекомендуется создавать поля данных, размер которых будет больше, чем необходимо. Access предоставляет место для данных по размеру поля этих данных. Можно впустую потратить массу свободного места (и времени), используя типы данных или установки свойств, слишком большие для данных, содержащихся в этих полях.
Полезно присваивать коллекции имя, представляющее
Полезно присваивать коллекции имя, представляющее собой множественное число от имен объектов, содержащихся в данной коллекции. В данном примере в коллекцию добавляется объект User. Таким образом, коллекции следу-вд. ет присвоить имя Users.
Настоятельно рекомендуется указывать ключевое значение.
Настоятельно рекомендуется указывать ключевое значение. Ключевые значения упрощают написание кода и более ,j надежны, чем номера индекса. Номера индекса могут измениться при удалении элементов из коллекции или при '3 вставке в указанные места коллекции с помощью параметров метода Add.
В приведенном ниже примере в коллекцию Users будут добавлены два пользователя:
Dim User1 as cUser
Dim User2 as cUser
Dim Users as Collection
Set User1 = New cUser
Set User2 = New cUser
Set Users = New Collection
User1.Name = "James"
User2.Name = "Steve"
Users.Add User1, User1.Name
Users.Add User2, User2.Name
Set User1 = Nothing
Set User2 = Nothing
Set Users = Nothing
Данный код добавляет в коллекцию объект
User1. С помощью свойства Name
объекта указано ключевое значение. Точно так же добавляется объект User2.
Обратите внимание, что метод Add
коллекции содержит аргументы "до" и "после" для
определения порядка объектов в коллекции.
В приведенном примере проверяется каждый
В приведенном примере проверяется каждый пользователь в коллекции. Обратите внимание, что отдельным пользователям соответствуют отдельные объектные переменные Useri и User2. Чтобы воспользоваться циклом For Each, необходимо указать общую объектную переменную под именем User. Данную объектную переменную не обязательно присваивать с помощью ключевого слова Set. Ее единственное назначение — использование в цикле For Each.
Следует убедиться, что файл подкачки
Следует убедиться, что файл подкачки не размещен на сжатом диске или в разделе. Работа со сжатым диском замедляет чтение и запись временных файлов.
Может оказаться, что многие из приведенных советов осуществить невозможно, но при разработке приложения Access их обязательно следует учитывать и соответственно предлагать для реализации. Другими возможностями оптимизации разработчик Access может воспользоваться во всей полноте.
У многих разработчиков приложений компьютеры
У многих разработчиков приложений компьютеры намного более быстродействующие, чем компьютеры, на которых будет выполняться приложение. Необходимо протестировать приложение на компьютере, сравнимом с компьютерами пользователей. Если аппаратное обеспечение отличается от компьютера к компьютеру, приложение следует разрабатывать, рассчитывая на самый низкоскоростной компьютер.
МDЕ необходимо убедиться, что пользователи
Перед инсталляцией . МDЕ необходимо убедиться, что пользователи осведомлены о невозможности внесения ими изменений в приложение. Учитывая все возрастающую популярность Access, в последнее время многие пользователи настаивают на возможности дальнейшей модификации приложения. Кроме того, необходимо тщательно протестировать приложения, поскольку МDЕ выдают сложные для понимания сообщения об ошибках.
Для определения размера текстовых полей
Для определения размера текстовых полей фиксированной ширины можно пользоваться размерами полей таблиц.
в IDE можно отобразить достаточно
Как рассматривалось ранее, в IDE можно отобразить достаточно большое количество окон. В IDE гораздо удобнее работать, если установить разрешение экрана 1024х768 или выше. Еще лучше воспользоваться функцией поддержки нескольких мониторов Windows 98/Windows 2000.
Для ускорения работы с окнами необходимо изучить клавиши быстрого доступа, используемые для открытия и закрытия окон. Размеры и положение окон можно изменять по необходимости. Иногда бывает сложно изменить размеры или восстановить положение окна, если неаккуратно передвигать его. В таких случаях можно выполнить двойной щелчок мыши на строке заголовка, чтобы восстановить окно.
При тестировании выражений или выполнении
Для вывода информации в окне Immediate необходимо в коде использовать метод Debug.Print. При тестировании выражений или выполнении функций в окне Immediate не обязательно вводить Debug.Print. Вместо этого достаточно ввести знак вопроса ?,
что приводит к тому же результату.
В окне Immediate можно протестировать встроенные функции, значения в наборе записей и др. (рис. 6). Например, на рис. 6 показаны результаты тестирования встроенной функции Len.
Если использовать метод
Debug.Print в коде, значения и другая информация будут выводиться в окне Immediate. При выполнении следующего кода значение состояния будет выведено в окне Immediate
Sub Demo ( )
Debug.Print rat.States
Select Case rst.States
Case "Washington”
MsgBox "Washington"
Case "Oregon”
MsgBox "Oregon"
Case "California"
MsgBox "California
End Select
End Sub

РИСУНОК 6. Использование метода Debug.Print для тестирования встроенных функций.
В окне Immediate не производится перенос текста на следующую строку, поэтому объем выводимой информации по возможности следует сократить. Удалять операции Debug.Print из кода нет необходимости, поскольку пользователь никогда не увидит окно Immediate. Однако, если количество операторов окажется слишком большим, это может несколько повлиять на производительность.
в коде зарезервированное слово Stop.
Никогда не используйте в коде зарезервированное слово Stop. Следует учитывать, что, если оставить это ключевое слово, выполнение кода остановится при запуске приложения пользователем. Рекомендуется всегда использовать Debug.Assert False, поскольку данный оператор всегда удаляется компилятором.
Присваивать имя модулю класса следует
Присваивать имя модулю класса следует осторожно, поскольку данное имя будет именем объекта. С помощью это- го имени разработчики как раз и получают доступ к коду, пользуясь технологией IntelliSense. Кроме того, полезно перед именем объекта указать сокращенное название компании, чтобы всегда можно было увидеть, какие пользовательские объекты были созданы в данной компании.
При запуске подпрограммы или функции
При запуске подпрограммы или функции в окне Immediate необходимо ввести имя подпрограммы или функции (знак вопроса перед именем подпрограммы не используется). Если подпрограмма или функция находится в модуле формы, перед именем процедуры следует ввести имя формы (например, frmTest. MySubProcedure).
Некоторые разработчики предпочитают пользоваться панелью
Некоторые разработчики предпочитают пользоваться панелью инструментов Debug. Чтобы открыть панель инструментов, необходимо в меню выбрать команду View | Toolbars | Debug (Вид | Панели инструментов | Отладка). Л
Окно Locals можно использовать для
Окно Locals можно использовать для изменения значения переменных. Для этого необходимо дважды щелкнуть на значении переменной и ввести новое значение.
к определенной процедуре можно выбрать
Для перехода к определенной процедуре можно выбрать ее в окне Call Stack и щелкнуть на кнопке Show (Показать) (или просто дважды щелкнуть на процедуре).
Кроме того, группировка объявляемых переменных
Кроме того, группировка объявляемых переменных по типу данных также упрощает обращение к переменным.
и удаления комментария используйте команды
Для комментирования блока кода и удаления комментария используйте команды Comment Block (Комментировать блок) и Uncomment Block (Раскомментировать блок) из панели инструментов Edit (Справка) в IDE.
в диалоговом окне Options во
В редакторе Visual Basic в диалоговом окне Options во вкладке Editor можно выключить опцию Auto Syntax Check (Автоматическая проверка синтаксиса). Синтаксическая проверка при этом не отключается, но исчезнет раздражающее диалоговое окно, которое всплывает при каждой синтаксической ошибке. Ошибка все равно будет отображаться, при этом код выделяется красным цветом.
В диалоговом окне Options можно модифицировать некоторые установки компилятора. Во вкладке General опция Compile on Demand (Компиляция, выполняемая по требованию) позволяет приложению выполняться быстрее, поскольку модули не компилируются до тех пор, пока не загружаются для выполнения. На современных быстродействующих компьютерах для устранения возможных ошибок рекомендуется включать эту опцию.
Кроме того, во вкладке General имеется опция Background Compile (Фоновая компиляция). Включение данной опции позволяет производить фоновую компиляцию, когда имеются свободные системные ресурсы. Опция Background Compile может повысить скорость выполнения компиляции. Чтобы воспользоваться этой возможностью, опция Compile on Demand также должна быть включена.
Очень важно скомпилировать и сохранить все модули перед распространением приложения, чтобы убедиться в том, что все синтаксические ошибки исключены. Для этого в меню необходимо выбрать пункты Debug | Compile and Save All Modules (Отладка | Скомпилировать и сохранить все модули) вне зависимости от того, загружены в данный момент все модули базы данных или нет.
Найти метки очень просто, поскольку
Найти метки очень просто, поскольку они размещены в левой части кода и снабжены двоеточием,
Программный код данной статьи включает
Программный код данной статьи включает многочисленные примеры объектов. На следующих нескольких страницах в иллюстративных целях используется простейший пример — объект cUser. Объект
cUser содержит информацию о текущем зарегистрированном пользователе, включая его имя. Данный объект можно использовать в случаях, когда в приложении необходимо узнать имя пользователя, например, при обработке ошибок либо при записи имени автора примечаний или документов. В приведенном примере объект cUser используется для отображения приветствия пользователю при регистрации.
Процедуры свойств могут быть общедоступными
Процедуры свойств могут быть общедоступными или приватными, как и любые другие процедуры. Общедоступные процедуры свойств доступны всем другим процедурам во всех модулях; приватные процедуры свойств доступны только процедурам того модуля, в котором они были объявлены,
Тип данных процедуры Property Let
Тип данных процедуры Property Let должен быть таким же, как и для процедуры Property Get. Например, Property Let для свойства Name принимает строковый аргумент. Таким образом, процедура Property Get также должна воз- вращать строковый тип данных.
Используемые значения свойств не ограничиваются
Используемые значения свойств не ограничиваются перечисляемыми типами данных. В предыдущем примере перечисляемый тип данных включает три члена: Manager, Staff и Unknown. VBA не препятствует разработчику проигнорировать значения в списке и ввести другое значение (например, FullTime). Чтобы ограничить выбор пунктами в списке, необходимо воспользоваться числовыми значениями перечисляемых пунктов. Например, если в списке имеется три пункта (и нумерация начинается с нуля), можно запретить использование любых элементов, значения которых меньше нуля и больше двух.
Событие WithEvents можно использовать только
Событие WithEvents можно использовать только в модулях класса (модули форм являются модулями класса). В стандартных модулях WithEvents использовать нельзя.
После объявления переменной на уровне модуля с помощью ключевого слова WithEvents необходимо в левом поле со списком в верхней части окна модуля выбрать объект cUser. В правом поле со списком будут отображены события объекта cUser. Выберите событие Welcome, и в окне кода появится процедура, в которой можно записать соответствующий код для ответа на событие.
На рис. 7 приведен код, отвечающий на событие Welcome.

РИСУНОК 7. Процедура, использующая событие Welcome объекта cUser.
В результате пользователь при каждом запуске приложения увидит всплывающий экран с приветствием (рис. 8).

РИСУНОК 8. Всплывающий экран с приветствием
Если при попытке использования объекта
Если при попытке использования объекта обнаружилось, что IntelliSense не отображает свойств и методов объекта, возможно, это свидетельствует о том, что не создана либо не установлена объектная переменная. Однако иногда IntelliSense не отображает элементы даже в том случае, когда код правилен. В данном случае следует предположить, что код правилен, и проверить его. Компания Microsoft не предусматривала работу IntelliSense со всеми элементами кода.
При создании объектной переменной рекомендуется
При создании объектной переменной рекомендуется сразу перейти в конец процедуры и установить значение объектной переменной, равное
Nothing. Это позволит не забыть освободить объектную переменную после создания большой процедуры.
В данной статье описывается создание
В данной статье описывается создание объектов с помощью модулей класса. Следует помнить, что модули формы представляют собой модули класса. Можно добавлять свойства и методы к формам таким же способом, что и к пользовательским объектам.
Создание быстрых циклов
При работе с циклами по коллекции рекомендуется использовать
For...Each вместо
For...Next. При работе с циклами по элементам управления на форме код
For Each cnti on fcm
Next
выполняется быстрее, чем простой цикл
For...Each.
Если необходимо создать цикл по коллекции объектов, следует избегать ненужного обновления коллекции. Даже в маленькой базе данных обновление коллекции может значительно снизить быстродействие приложения.
При использовании цикла
For—Next можно сэкономить время, не повторяя переменную в строке Next.
For i=l to 100
.... .необходимый код
Next
Преимущества такого подхода особенно заметны при использовании вложенных циклов. Кроме того, не следует пересчитывать предельное значение для строки
For.
Верхнее предельное значение должно быть установлено перед входом в цикл.
reccount=rs.recordcount/2
For i=l to reccount
Next
Если не установить заранее значение верхнего предела, цикл пересчитывает значение при каждом проходе, а это — потеря времени.
Создание индексов, ускоряющих выполнение запросов
• Индексы могут ускорить процесс получения данных примерно в 10 раз.
• Индексы, кроме того, могут замедлить обновления и ввод данных, поэтому
их не следует создавать без особой необходимости.
• Рекомендуется создать такое начальное значение, которое что-нибудь значит для разработчика и пользователей. С точки зрения производительности нельзя разрешать Access создавать начальное значение путем вставки поля AutoNumber. Пока у пользователей нет других средств для идентификации своих записей данных, необходимо пользоваться чем-то более удобочитаемым. Можно попробовать применить номер телефона, номер карточки социального обеспечения, номер счета, код поставщика и т.д. Для того чтобы индекс на самом деле приводил к повышению производительности, необходимо его использовать вместе с запросами.
• Можно проиндексировать все поля, для которых приложение применяет условие отбора. Создание индексов на множественных полях в таблицах упростит оптимизацию запросов, созданных позже в процессе разработки.
• Можно проиндексировать поля с обеих сторон ожидаемой связки. Поскольку поля Order Number относятся как к таблице Order Detail, так и к таблице Orders, обе таблицы должны иметь соответствующий индекс. Но если необходимо выполнять много отчетов по дате заказа, возможно, данные поля также необходимо проиндексировать.
Создание экземпляров объекта
Рассмотрим повторно используемый в приложении программный код. Фактически его можно использовать одновременно в нескольких экземплярах объекта. Примером может служить код подключения к данным. Каждый раз, когда пользователь осуществляет поиск покупателя, открывает форму или получает доступ к полю со списком, с сервера должны быть получены данные. Вместо того чтобы дублировать код для каждой из данных процедур, лучше создать объект
Data Connection, позволяющий получить данные с сервера.
Создание классов
Для создания классов используются модули класса. Класс определяет свойства, методы и события, обеспечивая четко определенный и полностью документированный пользовательский интерфейс.
Создание коллекции VBA
Поскольку коллекции представляют собой объекты, коллекции создаются тем же способом, что и объекты. Во-первых, необходимо объявить объектную переменную для использования в качестве ссылки на коллекцию. Во-вторых, нужно воспользоваться ключевым словом Set для создания ссылки из объектной переменной на коллекцию. Следующий код создает коллекцию пользователей:
Dim Users as Collection
Set Users = New Collection
Создание методов
Метод — это действие, которое может быть выполнено над объектом. Чтобы создать метод для класса, достаточно создать общедоступную подпрограмму или функцию. Предположим, что нужно отслеживать дату и время каждой регистрации пользователя. Приведенный ниже код создает метод
Login,
который вводит в таблицу дату и время регистрации пользователя.
Public Sub Login()
' Создание объектной переменной для набора записей.
Dim rst As ADODB.Recordset
' Создание строковой переменной.
Dim strSQL As String
' SQL-оператор для tbIUsers.
StrSQL = "SELECT * FROM tbIUsers"
' Создание набора записей ADO.
Set rst = New ADODB.Recordset
' Открытие набора записей.
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
' Добавление новой записи.
rstAddNew
' Запись даты и времени регистрации пользователя.
With rst
!Name = Me.Name
!Date = Date
!Time = Time End With
' Сохранение новой записи.
rst.Update
' Закрытие набора записей.
rst.Close
' Уничтожение объектной переменной.
Set rst = Nothing
End Sub
Создание надежного кода
Не существует способа, который позволил бы избежать отладки приложений. Однако, если придерживаться следующих указаний, можно увеличить степень надежности кода и устранить ошибки.
Создание нескольких экземпляров объекта
Класс содержит определенный набор свойств и методов. Этим он напоминает шаблон или каркас. Для иллюстрации рассмотрим открытие нового документа в Microsoft Word. При создании нового документа
Word можно воспользоваться шаблоном, например. Contemporary Letter (Современное письмо). После выбора шаблона в документ можно внести изменения. Данные изменения вносятся в новый документ, а не в шаблон. Тот же самый принцип действует в случае с классами.
При инициализации (создании) класса экземпляр объекта содержит базовый набор свойств и методов (шаблон). С этого момента объект становится уникальным, обладая собственным набором значений свойств и методов.
Одно из преимуществ модулей класса заключается в том, что можно создать много экземпляров класса. Каждый экземпляр создастся с базовым набором свойств и методов, но после создания каждый из них может быть изменен различным образом. Например, предположим, создано пять объектов
cUser.
Вес пять объектов могут иметь разные значения свойств и разные методы. Например, значение свойства
Name в одном объекте может быть
James, а
в
другом —
Steve.
Для создания нескольких экземпляров объекта достаточно создать дополнительные объектные переменные и присвоить каждую объектную переменную новому объекту. Соответствующий код приведен ниже.
Public Sub ManyUsersO
Dim objUser1 as cUser
Dim objUser2 as cUser
Set objUser1 = New cUser
Set objUser2 = New cUser
ObjUser1.Name = "James"
ObjUser2.Name = "Steve"
MsgBox "Current users are: " & objUser1.Name & " and " objUser2.Name
Set objUser1 = Nothing
Set objUser2 = Nothing
End Sub
Создание объектной переменной
Переменная — это участок памяти, отведенный для хранения или использующийся при считывании информации. Вне всяких сомнений, у разработчиков имеется громадный опыт работы с простыми переменными, такими как строковые и целочисленные переменные. Ниже приведены примеры объявления и использования двух простых переменных:
Dim sfcrNaor aa String
Dim I as integer
strNama =
"James"
I = 10
В этих примерах переменные включают специфический тип данных, и информация может храниться и считываться по необходимости.
Переменная
Object
объявляется с помощью выражения
Dim, как и простые переменные:
Dim objUser as cUser
Создание перечисляемых типов данных
Перечисляемый тип — это значение свойства, которое может быть передано разработчику при использовании объекта. Например, при установке свойства
Visible
для формы после ввода знака равенства можно заметить, что возможен выбор значений
True и
False
в раскрывающемся списке (рис. 5).
РИСУНОК 5. Выбор True или False в раскрывающемся списке.
Точно так же можно передать эти значения, создав перечисляемые типы.
В разделе объявлений модуля класса для указания значений свойств необходимо воспользоваться ключевым словом
Enum. Например, если для свойства
Type объекта
cUser
необходимо создать раскрывающийся список со значениями
Manager, Staff или
Unknown, в разделе объявлений можно использовать следующий код:
Public Enum UserList
Manager
Staff
Unknown
End Enum
Следующий шаг — использование перечисляемого типа данных (
UserList) в качестве типа данных свойства
Type класса
cUser. Приведенный ниже пример иллюстрирует, как это сделать. В данном случае свойство было создано как общедоступная переменная.
Пример 1. Свойство объявляется как строковая переменная.
Public UserType as String
Пример 2. Свойство объявляется как перечисляемый тип данных.
Public UserType as UserList
Значения свойств можно установить с помощью раскрывающегося списка, предусмотренного технологией IntelliSense (рис. 6).
РИСУНОК 6. Пример перечисляемого типа данных
Чтобы показать, что значение свойства было выбрано из перечисляемых типов данных, каждый тип данных пронумерован, начиная с нуля, по возрастанию.
Создание приватной переменной модуля
При использовании процедур свойств значение свойства хранится в приватной переменной модуля. Создатель класса определяет, отображается ли данное свойство вне модуля.
Ниже приведен пример создания приватной переменной на уровне модуля для свойств
Name и Type объекта cUser.
Option Explicit
' Создание приватной переменной в разделе объявлений.
Private mstrName as String
Private mUserType as String
РИСУНОК 4. Установка и получение значений свойств объекта с помощью IntelliSense.
Создание событий
Объекты Access включают события. Например, объект формы содержит событие
Load, а командная кнопка — событие
Click.
Можно создавать события для пользовательских объектов. Для этого в разделе объявлений необходимо воспользоваться ключевым словом Event и указать имя события. Например, можно добавить событие Welcome, которое выполняется при запуске приложения пользователем. Для создания данного события в разделе объявлений модуля класса необходимо ввести следующий код:
Event Welcome()
Чтобы воспользоваться событием, его необходимо сформировать с помощью инструкции
Raise в методе объекта. Событие
Welcome можно сформировать в методе
Login объекта
cUser.
Когда пользователь запускает приложение, вызывается метод
Login.
Благодаря этому вызывается событие
Welcome,
которое отображает всплывающий экран с персональным приветствием данному пользователю. Используется следующий программный код:
Public Sub Login()
RaiseEvent Welcome
End Sub
Это все, что нужно предпринять для создания события и формирования его в модуле класса. В следующем разделе описано использование события в форме.
Создание свойств
Существует два способа создания свойств класса: глобальные переменные либо процедуры свойств.
Создание высокопроизводительного кода
Что касается кода, существует несколько способов, обеспечивающих более быстрое выполнение функций и подпрограмм. Хотя разница в скорости между одной методикой и другой заключается лишь в долях секунды, использование самой быстрой методики может предоставить больше возможностей для последующего повышения производительности. Когда к разработчику обращаются пользователи с просьбой о модификации, всегда лучше иметь некоторый резервный запас функциональных свойств, которым можно воспользоваться для вставки аудиторских следов и сложных контрольных процедур, чтобы не испытывать терпение пользователей.
Разработчик обнаружит, что внедрение некоторых методик, описанных выше в данной статье, позволяет упростить оптимизацию кода. Самая большая помеха для кода — это плохо разработанная база данных. Если база данных разработана плохо, почти каждая функция и подпрограмма будет содержать ошибки и использовать обходные пути. Применение искусственных приемов всегда замедляет выполнение программы по сравнению со стандартной методикой.
Однако существует несколько простых правил, которых необходимо придерживаться, и несколько альтернативных методик, используя которые можно добиться максимальной скорости выполнения функций и подпрограмм приложения. Очень не многие из описанных подходов сами по себе оказывают более или менее значительный эффект, но их совместное и многократное применение приводит к поразительным результатам.
Создание новой базы данных
Создание новой базы данных
Существует несколько способов создания базы данных, однако чаше всего создается пустая база данных, не содержащая информации или каких-либо объектов, описанных в главе 1, «Добро пожаловать в мир баз данных». В таких случаях говорят, что база данных создается с нуля.
Итак, мы приступаем к созданию базы данных.
1. Щелкните на ссылке Новая база данных в меню Создание файла. Если панель задач не открыта, щелкните на кнопке Создать на панели База данных, выберите команду Файл>Создать или нажмите комбинацию клавиш
.
2. В списке Папка в верхней области диалогового окна выберите опцию Мои документы (как это следует делать по умолчанию).
3. В поле Имя файла введите имя базы данных — в нашем случае Моя база.
4. Не изменяйте тип файла, используемый по умолчанию для баз данных Access (это файлы с расширением *.mdb). На рис. 2.3 показано диалоговое окно Файл новой базы данных. Безусловно, перечень представленных здесь файлов будет отличаться от того, который вы видим на своем компьютере.
5. Щелкните на кнопке Создать, и на экране появится основное рабочее окно Access (рис. 2.4). Более подробная информация о работе с ним содержится в главе 3, «Изучение главного рабочего окна Access».
Безопасность Access — это обширная тема, которая в данной - книге не затрагивается. Файлы с расширением *.mdw рекомендуется создавать только в том случае, если вы хорошо знакомы с различными аспектами безопасной работы Access, поскольку использование таких файлов может стать причиной неумышленного (а иногда и намеренного) повреждения базы данных.
В предыдущем упражнении база данных моя база была сохранена в папке Мои документы — одной из основных системных папок Windows. Если же вам потребуется другая папка, если же вы сохраняете файлы в специальной папке, можете настроить ее применение по умолчанию. Делайте это следующим образом.
1. Выберите команду Сервис>Параметры.
2. Перейдите на вкладку Общие.
3. Введите полный путь к папке, которая будет отображаться в диалоговом окне Файл новой базы данных, расположенном в разделе Рабочий каталог нижней области вкладки Общие.
4. Щелкните на кнопке ОК, чтобы вернуться к главному рабочему окну, или на кнопке Применить, чтобы сохранить внесенные изменения, не закрывая диалоговое окно Параметры.
Создание новой базы данных на основе уже существующей
Создание новой базы данных на основе уже существующей
Зачастую пользователи делятся между собой не только идеями относительно общей структуры базы данных, но и содержащейся в ней информацией. Предположим, один из друзей создал базу данных для упорядочения своей коллекции дисков DVD. Если вам в голову пришла аналогичная идея, можно взять копию базы друга и настроить ее в соответствии со своими потребностями. Ниже описываются шаги по созданию базы данных на основе уже существующей базы.
Средства оценки производительности
Разработчику важно знать, какое же влияние оказали на приложение все предпринятые усилия. Для отслеживания и оценки относительной производительности, достигнутой с помощью той или иной методики, можно использовать несколько разных инструментальных средств. Первый способ — это таймер для измерения количества времени, которое занимает выполнение процесса. Второй способ — недокументированная функция для подсчета операций с диском, кэшем и операций блокировки. Третий способ — способность Access отобразить план выполнения запросов для просмотра разработчиком. Первые два способа можно применять для оценки производительности практически каждой методики, описанной в данной статье. Планы выполнения запросов относятся только к оптимизации запросов.
Хотя VBA содержит функцию Timer(), она может оказаться не совсем точной для оценки предпринятых усилий по оптимизации. Функция VBA Timer() записывает в секундах промежуток времени, прошедший с полуночи. Поскольку измеренное время кодируется однозначным числом, в данном случае эта функция может оказаться не совсем точной, особенно для оценки промежутков времени меньше 1 секунды. Многие разработчики, кроме того, используют функцию GetTickCount.
Поскольку эта функция привязана к часовому таймеру PC, она возвращает время не в миллисекундах, а в приращениях 1/18 секунды. API Windows предлагает таймер, который отслеживает время в миллисекундах. Функция timeGetTimeO измеряет промежуток времени с момента запуска Windows. Поскольку она использует другой аппаратный счетчик, то возвращает время с точностью до миллисекунды.
Используя timeGetTime(),
можно вставить строку кода до и после выполнения любой критической операции и получить очень точное измерение времени, которое понадобилось для завершения действия.
Для использования вызова API необходимы две вещи: объявление функции и глобальная переменная для хранения времени запуска таймера. В разделе объявлений модуля необходимо ввести следующие три строки:
Private Declare Function a2ku apigettime Lib "winmm.dll" _
Alias "timeGetTime" () As Long
Dim Ingstartingtime As Long
Затем можно создать подпрограмму для запуска часов и функцию остановки часов.
Sub a2kuStartClock()
Ingstartingtime = a2ku_apigettime()
End Sub
Function a2kuEndClock()
a2kuEndClock = a2ku_apigettime() - Ingstartingtime
End Function
Использование данных функций для оценки производительности запроса иллюстрирует код, приведенный в листинге 1.
Листинг 1. Определение времени выполнения запроса.
Sub QueryTimer(strQueryName As String)
Dim db As Database
Dim qry As QueryDef
Dim rs as Recordset
Set db = CurrentDb()
Set qry =
db.QueryDefs(strQueryName)
'Запуск часов. a2kuStartClock
Set rs = qry.OpenRecordset()
'Остановка часов и вывод результата в окне отладки.
Debug.Print strQueryName & " executed in: " & a2kuEndClock & _
" milliseconds"
rs.Close
End Sub
ПРИМЕЧАНИЕ
Для достижения наибольшей точности измерения необходимо разместить вызов процедур a2kuStartClock и a2kuEndClock как можно ближе к местонахождению рассматриваемой процедуры.
Ссылка на специфический объект
К объектам в коллекции можно обращаться либо по номеру, либо по ключевому значению. При ссылке на элементы в коллекции по номеру необходимо помнить, что все элементы индексированы, а это означает, что отсчет начинается с 1. Проще обращаться к объекту в коллекции по ключевому значению. Приведенный ниже код иллюстрирует ссылку на специфический объект User2 с помощью обоих методов. Хотя указывать метод Item не обязательно (он действует по умолчанию), явное обращение способствует повышению восприимчивости кода.
' Обращение к объекту в коллекции по номеру индекса.
MsgBox Users.Item(2).Type
' Обращение к объекту в коллекции по ключевому значении.
MsgBox Users.Item("Steve").Type
Step Into
Для выполнения одного оператора кода одновременно необходимо в меню редактора Visual Basic выбрать команду Debug | Step Into (Отладка | Построчно) или нажать клавишу F8. Построчное выполнение кода — самый эффективный способ наблюдения за выполнением программы и значениями переменных в коде.
Step Out
Предположим, в пошаговом режиме выполняется процедура, вызывающая другую процедуру. Находясь в вызванной процедуре, можно быстро закончить выполнение оставшегося кода и возвратиться в исходную процедуру. Для этого в меню необходимо выбрать пункты Debug | Step Out (Отладка | Выход из блока) или нажать клавиши Ctrl+Shift+F8. Такая опция зачастую бывает достаточно полезной.
Run to Cursor
При пошаговом выполнении кода можно выполнить блок кода целиком до того места, где находится курсор. Такая опция полезна при работе в пошаговом режиме, когда необходимо перейти к следующему разделу кода. Одним из примеров может служить цикл. Проверив цикл несколько раз в пошаговом режиме, чтобы убедиться в его правильной работе, можно перевести курсор в конец цикла и выбрать в меню команду Debug | Run to Cursor (Отладка | Выполнить до курсора) или нажать клавиши Ctrl+F8.
Step Over
Иногда одна процедура вызывает другие процедуры. Вызываемая процедура может быть абсолютно надежной (иными словами, полностью протестированной и свободной от ошибок). Для выполнения вызванной процедуры целиком, без пошагового перехода от строки к строке, необходимо в меню выбрать команду Debug | Step Over (Отладка | Выполнение блока) Shift+FS.
После того как вызванная процедура завершится, снова произойдет останов. С этого места можно продолжить построчное выполнение кода.
Строка меню
Строка меню
В этом разделе описываются элементы строки меню, расположенной в верхней области рабочего окна Access. С помощью команд меню можно выполнять следующие действия:
- управлять файлами базы данных;
- создавать и изменять объекты базы данных;
- использовать данные совместно с другими программами пакета Office;
- изменять различные параметры Access.
При выборе команд в любом открытом меню обращайте внимание на значки, расположенные слева от некоторых команд (рис. 2.14). Эти значки дублируют функции значков, расположенных на панели инструментов. Кроме того, справа от команд указаны комбинации клавиш, с помощью которых можно выполнить соответствующие команды, не используя мышь.
Обратите внимание на подчеркнутые буквы в названиях команд меню — это так называемые горячие клавиши. Нажатие такой клавиши позволяет запустить нужную команду. К примеру, для отображения меню Файл следует нажать комбинацию клавиш , а затем — букву, которая в названии требуемой команды подчеркнута. Например, в команде Создать (в меню Файл) подчеркнута буква а, поэтому для открытия диалогового окна Создать нужно нажать клавишу <А>.
Свойства и методы коллекции VBA
Объект коллекции имеет очень простую структуру и содержит только одно свойство и три метода, как показано в табл. 1.
Таблица 1. Свойства и методы объекта множества.
Имя
|
| Тип
|
| Описание
|
|
Count
|
| Свойство
|
| Указывает, сколько элементов содержится в коллекции.
|
|
Add
|
| Метод
|
| Используется для добавления элементов в коллекцию.
|
|
Remove
|
| Метод
|
| Используется для удаления элементов из коллекции.
|
|
Item
|
| Метод
|
| Используется для ссылки на элементы в коллекции. Данный метод действует по умолчанию.
|
|
Свойства объекта сЕггог
Объект сЕггог
содержит свойства, значения которых могут быть использованы обработчиком ошибок. Описание приводится в табл. 1.
Свойства сЕггог.
Свойство
|
| Описание
|
|
Application
|
| Название программы, создавшей приложение (например, MS Access).
|
|
AVIFileLocation
|
| Имя и полный путь к видеофайлу AVI, который используется для предупреждения об ошибке в форме или диалоговом окне.
|
|
Class
|
| Имя модуля класса.
|
|
ComputerName
|
| Имя компьютера, на котором произошла ошибка.
|
|
ComputerTotalMemory
|
| Общий объем памяти, установленный в компьютере.
|
|
ComputerAvailableMemory
|
| Объем доступной памяти в компьютере.
|
|
ComputerOperatingSystem
|
| Информация об операционной системе и версии.
|
|
ComputerProcessor
|
| Информация о процессоре компьютера.
|
|
ControlName
|
| Имя активного элемента управления.
|
|
ControlValue
|
| Значение активного элемента управления.
|
|
CurrentRecordID
|
| ID текущей записи.
|
|
Description
|
| Описание ошибки, возвращаемое объектом Егг.
|
|
EmailAddress
|
| Адрес электронной почты, использующийся для отправки сообщения об ошибке.
|
|
ErrorDatabase
|
| Имя и полный путь к базе данных (например, базе данных Access или SQL Server), содержащей таблицу ошибок.
|
|
ErrorNumber
|
| Номер ошибки, возвращаемы объектом Err.
|
|
ErrorTextFile
|
| Имя и полный путь к текстовому файлу, содержащему информацию об ошибке.
|
|
HelpContext
|
| ID статьи файла справки, возвращаемый объектом Егг.
|
|
HelpFile
|
| Имя и полный путь к файлу справки, возвращаемые объектом Err.
|
|
LastDIIError
|
| Код системной ошибки для последнего вызова DLL.
|
|
Level
|
| Произвольно установленное значение для определения уровня срочности реагирования на ошибку.
|
|
LineNumber
|
| Номер строки оператора, в котором возникла ошибка.
|
|
Note
|
| Примечание пользователя о том, что он делал во время возникновения ошибки.
|
|
Now
|
| Дата и время возникновения ошибки.
|
|
Procedure
|
| Имя процедуры
|
|
SoundFile
|
| Имя и полный путь к звуковому файлу.
|
|
Source
|
| Имя объекта или приложения, сгенерировавшего ошибку.
|
|
User
|
| Имя пользователя, у которого произошла ошибка.
|
|
WaitStateFlag
|
| Флаг, использующийся в целях установки состояния ожидания, необходимого для останова выполнения кода
|
|
UserEnterNoteFlag
|
| Флаг, указывающий, поступал ли пользователю запрос на ввод примечания относительно ошибки.
|
|
При возникновении ошибки установлено большинство, если не все, из данных свойств. Затем можно получить информацию из объекта сЕггог и использовать в окне сообщения, электронном сообщении, записи в календаре и таблице ошибок в базе данных либо текстовом файле.
Методы cError.
Метод
|
| Описание
|
|
AddToErrorHandlerOutlookCalendar
|
| Добавляет информацию об ошибке в календарь Outlook, вызвавший Error Handler.
|
|
Clear
|
| Очищает объект Егг.
|
|
Email
|
| При возникновении ошибки отправляет разработчику электронное сообщение с помощью Outlook.
|
|
EmailAIIErrors
|
| Отправляет разработчику электронное сообщение с вложением, включающим всю информацию в таблице ошибок.
|
|
GetActiveControlValue
|
| Получает значение активного элемента управления при возникновении ошибок.
|
|
MessageBox
|
| Отображает окно сообщения с информацией об ошибке.
|
|
MsgErrorDetails
|
| Обобщает информацию об ошибке для окна сообщения или для электронного сообщения
|
|
OfficeAssistant
|
| При возникновении ошибки вызывает Office Assistant (помощника) и спрашивает пользователя, не желает ли он ввести примечание, относящееся к ошибке.
|
|
PlaySound
|
| Воспроизводит звук при возникновении ошибки для привлечения внимания пользователя.
|
|
ProcessError
|
| Контролирует обработку информации об ошибке в зависимости от опций, установленных в данной организации.
|
|
ShowAVIForm
|
| Вызывает форму, включающую AVI-файл, для оповещения пользователей о возникновении ошибки
|
|
UserlnputBox
|
| Отображает окно ввода для пользователя, чтобы они могли ввести свои замечания.
|
|
UserName
|
| Получает зарегистрированное имя пользователя в Windows/Windows NT.
|
|
WaitState
|
| Создает состояние ожидания для остановки выполнения кода.
|
|
WriteErrorToTable
|
| Записывает информацию об ошибке в таблицу ошибок базы данных.
|
|
WriteErrorToTextFile
|
| Записывает информацию об ошибке в текстовый файл.
|
|
Опции обработчика ошибок.
Опция
|
| Описание
|
| Тип данных
|
|
AccessErrorTableName
|
| Имя таблицы Access, которая содержит информацию об ошибках.
|
| Да/Нет
|
|
AddToErrorHandlerCalendar
|
| Добавить ошибку и календарь обработчика ошибок.
|
| Да/Нет
|
|
AVIFileLocation
|
| Полный путь к AVI-файлу, использующемуся в AVI-форме.
|
| Текст
|
|
DatabaseName
|
| Имя базы данных, в которой находится таблица ошибок.
|
| Текст
|
|
DatabasePath
|
| Полный путь к базе данных.
|
| Текст
|
|
EmailAddress
|
| Адрес электронной почты для отправки сообщений об ошибках.
|
| Текст
|
|
EmailErrors
|
| Отправить сообщение при возникновении ошибки.
|
| Да/Нет
|
|
ErrorsToAccessTable
|
| Сохранить информацию об ошибке в таблице Access.
|
| Текст
|
|
ErrorsToTextFile
|
| Сохранить информацию об ошибке в текстовом файле.
|
| Текст
|
|
PlaySound
|
| Воспроизвести звук при возникновении ошибки.
|
| Да/Нет
|
|
ShowAVIForm
|
| Отобразить AVI-форму при возникновении ошибки.
|
| Да/Нет
|
|
ShowMsgBoxErrors
|
| Отобразить окно сообщения с информацией об ошибке.
|
| Да/Нет
|
|
ShowOfficeAssistant
|
| Отобразить помощник при возникновении ошибки.
|
| Да/Нет
|
|
JoundFile
|
| Полный путь к звуковому файлу.
|
| Текст
|
|
UserEnterNoteAboutError
|
| Пользователь ввел примечание.
|
| Да/Нет
|
|
В зависимости от того, какие опции выбраны, обработчик ошибок работает по-разному. Для хранения информации об опциях обработки ошибок используется таблица, поэтому код "управляется таблицей". Вместо записи в коде новых значений опций достаточно ввести опции в таблице Error Options. Поскольку код обращается за информацией к таблице Error Options, работать таким образом гораздо удобнее.
Конечно, разработчику не нужно, чтобы пользователи вводили данные непосредственно в таблицу Access. Форма fnnErrorOptions позволяет сотрудникам обновлять и изменять опции обработки ошибок (рис. 13).
Созданный обработчик ошибок не только функционален и эффективен, но и удобен в использовании для сотрудников организации.
РИСУНОК Форма опций обработки ошибок, использующаяся для выбора соответствующих опций.
Тестирование приложения
Перед распространением приложения Access необходимо полностью его протестировать. Более подробная информация относительно тестирования приведена в статье «Планирование процесса разработки».
Удаление кода в окне отладки
Для быстрого выделения всего кода в окне отладки в целях последующего удаления используется комбинация клавиш Shift+Ctrl+Home, если курсор находится в конце кода в окне Immediate. Весь код будет выделен, и можно нажать клавишу Delete для его удаления.
Если курсор находится в начале кода в окне Immediate, необходимо использовать
комбинацию клавиш Shift+Ctrl+End для выделения всего кода. Затем можно нажать клавишу Delete.
Удаление отдельных объектов
Чтобы удалить отдельные объекты из множества, необходимо воспользоваться номером индекса объекта либо ключевым значением.
' Удаление объекта по номеру индекса.
Users.Remove 2
' Удаление объекта по ключевому значению.
Удаление всех объектов
Чтобы удалить все объекты из коллекции, не обязательно создавать цикл по всем элементам множества и вызывать метод удаления. Гораздо проще переназначить объект коллекции в новую коллекцию.
' Удаление всех объектов из коллекции.
Set Users = New Collection
Упрощение кода в целях последующей поддержки и обновления
С помощью классов единственный фрагмент кода можно использовать в приложении множество раз без повтора кода. Если, например, код доступа к данным один и тот же в нескольких процедурах, необходимо найти все места, где появляется данный блок кода, и проверить, не нужно ли внести изменения. Такой подход занимает очень много времени и совершенно неэффективен. С другой стороны, если используется объект
Data Connection, все обновления или изменения кода доступа к данным необходимо внести лишь в одном месте — модуле класса.
Установка опций обнаружения ошибок
В редакторе Visual Basic (вкладка General (Общие) в меню Tools | Options (Сервис | Параметры)) можно найти некоторые дополнительные опции обработки ошибок Access (рис. 16).
РИСУНОК 16. Установка опций обнаружения ошибок.
Break on All Errors (Прерывание на всех ошибках). При возникновении ошибки код прекращает выполнение на данной строке вне зависимости от наличия обработчика ошибок. Данная опция полезна для отладки приложения, но перед распространением приложения ее необходимо отключить.
Break in Class Module
(Прерывание в модуле класса). При возникновении ошибки код прекращает выполнение на данной строке только в модулях класса, если нет обработчика ошибок.
Break on Unhandled Errors (Прерывание на необрабатываемых ошибках). При возникновении ошибки код прекращает выполнение на данной строке во всех процедурах, которые не содержат обработчик ошибок.
Установка прерываний
Прерывание останавливает выполнение кода. Для установки точки прерывания необходимо поместить курсор на оператор и в меню редактора Visual Basic выбрать команду Run | Toggle Breakpoint (Выполнить | Переключить прерывания) или нажать клавишу F9. Следует помнить, что нельзя установить прерывание на пустой строке, строке комментария или строке кода, содержащей оператор
Dim. Еще один способ установки прерывания — щелкнуть на сером левом поле окна кода рядом с соответствующей строкой кода. При этом на левой границе появится большая красная точка, которая указывает на установленную точку прерывания.
При запуске программы выполнение приостанавливается на том операторе, где установлено прерывание (рис. 7). Автоматически открывается модуль кода, и оператор кода будет выделен желтым цветом. Можно шаг за шагом проходить по коду, просматривать или менять значения переменных и т.п.
РИСУНОК 7. Выполнение кода приостановлено на точке прерывания
Для удаления точки прерывания необходимо в меню выбрать команду Run | Clear All Breakpoints (Выполнить | Убрать прерывания) или
нажать клавиши Ctrl+Shift+F9.
Установка приложения с учетом достижения оптимальной производительности
Способ настройки файлов приложения может оказать ощутимый эффект на скорость его выполнения. Следующие указания помогут вам оптимизировать работу приложения и в полной мере воспользоваться
советами, которые приведены в других разделах данной статьи.
• Необходимо отделять данные от приложения. В качестве стандартной практики рекомендуется создавать один файл .MDB для хранения таблиц и размещать его в сети, а другой файл .MDB — для хранения запросов, форм, отчетов и т.д. Это поможет повысить производительность, улучшить работу в многопользовательской среде и обслуживание. Из всех советов, приведенных в данной статье, от этого следует отказываться только по очень важной причине.
• Рекомендуется использовать текущую версию файла рабочей группы (system, mdw). Хотя в приложении можно пользоваться предыдущими версиями файла рабочей группы, текущая версия обеспечивает более высокую производительность.
• Необходимо регулярно производить сжатие базы данных. Кроме того, базу данных следует сжимать после выполнения обширных операций импорта, удаления и обновления. Сжатие базы данных обеспечивает использование свободного места между страницами данных (резерва) и позволяет выполнить перерасчет статистики базы данных, использующейся при оптимизации запросов. (Более подробно данная тема рассмотрена дальше в этой статье.) Сжатие базы данных, кроме того, позволяет освободить дисковое пространство для других целей. Access 2000 предлагает новую возможность — сжатие базы данных при выходе из базы данных. Для этого необходимо установить флажок Compact on Close (Сжимать при закрытии) во вкладке General (Общие) диалогового окна Options (Параметры) в меню Tools | Options (Сервис | Параметры). Некоторые разработчики обнаружили, что предыдущие версии Access следует сжимать дважды, чтобы добиться хороших результатов. Можно попробовать запустить базу данных из отдельного файла .MDB и позволить этому стартовому приложению выполнить сжатие при запуске базы данных. В сочетании с опцией Compact on Close при каждом выполнении будет производиться двойное сжатие.
• При возможности следует установить версию .MDE для приложения. При этом существует несколько преимуществ. Версия .MDE требует наличия скомпилированных модулей, а скомпилированные модули выполняются быстрее, чем нескомпилированные. Кроме того, для .MDE требуется меньший объем ОЗУ и меньше дискового пространства, чем для .MDB, что повышает производительность.
В начале...
При запуске приложения первое, что видят пользователи, — начальная форма. Она может представлять собой всплывающий экран с названием приложения и другой информацией или кнопочную панель для навигации по приложению. В любом случае из данной формы следует удалить код. Код запуска формы следует записать в стандартный модуль и выполнять только те процедуры, которые необходимы для запуска приложения. Поскольку такая форма будет загружаться быстрее, она создаст у пользователя хорошее первое впечатление. Возможно, выполнение некоторых операций можно отложить на какое-то время. После удаления модуля из формы свойству
HasModule необходимо присвоить значение No. Это поможет создать простую форму, которая будет выполняться быстрее. Однако, изменив значение свойства
HasModule, разработчик уничтожает весь код формы и код элементов управления. Перед изменением данного свойства следует убедиться, что все подпрограммы и функции размещены в стандартном модуле.
Начальная форма
не должна содержать элементы управления ActiveX. Элементы ActiveX замедляют процесс загрузки больше, чем все другие элементы управления. Если в начальной форме необходимо использовать элемент ActiveX, возможно, следует ограничить количество других элементов управления.
Вместо макросов AutoExec лучше воспользоваться опцией Startup Form.
Вставка модуля класса
Создание класса не вызывает никаких сложностей. Добавление свойств и методов к объекту требует несколько больших усилий.
Для создания класса необходимо вставить модуль класса в приложение Access и присвоить
ему имя. Имя модуля класса является именем объекта.
Чтобы вставить модуль класса, необходимо в меню выбрать пункты Insert | Class Module (Вставка | Модуль класса). После этого откроется окно редактора Visual Basic. В окне кода можно определять любые свойства, методы и события для данного объекта. Перед тем как продвигаться дальше, необходимо присвоить имя модулю класса (рис. 3).
РИСУНОК 3. Присваивание
имени модулю класса
.
Выбор размеров переменных
При объявлении переменной следует использовать наименьший размер переменных из возможных. Не нужно применять двойное слово, когда достаточно применить целый тип. По возможности необходимо использовать строки фиксированной длины вместо строк переменной длины.
Выполнение кода в пошаговом режиме
Когда выполнение кода приостанавливается из-за прерывания, выражение кода, выделенное желтым цветом, не выполняется. Продолжить выполнение кода можно несколькими способами.
Выполнение операторов в окне Immediate
Для выполнения оператора кода в окне отладки необходимо поместить курсор где-нибудь в операторе. Курсор не обязательно должен находиться в начале или в конце оператора кода.
Если в окне Immediate отображается несколько операторов кода, не обязательно удалять операторы, находящиеся после требуемого оператора. Достаточно поместить курсор где-нибудь в операторе кода, который необходимо выполнить, и нажать клавишу Enter.
Выполнение пользовательских функций
Для запуска пользовательских функций в окне Immediate необходимо ввести знак вопроса, имя функции и соответствующие параметры, например,
? MyFunction.
Выполнение пользовательских подпрограмм
Для выполнения пользовательских подпрограмм в окне Immediate необходимо ввести имя подпрограммы и соответствующие параметры, например,
MySubProcedure. Перед именем подпрограммы знак вопроса не ставится.
Выполнение программы с обработкой ошибок
Рассмотрим изменение хода выполнения программы при наличии обработчика ошибок. Если в коде не содержится ошибок, программа выполняется так (обработчик ошибок не вызывается):
Sub Demo ( )
On Error GoTo ErrorHandler
Good code
ExitHere:
Exit Sub
ErrorHandler:
MsgBox "An error occurred"
Resume ExitHere End Sub
Если какое-либо выражение кода содержит ошибку, программа выполняется по-другому, поскольку выполняется обработчик ошибок:
Sub Demo ( )
Вызов API Windows для получения
• Date and time (Дата и время). Дата и время возникновения ошибки. Эта информация полезна для анализа частоты возникновения ошибок. Простой график должен показывать, что со временем программные ошибки возникают реже.
• Notes about the error (Комментарии к ошибке). Пользователи могут вводить информацию о том, что они делали в момент возникновения ошибки, или свои замечания. Эта информация может быть введена в отдельном поле или форме. Пользователи могут воспользоваться простой формой для сообщения о том, что происходило в момент появления ошибки. Необходимо сообщить пользователям, что данная информация необязательна. Возможно, одни пользователи никогда ничего не напишут о возникающей ошибке, в то время как другие захотят сообщить полезную информацию.
Благодаря информации, которая может быть получена с помощью объекта
Err и других методов, разработчики могут быстро и эффективно устранить ошибки рабочего цикла.
Вызов событий Initialize и Terminate
Модули класса автоматически включают события инициализации и завершения. Для использования данных событий необходимо выбрать событие в поле со списком в верхней части окна кода.
Событие инициализации вызывается при создании объекта. Например, если нужно, чтобы выполнялся определенный код при создании объекта
cUser,
данный код можно поместить в событие
Initialize.
Событие завершения происходит при разрушении объекта. Здесь удобно записывать код очистки, выполняющийся при закрытии подключений к базам данных, освобождении объектных переменных и т.д.
Вызовы API Windows
Все выполняемые функции комплексного обработчика ошибок нельзя запрограммировать в Microsoft Access, необходим вызов нескольких API Windows.
Обработчик ошибок получает имя пользователя, у которого произошла ошибка. Вместо того чтобы регистрировать пользователя в приложении для получения этой информации, обработчик ошибок получаст имя пользователя из API Windows. Вызов API Windows считывает зарегистрированное имя пользователя в Windows 95/98/NT.
' Вызов API Windows для получения имени пользователя.
Private Declare Function GetUserNmae Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal IpBuffer As String, nSize As Long)
При возникновении ошибки можно воспроизвести звуковой сигнал для предупреждения пользователей. Для этого также необходим вызов API Windows:
' Вызов API Windows для воспроизведения звука.
Private Declare Function sndPlaySound32 Lib "wirumn.dll" Alias _
"sndPlaySoundA" (ByVal IpszSoundName As String, ByVal uFlags As Long) As Long
Другие вызовы API Windows получают имя компьютера, информацию об объеме памяти компьютера, операционной системе и информацию о процессоре.
Закрытие и разрушение избыточных данных
Быстрый код — это чистый код. Необходимо убедиться, что по окончании работы с наборами записей они будут закрыты, а объектам, когда они будут не нужны, присвоены пустые значения. Ненужные объекты поглощают значительный объем памяти, который мог бы быть использован другими частями приложения.
rs.Close
Set db=Nothing
Завершение работы
Завершение работы
После праведных трудов необходимо корректно завершить работу с базой данных и Access. Закройте активную базу данных, щелкнув на кнопке Закрыть (X) в правом углу строки заголовка окна База данных. Кроме того, это можно сделать с помощью команды Файл>Закрыть.
Для завершения работы с Access также можно щелкнуть на кнопке Закрыть в правом углу строки заголовка или выбрать команду Файл>Выход. Существует возможность закрыть Access одновременно с активной базой данных — для этого подойдет любой из описанных выше методов.
Имейте в виду, что отключение компьютера без корректного завершения работы с базой данных и Access может привести как к повреждению самого файла базы, так и к потере данных, причем без возможности их восстановления.