Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Microsoft Access - программирование и готовые решения


Выпуск 57. Материалы для начинающих (4 урок)

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         22.01.2007
Автор:      Парусников Алексей
Сайт:        http://www.accessoft.ru под редакцией с http://www.leadersoft.ru/
Новые материалы: оптимизация
На сайте AccesSoft публикуются статьи, посвященые вопросам, связанным с разработкой и продвижением приложений Access. Вы так же можете ознакомиться с готовыми программами, получить исходный код, купить программу, связаться с автором для решения вопроса о доработке программы под Ваши требования.



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

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

     Иногда при разработке приложений возникает ситуация, когда еще недавно работающая программа вдруг начинает «тормозить», запросы, ранее выполнявшиеся что называется «в полсекунды» начинают зависать и т. д. Попробуем разобраться, что может быть причиной этому и составить общие рекомендации по поводу оптимизации приложений. Как известно, в Ассеss есть мастер, позволяющий провести беглый анализ приложения. Жмем Сервис – Анализ – Быстродействие – Все типы объектов – Выделить все – ОК. Итак, что же обычно мы видим?

Приложение не сохранено в полностью откомпилированном виде.

     Это означает, что нужно преобразовать базу из формата .mdb в формат .mde. Делать это нужно закрыв приложение и запустив Access. Далее находим Сервис – Служебные программы – Создать mde файл. Причем, если приложение создавалось в другой версии Access, ее сначала следует преобразовать в текущую: Сервис – Служебные программы – Преобразовать базу данных, а уже потом делать из нее .mde. В результате получится преобразованная копия базы (.mde).
     Начиная с версии Access 2000 поддерживается совместимость версий «снизу вверх». Это означает, что .mde файл сделанный в Access 2000 будет работать в более поздних версиях, а вот наоборот – не будет. Дело в том, что от версии к версии меняется формат .mde файла, и то, что понятно для Access 2002 – китайская грамота для Access 2000.
     Преобразованная таким образом база будет работать быстрее, потому, что скомпилируются все модули приложения. Но в результате Вы уже не сможете редактировать формы и отчеты в режиме конструктора. Преобразовать .mde в .mdb обратно стандартными средствами Access так же будет невозможно. Об этом следует помнить и всегда сохранять исходную (.mdb) версию базы. Стандартными нельзя, но… Как известно, нет такого замка, которого невозможно открыть. Теоретически (да и практически) можно декомпилировать базу (и не такие программы «ломали»), но это уже относится к области «хакеров», и по понятным причинам в данной статье освещаться не будет. Остановимся лишь на одном интересном для начинающих разработчиков Access вопросе.
     Часто программисты, ранее разрабатывавшие приложения в других средах (Си, Delphi, FoxPro и др.) спрашивают: «Как сделать в Access .exe? (исполняемый файл, способный работать сам по себе, без Access)». Ответ всегда один: никак.  И причин тому несколько:

  1. дело в том, что изначально язык VBA разрабатывался как вспомогательное средство создания офисных документов, его определение в переводе так и звучит: «Визуальный язык программирования для приложений (офисных)», и само собой подразумевалось, что созданные с его помощью приложения будут работать только под управлением родительского приложения, в данном случае Access. Поэтому при компиляции в Access создается не машинный (двоичный) код, а так называемый p-код. Р-код близок к машинному, но программа в Р-коде не может быть непосредственно выполнена процессором. Преобразование (трансляция) в двоичный код происходит во время выполнения программы. Это сделано для отладки приложений. Без p-кода невозможно было бы прерывать выполнение приложений, редактировать тексты программ и снова продолжать выполнение. Кстати, аналогично ведь происходит и в других средствах разработки. Везде присутствует «промежуточная» трансляция.
  2. хотя Microsoft постоянно совершенствует VBA, но «отдавать» его как средство для создания независимых коммерческих приложений пока не собирается. Очевидно, что в этом случае компания может потерять значительную часть прибыли от реализации новых версий Office, ведь для того, чтобы к примеру запустить приложение Access, созданное в более новой версии Access (с новыми возможностями), необходимо установить (купить) эту новую версию. Вообще, эта тема – коммерческое распространение приложений Access заслуживает отдельной статьи, и я постараюсь в одной из следующих статей подробно остановиться на этом. Пока скажу лишь, что проблема эта вполне решаема и многие успешно реализуют свои программы.

