Рассылка статей | Выпуск 58. Оптимизация приложений в Access
Leadersoft.ru

Рассылка статей

Программирование и готовые решения

В этом разделе сайта дается информация от https://leadersoft.ru о статьях по программированию, ответах на вопросы и др. Статьи рассылаются подписчикам и публикуются на разных сервисах. Возможно некоторая информация устарела и ссылки не работают, но эти сведения могут быть полезны, если Вы серьезно занимаетесь разработкой баз данных

Выпуск 58. Оптимизация приложений в Access

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

Автор. Парусников Алексей

Оптимизация приложений в Access. Часть 2.

Форма (модуль) … : добавьте инструкцию Option Explicit.

     Во многих языках программирования переменные должны быть объявлены обязательно, и эти объявления используются компилятором, чтобы зарезервировать память для переменных. В то же время в VBA объявление переменных не является обязательным, и допускается использование неописанных переменных.
     Когда-то среди программистов, использующих разные языки программирования, велись споры по поводу необходимости обязательного описания всех переменных. Действительно, кому охота занудно прописывать каждую переменную Dim i As Integer, j As Integer и т. д. Однако другой стороны, один из самых опасных источников труднообнаруживаемых ошибок в языках программирования, допускающих применение неописанных переменных, это опечатки в написании имен переменных. Такие опечатки истолковываются транслятором как появление еще одной, новой переменной, отличной от ранее использовавшейся, и не воспринимаются как ошибки. Порой для обнаружения такой опечатки требуется время, во много раз превосходящее то, которое потребовалось бы на явное описание всех используемых в программе переменных.
     В VBA решено было так — предоставить разрешение этой дилеммы самому программисту. В этом языке имеется оператор Option Explicit. Если Вы начнете свой модуль с этого оператора (он должен быть расположен в самом начале модуля, до того, как начнется первая процедура этого модуля), то VBA будет требовать обязательного объявления переменных в этом модуле и генерировать сообщения об ошибке всякий раз, как встретит необъявленную переменную. Кроме того, чтобы это требование стало обязательным для всех модулей без исключения, можно установить параметр Require Variable Declaration (Явное описание переменных) на вкладке Editor (Редактор) диалогового окна Options (Параметры) редактора VBA.
     Если же не использовать Option Explicit и переменные не объявлять, то переменной по умолчанию присвоится тип Variant. Вот на это и ругается мастер – на переменную общего типа.  Дело в том, что такие переменные занимают больше места в памяти по сравнению с данными других типов, а главное, они не могут быть обработаны немедленно. Когда компилятор обнаруживает вариантную переменную, то сначала должен выяснить ее настоящий тип, преобразовать в него данные, а уж потом делать с ними вычисления. На все это требуются время, и если в простых приложениях, где нет сложных вычислений,  можно применить переменные типа Variant, то в сложных, особенно где происходит много вычислений с двойной точностью, разница по скорости вычислений может отличаться в разы. Вообще, у профессиональных программистов VBA считается хорошим тоном прописывать в заголовке Option Explicit – тем самым вы избежите не только вышесказанные проблемы, но и многие другие, касающиеся не только производительности.

Форма…: используйте меньшее число элементов.

     Это пожалуй, самая часто встречающаяся рекомендация мастера. Действительно, многие начинающие разработчики стараются «навешивать» на одну форму множество элементов: полей, полей со списками, подчиненных форм, вкладок на которых опять поля, подчиненные формы и т. д. Все это делается с целью сделать приложение более «наглядным», чтоб «все сразу было видно». Чем это чревато? Потерей скорости загрузки такой формы.
     Дело в том, что обычно каждый элемент (контрол) имеет связанный с ним источник данных, который нужно «подцепить» при открытии. Не зря ведь существует столько событий формы, связанной с ее запуском: открытие, загрузка, включение, получение фокуса – как раз для того, чтобы управлять процессом «подцепления» данных, когда нет возможности использовать меньше элементов. Рассмотрим обычные ошибки начинающих разработчиков и способы из устранения.

1.     Число записей в форме

     Бывает так, что прежде нормально грузившаяся форма, вдруг начинает «тормозить». Одной из причин может быть то, что источник данных такой формы – вся таблица, которая, как известно, заполняется. Все нормально, пока данных там порядка нескольких тысяч, но стоит поработать с базой несколько лет - и количество записей (особенно в бухгалтерских программах) может перевалить за несколько сотен тысяч. И при работе такая форма заметно потяжелеет, особенно, если она сделана как подчиненная на основной. Как выход – использовать в качестве источника данных формы запрос, где количество записей можно ограничить, например, периодом дат (текущий год, месяц).