Таблица … : свяжите с другими таблицами базы данных

     Как следует из ответа мастера, в базе есть не связанная с другими таблица. В некоторых случаях это оправдано – речь идет о так называемых «служебных» таблицах, в которых заносятся какие либо параметры приложения. В этом случае ответ мастера можно проигнорировать. А вот если речь идет о справочной таблице, откуда подставляются значения (ключи) в основную таблицу, то к мастеру стоит прислушаться. Дело в том, что Access относится к самому распространенному сейчас классу реляционных СУБД, основным признаком которого является то, что данные распределены в базе, словно одежда в платяном шкафу: носки в ящике для носков, штаны в ящике штанов и т. д. Помимо этого они еще и связаны между собой логическими связями. Например: Комплект верхней одежды – это штаны + рубашка + носки. Потянув за такую «нитку» машина может вытащить весь комплект и определить его состав, а это значит, что если вы зададите ей искать головной убор (шапку) – в раздел для верхней одежды она уже не полезет, стало быть, шапка найдется быстрее. Вот это мастер и пытается нам втолковать. То есть такая «правильная» база, это как хороший шкаф у аккуратного хозяина, в котором есть отделы, в отделах секции, в секциях ячейки. В свою очередь «плохая» база – это сундук, где все свалено в одну кучу – попробуй, найди там чего. Вообще, лично я, когда хочу определить уровень разработчика Access, первым делом смотрю, как связаны у него таблицы, как распределены данные. Причем иногда оказывается, что вообще никак. Дескать, пусть сам Access разбирается, что и с чем там связано.
     Установка связей между таблицами делается в специальной вкладке Схема данных. Жмем сервис – схема данных или просто правой кнопкой в окне проекта и в контекстном меню выбираем схема данных. В открывшемся диалоговом окне снова жмем правой кнопкой и выбираем Добавить таблицу. В появившемся диалоговом окне раскрываем вкладку таблицы и выбираем нужные: щелкаем дважды по названиям и таблицы появляются в окне конструктора. Закрываем окно со списком таблиц.
     Для установки связи между таблицами нужно выбрать в одной из таблиц (главной) таблице поле для связи, нажать левую кнопку мыши и перетащить поле во вторую таблицу. Отпустить левую кнопку мыши над тем полем подчиненной таблицы, с которым устанавливается связь. После этого появится диалоговое окно Изменение связей. Здесь можно поставить автоматическую проверку ссылочной целостности – флажок обеспечение целостности данных, и если требуется, каскадное обновление/удаление связанных полей. Я практически всегда включаю флажок обеспечение целостности данных, потому, что если этого не сделать, то в скором времени Ваша база забьется «мусором» - появятся ни с чем не связанные записи.

Таблица … : добавьте индекс для поля…

     Индекс - это упорядоченный список значений и ссылок на те записи, в которых хранятся эти значения. Чтобы найти нужные записи, СУБД сначала ищет требуемое значение в индексе, а затем по ссылкам быстро отбирает соответствующие записи.
     В каждой таблице должен быть так называемый ключ – идентификатор записи. Исключение составляют лишь специальные служебные таблицы, обычно с параметрами приложения, в которых, как правило, обычно не много записей. Чаще всего ключами делают поля типа «счетчик» - числовое поле с уникальными значениями. Но мастер просит проиндексировать еще одно поле в таблице, хотя в нем уже есть ключ-счетчик. Дело в том, что видимо в данном случае в каких либо запросах часто используется это поле, и по нему вытягиваются другие записи.  Если поле проиндексировать, то поиск (выполнение запроса) пойдет быстрее.
     Однако индексирование может привести и к обратному эффекту. Дело в том, что при добавлении и удалении записей или при обновлении значений в индексном поле требуется обновлять индекс, что при большом количестве индексов в таблице может замедлять работу. Поэтому индексы обычно рекомендуется создавать только для тех полей таблицы, по которым наиболее часто выполняется поиск записей. Индексировать можно любые поля, кроме МЕМО-полей, полей типа Гиперссылка и объектов OLE.
     Итак, открываем таблицу в режиме Конструктора, выбираем поле, для которого требуется создать индекс, далее вкладка Общие и выбираем для свойства Индексированное поле значение Да (Допускаются совпадения) или Нет (Совпадение не допускаются).
     Индекс может быть так же и составным. Обычно такую индексацию применяют, когда нужно задать уникальные значения для группы полей. Например, в одном поле номер договора, в другом идентификатор. Нужно, что в таблице разрешалось сохранение данных типа 12П, 12Р, 12Н, а вот два раза 12П не разрешалось – сразу должно появиться сообщение о повторяющихся записях. Делается это просто: снова открываем таблицу в режиме Конструктора, на панели инструментов Конструктор таблиц жмем кнопку Индексы. В первой пустой строке поля Индекс вводим имя индекса, затем в поле Имя поля жмем на стрелку и выбираем первое поле, для которого необходимо создать индекс. В следующей строке поля Имя поля указываем второе индексируемое поле, причем для данной строки поле Индекс должно оставаться пустым. Далее повторяем это для всех полей, которые необходимо включить в индекс (разрешается включать в индекс до 10 полей).

продолжение в следующем выпуске...


Ответы на вопросы
Вопрос 1. Добрый день.
Подскажите пожалуйста такая проблема
в отчете есть три выводимых поля
1 Сума
2 Валюта
3 Еквивалент

Необходимо чтоб если поле валюта было например UAH то поле еквивалент равнялось [SUMA]\5.05, Если USD то поле еквивалент равнялось [SUMA] ?
  Ответ. Можно использовать IIF([Валюта]='USD';[SUMA];[SUMA]\5) в запросе отчета.
Вопрос 2. Перед репликацией забыл дать доступ одному пользователю к одной таблице. Вроде все просто: так как дать доступ в реплике нельзя (так "оно" сообщает), открывается основная реплика и там дается доступ. НО! В основной реплике доступ есть (можно "поставить-снять"- нет проблем) НО в реплике он (доступ) не появляется. И основная реплика и реплика "пользуются" одним и тем же Secured.mdw. Синхронизация не приводит к "появлению" доступа. Я- администратор (начинающий) БД и владелец всех объектов БД. Win2000, MSAccess-2003 Может есть идея- в "чем собака порылась"? Заранее благодарен. С уважением, Владимир
  Ответ. При репликации в каждую таблицу mdb добавляются 4 ключевых поля, сам же файл mdw не реплицируется. Туда ничего не добавляется. Возможный выход - создаете новую базу данных mdb и из главной реплики туда загружаете все таблицы. Далее удаляете все импортированные оля репликации. Далее нужно повторить все действия по репликации и защите базы данных.
Вопрос 3. Acсess, Офис 2000.
1) Как в программе сделать КРАСИВО разворачивание окон?
Команда RunCmd.Maximize поставленная на событие Открытия формы делает это не очень: появляется зауженная форма, потом она разворачивается. Эта дерготня утомляет...

2) И как забороть такой негативный эффект: при переходе кнопками на панели задач по окнам открытых форм все они склонны сократиться в размерах (из сосотояния Максимайз :-)), если среди них есть хотя-бы одно маленькое (не всплывающее и не модальное).

Как закрепить "развернутое" состояние нужных форм?
  Ответ. Надо отключить вывод изображения и дать программе вычислить новые размеры окна "математически"
Me.Painting = False
Вопрос 4. Добрый день подскажите пожалуйста каким образом програмно открвать файлы xls, либо doc без прав редактирования ???
  Ответ. У каждого файла есть защита на уровне ввода пароля. Там и определяется доступ к объектам. Например, у Excel делается так:
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Вопрос 5. Добрый день подскажите как быть
Есть общая форма где в поле типа DATE пользователь меняет дату и в подчененной форме фильтруются записи по выбраной дате... Использую запрос в подчененной форме с фильтром [Forms]![Zagalna]![Me_date]- отказывается фильтровать...
  Ответ. Дату в запросах переводят
1. Для Access в формат: #mm.dd.yyyy#
2. Для SQL Server в формат: ddmmyyyy

В избранное