2.     Подчиненные формы.

     Старайтесь не использовать больше одной - двух подчиненных форм на основной. Помните, что при открытии основной формы последовательно происходит загрузка в саму форму и подчиненные, что требует времени. Особенно это касается форм с вкладками, на которых расположены подчиненные. Если отказаться от такого дизайна не получается, тогда применяйте динамическую привязку данных к подчиненным формам при переходе по вкладкам, используя свойство формы RecordSource:

Forms!frmGlawn!frmSub.Form.RecordSource = "Имя запроса"

     Еще один признак начинающего разработчика – наличие на форме множества скрытых полей и подчиненных форм, которые используются либо для вычислений, либо в случае с формами – как своеобразный фильтр для получения значения поля из таблицы по заданному параметру (значению в другом поле). Такой способ действительно прост: источником данных такой формы делается запрос, в котором есть ссылка на поле главной формы Forms!frmGlawn!Поле1. В нужный момент делается обновление формы (Requery) и считывается значение из подчиненной формы. Но если таких форм прицеплено несколько, и каждый раз их обновлять – это может заметно сказаться на скорости работы приложения. Лучше вместо этого воспользоваться стандартной функцией:

DLookup("Имя поля таблицы или запроса", "Имя таблицы или запроса", "[Имя поля таблицы по которому фильтруем] = значение фильтра") – см. Help

3.     Поля со списками.

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

Поле1.RowSource = "ИмяЗапроса"

     Мы рассмотрели только самые простые рекомендации, которые смог определить мастер. Можно еще добавить:

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

Ответы на вопросы

Вопрос 1. Как программно написать сжатие БД при выходе из нее?
  Ответ.1. Нельзя сжимать файл в котором работаешь. В настройках есть функции сжатия, которые срабатывают при закрытии программы.
              2. Из VBA можно сжать базу. В справке надо посмотреть фунцию CompactDatabase
Вопрос 2. База в открытой папке. Разделена мастером разделения (то бишь в одном месте таблицы, в другом - формы и запросы). Многопользовательский режим разрешен (режим открытия - общий). Когда пользователь хочет залезть в базу, он залезает в эту открытую папку и собственно пользуется ею. Но, как только пользователей становится 2, то пишет, что слишком большое количество юзеров. Все окна в формах заблокированы, доступа к ним нет, т.е. в принципе база открыта практически только на чтение. Хотелось бы, чтобы все таки можно было открывать большому количеству пользователей и чтобы они могли только читать, а я (как администратор) - исправлять.
Я понимаю, что надо сделать так:
- файл mdb с данными (таблицами) на компьютере "сервере" в папке с открытым общим доступом
- файлы mdb или mde с формами и запросами на компьютерах пользователей (естественно, они должны быть связаны с файлом данных) - у каждого пользователя свой.
:shock: :shock: Как связать эти файлы. Я пыталась воспользоваься F1, но что-то ничего не поняла. Там написано, что надо создать макрос, а я с макросами не дружу совсем. Не поможете?
  Ответ. Есть диспетчер связанных таблиц (Сервис-Служебные программы), он позволяет привязать интерфейс к таблицам на сервере. Есть также пример на сайте как это сделать из VBA.
Вопрос 3. Подскажите пожалуста при помощи какой фонкции проверить пустое поле или нет ?
  Ответ. if nz(fld,"") = "" then
Вопрос 4. Привет всем!
Может кто нибудь подскажет как заставить работать скроллинг в VBA редаторе Offica. При работе в нем это очень облегчило бы жизнь.
  Ответ. http://www.gasanov.net/VBScroll.htm тебе поможет и мышек не надо...
Вопрос 5. Как задать иконку какую-нибудь на форму? или вообще убрать стандарную аксесовскую, но чтобы остался крестик закрытия..скажите пожалуйста! И еще..создал кнопку удаления мастером, жму на нее, у меня аксесс просит подтверждение удаления, как избавиться от него?
  Ответ.  1. В меню Сервис-Параметры-Правка и Поиск

 

Добавить комментарий

Loading