ISBN: 5-8459-0681-4

Текст
                    мн нсивныи
КУРС
программирования
в Access 2003
за выходные

30 уроков —
и вы сможете
программировать
приложения
Access всего через

15 ЧАСОВ!

Керри Н Поаг
Дженнифер Рирдон
Лоренс С. Казев/.ч
Дайана Р/д

П.В Фэн

(ф)

WILFY

АЦДЛЕКтиКД

Интенсивный курс программирования в Access 2003за выходные
Access2003 Programming Weekend Crash Course* Cary N. Prague Jennifer Reardon LawrenceS. Kasevich Diana Reid P.V. Phan ©WILEY wiley.com
Интенсивный курс программирования в Access 2003 за выходные Керри Н. Праг Дженнифер Рирдон Лоренс С. Казевич Дайана Рид П.В. Фэн ДИАЛЕКТИКА Москва ♦ Санкт-Петербург * Киев 2004
ББК32.973.26-018.2.75 И39 УДК681.3.07 Компьютерное изд-во ’’Диалектика” Главный редактор С. II. Тригуб Зав. редакцией В.Р. Гинзбург Перевод с английского О.В. Шпырко Под редакцией Е.Н.Дериевой По общим вопросам обращайтесь в издательство ’’Диалектика” по адресу: info@dialektika.com, http://www.dialektika.com Праг, Керри, Н., Рирдон, Дженнифер, Казевич, Лоренс, С., Рид, Дайана, Фэи, П. В. И39 Интенсивный курс программирования в Access 2003 за выходные. : Пер. с англ. — М. : Издательский дом "Вильяме", 2004. — 480 с. : ил. — Парал. тит. англ. ISBN 5-8459-0681-4 (рус.) Книга посвящена вопросам программирования в среде Access 2003 — простой и мощной системы управления базами данных, входящей в состав новейшей версии общеизвестного комплекта программных продуктов офис- ного назначения Microsoft Office. Авторы книги делятся своим многолет- ним практическим опытом щедро и непринужденно. Доступный стиль из- ложения будет понятен даже новичкам, осваивающим передовые информа- ционные технологии, а используемый пример приложения CheckWriter, который можно загрузить с сопровождающего книгу Web-узла, облегчит процесс изучения. ББК32.973.26-018.2.75 Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разре- шения издательства John Wiley&Sons, Inc. Copyright © 2004 by Dialektika Computer Publishing. Original English language edition Copyright © 2003 by Wiley Publishing, Inc. All rights reserved including the right of reproduction in whole or in part in any form. This trans- lation published by arrangement with Wiley Publishing, Inc. ISBN 5-8459-0681-4 (pyc.) ISBN 0-7645-3975-2 (англ.) © Компьютерное изд-во "Диалектика", 2004 © Wiley Publishing, Inc., 2003
Оглавление Об авторах 17 Посвящение 19 Предисловие 21 I W- Часть I. Пятница. Вечер 28 Урок 1. Введение в Microsoft Access и программированье 29 Урок 2. От макросов — к модулям 43 Урок 3. Разработка системы и процессов, тестирование и отладка 53 Урок 4. События — место, откуда запускаются программы 71 Часть П. Суббота. Утро 84 Урок 5. Объявление переменных, их особенности и правила именования 85 Урок 6. Логические конструкции — циклы, решения, выбор и быстрый выход из процедур 101 Урок 7. Процедуры, модули и модули классов 117 Урок 8. Архитектура Access 129 Урок 9. Работа с данными 145 Урок 10. Добавление, редактирование и удаление записей с использованием ADO 161 \ Часть III. Суббота. День 178 Урок 11. Перемещение по приложению с использованием кнопочных форм, специальных меню и событий клавиатуры 179 Урок 12. Использование несвязанных форм 197 Урок 13. Программирование элементов управления: флажок, группа переключателей, список, поле со списком 209 Урок 14. Программирование подчиненных и ленточных форм 231 Урок 15. Программирование вкладок 241 Урок 16. Окна сообщений и приемы обработки ошибок в программе 253 Часть IV. Суббота. Вечер 266 Урок 17. Импорт и экспорт данных 267 Урок 18. Приемы, способствующие ускорению работы приложения 287 Урок 19. Создание окон-заставок с анимацией. Информационные и стартовые окна приложения 305 Урок 20. Создание справочных систем 319
Создание кода в окне программы 49 Компиляция процедуры 50 Сохранение процедуры 51 Обзор 51 Проверьте себя 52 Урок 3. Разработка системы и процессов, тестирование и отладка 53 Проектирование системы 54 Общий дизайн 55 Подробный дизайн 55 Планирование этапа программирования 58 Тестирование и отладка приложений 59 Проверка синтаксиса — первый шаг 60 Компиляция процедур 60 Обработка ошибок в процессе выполнения программы 62 Обзор 68 Проверьте себя 68 Урок 4. События — место, откуда запускаются программы 71 Понятие событий 71 Реакция на события 72 Создание процедур событий 73 Выполнение функции в ответ на событие 74 Применение процедур событий для проверки корректности данных 76 Порядок событий 77 События при обновлении данных в элементах управления 77 События при удалении записей 78 События при открытии формы 78 События при создании новой записи 78 События при закрытии формы 78 Обзор 78 Проверьте себя 79 Часть I. Пятница. Вечер. Обзор 80 Часть II. Суббота. Утро 84 Урок 5. Объявление переменных, их особенности и правила именования 85 Использование переменных 86 Именование переменных 86 Объявление переменных 87 Создание переменных, доступных во всем приложении 89 Работа с типами данных 91 Использование стандартных правил именования 93 Стандарты именования объектов баз данных Microsoft Access 95 Стандарты именования полей таблиц Microsoft Access 95 Стандарты именования элементов управления в формах и отчетах 96 Стандарты именования переменных Microsoft Access Visual Basic 9 7 Действительно ли необходимы стандарты именования в Access? 98 Обзор 99 Проверьте себя 99 ч
Урок 6. Логические конструкции: циклы, решения, выбор и быстрый выход из процедур 101 Условная обработка 102 Оператор If.. .Then.. .Else.. .EndIf 103 Вложенные операторы If.. .Then.. .Else 105 Конструкция Select Case.. .End Select 106 Циклы 108 Оператор Do...Loop 108 Оператор For... Next 112 Конструкции "с памятью”: With.. .End With 113 Обзор 114 Проверьте себя 114 Урок 7. Процедуры, модули и модули классов 117 Понятие подпрограммы 117 Понятие функции 118 Понятие модуля 119 Модули форм и отчетов 119 Стандартные модули 119 Модули классов 121 Создание нового модуля 123 Создание новой процедуры 123 Использование процедур в форме 126 Использование процедур в запросах 127 Обзор 127 Проверьте себя 127 Урок 8. Архитектура Access 129 Понимание архитектуры Microsoft Access 129 Уровень приложения 130 Управление данными с использованием механизма баз данных Jet 130 Работа с объектной моделью Microsoft Access 133 Ссылки на библиотеки баз данных 136 Вызов функций из динамически подсоединяемых библиотек 139 Обзор 143 Проверьте себя 144 Урок 9. Работа сданными 145 Что такое SQL 145 Оператор SELECT 146 Оператор DELETE 150 Оператор UPDATE 150 Использование операторов SQL в процедурах 150 Создание процедур для проверки корректности данных 151 Специальный набор команд — ADO 152 Использование процедур для обновления несвязанных полей 156 Обновление вычисляемых полей 157 Определение количества записей в наборе 158 Обзор 159 Проверьте себя 160
Урок 10. Добавление, редактирование и удаление записей с использованием ADO 161 Часть IV. Суббота. Вечер 266 Урок 17. Импорт и экспорт данных 267 Импорт и экспорт 267 Импортданных 268 Вопросы, касающиеся импорта данных 269 Вопросы, касающиеся экспорта данных 272 Процесс импорта/экспорта 273 Спецификации импорта/экспорта 274 Методы импорта и экспорта данных 275 Создание интерфейсаимпорта 27 8 Элементы интерфейса импорта 278 Запуск и завершение процесса импорта 279 Создание интерфейса экспорта 281 Элементы интерфейса экспорта 281 Программирование интерфейса экспорта 282 Обзор 284 Проверьте себя 285 Урок 18. Приемы, способствующие ускорению работы приложения 287 Аппаратное обеспечение и память 288 Значение компиляции для скорости работы приложения 288 Перевод программы приложения в скомпилированное состояние 288 Выход из скомпилированного состояния 289 Использование недокументированного параметра /decompile 290 Сжатие базы данных после компиляции 291 Определение декомпилированной базы данных и автоматическое повторение компиляции 291 Создание файлов .mde и передача их пользователям 293 Организация часто используемого кода в библиотеке 295 Увеличение абсолютной скорости приложения 297 Минимизация сложности, а также размеров форм и отчетов 297 Применение рисунков в формах и отчетах 299 Достижение максимальной эффективности работы модулей 299 Использование соответствующих типов данных 300 Создание более быстрых процедур 301 Использование контрольных переменных 301 Увеличение воспринимаемой скорости приложения 302 Загрузка и использование скрытых форм 302 Использование песочных часов 302 Применение процентного счетчика 303 Обзор 303 Проверьте себя 304 Урок 19. Создание окон-заставок с анимацией. Информационные и стартовые окна приложения 305 Создание окон-заставок 306 Автоматический запуск формы при открытии базы данных 307 Использование событий Таймер 309 Добавление анимации в окно-заставку 311 Создание информационных окон About 312
Добавление функциональных возможностей в окно About 312 Добавление звука в окно About 313 Создание стартового окна 315 Проверка значения для отображения стартового окна 315 Сохранение значения для отображения стартового окна 316 Обзор 316 Проверьте себя 317 Урок 20. Создание справочных систем 319 Использование Help Viewer 319 Создание справочной системы 321 Определение идентификаторов для разделов справки 322 Создание файла заголовков 322 Добавление файла заголовков в проект справочной системы 323 Тестирование определений HtmlHelp API 325 Присоединение файла справки к приложению Access 326 Определение справки для формы 326 Отображение разделов справки для элементов управления 327 Тестирование созданной справочной системы 328 Обзор 329 Проверьте себя 329 Часть IV. Суббота. Вечер. Обзор 332 Часть V. Воскресенье. Утро 336 Урок 21. Создание диалоговых окон поиска 337 Основные характеристики диалоговых окон 337 Создание диалоговых окон поиска 340 Изменение элементов списка 342 Поиск выбранной записи 343 Открытие диалогового окна поиска из формы 344 Обзор 345 Проверьте себя 346 Урок 22. Программирование диалоговых окон и отчетов, работа с элементами управления ActiveX 347 Элементы проектирования диалогового окна 348 Создание и использование диалоговых окон печати 348 Отображение диалогового окна печати 349 Разработка диалогового окна печати . 349 Взаимодействие запросов с диалоговыми окнами печати 349 Вывод отчетов на печать из диалогового окна 350 Взаимодействие отчетов с диалоговыми формами печати 351 Программирование отчетов 352 Разделы отчетов 352 События разделов 353 События отчетов 353 Использование элемента управления ActiveX Calendar 356 Обзор 357 Проверьте себя 358
Урок 23. Архитектура приложения 359 Элементы, необходимые в приложении 359 Окно технической поддержки 360 Управление индивидуальными параметрами 360 Архивация 362 Создание резервных копий 363 Восстановление 364 Окно системной информации 364 VBA-код 366 Компиляция 366 Модульная структура 370 Конфигурация файла программы 371 Параметры запуска 371 Процедуры запуска 371 Сжатие 371 Обзор 373 Проверьте себя 374 Урок 24. Упаковка приложения 375 Файлы .MDE 375 Что представляет собой файл .mde 375 Свойство MDE 376 Создание файла .mde 376 Версия Runtime 376 Программа установки 377 Причины использования программы установки 377 Использование мастера упаковки и установки 377 Установка и тестирование 378 Вопросы использования программы установки 379 Общие вопросы 379 Вопросы использования мастера упаковки и установки 379 Программы сторонних производителей 380 Обзор 380 Проверьте себя 381 Урок 25. Программирование форм-мастеров для ускорения обработки данных 383 Что такое’’мастер” 383 Структура мастера 384 Создание мастера с вкладками 384 Подпроцедура для события формы Открытие 386 Кнопка Next 386 Кнопка Back 388 Кнопка Cancel 389 Кнопка Finish 389 Пример программы-мастера 389 Обзор 392 Проверьте себя 393 Урок 26. Использование надстроек в приложении 395 Что такое "надстройки" 395
Общие вопросы использования надстроек 396 Типы файлов 396 Ссылки на различные базы данных 397 Общий дизайн 398 Вопросы, касающиеся работы нескольких пользователей 398 Мастера 398 Мастера объектов данных и мастера интерфейса пользователя 399 Мастера элементов управления 399 Конструкторы . 399 Надстройки меню 399 Установка мастера или надстройки меню 399 Записи в реестрах для надстроек 400 Утилита диспетчера надстроек 400 Надстройки библиотек 404 Создание базы данных библиотеки 404 Отладка баз данных библиотек 404 Ключ LoadOnStartup 404 Ссылки 405 Создание библиотеки из модуля 406 Обзор 407 Проверьте себя 407 Часть V. Воскресенье. Утро. Обзор 408 Часть VI. Воскресенье. День 410 Урок 27. Программирование и использование присоединенных файлов 411 Файловые вложения 411 Принципы связывания таблиц 413 Средства Access 413 Вопросы программирования 415 КаталогАЛОХ 416 Доступ к таблицам с помощью каталога 416 Коллекция свойств таблицы 416 Связанные таблицы 417 Менеджер присоединенных файлов 418 Дизайн формы 419 Программа 420 Обзор 425 Проверьте себя 425 Урок 28. Обеспечение защиты баз данных Access 427 Возможные средства безопасности 427 Защита на уровне совместного доступа 428 Защита на уровне пользователя 429 Объекты ADOX для защиты базданных 430 Изменение пароля пользователя 431 Добавление нового пользователя 432 Определение пользователя в группу 432 Удаление пользователя из группы 433 Открытие защищенной базы данных 434
Шифрование 434 Файл .MDE 435 Другие аспекты защиты приложения 435 Файловая безопасность 435 Сокрытие окна базы данных 436 Отключение клавиши Bypass 437 Отключение специальных клавиш 437 Обзор 438 Проверьте себя 438 Урок 29. Access и клиент-серверные данные 441 Понятие клиент-серверной архитектуры 441 Понятие Microsoft Data Engine 20QO 442 Сравнение возможностей Jet и MSDE 443 Использование MSDE 444 Запуск SQL Server Service Manager 444 Понятие о проектах 444 Перенос базы данных в MSDE 448 Обзор 453 Проверьте себя 453 Урок 30. Создание запросов SQL Server 455 Проверка соединения базы данных проекта 455 Запросы в проекте 456 Создание представления 456 Создание хранимых процедур 458 Создание пользовательских функций , 460 Обзор 461 Проверьте себя 461 Часть 6. Воскресенье. День. Обзор 462 Приложение 465 Ответы на вопросы к части "Пятница. Вечер" 465 Ответы на вопросы к части "Суббота. Утро" 466 Ответы на вопросы к части "Суббота. День" 467 Ответы на вопросы к части "Суббота. Вечер" 468 Ответы на вопросы к части "Воскресенье. Утро" 470 Ответы на вопросы к части "Воскресенье. День" 472 Предметный указатель 473
Об авторах Керри Н. Праг (Cary N. Prague) получил международную известность благодаря своим лекциям, посвященным базам данных, и учебникам, которые стали бестселле- рами. Он является владельцем корпорации Database Creations — самой крупной в мире компании по разработке дополнительных продуктов Microsoft Access. Этой компании принадлежит серия финансового программного обеспечения: Business! для Microsoft Office, система бухгалтерского учета для средних предприятий; программ- ное обеспечение для кассовых терминалов Positively Business!; программный менед- жер Inventory Ваг для мобильного сбора данных; электронная чековая книжка Check Writer; бухгалтерская программа General Ledger. Кроме того, компания Database Creations выпустила серию инструментов для разработчиков, среди которых: appBuilder — для разработки приложений под Microsoft Access; EZ Access Developer Tools — для создания интерфейсов пользователя; appWatcher— для поддержки про- граммных баз между несколькими разработчиками; Surgical Strike — единственный Patch Manager для Microsoft Access. Среди клиентов Database Consulting, локального и международного масшта- ба, немало компаний из списка Fortune 100: Microsoft, United Technologies, ABB, Smith & Vesson Firearms, Pratt and Whitney Aircraft, ProHealth, Office Max, Continental Airlines и др. Керри Праг — один из самых востребованных авторов на рынке управления компьютерными базами данными; он написал более 40 книг, проданных более чем миллионным тиражом. Его книги посвящены таким программным продук- там, как Microsoft Access, Borland (Ashton-Tate) dBASE, Paradox, R:Base, Framework. Он создал ряд учебников по графическому программному обеспече- нию: Microsoft Access. Библия пользреателя, Секреты Access 97, Access. Крат- кий курс, dBASE for Windows Handbook (Справочник no dBASE для Windows) и Everyman s Database Primer Featuring dBASE EV (Учебник для начинающих no dBASE IV). Керри Праг получил сертификат Microsoft Certified Professional no Access и сдал тест MOUS по Access и Word. Его часто приглашают читать лекции на семи- нарах и конференциях в разных городах США. Он является членом привилеги- рованной внутренней экспертной комиссии Microsoft Access и работает с сотруд- никами компании Microsoft в Редмонде, Вашингтон. Керри получил диплом магистра компьютерных наук в Политехническом институте Ренсселера и степень магистра экономики управления (МВА) в Уни- верситете Коннектикута. Кроме того, он имеет звание Certified Data Processor. Дженнифер Рирдон (Jennifer Reardon) — ведущий разработчик специальных приложений баз данных с более чем 10-летним опытом разработки клиент- серверных приложений и приложений для персональных компьютеров. Нема- лый опыт по разработке приложений она приобрела в период работы в компании Database Creations. Вместе с Кэри Прагом она разработала ряд программных продуктов для компаний Fortune 500. Среди самых значительных проектов Дженнифер Рирдон — система инвента- ризации и учета запчастей для программы F22 от Pratt & Whitney, система тех- нических требований для ABB-Combustion Engineering и система выявления чрезвычайных событий для штата Коннектикут. Кроме того, она выступала ве- дущим разработчиком многих дополнительных программных продуктов компа- нии Database Creations, включая Business!; Yes! I Can Run My Business; Check Writer и User Interface Construction Kit.
Дженнифер является соавтором книг Microsoft Access 2003. Библия пользователя и Microsoft Access 2002. Библия пользователя, Access 2000 Programming Weekend Crash Course (Интенсивный курс программирования в Access 2000 за выходные). Она написала отдельные главы для других книг, в частности посвященных вопросам страниц доступа к данным, механизмам базы данных, среды программирования VBA, создания справочных систем, использования Microsoft Of fice 2000 Developer. Кроме того, она является автором отдельных глав книг Microsoft Access 97. Библия пользователя и CeKpemwAccess 97. Дженнифер Рирдон владеет собственной консалтинговой фирмой, Advanced Software Concepts, которая предоставляет специальные приложения для госу- дарственных и частных предприятий и специализируется на разработке систем клиентской информации для бюджетных и частных организаций здравоохране- ния. Кроме того, в этой компании была разработана система расчета проектной стоимости и управления проектами для международной строительной компании. Корпоративный опыт Дженнифер Рирдон включает 7 лет работы в The Travelers, где она была первым помощником инженера по программному обеспечению и работала с многочисленными проектами по разработке клиент-серверного обес- печения целевого назначения, включая Easel, С, SQL Server и DB2. Дженнифер получила диплом бакалавра наук в Массачусетском университете. Лоренс С. Казевич (Lawrence S. Kasevich) имеет более чем 30-летний опыт ра- боты в области инженерных наук, информационных технологий и управления. Как вице-президент отдела разработки в Database Creations, он стал разработчи- ком нескольких продуктов на базе Microsoft Access, известных во всем мире. Кроме того, он возглавляет консалтинговый отдел и управляет проектами клиен- тов и разработкой новых продуктов. Его работы посвящены компьютерным тех- нологиям, коммерческим программным продуктам и многим другим темам. Ло- уренс написал 6 книг и достаточно много статей, он представляет результаты своего труда на презентациях и конференциях по разработке программного обес- печения, а также в профессиональных организациях, находящихся по всему ми- ру. Он был членом дополнительного факультета в Реннселере, Хартфорд, где в течение 10 лет вел курс компьютерных технологий. Лоуренс Казевич получил степень бакалавра наук по электротехнике в Университете Коннектикута в 1974 г. и степень магистра управления в Реннселере, Хартфорд, в 1986 г. Дайана Рид (Diana Reid) отвечает за проектирование и разработку корпоративного сайта компании Database Creations и Web-сайтов клиентов, а также за управление се- рией бухгалтерских продуктов компании. Дайана принимала участие в редакции от- дельных книг по Microsoft Access и была техническим редактором нескольких изда- ний Access. Библия пользователя. Она участвует в конференциях разработчиков, ор- ганизованных компанией Microsoft, где представляет доклады на тему FrontPage, HTML и других Web-технологий. В 1991г. Дайана получила диплом бакалавра наук по финансам в Центральном университете штата Коннектикут. П.В. Фэн (P.V. Phan) в настоящий момент является директором информаци- онно-технических услуг в компании Database Creations. Он возглавляет команду технической поддержки для внутренних целей и технической поддержки клиен- тов: конечных пользователей и разработчиков. П.В. Фэн является членом ко- манды по консалтингу и разработке всего комплекса продуктов Database Creations, а также выступает консультантом большого количества проектов во многих компаниях, включая некоторые корпорации Fortune 500. П.В. Фэн обла- дает более чем 8-летним опытом программирования и преподавания Access и бо- лее чем 14-летним опытом компьютерной работы на предприятиях и в академи- ческих учреждениях. П.В. Фэн получил дипломы по психологии и биологии в Университете Коннектикута.
Посвящение Эту книгу я посвящаю моему сыну, Дэвиду Прагу. Осенью 2003 г. Дэвид по- ступил на первый курс УниверситетаРоджера Вильямса; он показал на своем примере, как вознаграждается упорная работа, целенаправленность и стрем- ление к совершенству. Несмотря на постоянное родительское вмешательство и некоторые личные преграды, он сумел преодолеть трудности нашего времени, найти работу, выиграть стипендию и стать прекрасным молодым человеком. Сейчас он находится на пороге важного этапа своей жизни, и я посвящаю ему эту книгу, чтобы показать, как люблю и уважаю его. — Керри Н. Праг. Я посвящаю эту книгу моей подруге Саре Шиллинг в честь ее 21-го дня рожде- ния. Спасибо за то, что ты была мне таким прекрасным другом и постоянным преданным компаньоном. Ты всегда там, где ты нужна. Спасибо тебе за поддерж- ку моего увлечения конным спортом, которое (хотя уже в прошлом) помогло мне сосредоточитьсяи получить уверенность в себе. —Дженнифер Рирдон. Я посвящаю эту книгу моей замечательной жене, Дебби, невероятная любовь и поддержка которой помогают мне во всем, что я делаю. Я очень ее люблю. Кроме того, эта книга посвящена нашим детям и их семьям: Черил, Тому и Виктории — действительно прекрасной семье; Алиссе и Натаниэлю — уни- кальной и любящей паре; и Эшли — умной и талантливой молодой леди. Я очень благодарен и очень горжусь всеми ими! — Лоренс С. Казевич. Моему отцу, Роберту Смиту, который в течение последних четырех лет отважно борется с раковой болезнью и который учит меня тому, как стать лучше. Также — моей матери Джоан за то, что она всегда рядом. Наконец, мо- ему мужу Мэтту и двум нашим прекрасным детям, Элизабет и Айден, без ко- торых моя жизнь не была бы полной. —Дайана Рид. Эта книга посвящена моей матери, Нху Май Нгуен. Спасибо тебе за беско- нечную любовь ко всем своим детям. — ПТТ Фэн,

Предисловие Microsoft Access — великолепная среда для разработки приложений любого уровня, один из самых простых в использовании, однако самый мощный менед- жер баз данных. Пользователи, имеющие различный уровень знаний и обла- дающие разным опытом, убедились, что Microsoft Access может помочь создать приложения, решающие практически любую задачу. Новые пользователи могут быстро научиться работать с простыми таблицами, запросами, формами и отче- тами, а также достаточно просто освоить работу с макросами. Однако если необ- ходимо использовать модули и программы VBA, то это часто становится прегра- дой для дальнейшего использования Access. Данная книга научит программированию в Microsoft Access и кем бы вы ни были: новичком или профессионалом в области информационных систем, кото- рый желает пополнить свой инструментарий еще одним языком. Книга органи- зована в соответствии с концепцией серии Интенсивный курс и состоит из 30 коротких глав. В каждой главе изучается новый элемент разработки прило- жений в Access VBA. Несколько первых глав знакомят с основами программиро- вания, вопросами системного дизайна, тестирования и отладки. После такого вступления вы изучите ядро VBA и ознакомитесь с программированием ADO, системами клиент-сервер, работой с данными и даже программированием им- порта- экспорта внешних данных. Вы сможете изучить визуальное программирование в Microsoft Access с помощью одного большого примера — общего приложения чековой книжки, регистра чеков и баланса операций с банковским интерфейсом. Материал каждой главы написан на уровне, понятном для начинающих, и для большего удобства иллюстрирован боль- шим количеством рисунков. Приложение из примера (электронная чековая книжка, Check Writer) полностью написано на ADO для MicrosoftAccess 2003. Кроме того, к серверной базе данных MSDE (SQL Server 2000) присоединена версия приложе- ния .ADP. Структура книги Каждая часть книги разделена на уроки (от 4 до 6 уроков в части). Урок раз- работан так, чтобы его можно было пройти за полчаса. В конце урока находятся вопросы для повторения, которые позволят сразу же проверить, как усвоен толь- ко что прочитанный материал. Каждую часть завершают 20 дополнительных во- просов для проверки полученных знаний. Пятница. Вечер В первых четырех уроках изложены основы программирования. Вы научи- тесь выполнять переход от макросов к модулям, после чего ознакомитесь с ре- дактором Visual Basic, способами отладки и встроенными инструментами для проверки синтаксиса программы, вывода автоматической быстрой справки и ав- томатического получения информации о членах класса. Вы изучите основы сис- темного проектирования и метод концентрических кругов, используемый при разработке продуктов Microsoft, научитесь запускать программу из событий раз- личного типа и объявлять разные типы переменных.
Суббота. Утро В субботу утром вы перейдете от основ к более детальной информации. Снача- ла рассматриваются логические конструкции, используемые программистами, в том числе условные операторы и циклические конструкции. Вы узнаете разницу между функциями и процедурами, напишете первую программу на используе- мом в Microsoft Access языке Visual Basic. Затем будет рассмотрена архитектура Access и объектная модель Access. В процессе изучения доступа и обработки дан- ных в таблицах вы ознакомитесь с языком доступа к данным ADO. Кроме того, узнаете не только, как можно получить данные из таблиц, но и научитесь выпол- нять добавление, обновление и удаление данных. Суббота. День День субботы начинается с изучения создания кнопочных форм и меню, а также программного управления событиями клавиатуры. Вы узнаете, что представляют собой несвязанные формы, которые используются в клиент- серверных системах. Основной материал третьей части посвящен работе с раз- . личными элементами управления на форме и отчетам в программах. Сначала вы научитесь программировать списки и поля со списками, работать в программе с группами переключателей. Затем узнаете, как обрабатывать в программе суб- формы, и ознакомитесь с новыми методами организации элементов управления со вкладками. Данная часть заканчивается главой, посвященной работе с окнами сообщений и обработке ошибок программы. Суббота. Вечер К вечеру субботы вы научитесь программно импортировать и экспортировать данные из других баз данных, электронных таблиц и файлов текстового типа, включая файловые типы с разделителями и фиксированной шириной. В этой части рассматриваются секреты улучшения скорости работы приложения и во- просы компиляции программ. Наконец, вы научитесь создавать окна-заставки с анимацией, информационно-справочные окна и другие формы, которые отобра- жаются при запуске программы. Последний урок четвертой части посвящен до- бавлению справочных систем в приложения Microsoft Access. Воскресенье. Утро В утро воскресенья вы готовы к изучению более сложных типов требований Access. Данная часть начинается с рассмотрения диалоговых окон для печати, далее следует материал по поиску данных с помощью диалоговых окон, предна- значенных локализации поля в таблице. Следующий урок посвящен вопросам, которые необходимо решить после окончания разработки приложения. Речь пойдет об упаковке приложения, версии Access Runtime и утилитах для установ- ки приложения. Вы научитесь создавать программы-мастера, которые помогут пользователю в начале работы И в процессе выполнения отдельных сложных за- дач. Наконец, вы изучите вопрос создания библиотек надстроек и использования ссылок. Воскресенье. День Последняя часть книги посвящена нескольким более сложным темам програм- мирования. Она начинается с программной проверки присоединенных файлов и
программирования интерфейса для присоединения файлов. Вы научитесь про- граммировать защиту данных Access и создавать настоящие клиент-серверные приложения с использованием механизма Microsoft Database Engine (MSDE) или SQL Server 2000. Приложение В приложении приведены ответы на тестовые вопросы, которые были пред- ложены в конце каждой части книги. Сопровождающий Web-узел Сопровождающий Web-узел этой книги (www.wiley.com/compbooks/prague) содержит все файлы примеров, которые создавались по мере изложения мате- риала либо на которые давались ссылки. Кроме того, на данном узле вы найдете тест для самооценки, который позволит оценить уровень освоения материала. Web-сайт содержит также ссылки на примеры продуктов и демонстрацион- ные файлы, которые можно загрузить и посмотреть на практике. Созданные ав- торами книги и внешними разработчиками, они предоставят ряд полезных инст- рументов для разработки приложений Microsoft Access. > Особенности макета Не стоит пытаться пройти всю книгу на одном дыхании, без перерывов. Мате- риал организован так, чтобы уроки книги занимали около получаса. Уроки сгруппированы по частям, на их изучение потребуется 2-3 часа. После каждого урока и в конце каждой части предлагаются вопросы для проверки знаний, кото- рые также позволят немного попрактиковаться и закрепить новые навыки. Сде- лайте перерыв, перекусите, выпейте кофе и переходите к следующей части! В каждый урок включены рисунки, которые помогут сориентироваться, сколько материала вы уже прошли, или выделят интересную информацию, ко- торая не должна остаться незамеченной. Обратите особое внимания на следую- щие рисунки: Осталось 20 минут Эта пиктограмма с часами (и другие, подобные ей) показывает, насколько вы продвинулись в изучении каждого урока. Особо интересные фрагменты будут выделены следующими специальными картинками. Данная пиктограмма указывает на интересную информацию, которую рекоменду- ется отметить и запомнить для дальнейшей работы. Такой пиктограммой выделены полезные советы, которые предоставляют самый лучший способ решения той или иной задачи, что позволит облегчить работу. Не делайте так! Договорились?
Этот символ указывает, где в книге можно найти дополнительную информацию по данному вопросу. \ Такой символ подскажет, что дополнительную информацию можно найти на со- провождающем Web-сайте. Обращайте внимание на те места, в которых выделены особенности синтаксиса той или иной й конструкции. Полоса слева указывает на продолжительность такого фрагмента информации н (см. следующий пример). А Чтобы проверить какое-либо условие и на этом основании принять решение, используется с оператор if.. .Then. Оператор If.. .Then работаеттак: t If условие истинно Then сделайте это Например: If Checkl. Value = 1 Then Forml.Textl.FontBold = True Часть, которая следует после If, представляет условие; если это условие верно, компьютер выполнит действие, указанное после ключевого словаТЬеп. Правила, используемые в книге Кроме изображенных выше пиктограмм, мы также будем придерживаться следующих правил. • Для обозначения выбора команды в меню используется символ1^, напри- мер: Выберите File^Save Project (Файл^Сохранить проект), чтобы сохранить работу. • Чтобы указать элементы кода, когда они приводятся в тексте, использует- ся специальный шрифт, например: Form2Hide. ч Обратите внимание на синтаксис: Form2 .Hide. Если требуется, чтобы по- сле щелчка пользователем на кнопке ОК форма исчезала, используйте ко- манду Hide. • Чтобы обозначить пример программы, который приводится не в тексте главы, используется такой формат: Private Sub Command2_Click() Form2.Hide End Sub Итак... Всего одни выходные — немного времени, чтобы охватить такой объем мате- риала. Поэтому приступим! Ждем ваших отзывов! > Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ва- ше мнение и хотим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бумажное или электронное письмо либо просто посетить наш Web-сервер и оста- вить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее ав- торов, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мне- нием и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: E-mail: info@williamspubli shing. com WWW: http: / /ww .williamspubli shing. com Информация для писем из России: 115419, Москва, а/я 783 Украины: 03150, Киев, а/я 152 Слова благодарности Мы бы хотели поблагодарить людей, которые очень помогли нам при созда- нии книги. В первую очередь, хотим выразить благодарность сотрудникам кор- порации Database Creations, Inc. и компании Database Creations Consulting LLC. Спасибо Джули Фраттароли, Ким Манцоне, Карен Праг и Дебби Шиндлер. Ваш постоянный контроль и работа с клиентами просто неоценимы. Мы хотели создать книгу, которую можно будет использовать в качестве учебника по программированию Access. Для этого понадобился объект для испытаний, кото- рым стала Высшая школа Сауз-Виндзора, штат Коннектикут. Когда мы предложили эту идею в Министерстве образования, то не рассчитывали, что сможем действитель- но убедить его сотрудников позволить разработчикам читать курс, который на тот момент даже не существовал. К нашему удивлению, ответ был положительным. Спасибо Аллану Мазерзеле, педагогу по призванию, который так предан рабо- те, что практически живет в Высшей школе Сауз-Виндзора. Он позволяет апро- бировать на студентах новые идеи, которые впоследствии формируют курс по ба- зам данных и программированию в Access. Его любовь к детям, технике, а также предпринимательский дух являются основой его работы. Спасибо агентам, Мэтту Вагнеру и Биллу Гл эд стоуну, и финансовому гуру, Моурин, из Waterside Productions. Это лучшие агенты и лучшие партнеры в биз- несе! Спасибо им за то, что они сделали наши отношения со сферой контрактов простыми и прибыльными. Благодарим наших друзей из издательства Wiley. Прежде всего, спасибо редакто- ру приобретений Шэрон Кокс — прекрасному и честному посреднику. Спасибо ре- дактору нашего проекта Джоди Йенсену, который читал, правил, переписывал, за- менял, сжимал, расширял и, вообще, превратил наши каракули в английский язык, но никогда не жаловался, не ругал, не настаивал и не злился на наши, без сомнения, плохие литературные способности. Эта книга стала намного лучше, и мы это очень ценим. Кроме того, мы постараемся когда-нибудь изучить его версию английского как свой основной язык — и как второй, и третий по важности тоже. Спасибо друзьям из Wiley: Ричарду Сведяи, Джо Вилкерту, Энди Каммингсу, Грегу Крою, Мэри Беднарек и другим. Наконец, спасибо нашим родным, любимым людям, лошадям, котам, собакам и, конечно, друзьям, которых мы, работая над книгами, месяцами игнорируем.


« г- Часть I. Пятница. Вечер Урок 1. Урок 2, Г W От макросов — к модулям Урок 3* Урок 4 - События — место, откуда запускаются программы ~ ! Ш — -- «fc— — •• w~ ——w — - •* — - I Введение в Microsoft Access и программирование Проектирование системы и процессов, тестирование и отладка

УРОК Введение в Microsoft Access и программирование. Содержание урока * Основные понятия программирования Использование языка Visual Basic * Программирование для современного разработчика * Исследование программирования баз данных V Использование примера с базой данных Check Writer Обзор основных программных структур Access: модули, функции и подпроцедуры «Microsoft Access — прекрасная среда как для пользователей баз данных, так и для профессиональных разработчиков. В этом уроке вы изучите отличия меж- ду программированием на языке Visual Basic и использованием таблиц, запро- ЯХут СОВ, Форм и отчетов Microsoft Access. Кроме того, узнаете, как Microsoft Access используется для создания приложений профессиональными разработчиками, и ознакомитесь с примером приложения Check Writer, которое будет применять- ся во всех примерах этой книги. Чтобы книга была максимально полезна, вы должны быть знакомы с боль- шинством объектов Microsoft Access, включая таблицы, запросы, формы и отче- ты. Кроме того, необходимо знать основы создания таблиц и установления связей между ними. Если вы никогда не создавали форму Microsoft Access, эта книга, скорее всего, вам не подойдет. Все примеры начинаются с уже созданных форм, в них рассматривается добавление функций и процедур с использованием Visual Basic — внутреннего языка Access. Если вы создавали простые или сложные макросы, то уже разбираетесь в ос- новных свойствах событий и понятиях программирования. Эта книга не учит ра- боте с макросами, поскольку профессиональные разработчики используют мак-
росы только в редких случаях. Например, макросы применяются для создания определенных типов меню или для того, чтобы избежать сложностей со ссылка- ми на библиотеки . mda, которые приводят к проблемам компиляции, если биб- лиотеки не присоединены. В этой книге показано, как преобразовать макросы в модули, и подробно рассматривается программирование, основанное на собы- тиях, которое используется в приложениях Microsoft Access. Что такое программирование Программирование определяет процесс создания инструкций для выполнения той или иной задачи, это всего лишь одна из фаз разработки продукта. Microsoft Access содержит набор инструментов, один из которых называют языком. Язык программи- рования используется для создания программы, точно так как с помощью слов и предложений мы излагаем на письме или в устной речи свои мысли. Компьютерная грамматика называется синтаксисом. Профессиональные программисты предпочитают называть себя разработчи- ками. Разработчик — это человек, который создает компьютерные приложения. Традиционное программирование не обязательно является частью этого процес- са. Создание формы с помощью Microsoft Access также можно считать разработ- кой. Когда в форму с использованием макроса или элемента языка добавляется сообщение об ошибке или процесс, это тоже программирование. Программирова- ние — лишь один элемент разработки. Анализ, дизайн, тестирование и отладка представляют другие ключевые элементы разработки приложения. Microsoft Access содержит ряд инструментов, позволяющих создавать приложе- ния без использования встроенного языка. Эти инструменты включают запросы, формы и отчеты. Microsoft Access известен как пакет управления базами данных (database management package), поскольку позволяет создавать таблицы, в которых содержатся данные. Если вы создавали макросы с помощью Microsoft Access, то уже программировали, независимо оттого, осознавали вы это или нет. Visual Basic — это язык, который используется для внутренних операций Mi- crosoft Access. Его также называют VBA (Visual Basic for Applications —Visual Basic для приложений), Visual Basic — Applications Edition (Visual Basic — вер- сия для приложений) и языком Visual Basic. В первых версиях Microsoft Access он назывался Access Basic. Какое бы название ни использовалось, язык Visual Basic является неотъемлемой частью Microsoft Access. В этой книге мы будем на- зывать язык программирования Microsoft Access просто Visual Basic. Основные причины использования языка Visual Basic Несмотря на то, что Microsoft Access позволяет создавать процессно- ориентированные программы с использованием макросов, этот язык предостав- ляет неограниченные возможности. Многие программисты Microsoft Access на- чинали с макросов и постепенно поняли ограниченность такого подхода. В ко- нечном итоге вы обнаружите, что для решения многих задач в Access необходимо программировать с использованием языка Visual Basic. Существует также ряд задач, которые не могут быть решены с помощью мак- росов (они перечислены ниже).
• Создание процедур перехвата ошибок и выполнение процессов на основа- нии ошибки. • Использование многократного цикла или инкрементация переменных. • Принятие сложных решений. • Замена параметров в ходе выполнения программы для изменения внешне- го вида формы. Не пугайте язык Visual Basic, который используется в Microsoft Access, с продуктом от Microsoft который называется Visual Basic или Visual Basic.NET. Действительно, Visual Basic (продукт) и Microsoft Access объединяет общий язык программирования Visual Basic однако сами продукты существенно отличаются. Почти все продукты Microsoft Office используют одинаковый язык программирования — Visual Basic: Access, Excel Word, PowerPoint Outlook и даже MapPoint Программирование для современного разработчика Если вы сравнительно недавно работаете с Microsoft Access, а программи- руете уже много лет, то можете задать вопрос: зачем вообще программиро- вать? Вы уже ознакомились с невероятными возможностями таблиц, запро- сов, форм и отчетов. Возможно, уже умеете создавать довольно сложные формы, включающие комбинированные списки и группы переключателей, объекты ActiveX и т.п., которые предоставляют значительно больше воз- можностей, чем программы, которые использовались лет 10 назад. Кроме то- го, очень удобно пользоваться макросами. Если вы уже программировали на языках COBOL или dBASE, то автоматиче- ски ищете окно, в которое можно ввести команды, чтобы написать программу. Несмотря на то, что такое поле или окно в Microsoft Access отсутствует, вам не придется использовать окно редактора Visual Basic, чтобы написать программу (что было необходимо в 80-е годы). Начало эпохи персональных компьютеров ас- социируется с пустым экраном и редактором, напоминающим простой текстовый редактор. Вы должны были написать строка за строкой компьютерный код, что- бы выполнить такие обычные вещи, как: нарисовать прямоугольник @12,15 То 25,40 отобразить текстовую метку @13,17 SAY "Customer Name.-" позволить пользователю ввести данные @12,31 GET CUSTNAME В то время никто не думал о том, где находится курсор и куда он движется. Со- временные визуальные инструменты, например, окно конструктора форм (Form Design) позволяют очень просто создать форму, не вводя ни одной строки компью- терного кода. Пользуясь Microsoft Access, вы сможете создать достаточно сложные приложения, даже не написав ни одной строки кода на Visual Basic. Когда приме- нялся язык dBASE II, иногда требовался целый день, чтобы создать программу для простой формы. Microsoft Access позволяет создать ту же форму с помощью масте- ра за несколько минут, а из окна конструктора форм — за полчаса. Microsoft Access использует визуальную среду программирования, кото- рая основана на событиях. Это означает, что для отображения чего-либо соз- дается форма, а затем используются события этой формы — элементы управ- ления, движения мыши, нажатия клавиш на клавиатуре. В результате до- бавляются программные инструкции, которые выходят за рамки простого отображения формы и редактирования данных. Это визуальная среда, так
как все время виден интерфейс пользователя. Кроме того, как вы узнаете из следующего урока, результаты своей работы можно сразу просмотреть с по- мощью всего нескольких щелчков мышью (что очень легко понять, если вы знакомы с трудностями компиляции и связывания модулей программы). Событие не представляет собой ничего, кроме события. Например, это может быть открытие формы, помещение курсора пользователем в поле на форме, изме- нение значения данных, перемещение указателя мыши над определенным эле- ментом управления или более 50 других событий, для которых можно писать код Visual Basic. Кроме того, писать код Visual Basic можно и для решения других задач, связанных с формами и отчетами: вывод отчета на печать, перехват воз- можных ошибок, проверка интервала времени и выполнение определенной зада- чи через заданное количество секунд. Каждое из этих событий инициирует за- пуск кода (или выполнение, как этот процесс называют на языке программи- стов). На рис. 1.1 показаны некоторые события формы, и окно Visual Basic, в котором была создана простая программа, проверяющая значение записи в тек- стовом поле и отображающая сообщение об ошибке, если поле пустое. Cl ' ti k vnfitei toi Ac. r •, I ’ 5 i I . 1 . I I и ’ I • Г . 1 • u . » 1 И . Private Sub Fon»_Currenn() If (. [TransType] On Error GoTo ErrorHondler With CudeConteMtCbiect I rd if If (. [TransType] 'Check" End (.Void “ False Or leNullf.volc . [Void Чсятп’ .Visible - Talae 'Check" And (.Void True And Not IsNulli. tc frni <{<>< ktvi № ♦ обметь —'I-I f I Or*. Hr ndjui чпЬ F iprtr Ml I Mwr A®**» ' Другие Joe Такушм мпись, Дооаики. Посла естаекм Дпо&юеявма, Поем оОДвЛОНа ВНКШШГ0Н1Н1ГМ) Отмам....... . Глалпме,. ... До по* твот* Дания № Пос..М пцдтверждамя Ое ОПфЬгте.......... . . . Загруэк*... .......- Ин от is однара..... Бьгружа Запет* Тфягодур. обрчБоткп c i____________L- f !.<< kWrtecr I < i in lit.i iIh kWi rtei (l |<МШЬгтаа> * | » | ] 1 ” J МЫ Cli.sn И EvwvStatu* Entim А МГ.ШгГЧ „Тин Ai dR EretUteOphonfcnum X rieta f eidABntcjt&Enum Fi*dErnj<Ti *Fi«Ma FeldStatUBEmjm •* lie System FitlarQraupEnum Д Financial Д)Рогт Form [rm Jfeaui it) FormJrmJWdAccc Ф FormjntiJtttscfwn * Form jrm_£ankAcc FormJrmJBankAcc Л FOrmjrmJBankSM Ш FormjrmjChsckHt Л FormjrmjCheckRf Ш Form, JrmjChecMAf LU FormJlmjChocMV . 11 FormJhn_OwcMM IM Farm Wm ГЮТМДГ v AcweControl f AflerO' iCorflfm tf WterDelCOnflrm Л AtlBrFina'R.i.der f MoiFrnBJRecwl*' * Altarlnsert F MIsrbiMrt * MIwLayoui F AterLsyout / MteiRnnder * AlterRentfer * M-rJpdate / Anewpoaie if AllowMG4ons V1 AllowDatasheeMew ftlowpeietlons d1 AlfowOesIgnChanges «9 Allow; bn. d' AhowFormvIew r«1 VijwPivoiCh i rtView AlhwPlvo[TableView Arn Im Inn нА Close Fonn MeHOer r ft адч .[Void Scamp].Visible - True End ir End Hinn GoTo Done ErrorHandler : MsgBcx Err.Description Done: End Bub Private Sub Гот_0реп[Cancel la Integer) DitB Tran-’Ь As Long On Ertor GoTo ErrorHandler IX dbc_IsLo«ded ("frtaj-heckReconc illation") Then HeI [Bankiccount] - [Forms} !(f rm^CheckReconciliat ion] ! [BankAcc Else He [B^nkArcouat] “ DLookup ("[DeXaulcBankAccouncNuBber] End Ir BankAccount^AfterUpdate 1L-J I • 1 " I • 2 ' I 1 3 ‘ * XarnrtaedK [подедурл <зОДбост» - [годедур* rfyafoiKH c rnt лидуре c&te&rw» : I [ck Puc, 1.1. Примеры событий для формы и окно Visual Basic, отображающее простую программу
ЛЖ Программирование баз данных — невероятные возможности 20 минут Во многие популярные современные программные продукты включен язык программирования или даже они разработаны на основе языков программирова- ния. Некоторые из этих продуктов — .NET, C++, Java, Visual FoxPro, Delphi, Visual Basic, Microsoft Access или Microsoft Excel. Существуют и другие продук- ты, менее популярные и от менее крупных компаний, но Microsoft Access явля- ется одной из самых гибких разработок, поскольку она создана на основе систе- мы управления базами данных. Системы управления базами данных позволяют создавать таблицы и связи между ними, а также хранить данные. Microsoft Access является многомерным продуктом, так как включает также легкий в использовании, но мощный набор инструментов для создания форм и отчетов. Возможности языка Visual Basic позволяют автоматизировать или усовершенствовать простые формы и отчеты, превращая их в удивительно мощ- ные средства. Microsoft Access включает серверную (back-end) систему управления базами данных; это означает, что в нем содержится два разных механизма управления данными. Первый механизм называется Jet. Вы можете не знать о нем, так как он встроен в Microsoft Access. Каждый раз, создавая новую базу данных, про- ектируя таблицу или занимаясь написанием запроса, вы используете механизм баз данных Jet. Второй механизм представляет собой меньшую версию SQL Server 2000, он называется Microsoft Database Engine. Microsoft Database Engine также известен как MSDE, его следует устанавливать от- дельно. Он находится в отдельной папке установочного диска Office 2003. При разработке профессиональных приложений Microsoft Access с помо- щью механизма Jet всегда создавайте два отдельных файла баз данных . mdb. Первый файл базы данных содержит только таблицы, а второй — связи для этих таблиц, включая запросы, формы, отчеты и код модуля. Такой прием известен под названием файл-серверной обработки данных (file/server computing), так как есть файл программы и файл данных. Вы могли слышать и другой термин, употребляющийся по отношению к такому механизму: клиент-серверная об- работка данных (client/server computing). Однако механизм баз данных Jet на самом деле таким не является, а представляет собой файл-серверный механизм баз данных. Настоящие клиент-серверные механизмы баз Данных (SQLServer и Oracle) выполняют фактически всю обработку на серверном аппаратном обеспечении ба- зы данных и минимизируют объем данных, который необходимо пересылать по сети. Несмотря на то, что Microsoft Access использует Jet в качестве менеджера баз данных, каждый раз, когда вся таблица данных передается по сети, процесс обработки выполняется на рабочей станции клиента. Оптимальное решение для больших приложений баз данных — использовать Microsoft Access как клиент и SQL Server или Oracle как сервер. SQL Server и Oracle являются очень мощными менеджерами баз данных, од- нако они не включают набор интегрированных инструментов и не имеют отдель- ного языка программирования. Так, SQLServer использует Visual Basic для об- работки собственной внутренней модели событий, которую можно описать как инициаторы и хранимые процедуры. Инициаторы (triggers) — это события, ко- торые отвечают на изменение значения данных. Изменение инициирует (или за-
пускает) блок кода, который называют хранимой процедурой (stored procedure) (ее название связано с сохранением в таблице данных). Microsoft Access 2003 содержит модель клиент-серверной базы данных под названием проекты и использует файловое расширение . adp. Эта встроенная модель клиент-сервер использует версию SQL Server для персональных компью- теров — Microsoft Database Engine (MSDE). Вы можете создавать приложения, которые работают с MSDE, а не с Jet, и при необходимости применять более мощные средства SQL Server. Использование базы данных Check Writer На сопровождающем Web-сайте находятся файлы примеров, которые будут использоваться в различных разделах книги. Другие бесплатные примеры про- грамм, а также демоверсии бизнес-систем и внешних компонентов можно полу- чить, обратившись к фирмам-разработчикам дополнительных компонентов для Microsoft Access. В этой книге используется достаточно простое приложение. Оно служит при- мером всевозможных типов приложений, которые можно разработать в Microsoft Access. Это программа для выписки чеков, электронная версия чековой книжки. Пример написан в MicrosoftAccess и запрограммирован на последней версии Ac- cess 2003, Visual Basic и внутреннем языке доступа к данным ADO. Вы будете использовать два файла. CheckWriter*.mdb Файл программы, содержащий запросы, формы, отче-' ты и модули CheckWriterData.mdb файл данных, который содержит только используемые в примерах таблицы Если вы никогда не работали со связанными базами данных, пришло время начать. Профессиональные разработчики приложений в Microsoft Access всегда хранят данные и программу в отдельных файлах баз данных. Таким образом, если про- граммы или спроектированные объекты (формы, отчеты и т.д.) понадобится изме- нить, разработчик может заменить файл программы заказчика, не затрагивая файлы данных. В уроках этой книги используются различные части примера Check Writer, демонстрирующие возможность разработки любого профессионального прило- жения. Приложение создано специально для того, чтобы показать все приемы и методы, необходимые для успешной разработки приложений, включая про- граммирование Visual Basic, проектирование данных и создание форм и отчетов. Использование главного меню Check Writer Когда вы в первый раз откроете приложение Check Writer, появится главное меню (рис. 1.2), которое состоит из нескольких простых кнопок и рисунка. По щелчку на кнопке запускается соответствующая функция. В главном меню можно выбрать одну из следующих функций. • Check Writer/Register Диалоговое окно, состоящее из нескольких вкладок, где можно добавить, изменить, удалить или отобра- зить чеки, депозиты, изменения и визуальный ре- гистр чеков
Рис. 1.2. Главное меню примера Check Writer Bank Accounts Check Reconciliation New Blank Account Wizard Import Export Recurring Payments Setup Exit Форма для ввода данных, в которую вводится инфор- мация о банковском счете Полная функция электронного согласования счетов, предназначенная для поддержания баланса счетов Форма-мастер для создания нового банковского счета и определения стартового баланса Форма-утилита для демонстрации возможностей им- порта и интеграции данных Форма-утилита для демонстрации возможности экс- порта данных Форма для демонстрации создания не одноразов ого (периодического) платежа, включая сохранение или получение данных Простая форма для ввода названия и адреса компании Функция, которая закрывает приложение Check Writer и выходит из Microsoft Access Использование формы ввода данных с вкладками Главное приложение Check Writer/Register состоит из четырех вкладок. Ка- ждая вкладка содержит отдельную суб форму, которая отображает одну или не- сколько записей. Вкладки фильтруют данные. В первых трех вкладках отобра- жаются только чеки (Checks), депозиты (Deposits) или изменения (Adjustments). На четвертой вкладке представлен регистр чеков, содержащий все типы опера- ций. На рис. 1.3 показана первая вкладка, где отображена сама форма чека. Здесь можно ввести номер чека, дату, выбрать или ввести нового получателя, указать сумму чека. Как вы узнаете из дальнейшего материала, такая форма достаточно трудоем- кая для программиста. Функция в поле Amount (Сумма) используется для авто- матического преобразования суммы в текстовое значение. Кнопки прокрутки в правом верхнем углу чека позволяют автоматически увеличить или уменьшить его номер. При добавлении нового получателя программа запрашивает подтвер- ждение на введение нового значения, и добавляет новую запись в отдельную базу данных получателей.
Рис. 1.3. Форма ввода данных с вкладками Check Writer/Register В нижней части формы расположены два флажка. Первый из них аннулирует чек и помещает на нем большую печать VOID; второй выводит чек на печать. Можно заполнить корешок под чеком с помощью специальной кнопки, которая получает значения из чека и записывает их в одну строку. Область в нижней части формы содержит кнопки, которые отображают диа- логовые окна для поиска и вывода на печать, а также кнопки New (Создать) и Delete (Удалить), в которых для обработки задач добавления и удаления дан- ных используются профессиональные процедуры перехвата ошибок. Основные понятия модели данных в приложении Check Writer Модель данных, которая используется в примере Check Writer, приведена на рис. 1.4. Большая часть данных по операциям хранится в таблице tbl CheckWriter. Эта таблица используется для хранения чеков, депозитов и изменений. В этой таблице хранятся все поля, необходимые для ввода информации по чекам, депозитам и изменениям, а также некоторые поля, используемые для согласования счетов (подведения баланса чековой книжки), вывода на печать и аннулирования че- ков. Поле TransType (Тип операции) используется для обозначения типа операции и фильтрации записей в каждой вкладке формы frm_CheckWriter. Таблица tbl_BankAccounts содержит всю необходимую информацию для до- бавления банковских счетов и связей этой информации с таблицей tbl_CheckWr i ter. Полем первичного ключа в таблице tbl_BankAccounts явля- ется BankAccountNumber, а первичным ключом в таблице tbl_CheckWriter — поле AutoNumber под именем TransID. Полем внешнего ключа для таблицы tbl_BankAccounts является AccountNumber в таблице tbl_CheckWriter. Поле Auto Number используется потому, что остальные более понятные ключи не име- ют смысла в разделе чековой книжки. Несмотря на то, что чеки обычно имеют последовательные номера, депозиты и изменения не нумеруются. Следовательно,
не существует подходящей комбинации внешнего ключа. Поля BankAccount- Number, Date и TransType не подходят, поскольку за один день может обраба- тываться несколько чеков, депозитов или изменений. Рис. 1.4. Модель данных в примере Check Writer Для поиска информации в данном примере используются две дополнительные таблицы. Таблица tbl_TypeOf Account содержит список типов операций, включая чек, депозит и изменения, например, исправление ошибок (Error Correction), про- центы (Interest), переводы (Wire Transfer), банкоматы (ATM) и др. Таблица tbl Payees состоит из списка уникальных получателей, который используется в чеках. Каждый раз, когда в строку получателя формы frm_CheckWriter вводит- ся новый получатель, можно добавить его в эту таблицу. Использование регистра чеков Регистр чеков находится на последней вкладке формы frm_CheckWriter (рис. 1.5). Эта форма не очень сложна в смысле программирования, тем не менее она прекрасно иллюстрирует непрерывную форму со сложными вычислениями, отображающую текущий баланс для каждого момента времени. Субформа Check Register (Регистр чеков) состоит из ряда строк. В последних раз- делах книги описывается использование формы из нескольких строк, включающей окружающие объекты OLE и редактируемый источник данных. Кроме того, вы нау- читесь изменять этот источник записей в программе при первом открытии формы и изменять в программе источник для выполнения вычислений в элементе управления. Диалоговое окно Print Checks Диалоговое окно для вывода чеков на печать Print Checks (Печать чеков), приве- денное на рис. 1.6, отображается при щелчке на кнопке Print (Печать) в нижней части формы Check Writer. Этот пример будет использоваться в нескольких уроках для иллюстрации взаимодействий между Visual Basic и диалоговыми окнами. Eta основании параметров, выбранных пользователем в диалоговом окне, выпол- няются различные блоки кода Visual Basic для решения следующих задач: выбора разных отчетов, изменения динамических множеств запросов (результатов з’апро- са), которые передаются в различные отчеты, и даже для определения полей отче- тов, которые будут скрыты или выведены на печать.
Рис. 1.5, Форма регистра чеков Рис. 1.6. Диалоговое окно Print Checks Управление процессом согласования чеков Форма frm_CheckReconciliation показана на рис. 1.7. Это окно содержит набор инструментов, с помощью которых пользователь может визуально подвес- ти баланс счетов. Сначала следует ввести банковский баланс, чтобы проверить разницу между банковским балансом и балансом в чековой книжке, после чего необходимо щелкнуть на кнопке Cleared и понаблюдать, как эта разница исчез- нет. Используя в форме поле со списком, пользователь задействует код Visual Ba- sic для перехода от одного банковского счета к другому. Кнопка EDIT (Правка) в непрерывной суб форме позволяет отобразить выбранную операцию: программа открывает форму CheckWriter, меняет вкладку и находит требуемую запись. Это хороший пример перемещения между несколькими формами.
Рис. 1,7. Форма согласования чеков Типичное окно Visual Basic Осталось 10 минут В следующем уроке вы узнаете, как создавать программы Visual Basic, и ознако- митесь с процессом работы с Visual Basic. На рис. 1.8 показано окно редактора Visual Basic, которое представляет собой отдельную программу в отдельном окне. I • • * 1 OR Л a . Ta < . l ftrf*.' > * I V 1 > «М t _ " X ' 4 |<AM LNwsnea* J _iJ 1 >1и 1 V Member of Form’ fl Form 0 ActiveControi a FormatCondrti f АйеЮеЮопйпп 0 FormatCondrti 0 AfterDeiConftrm В Forms 0 AfterFinatRender + FormShowCo 9 AfterFmaiRender 0 GetRowsOptic 0 AfterInsert 0 Global 9 Afterinc-rt Л GroupLevei □ ’ 0 Hyperlink 9 AfterLayout В IFontDSp 9 AfterRender В FontEventsO' 0 AfterRender ,*s Imaoe 0 AfterUpdate Information J iltertlpdate C Interaction 0 AHowj additions 0 IPidureDisp 0 AltowDatasheetView 0 isoiatooLewei 0 AflOwOeletiona 4£ KeyCodeCon$ 0 AliowDesignChanges Л Label 0 AJIowEdfts । 0 Lne v AhuwFitters * ListBox 0 AllowFormVisw LoadPidureC- 0 AllowP'ivQtCharMew 0 LockTypeEnui 10 AilowPrvotTableView t* MarsfiaiOptior 0 Application < Math jft ApplyFitter HttnodjMtnMn d * AutoCenter В Module d1 AutoResize 0 Modules 9 BetoreDetConfirm 0 ObjedFrame *| 0 BeforeDeiConflrm Property AfterLayout As String of muu t erm -•«хе мгдо. •rjrJ U iGawal) •UbtA-na Fat® *Ttiiities ‘For Access IX with ADQ ’To use these utilities the -unbound form must contain 'the following text box controls with appropriate values ' xfrrovider * xPataSource xRecordset xKey In acldit?_d, the following check box control? are required ElagEoltedl - default value of false flagFird. «г default valje of true tc allow instant find wflen frt® la r* -trf The tag property of each field is Set to the default value to be used when a new rec-ord is created 4he fern's filter property is used to stere the criteria fcr the recordset 'Tli is can be initially set to determine the initial reccrdset • If left blank initially, the form, will open in a find mode Option Compare Database .Option Explicit________ Public Function dbc_NewRecord(£rm A3 Form) 'Adds a new record Ein Dia Dim Dim Dim Dim strConnection As String cnn As rst As fid A3 Ctl As New ADODB.Connection New ADODB.Recordset ADODB.Field Control vazteogp Аз Variant On Error GoTo EtrorHandlet Рис. 1.8. Окно редактора VtsualBasic
Поскольку Visual Basic является отдельной программой в Microsoft Access, на панели задач в нижней части экрана Windows одновременно находятся две про- граммы: Microsoft Access и редактор Visual Basic. Во внутренних операциях Ac- cess данный факт имеет очень большое значение, однако для вас это означает, что можно просматривать оба окна одновременно, причем редактор не занимает па- мять, которая могла бы использоваться в Access. Таким образом, Access получает больше доступной памяти, продуктивность программы возрастает, а сама опера- ционная система Windows становится более стабильной, вследствие чего умень- шается нагрузка на машины, на которых работают программы Access. Чем больше свободной памяти предоставляется Microsoft Access, тем быстрее бу- дут работать программы и тем более стабильными они будут. Необходимо переза- гружать компьютер как минимум один раз в день, и если вы часто перемещаетесь между окнами дизайна и часто запускаете программы форм Access, следует регу- лярно закрывать и перезагружать Access (например, каждый час). При каждом переходе от окна дизайна на представление листа данных или форм Access осу- ществляется небольшая "утечка памяти". В итоге, если после многократных опе- раций такого рода не освободить память, система выдает отчет об отсутствии не- обходимой памяти, или Access выведет сообщение об отсутствующих ошибках. За- крыв Access и перезапустив его или перезагрузив систему, вы сможете очистить внутреннюю память. Подобные проблемы хорошо знакомы профессиональным разработчикам Access. Модули, процедуры и функции Прежде, чем переходить к следующему уроку, следует остановиться еще на некоторых понятиях. Идея программирования в Microsoft Access неразрывно приводит к модулям Visual Basic. Вы уже знаете, что в окне базы данных распо- ложена вкладка Модули (Module). В ней отображаются созданные для вас биб- лиотеки модулей. В базе данных может содержаться до 1024 библиотек модулей. Каждая библиотека модуля включает большое количество процедур (подобно книжной полке, которая вмещает много книг). Существует два типа процедур: функции и подпроцедуры (подпрограммы). Функции и подпроцедуры являются строительными блоками модулей. Каждый модуль содержит одну или несколько функций или подпроцедур, а каждая функция или подпроцедура — один или несколько операторов VBA. Термин процедура в Microsoft Access будет часто использоваться вместо термина подпроцедура (subprocedure),а иногда заменятьтермин функция (function). Процедуры содержат операторы программ Visual Basic, которые составляют модули. Продолжая пример с настоящей библиотекой, напомним о существова- нии книг в твердой и мягкой обложке — подобно этому, в библиотеке модулей содержится два различных типа процедур. Оба типа работают одинаково: они по- зволяют передавать параметры, влияющие на способ обработки операторов Vis- ual Basic, содержать обработку ошибок и использовать любые операторы Visual Basic. Единственное отличие функции от подпроцедуры заключается в том, воз- вращается ли после обработки значение. Функции возвращают значение после окончания обработки данных, а подпроцедуры — нет. Вкладка Модули — не единственное место, где содержатся модули Visual Basic. Можно разместить модули Visual Basic в любой форме или отчете. Они ве-
дут себя подобно тому, как функции или подпроцедуры в библиотеке модулей, но просто хранятся в другом месте. Гопюво! Как правило, если функция или подпроцедура используется только формой или отчетом, она сохраняется в коде этого объекта. Если же она должна использо- ваться в нескольких формах или отчетах, то хранится в модуле. Обзор В этом уроке вы изучили основные понятия программирования и ознакоми- лись с вопросами взаимодействия объектов Microsoft Access со средой програм- мирования Visual Basic. Речь шла о программировании, баз данных и типах про- цедур, которые используются в модулях Microsoft Access. Кроме того, было опи- сано приложение Check Writer, которое используется во всех последующих примерах книги. Итак, в данном уроке были рассмотрены следующие вопросы. Программирование — процесс создания инструкций для выполнения той или иной задачи. Visual Basic, или VBA, — это язык, который используется в модулях Mi- crosoft Access. • Microsoft Access использует визуальную среду программирования, осно- ванную на событиях. • Для управления данными Microsoft Access применяет файл-серверную систему управления базами данных под названием Jet. Кроме того, можно разрабатывать приложения, которые работают с Microsoft Database Engine (MSDE), а не c Jet, что позволит использовать при необходимости более мощные возможности SQL Server. • В книге приводится один общий пример, который представляет приложе- ние — электронную версию чековой книжки. • Каждая библиотека модулей может содержать ряд процедур. Функции и подпроцедуры являются составляющими элементами модулей. • Библиотеки модулей содержат только процедуры Visual Basic, а объекты форм и отчетов, кроме того, — встроенные процедуры. Проверьте себя 1. Определите понятие программирование. (См. раздел "Что такое программи- рование”.) 2. Назовите три причины, по которым лучше использовать не макросы, a Visual Basic. (См. раздел "Основные причины использования языка Visual Basic”.) 3. Какие две внутренние системы управления базами данных использует Micro- soft Access? (См. раздел "Программирование баз данных — невероятные воз- можности”.) 4. Назовите отличия в файл-серверной и клиент-серверной системах управле- ния базами данных. (См. раздел "Программирование баз данных — неверо- ятные возможности”.) 5. Какими основными функциями обладает пример Check Writer? (См. раздел "Использование базы данных Check Writer”.) 6. Назовите два типа процедур. (См. раздел "Модули, процедуры и функции”.)

УРОК От макросов — к модулям Содержание урока * Использование Visual Basic и макросов * Преобразование макросов в Visual Basic * Использование Мастера кнопок (Command Button Wizard) для созда- ния кода Visual Basic I * Применение редактора Visual Basic «Многие задачи могут быть выполнены с помощью интерфейса пользователя и не- скольких простых макросов. Однако существуют и такие, в решении которых макросы не помогут. Модули Visual Basic предоставляют самые мощные функ- зо минут циональные возможности и контроль над средой разработки приложении. Когда используются макросы Макросы — простой и быстрый способ выполнения простых действий. В окне макроса находится список доступных команд, здесь выводятся подсказки по ар- гументам, соответствующим каждой команде — таким образом, не обязательно запоминать сложные команды и аргументы. В Access некоторые действия могут работать действительно быстрее через макросы, а не через модуль Visual Basic. Макросы рекомендуется использовать в следующих случаях. • Открытие и закрытие форм. • Запуск отчетов. • Удаление всех записей таблицы или обновление всех значений в поле. Макрос mcr_OpenBankAccount использует команду Открыть форму (OpenForm) для открытия формы frm^BankAccounts. На рис. 2.1 показан мак- рос mcr_OpenBankAccount в окне Макрос (Macro) .
Рис. 2,1, Использование окна макросов для создания простого макроса Макросы обычно используются с помощью командных кнопок. Вы вправе на- значить макрос определенной командной кнопке на кнопочной форме, чтобы обеспечить простой и быстрый способ перемещения между различными формами приложения. Чтобы присоединить макрос к командной кнопке, необходимо вве- сти название макроса в свойстве Нажатие кнопки (On Chck) этой кнопки. На рис. 2.2 показана командная кнопка cmdBankAccounts для кнопочной формы CheckWriter. Макрос тле г _OpenBankAc counts задан в событии Нажатие кнопки (On Click) этой командной кнопки. Когда пользователь щелкает на ко- мандной кнопке Bank Accounts (Банковские счета), запускается макрос Open Bank Accounts» открывающий форму Bank Accounts. Когда используется Visual Basic Несмотря на то, что макросы предоставляют простой способ выполнения мно- гих действий в приложении, в более сложных ситуациях предпочтение отдается Visual Basic. Создать процедуру Visual Basic сложнее, чем макрос. Однако Visual Basic предлагает более полный набор команд и обеспечивает больший контроль при обработке ошибок пользователя и ошибок, которые могут произойти в работе приложения. Visual Basic является лучшим решением в следующих ситуациях. • Создание собственныхфункций. • Обработка ошибок и отображение оконсообщений. • Автоматизированная интеграция с другими приложениями (например, Microsoft Word или Microsoft Excel). • Вызов функций Windows (например, диалоговых окон открытия и сохра- нения файлов File Open и File Save). Перебор группы записей в таблице.
♦ Работа с объектами приложения. • Передача переменных в процедуру или функцию. • Отображение панели состояния. Рис. 2.2. Выполнение макроса с помощью командной кнопки Таким образом, Visual Basic делает приложение более профессиональным, обеспечивая широкие возможности обработки ошибок и большую мощность функций. Осталось 20 минут Преобразование макросов в код Visual Basic Вы уже убедились в преимуществах использования процедур Visual Basic и теперь можете при желании заменить многие макросы в приложениях про- граммами Visual Basic. Даже для приложений не очень большого размера задача анализа и переработки каждого макроса в эквивалентный код Visual Basic может оказаться довольно сложной. К счастью, Access обеспечивает быстрое и простое решение для автоматиче- ского преобразования макросов в код Visual Basic. Можно сохранить библиотеку макросов либо как объект макроса, либо как модуль. При сохранении библиоте- ки макросов как модуля Access автоматически создает объект модуля в окне базы данных (Database). Этот модуль содержит отдельную процедуру Visual Basic для каждого макроса в исходной библиотеке макросов. Чтобы сохранить библиотеку макросов как модуль, выберите макрос на вкладке объектов макросов в окне базы данных. Затем выберите команду Файл^Сохранить как (File^SaveAs). Диалоговое окно Сохранение (Save As) при- ведено на рис. 2.3.
В диалоговом окне Сохранение введите название нового модуля и выберите Модуль (Module) в списке Как (As). Затем щелкните на кнопке ОК. Диалоговое окно Преобразование макроса (Convert Macro) показано на рис. 2.4. Рис. 2.3. Сохранение макроса как модуля Рис. 2.4. Определение параметров преобра- зования макроса в модуль Установите соответствующие флажки, чтобы включить обработку ошибок и комментарии. Затем щелкните на кнопке Преобразовать (Convert). В процессе преобразования каждая новая процедура отображается в редакто- ре Visual Basic. По окончании редактор Visual Basic закрывается, и появляется окно сообщения Преобразование макроса в Visual Basic (Conversion Finished). Щелкните на кнопке ОК, чтобы закрыть это окно. Новый модуль отображается в списке Модули (Module) в окне База данных. Когда Access дает название новому модулю, к названию, указанному в диалоговом окне Сохранение, добавляется префикс Преобразованный макрос (Converted Macro). На рис. 2.5 показан преоб- разованный код для макроса mcr_OpenBankAccounts. Преобраэош Module Function mcr_OpenBankAccoants() On Error SoTo- racri OpenBankAccount.- Err DoCmd.OpenFona **frrn_BankAccount5"r mcr_OpenBankAccount3_Exit: Exit Function mor OpenBankAccounts_Err: MsgBox Error$ Resume mcr_OpenBankAccounta_Exit End Function acNormal, Puc. 2.5. Код преобразованного макроса
При открытии нового модуля в представлении Конструктор (Design), редактор Vis- ual Basic отображает код Visual Basic для новых процедур. Вы можете проанализиро- вать код Visual Basic и посмотреть, чем он отличается от действий макросов в библио- теке макросов. Это прекрасный способ научиться писать код Visual Basic. Как видно из рис. 2.5, Access создает функцию под названием mer_0penBankAccounts. В верхней части функции Access добавляет четыре строки комментариев. Здесь они используются просто для отображения назва- ния функции. При необходимости можно добавить дополнительные строки ком- ментариев. Строки комментариев в верхней части каждой функции и процедуры очень важны. Здесь можно указать информацию о предназначении функции или процедуры и добавить специальные комментарии, необходимые для понимания кода. Если в диалоговом окне Преобразование макроса был выбран параметр обработки ошибок, Access автоматически создает оператор On Error. Оператор On Error первый оператор в функции или процедуре. On Error указывает Access, где следует искать раздел с кодом обработки ошибок, если при выполнении программы произой- дет ошибка. Раздел обработки ошибок включает оператор, отображающий сообщение пользователю, и команду для выхода из процедуры или функции. Подробнее об обработке ошибок см. урок 16. Оператор, который начинается с DoCmd. OpenForm, — это код, эквивалентный действию Открыть форму (OpenForm) в макросе. Методы DoCmd выполняют действия Access из Visual Basic. Действия Access включают такие задачи, как открытие и закрытие форм и отчетов, установка значений элементов управле- ния. Аргументы действий макроса преобразуются в параметры метода DoCmd. Можно преобразовать макросы, которые используются в форме, в представлении Конструктор этой формы, выбрав команду Сервис^Макроса Преобразовать макрос в Viasual Basic (Tools^Macro^Convert Macro to Viasual Basic). Создав код Visual Basic, Access заменит название макроса в форме ссылкой на новую процедуру. Использование мастера кнопок Существует еще один простой способ научиться писать процедуры Visual Ba- sic— используйте Мастер кнопок (Command Button Wizard). В этом мастере по- следовательно выводятся подсказки по информации, которая необходима в Ac- cess для создания командной кнопки и соответствующей ей процедуры. На рис. 2.6 показано одно из окон мастера. По окончании работы с мастером просмотрите процедуру, созданную для ко- мандной кнопки. Процедуру можно использовать без изменений или в качестве исходного варианта и при необходимости изменить. Чтобы просмотреть процедуру командной кнопки, выполните следующие действия. 1. Отобразите форму в представлении Конструктор. 2. Откройте окно Свойства (Property) для требуемой командйой кнопки. 3. ^Целкните на кнопке Построитель (Builder) свойства события Нажатие кноп- ки. В редакторе Visual Basic будет отображена процедура командной кнопки.
Рис, 2,6, Создание кнопок На рис. 2.7 показана процедура для командной кнопки cmdBankAccounts в ре- дакторе Visual Basic. Рис, 2,7, Процедура события Нажатие кнопки для командной кнопки cmdBankAccounts Подробнее о процедурах событий см. урок 4. Остаюсь Ю Минут Использование редактора Visual Basic Редактор Visual Basic — это инструмент проектирования, который использу- ется в Access для создания и редактирования в приложении кода Visual Basic.
Компоненты редактора Visual Basic Редактор Visual Basic имеет четыре основные области. • Строку меню. • Панельинструментов. • Окно кода (Code). • Окно Immediate. Строка меню помогает быстро создавать новые модули и процедуры. Панель инструментов содержит кнопки для действий, которые чаще всего используются при работе с кодом Visual Basic. Окно кода — самая важная часть редактора Visual Basic. Именно здесь пи- шется код Visual Basic. Можно изменять размер, сворачивать, восстанавливать и перемещать окно про- граммы. Кроме того, можно разбить окно на две части, чтобы одновременно ре- дактировать две процедуры (для этого выберите команду Window^Split). Окно Immediate позволяет протестировать строку кода с открытым окном процедуры. Это удобно, если вы точно не знаете, какой результат дает то или иное выражение. Чтобы отобразить окно Immediate, выберите команду View1^ Immediate. Для проверки выражения введите ? и это выражение, затем нажмите <Enter>. На рис. 2.8 показано тестирование результата вычитания 30 дней из текущей даты. ? date-30 23.02.04 Рис. 2.8. Тестирование кода в окне Immediate В окне Immediate также можно выполнить процедуру, особенно в том случае, если требуется проверить, что процедура работает верно. Чтобы протестировать процедуру, введите в окне Immediate ? и название необходимой процедуры. Если процедура должна получать аргументы, их обязательно следует указать. На рис. 2.9 показано тестирование процедуры SpellNum. ? dbc_spellnum(53.39> Fifty Three and 39/100 Рис. 2.9. Использование окна Immediate для тестиро- вания процедуры Создание кода в окне программы Пока вы еще только изучаете синтаксис Visual Basic, работа в окне програм- мы может показаться достаточно неудобной по сравнению с работой в приложе-
нии Access. Тем не менее, редактор Visual Basic имеет встроенные возможности, которые помогут усовершенствовать знания Visual Basic. При вводе строки кода процедуры на экране отображается справка, Auto List Members и Auto Quick Info, которая позволяет сориентироваться в доступных для этой процедуры командах и параметрах. Справка Auto List Members автоматически отображается при вводе первых символов команды. Например, при вводе DoCmd., отображается список воз- можных команд (рис. 2.10). Можно либо выбрать в списке одну из команд, либо продолжить ввод команды, если известно, какую команду следует ис- пользовать. ите вопрос и. Enabled FJ л Microsoft Visual F'-asir ( herkWriterllata [Рогт_Форма1 (Codv)] Ftntltefc FoniName Fontfitee Option Ссщраге Database Public Sub openfnrmO DoCmd. |3penForm КнппкаО 104 'мт&гсхЯгеАхКногкдО I FontUndenne Ease <«t '».«<kvvnirr(> f""| .|А Г>>- ГГГ8 Corrfr nfHpTcxt CmfrcfTypr HjrrtBoid 0 End -.% OpenFunction > OpenModule Л OpenQuery Л- OpenReport OpenStoredProcedure ^OpenTable True 'False jTdhqma I®.________ £• ЗД acwZtMlfACWZTOOk Й M Check Writer Bata (C Ё Mkyoeoft Office Ata ' Еопцивармах Рис. 2 .1 0. Справка Auto List Members в окне программы openform КнолкаО CommandButton * HutaRyeat Fdse Carxrt {Eater________ Справка Auto Quick Info отображает параметры введенной команды. Следую- щий необходимый параметр выделен в этом списке полужирным шрифтом. По мере ввода каждого из параметров и разделителя-запятой, полужирным шрифтом будет выделяться следующий параметр. На рис. 2.11 показана справка Auto Quick Info для параметров команды OpenForm. Компиляция процедуры После создания процедуру необходимо скомпилировать с помощью коман- ды Debug^Compile. Это действие проверяет код Visual Basic на наличие оши- бок и преобразует его в формат, понятный для компьютера. Если процесс ком- пиляции заканчивается ошибкой, отображается окно сообщения, в которой указано, какая ошибка найдена в программе, а строка с ошибкой выделяется в окне программы. Если получена ошибка компиляции, сразу же измените код, чтобы ее испра- вить, а затем скомпилируйте процедуру повторно.
DoCnd. openf ona OpeaFormCFormWafne, (WewAsAcFormVicwsacNocmalJ, End Sv [FitterNamel [WhereCondft<on}[DataModeA<< AcFomiOpenDataMode = acFormPropertySetfings], [WndowModeAs AcWindowMode = acWindowNormalf {OpenArgg]) S *3 Microsoft. Office Acc Я FomjpeoRil < KwomaO CommandButton Mphibett cetagonad | Puc. 2,11, Справка Auto Quick !п1одля команды OpenForm Access компилирует все процедуры, не скомпилированные на момент вызова ко- манды Debug ^Compile, а не только ту, которая просматривается в этот момент. Когда приложение будет скомпилировано, команда Debug^Compile станет не- доступной. Перед передачей приложения заказчику необходимо удостовериться, что приложение скомпилировано. Подробнее о передаче продукта конечным пользователям см. урок 23. Сохранение процедуры В процессе создания процедуры следует часто сохранять работу, чтобы избе- жать потери важного кода в случае какой-либо ошибки аппаратного обеспече- ния. Для сохранения процедуры выберите команду File^Save. Обзор О В этом уроке вы научились использовать некоторые встроенные инструменты для автоматического создания процедур Visual Basic и изучили работу в редакто- ре Visual Basic. Данный урок включал следующие темы. Готово! • Можно сохранить библиотеку макросов как модуль, чтобы автоматически преобразовать действия макроса в код Visual Basic. • Мастер кнопок автоматически создает процедуру Visual Basic, которая за- пускает событие OnClick для командной кнопки. • Окно Immediate используется для тестирования программы. • Редактор Visual Basic обеспечивает компиляцию для проверки ошибок в программе.
Итак, вы ознакомились с некоторыми инструментами для создания программ Visual Basic. Прежде, чем переходить к созданию первой программы, необходимо рассмотреть вопросы общей разработки программы. Проверьте себя 1. Назовите ситуации, когда лучше использовать макросы, а не код Visual Basic. (См. раздел ’’Когда используются макросы”.) 2. Назовите функцию Access, которая автоматически преобразует макрос в мо- дуль. (См. раздел "Преобразование макросов в код Visual Basic”.) 3. Назовите оператор Visual Basic, который обрабатывает ошибки при выпол- нении программы. (См. раздел "Преобразование макросов в код Visual Basic”.) 4. Назовите возможность Visual Basic, которая позволяет быстро протестиро- вать строку кода. (См. раздел "Компоненты редактора Visual Basic”.) 5. Как можно узнать, что программа скомпилирована? (См. раздел "Компиляция процедур”.)
УРОК Разработка системы и процессов, тестирование и отладка Содержание урока * Проектирование системы * Планирование программ * Тестирование программ * Проверка синтаксиса и компиляция ✓ Отладка, точки останова и окно Immediate Э Приступая к программированию, необходимо четко осознавать задачи, входя- щие в разработку приложения. Дизайн, или проектирование, системы — первый шаг в разработке любого компьютерного приложения — включает аппаратное зоминут обеспечение, сети и программное обеспечение. При работе с Microsoft Access пер- вые два элемента обычно уже имеются. Если компьютерная система и сеть имеют достаточные возможности для работы с Microsoft Access, то любая программа, созданная в Microsoft Access, будет работать без проблем. Если вы создавали приложения с таблицами, формами, отчетами и, возмож- но, с макросами, значит уже проектировали системы. В этом уроке описаны ба- зовые концепции разработки; основное внимание сосредоточено на выборе рабо- чего набора проектов форм и таблиц, а также уделено внимание планированию следующего этапа — программирования. В этом уроке также представлены кон- цепции тестирования и отладки программ Visual Basic.
Проектирование системы Начиная работу над приложением, необходимо определить самые общие це- ли, а затем постепенно их детализировать. Когда авторы этой книги решили ис- пользовать один пример во всех уроках, они долго думали над тем, какое же при- ложение будет демонстрировать все необходимые функции. Мы решили приме- нить успешное приложение Check Writer, работавшее в предыдущих версиях Microsoft Access, и переписать его с использованием метода доступа к данным ADO, который применяется в Access 2003. Разработка приложения напоминает строительство дома. Вы начинаете с то- го, что ставите цель — построить дом. Затем определяете свои требования более подробно. Вы хотите дом в колониальном стиле, двухэтажный, около 250 квад- ратных метров площади. Затем вы решаете, сколько комнат будет на каждом этаже, планируете размеры и расположение комнат. Далее необходимо разрабо- тать чертежи и заказать материалы. Только после этого начинается сам процесс строительства. Во время строительства дома профессиональные рабочие часто выполняют измерения, проверяя, чтобы все линии и углы были прямыми. При этом исполь- зуются различные инструменты: уровни, шнуры и прямоугольники. Аналогич- ным образом вы используете различные инструменты Visual Basic, чтобы обеспе- чить качество приложений Microsoft Access: проверку орфографии, компилятор, встроенные средства отладки, окно Immediate и точки останова. Разработка приложения Microsoft Access стоит гораздо меньше, чем строи-- тельство дома, поскольку не задействуются материалы, а используется только труд. Однако время на проектирование системы, затраченное перед созданием приложения, не должно сокращаться. Безусловно, можно снести стену дома по- сле его постройки, но вы, скорее всего, стремитесь сделать все правильно с перво- го раза. Было бы неплохо, если бы дом мог говорить каждый раз, когда вы со- вершаете ошибку (например, делаете дверной проем слишком маленьким). К счастью, как раз такую информацию дают встроенные средства Microsoft Ac- cess, когда вы программируете приложение. Возможно, для того чтобы начать проектировать систему с использованием Microsoft Access, не обязательно делать детальные чертежи, однако необходимо создать набор требований к системе с возрастающей детализацией. Сначала должна быть определена общая проблема, затем — детали, после этого — специ- фикация с еще большей детализацией. Визуальный дизайнер форм и удобная для пользователя среда создания таблиц, предоставленные в Microsoft Access, делают эту программу идеальной для разработки систем. Вы можете создавать прототи- пы так же быстро, как появляются идеи у вас в голове, а также моментально вно- сить необходимые изменения по ходу проектирования. Таким образом, на первоначальное проектирование системы в Access требует- ся меньше времени по сравнению с использованием других визуальных языков программирования. Перед началом программирования следует определить сис- тему — в результате вам будет легче работать над проектом. Создание компьютерного приложения включает следующие фазы проекта. • Общий дизайн (системный дизайн). • Подробный дизайн. • Программирование идокументация. • Тестирование. • Отладка.
Общий дизайн Общий дизайн системы определяется с точки зрения бизнеса, а не с техниче- ской или компьютерной стороны. Как правило, общий проект системы занимает несколько страниц, в нем рассматриваются самые важные аспекты системы. В общем проекте только перечисляются основные функции системы. Впоследствии в соответствии с этой схемой функции описываются более детально. В проекте также должны быть описаны результаты работы системы (отчеты), поскольку, как правило, проекты данных или формы невозможно создать, не определив то, что в конечном итоге ожидают получить из системы. Начиная работу над созданием Check Writer, мы хотели создать приложение, которое будет точно отображать повседневный процесс выписывания чеков и ве- дения счетов, т.е. процесс, знакомый пользователям. После определения вида приложения — электронная чековая книжка — мы перешли на следующий этап и определили небольшую группу более детальных функций. Мы хотели разрабо- тать чековую книжку, которая работала бы, как обычная чековая книжка, и включала следующие возможности. • Форму для ввода и редактирования информации о банковских счетах. • Отдельные формы для ввода и редактирования чеков, депозитов и исправ- лений. • Регистр чеков, в котором указаны все чеки, депозиты и исправления, а также ведется текущий баланс. • Систему для согласования сумм по чекам, по которым были произведены расчеты. • Главное меню для перемещения между этими функциями. Дизайн — бесконечный процесс, а не просто фаза разработки Проектирование системы — это непостоянный процесс. Он никогда не заканчивается. Вы пе- ресматриваете приложение, работаете над ним и обновляете его. Сначала рождается идея, она оформляется точнее, обсуждается, после чего она пополняется другими идеями. И все это про- должается до тех пор, пока не будет достигнут необходимый результат. Подобное может проис- ходить на любом этапе дизайна. Иногда при тестировании уже законченной формы вы пони- маете, что пропустили базовый набор данных, и в результате может потребоваться создать но- вую таблицу, изменить организацию формы или даже заново спроектировать некоторые части всего приложения. Не расстраивайтесь, если такое произойдет. Даже самые опытные разра- ботчики проходят через это. Зачастую может быть лучше просто создать прототип самой пер- вой идеи, вообще не обсуждая ее!_________________________________________ I Подробный дизайн Если определена общая концептуальная модель системы и общая идея того, что необходимо разрабатывать, можно переходить к деталям. В этой книге пред- полагается, что хотя бы один член вашей команды обладает необходимыми зна- ниями в предметной области, чтобы дать детальные описания системы, незави- симо от используемой для ее разработки программы. Подробный дизайн должен включать наброски форм и отчетов, которые будут необходимы в приложении. Проекты форм и отчетов нужны для планирования элементов исходных данных и создания таблиц и связей, а также определения проекта системы данных. Их можно сделать на бумаге или использовать в качестве инструмента для создания прототипов Microsoft Access.
Описанный выше процесс рекомендуется начинать с работы с клиентами и их существующими системами. Почти во всех консалтинговых проектах клиенты либо автоматизировали ручную систему, которая уже существовала на бумаге или в картотеке, либо создали новую систему. В последнем случае клиенты обычно приводят в качестве образца систему, принятую в другой компании. Лишь в очень редких случаях система должна быть создана без какого-либо базо- вого шаблона. При разработке приложения Check Writer первым заданием команды было следующее: скопировать чек и регистр чеков из собственных чековых книжек. В результате мы получили пять разных примеров, подобных, но имеющих не- большие отличия. Названия банков находились в разных местах, на одном из че- ков содержалось место для адреса получателя, другой вид имел поля для заме- ток. Почти у всех членов команды чеки хранились в небольших чековых книж- ках карманного размера. Однако у одного из наших сотрудников чеки были большие и состояли из нескольких частей, сам чек находился сверху, а в середи- не и в нижней части листа было оставлено место для корешка чека. Мы решили, что для предприятия удобнее использовать чеки из нескольких частей. После определения базового шаблона оказалось, что несложно разрабо- тать основные параметры печати, например, выбор из трех вариантов чека и вы- вод номера чека, если на бумаге нет предварительно введенных номеров. Начали мы с самого основного элемента — чека. Для этого был рассмотрен на- стоящий чек и использована уже разработанная таблица, которая в исходном ва- рианте состояла из таких полей данных. • Номер чека. • Дата чека. • Получатель. • Сумма чека. • Заметки. Затем была спроектирована простая форма, в которой располагались эти эле- менты (рис. 3.1). Как видно из рисунка, даже при таком простом проекте прило- жение уже начинает внешне напоминать чек и теоретически может использо- ваться для ввода данных и создания отчетов. Когда был готов первый проект формы, мы добавили основной текст (например, названия полей) для информации о банковском счете — номер бан- ковского счета, название банка, адрес банка и код банка. Однако некоторые кли- енты пользовались несколькими банковскими счетами. Мы решили добавить таблицу для банковского счета и включить в форму и таблицу Check Writer воз- можность работы с несколькими счетами. На данном этапе необходимо было не только спроектировать и разработать таблицу и форму Bank Account, нои добавить несколько дополнительных полей в таблицу Check Writer. Мы добавили в таблицу tb] CheckWri Ъегполе Account - Number и связали таблицы tbl CheckWriter и tbl_BankAccounts, что позво- лило записывать номер банковского счета в записи Check Writer и использовать эту запись для нескольких банковских счетов. После этого мы добавили в форму Check Writer поле со списком, в котором отображаются все банковские счета. Для этого следовало написать код Visual Ba- sic для изменения или фильтрации банковских счетов. Мы учли и тот факт, что хотя в приложении была форма для чеков, требовалась еще одна форма для ис- правлений и подведения баланса счетов.
Рис. 3.1. Простая таблица Check Writer и дизайн формы В конечном итоге стало понятно, что между несколькими формами тяжело перемещаться, поэтому все формы мы свели в одно диалоговое окно со вкладка- ми, которое и используется в рабочем примере. Этот процесс занял несколько недель работы. Мы создали большое количество прототипов, что является нормальной частью разработки: анализ и дизайн, програм- мирование, тестирование и отладка, усовершенствование и повторный дизайн. Дан- ный процесс на самом деле никогда не останавливается. Вы можете продолжать до- бавлять в приложение все новые и новые функции. Наш регистр чеков был разрабо- тан на основе нескольких различных прототипов, наша работа несколько раз начиналась с начала, пока не был получен дизайн, который всем понравился. В результате разработчики получают готовую форму (насколько ее можно на- звать готовой без написания макросов или программ Visual Basic). Несмотря на то, что форма может использоваться для простого ввода или отображения данных, обычно для завершения разработки необходимо добавить обработку данных. Проверка ошибок, вычисления, перенос данных из одной таблицы в другую, заполнение списков информации для полей со списками в форме, фильтрация данных, создание меню — лишь немногие причины, которые делают необходимой разработку программы. Подход "концентрических кругов" в разработке приложений Microsoft всегда использует философию разработки продуктов, которая включает дизайн, про- граммирование и тестирование набора функций с возрастающим количеством функциональ- ных возможностей на каждом новом этапе. Microsoft разрабатывает схему, которая содержит небольшие наборы функций. Сначала разрабатываются самые основные функции. Затем вер-
сия передается заказчикам для комментариев и тестирования. Пока одна небольшая команда разработчиков работает над тестированием и отладкой одного набора функций, другая коман- да программирует следующий набор функций. Еще одна группа работает над усовершенство- ванием проекта следующего набора функций. Этот процесс продолжается до тех пор, пока Mi- crosoft не подготовит продукт к выпуску. Когда продукт готов, функции, которые не прошли критерии тестирования, просто не включают в продукт. Продукт может быть выпущен несколько раз с различными наборами функций. На основании динамики рынка и реакции клиентов продукт либо остается в конечной версии, либо его раз- работка продолжается. Этот процесс напоминает концентрические круги, которые становятся все больше и больше. Таким образом, параллельно с существующей готовой версией продукта, разра6атывается.другая которая пополняет продукт дополнительными функциями. Осталось 20 минут Планированиеэтапапрограммирования После проектирования основных объектов для ввода данных (на бумаге или с исполь- зованием MicrosoftAccess для создания прототипов проектов таблиц, форм и отчетов) можно переходить к разработке кода. Сами формы для ввода данных без какой-либо программы предоставляют достаточно ограниченные возможности. Добавление в формы Access программ Visual Basic или макросов предлагает широкие возможно- сти для обработки ошибок, осуществления вычислений или создания формул, добав- ления элементов навигации (перехода с одной формы на другую), обработки обмена данными между таблицами, поиска записей и создания гибких диалоговых окон для печати. Кроме того, можно добавить специальные^ эффекты для окон приложения, возможность настройки параметров пользователем, поле справочной информации о программе, запрограммировать защиту данных, добавить систему меню или кно- почную форму. Наиболее быстрый способ узнать, как написать код для выполнения определенной задачи, — найти готовую программу, которая выполняет необходимые операции, и изменить ее в соответствии с собственными таблицами и формами. В этой книге будет рассмотрено много примеров. Однако прежде, чем пере- ходить к написанию программ, следует определить, что вы хотите написать и где должна храниться программа. Урок 4 посвящен событиям. События существуют в формах, элементах управления на формах и процессах форм (до и после операции вставки, обновления или удаления записей), а также в некоторых других местах. Когда вы планируете программу в Visual Basic, можно начать с проверки дан- ных при их вводе в форму, проверки данных в каждом элементе управления и при сохранении записи. Помещая код проверки данных в события группы
До обновления (Before Update), можно фактически предотвратить ввод непра- вильных данных в элемент управления и отобразить сообщение, чтобы пользова- тель ввел другие данные. Если же код проверки данных помещают в события группы После обновления (After Update), то, значит, данные уже были приня- ты. Данные могут переноситься в другой элемент управления или храниться в другой таблице, а не в поле элемента управления. Значительная часть программы пишется для обработки числовых данных или выполнения бизнес-правил, продиктованных предназначением приложения. На- пример, после ввода строки в приложение счета-фактуры необходимо пересчитать сумму и проверить, облагается ли налогом эта операция. Если она облагается нало- гом, вычисляется налогооблагаемая сумма, и для подсчета общей суммы к этой ве- личине добавляется сумма налога (ставка налога, умноженная на налогооблагае- мую сумму). В примере Check Writer аннулированные чеки не должны добавляться в текущий баланс регистра чеков. Бизнес-правила определяют, что должно быть спроектировано. После этого проект реализуется в программе. Когда вы разработаете собственное приложение, у вас появится свой набор ра- бочих процедур. Чем больше вы работаете, анализируете, проектируете или раз- рабатываете, тем легче становится этот процесс. Один из способов ускорить процесс разработки — купить одну из недорогих биб- лиотек с утилитами, интерфейсами и базами исходного кода. Одни из самых луч- ших библиотек — Total Access Sourcebook, библиотека кода Visual Basic от FMS Corporation (сайт www. fmsinc. com) и EZ Access Developer Tools, библиотека проектов интерфейса и кода Visual Basic от Database Creations (авторов книги) на узле www.databasecreations.com. См. также сопровождающий Web-сайт к этой книге (www. wiley. com/compbooks/prague), где приведены ссылки на демонстрационные версии этих и многих других продуктов, а также адреса Web-узлов с последней информацией о продуктах. В процессе проектирования и определения тех задач, которые нельзя выпол- нить с использованием одних только форм, задачи превращаются в бизнес- проекты и проекты процессов, а впоследствии — в проекты Visual Basic. Сущест- вует несколько сотен и даже тысяч различных типов операторов, констант, пере- менных и конструкций Visual Basic. Не старайтесь выучить их все. Запомните только то, что необходимо для программы, над которой вы работаете. Уделите особое внимание операторам, которые часто используются, и по мере необходи- мости изучайте новые средства. Несмотря на то, что созданию алгоритмов можно научиться только на практике (при проектировании на конкретном языке программирования), в книге будут приведены многие алгоритмы для решения большого количества различных задач. Тестирование и отладка приложений Тестирование — первый шаг в процессе, позволяющем удостовериться, что приложение работает должным образом. Каждый раз при переходе из проекта формы в проект отчета или от редактора Visual Basic к запуску этих форм, отче- тов и программ Visual Basic вы тестируете свое приложение. Кроме того, когда вы пишете строку кода и переходите на другую строку, вы (или Access) тестируе- те код. Когда вы изменяете свойство в форме или отчете и перемещаете курсор на другое свойство, вы (и Access) тестируете форму или отчет.
I Тестирование — это процесс проверки на предмет того, работает ли приложе- ние таким образом, каким оно было спроектировано (и работает ли приложение вообще). Если вы запускаете приложение, и оно не работает, значит, обнаружен дефект программы. Исправление проблем называют отладкой (debugging). Этот термин (от англий- ского слова bug — насекомое) появился во времена существования самых старых ламповых компьютеров, а фразу приписывают пионеру компьютерной техники ад- миралу Грейс Хоппер. По "легенде", моль вызвала короткое замыкание в аппарат- ном обеспечении, и устранение моли назвали debugging. Возможно, вам уже многое известно о тестировании и отладке. Когда вы за- пускаете отчет, в котором отсутствуют данные, то вы должны помнить, что сле- дует проверить свойство Record Source (источник записи) этого отчета и просмот- реть данные в запросе или таблице, чтобы проверить, является ли проблемой ис- точник данных. Если при запуске формы вместо отдельных параметров появляются значения ошибки #Name или ttError, необходимо проверить источ- ник элемента управления (Control Source). Возможно, ошибку вызвала непра- вильная ссылка на поле таблицы или орфографическая ошибка, а может быть, что в операторе слишком много скобок и т.д. Если возникает проблема, советуем проконсультироваться с более опытным специалистом, посмотреть информацию об ошибке в справочной системе либо проанализировать синтаксис формулы. ЕСри запуске форм и отчетов Access может выдавать ошибку, если обнаружит серьезный недостаток программы. Когда вы создаете код Visual Basic, многие встро- енные инструменты редактора Visual Basic помогут выявить какие-либо проблемы. Проверка синтаксиса — первый шаг При вводе строки кода в редакторе Visual Basic каждый символ сравнивается с известным (ограниченным) набором корректных команд Visual Basic. В уроке 2 были рассмотрены справочные средства Visual Basic — Auto List Members и Auto Quick Info, которые помогают правильно ввести код. Когда ввод строки кода за- вершен, другой встроенный инструмент (проверка синтаксиса) проверяет, со- держит ли строка кода только корректные операторы. Синтаксис — название, используемое для компьютерной грамматики. На рис. 3.2 показан неправильно введенный оператор и сообщение об ошибке, которое отображается при попытке выйти из этой строки. Несмотря на то, что на черно-белом рисунке этого не видно, строки программы имеют разный цвет. Первая строка на рис. 3.2 — синего цвета, он указывает на то, что строка введена корректно. Вторая строка зеленая, таким цветом обозначены комментарии. Красный, используемый для третьей строки, указывает, что данная строка вы- делена при проверке орфографии и еще не исправлена. Компиляция процедур Если вы создали подпроцедуру или функцию и решили убедиться, что весь синтаксис верный, скомпилируйте процедуру с помощью команды Debugs Compile имя_Г!роекта из меню Visual Basic (рис. 3.3). Это действие проверяет код на наличие ошибок и одновременно преобразует программы в форму, понятную для компьютера. Если операция компиляции не будет успешной, появится окно с уведомлением об ошибке. Данный уровень проверки намного строже, чем обычная проверка синтаксиса в каждой строке кода —- на этом этапе проверяется правильность ссылок и тип переменных. Каждый оператор проверяется на кор-
ректность параметров. Все текстовые строки проверяются на правильность сим- волов-разделителей, например, ’text string*. Несмотря на то, что база данных имеет стандартное название Windows (например, CheckWriter Access), существует еще одно название проекта, используемое во внутрен- них операциях Microsoft Access, что можно увидеть при компиляции базы данных. При первом создании файла базы данных имя проекта и имя файла Windows совпадают. Имя проекта не изменяется при изменении имени файла Windows. Изменить внутреннее название проекта можно, выбрав команду Т(хЯ8^имя_лроекта Properties, где имя проекта—текущее внутреннее имя проекта. При компиляции приложения Access проверяет абсолютно все нескомпили- рованные процедуры и преобразует каждую из них, чтобы можно было запускать программу. Если Access находит какие-либо ошибки, то останавливается и выда- ет сообщение об ошибке. Ошибку необходимо исправить, после чего следует за- пустить компиляцию еще раз. Компиляция базы данных— не просто проверка синтаксических ошибок. Этот процесс обеспечивает корректность объектных ссылок. Компилятор может только проверить правильность использования языка программирования, опре- делив операторы Visual Basic и правильную очередность всех их параметров. После компиляции программы необходимо сжать базу данных. При каждом изме- нении, которое вносится в программу, сохраняются и изменение, и первоначаль- ная версия. При компиляции программы ее размер может вдвое увеличиться, по- скольку сохраняются скомпилированная и нескомпилированная версии програм- мы. Сжатие базы данных может уменьшить ее размер на 80%, поскольку удаляются все предыдущие версии.
1Л Microsoft Vrsuul ft. rsi kWrilorDrtld [Пр*чл*р^о&анный •« i- । >лпкЛ . '« )'Гл|Х | Рис. 3.3. Компиляция кода Visual Basic в базе данных Обработка ошибок в процессе выполнения программы Если в программе создается строка кода, которая ссылается на определенную форму, то эта форма должна быть уже открыта. Ее открывает предыдущая строка ко- да в другой процедуре. Если форма еще не открыта, в момент выполнения программы происходит ошибка. Такую проблему нельзя выявить в процессе компиляции, по- скольку компилятор оценивает каждую процедуру по отдельности. Он не пытается искать логику между несколькими процедурами или модулями, а код для открытия формы может быть выполнен из ряда различных событий. Но если форма не была от- крыта, при выполнении программы будет получено сообщение об ошибке. Получив сообщение об ошибке, необходимо на него среагировать. Однако од- ни ошибки сложнее понять, чем другие, а некоторые ошибки должны быть вы- явлены немедленно. Например, на рис. 3.4 показана простая программа, которая объявляет и создает переменную текстовой строки и числовую переменную, а за- тем пытается присвоить числовой переменной значение текстовой строки. Воз- можно, вам уже известно, что в числовое поле нельзя помещать текст. Сообщение об ошибке на рис. 3.4 содержит следующий текст: Run-time error ' 13 ' : Type mismatch. Это означает, что произошла ошибка в ходе выполнения программы, ее номер 13. Она заключается в несоответствии типов. Если вы не знае- те, в чем проблема, то может ли помочь это сообщение? Как, не имея опыта, испра- вить такую ошибку? И как, вообще, можно ли определить, в чем она состоит? В диалоговом окне ошибки (рис. 3.4) находится кнопка Debug (Отладка). При щелчке на этой кнопке программа останавливается и переходит к оператору, ко- торый вызвал ошибку. Программа будет приостановлена в режиме неопределен- ности. Все значения временных переменных остаются без изменений, их можно просмотреть, чтобы разрешить ошибку. При щелчке на кнопке End программа останавливается, в этом случае использовать какие-либо инструменты для ис- правления ошибок не допускается.
Public Sub CreateError(> Dim soaetext As String, somenwnber Ал Integer sometext - "Этот пример работать не будет" aoznen inter * some text End Sub I Puc. 3.4. Сообщение об ошибке, выявленной в процессе выполнения программы На рис. 3.5 показан оператор, который привел к ошибке, содержащая его строка выделена желтым фоном. Для обнаружения проблемы используется ряд инструментов, которые рассмотрены ниже. Поместив курсор над какой-либо переменной в выделенной области, можно увидеть ее текущее значение. На рис. 3 5 слева от выделенной строки распола- гается стрелка, которая указывает, что именно эта строка выполнялась в мо- мент остановки программы. Кроме того, отображается подсказка с текстом sometext = "Этот пример работать не будет", текущим значением тек- стовой переменной. Вы вправе поместить курсор на текущую переменную и определить значения, однако может понадобиться просмотреть также значения других1 переменных. В некоторых случаях (что зависит от структуры программы) это можно сделать, но обычно такая возможность распространяется только на последние созданные । значения. Переменные — это определенные пользователем значения, которые хранятся в памяти. Подробнее см. урок б. Использование окон Immediate, Locals и Watches Осталось 10 минут Существуют и другие инструменты, которые могут помочь в отладке программы. Это окна Immediate, Locals (Окно локальных значений) и Watches (Окно кон- трольного значения). Вы можете отобразить одно из них или все окна как часть окна редактора Visual Basic, выбрав команду View1^ Immediate Window, View1^ Locals Window или View1^Watch Window. Какое из них использовать, зависит от того, насколько серьезна проблема и насколько тяжело выявить ошибку.
Рис. 3.5. Отображение значения текущей переменной Окно Immediate — область, где можно выполнять процедуры, проверять зна- чения переменных, выражений, а также запускать отдельную строку кода Visual Basic. Выполнить подпроцедуру Visual Basic можно, используя синтаксис Call имя_процедуры, где имя_процедуры—необходимая подпроцедура или функция. Кроме того, функция будет выполнена, если поставить перед операто- ром вызова знак вопроса (?) и добавить переменную для значения, которое воз- вращает функция: ? х = имя_функции. Вы можете проверить значение любой текущей переменной из программы, поставив вопросительный знак (?) перед на- званием переменной. На рис. 3.6 показаны значения текущих переменных программы. В окне Immediate вы увидите введенное выражение ? s от etext и отображаемый текст "Этот пример работать не будет". Еще один способ выполнить программу— отобразить процедуру или функцию в окне Visual Basic, поставить курсор на первую строку, а затем нажать <F5>, что- бы выполнить всю процедуру или функцию. Если вы нажмете <F8>, то процедура или функция будет выполнена в построчном режиме. Окно Locals используется для отображения всех активных элементов памяти в текущей программе. Эти элементы включают формы, модули и переменные. На рис. 3.6 изображено окно Locals. Поскольку работает только простой модуль, то вы увидите только ссылку на этот объект. Если бы была запущена еще и фор- ма, в окне Locals отображалась бы ссылка на объект формы и диаграмма дерева, в котором показан каждый элемент управления в форме и значение каждого эле- мента управления для текущей записи. Данная функция очень важна при отлад- ке модуля для формы или отчета. Как правило, необходимо начинать работу с отладки модулей, а затем при необходимости переходить к окну Immediate. Чтобы просмотреть другие пе- ременные, можно использовать окно Locals. Кроме того, существует более сложное окно Watches. Подробно мы эту функцию рассматривать в данной книге не будем, однако следует отметить, что окно Watches позволяет задать конкретные выражения, значение которых отображается в этом окне; про-
грамма останавливается, когда выражение достигает указанного значения. Например, если значение должно увеличиваться с шагом 1 до достижения значения 500, но этого не происходит, то тогда можно поставить контроль- ное выражение (watchpoint) и проверить, достигает ли требуемое выражение значения 100. Таким образом программу проверяют в ходе ее выполнения. Если контрольное выражение достигает 100, программа останавливается и выделяется строка кода, на которой находилась программа в момент, когда значение стало равным 100. Введите вопрос г х »h.urtl В ’si кД' iHHt м J ICraeteError |{Огега1} End Sul Public Sub CreateError() Dim aonetext Ал String, somenuraber Аз Integer some text * "Этот пример работать не будет* iinm-dwte Преобразованный макрос* Ьаа_0реп8ап*А( Sfcittg. • Щ Преобразованный макрос- Ьг« ОрепВап VNietext ’Этот пример работать не буд ет* зотегммпЬог О ? somenumber 0 ? дотеtext Этот пример работать не будет И Рис. 3,3. Использование окон Immediate, Locals и Watches Создание точки останова Существует еще один инструмент отладки, который используется профессио- нальными разработчиками — точки останова. Если в окне Watches можно про- сматривать значения конкретных выражений, то точки останова (breakpoints) предназначены для просмотра конкретной строки, которая должна быть выпол- нена. После этого работа программы приостанавливается. Профессиональные разработчики часто называют запуск программы выпол- нением (executing). Программу запускают, чтобы ее выполнить (оба термина правильны). Точка останова часто используется для остановки выполнения программы, а также проверки всех переменных и условий объектов перед тем, как проис- ходит ошибка.
Чтобы поставить точку останова, отобразите программу в окне редактирова- ния, и нажмите клавишу <F9>. Можно также выбрать команду Debug^Toggle Breakpoint. На рис. 3.7 показана точка останова на строке, где в рассмотренной выше простой программе задается значение переменной sometext. После уста- новки точки останова можно закрыть модуль. Программа будет помнить эту точ- ку до того момента, пока открыт файл базы данных. При запуске программы и выполнении модуля программа остановится на данной строке и отобразит со- стояние прерывания. Public Sub CreateError() Dim sometext As String, somenuraber As Integer somenumber = sometext End Sub Puc. 3.7. Установка точки останова После выполнения и остановки программы можно использовать параметры меню Debug, чтобы иметь возможность управления дальнейшим выполнением программы. Меню Debug описано в следующем разделе. Вы можете поставить любое число точек останова, но несколько точек останова могут вызвать путаницу, если только вы не пытаетесь таким образом установить, выполняется ли вообще данный фрагмент программы. Использование меню Debug На рис. 3.8 показано меню Debug. Когда в программе установлена точка остано- ва, выполнение программы останавливается в месте, где она расположена. Рядом со строкой отображается жирный красный кружок и желтая стрелка. Красный кружок обозначает точку останова, а стрелка — текущую строку программы. Меню Debug состоит из пяти разделов. Первый позволяет скомпилировать приложение. Как правило, к этим командам во время выполнения программы прибегать не требуется. Второй раздел предоставляет возможность использовать четыре метода для про- должения выполнения программы (по одному или несколько операторов за раз). Step Into Step Over Выполнить следующую строку кода Выполнить следующую строку кода и весь код во всех вызывае- мых процедурах
Step Out Выполнить всю текущую процедуру, после чего остановиться на следующей строке исходной процедуры, из которой была вызвана текущая Run to Cursor Перенести курсор на определенную строку и выполнить все опера- торы между текущей строкой и строкой, где был поставлен курсор в режиме останова Рис. 3.8, Использование меню Debug Третий раздел позволяет добавлять или редактировать контрольные выраже- ния в окне Watches. Кроме того, можно выполнить быстрый просмотр выраже- ния, чтобы увидеть значение переменной (как и при использовании выражения ? название_переменной в окне! mme diate). Четвертый раздел позволяет включить/отключить точку останова или уда- лить все точки останова. Когда файл базы данных закрывается, все поставленные точки останова автоматически снимаются. Команды меню, находящиеся в пятом (последнем) разделе, являются, веро- ятно, самыми мощными. Команда Set Next Statement позволяет перенести курсор на любую строку кодаи запустить программу, начиная с этой строки. Если необ- ходимо исправить ошибку в программе, однако вам никак не удается это сделать, важно иметь возможность вернуться назад. Команда Show Next Statement просто выделяет следующий оператор, не выполняя его. В меню Run также находятся команды, которые могут быть полезны при от- ладке программы. Continue Продолжает выполнять программу без остановки до следующей ошиб- ки, точки останова или до завершения программы Break Останавливает программу на том месте, где она находится в данный момент. Можно также использовать <Ctrl + Break>, чтобы остановить работу программы и прервать ее вручную. Если вы случайно создали бесконечный цикл, команда остановит программу Reset Останавливает процесс с ошибкой и позволяет перезапустить програм- му с любой строки кода
Когда при отладке работающей программы вы исправляете ошибку, не забудьте щелкнуть на пиктограмме Save (Сохранить), чтобы сохранить все изменения, ко- торые могут быть потеряны, если закрыть процедуру без сохранения. Использование многочисленных инструментов отладки позволяет выявить и оп- ределить проблемы в работе программы, а затем быстро их решить. Кроме того, чтобы понять, какая ошибка произошла в программе, можно использовать справочную сис- тему Visual Basic, однако эту задачу чаще всего придется решать именно вам. Готово! Обзор В этом уроке вы ознакомились с разными этапами дизайна и узнали о подходе, необходимом при проектировании системы. Речь шла также об инструментах от- ладки для перехвата и исправления ошибок в программе. В этом уроке были рас- смотрены следующие вопросы. • Дизайн (проектирование) — постоянный процесс, который состоит из мно- гих повторяющихся фаз. • Разработка объединяет несколько процессов: концептуальный, или общий, дизайн, подробный дизайн, программирование, тестирование и отладку. • Для создания прототипов систем на определенном этапе дизайна можно использовать Microsoft Access, а можно записывать проекты на бумаге. • Отладкой называют процесс обнаружения проблем и исправления ошибок в работе системы. • Синтаксис — это компьютерная грамматика. Операторы в программах Ac- cess, как и обычные фразы, подчиняются правилам грамматики. • При компиляции все операторы программы проверяются на правильность синтаксиса. Код преобразуется в форму, которую Access может быстро и эффективно выполнить. • При отображении сообщения об ошибке в ходе выполнения программы можно использовать кнопку Debug для просмотра строки, вызвавшей ошибку. • Окна Immediate, Locals и Watches позволяют отобразить значения пере- менных программы. • Меню Debug содержит команды, используемые при построчном выполне- нии программы с целью поиска и исправления ошибок. Проверьте себя 1. Определите термин общий дизайн. (См. раздел ’’Проектирование системы".) 2. Каковы особенности метода концентрических кругов в разработке приложе- ний? (См. раздел "Подробный дизайн”.) 3. Определите понятие синтаксиса. (См. раздел "Проверка синтаксиса — пер- вый шаг”.) 4. Назовите две причины, по которым необходима компиляция программ. (См. раздел "Компиляция процедур”.) 5. Предположим, что в процессе выполнения программы произошла ошибка. Как можно просмотреть строку, которая ее вызвала? (См. раздел "Обработка ошибок в процессе выполнения программы”.)
6. Какие существуют способы просмотра значений переменных в процессе вы- полнения программы? (См. раздел "Использование окон Immediate, Locals и Watches”.) 7. Как можно остановить программу в определенном месте, чтобы выполнять программу далее построчно? (См. раздел "Создание точки останова”.)

УРОК ( События — место, откуда запускаются программы Содержание урока * Понятие событий * Реакция на события ✓ Создание процедур событий * Использование процедур событий для проверки корректности данных ✓ Понимание последовательности событий Осталось 30 минут Формы и отчеты — это объекты, с которыми больше всего работают пользователи приложения. Текстовые поля, метки и командные кнопки в формах и отчетах обеспечивают визуальные компоненты, с помощью которых пользователь рабо- тает с приложением. Разработка форм и отчетов действительно играет важную роль в разработке всего приложения. Однако вам придется еще многое обдумать и спланировать (а также немного запрограммировать), чтобы связать вместе все формы и отчеты незаметно для пользователя. Понятие событий Событие — это процесс, который происходит всякий раз, когда пользователь выполняет какое-либо действие в форме или отчете. Microsoft Access называют средой, ориентированной на события (event-driven environment), поскольку она может реагировать на события — щелчок на командной кнопке, открытие формы или отчета, обновление данных в поле. В среде, ориентированной на события, пользователь имеет возможность контролировать работу приложения. Он может в любом порядке обновлять поля на форме, например, щелкать на любой кнопке из набора. События обеспечивают способ реакции на происходящие в приложе-
нии действия. Событие может произойти, когда пользователь выполняет какое- либо действие, например, щелкает на кнопке. Событие также происходит в ответ на действие, которое пользователь выполняет косвенно (например, событие - таймер, запускаемое при открытии формы). Каждый элемент управления, размещенный в форме, обладает набором свойств событий. Проверить свойства событий, доступные для формы, отчета или элемента управления, можно, просмотрев лист Свойства (Property) этого объекта. На рис. 4.1 показан список событий на листе свойств для командной кнопки cmdBankAccounts. Рис. 4.1. Свойствасобытийдлякоманднойкнопкист(1ВапкАссоип18 Реакция на события События свойств обеспечивают способ реакции на любое действие, которое может выполнить пользователь в форме, отчете или с элементом управления. Вы реагируете на события, присоединяя к свойству события соответствующий макрос или процеду- ру. Макрос или процедура события содержат инструкции, которые Access должен бу- дет выполнять каждый раз, когда происходит соответствующее событие. Командная кнопка cmdBankAccounts имеет процедуру события, соответст- вующую ее свойству события Нажатие кнопки (OnClick). Событие Нажатие кнопки происходит, когда пользователь выбирает командную кнопку, щелкая на ней мышью или переходя на командную кнопку и нажимая клавишу <Enter>. При каждом событии Нажатие кнопки для командной кнопки cmdBankAc- counts автоматически запускается процедура события. Подробнее о присвоении макроса командной кнопке см. урок 2.
Процедура события представляет собой написанную в Visual Basic программу, которую присваивают событию. На рис. 4.2 показана процедура события Нажатие кнопки'для кнопки cmdBankAccounts. Процедура cmdBankAccounts_Click от- крывает форму frm BankAccounts. Рис, 4,2, Процедура события нажа тие кнопки для командной кнопки cmdBankAccounts Созданиепроцедур событий Процедуру события можно присвоить отдельному элементу управления или целой форме или отчету. Чтобы создать процедуру события, выполните следую- щие действия. 1. Откройте форму или отчет в представлении Конструктор (Design). 2. Выберите элемент управления в окне проекта и отобразите лист свойств. Чтобы отобразить лист свойств для формы или отчета, выберите квадрат в верх- ней левой части окна проекта. 3. На листе свойств щелкните на свойстве события, реакцию на которое следует установить. Например, для командной кнопки выберите свойство события Нажатие кнопки (Cn Click). 4. Для этого свойства события выберите Процедура обработки события (Event Procedure). Откроется редактор Visual Basic, в котором автоматически будут отображены первая и последняя строки новой процедуры события. Существует еще два способа создать процедуру события: щелкните правой кноп- кой мыши и выберите в меню команду Построить (Build Event); или щелкните на кнопке Построить (Build) рядом со свойством события. Если свойство события имеет процедуру события, рядом со свойством отобража- ется текст [Процедура обработки события] (Event Procedure). При создании новой процедуры события Access автоматически вставляет пер- вый и последний операторы процедуры. Эта встроенная функция создает шаб- лон, с помощью которого можно легко и быстро писать процедуры.
осталось Первый оператор процедуры содержит информацию о ее типе и поведении. Ключевое слово Private указывает, что только эта форма или отчет могут вы- полнить данную процедуру. Ключевое слово Sub описывает тип процедуры со- бытия — подпроцедура. Третий элемент оператора процедуры — ее имя. Ключевое слово Public делает процедуру доступной для любой формы или от- чета в приложении. Подробнее о различиях подпроцедур и функций см. урок 1. Access автоматически присваивает имя процедуре события, которое соответ- ствует свойству события. Это название соответствует следующему правилу: за именем объекта располагается символ подчеркивания и название события объ- екта. Например, название процедуры события Нажатие кнопки командной кнопки cmdBankAcounts — cmdBankAccounts_Click. Когда вы присваиваете имя объекту, Access преобразует пробелы в названии эле- мента управления в символы подчеркивания. Никогда не меняйте имя процедуры события. Это название обеспечивает связь между элементом управления, событием элемента управления и кодом процедуры события. Аналогично, никогда не меняйте название элемента управления, для ко- торого уже созданы процедуры событий. Последний оператор процедуры — End Sub, он указывает на завершение процедуры. Выполнение функции в ответ на событие Процедуры события — рекомендуемый способ выполнения кода Visual Basic вответ на событие. Однако можно также задать функцию, соответствующую оп- ределенному событию. На рис. 4.3 показана функция, соответствующая тексто- вому полю txtBankAccountNumber в форме frm_BankAc count sUnbound. В форме frm_BankAccountsUnbound при каждом обновлении поля txtBankAccountNumber выполняется функция dbc_ SetEditedFlag. Функ- ция dbc SetEditedFlag показана на рис. 4.4. Функция dbc SetEditedFlag изменяет значение поля FlagEdited в форме на True. Обратите внимание, что функция dbc SetEditedFlag объ- явлена как Public. Это означает, что она может быть выполнена любым со- бытием формы.‘Данная функция хранится в модуле Unbound Form Utilities. Сохраняя функцию в модуле, можно использовать ее сразу для нескольких несвязанных форм приложения. Подробнее о модулях см. урок 7.
г Рис. 4.3. Присваивание функции, соответствующей событию л 'М • ‘ Г* Kisucil t i J k^r il< rl ib’.rv [ni< d Unbound Minf IhliUP’. (' -jd»-)] ~ ||X| Dim frm As Form on Error GoTo ErrcrHandler Set f rm - Application.Screen.ActiveForm f rm. FlagEdited * True GOTO Done ErrorHandler: MsgBox Err.Description Done: I Puc, 4.4. Функция Public может быть вызвана любым событием формы Чтобы присвоить событию функцию, выполните следующие действия. 1. На листе свойств щелкните на свойстве события, реакцию на которое следует установить с помощью функции. 2. Введите знак равенства (=), за ним — название функции и пару скобок. Вводя имя функции сразу же в свойство события, вы экономите время, по- скольку не требуется отдельная процедура события для каждого элемента управ-
ления и события, которое должно ее запускать. Однако можно также вызвать функцию из процедуры события, как показано ниже. Private Sub BankAccountNumber_AfterUpdate() Dim x As Integer x = dbc_SetEditedFlag() End Sub Чтобы вызвать процедуру с использованием метода процедуры события, не- обходимо создать процедуру события и написать тот же код для каждого поля в несвязанной форме. Применение процедур событий для проверки корректности данных В большинстве случаев свойство Условие на значение (Validation Rule) для конкретного поля используется с целью удостовериться, что значение поля при- емлемо. Однако с помощью процедуры события вы получаете намного больше возможностей для проверки ввода данных. Процедуру события для проверки данных необходимо использовать в следующих ситуациях. • Когда требуется проверить, что было заполнено несколько полей. Напри- мер, пользователь должен ввести имя и номер социальной страховки. • Когда необходимо отобразить отдельные сообщения об ошибке для опреде- ленных типов некорректных значений. Например, следует отобразить од- но сообщение, если введенное значение меньше определенной величины, и другое, если введенное значение превышает другую заданную величину. • Когда нужно позволить ввести потенциально некорректное значение и просто отобразить предупреждение. • Когда необходимо сверить данные с другими полями на других формах. На рис. 4.5 показана процедура события для проверки поля txt Check Date в форме frm_CheckForm. Событие txtCheckDate_BeforeUpdate сравнивает введенные данные с дву- мя возможными сценариями. Если значение поля txtCheckDate не соответству- ет ни одному из сценариев, появляется сообщение. Чтобы продолжить работу, пользователь должен ввести другое значение даты чека (Check Date). В первом сценарии процедура события выполняет проверку на попадание значения даты txtCheckDate в прошедшие 30 дней. Чтобы проверить это усло- вие, процедура осуществляет следующие действия. 1. Вычисляет переменную CutoffDate: от текущей даты отнимается 30 дней. Ключевое слово Date задает в программе текущую дату. 2. Сравнивает дату CheckDate с датой Cutoff Date. Если CheckDate раньше, чем CutoffDate, то отображается окно сообщения. 3. Если дата CheckDate раньше, чем CutoffDate, значение Cancel устанавли- вается равным True.
Обратите внимание, что событие BeforeUpdate получает переменную Cancel как параметр. Если процедура события включает в качестве параметра Cancel, значит, то можно отменить текущее событие. I Min visual Basic Che< kWntpri ibrary [nwd^UnhoundborniUtihtiPs (Cod*)] I (General) Private Sub txtCheckDate_BeforeUpdate(Cancel Аз Integer) On Error GoTo txtCheckDate_BeforeUpdate_Err Dim Cutoff Date As Date Нньгзгг* » । |trtCbes k D»1e_BefofeUpdate 1 Ln*»!. Cd 1 CutOffDate - Date - 3 0 If Me!txtCheckDate < CutOffDate Then MsgBox "The check date must be within the past 30 days.", vbCritical, "Check Date Cancel - True Else If Me ’txtCheckDate > Date Then MsgBox "You can not enter ’a future check date.", vbCritical, "Check Date Erro Cancel * True End If End If Exit Sub txtCheckDate_BeforeUpdate_Exr: MsgBox "Error is * £ Err.Description & * entering Check Date in Check Writer form. Exit Sub End Sub Puc. 4.5. Отображение отдельных сообщений об ошибке для разных типов некор- ректных значений Часть Else в процедуре txtCheckDate_BeforeUpdate проверяет второй сце- нарий. Он заключается в том, что введенная дата чека txtCheckDate является будущей датой. Если значение txtCheckDate больше, чем текущая дата, ото- бражается другое сообщение об ошибке, а событие отменяется. Порядок событий Итак, формы, отчеты и элементы управления обладают многими свойствами со- бытий* Кроме того, события могут срабатывать в ответ на действия пользователя. Поэтому следует отметить такой факт: одно действие пользователя может запус- кать сразу несколько событий, которые обрабатываются в установленной после- довательности. Понимание их последовательности очень важно для создания правильных процедур событий. Например, когда пользователь щелкает на поле, сначала происходит событие Нажатие клавиши (Enter), затем событие Получение фокуса (GotFocus). Если вы пишете процедуры для обоих событий, то должны знать, какое из них проис- ходит первым. События при обновлении данных в элементах управления Когда пользователь обновляет данные в элементе управления и переходит на другой элемент управления, события выполняются в следующем порядке.
До обноьления^После обновления^Выход^Потеря фокуса (BeforeUpdate^Af terUpdate^Exit^Lost Focus) Если событие До обновления отменяется либо через свойство Условие на значения, либо через процедуру события, дальнейшие события не происходят. Если после обновления данных в элементе управления пользователь перехо- дит на следующую запись, происходят также события До обновления и Eto еле обновления для формы. * События при удалении записей Порядок событий для удаления записей следующий. У деление^ До подтверждения ОеХ^После подтверждения Del (Delete^BeforeDelConfirm^AfterDelConf irm) Если пользователь пытается удалить запись, Access автоматически отобража- ет сообщение с запросом о подтверждении. Если пользователь отменяет опера- цию удаления, никакие события не происходят. События при открытии формы Когда открывается форма, выполняются следующие события. Открытие^Загрузка^Изменение размера^Включение1^ После отображения (Open^Load^Resize^Activate^Current) Событие После отображения происходит также в том случае, когда пользо- ватель переходит на другую запись или на новую запись. События при создании новой записи При создании пользователем новой записи происходят такие события. После отображения1^ До вставки^После вставки (Current^Bef ©reinsertsAfter Insert) События при закрытии формы Когда форма закрывается, выполняется следующая последовательность со- бытий. Выгрузка ^Отключение ^Закрытие (Unload^Deact ivat enclose) Работа в среде, ориентированной на события, может сначала показаться запу- танной. Тем не менее, после ознакомления с событиями и способами их обработ- ки вы обнаружите ряд преимуществ их использования, которые позволят сде- лать работу приложения максимально удобной и эффективной. Обзор О В этом уроке вы изучили, как с помощью событий пользователь может управлять процессами, которые выполняются в приложении. Ориентированная на события среда Access обеспечивает возможность создавать процедуры событий, выпол- Гощоео! „ „ няющие определенные инструкции в ответ на действия пользователя. В данном уроке рассматривались следующие вопросы.
Формы, отчеты и элементы управления обладают многими свойствами со- бытий. Свойство события может содержать макрос, функцию или процедуру со- бытия. Свойства событий происходят в установленном порядке. Процедуры событий могут принимать или отклонять обновления элемента управления или формы. Проверьте себя 1. Как узнать, какие события доступны для элемента управления на форме или отчете? (См. раздел "Понятие событий ”.) 2. Какое событие происходит, когда пользователь выбирает командную кнопку? (См. раздел "Реакция на события ”.) 3. Назовите три компонента первой строки процедуры. (См. раздел "Создание процедур событий ”.) 4. Когда для проверки данных, введенных пользователем, требуется использо- вать процедуру события, а не свойство Условие на значение? (См. раздел "Применение процедур событий для проверки корректности данных 5. Какое событие происходит первым при обновлении данных в элементе управ- ления: Потеря фокуса или После обновления? (См. раздел "События при обновлении данных в элементах управления
ЧАСТЬ Пятница. Вечер. Обзор 1. Определите термин система управл ения базами данных. 2. Является Visual Basic отдельным окном или это составная часть MicrosoftAc- cess 2003? 3. Назовите два типа процедур и их отличия. 4. Что такое VBA, Jet и MSDE? 5. Верно ли утверждение о том, что макрос необходимо использовать для обра- ботки ошибок приложения? 6. В какой из следующих ситуаций лучше использовать макрос: а. Создание функций. б. Вызов стандартных диалоговых окон Windows. в. Интеграция с Word или Excel. г. Открытие формы с использованием командной кнопки. 7. Какая встроенная функция Visual Basic автоматически отображает список команд, когда вы начинаете вводить команду в окне кода? 8. Вы знаете, что приложение скомпилировано, когда: а. Отображается окно с сообщением "Compile Complete". б. Команда меню Debug ^Compile не доступна. в. Код в окне программы становится зеленым. г. Звучит звуковой сигнал. 9. Назовите пять основных этапов разработки. 10. Почему важна компиляция и что необходимо сделать, чтобы скомпилировать программу? 11. Как называются окна, которые помогают отладить программу? 12. Чем отличаются контрольные выражения и точки прерывания? 13. Где перечислены все события, доступные для формы? 14. Верно ли утверждение о том, что процедура события представляет специаль- ную разновидность макросов? 15. Первый оператор процедуры события для процедуры события Нажатие кнопки командной кнопки cmd BankAccounts выглядит так: a. Private Sub cmd_BankAccounts_Click ()
6. On Error GoTo cmd_BankAccounts_Err в * Funct i on cmd_BankAccount s_Cli ck() r. Dim strName as String 16. В каком из следующих случаев для проверки корректности введенных дан- ных необходимо использовать процедуру события? а. Сумма чека должна быть больше нуля. б. Необходимо ввести дату чека. в. Сумма чека должна быть меньше $ 500 и больше нуля. г. Дата чека не может быть будущей датой. 17. Какой оператор обеспечивает возможность объявить переменную? 18. Когда следует использовать оператор Option Explicit в начале каждой процедуры? 19. Какие ключевые слова используются для того, чтобы сделать переменную доступной во всей программе или же только в одной ее процедуре? 20. Какие из перечисленных ниже типов являются корректными типами пере- менных Visual Basic? a. Integer б. Text в. Number b. Long


Часть П. Суббота. Утро Объявление переменных, их особенности и правила именования . Урок 6. Логические конструкции: циклы, решения, выбор и быстрый выход Урок?. Процедуры, модули и классы модулей Уро ;8. Архитектура Access Урок 9. Работав даннымив программе УрОК 10. Добавление, обновление и удаление записей с использованием ADO j? 4acTb> Ш. Суббота. День siaqwAkSZ ' г - -?==== Л"*»*, >Лг 1 - - — ! — I- 1 — « ш * ' МаОф* еремещениепо приложению с использованием кнопочных форм, специальных меню событий клавиатуры Урок 12. Использованиенесвязанныхформ Урок 13/ -Программирование элементов управления: флажок, группа переключателей, список, -.--.комбинированный список % Урок 14«~ Программирование субформ и ленточных форм Урок 15. Программирование элементов управления свкладками = =йУрОК£ 16. Окна сообщений и приемы обработки ошибок в программе. Часть 1У.Су6бота. Bedep ИмпоргЙТэкспортданных Урок 18. Приемы, которые могут ускорить работу приложения Уоок 19 ^^^^та^нгзаставок с анимацией, информационные и стартовые окна приложения Урок 20=
Рис. 5.1. Использование оператора Option Explicit в разделе объявлений программного модуля Вы можете перейти в раздел объявлений Declarations модуля, когда создаете проце- дуру события в форме, выбрав в поле со "списком Procedure элемент Declarations. Еще один способ перейти в раздел Declarations — выбрать в поле со списком Object элемент (General). Эти поля со списками приведены на рис. 5.1. Использование оператора Dim и Для объявления переменной чаще всего используется оператор Dim. Применяя т оператор Dim, необходимо задать название, которое присваивается переменной. К Оператор Dim использует следующий синтаксис. с И Dim имя_переменной [As тип] Wb- На рис. 5.2 представлен оператор Dim для простой процедуры Vari able Те st. VПТЛ ТЛТТТТТТ/Л ТТП 1АТТМТ ГГТТЛП ТТ1А /ЛТТГЛ ТТТ /ЛГГ/Л ГЛ’ЧТТ'ГЛ /ЛТЛТТ/Л /Л^ЛТТТ/ЛТТТТГТ ТТ/ЛГГ Z4 ТЛТТ и г А л гл I
Рис. 5.2. Оператор Dim в простой программе Иногда несколько переменных лучше объявить в одной строке, но оператор объ- явления легче читается, если каждую переменную объявляют в отдельной строке. Обратите внимание, что название переменной следует за оператором Dim. Кроме определения названия переменной, необходимо использовать необязательную часть As для определения типа данных переменной. Тип данных — это тип ин- формации, которая хранится в переменной: String, Integer, Currency и т.д. Если оператор As не используется, переменная по умолчанию получает тип Variant. Тип данных Variant может хранить любой тип данных, но Access должен определять, какой тип данных содержится в переменной. При использо- вании типа данных Variant или в случае, когда переменные не объявляются, работа приложения замедляется. При создании переменных можно использовать символы верхнего, нижнего или обоих регистров, чтобы определить названия или последующий вызов перемен- ной. Переменные Visual Basic не чувствительны к регистру. Следовательно, можно использовать переменную Today Is снова и снова, не задумываясь о том, какой регистр использован при ее создании: TODAYIS, today is и tOdAyls ссыла- ются на одну и ту же переменную. Visual Basic автоматически изменяет все явно объявленные переменные на регистр, используемый в операторе объявления или в последней введенной ссылке (оператор Dim). 3 Создание переменных, доступных во всем приложении Применяя оператор Dim для объявления переменной в процедуре, можно обра- осталось гцаться к переменной только в рамках этой процедуры. Такие переменные назы- 20 минут вают переменными Private, или объявленными в процедуре. Их можно увидеть только в процедуре, где они были объявлены и где используются. Другие проце- дуры, даже если они хранятся в том же модуле, не знают об этой переменной. Кроме того, переменные могут быть объявлены в разделе Declarations про- граммного модуля, что открывает доступ всех процедур модуля к данной пере- менной. Однако процедуры вне модуля, в котором была объявлена переменная, не могут читать или использовать эту переменную.
Чтобы объявить переменную для использования процедурами в разных моду- лях, используется оператор Public. Оператор Public Вы можете сделать переменную доступной во всех модулях приложения. Для этого используйте при объявлении переменной ключевое слово Public. На рис. 5.3 показано применение ключевого слова Public для объявления перемен- ной. Следует отметить, что оператор объявления находится в разделе Declarations модуля. Переменные Publ i с всегда объявляют в разделе Declarations модуля. Рис. 5.3. Объявление переменной Public Несмотря на то, что объявить переменную Public можно в любом модуле, ло- гично объявлять переменные Public только в том модуле, в котором они будут использоваться чаще всего. Исключением из этого правила являются глобальные переменные, которые должны быть доступны во всех процедурах всех модулей, и которые не относятся конкретно к какому-то одному модулю. Переменные тако- го типа следует объявлять в отдельном стандартном модуле, где их можно будет легко найти. Глобальные переменные объявляют с использованием оператора Global ммя_ переменной в разделе Declarations модуля. При этом переменная становится дос- тупной для всего приложения. Ее значение можно задавать в любом месте про- граммы. Если в работе Access по какой-либо причине происходит ошибка, значение гло- бальной переменной будет утеряно. Нельзя объявлять переменные Public в процедуре. Переменные Public должны быть объявлены в разделе Declarations модуля. Если вы попытае- тесь объявить переменную как Public в процедуре, то получите сообщение об ошибке.
К переменной Public, объявленной в модуле отчета или формы либо в стан- дартном модуле, можно обращаться из другого модуля формы или отчета. Чтобы получить значение переменной Public из другого модуля, необходимо указать ссылку на переменную, используя название объекта формы или отчета. Например, Checkwriter. somevariable обращается к форме под названием Check- Writer и получает значение переменной somevariable. Оператор Private Раздел Declarations (см. рис. 5.2) является примером использования оператора Dim для объявления переменных. Вместо оператора Dim можно поставить Pri- vate. Технически они ничем не отличаются; тем не менее, для объявления дос- тупных во всех процедурах переменных в разделе объявлений модуля рекомен- дуется использовать ключевое слово Private. Объявление с помощью оператора Pr ivataiMeeT следующие особенности. • В отличие от Dim, который должен быть использован на уровне процеду- ры, оператор Private определяет место объявления переменной и сферу ее действия (модуль, а не процедура). В отличие от оператора Public, еще одного метода объявления переменных в модуле, оператор Private делает программу более легкой для понимания. При объявлении переменной используется оператор As, который помогает присвоить переменной тип данных. Типы данных для переменных подобны ти- пам данных в таблицах баз данных. Работа с типами данных Основная причина, по которой мы объявляем переменные, заключается в со- хранении внутренних ресурсов, а это, в свою очередь, способствует быстрой и эффективной работе программ. Если программе известен тип переменной, она сможет обрабатывать данные быстрее, поскольку количество вариантов обработ- ки данных ограничено, а возможности проверки каждого значения, присвоенно- го переменной, улучшаются. Если не объявить переменную или не указать тип данных (не включив параметр As), переменная автоматически получит тип Variant. Он также относится к типу данных и указывает на то, что переменная может содержать любой тип. Если оставить для переменной присвоенный по умолчанию тип Variant в том случае, когда можно было применить другой тип (например, целое число Integer), то на каждой используемой переменной будет потерян некоторый объем памяти (в примере с Integer — 14 байт памяти). Таким образом, при объявлении переменной можно указать ее тип данных. Все переменные имеют тип данных, который определяет, какая информация бу- дет храниться в переменной. Строковая, или текстовая, переменная (string variable) — это переменная ти- па данных String, которая может содержать любые значения в диапазоне A-Z, a-z, 0-9, а также включать символы форматирования (#, —, ! и т.д.). После соз- дания переменная может использоваться в различных целях: вы вправе сравни- вать ее содержимое с другой строкой, получать из строки фрагменты информа- ции и т.п. Однако если переменная определена как String, ее нельзя использо- вать в математических вычислениях. И наоборот, нельзя присвоить число переменной, объявленной как тип String. В табл. 5.1 описаны основные типы данных, поддерживаемые Visual Basic.
Таблица 5.1. Типы данных, используемые в Visual Basic Tun Диапазон значений Память Boolean True / False 2 байта Byte От 0 до 255 1 байтдвоичныхдан- ных Currency От -9223372036854775808 ДО9223372036854775807 8-байтовое число с фиксированной деся- - - тичной точкой Decimal +/-79228162514264337593543950335 без десятичной точки; +/-7.9228162514264337593543950335 с 28 знаками после десятичной точки; самое меньшее ненулевое число равно +/-0.0000000000000000000000000001 14 байт Date От 1 января 100 до 31 декабря 9999 8-байтовое значение даты/времени Double От -1.79769313486231Е308ДО -4.94065645841247Е-324 8-байтовое число с пла- вающей десятичной точкой Integer От -32768ДО32767 2-байтовое целое число Long От -2147483648 до 2147483647 4-байтовое целое число Object Любая объектная ссылка 4 байта Single Отрицательные значения: от -3 .402823Е38 до -1.401298Е-45; положительные значе- ния: от 1.401298Е-45ДО3.402823Е38 4-байтовое число с пла- вающей точкой String (переменной длины) От 0 до приблизительно 2000000000 10 байт плюс длина строки String (фиксированной длины) От 1 до приблизительно 65400 Длина строки Variant (числовой) Любое числовое значение в диапазоне Double 16 байт Variant (символьный) От 0 до приблизительно 2000000000 22 байта плюс длина строки Определенный Такой же диапазон, как у соответствующе- Объем, который требу- пользователем (с помощью Туре) го типа данных ется для соответст- вующего типа данных В большинстве случаев используются типы String, Date, Integer, Cur- rency и Double. Если переменная всегда содержит целые числа в диапазоне от - 32768 до 32767, можно сохранить объем памяти и ускорить арифметические операции, объявив переменную как тип Integer. Если вы присваиваете значение поля Access переменной в программе, необхо- димо проверить, что может ли данный тип переменной хранить тип данных поля. В табл. 5.2 представлены типы данных Visual Basic, которые соответствуют ти- пам полей Access. Если переменная может получать значение Null, ее необходимо объявить как тип. Это единственный тип данных, поддерживающий значения Null.
Таблица 5.2. Сравнение типов данных в таблицах Access и переменных Visual Basic Тип данных переменной Visual Basic Tun данных поля таблицы Access Счетчик (AutoNumber(Long Integer)) Long Счетчик (AutoNumber (Replication ID)) - Денежный (Currency) Currency Вычисляемый (Computed) — Дата/Время (Date/Time) Date Поле Memo (Memo) String ЧИСЛОВОЙ, Байт (Number (Byte)) Byte Числовой, Целое Number (Integer) Integer Числовой, длинное целое (Number (Long Integer)) Long Числовой, одинарное с плавающей точкой (Number (Single)) single Числовой, двойное с плавающей точкой (Number (Double)) Double Числовой, код репликации (Number (Replication ID)) Поле объекта OLE (OLE object) Массив значений Byte Текстовый (Text) String Логический (Yes/No) Boolean j Далее от вопроса переменных и их типов данных можно перейти к рассмотре- нию их применения при разработке процедур. Использование стандартных правил именования Очевидно, что в программе может использовать достаточно много перемен- ных. При этом довольно сложно запомнить, для чего все они применяются. То же касается объектов в базах данных Access, например, таблиц, форм и отчетов. По мере роста числа объектов и переменных, соответственно возрастает и слож- ность программ, их использующих. Частично данную проблему можно решить путем применения описательных названий объектов и переменных. Однако это только часть решения. Рекоменду- ется также использовать некоторые стандартно принятые правила именования, чтобы из названия переменной или объекта можно было сразу узнать тип дан- ных, который содержит эта переменная или объект. Для профессиональных разработчиков соблюдение стандартов позволяет об- легчить поддержку программ, написанных другими разработчиками. В проек- тах, в которых участвует несколько программистов, правила именования помо- гут понять предназначение и функции каждого объекта и переменной, его типа данных или другой важной информации, необходимой для правильной разра- ботки и эффективной отладки программ. Однако для опытного пользователя и даже для новичка соблюдение стандарт- ных принципов может заметно снизить скорость работы. Принципы именования разработаны с целью упростить чтение и поддержку программы и облегчить ра- боту в Visual Basic, однако иногда может возникнуть совершенно противополож- ный эффект.
Далее вы ознакомитесь со стандартными правилами именования, которыми пользуются многие разработчики, а также узнаете о некоторых альтернативах их использования ’ На рис. 5.4 отображено два контейнера базы данных Access. В контейнере ба- зы данных, изображенном сверху, применяются стандартные префиксы назва- ний. В контейнере базы данных снизу для объектов таблиц не используется ни- каких особенных правил. Какой из вариантов легче воспринимать? Рис. 5.4. Правила именования объектов. В контей- нере базы данных слева используются стандарт- ные префиксы Существует несколько стандартов именования, которые применяются в Microsoft Access. Первый — стандарт Лесински (Leszynski Naming Conventions, LNC), разра- ботанный Стэном Лесински (www.kwery.com), второй— стандарт Реддика (Reddick Naming Conventions), созданный Грегом Реддиком. Таблицы, представ- ленные далее в этой главе, включают краткий обзор этих стандартов. Чтобы озна- комиться с полным детальным списком стандартов именования, просмотрите файл ReddickNamingConventions.pdf на сопровождающем Web-узле этой кни- ги: www.wiley.сот/compbooks/prague. В обоих стандартах предложено использовать префиксы для различных типов элементов Microsoft Access объектов (таблиц, запросов, форм, отчетов, страниц
доступа к данным, макросов, модулей), полей таблиц, элементов управления на формах и отчетах, объектов наборов записей ADO и DAO, переменных. Стандарты именования объектов баз данных Microsoft Access В двух общепринятых стандартах именования Microsoft Access предложено использовать префиксы в названиях. Это означает, что стандартный префикс объекта ставится перед его обычным названием, например: tblCheckWriter. В файлах примеров этой книги применяются стандарты с подчеркиванием ме>кду префиксом и названием объекта. Префиксы не использовались для полей таблиц, названий элементов управления и переменных. Мы считаем, что примеры и так представляют значительный объем нового материала, даже без описания стандар- тов именования. Стандартные имена объектов Microsoft Access представлены в табл. 5.3. Таблица 5.3. Правила именования объектов a Префикс Объект Пример tbl Таблица (Table) tblBankAccounts qry Запрос (Query) qryCheckWriterDisplay f rm Форма (Form) frmCheckWrit er rpt Отчет (Report) rptCheckRegister mcr Макрос (Macro) mcrAutoexec mod Модуль (Module) modFileUtilities cis Модуль класса (Class Module) clsBankAccount /sub Субформа (Subform) f subCheckRegi sterDetai1s rsub Суботчет(Subreport) rsubCheckPrintContinuous Осталось 10 минут Стандарты именования полей таблиц Microsoft Access Правила именования также касаются полей в таблицах. На рис. 5.5 показана таблица Check Writer, измененная в соответствии с правилами использования префиксов в названиях полей. В табл. 5.4 систематизированы правила именова- ния полей. Таблица 5.4. Правила именования полей таблиц Префикс Объект idn Autonumber (Random) idr Autonumber (Replication ID) ids Autonumber (Sequential) bin Number (Binary) byt Number (Byte) cur Currency dtm Date/Time dbl Number (dbl) hlk Hyperlink
Префикс Объект int Number (Integer) Ingz Number (Long) mem Memo ole OLE Object sng chr Number (Single) Text (Character) bln Yes/No (Boolean) Та- 1Ица1 hr. 1ица Г Рис. 5.5. Правила именования полей таблиц Стандарты именования элементов управления в формах и отчетах Еще одна сфера, в которой приняты определенные стандарты именования, — это названия элементов управления в формах и отчетах. В табл. 5.5 приведен список этих правил. Таблица 5.5. Правила именования элементов управления в формах и отчетах Префикс Объект frb Основа связанного объекта cht Диаграмма, график ! chk Флажок
Окончание табл. 5.5 Префикс Объект сЬо Поле co списком cmd Командная кнопка OCX Элемент управления ActiveX det Детали, раздел gft [n] Нижний колонтитул (раздел группы) fft Раздел нижнего колонтитула в форме fhd Раздел верхнего колонтитула в форме ghd [n] Верхний колонтитул (раздел группы) hlk Гиперссылка fmg Рисунок 1Ы Метка lin Строка 1st Список opt Переключатель grp Группа переключателей Pge Страница (вкладка) brk Разрыв страницы pft Нижний колонтитул страницы (раздел) phd Верхний колонтитул страницы (раздел) shp Прямоугольник rft Нижний колонтитул отчета (раздел) rhd Верхний колонтитул отчета (раздел) sec Раздел sub Субформа/Суботчет tab Вкладка (элемент управления) txt Текстовое поле tgl Кнопка-выключатель fru Рамка несвязанного объекта Стандарты именования переменных Microsoft Access Visual Basic Еще одной крупной областью, в которой разработаны стандартные правила именования, являются переменные Visual Basic. Данные правила приведены в табл. 5.6. Таблица 5.6. Стандарты именования переменных данных Visual Basic Префикс Объект bln Boolean byt Byte ccc Условная константа компиляции (#ххх)
4. В каком случае лучше использовать определение переменной как Public вме- сто оператора Dim? (См. раздел "Создание переменных, доступных во всем приложении”.) 5. Перечислите известные вам типы данных переменных. (См. раздел "Работа с типами данных”.) 6. Необходимо ли использовать стандартные правила именования? (См. раздел "Действительно ли необходимы стандарты именования в Access?”.)
УРОК Логические конструкции: циклы, решения, выбор и быстрый выход из процедур Содержание урока * Основы логических конструкций * Обработка простых условий (if. . .Then. . .Else. . .End If) < / Обработка сложных условий (Select Case. . .Case. . .End Select) Создание циклов (Do. . . Loop) Конструкции "с памятью" (with. . .End With) Э Логические конструкции — это класс операторов Visual Basic, которые контроли- руют способ выполнения программы. Как правило, программы выполняют один оператор за другим в том порядке, в котором они заданы. Логические конструкции зо ткут используются для изменения порядка выполнения операторов в соответствии с требованиями приложения. Логические конструкции перечислены ниже. • Операторы условной обработки (принятие решений с одним условием) If...Then.. .Else.. .End If • Операторы условной обработки (принятие решений с несколькими условиями) Select Case . . .Case . . .End Select I • Циклы Do...Loop For...Next
Если используются логические конструкции, программа в зависимости от значения переменных выполняет или пропускает ряд операторов или выполняет группу операторов несколько раз. В этом уроке вы ознакомитесь с тремя типами логических конструкций и способами создания счетчиков и переменных, управ- ляющих поведением программы в этих конструкциях. В каждой из конструкций используется специальный синтаксис, который предусматривает открывающий оператор, операторы в теле конструкции и за- крывающий оператор, известный также как оператор End. Синтаксис несложно объяснить: например, условный оператор начинается с If и заканчивается End If. Оператор Select Case начинает конструкцию принятия решений из не- скольких условий, a End Select заканчивает ее. Циклы несколько отличаются от условных операторов. Оператор Do заканчи- вается словом Loop (цикл), а оператор For — словом Next. В данном уроке рас- смотрены все особенности логических конструкций и отличия между ними. Условная обработка Довольно мощной возможностью языка программирования является воз- можность принятия решений в программе на основании какого-либо условия. Часто программа Visual Basic выполняет различные задачи на основании опреде- ленного значения. Если условие имеет значение True, программа выполняет од- но действие. Если условие имеет значение False, программа выполняет другое действие. Процедуры вычисляются с целью проверить, какое значение они имеют: True или False. Например, рассмотрим следующую программу. If CheckAmount > 200 Then Call largedollarprocedure Else Call smalldollarprocedure End If В первой части данного выражения выполняется проверка следующего усло- вия: значение переменной CheckAmount должно быть больше 200. В таком слу- чае все выражение имеет значение True, и программа после слова Then выполня- ется до условия Else. Если значение выражения не равно True, выполняется строка кода в рамках условия Else. В данном примере условие False (фактически не True) происходит, если значение CheckAmount меньше или рав- но (<=) 200. Эта процедура напоминает дорогу с развилкой, делящей ее на два пути: нале- во и направо. Если указатель на развилке показывает, что налево — путь домой, а направо — на работу, можно принять решение, куда идти. Если вы решили ид- ти на работу, идите направо; если следует идти домой — налево. Условная обра- ботка кода работает подобным образом. Программа анализирует значение неко- торой переменной и принимает решение, какой фрагмент кода должен быть об- работан. При создании кода необходимо контролировать, какие действия выполняют- ся. Можно написать операторы, которые будут выполнены только в том случае, если необходимое условие истинно (True). Возможность приложения анализировать значение и в зависимости от этого принимать решение о выполнении того или иного фрагмента кода называют ус- ловной обработкой.
Оператор If...Then...Else...EndIf Конструкции If. . .Then. . .Else. . .End If позволяют проверять условие и в зависимости от его значения выполнять действие. Это бинарная оценка. Если используется оператор If. . .Then. . .Else, вы можете выбрать только из двух вариантов. После условий Then и Else часто следует еще один или несколько операторов. В принципе, операторов может и не быть вообще, но тогда советуем данные условия не использовать. Например, не нужно включать оператор Else в конструкцию If. . . Then. h Далее представлен общий синтаксис оператора If... Then. . . Else. И If тестов о е_~выражение Then Т операторы (тестовое~выражение истинно) к Else с операторы (тестовое выражение ложно) с End If В конструкции If. . .Then. . .Else не обязательно использовать оператор Else. Можно просто применить If Then. Тогда если условие верно, выполня- ются все операторы до End if; в противном случае, действия не производятся. Нарис. 6.1 показана концептуальная диаграмма условия If. . .Then.. .Else. IF Puc. 6.1. Концептуалънаядиаграмма оператора If...Then...Else Условие должно получать в результате вычислений значение True или Not True. Такая формулировка объясняется следующим: если определенное выра- жение не равно True, оно не обязательно равно False. Значение условия может быть не известно, если одно из значений пустое или равно Null. При использова- нии оператора If. . .Then. . .Else необходимо удостовериться, что контрольное условие имеет только два возможных варианта. Если условие равно True, программа переходит к следующему оператору в процедуре и выполняет каждый оператор между операторами Then и Else; ес- ли оператор Else отсутствует, то действия выполняются до оператора End If.
Если условие не равно True (или False), то программа пропускает оператор (или операторы), который следует за оператором Else, и продолжает выполнение до оператора End if. После того как был достигнут оператор End If, выполнение продолжается обычным образом до следующей логической конструкции. На рис. 6.2 показана под процедура события Нажатие кнопки (OnClick) для кнопки Print в форме frm_pialogBankPrint. Эта процедура используется для обработки выбранных пользователем параметров печати, которые определяют, какие части отчета выводятся на печать, а какие — нет. Обратите внимание на использование оператора If.. . Then.. .Else. л Miftps ftisudl I ' h».4.RW»iter [I <-»rrn 0m,ч.г-лнкР|int (Code)J ||[O^X Dim Report De st As Integer "Hide Che Report Print Dialog Me .Visible - False If Me! [Type of Output] - 1 Then ReportDest “ acPreview Else 1 Destination is printer ReportDest * acNormal End If Puc. 6.2. Простое условие If.. . Then.. .Else Оператор If проверяет значение элемента управления Type of Output на форме frm_DialogBankPrint. Если условие Me! [Type of Output] = 1 имеет значение True, то значение ReportDest устанавливается на acPreview (предварительный просмотр). Если выражение Me! [Type of Output] не рав- но 1, то выполняется условие Else, и значение ReportDest устанавливается равным acNormal (принятое по устройство печати). Помните, что использовать оператор Else не обязательно. Можно применить Else, чтобы проверить второе условие, когда оператор If равен False. Если опе- ратор If равен True, программа выполняет операторы между операторами If и Else. Когда оператор If равен False, программа пропускает весь фрагмент до оператора Else (он должен быть задан). Затем, если условие Else верно, про- грамма выполнят следующий оператор. Если условие Else неверно, программа переходит к оператору, следующему за End I f. Для проверки условий, которые должны иметь значение False, можно использо- вать оператор Not, как в следующем примере. Как правило, самое вероятное ус- ловие идет первым — так код легче читается. If Not CheckType = Process Checks Else 'Deposit1 Then
Осталось zu минут Process Deposit End I f Это выражение эквивалентно следующему условию. If CheckType О 'Deposit* Then . .. i Вложенные операторы If...Then...Else Оператор If.,.Then.. .Else можно поместить внутри другого оператора If-. . .Then. . .Else. Такие операторы называют вложенными. Пример вложен- ных операторов If. . . Then. . .Else показан во фрагменте кода в листинге 6.1. Листинг 6.1. Вложенный оператор If... Then.. .Else If ClassType = "Начальная школа" Then If Grade Between 1 and 3 Then 'Действия для 1-3 классов начальной школы Else 'Действия для других классов начальной школы End If Else ' Действия для средней и высшей школы End If Первый оператор If проверяет значение переменной ClassType, чтобы предос- тавить возможность проверить, соответствует ли оно уровню начальной школы. Если условие верно, выполняется следующий оператор — второй условный опера- тор If, который проверяет, попадает ли значение класса Grade в диапазон 1-3 классов; если второе условие истинно (Тше), то выполняются действия для перво- го, второго и третьего классов. Если значение ClassType равно "Начальная школа" и значение класса Grade не попадает в диапазон от1 доЗ, выполняются операторыпослесловаЕ1 se. Если значение переменной ClassType не равно " Начальная школа ", обработка переходит к соответствующему оператору Else, после чего выполняются действия для средней и высшей школы. Поскольку в данном примере это всего лишь ком- ментарии, их следует заменить или дополнить настоящими операторами. При создании вложенных конструкций лучше сначала вводить сами конст- рукции вместе с соответствующими им операторами End, а затем добавить ком- ментарии. Для этой цели предназначены операторы If или Else. Данный про- цесс называют созданием псевдопрограммы, или псевдокода. Вы имеете возмож- ность ввести необходимые команды после комментариев. Вложенные конструкции можно создавать для любых логических операторов. Предположим, необходимо проверить пять различных условий. Для этого можно написать ряд операторов If... Then. . . Else следующим образом. If Salary Between 0 And 20000 Then 'Действия для диапазона (0-20000) End I f If Salary Between 20001 And 40000 Then 'Действия для диапазона (20001-40000)
End If If Salary Between 40001 And 60000 Then 'Действия для диапазона (40001-60000) End If If Salary Between 60001 And 80000 Then ’Действия для диапазона (60001-80000) End If If Salary Not Between 0 And 80000 Then 'Действия для диапазона вне (0-80000) End If Однако такой код будет малоэффективным, поскольку проверяется каждое условие, даже если выполняется только одно. Советуем, хотя это и сложнее, на- писать программу следующим образом. If Salary Between 0 And 20000 Then ’Действия для диапазона (0-20000) Else If Salary Between 20001 And 40000 Then 'Действия для диапазона (20001-40000) Else If Salary Between 40001 And 60000 Then ’Действия для диапазона (40001-60000) Else If Salary Between 60001 And 80000 Then 'Действия для диапазона (60001-80000) Else 'Действия для диапазона вне (0-80000) End If End If End If End If к Однако такую программу тяжело писать и поддерживать. Несмотря на то, что обработка останавливается в момент нахождения одного верного условия, вло- женные операторы I f могут быть довольно сложными. Когда необходимо выполнять проверку многих условий, лучше использовать конструкцию Select Case. Конструкция Select Case...End Select Помимо операторов If ... Then, Visual Basic предоставляет команды для про- верки нескольких условий, а также конструкцию Select Case, концептуальная диаграмма которой приведена на рис. 6.3. Оператор Case содержит открывающий оператор Select Case, неограниченное и количество условий Case тестовое^выражение, возможное условие Case Else т и, наконец, оператор End Select. Далее представлен общий вид синтаксиса опе- К ратораСазе. Й Select Case те с то в о е__ выражение Case выражение значение! операторы (тестовое^выражение = значение!) Case выражение значение2 операторы (тестовое_выражение = значение2) в*1вм АмеМВ Лаамёваан Case Else операторы (тестовое_выражение = ни одно из значений) End Select
SELECT CASE условие CASE CASE CASE CASE CASE значение значение значению значение ELSE Рис. 6.3. Концептуальная диаграмма оператора Select Case t Обратите внимание, что синтаксис данной конструкции подобен синтаксису опе- ратора if.. .Then. Однако вместо условия в операторе Select Case Visual Basic ис- пользует тестовое выражение. Каждый оператор Case в операторе Select Case сравнивает значение с тестовым выражением. Когда оператор Case находит соответ- ствие тестовому значению, программа выполняет следующую строку или строки ко- да, пока не дойдет до следующего оператора Case или окончания оператора End Se- lect. Visual Basic выполняет код только для первого оператора Case, значение кото- рого соответствует тестовому значению. На рис. 6.4 показан код подпроцедуры события Нажатие кнопки (OnClick) для кнопки Print в форме frmJDialogBankPrint. Эта процедура используется для об- работки выбранных пользователем параметров печати и определения, какой отчет и какие записи в нем выводятся на печать. Обратите внимание на использование оператора Select Case. Если значению тестового выражения в Select Case соответствует больше од- ного оператора Case, выполняется только код в первом операторе. Если после первого оператора располагаются другие операторы, которые удовлетворяют ус- ловию, они будут проигнорированы. На рис. 6.4 оператор Select Case анализирует значение элемента управления Type of Print и проверяет каждое условие Case. Если значение параметра Type of Print равно 1 (Cunent Bank Account), оператор Case 1 получает значение True, кроме того, выводится на печать отчет текущего банковского счета, но только его текущей записи, в силу параметров фильтрации отчета. Конструкция if. . .Then. . .Else теоретически может выполнять любое условие If в группе операторов и должна проверять каждую ветку условий, пока она не будет ’’закрыта”. Оператор Select Case останавливается и прекращает проверку условий, когда находит первое условие, равное True. Если параметр Type of Print не равен 1, Visual Basic переходит к следующему оператору Case и анализирует, соответствует ли значение Type of Print следую- щему тестовому значению, которое равно 2. Если данное условие верно, для всех за- писей создается отчет банковского счета. В данном случае условие Case Else отсут-
ствует, поэтому теоретически, если значение Type of Print не равно 1,2 или 3, ни один из операторов в конструкции Select Case не будет выполнен. Каждый опера- тор Case вычисляется, пока не будет найдено соответствие или пока программа не достигнет оператора End S elect. л к Vfcu 4 । n h«»vkWriii i Otokh hunkPii'il ( Puc. 6А. Простой оператор Select Case Оператор Case Else не обязателен. Условие Case Else всегда является по- следним оператором Select Case и используется для выполнения определенно- го действия в том случае, когда ни одно значение Case не соответствует тестово- му значению оператора Select Case. Циклы Еще одним мощным процессом, доступным в VBA, являются циклы, которые предоставляют возможность неоднократно обрабатывать группу операторов в программе. Оператор или группа операторов обрабатывается до тех пор, пока не будет выполнено некоторое условие (или пока это условие выполняется). Visual Basic предоставляет два типа конструкций. Do. . , Loop Обычно используется для обработки данных For • . . Next Используется, когда известно точное количество повторов цикла Осталось 10 минут Оператор Do...Loop Оператор Do. . . Loop используется для повторения группы операторов до тех пор, пока определенное условие не станет равно True или пока условие равно True. Этот оператор — одна из наиболее часто используемых команд, которые могут выполнять повторяющиеся процессы. Оператор Do. . . Loop имеет следующий синтаксис. Do [While | Until условие} оператор [для условие = TRUE] [If дополнительное условие Then Exit DO] оператор [для условие = TRUE] Loop [While | Until условие]
Обратите внимание, что оператор Do. . . Loop имеет несколько необязатель- ных элементов. Условие While указывает, что программа в цикле Do.. .Loop должна выполняться до тех пор, пока тестовое условие равно True. Когда усло- вие становится равным False, программа переходит на оператор, следующий за оператором Loop. Условие Until работает с точностью наоборот; инструкции в конструкции выполняются до тех пор, пока условие равно False. От того, какое будет исполь- зовано ключевое слово — While или Until, зависит, будет ли выполнен код в конструкции Do. . .Loop. В конструкции Do While может никогда не выполняться ни один оператор, если J w условие изначально равно False, a Do Until всегда выполняет цикл хотя бы один раз. Оператор Exit Do используется для немедленного выхода из цикла Do. . . Loop. При этом программа сразу переходит к оператору, следующему за оператором Loop. На рис. 6.5 показана концептуальная диаграмма цикла Do. .. Loop. Пока условие Do... Loop равно True и условие в операторе Exit Do остается равным False, цикл выполняется снова и снова. Рис. 6.5. Концептуальная диаграмма цикла Do... Loop Как правило, в циклах обрабатываются записи таблиц, набора записей или динамического множества записей. На рис. 6.6 показано событие Clear Marks OnClick из формы frm^CheckWriter. Этот код используется для изменения значения поля Print во всех записях таблицы Check Writer. В первой части рисунка применены некоторые операторы ADO: чтобы устано- вить и открыть наборы записей из всех записей в таблице tbl CheckWriter для
банковского счета, открытого в форме frm_CheckWriter. Цикл Do. . .Loopв се- редине рисунка проходит по всем записям. 1 > Microsoft Visual B-jsic - CheckWftter [Гermjhrajt hrckWuh* Г ядя •] IIOjIjX Рис. 6.6.Простой цикл Do. . . Loop Даже несмотря на то, что вы еще не знаете ADO, а также способы создания набора записей, код на рис. б.б достаточно ясен. В этом примере важно отметить не ADO, а использование конструкции цикла. Оператор Do типичен для цикла, предназначенного для обработки данных в наборе записей. Начинайте обработку с начала набора записей, определенного в операторе SQL, и обрабатывайте все записи. В данном примере CheckTB — это название набора записей, а оператор Do Until CheckTB. EOF выполняет цикл до тех пор, пока набор записей CheckTB не достигнет конца файла. Следующая строка, CheckTB! [Print] = False, устанавливает значение те- кущей записи на False. Строка CheckTB. Update обновляет значение Print в таб- лице Check Writer. Без метода Update изменение значения не было бы сохранено. При создании цикла необходимо задать код, чтобы иметь возможность управ- лять выходом из него. Существует два способа выйти из цикла. Можно использо- вать оператор Exit Do или изменять условие в начале цикла, чтобы каждый раз при входе в цикл выполнялась проверка условия Do. Последний оператор в цикле CheckTB. MoveNext переносит указатель записи в наборе записей на следующую запись. После того, как была обработана послед- няя запись, значение маркера . EOF устанавливается равным True, что приводит к завершению цикла, поскольку выполняется условие Do Until CheckTB. EOF.
Затем выполняются операторы, следующие за оператором Loop, они закрывают открытый набор записей. Условия While и Until обеспечивают мощные возможности для обработки циклов Do. . . Loop в программе. В табл. 6.1 представлены альтернативные вари- анты использования Whi 1 е и Unt Ни их влияние на способ обработки кода. Таблица 6.1. Повторяющиеся циклы Do ... Loop с условиями while и Until Псевдокод Значение цикла Do... Loop Do Здесь начинается код If условие Then Exi t Do End If Loop Программа в цикле всегда выполняется как минимум один раз. В ней содержится условный оператор (If. . .Then), который при условии True выполняет оператор Exit Do. Оператор Exit Do позволяет выйти из цикла Do. . .Loop. Если бы этого оператора не было, код в цикле выполнялся бы беско- нечно Do While условие Здесь находится код для условия, когда условие в строке Do While истинно (равно True) Loop Код в цикле Do While выполняется толь- ко в том случае, когда условие равно True. Код выполняется до оператора Loop, затем возвращается назад и прове- ряет, что условие все еще равно True. Ес- ли условие стало равным: False, цикл за- канчивается, когда код возвращается в строку Do While. Оператор Exit Do здесь не нужен Do Until условие Здесь находится код для случая, когда условие в строке Do Until равно False Loop Противоположно Do While, Если условие равно False (не True), программа начи- нается, и цикл повторяется до тех пор, пока условие не станет равно True; после этого цикл заканчивается. Независимо от того, равно ли условие изначально True, цикл и его код будут выполнены хотя бы один раз, даже если условие уже равно True Do Здесь находится код для случая, когда условие в строке Do While равно True Loop While условие Этот цикл всегда выполняется как мини- мум один раз. Сначала выполняется код в цикле, причем до тех пор, пока не будет достигнута строка Loop While. Если ус- ловие равно True, программа возвращает- ся назад и обрабатывает содержимое цик- ла снова; если условие не равно True, цикл заканчивается Do Здесь находится код для случая, когда условие в строке Do Until равно False Loop Until условие Этот цикл работает аналогично предыду- щей конструкции. Программа в цикле всегда выполняется как минимум один раз. Когда код доходит до строки Loop Until, выполняется проверка, равно ли условие значению True. Если условие равно True, программа выходит из цикла. Если условие равно False, программа возвращается назад и обрабатывает со- держимое цикла снова
Оператор For...Next Конструкция For. . . Next — еще один метод выполнения программы в цик- ле. Данную конструкцию можно использовать, когда необходимо повторить опе- раторы определенное количество раз. В предыдущем примере (см. рис. 6.6) вме- сто того, чтобы обрабатывать набор записей до конца файла (. EOF), можно было подсчитать число записей в наборе и повторить цикл такое количество раз. Дан- ный вариант программы может выглядеть так, как показано на рис. 6.7. Ln 99. C-s 5 Mirrusofl Visual Basic CheckWriter [f rm frm ChrckWrib r (Code)] Г Введите вопрос On Error GoTo ErrorHandler RunConcuand acCnidSaveRecord Set cnn — Cur rent Project .Connection Set CheckTB - New adodb. Recordset CheckTB.CurгэгТype - adOpenKeyset CheckTB. LockType *» adLockOptinistic Dim CheckTB As Hew ADODB. Recordset Dim SQLStrat As String SQLStmc SELECT Print: FROM tbl CheckWriter WHERE (AccountNuniber) & Me CheckTB.Open SQLStrat, ann, , CheckTB.MoveLast NunRecs “ CheckTB-RecordCount adCradText i CheckTB-MoveFirst For Counter * 1 To NtffiRecs Step 1 CheckTB!(Print) - False CheckTB.Update CheckTB.MoveNext Next Counter CheckTB-Close Set CheckTB * Nothing |йе. Refresh GoTo Done ErrorHandler: MsgBox Err.Description Done*. End Sub Puc. 6.7. Простой цикл For. . .Next Ниже приведен общий синтаксис конструкции For. . . Next. С For счетчик = начальное~_значение То конечное^значение [Step шаг] Т опера торы К [If условие Is True Then Exit For] С Операторы, выполняемые после Exit For C Next [счетчик] В начале цикла For, . . Next программа инициализирует значение перемен- ной-счетчика RecNum числом 1; после чего выполняет каждый оператор цикла. Каждый раз, когда программа доходит до оператора Next, она автоматически увеличивает переменную-счетчик на 1 и возвращается к оператору For. Про- грамма сравнивает значение счетчика RecNum со значением Num Rees. Если усло- вие сравнения равно True, программа выполняется еще раз; в противном слу- чае — выходит из цикла.
Можно выполнить тот же код с помощью цикла Do While или Do Until, управляя счетчиком самостоятельно точно так же, как наборами записей. Ниже показаны эквивалентные циклы с использованием For. . .Next и Do While. Цикл Do While Dim Counter As Integer Do While Counter <= 20 некоторые операторы Counter = Counter + 1 Loop Цикл For. . .Next Dim Counter As Integer For Counter = 1 To 20 некоторые операторы Next Counter Конструкции "с памятью": With.,.End With Наконец, следует рассмотреть еще одну дополнительную конструкцию, кото- рая может значительно упростить программирование и ускорить обработку дан- ных в форме. Мы надеемся, что вам известны принципы ссылок на формы и эле- менты управления. Чтобы обратиться к определенному свойству формы, можно использовать операторы следующего типа. Forms!Checkwriter!CheckAmount.Visible = True Если требуется проверить ряд разных свойств или выполнить набор методов, придется снова и снова обращаться к форме. Forms!Checkwriter!CheckAmount.Visible = True Forms!Checkwriter!CheckAmount = 0 Forms!Checkwriter!Void.Visible = False Forms! Checkwriter! Memo = ’’ ” Это очень неудобный способ обращения к элементам управления. Каждый раз, когда выполняется оператор, ссылающийся на форму, Access должен искать форму в списке всех форм базы данных. Поиск выполняется по алфавиту, и Ac- cess просматривает каждое значение, пока не найдет форму, на которую ссылает- ся оператор. Выполните поиск форм, которые начинаются с буквы А, а потом сделайте то же самое для буквы Z и убедитесь, насколько медленнее выполняется программа, когда приложение имеет много форм. Существует более эффективный способ: определите переменную как тип фор- мы и используйте ее для обращения к элементам управления. Dim frmControl As Form Set frmControl = Forms! Checkwriter frmControl! CheckAmount .Visible = True frmControl!CheckAmount = 0 frmControl!Void.Visible False frmControl! Memo = "" При использовании такого варианта программы переменная формы задается один раз, и ссылаются на нее тоже только один раз. При обращении к перемен- ной frmControl (или любой другой заданной переменной) Access известно, где искать форму в списке. Фактически, создается индекс, что позволяет намного увеличить скорость работы программы.
Готовой Однако самый лучший способ обращения к формам — использование конст- рукции With- - .End With. With Forms!CheckWriter 1CheckAmount.Visible = True !CheckAmount = 0 !Void.Visible = False • Memo = "” End With Как видно из примера, переменная формы определяется в операторе With, при- чем перед каждым элементом управления ставится символ !. Все операторы в кон- струкции With. . . End With ссылаются на значение, указанное в операторе With. Обзор В этом уроке были рассмотрены логические конструкции. Они используются для выполнения программы в том порядке, который определяется задачами, возни- кающими в приложении. Логические конструкции включают операторы услов- ной обработки и циклы. В данном уроке вы изучили следующие вопросы. • Логические конструкции — это класс операторов, который управляет спо- собом и порядком выполнения программы. • Возможность программы анализировать значение и в зависимости от этого значения принимать решение, какие операторы должны выполняться, на- зывают условной обработкой. • Операторы If. .. Then. .. Else применяются для обработки бинарных ус- ловий. • Операторы Select Case используются для обработки нескольких условий. • Операторы циклов Do While или Do Until позволяют выполнить мно- гократную обработку ряда операторов. • Циклы For. ., Next позволяют обрабатывать циклы с помощью перемен- ной-счетчика. • Любую логическую конструкцию можно использовать внутри другой ло- гической конструкции. Такие конструкции называют вложенными. • Конструкция With может ускорить обработку при обращении к формам и элементам форм. Z Проверьте себя 1. Что такое логическая конструкция? (См. начало урока.) 2. Назовите два типа условной обработки. (См. раздел "Условная обработка”.) 3. Можно ли выполнять один оператор If внутри другого? (См. раздел “Вложенные операторы If. . .Then. . .Else”.) 4. В каких случаях следует предпочесть условный оператор If. . . Then операто- ру Select Case? (См. раздел "Конструкция Select Case... End Select”.) 5. Назовите два типа операторов цикла. (См. раздел “Циклы”.) 6. Чем отличается оператор Do While ot^Do Until? (См. раздел "Оператор Do. . .Loop”.)
7. Какой тип конструкции циклов включает автоматическую переменную- счетчик? (См. раздел "Оператор For. . .Next”.) 8. Каким образом можно ускорить обработку при использовании ссылок на формы? (См. раздел "Конструкции "с памятью": With. . . End With”.)

УРОК Процедуры, модули и модули классов Содержание урока * Понятие процедуры < Работа с модулями * Использование модулей классов v Создание и выполнение процедур ЭВ предыдущих уроках было продемонстрировано, как процедуры событий могут расширить возможности приложения Access. Процедуры событий — это только один из нескольких доступных типов процедур. Процедуры событий выполняются авто- зоминут матически в ответ на определенное действие в форме или отчете, а подпроцедуры и функции обеспечивают еще одни способ обработки действий в приложении. Понятие подпрограммы Подпроцедура,или подпрограмма (subprocedure)— это ряд операторов в програм- ме, которые выполняют некоторое действие. Подпроцедуры начинаются с ключевых слов Public Sub и заканчиваются оператором End Sub. Они могут получать аргу- менты, но не возвращают значение. Ниже приведен пример подпроцедуры. Public Sub IsWeekday (dtmDateToCheck As Date) If Weekday (dtmDateToCheck) = vbSaturday Or Weekday (dtmDateToCheck) = vbSynday Then MsgBox dtmDateToCheck & " - выходной день . 11 , vblnformation Else MsgBox dtmDateToCheck & " — будний день . ” t vblnformation End If Exit Sub End Sub /
Процедуры событий также объявляют с помощью операторов Sub. . .End Sub. Они представляют специальный тип процедур, так как связаны со свойствами со- бытий формы или отчета. Подпроцедура IsWeekday получает аргумент DateToCheck. Аргумент — это значение, которое необходимо процедуре для обработки операторов. Подпроце- дура IsWeekday отображает сообщение, которое указывает, является ли дата DateToCheck будним днем. Если процедура не имеет аргументов, скобки оставляют пустыми. Например, объ- явленная ниже процедура не получает аргументов. Public IsWeekday() Понятие функции Функции (junctions) имеют много общего с подпроцедурами. Они состоят из ряда операторов, которые выполняют некоторое действие, и тоже могут получать аргументы. Однако, в отличие от подпроцедур, функции возвращают значение. Функции начинаются с ключевых слов Public Function и заканчиваются оператором End Function. Если функция получает аргументы, их объявления указывают в скобках за ключевым словом Function. Первый оператор заканчи- вается объявлением значения, которое возвращает функция. Ниже приведен пример процедуры функции. Public Function CalcTax(curPurchaseAmt As Currency, dblTaxRate As Double) As Currency CalcTax = Round (curPurchaseAmt * dblTaxRate, 2) Exit Function End Function Функция CalcTax, используемая для вычисления суммы налога, получает два аргумента: первый — сумма покупки, второй — текущая налоговая ставка. Ключевые слова As Currency в конце оператора объявления функции указы- вают на то, что функция возвращает денежное значение. Функция CalcTax вы- числяет сумму налога от суммы покупки на основании заданной налоговой став- ки. Функция возвращает вычисленное значение налога в процедуру, откуда была вызвана функция, присваивая результат названию функции (CalcTax). Access предоставляет многочисленные встроенные процедуры для часто ис- пользуемых операций, например, для работы с датами и временем, обработки строк и преобразования типов. Далее представлены некоторые примеры встроен- ных процедур. • Round(): округляет число до указанного количества десятичных знаков. • IsWeekdayC): возвращает номер дня недели для указанной даты. • No\\(): возвращает текущие дату и время. • Left () : возвращает указанное количество символов в строке, начиная с первой буквы. Полный список всех доступных встроенных процедур см. в справочной системе Microsoft Visual Basic.
Осталось 20 минут Понятие модуля Перед созданием подпроцедуры или функции необходимо разобраться, что пред- ставляют собой модули. Модуль— это объект Access, в котором хранится кол- лекция процедур. Существует четыре типа модулей Access: модули форм, модули отчетов, стандартные модули и модули классов. Модули форм и отчетов Все процедуры событий для формы или отчета хранятся £ модуле формы или модуле отчета. При создании первой процедуры события для формы или отчета Access автоматически создает модуль формы или отчета. Чтобы просмотреть модуль формы или отчета, откройте форму или отчет в представлении Конструктор (Design). Затем выберите команду Видеопрограмма (View^Code). Модуль будет отображен в редакторе Visual Basic (рис. 7.1). л Л*1 .ott Vlsu Л Л5!< п • и г (I arm 1nn MiirMenu (O.dej] -> "" X| Puc. 7.1. Просмотр модуля для формы frm_MainMenu Модули формы и отчета предоставляют способ хранения в одном месте всего кода, который относится только к отдельной форме. Как правило, модули форм и отчетов содержат только процедуры событий, однако в них могут также хранить- ся подпроцедуры и функции. Стандартные модули Стандартные модули позволяют хранить процедуры, которые следует исполь- зовать в любой форме или отчете приложения. Стандартные модули хранятся на вкладке Modules (Модули) в окне базы данных Access.
Чтобы просмотреть процедуры в модуле, выберите один из модулей, перечис- ленных на странице Модули (Modules), и щелкните на кнопке Конструктор (Design). Модуль отображается в редакторе Visual Basic (рис. 7.2). Рис, 7,2, Просмотр стандартного модуля mod_UtilityFunction.seредакторе Visual Basic Модуль mod JJtilityFunctions содержит несколько общих процедур, кото- рые можно использовать во всем приложении Check Writer. Эти процедуры включают следующие. • dbc_CheckNum (): генерирует первый номер чека для формы CheckWriter. • dbc__I s Loaded (): определяет, открыта ли в данный момент указанная форма. Несмотря на то, что функция dbc__CheckNum () относится к форме Check Writer, функция dbc__IsLoaded () может использоваться в любой форме, отчете или запросе в любом приложении. Общие процедуры необходимо хранить в одном модуле, чтобы можно было легко импортировать модуль в другие приложения.
Модули классов Модули классов (class modules) позволяют создавать новые специальные объек- ты для приложения. Для большинства приложений встроенные объекты интер- фейса пользователя обеспечивают основу всех необходимых объектов. Однако для разработки более сложных приложений может понадобиться создание собст- венных объектов. Модули классов хранятся на вкладке Модули окна баз данных Access вместе со стандартными модулями. Пиктограмма, которая отображается на странице Модули для модулей классов, отличается от пиктограммы стандартных модулей. На рис. 7.3 показана страница Модули, которая включает и стандартные модули, и модули классов. Модуль cis Setup — это модуль класса, а остальные модули в списке — стандартные. Рис. 7.3. На вкладке Модули для стандартных модулей и модулей классов отображаются разные пиктограммы Чтобы просмотреть процедуры в модуле классов, выберите один из модулей, перечисленных на странице Модули, и щелкните на кнопке Конструктор. Модуль будет отображен в редакторе Visual Basic (рис. 7.4). Модуль класса cls_Setup используется для работы с объектами начальных параметров приложения. Этот объект вы вправе использовать в любом приложе- нии, в котором может понадобиться информация о компании и значения дан- ных, отображаемые по умолчанию. Этот модуль класса применяется во всех при- ложениях, поскольку он не включает ссылки на какую-либо конкретную форму или отчет приложения. Чтобы увидеть, как работает класс модуля cls_Setup, откройте форму frm_CompanySetup в базе данных Check Writer. В этой форме отображаются данные из таблицы tbl_CompanySetup. На рис. 7.5 показан код для события On- Load формы frmCompanySetup. Когда загружается форма frm^CompanySetup, функция GetSetup в модуле cls_Setup отображает значения для каждого элемента управления формы.
Microsoft Visual Basi Cher kWrile» - [cls__Setup f( dej] (General) ) Public Function GetSetup(PropertyNaroe As String) As Variant On Error GoTo Err_GetSetup |Option Compare Database Option Explicit Public CorapanyNaine Аз String Public rsSetup As ADODB.Recordset Dim cnnCur As Connection (Dedai at c res) rsSetup.MoveFirst If Hoc rsSetup.EOF — True Then rsSetup.Find ("OptionName — •*& PropertyName & If rsSetup.EOF — True Then GetSetup « ** Exit Function Else Get Setup = rsSetup.Fields("Value") End "If Else HsgBox "Your attempt to get Company Setup info yielded no value! I End If Exit—GetSetup: Exit Function Err_GetSetup: If Err.Number - 3420 Or Err.Number - 91 Then Class_Initialize Resume End If «И « Puc, 7.4. Просмотр модуля класса cls_Setupeредакторе VisualBasic Рис. 7.5. Использование модуля класса для отображения начальных данных
Создание нового модуля Чтобы создать новый стандартный модуль, выполните следующие действия. 1. Щелкните на кнопке объекта Модули в окне базы данных. 2. Щелкните на кнопке Создать (New) на панели инструментов. Откроется редактор Visual Basic, после чего будет создан новый модуль под названием Modulel. На рис. 7.6 показан новый модуль Modulel. При создании нового модуля в окне Code автоматически отображаются сле- дующие два оператора: Option Compare Database и Option Explicit. Эти операторы необязательны, но их рекомендуется использовать во всех модулях. Оператор Option Compare Database указывает Access, какой порядок сорти- ровки должен использоваться при сравнении данных в строках. Оператор Op- tion Explicit делает обязательным объявление всех переменных во всех про- цедурах данного модуля. При создании нового модуля автоматически создается раздел Declarations (Объявления). Оба оператора Option всегда помещаются в начало раздела объявлений. В этом разделе могут содержаться переменные, которые долж- ны быть доступны во всех процедурах текущего модуля или в любом модуле приложения. Осталось Юми нут Создание новой процедуры После заполнения раздела объявлений можно переходить к созданию проце- дуры. Выполните следующие действия, чтобы создать процедуру под названием ShowMessage.
Рис. 7.7. Использование полей со списками для выбора раздела модуля 1. Выберите команду Inserts Procedure в меню редактора Visual Basic. Появится диалоговое окно Add Procedure (рис. 7.8). Рис. 7.8. Создание новой процедуры 2. Введите ShowMessage в поле названия новой процедуры. Выберите параметр Sub в разделе Туре и параметр Option в разделе Scope. 3. Щелкните на кнопке ОК. Новая процедура будет отображена в окне Code. Новая процедура должна выглядеть приблизительно так, как на рис. 7.9. Операторы процедуры вводятся между операторами Sub ц End Sub. Введите в теле процедуры! ShowMessage следующие операторы. Dim MsgTxt As String MsgTxt = "Выполнение процедуры ShowMessage.” Beep MsgBox MsgTxt, vblnformation, "ShowMessage Procedure"
Рис, 7,9, Новая процедура в окне Code Готовая процедура должна иметь вид как на рис. 7.10. Чтобы увидеть, как работает процедура ShowMessage, запустите ее из редак- тора Visual Basic. Откройте окно Immediate, введите в нем ShowMessage и на- жмите <Enter>. При выполнении процедуры ShowMessage прозвучит звуковой сигнал и появится сообщение. Перед выполнением процедур их необходимо всегда компилировать.
Использование процедур в форме. Созданную процедуру можно использовать в любой форме, отчете или запро- се. Чтобы применить процедуру в форме или отчете, необходимо просто ввести название процедуры как оператор или часть оператора в одной из процедур собы- тий. При вводе названия процедуры следует обязательно указать аргументы про- цедуры в скобках после имени процедуры. Событие Открытие (ОпОреп) для формы Check Writer вызывает функцию dbc_IsLoaded, которая хранится в модуле mod_UtilityFunctions. Следующий код отображает раздел программы для события Открытие формы Check Writer. If dbc_IsLoaded("frm_CheckReconciliation”) Then Me![BankAccount] = [Forms]![frm_CheckReconciliation]![BankAccount] Else Me![BankAccount] = DLookUp("[DefaultBankAccountNumber]", •' [tbl_Preferences] ") End If Когда процедура события Открытие вызывает функцию dbc_IsLoaded, она пере- дает в виде аргумента название формы для проверки — frrri CheckReconciliation. При выполнении функция dbc_IsLoaded проверяет, открыта ли форма frm_CheckReconciliation. Если форма открыта, функция возвращает True; в про- тивном случае— False. На рис. 7.11 показана программа для функции dbc_IsLoaded. л Micjosofl Visual Basic CheckWriter [mod. UtilityFunclrons (Code)J Public Function dbcIsLoaded(MyForraNaine) dbclsLoaded « (SysCmd{acSysCiBdGetObjectState, acForm, MyFormNanie> <>0>| End Function т Puc. 7.11. Получение параметра в процедуре Функция dbc_IsLoaded получает параметр Му FormName. Этот параметр ис- пользуется для указания названия объекта, который необходимо проверить — в данном случае это форма frm_CheckReconcillation. Функция dbc_IsLoaded вызывает встроенную функцию SysCmd для проверки состояния объекта, ука- занного в MyFormName.
Использование процедур в запросах Функции могут применяться в запросах, поскольку они возвращают значение. Вы можете включать процедуры функций в запросы, чтобы преобразовать данные или вычислить выражения, а также использовать в запросе встроенную функцию'(Left, Date, Now) либо включить в него одну из собственных функций. Чтобы применить функцию в запросе, необходимо просто передать название столбца как аргумент функции. На рис. 7.12 показан запрос, который вызывает функцию Date. к .п,- Л jan, ь ыьг ' у [2 Dj,*X tbl_Bari<Accoirita BanWMame, tbl_BankAccDunts 8ankAcaxritNurnber, Sum(tbijCheckWnter.PayrnentAccount) AS [Totalchecks] i ом tb BankAccounts LEFT JOIN tbijChedcWrlter ON tblJJankAccounts AS tbiJ3ankAcoxrits.Banld^caxjntNirnber=tbl_Checl,V'/nter AccountNumber , WHERE (((tb _Cht<kWnter.CheckDate) Between # 1/1/2003# And DateQ)) GROUP ETTtbl BankAccotrts.BankName, tbl BankAccointsBankAccountNumber HAVING (((dr_8ari<Accounts.BankAccountfJumber)^’,23342 8964*)); Puc. 7.12. Вызов функции из запроса Обзор Данный урок был посвящен работе с процедурами и модулями. Мы рассмотрели готово: такие темы. • Существует два типа процедур: подпрограммы и функции. • Функции возвращают значения. И подпрограммы, и функции могут полу- чать аргументы. • Процедуры хранятся в модулях. • Модули классов используются для создания определений специальных объектов. Все остальные процедуры хранятся в стандартных модулях. • Вы можете вызывать функции и подпроцедуры из форм и отчетов. В за- просе позволяется вызывать только процедуры функций. Проверьте себя 1. Назовите компонент подпроцедуры, который указывает, что процедура должна получать значение из другой программы. (См. раздел "Понятие подпрограммы”.) 2. Чем отличаются подпрограммы и функции? (См. раздел "Понятие функции”.) 3. Назовите объект Access, который используется для хранения процедур. (См. раздел "Понятие модуля”.) 4. Перечислите четыре типа модулей. (См. раздел "Понятие модуля”.) 5. Назовите две причины, по которым в процедурах следует использовать опера- торы Option Explicit. (См. раздел "Создание нового модуля”.)

УРОК Архитектура Access Содержание урока v Работа с объектами уровня приложения «✓ Механизм баз данных Jet Взаимодействие с внешними приложениями * Просмотр объектов в Object Browser * Создание библиотеки базы данных < ✓ Вызов функций Windows API Э Примеры, рассмотренные в предыдущих уроках, демонстрируют лишь неболь- шую часть того множества свойств и методов, которое доступно в Visual Basic for Applications. Понимание архитектуры Access может помочь выбрать самые эф- зоминут фективные методы и свойства в процессе разработки процедур и функции при- ложений Access. Понимание архитектуры Microsoft Access Microsoft Access состоит из двух фундаментальных структурных элементов: уровень приложения (Application layer) и механизм баз данных Microsoft Jet. Уровень приложения обеспечивает основу для создания и отображения объектов интерфейса пользователя в приложении. Механизм баз данных Microsoft Jet предоставляет в приложении услуги по управлению базами данных. В Microsoft Access Projects используется не механизм баз данных Jet а его альтер- натива — Microsoft Data Engine 2000. Подробнее о механизме Microsoft Data Engine 2000 см. урок 29.
Уровень приложения Уровень приложения в архитектуре Microsoft Access относится к объектам, которые можно видеть в приложении Access — другими словами, к интерфейсу пользователя. При создании новой формы, отчета или страницы доступа к дан- ным в окне Конструктор (Design) программы вы добавляете в базу данных новый объект на уровне приложения. Когда вы работаете с контейнерами баз данных в Access, то имеете дело со встроенным уровнем приложения самого Microsoft Access. Контейнер баз дан- ных представляет собой объект интерфейса пользователя, который классифици- рует объекты в приложении по семи категориям баз данных Access: таблицы, за- просы, формы, отчеты, страницы, макросы и модули. В контейнере баз данных предоставлены также инструменты Конструктор и Открыть (Open) для -работы с объектами в приложении. Уровень приложения может использоваться для создания таблиц и запросов, однако они не считаются частью уровня приложения. Таблицы и запросы явля- ются составной частью библиотеки объектов, называемых объектами доступа к данным (data access objects). Объекты доступа к данным управляются меха- низмом баз данных Jet. Управление данными с использованием механизма баз данных Jet Механизм баз данных Microsoft Jet — это система управления базами дан- ных, которая сохраняет данные в базе данных и получает данные из этой базы. Механизм баз данных Jet выполняет следующие функции. • Открывает базу данных. • Создает или модифицирует структуру базыданных. • Просматривает, создает или редактирует данные. • Управляет доступом к данным многими пользователями. • Создает и синхронизирует дубликаты файлов. • Ограничивает доступ с помощью параметров защиты данных. Механизм баз данных Jet — это посредник между уровнем приложения и данными приложения. На рис. 8.1 показаны отношения между архитектурными компонентами Microsoft Access. приложение механизм баз данных Jet данные frndb) Рис. 8.1. Архитектурные компоненты Microsof Access
Компонент данных в механизме баз данных Jet относится к файлу, содержащему данные, доступ к которым необходимо получить из уровня приложения. Почти во всех примерах этой книги использованы файлы данных из базы данных Microsoft Jet — . mdb. Однако механизм баз данных Jet может получать данные из внешних баз данных ISAM или баз данных ODBC. К базам данных ISAM относятся, например, dBase, Microsoft Excel и Paradox. Механизм баз данных Jet может иметь доступ к ба- зам данных Microsoft SQL Server или Oracle посредством ODBC. Формат баз данных Jet Базы данных Jet хранятся в формате ISAM (Indexed Sequential Access Method — метод индексно-последовательного доступа к данным). Данные сохраняются фраг- ментами файлов по 4 Кб. Эти фрагменты называются страницами. Страница мо- жет содержать одну или несколько записей (что зависит от их длины). Определение данных При создании и изменении таблиц, запросов, индексов и отношений в Access Jet сохраняет проекты таблиц и запросов в файле базы данных. После того, как вы с помощью ссылок и отношений объедините эти проекты в одно целое, прави- лами отношений при вводе данных пользователем будет управлять механизм Jet. Получение данных Механизм запросов Jet позволяет использовать Access для визуального созда- ния запросов на добавление, редактирование или удаление данных в приложе- нии. Когда Jet обрабатывает запрос Access, он сначала преобразует его в язык SQL. Кроме того, можно обращаться к данным с использованием кода VBA и спе- циального языка доступа — ActiveX Data Objects (ADO). Подробнее об объектах данных ActiveX (ADO) см. урок 10. Доступ к данным многих пользователей Почти все созданные вами приложения будут использоваться в рабочих груп- пах. При этом рано или поздно (что зависит от специфики работы такой группы) возникает ситуация, когда несколько пользователей могут одновременно попы- таться изменить какую-либо информацию. Jet решает такую ситуацию, блоки- руя запись во время ее изменения. Альтернативой блокирования записей является возможность заблокировать страницу записей. В Access выберите команду Сервис^ Параметры (Tools^Options) и щелкните на вкладке Другие (Advanced). По умолчанию установлен флажок Блокировка записей при открытии БД (Open Databases Using Record-Jjevel Locking), ко- торый отвечает за параметры блокирования в базе данных (рис. 8.2). Если этот фла- жок снять, Jet будет на время редактирования блокировать всю страницу данных. Помните, что на странице может находиться одна или несколько записей. Ко- гда Jet блокирует страницу, содержащую несколько записей, все записи на стра- нице будут заблокированы, даже если в настоящий момент редактируется только одна из них. В среде, где с приложением работает много пользователей, режим блокирования для базы данных определяется параметрами, установленными первым пользова- телем, который открывает базу данных. Если первый пользователь, который от- крывает базу данных, работает с включенным блокированием на уровне записей, то все последующие пользователи открывают эту базу данных тоже с блокирова- нием на уровне записей, независимо от установленных параметров.
Рис. 8.2. Установка параметров блокирования баз данных Проэкспериментируйте с этим параметром для каждого приложения во всех воз- можных ситуациях. Блокирование страниц, как правило, более эффективно, одна- ко оно увеличивает возможность так называемых "столкновений", когда распо- ложенные на одной странице данные одновременно пытаются редактировать не- сколько пользователей. Репликация Репликация, или дублирование, — метод, который используется в Jet для пе- редачи базы данных другим пользователям. Можно применять эту функцию для передачи таблиц, запросов, форм, отчетов и кода приложения. Целую базу дан- ных или только ее отдельные объекты можно скопировать в ноутбук, другие ра- бочие станции в сети или на другой отдельный компьютер. Данная функция зна- чительно сложнее, чем просто копирование базы данных, поскольку в Jet вне- сенные в копии изменения легко синхронизируются с главной базой данных. Проектирование, распространение и поддерживание дубликатов (replica) — сложные процессы, которые в данной книге не рассматриваются. Защита данных Access предоставляет две модели защиты данных для управления доступом к базе данных: модель общего доступа или модель индивидуального доступа к дан- ным на уровне пользователя. Первая модель просто применяет один пароль ко всей базе данных. С защитой данных на уровне пользователей вы можете ограни- чить доступ к отдельным объектам для каждого отдельного пользователя базы данных. Какая бы модель защиты данных не применялась в базе данных, меха- низм Jet управляет разрешением доступа к базе данных и/или ее объектам. Подробнее о защите данных см. урок 28.
Процедуры Visual Basic, которые вы создаете, изменяете и выполняете в рам- ках уровня приложения, используют встроенные объекты и библиотеки объектов Access (называемые ’’объектной моделью Access”). Осталось 20 минут Работа с объектной моделью Microsoft Access Microsoft Office Access 2003 — это система объектов и библиотек объектов, кото- рую называют объектной моделью. Эти объекты и библиотеки объектов Access доступны для процедур и функций Visual Basic. Чтобы создавать хорошие про- граммы Visual Basic, необходимо, прежде всего, разбираться в объектной модели Microsoft Access. Объектная модель описывает иерархическую организацию объектов и кол- лекций объектов в Microsoft Office Access 2003. На вершине иерархии объектной модели находится объект Application. На рис. 8.3 показана объектная модель Microsoft Office Access 2003. Работа с объектом Application Объект относится к активной в данный момент времени базе данных Access и со- держит все объекты и коллекции объектов базы данных Access. Объект Application располагает рядом свойств и методов, которые могут использоваться в Visual Basic для изменения поведения всего приложения баз данных Access. Например, свойство MenuBar может применяться для отображения специальной строки меню во всей ба- зе данных. Ниже приведен пример использования свойства MenuBar. Application.MenuBar = "CheckWriterMenu" Рис. 8.3. Объектная модель Microsoft Office Access 2003 «
Данное свойство устанавливается для созданной ранее панели меню. Можно снова отобразить встроенную панель меню Access, установив свойство MenuBar равным строке нулевой длины. В примере ниже показано повторное отображение строки меню Access. Application .MenuBar = Метод Quit — еще один удобный метод объекта Application, который мож- но использовать для закрытия базы данных (см. следующий пример). Application.Quit Этот оператор Visual Basic можно присоединить к командной кнопке Exit на главной кнопочной форме приложения, чтобы пользователи могли просто и бы- стро закрыть базу данных и Microsoft Access. Объект Application обладает возможностью взаимодействия с другими при- ложениями, которые поддерживают автоматизацию (Automation). Большинство приложений, поддерживающих автоматизацию (их называют серверами автома- тизации), работают с объектом Application. Объект Application открывает свою коллекцию объектов другим приложениям. Объект Application может использоваться для открытия объекта Access из другого приложения. В следующем примере показан код Visual Basic для уста- новки объектной переменной Excel, которая должна указывать на экземпляр приложения Access. Dim арр Access As New Access .Application Кроме того, что ключевое слово New устанавливает новую переменную, кото- рая должна указывать на экземпляр сервера автоматизации, оно фактически за- пускает приложение. Если вы создали в Access объект Application, используйте его для открытия базы данных Access. Ниже показано открытие базы данных CheckWriter. appAccess.OpenCurrentDatabase ("С:\CrashCourse\CheckWriter.mdb”) При открытии базы данных Access вы можете работать со всеми ее объектами. Это позволяет писать программы Visual Basic, для открытия какого-либо из объек- тов, которые хранятся в базе данных. В следующем примере для открытия фор- мы frni CheckWriteг использован метод DoCmd объекта Application и его ме- тод OpenForm. AppAccess.DoCmd.OpenForm ”frm_CheckWriter" Установка ссылки на внешнее приложение Прежде, чем реализовать автоматизацию в Excel, необходимо задать ссылку на библиотеку Microsoft Access 11.0 Object Library. В Microsoft Excel для созда- ния ссылки на Microsoft Access откройте редактор Visual Basic, выбрав команду Сервис^ Макроса Редактор Visual Basic (Tools'^Macro*=>Visual Basic Editor). В ок- не редактора Visual Basic выберите Tools'^ References, чтобы открыть диалоговое окно References (рис. 8.4). В диалоговом окне References задаются все ссылки, которые необходимы в при- ложении для использования базы данных автоматизации или другой библиотеки. Чтобы выбрать или отключить ссылку, щелкните на соответствующем флажке.
Рис, 8.4. Установка ссылки на сервер автоматизации При создании ссылки в Access сначала следует создать новый модуль или открыть один из существующих модулей в базе данных приложения. Когда модуль будет открыт в окне Microsoft Visual Basic, выберите Tools ^References, чтобы отобра- зить диалоговое окно References. Установив ссылку на сервер автоматизации, приступайте к работе с любым объектом приложения. При создании кода автоматизации список доступных методов и свойств для выбранного объекта Application отображается в функ- ции Auto List Members. На рис. 8.5 показан список доступных объектов для Microsoft Word. Рис. 8.5. Когда задана ссылка на сервер автоматизации, его объекты сразу же становятся доступными в справке Auto List Members
Просмотр свойств объектов в окне Object Browser Object Browser позволяет просматривать все доступные объекты приложения, их свойства, методы и события. Кроме того, вы имеете возможность просматри- вать процедуры и константы, которые доступны из библиотек объектов прило- жения. Object Browser также применяется для поиска и использования создан- ных ранее объектов и объектов из других приложений. Окно Object Browser можно отобразить из окна Microsoft Visual Basic, выбрав в меню команду View ^Object Browser. На рис. 8.6 показаны объекты библиотеки Word в окне Object Browser. Рис. 8.6. Просмотр объектов и свойств в окне Object Browser В списке Project/Library отображаются названия всех ссылок, которые были зада- ны для приложения. При выборе одной из библиотек в левой части окна Object Browser отображается список классов, доступных в этой библиотеке. Если выбрать один из классов в правой части окна Object Browser, то будет отображаться список членов этого класса. В области Details в нижней части окна Object Browser отображает- ся дополнительная информация о выбранном классе или члене класса. Чтобы получить справку по какому-либо классу или члену класса в Object Browser, щелкните на кнопке Help. Ссылки на библиотеки баз данных Вы можете не только создавать ссылки на объектные библиотеки серверов ав- томатизации, но также вправе обратиться к другим типам объектных библиотек и включить их в свое приложение.
Библиотеками баз данных называются базы данных, которые содержат про- цедуры Visual Basic, обеспечивающие утилиты для нескольких приложений Ac- cess. Библиотека баз данных представляет собой стандартную базу данных Ac- cess и обычно имеет расширение . mda или . mde. Эти базы данных построены так же, как обычные базы данных в приложениях. Они содержат обычные объекты Access (формы, запросы и таблицы). На рис. 8.7 показана вкладка Модули (Modules) базы данных CheckWriterLibrary .mda. Рис. 8.7. Вкладка Модулидля библиотеки баз данных В библиотеку баз данных CheckWriterLibrary .mda входит один модуль под названием mod_UnboundFormUtilities, который содержит несколько функций для работы с несвязанными формами. На рис. 8.8 отображен список функций, доступных в модуле mod UnboundFormUt i 1 i t i е s. Puc. 8.8. Просмотр функций, доступных в библиотеке баз данных
Функции несвязанных форм в библиотеке баз данных CheckWriterLi- brary . mda являются общими. Они могут использоваться в любом приложении Access, содержащем несвязанные формы, так как в процедурах функций нет ссылок на конкретные названия таблиц или форм. Библиотеки баз данных могут содержать процедуры, предназначенные спе- циально для определенного приложения, или стандартный набор инструментов, который разработан для использования в любом приложении Access. Можно просто импортировать из этих баз данных конкретные объекты, необходимые в новом приложении. Однако лучше не импортировать объекты, а создавать ссылки на эти базы данных. Причины описываются ниже. • Если вы храните одну версию кода, который будет использоваться неодно- кратно, то, применив ссылки, вам будет гораздо проще поддерживать и дополнять этот код. • В процессе работы Access не будет загружать библиотеку в память до тех пор, пока функция в вашем приложении не вызовет функцию или проце- дуру в библиотеке баз данных. Циклические ссылки использовать нельзя. Вы не можете установить ссылку из библиотеки YourAccountingLib.MDA на библиотеку YourMathLib.MDA, а потом создать ссылку из библиотеки YourMathLib.MDA на библиотеку YourAccountingLib .MDA. Библиотека может ссылаться на другую библиоте- ку, но две библиотеки не могут ссылаться друг на друга одновременно. Чтобы задать ссылку в базе данных CheckWriter.mdb на библиотеку баз дан- ных CheckWrj terL?brary.mda, выполните следующие действия. 1. Откройте окно модуля в CheckWriter .MDB* 2. Выберите команду Tools’^ References, чтобы отобразить диалоговое окно References. 3. Щелкните на кнопке Browse в диалоговом окне References. 4. В поле Files of Туре выберите Microsoft Office Access Databases (* .mdb). 5. Найдите библиотеку баз данных CheckWriterLibrary .mda. 6. Щелкните на кнопке OK. Название библиотеки баз данных будет отображено в списке доступных ссы- лок в диалоговом окне References (рис. 8.9). Если библиотека содержит процедуру с названием, которое имеется в биб- лиотеке, на которую задана ссылка, вызов этой процедуры будет обращен к первой библиотеке в списке ссылок, содержащей процедуру с таким именем. Обнаружив, что вызывается не та процедура, можно перенести библиотеку в начало списка ссылок или переименовать процедуру, чтобы избежать кон- фликта названий. Необходимо внимательно следить за названиями процедур в библиотеках, чтобы уменьшить риск столкновений с другими библиотеками. Используйте стандарты именования, что почти наверное сделает эти имена уникальными. Если заданы диск, папка и имя файла библиотеки, приложение продолжает искать библиотеку с таким именем на указанном диске или в папке. Помните об этом при передаче приложения конечным пользователям и учтите возможность ошибок в случае удаления или перемещения файла.
Рис. 8.9. Ссылка на библиотеку баз данных Процедуры в библиотеке баз данных, которые вы хотите сделать доступны- ми в своем приложении, должны быть объявлены как Public и сохранены в стандартных модулях. Приложение не может прямо получать доступ к моду- лям классов, которые хранятся в библиотеке баз данных. Однако функции и процедуры в библиотеке могут вызывать методы классов в библиотеке. Запом- ните: процедуры из библиотеки вызывают процедуры типа Private из этой же библиотеки, однако база данных приложения не может обращаться к этим процедурам Private. Вызов функций из динамически подсоединяемых библиотек В процессе разработки приложений и библиотек Access вам может понадобиться функция, которая находится в динамически подсоединяемой библиотеке Win- У dows (Dynamic Lank Library — DLL) или DLL внешнего производителя. В послед- ^Омимут нее вРемя в приложения Access стали включать вызовы программного интерфей- са Windows (Application Programming Interface, API), что позволяет расширить возможности приложения за счет возможностей API. Многие приложения требуют от пользователя указать расположение каталога и имя файла. Такая информация может быть необходима, например, в процессе импорта или экспорта данных либо при восстановлении прерванной ссылки на библиотеку. На рис. 8.10 изображена форма Import Data Dialog в базе данных Check Writer. В форме Import Data Dialog пользователь может ввести путь и имя файла, со- держащего данные для импорта, либо выбрать пиктограмму папки справа от текстового поля, где вводится путь. По щелчку на этой пиктограмме отображает- ся диалоговое окно File Open (рис. 8.11). Чтобы использовать содержащиеся в DLL функции, их следует объявить в Visual Basic, используя оператор Declare. Он указывает Visual Basic, что модуль содержит DLL, и представляет функции из DLL, которые будут использоваться в приложении вместе с аргументами и типами аргументов, получаемыми этой функцией DLL в качестве параметров. Такая информация позволяет Visual Basic проверить во время компиляции, что функция вызывает функцию с корректны- ми параметрами и типами параметров.
Рис, 8,10, Типичноедиалоговое окно импорта данных Рис, 8,11, Использование диалогового окна для выбора файла, который бу- дет импортирован в приложение Ниже показан оператор Declare, заданный в разделе General Declarations мо- дуля mod_FileUtilities (база данных CheckWriter.mdb). Он объявляет стан- дартную функцию GetFilelnfo, используемую при открытии файла. Declare Function GetFilelnfo Lib "msaccess.exe" Alias "#56’r (FSI As FileSelllnfo, ByVai fOpen As Integer) As Long В этом операторе Declare задано название функции, которая объявляется — GetFilelnfo. Оператор также указывает, что она содержится в DLL под назва- нием msaccess , ехе. В данном примере оператор в качестве DLL фактически ссылается на само прило- жение Microsoft Access — msaccess. ехе. Если пользователь работает с при- ложением, он должен точно знать, что данная ссылка существует. Аргумент Alias указывает, что фактическое название функции в msac- cess . ехе — #56. В программе вы вызываете функцию с названием GetFilelnfo,
но при выполнении программы DLL запускает функцию, которая в библиотеке имеет название #56. В скобках указаны аргументы, которые должна получать функция GetFilelnfo. В данном случае функция должна получать структуру FileSelllnfo. Необходимо объявить эту структуру перед тем, как ссылаться на нее в операторе Declare. На рис. 8.12 показан весь раздел General Declarations модуляmod_ Fileutilities. Option Compare Database Option Explicit Type FileSellnfo hwndOwner As Long strApp As String * 25S strTitle Аз String * 255 strButton As String * 255 strFile As String * 4096 strDir A3 String * 255 strFilter As String * 255 Inglndex As Long IngView As Long IngFlags Aa Long End Type Declare Function GetFilelnfo 1 i I "ддарсезз .exew Alias "tse* (FSI Дз FileSellnfo, Byx Puc. 8.12. Объявление функции API для отображения диалогового окна File Open Последняя часть объявления — As Long — указывает Visual Basic, что функ- ция GetFilelnfo возвращает значение типа Long. Кроме того, можно задать этот тип следующим образом. Declare Function GetFilelnfo^ Lib "msaccess.exe" Alias "#56" (FSI As FileSelllnfo, ByVai Юреп As Integer) Обратите внимание, что в конце названия функции использован символ &, ко- торый указывает тип возвращаемого значения. Можно задать аргументы как Optional, By Vai, ByRef или ParamAr ray, чтобы указать способ их передачи в функцию. Каждая указанная переменная также мо- жет описывать тип. Следует отметить, что переменные, указанные в операторе De- clare, не обязательно должны соответствовать переменным, используемым в фак- тическом вызове функции. Однако переменные, которые применяются при вызове, должны совпадать по типу и порядку с теми, которые указаны при объявлении. Если вы используете ключевое слово Optional для объявления аргумента, ко- торый может передаваться в функцию., а может быть пропущен, то необходимо за- дать тип аргумента как Variant, а все оставшиеся аргументы — как Optional. Способ определения аргументов By Vai указывает, что в функцию будет пе- редаваться значение переменной, а не ее адрес. Если аргумент задан как В у Vai (по значению), функция не сможет изменять переменную аргумента (за исклю- чением аргументов String). Ниже изменение аргументов String будет опи- сано подробнее.
Способ объявления ByRef указывает, что в функцию передается адрес перемен- ной. Переменные аргументов, которые передаются таким образом (по ссылке), могут быть изменены вызываемой функцией. Это способ передачи переменных использует- ся для того, чтобы получить из функции другое значение, а не то, которое возвращает функция в идентификаторе As Туре. Другими словами, некоторые функции воз- вращают назад значение, которое указывает на результат выполнения функции (в значении, объявленном как As Туре). Но одновременно они могут возвращать и другие значения в переменные, которые были переданы в функцию ByRef. Если не указать метод передачи аргументов, то необходимо использовать метод ByRef. Спецификация ParamArray может применяться только для определения по- следнего аргумента. Она описывает массив необязательных аргументов типа Variant. Вместо этой спецификации допускается передать в функцию любое ко- личество аргументов. Если функция не получает аргументы, необходимо поставить только пустые скобки. Укажите тип аргумента после его названия, используя ключевые слова As Туре, где Туре — это любой из корректных типов Visual Basic, определенная поль- зователем структура (как в функции GetOpenFileName), объектный тип или об- щий тип Object. Если использовать перед типом String ключевое слово ByVai, Visual Basic передаст строку С-типа, т.е. ссылку на строку с последним нуль- символом. Данный тип аргумента может быть изменен вызываемой функцией. Рассмотрим функцию dbc OpenFile в модуле mod_FileUtilities базы данных CheckWriter.mdb. На рис. 8.13 показан код функции dbc_OpenFile, которая создает переменную строки с фильтрами, заданными в раскрывающемся списке File of Type диалогового окна Open File. Эти типы файлов находятся в пап- ках диалогового окна File Open. 4 Micruvfl Visual Basi« Cb> i kWnt*: (mod _Fil. Utilities (cade) I [J ifcIfX function dbc_CpenFile (Optional strFile As Variant » Null, Optional gtrFilter As Str: ’Use to choose a file to open Dim FSI Аз FileSellnfo On Error GoTo ErrprHandler With FSI .IngFlags - 0 . strFilter- RTrim(strFilter) £ vbNullChar .Inglndex - CInt("O*> if Hot IsDull (strFile) Then .strFile - RTrim(strFile) 4 vbNullChar End If .strTitle- RTrim(strTitle) c vbNullChar . strB’Jtton RTrin(strButton) 4 vbNullChar . strDir - RTrim(strDir) fi VbNullChar End With J[f GetFilelnfo(FSI, True) - 0 Then dbc_OpenFile - dbc_TriraNull (FSI.strFile) GoTo Done ErrorBandler: HsgBox "Error: ** £ Err.Description & " (* c Err-Number & **)" Done: End Function Puc. 8.13. Вызов функции API для отображения диалогового окна File Open
Элементы переменной FSI, объявленной как структура FileSelllnfb, полу- чают значения, после чего можно будет вызвать функцию GetOpenFileName. Свойство структуры strTitle, к примеру, получает член strTitle из Get- FileInfo — в результате в диалоговом окне File Open при его первом открытии отображается специальный заголовок. Обратите внимание на то, что каждое присваиваемое значение конкатенируется с константой vbNullChar (нуль- символ). В большинстве функций API требуется, чтобы элементы структуры бы- ли разделены нуль-символ ом. После определения структуры FileSelllnfo выполняется вызов функции GetFilelnfo, которая открывает диалоговое окно File Open. Адрес имени файла, выбранный пользователем, возвращается в элемент st г File структуры File- Selllnfo. Str File указывает на строку с последним нуль-символ ом, поэтому используйте функцию dbc_TrimNull, которая отрезает последний нуль-символ в имени файла. Это необходимо, чтобы имя файла считалось корректным в прило- жении Access. Полученная в результате строка передается назад в процедуру, вызывающую функцию GetFilelnfo. Имя файла содержит его полный путь. Вызовы функций Win32 API и обращение к другим DLL часто используются в приложениях Access. Конечно, необходимо знать функции API и их синтаксис, чтобы успешно их применять в приложении; некоторые функции достаточно просты в использовании. Если вы решите обратиться к вызову Win32 API, то най- дите необходимый оператор объявления, а также объявление структур и констант в файле Win32API.txt, поставляемом вместе с Access 2003 Developer Extensions. Данный справочник очень удобный, он поможет узнать, как объявить и вызвать все доступные в Win32 API функции. Готово! Обзор В этом уроке вы изучили компоненты архитектуры Access. Архитектурный ди- зайн Access делает его функции доступными в других приложениях. В данном уроке рассматривались следующие вопросы. • Уровень приложения — это компонент, содержащий визуальные объекты приложения. • Механизм баз данных Jet — это компонент, который получает и обрабаты- вает данные, необходимые в приложении. Объектная модель Access — это иерархическая система объектов и кол- лекций объектов. ОбъектАрр1 ication может применяться для отображения в приложении специальной панели меню. Используя серверы автоматизации, вы сможете отображать объекты Access из других приложений. Ссылки указывают Access, где находится библиотека баз данных. В окне Microsoft Visual Basic необходимо выбрать Tools^References, чтобы иметь возможность просматривать и работать со списком ссылок, доступных в приложении. Функции Windows API позволяют добавить в приложение довольно мно- го возможностей, однако необходим опыт, чтобы правильно их объяв- лять, вызывать и понимать, каким образом они возвращают значения в приложение.
Проверьте себя 1. Назовите два основных компонента архитектуры Access. (См. раздел "Понимание архитектуры Microsoft Access”.) 2. Опишите, как Access обрабатывает изменения, которые вносятся в одну и ту же запись одновременно несколькими пользователями. (См. раздел "Управление данными с использованием механизма баз данных Jet’*.) 3. Какой оператор Visual Basic позволяет открывать Access из других приложений, например, из Microsoft Excel? (См. раздел "Работа с объектом Application”.) 4. Когда имеет смысл создавать и использовать ссылку на файл .mda? (См. раздел "Ссылки на библиотеки баз данных”.) 5. Где можно получить информацию об использовании в приложении функций Windows API? (См. раздел "Вызов функций из динамически подсоединяемых библиотек”.)
УРОК Работа с данными Содержание урока * Обзор операторов SQL * Создание операторов SQL SELECT, UPDATE и DELETE Использование операторов SQL в процедурах > / Использование ADO для получения данных ✓ Создание процедур для проверки корректности данных * Обновление вычисляемых полей из полей в наборе записей ЭВы уже знакомы с тем, как использовать поля в формах и отчетах для отображе- ния и обновления данных таблицы. Однако на определенном этапе начнется ра- бота с данными таблицы, которые не доступны из источника записи этого поля. зоминут Язык Visual Basic предоставляет богатый набор мощных команд, которые позво- ляют получать и обновлять данные в программе. Этот урок посвящен обзору средств SQL и ADO — наборов инструментов Visual Basic, которые могут быть использованы для обработки данных в локальных и удаленных базах данных. Что такое SQL X SQL (Structured Query Language) — это язык программирования, используе- мый для получения и обработки данных в базах данных. Как и Visual Basic, SQL обладает уникальным набором команд и правил синтаксиса. Многие процедуры, написанные для работы с наборами записей, используют операторы SQL, чтобы иметь возможность получить данные из базы данных, добавить новые данные в базу данных или обновить данные в базе данных. Вы уже знакомы с созданием запросов в Access с помощью Конструктора запросов (Query Designer). При ис- пользовании конструктора запрос создается графически, а вы указываете и пере- таскиваете таблицы и поля в рабочее пространство представления Конструктор.
Однако вы должны помнить, что выбор каждой таблицы и поля Access автомати- чески сопровождается созданием оператора SQL. Чтобы просмотреть созданный Access оператор SQL, выберите команду ВидФРежим SQL (View^SQLView). На рис. 9.1 показан оператор SQL для запроса Check Writer Display. Рис. 9.1. Просмотр представления SQL для запроса Access Запрос Check Writer Display получает поля из таблицы Check Writer. Он име- ет фильтр, который ограничивает результат выбора, включая в него только те за- писи, в которых поле номера банковского счета Bank Account Number совпадает с полем BankAccount в форме Check Writer. В примере на рис. 9.1 используется че- тыре самые популярные команды SQL, назначение которых описано в табл. 9.1. Таблица 9.1. Четыре популярных ключевых слова SQL Ключевое слово Его предназначение в операторе SQL SELECL Это ключевое слово начинает оператор SQL. За ним следуют названия полей, которые должны быть выбраны из таблицы или таблиц (если в условии FROM задано несколько таблиц). Данное ключевое слово явля- ется обязательным FROM Определяет название (названия) таблицы (таблиц), которые содержат поля, указанные в команде SELECT. Это обязательное ключевое слово. Если используется более одной таблицы, укажите тин JOIN (называемый табличным выражением — Table Expression) WHERE Определяет любое условие, применяемое для фильтрации (ограничения) записей, которые будут просмотрены. Это ключевое слово используется только в том случае, если необходимо ограничить записи определенной группой на основании некоторого условия ORDER BY Это ключевое слово указывает порядок, в котором должен быть отсорти- рован полученный набор данных (выбранные записи, которые возвра- щаются в результате запроса) Оператор SELECT Команда SELECT — одна из самых популярных. Синтаксис оператора SELECT включает ключевые слова SELECT, FROM, WHERE и ORDER BY. Этот мощный опе- ратор выполняет следующие функции.
• Получает определенные поля или все поля из таблицы. • Может получать поля из одной или из нескольких таблиц. • Включает все строки таблицы или использует фильтрацию, чтобы выбрать только строки, отвечающие определенному условию. • Сортирует строки по определенному полю или полям. Ключевое слово SELECT Ключевое слово SELECT — первое слово в операторе SELECT, за ним следует список названий полей, которые необходимо включить в запрос. Названия полей в списке разделены запятыми. Перед каждым названием поля может стоять на- звание таблицы, в которой оно содержится (через точку). Если вы получаете поле из нескольких таблиц, необходимо указать префикс имени таблицы. В том случае, когда одно и то же название поля существует в нескольких таблицах и вы не указываете название таблицы, то при выполнении запроса про- исходит ошибка. Оператор SELECT для запроса Check Writer Display включает 13 полей. Первое название поля в списке— CheckWriter .TransID. Скобки вокруг названий таб- лиц и полей не обязательны, если в названии не используется точка. Например, тот же элемент можно записать как [CheckWriter] . [TransID]. Чтобы получить все поля из таблицы, вместо списка названий полей можно исполь- зовать звездочку (*). Запрос CheckWriter Display задается следующим образом. SELECT * FROM tbl_CheckWriter Определение предикатов SELECT При создании оператора SQL SELECT могут использоваться представленные ниже предикаты. • ALL • DISTINCT • DISTINCTROW • TOP Данные предикаты применяются для ограничения количества записей, полу- ченных в результате запроса. Они могут использоваться в сочетании с условием WHERE оператора SQL. Предикат ALL выделяет все записи, которые соответствуют условию WHERE, заданному в операторе SQL. Если не указать ключевое слово ALL, по умолчанию в результате запроса будут включаться все записи. Предикат DISTINCT используется в том случае, когда необходимо убрать за- писи, которые содержат одинаковые данные в полях, указанных в операторе SE- LECT. Например, если вы создаете запрос, чтобы просмотреть название компании и продукты, купленные клиентами, однако вас не интересует количество про- дуктов в одной категории, используйте такой оператор SELECT. SELECT DICTINCT AccountNumber, Payee Если два чека были выданы клиенту Acme Wending с номером счета 233 42 8964 (первый чек — 15 марта 2003 года, второй — 22 марта 2003 года), то в результатах за- проса будет отображен только один чек. Предикат DISTINCT указывает Access на сле-
дующее: если значения в выбранных полях дублируются (т.е. содержат одного полу- чателя платежа и один и тот же номер счета), то должна отображаться только одна за- пись. Даже если для получателя в таблице tbl_CheckWrii ter существует две разных записи, будет показана только одна из них. Предикат DISTINCT убирает из результа- тов запроса дубликаты по критерию полей, выбранных для просмотра. Предикат D 1ST IN СТ ROW — уникальный в Access. Его действие подобно дейст- вию предиката DISTINCT. Отличие заключается лишь в том, что предикат DIS- TINCTROW ищет дубликаты на основании всех полей в таблице (таблицах), а не только тех, которые выбраны в запросе. Например, если какому-либо получате- лю в таблице tbl CheckWriter было выдано несколько чеков, то в операторе SQTможно использовать предикат DISTINCTROW. SELECT DISTINCTROW Ac count Number, Payee В данном примере отображается несколько записей из чековой книжки. Пре- дикат DISTINCTROW ищет дубликаты во всех полях, выбранных для запроса. Ес- ли какое-либо поле в двух записях отличается (в данном случае это описание че- ка), то отображаются обе записи. Предикат ТОР также уникален в Access. Он позволяет ограничить количество записей, которые включаются в результаты запроса (ТОР <количество>). На- пример, следующий оператор SELECT отображает только первые пять записей из чековой книжки. SELECT ТОР 5 Payment Amount FROM tbl CheckWriter Предикат TOP может использоваться в сочетании с условием ORDER BY для решения некоторых практических задач (см. следующий пример). SELECT ТОР 5 PaymentAmount FROM tbl CheckWriter ORDER BY Paymen- tAmount Desc Этот пример возвращает список из пяти самых больших выплат чековой книжки. Другими словами, сначала в запросе указываются все выплаты в по- рядке их убывания. Затем выбираются только первые пять сумм из отсортиро- ванного списка. Предикат ТОР имеет необязательное ключевое слово, PERCENT, которое ис- пользуется для отображения первых записей списка, отсортированного не на ос- новании указанного количества, а на основании указанного процента записей. Чтобы просмотреть первые два процента выплат по чекам, используйте такой оператор SELECT. SELECT TOP 2 PERCENT PaymentTTnount Ключевое слово FROM Ключевое слово FROM применяется для того, чтобы перечислить названия таблиц для полей, выбранных по условию SELECT. Это ключевое слово обяза- тельно, оно всегда следует за условием SELECT. Если запрос включает поля из нескольких таблиц, в условие FROM необходимо включить выражение типа объединения JOIN. Это выражение указывает Access, как при выводе результатов запроса объединяются записи таблиц. Существует три ключевых слова JOIN. • INNER JOIN. Включает записи из двух таблиц, в которых совпадают зна- чения из указанных полей. • LEFT JOIN. Включает все записи из таблицы, указанной в левой части ус- ловия, даже если ни одна запись не совпадает с записями таблицы из пра- вой части условия.
• RIGHT JOIN. Включает все записи из таблицы, указанной в правой части условия, даже если ни одна запись не совпадает с записями таблицы из ле- вой части условия. Ниже приведен пример синтаксиса условия FROM с использованием выраже- ния типа JOIN. FROM <левая таблица> <тип JOIN> <правая таблица> ON <левое поло = <правое поло Далее представлен пример запроса с использованием объединения RIGHT JOIN. SELECT tbl_CheckWriter.*, tbl_BankAccounts.BankName FROM tbl_BankAccounts RIGHT JOIN tbl_CheckWriter ON tbl__BankAccounts .BankAccountNumber = tbl_CheckWriter.AccountNumber; В данном примере запрос извлекает все поля из таблицы tbl^CheckVJriter и только одно поле BankName из таблицы tbl__BankAccounts. Условие объеди- нения RIGHT JOIN указывает Access, что необходимо искать соответствие полю BankAccountNumber из таблицы tbl_BankAccounts в поле AccountNumber из таблицы tbl_CheckWriter. Так как используется тип объединения RIGHT JOIN, отображаются все строки таблицы tbl_CheckWriter, даже если поле Ac- countNumber не совпадает ни с одним из значений в поле BankAccountNumber таблицы tbl_BankAccounts. Ключевое слово WHERE Ключевое слово WHERE не обязательно. Если оно используется в запросе, то всегда следует за условием FROM. Его можно применить для выбора отдельных строк из результатов запроса. Условие WHERE всегда начинается с ключевого слова WHERE, за которым следу- ет определенное условие, которому должны соответствовать записи в результатах запроса. Условие — это выражение, принимающее значение True или False. Оно включает название поля из той таблицы, которая указана в условии FROM, за которым следует тестовое выражение. Запрос с использованием условия WHERE может выглядеть следующим образом. WHERE ((tbl_CheckWriter.TransType ’Check*) AND (tbl_CheckWriter. Payee = ’ Random House ’)) В данном примере тестовое выражение включает сравнение значений в поле под названием TransType со значением ’Check*. В данном случае условие WHERE содержит два выражения для проверки, которые объединены операто- ром AND. Второе тестовое выражение сравнивает значения в поле Payee со зна- чением ' Random House'. Оператор And указывает Access, что оба этих выра- жения должны быть равны True, чтобы запись вошла в результаты запроса. Ключевые слова ORDER BY Ключевые слова ORDER BY также не обязательны, они используются для сор- тировки результатов запроса и размещаются в конце оператора SQL. Условие ORDER BY всегда начинается с ключевых слов ORDER BY, за кото- рыми следуют названия полей для сортировки. Ниже приведен пример усло- вия ORDER BY. 4 ORDER BY tbl_ CheckWriter.CheckDate;
В этом примере результаты запроса сортируются по полю CheckDate в поряд- ке возрастания. Чтобы отсортировать результаты запроса в порядке убывания, л используйте ключевое слово DESC, например, следующим образом: ORDER BY tbl_CheckWriter.CheckDate DESC; Точка с запятой в конце оператора SQL указывает Access, что больше никаких ключевых слов обрабатывать не нужно. Однако если не включить точку с запятой, Access автоматически поставит ее за вас. Осталось 20 минут Оператор DELETE Довольно популярной командой SQL является команда DELETE. Ее синтаксис располагает ключевыми словами DELETE, FROM и WHERE. Команда DELETE ис- пользуется для удаления из одной или нескольких таблиц, перечисленных в ус- ловии FROM, тех записей, которые удовлетворяют условию WHERE. Ниже показан пример запроса на удаление записей. DELETE tbl_CheckWriter. * FROM tbl CheckWriter В данном примере из таблицы tbl CheckWriter удаляются все строки. Оператор UPDATE Оператор UPDATE применяется для изменения данных в поле одновременно в нескольких записях. Синтаксис оператора UPDATE несколько отличается от син- таксиса операторов SELECT и DELETE. В этом операторе используются ключевые слова UPDATE, SET и WHERE. На рис. 9.2 представлен пример оператора UPDATE. Рис. 9.2. Оператор update изменяет несколько строк од- новременно Оператор SQL в данном примере изменяет значение поля Void на True, если какие-либо строки в таблице tbl CheckWriter одновременно содержат в поле CheckNumber и в поле Payment Amount. Операторы DELETE и UPDAFE при выполнении не возвращают записи. Использование операторов SQL в процедурах Операторы SQL могут быть применены в процедурах. Например, вы вправе использовать оператор SQL для установки свойства Recordsource в субформе. На рис. 9.3 показан код для события After Up date в группе переключателей Recon Display формы Check Reconciliation.
Рис, 9.3. Использование оператора SQL в процедуре для установки свойства Recordsource для формы Процедура Recon__Display_AfterUpdate проверяет значение группы переклю- чателей Recon Display. Она устанавливает свойство RecordSource (источник записи) для субформы frm_CheckReconciliation- Regis terSub form на основании значе- ния, выбранного в группе переключателей. Если выбран параметр Uncleared Only (значение 1), то оператор SQL фильтрует источник записи и включает только те запи- си, значения Cleared в которых равны False или 0, а значение AccountNumber рав- но значению поля BankAccount в форме frm_CheckReconciliation. Если в группе переключателей выбран параметр All Transactions (значение?), то оператор SQL фильтрует источник записей только по полю AccountNumber. Вместо того чтобы писать операторы SQL в процедуре с нуля, используйте окно конструктора запросов для создания и тестирования запроса, а затем перейдите в представление SQL этого запроса, скопируйте оператор SQL в буфер обмена и вставьте его в свою процедуру. Созданиепроцедурдля проверки корректности данных В Access можно достаточно просто отобразить или обновить данные в поле формы. Необходимо лишь перетащить одно поле из списка полей в представле- ние Конструктор (Design) для формы. При запуске форма отображает текущее значение поля. Если пользователь изменяет это значение, Access автоматически сохраняет новое значение поля. Однако во многих случаях необходимо проверить корректность введенных пользователем данных, например, сравнить их с другими значениями, которые уже сохранены в таблице формы. Например, если пользователь создает новый счет в форме frm_BankAccounts, необходимо проверить введенные данные, что- бы убедиться, что новый номер счета не совпадает с уже существующими счета- ми таблицы tbl_BankAccounts. Если номер счета уже существует, можете ото- бразить сообщение об ошибке и отменить ввод данных.
Чтобы проверить корректность введенных данных нового счета, необходимо проверить все записи таблицы и убедиться, что новый счет уникален. Для авто- матического просмотра нескольких записей в таблице не существует специаль- ной встроенной функции, которую можно ввести в свойстве ValidationRule. Поэтому необходимо написать собственную процедуру. Поскольку поле BankAccountNumber в таблице tbl_BankAccounts — первичный ключ, Access не позволяет дублировать его значение. Можно не ис- пользовать процедуру проверки данных и позволить Access принять или отклонить данные нового счета. Однако это может быть неудобно для пользователя, который вводит данные, так как Access не выполняет проверку до тех пор, пока пользова- тель не заполнит всю информацию в новой записи и не попытается ее сохранить. Событие поля До обновления (BeforeUpdate) используется для проверки но- вых данных, вводимых пользователем. На рис. 9.4 показано событие До обновления для поля BankAccountNutnber. Оно использует оператор SQL и не- которые специальные команды VBA, называемые командами ADO. Рис. 9.4. Использование процедуры для проверки данных Специальный набор команд — ADO Процедура BankAccountNumber__BeforeUpdate выполняет проверку новых данных, которые были введены в поле BankAccountNumber, и устанавливает,
не совпадают ли они со старыми данными из таблицы tbl_BankAccounts. Ука- занная процедура использует оператор SQL и некоторые другие команды VBA. Код VBA состоит из специального набора команд, называемых объектами дан- ных ActiveX (ActiveX Data Objects, ADO). Команды ADO применяются для полу- чения и обработки в процедурах данных таблиц и запросов. Вы уже видели, насколько легко работать с базами данных Access, когда они находятся на локальном компьютере или на удаленном сервере. Access — мощный инструмент разработки клиент-серверных систем, который поможет вам работать с базами данных, созданными не в Access. ADO — простой и мощный набор команд, специально предназначенный для работы с внешними базами данных. Более ранние версии Access включали интерфейс доступа к данным, который называют объектами доступа к данным (Data Access Objects, DAO). Усовершен- ствования в области технологий доступа к данным позволили перейти на новый уровень и сделать Access средством разработки клиент-серверных приложений. ADO, новое поколение интерфейса DAO, реализует эти нововведения и предос- тавляет более простые и мощные средства доступа к данным. В настоящий момент интерфейс DAO поддерживается в Visual Basic. Однако Micro- soft не планирует создавать новые версии DAO. Все новые функции будут включе- ны только в ADO. Таким образом, для разработки новых проектов необходимо ис- пользовать средства ADO. Объявление переменных ADO Первый шаг в создании процедуры ADO — объявление объектных перемен- ных ADO. Оператор Dim в этом примере объявляет объектные переменные ADO для соединения и набора записей. DAO и ADO используют ряд общих типов данных. Так как и ADO, и DA0 содержат тип набора записей, необходимо поставить перед названием переменной соот- * ветствующий класс. При обращении к набору записей ОАО используется тип данных DAO.Recordset. К наборам записей ADO обращаются как к типу ADODB.Recordset. Объект Recordset в ADO обеспечивает метод Open для получения данных из таблицы или запроса. Метод Open имеет четыре параметра: Source, Ас- tiveConnection, CursorType и LockType. Параметр Source — это название источника данных, который необходимо открыть для получения данных. Па- раметр Source в данном примере является оператором SQL, который использу- ется для получения записи tbl__BankAccounts, соответствующей новому но- меру банковского счета в форме Check Writer. Параметр ActiveConnection определяет соединение с базой данных. Соединение — это линия связи с базой данных. Соединение Currentproject .Connection ссылается на текущее ак- тивное соединение с базой данных Microsoft Access — в данном примере это ба- за данных Check Writer. Метод Open выполняет запрос, заданный в операторе SQL, и присваивает запись или записи, которые получены в результате запро- са, в переменной набора записей ADO. Вы можете сделать набор записей доступным для редактирования, используя параметры CursorType (тип перемещения) и LockType (тип блокирования). Свойства CursorType и LockType определяют способ получения ADO доступа к набору записей и его обновления. Свойства набора записей, которые можно изменять, описаны в табл. 9.2.
Таблица 9.2. Свойства наборов записей Параметр ADO CursorType Параметр ADO LockType Описание adOpenForwardOnly adLockReadOnly Позволяется только просматривать запи- си. Повышает эффективность работы в ситуациях, когда обновление данных не требуется, например, при поиске записей и выводе отчетов на печать adOpe nDynami с adLockOpt imi Stic Отображаются добавления, изменения и удаления, внесенные другими пользова- телями. Разрешены все типы перемеще- ния по набору записей adOpenStatic adLockReadOnly Статическая копия набора записей, кото- рую можно использовать для поиска дан- ных или создания отчетов. Добавления, изменения или удаления, внесенные дру- гими пользователями, не отображаются Если не задать параметр CursorType или LockType, ADO автоматически создаст набор записей, имеющий тип adOpenForwardOnly/adLockReadOnly. Этот тип набора записей не может быть отредактирован. Если вам необходимо внести изменения в данные набора записей, то вначале разберите действия раз- личных комбинаций параметров CursorType/LockType и их влияние на воз- можности набора данных. Выбор параметра типа перемещения adOpenForwardOnly —лучший вариант, когда набор записей открывается с целью найти запись. Е[ри использовании объектов данных ActiveX взаимодействие с данными осуществляется, в основном, через объекты наборов записей. Объекты Rec ord- set состоят из строк и столбцов, как таблицы баз данных. После открытия на- бора данных можно приступать к работе со значениями в строках и столбцах. Если набор записей открывается как доступный для обновления, т.е. с ис- пользованием параметров adOpenDynamic и adLockOptimistic, он автоматиче- ски открывается в режиме редактирования. Работа с наборами записей Когда набор записей открыт, можно начинать работу с данными, которые он содержит. Однако прежде, чем приступить к использованию каких-либо данных из полей набора записей, необходимо удостовериться, что набор записей содер- жит записи. При открытии набора записей, который содержит запись или не- сколько записей, первая запись — это текущая запись. Если в набор записей не включены записи, свойство EOF будет равно True. Поскольку оператор SQL в примере этой темы использует уникальный ключ таблицы, то вы будете знать, что первая запись в наборе записей — это единственная запись. В следующем примере операторы между I f и End выполняют проверку данных. If Not rst.EOF Then Response = MsgBox("Вы ввели старый номер счета!" & vbCrLf & "Вы хотите отменить ввод?’’, vbYesNo + vbCritical, "Совпадение номера счета") If Response = vbYes Then
Me.Undo End If End If Если вы попытаетесь обработать данные в наборе записей, который не содержит записей, то в процессе выполнения программы происходит ошибка. Код проверки данных тестирует набор записей rst с целью проверить условие достижения конца файла. Если набор записей содержит данные (т.е. состояние набора записей — не конец файла), и оператор SQL находит соответствие со ста- рым номером счета, такой результат является для нас нежелательным. На экра- не появится сообщение об ошибке для уведомления пользователя о том, что был введен номер, совпадающий с одним из существующих номеров счетов. Обновле- ние данных будет отменено. Если состояние набора записей — EOF, то, значит, оператор SQL не нашел соответ- ствия, и процедура ничего не выполняет. Обновление данных не отменяется. Установка соединения с внешней базой данных При разработке клиент-серверной среды придется устанавливать соединения со многими системами управления базами данных, например, с Oracle или SQL Server. При установке соединения с такими внешними базами данных необ- ходимо использовать строку соединения, соответствующую источнику данных. Для каждого провайдера баз данных используется своя строка соединения. Ниже приведен пример строки соединения для базы данных SQL Server. CurConn.Open "DSN=pubs;uid=sa;pwd=;database=pubs” Эта строка соединения открывает базу данных пабов (пример базы жданных, который поставляется с SQL Server). Четыре параметра в этой строке соединения разделены точками с запятой. Параметр DSN означает название источника дан- ных для базы данных. Название pubs содержит букву диска и папку, в которой находится база данных. Для получения доступа к большинству внешних баз данных потребуются идентификационные данные и пароль пользователя. Пара- метры uid и pwd включают эти значения. Параметр database содержит фак- тическое название базы данных в SQL Server. Подробнее о работе с клиент-серверными базами данных см. урок 29. Закрытие объектных переменных ADO После оператора End If располагаются две стандартные команды, которые следует всегда использовать при работе с объектами: rst.Close Set rst = Nothing Метод Close указывает Access, что работа с объектом завершена.. Если далее в процедуре вы будете работать с данным объектом, необходимо снова использо- вать оператор Set, чтобы повторно открыть объект. Присваивание значения Nothing объектной переменной освобождает все ресурсы системы и памяти, ко- торые относятся к этому объекту.
0 Использование процедур для обновления несвязанных полей Осталось ю минут если поле формы связано с полем в источнике записей этой формы, Access авто- матически отображает в нем значение. Когда пользователь открывает форму, Ac- cess отображает текущее значение поля, которое хранится в таблице. Если поль- зователь обновляет значение в связанном поле, Access автоматически сохраняет новое значение в таблице. Во многих ситуациях требуется отобразить в форме данные, которые не доступ- ны ни в одном поле источника записей формы. В большинстве хорошо спроектиро- ванных баз данных таблица, с которой связана форма, содержит одно или несколь- ко полей, выполняющих для другой таблицы роль полей внешнего ключа. Напри- мер, в таблицу tbl^CheckWriter включено поле BankAccountNumber. Таблица tbl_CheckWriter не содержит никакой другой информации о банковском счете для отдельных номеров счетов. Информация для отдельных номеров счетов хра- нится в таблице tbl_BankAccounts. Однако в форме tbl_Checkwriter может возникнуть необходимость отобразить для номера счета, указанного в форме, соот- ветствующее название и код банка. Когда пользователь выбирает счет (Bank Account) в списке счетов в форме Check Writer, для выбранного счета отображается название банка (Bank Number) и код банка (АВА number). Чтобы найти новые данные, используйте событие После обновления (AfterUpdate)для поля BankAccount (рис. 9.5). Ln 14, Cd 23 BankAccount Micritwft .iMtal Basic - CheckWriter- [For m_frm_CheckWriter (Code)] Dim rst As New ADODB.Recordset On Error GoTo ErrorHandler C Chr(3^) & E .BankAccountNumber rst! BankAccountNumber rst.Open "SELECT * "FROM tbl_BankAccounts WHERE [BankAccountNumber] With Me .BankName “ rst'BankName .ABANumber = rst !ABANumber If .TabControl.Value <> 0 Then .TabControl .Pages (0). .SetFocus Else TabCont r ol_Cr.ange End If End With rst.Close GoTo Done ErrorHandler: MsgBox Err.Description Done: End Sub / Puc. 9.5. Обновление несвязанных полей в процедуре Процедура BankAccount_AfterUpdate открывает набор записей, в результате чего можно найти данные банковского счета для номера счета, выбранного в поле со ч
списком BankAccount. Эта процедура заполняет несвязанные поля формы — BankName, BankAccountNumbern ABANumber— данными из полей набора записей. Помимо того, что данная процедура устанавливает значения несвязанных полей, она также изменяет активную вкладку в элементе управления вкладок формы. Обратите внимание, что операторы для редактирования несвязанных полей находятся внутри оператора With Me. . .End With. Оператор With позволяет выполнить ряд действий над заданным объектом и избежать многократного по- вторения названия объекта. Объект Me в данном операторе просто ссылается на объект формы, присоединенный к данной процедуре. Код для обновления несвя- занных полей задается следующим образом. Forms!frm_CheckWriter.BankName = rst!BankName Forms•frm_CheckWriter.BankAccountNumber = rst!BankAccountNumber Forms • f rm_CheckWr it er .ABANumber = rst ’ABANumber Используя оператор With, вы сможете сослаться на объект формы один раз и не обращаться к нему снова и снова в каждом операторе процедуры. Оператор With предлагает разработчикам удобную функцию для сокращенного обращения к объекту несколько раз в одной и той же процедуре. Кроме того, опе- ратор With выполняется быстрее, чем каждая объектная ссылка по отдельности. Обновление вычисляемых полей Вычисляемое поле — это несвязанное поле, в котором отображается результат математического выражения или определенное итоговое значение. Простое вы- числяемое поле может показывать разницу между значениями двух полей фор- мы. Например, форма счета-фактуры может показывать поле Total Sale Amount (общая сумма покупки) и поле Total Payment Amount (общая сумма платежа). В третьем поле может отображаться Total Amount Due (Остаток к выплате), т.е. раз- ница между общей суммой покупки и общей суммой платежа. Вычисления в по- добных полях задать легко — необходимо просто ввести выражение как источ- ник элемента управления для данного несвязанного поля. Однако вычисляемые поля, отображающие некоторое итоговое значение, как правило, невозможно определить с помощью одного простого выражения или формулы. Итоговая величина, которую необходимо отобразить, может использо- вать довольно много строк из источника записей формы. Кроме того, итоговая величина зачастую основывается на значениях из другой таблицы базы данных. Например, в форме Check Reconciliation отображаются элементы, которые оста- ются непогашенными в двух вычисляемых полях. В поле Checks and Payments отображается общая сумма выплат по чековой книжке, которые еще не были по- гашены. В поле Deposits and Credits будет представлена общая сумма всех непо- гашенных депозитов в чековой книжке. Вычисления для подведения итогов по суммам Checks and Payments и Deposits and Credits выполняются в форме frm_CheckReconciliationRegisterSubform. Когда пользователь устанавливает в этой субформе флажок Cleared, выполняется про- цедура Cleared_AfterUpdate. На рис. 9.6 показана процедура события Cleared AfterUpdate. Процедура Cleared_AfterUpdate запускает оператор SQL, который суммирует все поля Payment Amount в таблице tbl CheckWrite г для транзакций с номерами счетов, которые совпадают с номерами счетов в форме Check Reconciliation. Дан- ный оператор SQL подсчитывает только положительные суммы выплат, непога- шенные транзакции и действительные (неаннулированные) счета. Тот же опера-
тор SQL считает количество транзакций, суммы по которым складываются. Про- цедура открывает набор записей с использованием оператора SQL и обновляет поле Uncleared Checks на величину SumPmtAmt данного набора записей (сумма величин выплат Payment Amount), а поле ChecksPaymentS — на величину NumPmtAmt (количество транзакций). л Microsoft Visual Basic • FF rmjimj h»'< kRecon. ili<Hi«*nRpgisterSut)biTm (Cwh 1 ~ l|O| XI Dim rst Aa New ADCDB. Recordset Dim SQLStmt As String Oa Error GoTo ErrorHandler DoCmd. RunConmanci acCmdSaveRecord SQL Stint - "select Sum (Payment Amount} as SumPmtAmt, Count (TransType} as NumPmts from rst.Open SQLStmt z CurrentProject.Connection, adOpenForwardOnly Forms! [frm_CheckReconciliatiot]! (Uncleared Checks] — Nz (rst!SumPmtAmt) Forms’ [trm_CheckReconciliation] ’ChecksPaymentS w Nz (rst’NumPmts) rst.Close SQLStmt - "select Sum(DepositAmount> as SumDepAmt, Count (TransType} as NumDep FROM t rst.Open SQLStmt, CurrentProject.Connection, adOpenForwardOnly Forms! [frm_CheckReconciliation] • (Uncleared Deposits] - Nz (rst'SumDepAmt) Forms! [frm_CheckReconciliation] ’DepositsCredits * Nz (rst!NumDep) rst.Close Set rat = Nothing GoTo Done ErrorHandler: MsgBox Err.Description Done: Puc. 9.6. Обновление e процедуре полей с вычислениями Затем процедура выполняет второй оператор SQL, который суммирует все поля Deposit Amount в таблице tbl_CheckWr iter для транзакций с номерами счетов, со- ответствующими номерам счетов в форме Check Reconciliation. Данный оператор SQL включает только положительные суммы депозитов и непогашенные транзакции. Тот же оператор SQL пересчитывает количество транзакций, величины депозитов по ко- торым суммируются. Процедура открывает набор записей с помощью оператора SQL и обновляет поле Uncleared Deposits на величину SumDepAmt (сумма депозитов), а поле DepositsCredits — на величину NumPmtAmt (количество транзакций). Функция Nz () используется при работе с полями наборов записей для преобра- зования значений Null в строки нулевой длины. Если вы попытаетесь обновить поле, используя значение Null, полученное из поля набора записей, в ходе вы- полнения программы может произойти ошибка Invalid Use of Null. Определение количества записей в наборе Чтобы отобразить количество записей, которые удовлетворяют определенно- му условию, используйте процедуру пересчета всех записей и отображения ре- зультата в несвязанном поле формы. Например, в форме Check Reconciliation мо- жет отображаться общее количество непогашенных транзакций по данному бан-
ковскому счету из таблицы tbl CheckWriter. На рис. 9.7 показана процедура вычисления количества непогашенных транзакций в таблице tbl_CheckWriter. л Micro- Л isual Basic i h. kWiiltx [mod Chr« kWiihrFunctions (' t-d.-)] Puc. 9.7. Определение количества записей в наборе записей Функция dbc__NumberUnReconciled!tems определяет, сколько транзакций для установленного по умолчанию банковского счета не было погашено. Данная функция открывает набор записей с помощью оператора SQL и получает строки таблицы tbl_CheckWriter, номер банковского счета в которых совпадает с ус- тановленными по умолчанию номерами непогашенных счетов. Если набор запи- сей открывается и не содержит записей (значение EOF равно True), функция воз- вращает количество непогашенных транзакций, равное нулю. В лротивном слу- чае функция возвращает количество непогашенных транзакций, равное значению свойства набора записей RecordCount. Свойство RecordCount — это значение Long, которое содержит количество записей в наборе записей. Обзор Если требуется применить свойство RecordCount, используйте параметр Cur- sorType со значениями Keyset или Static. Свойство RecordCount воз- вращает значение -1 для параметра CursorType со значением ForwardOnly. В зависимости от источника данных свойство RecordCount может не возвра- щать фактическое количество записей, если использовался параметр Cur- sorType со значением Dynamic. Готово! Данный урок был посвящен вопросу использования процедур и получения ин- формации из баз данных. Вы научились создавать операторы SQL и применять их с объектной моделью ADO. Были рассмотрены следующие вопросы.
• Запросы Access хранятся в виде операторов SQL. Вы сможете просмотреть это представление, выбрав в конструкторе запросов команду Вид^Режим SQL. • Оператор SELECT извлекает набор записей из одной или нескольких таблиц и может (при необходимости) фильтровать и сортировать этот набор записей. • Если в операторе SELECT используется несколько таблиц, необходимо ука- зать тип объединения этих таблиц в условии FROM. • Оператор DELETE удаляет из таблицы одну или несколько записей. « Оператор UPDATE изменяетзначения одного ил и несколькихполейтаблицы. • Оператор SQL может использоваться в событии До обновления (BeforeUpdate) для проверки корректности введенных данных. • В процедурах, например процедуре обработки события До обновления, можно использовать средства ADO для передачи в базу данных оператора SQL и для доступа к набору записей, который возвращает этот оператор. • Свойство RecordCount позволяет быстро определить количество записей, удовлетворяющих определенному условию. • Если используется итоговый оператор SQL, то набор записей может авто- матически суммировать значения, которые хранятся во многих строках. Проверьте себя 1. Как можно просмотреть оператор SQL для запроса Access? (См. раздел "Что такое SQL”.) 2. Назовите четыре ключевых слова, которые используются в операторе SELECT. (См. раздел "Оператор SELECT”.) 3. Назовите два оператора SQL, которые не возвращают записи в результате вы- полнения. (См. раздел "Оператор UPDATE”.) 4. Какое свойство указывает на то, что набор записей не содержит записей? (См. раздел "Работа с наборами записей”.) 5. Какое значение параметра CursorType в наборе записей наилучшим образом подходит для выполнения поиска в наборе записей? (См. раздел "Объявление переменных ADO”.)
УРОК Добавление, редактирование и удаление записей с использованием ADO Содержание урока * Добавление новой записи ✓ Сохранение изменений в наборе записей * Блокирование редактирования записей ✓ Обработка ошибок редактирования ✓ Минимизация конфликтов при редактировании записей * Перемещение по набору записей ✓ Удаление записей э Осталось 30 минут В уроке 9 вы узнали, как получать данные из таблицы в процедурах с помощью кода ADO. В данном уроке эта тема рассматривается более подробно: речь пойдет о добавлении, изменении и удалении данных из таблицы. Процесс обработки данных с помощью процедур может показаться сначала достаточно сложным. Уделите время изучению этих приемов, и вы сможете без труда справиться с раз- работкой полнофункциональных приложений.
Добавление записи в таблицу Чтобы добавить запись в таблицу программным способом, используйте про- цедуру Visual Basic. Для добавления новой записи в таблицу используйте метод AddNew. На рис. 10.1 показана процедура ADO, которая добавляет нового полу- чателя в таблицу Payees. Г I Mi* къ-jfr Visu.il Basu CheckWiitei [Form_fnn _CheckWtiter {Codp/J ~ | Private Sub Payee Not InList (NewDara Аз String, Response As Integer) Dim rst As Hew ADODB.Recordset Dim Answer As Integer On Error GoTo ErrorHandler Answer * MsgBox(*This Payee is not on file. Add ic to the Payees list?*, vbQuestj on + vbYesNo, "New Payee*) If Answer - vbNo Then Response = acDataErrContinue Else Response = acDataErrAdded rst.CursorType — adOpenKeyset rst.LockType “ adLock^pti'tistic rst.Open "tbl_Payees*, Currentproject.Connection, , , adCmdTable With rst •Add new payee to tblPayees table .AddNew !Payees = NewData .Update End With rst.Close Set rst “ Nothing End If GoTo Done ErrorHandler: MsgBox Err.Description Done: «I | £ Puc, 10,1, Добавление новой записи в таблицу с использованием ADO Если пользователь ввел имя получателя платежка в форму Check Writer, но этого имени нет в списке существующих получателей, запускается процедура Payee NotlnList. Будет отображено окно сообщения, в котором пользователя попросят подтвердить, действительно ли он хочет добавить в комбинированный список Payees нового получателя. Если пользователь выбирает Yes, выполняется программа ADO, которая добавляет нового получателя в таблицу Payees. Событие Отсутствие в списке (Notin Li st) выполняется только в том случае, если свойство LimitToList для поля со списком имеет значение Yes. Использование метода AddNew Метод AddNew создает буфер для новой записи. Полям в наборе записей при- сваиваются значения посредством создания отдельного оператора для каждого присваивания. Операторы присваивания всегда задаются между оператором
AddNew и оператором Update. Если оператор присваивания значения выполнен, то новая информация поля копируется в буфер. Окончание редактирования новой записи Использование метода Update совместно с методом AddNew приводит к пере- мещению информации из буфера в конец набора записей. Однако с ADO метод Update можно и не использовать. При переходе на новую запись в ADO, а также при закрытии набора записей изменения сохраняются автоматически. Тем не менее, лучше включить оператор Update, чтобы другие разработчики, которые будут пользоваться кодом, могли понять, что обновление данных завершено. Чтобы отменить в ADO обновления данных, которые ожидают сохранения, используется метод Cane el Up date. Следует отметить, что после выполнения ме- тода Update вы уже не сможете выполнить метод Cane el Up date. Нельзя отме- нить какие-либо изменения после того, как они были сохранены. Открытие набора записей, доступного для редактирования Когда вы добавляете, изменяете или удаляете записи набора записей, необхо- димо, чтобы этот набор был доступен для редактирования. Сделать набор записей доступным для редактирования можно, если установить определенные свойства набора записей перед тем, как открыть его с помощью метода Open. Свойство CursorType в сочетании со* свойством LockType определяет уровень редактиро- вания, возможный в наборе записей. Значение adOpenKeySet для свойства Cur- sorType — единственный тип свойства CursorType в базах данных Jet, который делает набор записей доступным для изменений. Подробнее обо всех возможных значениях свойства CursorType см. урок 9. В табл. 10.1 описаны все типы блокирования LockType, которые могут ис- пользоваться с наборами записей. Свойство LockType определяет, какой тип блокирования следует задать для записи, чтобы предотвратить редактирование изменяемой записи другими пользователями. Таблица 10.1. Значения LockType для набора записей Свойство ADO LockType Описание adLockReadOnly adLockPessimistic adLockOpt i mi s t i c adLockBat chOpt imiStic Запись доступна только для чтения. Изменения не разрешены Блокирует запись сразу же после ее редактирования Блокирует запись после ее сохранения Используется для редактирования записей в пакетном режиме Параметр adLockReadOnly применяется в сочетании со значениями adOpen- ForwardOnly и adOpenStatic свойства CursorType, когда осуществляется только запрос данных. Для редактируемых наборов записей почти всегда ис- пользуются параметры adLockPessimistic и adLockoptimistic. Применение типа блокирования adLockPessimistic называют пессимисти- ческим. При этом запись блокируется сразу же после редактирования. Данный метод имеет один недостаток: запись остается заблокированной до тех пор, пока не будет сохранена. Другие пользователи не смогут редактировать запись до ее
сохранения. Если в процедуре перед тем, как завершить изменения записи, не- обходимо выполнить ряд операторов, то запись может долгое время быть не дос- тупной другим пользователям. Если вы задаете для базы данных Jet некорректную комбинацию параметров Cur- sorType/LockType, Jet автоматически открывает набор записей, используя кор- ректный тип LockType для заданного параметра CursorType. Для баз данных Jet корректны следующие комбинации значений параметров CursorType/LockType: adOpenForwardOnly/adLockReadOnly, adOpenKeyset/adLockOptimiStic и adOpenStatic/adLockReadOnly. Изменения записи автоматически сохраняются при использовании метода Up- date, переходе на другую запись или закрытии набора данных. Оптимистическое блокирование (с использованием параметра adLockOpti- miStic) не блокирует запись до момента ее сохранения. Такой подход миними- зирует время, которое запись будет недоступна другим пользователям. Как при оптимистическом, так и при пессимистическом блокировании про- исходит ошибка, если запись нельзя заблокировать. В приложениях, с которыми одновременно работает несколько человек, пользователи могут пытаться одно- временно изменять одну и ту же запись. Процедуры должны иметь возможность разрешать подобные конфликты редактирования, а не просто отображать сооб- щение об ошибке. Осталась 20 минут Обработка ошибок блокирования В процедуру можно включить специальный раздел обработки ошибок, который будет отвечать на возможные ошибки при редактировании набора записей. В ба- зах данных Jet может происходить три типичные ошибки редактирования, коды и описания которых указаны в табл. 10.2. Таблица 10.2. Популярные ошибки блокирования записей Код Сообщение Описание 3218 Запись не может быть изменена, так как за- блокирована Запись уже заблокирована дру- гим пользователем 3197 Механизм баз данных остановился, так как вы попытались изменить одни и те же данные одновременно с другим пользователем Другой пользователь уже начал редактировать запись 3260 Запись не может быть изменена. Запись за- блокирована пользователем или машиной Запись уже заблокирована дру- гим пользователем В листинге 10.1 приведен пример процедуры обработки ошибок блокирова- ния записей в ADO. Листинг 10.1. Обработка ошибок блокирования ProC—Sql_Err Dim Response As Integerf LockCount As Integerf RndCtr As Integer Dim I As Integer Const MULTIUSER_EDIT As Integer = 3197 Const RECORD__LOCKED As Integer = 3218
Select Case CurConn.Errors(0).SQLState Case MULTIUSER_EDIT 1 кто-то уже изменил данные Response = МздВох(”Эта запись изменена другим ” & "пользователем. Сохранить?”, vbYesNo + vbQues- If Response = vbYes Then Resume Else Resume Proc_Exit End If Case RECORD_LOCKED 1 Запись заблокирована LockCount = LockCount + 1 1 Если больше 2 попыток, спросить пользователя, что делать If LockCount > 2 Then Response = MsgBox (’’Невозможно завершить изменение, ошибка" & Err .Description & ” Повторить?’’, vbYesNo + vbQuestion) If Response = vbYes Then LockCount = 1 Else Resume Proc_Exit End If End If 1 Оставить для Windows. DoEvents • Короткая задержка, при каждой ошибке блокирования ’ она становится длиннее. RndCtr = LockCount *2 * Int (Rnd* 3000 + 1000) For I = 1 To RndCtr Next I Resume ’ Попробовать редактирование еще раз Case Else ’ Ошибка другого рода MsgBox "Опмбка ” & CurConn.Errors(0).SQLState & ”: n & Err.Description, vbOKOnly, "ERROR" Resume Proc_Exit End Select Процедура обработки ошибок Proc_Sql_Err оценивает тип ошибки, которая произошла при работе приложения, и пытается решить проблему. Свойство SQLState для текущей ошибки активного соединения возвращает номер ошиб- ки. Оператор Case в процедуре сравнивает значение ошибки SQL с двумя раз- ными кодами ошибок SQL. Вместо использования в программе кодов ошибок (например, 3218, 3197 и 3260), можно применить константы, чтобы сделать их более понятными. Если ошибка произошла вследствие работы многих пользователей (MULTIUSER—EDIT), это означает, что перед завершением обновления другой пользователь уже изменил данные. В окне сообщения пользователь должен вы- брать, как реагировать на данную проблему. Если пользователь выбирает Yes (повторить попытку завершения редактирования), код возвращается к оператору
Update и выполняет его снова. Если пользователь выбирает No, код перемеща- ется на процедуру выхода, и внесенные изменения отменяются. Если ошибка была вызвана проблемой блокирования (RECORD_LOCK), значит, другой пользователь заблокировал данную запись. Операторы в этой ветке про- граммы пытаются автоматически повторить обновление после небольшого про- межутка времени. Процедура Do Events и цикл For Next отсчитывают некото- рое время, т.е. процедура ’’ждет”, прежде чем вернуться и повторить оператор Update. Процедурой ошибок подсчитывается количество повторений процесса редактирования. Если происходит третья попытка повторить редактирование, выводится окно сообщения. Таким образом, пользователь должен решить, следу- ет ли далее повторять попытки изменений данных. Подробнее о программах обработки ошибок см. урок 16. Блокирование нескольких записей В наборе записей из базы данных Jet можно заблокировать несколько запи- сей. В базе данных Jet блокирование набора записей блокирует раздел записей в таблице, называемый страницей. Страница содержит около 4 Кбайт данных. Если размер текущей записи таблицы меньше 4 Кбайт, будут блокироваться и соседние записи причем до тех пор, пока общий размер заблокированного фрагмента данных не достигнет размера страницы. Jet позволяет также заблокировать одну запись. Такой способ блокирования на- зывают блокированием на уровне записи (record-level locking). В Access выберите Сервис^Параметры (Tools^Options), щелкните на вкладке Другие (Advanced) и за- дайте параметры блокирования для всей базы данных. По умолчанию установлен флажок Блокировка записей при открытии БД (Open Databases Using Record-Level Locking). Если его снять, Jet при редактировании будет блокировать всю страни- цу данных. Помните, что страница может содержать одну или несколько записей. Когда Jet блокирует страницу, содержащую несколько записей, блокируются все запи- си на странице, даже если редактируется только одна из них. Чтобы включить блокирование на уровне записи, установите флажок Блокировка записей при открытии БД на вкладке Другие в диалоговом окне Параметры (рис. 10.2). Чтобы использовать блокирование на уровне страницы (page-level locking), снимите флажок Блокировка записей при открытии БД. Если вы примените блокирование на уровне страниц, то тем самым уве- личите скорость работы приложения. Однако в приложении, в котором одно- временно осуществляется несколько операций с данными, могут возникать конфликты редактирования. Достаточно велика вероятность того, что два пользователя одновременно попытаются редактировать данные на одном и том же фрагменте размером в 4 Кбайт. Если вы написали хорошую проце- дуру обработки ошибок для ситуации конфликтов редактирования, пользо- ватели, вероятно, не получат сообщений с отказом принять изменения. Од- нако работа системы при повторении попыток сохранить изменения данных заметно замедляется.
Рис. 10.2. Установка параметра блокирования на уровне записи Добавление нескольких записей В хорошо спроектированном приложении доступ конечного пользователя к данным должен быть максимально простым и быстрым. Кроме стандартных окон для ввода данных, где пользователи добавляют и работают с данными в ба- зах данных, практически все приложения содержат процесс одновременной об- работки группы или пакета операций. В примере приложения Check Writer про- цесс создания нескольких чеков обеспечивает форма периодических платежей Recurring Payments. Когда пользователь выбирает частоту выплат и банковский счет в форме Recurring Payments, отображается список периодических платежей, определенных ранее. Пользователь может выбирать из списка один или несколь- ко элементов периодических платежей. Выбрав кнопку Process, вы сможете соз- дать чеки для всех элементов, выбранных в списке. На рис. 10.3 приведена про- цедура ADO для обработки периодических выплат. Когда пользователь щелкает на кнопке Process в форме Recurring Payments, выполняется процедура cmdProcess_Click. Данная процедура проверяет, вы- брал ли пользователь хотя бы один элемент в списке Recurring_Payments, а также указан ли в поле со списком BankAccount номер счета. Процедура откры- вает набор записей под названием rst. Новые записи, которые вносятся в табли- цу tbl_CheckWriter, добавляются в набор rst. Оператор With rst начинает раздел кода, где создаются новые записи таблицы Check Writer. Оператор For Each используется для выполнения указанных в нем операторов только над теми элементами, которые были выбраны пользователем в списке Recur- ring_Payments. Свойство ItemsSelected данного списка указывает, какие элементы были выбраны пользователем. Операторы между For Each и Next вы- полняются один или несколько раз, пока не будут обработаны все выбранные элементы. Оператор .AddNew создает в наборе записей новую пустую запись. Операторы, начинающиеся со слова .Fields, обновляют поля новой записи сле- дующей информацией. Поле типа транзакции TransType устанавливается равным "Check", по- скольку данная транзакция является платежом.
Номер счета AccountNumber устанавливается равным банковскому счету, выбранному в форме Recurring Payments. Рис, 10.3. Добавление пакета записей 'i • Номер чека CheckNumber устанавливается равным следующему возмож- ному номеру чека, который возвращает функция dbc^CheckNum. • Дата CheckDate устанавливается равной текущей дате. • Поле получателя Payee устанавливается равным имени получателя из списка Recur г ing_Payment s. • Поле Memo устанавливается равным информации комментариев из списка Recurring_Payments. • Поле Voucher устанавливается равным строке, полученной в результате конкатенации всех указанных выше данных. Оператор .Update копирует все новые записи в наборе записей . rst в табли- цу tbl_CheckWriter. Данный пример иллюстрирует использование коллекции Fields набора запи- сей для обновления значения каждого поля. Синтаксис для работы с коллекцией Fields выглядит следующим образом. <имя_набора_записей>. Fields (<имя поля (в скобках) >)
Эти операторы можно записать иначе: <имя_набора^записей> ! <имя поля (в кавычках) > Например: rst!TransType Однако будьте внимательны при использовании коллекции Fields с набором записей. Если название поле задано неправильно, ADO попытается добавить поле в соответствующую таблицу, когда процедура выполняет метод Update. Обновление записей Изменение записи в таблице подобно процессу добавления новой записи. Что- бы изменить поле в таблице с помощью ADO, необходимо просто присвоить новое значение необходимому полю. На рис. 10.4 показана процедура ADO для измене- ния полей LastBankStatementDate и LastBankStatementBalance в таблице tbl BankAccounts. — Форма frm_CheckReconciliation— это несвязанная форма. Поля, которые должны быть обновлены с помощью поля Bank Balance этой формы, находятся в таблице tbl_BankAccounts. Для редактирования полей таблицы tbl_BankAccounts необходимо использовать процедуру, поскольку таблица tbl_BankAccounts не связана с формой. h' Аудите ьопрсх л Microsoft Visual basic CheckWf iter [f-oi m^CheckReconcilialion ((ode)] lRec<xt_Dtsptay Private Sub Bank_Balance_AfterUpdate () Dim rst As New ADODB, Recordset Dim SQLStmt Аз String On Error GoTo ErrorHandler SQLStmt - "SELECT {LastBankStatementDate] , [LastBankStatementBalance] FROM [tblBankA rst.Open SQLStmt, CurrentProject.Connection, adOpenDynamic, adLockBatcbOptimistlc rst* [LastBankStatementDate] — Date rst! [LastBankStatementBalance] = Me .Bank_Balance rst.Update rst.Close Set rst » Nothing GoTo Done ErrorHandler: MsgBox Err.Description Done; Puc, 10,4, Обновление записи с использованием ADO Когда пользователь вводит сумму банковского баланса в форме Check Reconciliation, выполняется процедура Bank_Balance_AfterUpdate, которая изменяет значения полей LastBankStatementDate и LastBankStatementBal- ance в таблице tbl_ВankAccounts. Поле LastBankStatementDate в таблице tblJBankAccounts устанавливается равным текущей дате. Поле LastBank- StatementBalance будет равно сумме, которая введена в поле Bank Balance формы Check Reconciliation. При выполнении метода Update сохраняются изменения, внесенные в табли- цу tbl_BankAccounts.
В ADO набор записей автоматически открывается в режиме редактирования. Ме- тод Edit не требуется задавать явно. Однако чтобы изменить поля в наборе запи- сей, этот набор должен быть доступен для редактирования. Перемещение по набору записей При редактировании записи в наборе записей убедитесь, что этот набор вообще осталось содержит записи, и что вы находитесь на той, которая вам необходима. В проце- юмпнут дуре Bank_Balance_AfterUpdate (см. рис. 10.3) критерий поиска указывает, что оператор SQL для процедуры выдает набор записей, содержащий единствен- ную запись, на основании первичного ключа таблицы tbl BankAccounts — BankAccountNumber. Однако другие наборы записей могут содержать любое ко- личество записей. Если полученный в результате запроса набор записей не содержит записей, свойства начала (BOF) и конца файла (EOF) равны True. При открытии набора за- писей, содержащего одну или несколько записей, первая запись автоматически становится текущей, а оба свойства — BOFh EOF — равны False. В листинге 10.2 представлены некоторые методы, которые можно использо- вать для перемещения по записям в наборе записей. Листинг 10.2. Перемещение по набору записей Public Sub Noving_Methods () Dim PayeeTB As NewADODB.Recordset 4 PayeeTB.Open " tbl_Payees, Currentproject.Connection, asOpenStatic, adEockReadOnly If Not PayeeTB.EOF Then With PayeeTB ( .MoveFirst MsgBox "Получатель: " & ’Payees, vblnformation .MoveNext If Not .EOF Then MsgBox "Получатель: " & ’Payees, vblnformation End If .MovePrevious MsgBox "Получатель: " & 1 Payees, vblnformation .MoveLast MsgBox "Получатель: " & ’Payees, vblnformation End With End If PayeeTB.Close Set PayeeTB = Nothing Exit Sub End Sub В процедуре Moving__Methods для перемещения по набору, состоящему из не- скольких записей, используются методы MoveFirst, MoveNext, MovePrevious и MoveLast. Обратите внимание, что после оператора MoveNext программа вы- полняет проверку состояния свойства EOF. Если свойство EOF равно True, при попытке получить доступ к данным из набора записей или перейти на следую- щую запись набора произойдет ошибка. Вы можете двигаться по набору записей в обратном направлении. Однако в этом случае обязательно проверьте, что свойство CursorType поддерживает такое направление перехода по записям.
Обновление нескольких записей Форма frm_CheckWriter содержит флажок Print Check, который предназна- чен для подготовки чека к печати. Пользователь может просматривать и выби- рать чек для вывода на печать. Кнопка Print на форме Check Writer открывает диалоговое окно печати под названием frm_DialogCheckPrint. В данном окне находится параметр для печати выбранных ранее чеков. Флажок Print Check для этих чеков в форме Check Writer остается установленным и после вывода чеков на печать, что позволяет пользователю повторить печать чеков, если первая попыт- ка по какой-либо причине оказалась неудачной. Прежде, чем приступить к очи- стке поля Print Check выведенных на печать чеков, просмотрите каждый чек в форме Check Writer и снимите флажок Print Check. Вы также можете выбрать команду Clear Print Marks, чтобы автоматически убрать все флажки счетов, пред- назначенных для вывода на печать. На рис. 10.5 показана процедура ADO для очистки полей Print Check для нескольких записей таблицы tbl CheckWriter. Private Sub cmdClearMarks_Click () Dim cnn As ADODB.Connection Dim CheckTB Аз New ADODB. Recordset Dim SQLStmt As String On Error GoTo ErrorHandler RunCoramand acCmdSaveRecord Set cnn « CurrentProject.Connection Set CheckTB - New ADODB.Recordset CheckTB.CursorType - adOpenKeyset CheckTB.LockType ~ adLockOptimistic SQLStmt » «SELECT Print FROM cbl_CheckWriter WHERE [AccountNumber] - •" ь Me’ [BankAc CheckTB.Open SQLStmt, cnn, r , adCxadText Do Until CheckTB.EOF CheckTB![Print] -False CheckTB. Update CheckTB.MoveNext Loop CheckTB.Close Set CheckTB e Nothing Me.Refresh GoTo Done ErrorHandler: MsgBox Err.Description Done: End Sub ___________________ Puc. 10.5. Редактирование нескольких записей Кнопка cmdClearMarks в форме f rm_CheckWriter выполняет процедуру cmdClearMarks_Click, сохраняющую текущую запись в форме Check Writer. Для процедур, выполняемых из форм ввода данных, в которых могут ожидать за- вершения операции изменения данных, советуем явно сохранять запись перед вы- полнением какого-либо кода, редактирующего данные формы.
Далее процедура cmdClearMarks Click открывает набор записей, содержа- щий все значения поля Print в таблице tbl__CheckWriter. Если в наборе запи- сей находятся записи, то операторы внутри цикла Do будут выполнены. Операто- ры в цикле Do устанавливают значение поля Print для всех записей в наборе равным False. После закрытия набора записей оператор Me, Refresh обновляет данные в форме Check Writer, чтобы отобразить изменения в таблице. Удаление записи Команды ADO могут использоваться для удаления записи из таблицы дан- ных. Чтобы удалить запись, применяется метод Delete. В листинге 10.3 показа- на процедура ADO для удаления банковского счета. Листинг 10.3. Использование ADO для удаления записи Public Sub Delete_Click () On Error GoTo Delete—Err Dim BankTB As New ADODB.RecordSetf Response As Integer Response = МздВохС’Вы уверены, что хотите удалить этот ” & "счет?”, vbQuestion + vbYesNo) If Response = vbYes Then BankTB.Open "SELECT * FROM BankAccounts WHERE " & BankAccountNumber == ”"" & Me!BankAccountNumber & ”” " " , Currentproject.Connection, adOpenKeySet , adLockOpti- mistic If Not BankTB.EOF Then With BankTB .Delete End With End I f BankTB.Close Set BankTB = Nothing End If Exit Sub Delete_Err: MsgBox ("Ошибка: ” & Err .Description) Exit Sub End Sub При создании операторов SQL вы сможете представить кавычки, если используете двойной набор кавычек. Например: "...WHERE [LastName] = «”« & CustName & »••••«, Перед методом Delete не применяется метод Edit, а после него — метод Update. После выполнения метода Delete запись навсегда удаляется из набора записей. После удаления запись остается текущей в наборе записей. Но если вы попы- таетесь получить данные из этой записи, произойдет ошибка. После перехода на следующую запись к удаленной записи вернуться уже будет невозможно. Создавая код для удаления записи из таблицы, убедитесь, что ни одна запись в другой таблице не связана с текущей записью. В хорошо спроектированной базе данных связи между таблицами защищены с помощью целостности ссылок
(referential integrity). На рис. 10.6 представлена связь, определенная между таб- лицами tbl—BankAccount s и tbl_ Checkwrit er. Рис. 10.6. Установка целостности ссылок в Access Значения поля AccountNumber в таблице tbl__CheckWri ter должны соответст- вовать значениям поля BankAccountNumber в таблице tbl_BankAc counts (рис. 10.6). Другими словами, нельзя удалить строку в таблице tbl_BankAccounts, если ее номер счета находится в таблице tbl—CheckWriter. Некоторые программисты не пользуются окном Relationships (Связи) в Access для определения целостности связей для баз данных, а просто применяют код Visual Basic, чтобы проверить целостность таблиц перед удалением записи. В листинге 10.4 показана процедура Delete_Click, переписанная с учетом кода, проверяющего целостность ссылок. Листинг 10.4. Проверка целостности ссыпок Public Sub Delete__Click () On Error GoTo Delete—Err Dim BankTB As New ADODB.Recordset, Dim CheckTB As New ADODB.RecordSet, Response As Integer Response = MsgBox ("Вы уверены , что хотите удалить этот" & " счет?", vbQuestion + vbYesNo) If Response = vbYes Then CheckTB.Open "SELECT TransID FROM tbl_CheckWriter WHERE Ac- countNumber « ” " " & _ Me!BankAccountNumber & " " " " , _ CurrentProject .Connection, adOpenForwardOnly , adReadOnly If Not CheckTB.EOF Then MsgBox "Вы не можете удалить эту запись , так как в таблице CheckWriter есть связанные поля.", vbCritical, "Ошибка удаления" Else BankTB.Open "SELECT * FROM BankAccounts WHERE " & _ BankAccountNumber = "”" & _ Me!BankAccountNumber & " " " ", _ Cur rent Pro j ec t. Connection, adOpenKeySet, adLockOptimistic
If Not BankTB.EOF Then With BankTB .Delete End With End If BankTB.Close Set BankTB = Nothing End If CheckTB.Close Set CheckTB = Nothing End If Exit Sub Delete_Err: MsgBox ("Опмбка: *• & Err .Description) Exit Sub End Sub Процедура Delete Click в листинге 10.4 открывает набор записей CheckTB, состоящий из значений TransID в таблице tbl CheckWriter, номера счетов ко- торых (значения AccountNumber) совпадают с номером банковского счета, ото- браженного в форме. Если в набор записей CheckTB включены записи (свойство EOF не равно True). В результате удаление данного банковского счета нарушит целостность ссылок. При нарушении целостности ссылок отображается сообще- ние об ошибке, и программа выходит из процедуры. Если же набор записей CheckTB не содержит записей, процедура удаляет данную запись. Использование кода Visual Basic для защиты целостности ссылок базы дан- ных — довольно корректный прием. Однако сам по себе он не предотвратит си- туацию, когда пользователь, открывая таблицу банковских счетов, случайно удаляет запись. Определение целостности ссылок в окне Связи защищает связи "в течение любой операции удаления — непосредственно в таблице или через про- грамму Visual Basic. Недостатком использования встроенной целостности ссылок является сле- дующее: когда событие удаления записи нарушает целостность ссылок, Access отображает собственное сообщение об ошибке. Это может быть необходимо при работе непосредственно в таблице, однако нежелательно, чтобы сообщение Access отображалось из программы, работающей в форме. Таким образом, реко- мендуется использовать оба приема установки целостности ссылок: и встроенные средства Access', и программу Visual Basic. В результате база данных будет пол- ностью защищена, и вы сможете управлять сообщениями об ошибке, которые выводит программа. Готово! Обзор Набор команд ADO обеспечивает мощные возможности разработки приложений Access. Эти концепции могут касаться более сложных тем, однако они использу- ются практически в любом разрабатываемом приложении. В этом уроке рассмат- ривались следующие вопросы. • McrojiAddNew добавляет новую запись в набор записей. • Метод Update сохраняет изменения, внесенные в набор записей. • Метод Update использовать не обязательно, но рекомендуется. 1
• Метод Open включает параметры для открытия набора записей, доступно- го для редактирования. • При пессимистическом блокировании запись блокируется сразу же после ее изменения. • При оптимистическом блокировании запись не блокируется, пока не будет отредактирована. • Блокирование на уровне страницы может блокировать несколько записей, тогда как блокирование на уровне записей блокирует отдельную запись. • Процедуры обработки ошибок используются для разрешения конфликтов блокирования. • Метод Delete удаляет запись из набора записей. • CADO вы можете автоматически обновлять или удалять несколько записей. Проверьте себя 1. Какой метод используется для сохранения записей в наборе записей? (См. раздел "Окончание редактирования новой записи ”.) 2. Назовите два свойства ADO, которые определяют возможность редактирова- ния набора записей. (См. раздел "Открытие набора записей, доступного для редактирования ”.) 3. Какая схема блокирования блокирует запись сразу же после ее редактирования? (См. раздел "Открытие набора записей, доступного для редактирования ”.) 4. Назовите четыре метода для перемещения по записям в наборе записей. (См. раздел "Перемещение по набору записей ”.) 5. Чем метод Delete отличается от методов, используемых для добавления или редактирования записи? (См. раздел "Удаление записи ”.) 6. Какой процесс защищает связанные данные в базе данных? (См. раздел "Удаление записи ”.) 7. Какое свойство определяет выбранные в списке элементы? (См. раздел "Обновление нескольких записей *’.)
ЧАСТЬ Суббота. Утро. Обзор 1. Что такое логическая конструкция ? 2. Перечислите известные вам классы логических конструкций. 3. Что такое вложенный оператор ? 4. Чем отличается цикл Do While от цикла Do Until? 5. Верно ли утверждение, что в объявлении процедуры Public IsWeekdayO нет аргументов? 6. Какие процедуры возвращают значение? 7. Из перечисленных ниже утверждений выберите верные. Использование опе- ратора Option Expliсit в модуле: а. Замедляет работу программы. б. Автоматически объявляет все переменные процедуры. в. Выполняет операторы обработки ошибок в процедуре, когда происходит ошибка приложения. г. Ускоряет выполнение программы. 8. Назовите объект, из которого нельзя вызвать подпроцедуру? а. Форма. б. Отчет. в. Запрос. г. Модуль. 9. Какой из перечисленных ниже объектов считается частью уровня приложения? а. Таблицы. б. Запросы. в. Формы. г. Все указанные выше объекты. 10. Верно ли, что размер страницы в базе данных Jet равен 4 Кбайт? 11. Примером какого типа баз данных является Useful Functions. mda? а. Проект Access. б. Библиотека. в. ISAM. г. Верного ответа нет.
12. Назовите процесс приложения, который обычно вызывает DLL. 13. Какая из перечисленных операций не выполняется командой SELECT? а. Получение отдельных или всех полей. б. Получение полей из одной или нескольких таблиц. в. Изменение значений в группе строк таблицы*. г. Сортировка строк по определенному полю или полям. 14. Верно ли, что оператор UPDATE возвращает группу записей? 15. Как называется специальная объектная- переменная ADO, которая использу- ется для обращения ко всем записям таблицы? 16. Верно ли, что объекты ADO предназначены для работы только с базами дан- ных SQL Server? 17. Верно ли утверждение о том, что при внесении изменений в набор записей ADO оператор Update использовать не обязательно? 18. Как называется блокирование записи сразу же после ее редактирования? 19. Какой из перечисленных типов блокирования ADO не позволяет вносить из- менения в набор записей? a. adLockReadOnly. б. adLockOptimistic. в. adLockPessimistic. г. adLockBatchOptimistic. 20. Если вы не указываете тип набора записей ADO, то какой тип применяется по умолчанию? a. adOpenReadOnly. б. adOpenStatic. / в. adOpenDynaset. г. adOpenForwardOnly.
Ур$К11. . . Ш в-в в—“ “ - — — . . * —_ ' М ** W »-в“ — 1* ? ***• WW « — — - — — — — Перемещен иёШШфРзШкению сиспбльзбааннемЗШббйнных - - -а г ж-*--—-— —, ч 1 . „ г - «--;—,-ъ-.- ^ф&рМ/СЙециадьН^/ШВЬО> : : .с _<В СЁ&ЙП ' J^OgUi^^f ~;Z±.; Z Урок 12^^^jZ " ":z;zz:: ЙСг1длЬзованиё.Шё£Ш1ённых фЬрм .: л " Урок 13. LZf O^ZZ g ..:: . r . ~ <z- Прргррммцр^ванр^^зементоё .:-""ё:управленшГ:фла^р^~группа j: яере/йюад/и^е^^ jzl -''У№1Шд4ирвва'нШ}:ш^1к:..... -^- z Урок ..Прбграммр^^^^ :;• и лермдч&ых фор#
УРОК Перемещение по приложению с использованием кнопочных форм, специальных меню и событий клавиатуры Содержание урока * Создание кнопочной формы приложения * Добавление функциональных элементов кнопочной формы * Добавление в приложение специальных меню < Использование событий клавиатуры Э Каждое приложение должно содержать средства для легкого перемещения меж- ду его компонентами. Один из способов решения этой задачи — создание интер- фейса пользователя, предлагающего доступ пользователя к другим формам или зоминут функциям приложения. Такой тип интерфейса обычно называют кнопочной формой (switchboard). Кнопочная форма — это, по существу, один из типов сис- темы меню. Одна из разновидностей кнопочных форм основана на обычной фор- ме. Она состоит из набора кнопок, обеспечивающих доступ к другим формам и функциям приложения. Существует еще один метод перехода по приложению — использование спе- циальной системы меню. Можно создать специальную строку меню, аналогич- ную используемой в Microsoft Access, которая будет обеспечивать доступ к раз- личным компонентам приложения.
В данном уроке рассматриваются способы создания стандартной кнопочной формы и добавления в нее ссылок на компоненты приложения. Кроме того, вы научитесь создавать собственную систему меню. Наконец, речь пойдет об исполь- зовании событий клавиатуры, которые обеспечивают возможность быстрого пе- рехода по кнопочной форме или системе меню без использования мыши. Создание специальной кнопочной формы приложения Кнопочная форма (switchboard) приложения обычно представляет собой фор- му, которая позволяет переходить на другие компоненты приложения. Можно даже создать главную кнопочную форму, из которой пользователь будет попадать на другие дополнительные кнопочные формы, например, форму ввода данных, форму отчетов или форму утилит. Кнопочная форма содержит различные типы объектов: метки, текстовые поля, вкладки, списки, кнопки или элементы управ- ления ActiveX. Размещенные в форме элементы управления выполняют ряд функций, в том числе следующие. • Открывают форму. • Выводят отчет на печать. • Запускают запрос. • Запускают макрос, функцию или подпроцедуру. На рис. 11,1 показана кнопочная форма для приложения Check Writer под названием frm MainMenu. Она отображается автоматически при запуске прило- жения и содержит девять кнопок, при щелчке на которых открываются другие формы приложения. Одна из кнопок используется для закрытия приложения. В других областях кнопочной формы находятся логотип продукта, название приложения и название компании. Рис. 11.1. Кнопочная форма приложения Check Writer Создать простую кнопочную форму довольно легко — выполните следующие действия. 1. Создайте новую форму. Вы будете работать в представлении Конструктор (Design).
2. Задайте форму так, чтобы на ней не отображались полосы прокрутки или средства выбора записей. 3. Создайте заголовок и подзаголовок, добавив в форму текстовые поля и метки. Можно вручную ввести заголовки и другую информацию, которая должна отображаться на форме, либо установить источник записи, указывающий на таблицу или запрос, который содержит необходимую информацию. Напри- мер, в кнопочной форме frm_MainMenu источник записи установлен на таб- лицу tbl_Preferences, что позволяет отображать название компании в том виде, в котором оно представлено в поле Company Name формы Setup. 4. При желании добавьте логотип компании и другие необходимые рисунки, поместив в форму графический объект или фрейм несвязанного объекта. В кнопочной форме Check Writer рисунок располагается в левой части формы и одновременно служит ссылкой на окно About. Ссылка устанавливается пу- тем добавления следующей строки кода в событие On Click этого рисунка: DoCmd.OpenForm ”f rm_About" 5. Добавьте командные кнопки для всех основных функций приложения, к ко- торым должны иметь доступ пользователи. Разместите эти кнопки так, что компоненты формы было удобно использовать. Каждая командная кнопка должна содержать код для выполнения своей функции. Например, при щелчке на кнопке New BankAccount мастер выполняет следующие действия. Private Sub cmdNewBankAccount_Click() DoCmd. OpenForm 11 frm_AddAccountWi z ard " End Sub Это пример простой кнопки: по щелчку она открывает форму мастера AddAccountWizard. Другие кнопки могут выполнять более сложные функции, на- пример, проверку ошибок или функции поиска и соответствия. Как видно из листинга 11.1, событие Нажатие кнопки (OnClick) для кнопки Check Reconciliation содержит более сложные функции. Листинг 11.1. Событие Нажатие кнопки для кнопки Check Reconciliation Private Sub cmdCheckReconciliation_Click() If cls_Setup.GetSetup ("Default BankAccount Number") <> " " Then DoCmd. OpenForm "frm__CheckReconcil iation" If dbc_NumberUnReconciled!tems(cls^Setup.GetSetup("Default Bank Account Number")) = 0 Then MsgBox "В данном счете нет элементов для погашения", vbCr.itical, "Не найдено записей" Bad If End If Exit Sub Добавление "умных"элементов в кнопки Кнопки на кнопочной форме могут просто открывать форму или выполнять определенную функцию, однако можно также создать кнопки с более "умными" функциями: обработкой ошибок, открытием наборов записей или выполнением других действий перед открытием формы. I
Дополнительно об обработке ошибок см. урок 16. Вернемся снова к листингу 11.1. Когда пользователь щелкает на кнопке Check Reconciliation, программа проверяет поле DefaultBankAccountNumber в таблице tbl_J?references, чтобы удостовериться, что был введен номер счета по умолчанию. Если номер счета был введен, форма открывается и отображает транзакции для данного счета. Public Function dbc__NumberUnReconciledIterns (dbc_Def aultBankAccountNumber) As Integer Dim rst As New ADODB.RecordSet On Error GoTo ErroHandlef rst.Open "SELECT AccountNumber FROM tbl_CheckWriter WHERE_ AccountNumber = " & Chr(34) & dbc_DefaultBankAccountNumber & Chr(34),e Currentproject.Connection, adOpenStatic If rst.EOF Then dbcJNumberUnReconciledltems = 0 Else rst.MoveLast dbcJNumberUnReconciledltems = rst.RecordCount End If rst.Close GoTo Done ErrorHandler: MsgBox Err.Description Done: End Function Вторая проверка выполняется для того, чтобы определить, существуют ли транзакции для введенного счета. Если в счете отсутствуют транзакции к пога- шению, то отображается окно сообщения, уведомляющее об этом пользователя. Создание пользовательского меню Существует еще один способ создать средства перемещения по приложению: создайте специальную строку меню. В меню можно добавить команды, соответ- ствующие функциям приложения. Кроме того, специальная строка меню зачас- тую используется одновременно с кнопочной формой — в таком случае пользова- тель будет иметь два альтернативных способа выбора элементов, представленных на кнопочной форме. На рис. 11.2 показана кнопочная форма Check Writer со специальной строкой меню. Обратите внимание, что эта строка меню заменяет строку, используемую в форме по умолчанию. Каждый из пяти элементов (File, Forms, Reports, Utilities и Help) открывает подменю. Вы можете просмотреть данную форму, открыв форму под названием frm_MainMenuwithBar в файле примера, находящегося на сопро- вождающем Web-узле. Добавить специальное меню в форму несложно. Существует два способа соз- дания специальных меню в Access. • Использовать объект Access CommandBar. • Применить макросы.
Рис. 11,2. Кнопочная форма со специальной строкой меню мощью макросов. В Access 2.0 и Access 95 существовал только один способ создать меню — с по- Создание строки меню Чтобы создать специальную строку меню (см. рис. 11.2), сначала необходимо создать элементы верхнего уровня, т.е. пять пунктов меню: File, Forms, Reports, Utilities и Help. 1. Создайте меню верхнего уровня, выбрав команду Вид^Панели инструментов^ Настройка (View^Toolbars^Customize). Диалоговое окно Настройка (Customize) представлено на рис. 11.3. Рис. 11.3.Диалоговоеокно Настройка
Диалоговое окно Настройка содержит три вкладки. • Панели инструментов (Toolbars). Включает все панели инструментов, в том числе встроенные панели инструментов и панели, созданные пользо- вателем. Используйте эту вкладку для создания новых панелей инстру- ментов или изменения существующих. • Команды (Commands). Содержит отсортированные по категориям коман- ды, которые можно добавлять в меню и панели инструментов. Параметры (Options). Обеспечивает различные параметры для персональ- ной настройки панелей меню и панелей инструментов. 2. Чтобы создать новую панель меню, щелкните на кнопке Создать (New) на вкладке Панели инструментов диалогового окна Настройка. Появится диало- говое окно, в котором необходимо ввести название строки меню, в данном случае — CheckWriter. Если процесс создания панели меню завершен, то в центре экрана появляется небольшой серый прямоугольник. Он представляет только что созданную па- нель меню. Название новой панели меню появляется внизу списка панелей инструментов. 3. Перед добавлением функций и команд в меню необходимо решить, какой тип меню будет создан. Выберите новую строку меню на вкладке Панели инструментов в диалоговом окне Настройка и щелкните на кнопке Свойства (Properties). Окно Свойства панели инструментов (Toolbar Properties) приве- дено на рис. 11.4. Рис. 11.4. Диалоговое окно Свойства панели инструментов Можно выбрать один из следующих типов панели. • Строка меню (Menu Ваг). Используется для раскрывающихся меню с ко- мандами, которые содержат текст или рисунки. • Панель инструментов (Toolbar). Применяется для кнопочных панелей, к'оторые содержат только рисунки. • Контекстное меню (Popup). Используется либо для меню с раскрывающи- мися списками, либо для контекстных меню. Меню этого типа могут со- держать и рисунки, и текст. 4. Чтобы создать меню, выберите вариант Строка меню. Впоследствии вы смо- жете задать еще несколько параметров. Выберите все параметры, которые решили применить к меню. Если вы не хотите, чтобы пользователь мог изме-
нять вид меню или другие параметры, снимите соответствующие флажки. Окончив настройку, щелкните на кнопке Закрыть (Close). Добавление подменю в строку меню сталось О минут Большинство команд меню размещаются в подменю. Практически никогда не случается такого, чтобы в меню верхнего уровня размещались какие-либо ко- манды, кроме подменю. Подменю содержит все элементы меню, по щелчку на которых и выполняется необходимое действие — открытие формы или вывод от- чета на печать. Чтобы создать подменю, выполните следующие действия. 1. Отобразите диалоговое окно Настройка, щелкнув правой кнопкой мыши на строке созданного главного меню, затем выберите команду Настройка (Customize). 2. Щелкните на вкладке Команды (Commands) и выберите Новое меню (New Menu) внизу списка Категории (Categories). 3. Выберите элемент Новое меню в области Команды (Commands), после этого перетащите его из диалогового окна Настройка на созданную строку меню. В строке меню появится текст Новое меню. 4. Щелкните на нем еще раз, и вокруг названия появится прямоугольник — это подменю (рис. 11.5). Чтобы изменить название нового подменю, щелкните на нем правой кнопкой мыши и введите другое имя а поле Имя: (Name). В нашем примере измените название New Menu на Help. Рис. 11.5, Новая строка меню Повторите описанные выше действия для каждого подменю, которое хотите добавить в строку меню. Когда все подменю будут добавлены в строку главного меню, можно поместить в них команды. После добавления подменю в строку меню нельзя изменить ее тип: сделать пане- лью инструментов или контекстным меню» Добавление команд в подменю Вы сможете добавить команды в созданное меню, если переместите наперед заданные стандартные команды в строку меню либо разместите в ней свои таб- лицы, запросы, формы, отчеты или макросы. Кроме того, в строку меню можно добавить собственные элементы управления ActiveX. Перед добавлением эле- ментов необходимо вначале создать соответствующие им функции. Если исполь- зуются предопределенные команды, все необходимые действия и параметры этих команд будут созданы без вашего участия. Тем не менее, если только вы не планируете использовать действие, которое уже существует в каком-либо меню Access, вам придется создать собственные меню: сначала создайте новую панель, а затем сделать ее панелью меню (см. предыдущий раздел). Если открыто диалоговое окно Настройка, можно добавить в свое меню команды из другого меню, просто щелкнув на строке меню или панели инструментов. Существует и другой вариант: щелкните на контекстном меню (оно отображается по щелчку правой кнопкой мыши), содержащем команду, которую требуется переместить или скопировать. Используйте клавишу <Ctrl>, выбирая команду для копирования.
В созданные пустые подменю строки меню можно перетащить элементы управления. Например, чтобы отобразить справочное диалоговое окно About в подменю Help, выполните следующие действия. 1. Выберите команду Вид ^Панели инструментов^Настройка, чтобы открыть диалоговое окно Настройка, и щелкните на вкладке Команды. 2. В списке Категории выберите Все формы (All Forms). 3. В списке Команды перейдите к frmAbout и перетащите этот элемент на подме- ню Help. Обратите внимание, что под текстом заголовка подменю Help ото- бражается серое поле. Переместите элемент frm_About в эту область, чтобы он отображался в подменю Help. Если вы переместили или скопировали команду во встроенное меню (например, меню Правка (Edit)), данная команда будет отображаться в меню Правка во всех представлениях, в которых содержится данное меню. На рис. 11.6 показана специальная строка меню, в подменю Help которой бы- ла добавлена форма About. Рис. 11.6. Главная строка меню с подменю Если просто перетащить и оставить элемент на панели меню, он будет иметь вид команды главного меню. Чтобы элемент находился в подменю, необходимо помес- тить его в серую область под названием "подменю". По умолчанию название формы используется как название элемента меню. Его можно изменить, щелкнув правой кнопкой на элементе меню и задав новое название в поле Имя: контекстного меню. Когда пользователь выбирает About из меню Help, Access открывает форму About автоматически, поскольку при каждом добавлении в подменю уже сущест- вующего объекта Access руководствуется предположением, что объект должен быть открыт, поэтому добавляет соответствующее действие в команду. Если не- обходимо выполнить другое действие, измените свойство Действие (On Action) в диалоговом окне Свойства (Properties) для выбранного элемента (подробнее см. следующий раздел). Установка свойств элементов меню и команд Каждая команда или элемент меню, добавленный в подменю, содержит собст- венное контекстное меню, которое позволяет задавать свойства элемента. Для вывода на экран контекстного меню следует щелкнуть правой кнопкой мыши на элементе, требующем изменений. В контекстном меню представлено несколько возможных вариантов действий, например, возможность удалить команду, доба- вить в команду рисунок, добавить гиперссылку или изменить свойства команды. Эти варианты обеспечивают достаточно гибкие возможности управления поведе- нием элементов меню. После того, как вы добавите элемент в меню, выполните перечисленные ниже действия, чтобы отобразить диалоговое окно свойств и добавить в эле- мент меню рисунок.
1. Отобразите диалоговое окно Настройка. Если оно не открыто, щелкните пра- вой кнопкой мыши на строке меню и выберите в контекстном меню команду Настройка. Это диалоговое окно можно открыть, щелкнув на стрелке справа от строки меню. Выберите Добавить или удалить кнопки (Add or Remove Buttons), а затем — Настройка. Если диалоговое окно Настройка находится на экране, просто внесите изменения в элементы строки меню. 2. Щелкните правой кнопкой мыши на элементе, который хотите изменить — появится контекстное меню. 3. Чтобы добавить рисунок, который будет отображаться рядом с элементом в меню, выберите Изменить значок на кнопке (Change Button Image), как на рис. 11.7. Рис. 11,7.Добавлениерисунка в элемент подменю 4. Выберите рисунок из предложенного списка. Можно создать собственный рисунок и добавить его в команду меню, скопировав его в буфер и выбрав в контекстном меню команду Вставить значок для кнопки (Paste Button Image). Если выбрать элемент Начать группу (Begin a Group), Access поместит горизон- тальную разделительную черту перед данным элементом меню. Можно изменить элементы подменю еще больше, используя их свойства. Щелкните на команде Свойства (Properties) в контекстном меню элемента (см. рис. 11.7). На экране появится соответствующее ему диалоговое окно Свойства (Properties) показанное на рис. 11.8.
Рис. 11,8. Установка свойств элемен- та управления При изменении заголовка изменяется текст, который отображается в меню. На рис. 11.8 обратите внимание на одну особенность: перед словом About в заго- ловке стоит амперсанд (&), который задает "горячую" клавишу для данной ко- манды. После того, как вы откроете меню Help, достаточно лишь нажать <А>, чтобы отобразить форму About. Для определения "горячей" клавиши элемента меню следует поставить амперсанд перед буквой, которую вы решили использовать в качестве "горячей" клавиши. Если вы создадите список макросов Auto Keys, то сможете определить дейст- вие, которое соответствует заданной в окне Свойства комбинации Текст ярлыка (Shortcut Text). Обратите внимание на команду <Ctrl+A> в поле Текст ярлыка. Эта комбинация будет открывать форму About. Списки Auto Keys рассмотрены под- робнее в разделе "Использование автоматических клавиш". Если набору действий присваивается комбинация клавиш, которая уже использу- ется в Access (например, <Ctrl+C> для копирования), новые действия заменяют старое назначение клавиш в Access. Кроме того, можно определить текст подсказки элемента управления, введя текст в поле Всплывающее сообщение (ScreenTip). Самый важный элемент в диалоговом окне Свойства — это Действие (On Action). Оно позволяет задать функцию или макрос VBA, выполняемый при вы- боре данного элемента меню. Если выбран предопределенный элемент меню, данное свойство может быть уже задано. Остальные свойства предназначены для выбора имени файла справки и раз- дела входа в справочную систему, при выборе элемента меню Help. Свойство Параметр (Parameter) используется для указания необязательных параметров при вызове функции VBA.
бегалось 10 минут Присоединение строки меню к форме Если создание строки меню завершено, ее можно присоединить к форме, выпол- нив следующие действия. 1. Откройте форму в представлении Конструктор (Design). 2. Отобразите лист Свойства (Property) для формы, щелкнув на пиктограмме Свойства (Properties) в панели инструментов или выбрав команду Вид1^ Свойства (View^tProperties). 3. Выберите свойство Строка меню (Menu Ваг) и перейдите в раскрывающемся списке к необходимой панели меню (рис. 11.9). При отображении формы в режиме формы (Form) будет отображаться только одна строка меню — вы- бранная вами. Рис. 11.9. Выбор строки меню, которая будет отображаться в форме Можно задать строку меню, которая должна быть отображена в форме, используя код VBA этой формы. Ниже представлен код, отображающий строку меню CheckWriter при открытии формы Preferences. Forms! frm_Preferences .MenuBar = "Check Writer’1 Чтобы отобразить для формы встроенную панель меню, свойство MenuBar уста- навливается равным строке нулевой длины Forms ! frm_Pref erences . MenuBar = •' ” Созданная строка меню может использоваться как глобальная строка меню во всем приложении. При этом пользовательская строка меню заменяет встроенное
меню во всех окнах приложения, за исключением тех, в которых задана альтер- нативная строка меню. В данном случае используется свойство StartupMenuBar. Проще всего задать глобальную панель меню, используя параметры Строка меню (Menu Ваг) диалогового окна Параметры запуска (Startup) (рис. 11.10). Это диалоговое окно можно отобразить с помощью команд Сервис^Параметры запуска (Tools’^Startup). Рис. 11,10, Установка специальной строки меню как глобаль- ной строки меню в приложении Кроме того, вы вправе задать свойство StartupMenuBar, а также другие свой- ства запуска в программе. Если вы используете собственные специальные свой- ства, то перед их установкой проверьте, существует ли данное свойство для объек- та Database. Если оно не существует, его необходимо добавить. Вы можете выбрать один из способов установки исходных свойств формы в программе. Создайте макрос под названием AutoExec и используйте действие RunCode, чтобы выполнить процедуру VBA, устанавливающую свойства. Макрос Auto - Exec автоматически выполняется после загрузки базы данных. • Добавьте код в событие Open первой (начальной) формы базы данных и установите там свойства запуска. Данный метод имеет преимущества перед макросами, поскольку большинство приложений баз данных ис- пользуют тот или иной тип начальной формы. Однако если необходимое свойство содержится в окне Параметры запуска, его гораздо проще задать именно таким образом, не прибегая к командам в коде. Использование событий клавиатуры ЕС ос кольку формы представляют центральную часть большинства приложе- ний, вы должны хорошо разбираться в событиях форм и элементов управления, которые могут использоваться в программе, т.е. вы должны знать, какие собы- тия отвечают за определенные задачи, и уметь управлять поведением форм. Microsoft Access фиксирует около 30 событий форм, каждое из которых имеет свое предназначение. Некоторые из них являются событиями клавиатуры. Им и будет уделено внимание в данном разделе. Перехват этих типов событий часто используется для управления действиями, происходящими в результате нажа- тия определенной комбинации клавиш. Использование событий клавиатуры может облегчить процесс создания приложения, в котором пользователь работает не только с мышью, но пользуется и клавиатурой (например, приложение для кассового терминала).
В приложении могут быть применены три типа событий клавиатуры. Клавиша вниз (KeyDown) Клавиша вверх (KeyUp) Происходит, когда пользователь нажимает клавишу или комбинацию клавиш Происходит, когда пользователь отпускает нажатую клавишу или комбинацию клавиш Нажатие клавиши (Keypress) Происходит, когда пользователь нажимает и отпускает клавишу или комбинацию клавиш 1 Эти события клавиатуры относятся только к формам и элементам управления в ник они не касаются элементов управления на отчетах. Символы клавиатуры для событий передаются в коде ASCII. Определить эквива- лент кода ASCII для каждой клавиши можно с помощью списка Character Set в справочной системе Microsoft Access VBA. Использование событий "Клавишавниз" и "Клавиша вверх" События Клавиша вниз (KeyDown) и Клавиша вверх (KeyUp) используются для установки действий, которые выполняются, когда пользователь нажимает или отпускает определенную клавишу или комбинацию клавиш. Эти события имеют следующий синтаксис (обратите внимание на два аргумента, которые применяются с данными событиями — KeyCode и Shift): Sub имя элeweHTa^KeyDown (KeyCode As Integer, Shift As Integer) Форма I'riryMa inMenu в приложении Check Writer (из приводимого примера) содержит следующий код события KeyDown. Private Sub Form^KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKey6 Then ’ Клавиша F6 MsgBox "Это пример события KeyDown" End If KeyCode = 0 End Sub Когда пользователь нажимает клавишу <F6>, заданную в аргументе KeyCode как vbKeyF6, отображается окно сообщения. Затем аргумент KeyCode устанавли- вается равным 0. Для каждой клавиши на клавиатуре существует своя константа KeyCode. Их список можно найти в справочной системе Microsoft Access VBA. В показанном выше фрагменте окно сообщения будет отображаться в том слу- чае, когда пользователь нажмет <F6>. Предположим, необходимо, чтобы окно сообщения отображалось только при нажатии комбинации клавиш <Ctrl+F6>. В таком случае событие KeyDown будет иметь следующий вид. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = vbKey6 And Shift = acCtriMask Then 1 Клавиша Ctrl + F6 MsgBox "Это пример события KeyDown" End If KeyCode = 0 End Sub Аргумент Shift проверяет состояние клавиш <Ctrl>, <Shift>H <Alt> в момент выполнения события. Включив такую проверку, можно определить комбинацию клавиш, которая применялась пользователем, а уакже узнать необходимое дей- ствие. Для этих трех специальных клавиш используются следующие константы.
acCtrlMask Константа для клавиши <Ctrl> acShiftMask Константа для клавиши <Shift> acAltMask Константа для клавиши <Alt> Каждый аргумент Shift имеет свое числовое значение. Например, для <Ctrl> ис- пользуется значение 2, для <Ctri+Alt> — 6. Список значений для каждого типа кла- виш, применяемых в аргументе Shift, вы найдете в справочной системе Access. Аргументы событий Клавиша вниз, Клавиша вверх и Нажатие клавиши могут использоваться совместно с аргументами для событий Кнопка вниз (MouseDown), Кнопка вверх (MouseUp) и Перемещение указателя (MouscMove). В результате приложение будет работать одинаково для пользова- телей, которые предпочитают работать и с клавиатурой, и с мышью. В некоторых случаях следует определить, что не должно происходить при нажатии пользователем определенной клавиши или комбинации клавиш. На- пример, в Microsoft Access при нажатии клавиши <F11 > отображается контейнер базы данных. Можно предотвратить доступ пользователей к контейнеру базы данных, добавив в событие Клавиша вниз формы следующий код. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If KeyCode = Fil Then 1 Клавиша Fil KeyCode = 0 End If End Sub Теперь, когда нажата клавиша <F11 >, аргумент KeyCode автоматически ус- танавливается равным 0, поэтому событие по клавише по существу, от- ключается. Использование события "Нажатие клавиши" Событие Нажатие клавиши (KeyPress) происходит, когда пользователь на- жимает и отпускает клавишу или комбинацию клавиш, которые соответствуют коду ANSI; при этом форма или элемент управления являются активными. Со- бытие может включать только печатаемые символы, например, <Ctrl> в комби- нации с символом стандартного алфавита или специальным символом, а также клавишу < Про бел > и < Enter >. События KeyPress имеют следующий синтаксис. Private Sub Form_KeyPress(KeyAscii As Integer) В отличие от событий Клавиша вниз и Клавиша вверх, событие Нажатие клавиши не указывает на физическое состояние клавиатуры. Оно определяет символы ANSI, которые соответствуют нажатой клавише или комбинации кла- виш. Поскольку данный тип событий работает только с клавишами ANSI, можно использовать функции Chr и Asc для преобразования аргумента KeyAscii из символа ASCII в эквивалентный символ ANSI или, наоборот, например, следую- щим образом. fkey = Chr(KeyAscii) KeyAscii = Asc(fkey) Если хотите использовать событие клавиатуры для непечатаемых символов (например, функциональных клавиш или клавиш управления курсором), то вам следует работать с событиями Клавиша вниз или Клавиша вверх.
Событие Нажатие клавиши воспринимает один и тот же символ в верхнем и нижнем регистре как разные коды, т.е. как два различных символа. Если пользователь удерживает клавишу, событие Нажатие клавиши происхо- дит несколько раз. Свойство "Перехватнажатия клавиш" Свойство Перехват нажатия клавиш (KeyPreview) применяется для определе- ния свойств формы при работе с клавиатурой. Оно позволяет указать, что события на уровне формы срабатывают раньше, чем события клавиатуры для элементов управления. Свойство Перехват нажатия клавиш по умолчанию имеет значение False (события на уровне формы происходят после того, как срабатывают собы- тия клавиатуры для элементов управления). Если свойство Перехват нажатия клавши устанавливается равным True (рис. 11.11), то сначала событие клавиатуры получает форма, а затем событие клавиатуры срабатывает в элементе управления. Рис, 11,11, Установка свойства Перехват нажатия клавиш Использование макросов AutoKeys С помощью группы макросов AutoKeys можно присвоить заданной клавише или комбинации клавиш определенное действие. Когда пользователь нажимает эту клавишу или комбинацию клавиш, Access выполняет действие. Макросы AutoKeys применяются в тех случаях, когда необходимо выполнить действие для заданных в специальных меню или панелях инструментов "горячих" кла- виш. Выбор "горячей" клавиши на панели меню или панели инструментов при- водит к автоматическому выполнению данного действия. Если вы задаете действие для комбинации клавиш, которая уже используется в Access, оно будет выполняться вместо принятого в Access.
Макрос AutoKeys можно создать следующим образом. 1. Создайте новый макрос. 2. В столбце Имя макроса (Macro Name) введите клавишу или комбинацию кла- виш, для которых требуется задать действие или набор действий. 3. Добавьте действие (набор действий), которые должны выполняться по нажа- тию данной клавиши или комбинации клавиш. 4. Сохраните группу макросов с названием AutoKeys. Новые свойства комбинаций клавиш начинают действовать сразу же после сохранения группы макросов и будут доступны каждый при открытии базы дан- ных. В поле Имя макроса можно выбрать один из нескольких типов присвоения. Возможные типы кодов клавиш перечислены в табл. 11.1. Таблица ИЛ. Присвоение клавиш для макросов Код клавиши Присвоение клавиши ЛВ или "3 {F3} 4F3} +{F3} {INSERT} +{INSERT} {DELETE} или {DEL} -{DELETE} или -{DEL} +{DELETE} или +{DEL} <Ctrl> + любая клавиша буквы или цифры Любая функциональная клавиша <Ctrl> + любая функциональная клавиша <Shift> + любая функциональная клавиша <lns> <Ctrl + Ins> <Del> <Ctrl + Del> < Shift + Del> На рис. 11.12 показаны свойства элемента подменю, расположенного в поль- зовательской строке меню. Обратите внимание, что для этого элемента задана "горячая" комбинация клавиш. Когда пользователь нажимает <Ctrl+A>, должна открываться форма About. 4 Рис. 11.12. "Горячие" клавиши для элемента подменю ।
Если комбинации клавиш не был задан макрос Auto Keys, то при нажатии пользователем данной комбинации клавиш ничего не произойдет. Чтобы дейст- вие выполнялось, добавьте название макроса и действие в список макросов Auto Keys, как показано на рис. 11.13. Рис. 11,13, Добавление имени макроса в группу макросов AutoKeys Готово! Обзор Из данного урока вы узнали о том, что необходимо обеспечить способ удобного пере- мещения пользователя по приложению. Были рассмотрены следующие вопросы. Элементы перемещения по форме создаются двумя способами: путем соз- дания кнопочных форм и специальных строк меню. События клавиатуры для различных форм приложения и их элементов управления могут использоваться для управления разными действиями, включая поведение всей формы. Проверьте себя 1. Назовите способы создания элементов для перемещения пользователя по приложению. (См. разделы "Создание специальной кнопочной формы прило- жения" и "Создание пользовательского меню”.) 2. Какие типы функций могут осуществляться из кнопочных форм? (См. разделы "Создание специальной кнопочной формы приложения" и "Добавление "умных" элементов в кнопки”.) 3. Как создать строку меню? (См. раздел "Создание пользовательского меню”.) 4. Как задать и активизировать "горячую" клавишу для элемента меню или подменю? (См. раздел ’"Установка свойств элементов меню и команд”.) 5. Как сделать созданную строку меню глобальной для всего приложения? (См. раздел "Присоединение строки меню к форме”.) 6. Назовите три типа событий клавиатуры. (См. раздел "Использование событий клавиатуры”.) 7. Как отключить отображение контейнера баз данных при нажатии <F11>? (См. раздел "Использование событий Клавиша вниз и Клавиша вверх”.) 8. Для чего используются группы макросов AutoKeys? (См. раздел "Использование макросов AutoKeys”.)

Использование несвязанных форм Содержание урока 1 v Определение несвязанных форм v Анализ блокирования записей и функциональных возможностей не- связанных форм v Использование программирования ADO для несвязанных форм ✓ Создание простой несвязанной формы j ' Осталось 30 минут Данный урок посвящен использованию несвязанных форм и программированию связанных с ними функций. Формы этого типа требуют значительного объема программирования и являются хорошей основой для изучения программного связывания источников данных. Кроме того, они позволяют подробнее ознако- миться со свойствами и методами формы Access. Что такое несвязанные формы В Access несложно создать форму и связать ее с источником записей. Возможно, стоит повторить это еще раз: В Access несложно создать форму и связать ее с источ- ником записей. Многие функции Access предназначены специально для упрощения дизайна формы и ее использования не только разработчиком, но и конечным пользо- вателем тоже. Немного потренировавшись, пользователь может создать полезную форму, связанную с таблицей или запросом. После этого пользователь получает воз- можность добавлять, редактировать или удалять записи, а также перемещаться меж- ду записями. В Access включены программы-мастера, с помощью которых пользова- тели могут создавать формы. Однако их использование не делает этот процесс проще. Все подобные формы являются связанными. Связанная форма (bound form) — это
форма, которая присоединена непосредственно к источнику записей, предоставляю- щему постоянное соединение и открытое представление данных, в нем содержащих- ся. Связанные формы легко разрабатывать, но этот подход не является лучшим для приложения во время работы программы. Несвязанная форма (unbound form) — это форма, не обладающая постоянным соединением и открытым представлением данных. Такая форма может вести се- бя как связанная, однако вместо того, чтобы поддерживать постоянное соедине- ние, она получает записи по одной по ходу работы программы. Другими словами, программа VBA для формы управляет получением и сохранением данных. Для успешной работы несвязанной формы программа должна выполнять еще много задач. Эти возможности будут рассмотрены далее в настоящем уроке. Преимущества использования несвязанных форм Существует несколько причин для использования несвязанных форм. • Их можно применять для разрешения конфликтов при блокировании за- писей. • Несвязанные формы требуют минимального объема данных, а следова- тельно, улучшают скорость работы программы. • В несвязанных формах можно спроектировать способ отмены изменений, внесенных в ту или иную запись, если пользователь изменит свое решение. • Перед сохранением записи в несвязанной форме можно программно вы- полнить проверку корректности данных, • Все изменения записей контролируются программой, а не Access или зна- чениями свойств (как в связанной форме). • Несвязанные формы необходимы для обработки операций. Однако не всегда следует обращаться к использованию несвязанных форм. Во-первых, для того чтобы создать такие же функции, какими обладают связан- ные формы, потребуется потратить немало сил на программирование. Необходи- мо запрограммировать не только получение и сохранение данных, но и переме- щение по форме, проверку ошибок, проверку корректности данных и другие во- просы. Кроме того, в этом типе форм сложно представить ленточные формы или представление листа данных, что легко осуществимо в связанных формах. Подумайте над следующими аспектами применения несвязанных форм: при их использовании необходимо обрабатывать функции, которые выполняются автома- тически в связанных формах. Эти функции включают блокирование записей, со- единение формы с источником записей, чтение и запись данных, поиск данных. Блокирование записей Использование несвязанной формы позволяет ограничить время, в течение кото- рого запись будет заблокирована. Для связанной формы запись блокируется с того момента, как пользователь начинает вносить первые изменения в первое поле, и до того момента, пока запись не будет сохранена. Данный процесс может занять от не- скольких секунд до нескольких минут. Для несвязанных форм запись блокируется только на доли секунды, которые требуются для того, чтобы ее обновить. Когда за- пись сохраняется в несвязанной форме, необходимо выполнить проверку относитель- но того, была ли она изменена с момента ее получения из источника данных. Это не- обходимо, если запись не была заблокирована при ее загрузке в форму.
Имеет смысл сначала спроектировать форму, основанную на связи с источником записей, тогда элементы управления, имеющие отношение к полям, могут быть легко добавлены на форму. После того, как вы спроектируете вид формы, удалите источник записей и добавьте необходимый код, чтобы форма работала. Функциональные возможности При использовании несвязанной формы потребуется создать программу для реа- лизации следующих функций, которые ранее выполнялись Access автоматически. • Соединение с источником записей. • Выбор/поиск записи или записей из источника записей. • Загрузка элементов управления на форме с данными. • Получение записи (записей). • Редактирование записи. • Сохранениезаписи. • Добавление новой записи. • Удаление записи. Перемещение между несколькими записями, включая переход к первой записи, последней записи, следующей и предыдущей записи. • Отмена изменений, которые были внесены в запись (до ее сохранения). Мы перечислили стандартные функции; в этом уроке для их реализации бу- дет использоваться ADO. Рекомендуется всегда делить программу на модули и делать ее как можно бо- лее гибкой. Следовательно, программа, которую требуется разработать для пере- численных выше функций, должна быть максимально универсальной, чтобы ее можно было впоследствии использовать повторно. Поэтому общие функции раз- мещают в отдельном модуле, а не в модуле класса формы, что позволяет одно- временно использовать общие функции в других несвязанных формах, не повто- ряя их для каждой формы. Программа, которая относится только к форме, должна находиться в модуле формы. Такой подход также сводит к минимуму код формы и позволяет значительно ускорить ее загрузку. Можно создать общую форму, чтобы использовать ее для различных источни- ков записей, но такую задачу мы решать в данном уроке не будем. Чтобы упро- стить пример, мы рассмотрим наборы записей только с одним ключевым полем. Программирование несвязанных форм Программа, рассматриваемая в этом разделе, находится в модуле mod_UnboundFоrmUtilities и форме frm__BankAccountsUnbound приложения чековой книжки. Функции несвязанных форм Модуль mod_UnboundFormUtilities содержит несколько функций, необхо- димых для работы несвязанной формы, включая следующие. dbc_NewRecord dbc_SaveRecord dbcFindRecord Добавляет новую запись Сохраняет текущие данные в форме в новую или сущест- вующую запись Ищет набор записей, соответствующих указанному критерию
dbc__DisplayRecord Получает и отображает выбранную запись dbc__DeleteRecord Удаляет запись dbc_Cl ear Form Очищает все поля формы, содержащиеся в источнике записей dbc_SetEditedFlag Вызывается полем или формой при обновлении Ссылки в несвязанных формах Чтобы использовать все вышеупомянутые функции, несвязанная форма должна Осталось Sb минут содержать элементы управления — текстовые поля, которые загружаются с со- ответствующими значениями, указывают функциям, какие данные должны быть присоединены к полю, и определяют ключевое поле. Эти элементы управ- ления мы будем далее называть X-элементами у пр авл ения формы (X controls) . xProvider xRec ordSet xDataSource xKey В уроках 9 и 10 вы ознакомились с объектами данных ActiveX (ActiveX Data Objects, или ADO). Эти объекты в данном случае используются для со- единения базы данных с источниками данных. Чтобы упростить программу, рассмотренную в данном уроке в качестве примера, эти функции будут огра- ничены единственным ключевым полем. Ключевое поле (или поля) можно получить из определения таблицы ActiveX Data Objects Extensions (ADOX), но в данном случае мы не будем использовать ADOX. Вместо этого необходи- мо предоставить максимум гибкости на случай, если вы будете устанавли- вать соединение с базой данных — не-Jet. Единственная ссылка, необходи- мая в таком случае, — ссылка для объекта ADODB, стандартного объекта библиотеки ActiveX Data Objects. Кроме того, несвязанная форма должна содержать следующие флажки. flagEdited По умолчанию имеет значение False; используется для того, что- бы определить, изменял ли пользователь данные flagFind По умолчанию имеет значение True; используется для того, чтобы сразу же после открытия формы позволить выполнить поиск. Применяется с функцией Find с целью определить, был ли введен критерий для поиска Элементы управления в форме, которые относятся к полям в источнике записей, должны называться так же, как и сами поля. Чтобы задать значе- ния, которые отображаются на форме по умолчанию, нельзя использовать свойство значения по умолчанию, поскольку несвязанные элементы управ- ления автоматически отображают это значение. Вместо этого значения по умолчанию помещаются в свойстве Tag элемента управления; это свойство не используетсяАссе88. Кроме того, для хранения критерия для получения набора записей использу- ется свойство формы Filter. Это свойство можно определить равным начально- му набору записей или оставить пустым. Каждая используемая в программе функция рассматривается подробно, потому что все функции важны для понимания работы несвязанных форм и механизма обработки записей в ADO. Некоторые фрагменты программы также описываются довольно подробно, но объяснения не повторяются для одного и того же кода в разных функциях.
Добавление новой записи Чтобы добавить новую запись в набор записей, определенный X-элементами управления формы, требуется установить соединение с набором записей. Эту за- дачу выполняет функция NewRecord после выполнения проверки возможных изменений или обновления данных в форме (листинг 12.1). Для проверки ис- пользуется элемент управления flagEdi ted. Листинг 12.1. Функция NewRecord Public Function dbc_NewRecord(frm As Form) ’ Добавляет новую запись Dim strConnection As String Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim fid As ADODB.Field Dim ctl As Control Dim vartemp As Variant I On Error GoTo ErrorHandler ’ сбрасывает флаг поиска f если он имел значение frm.FlagFind = False ’ проверяет, были ли изменены данные If frm.FlagEdited Then If MsgBox("Вы хотите сохранить изменения?", vbYesNo) = vbYes Then dbc_SaveRecord frm Else frm.flagEdited = False End If End If 1 открывает соединение cnn.Open frm.Controls("xProvider") & _ frm.Controls("xDataSource") ' открывает пустой набор записей rst.Open "Select * From " & frm.Controls("xRecordSet") & " Where True, cnn, adOpenStatic 1 проходит цикл по всем элементам на форме, которые ’ соответствуют полям в наборе записей For Each ctl In frm ’ если ошибка, поле не на форме On Error Resume Next Err = 0 vartemp = rst.Fields(ctl.Name).Name If Err = 0 Then On Error GoTo ErrorHandler • если элемент активен, установить значение 1 по умолчанию из тега и поставить фокус, 1 если индекс перехода по табуляции равен О If ctl. Enabled Then If IsNull(ctl.Tag) Then
ctl.Value = Null Else ( ctl.Value = ctl.Tag End If If ctl.Tabindex = 0 Then ctl.SetFocus End If End If Next GoTo Done ErrorHandler: MsgBox Err.Description Done: End Function Флаг работает аналогично свойству Dirty форм Access. Всякий раз, когда изменяется значение в поле формы, флаг устанавливается равным True. Эта за- дача выполняется путем добавления вызова функции dbc^SetEditedFlag О в свойство события After Up date для всех элементов управления в форме, кото- рые являются частью набора записей. Если были введены или изменены данные, функция NewRecord отображает сообщение с вопросом, будет ли пользователь сохранять запись. Если он решил сохранить изменения, то вызывается функция dbc SaveRecord, а потом добав- ляется новая запись. Добавление новой записи состоит из трех этапов. 1. Очищение поля формы, установка их на значения по умолчанию, установка фокуса на первое поле. 2. Разрешение пользователю вводить данные. 3. Сохранение записи. ЕСервый шаг осуществляется в функции NewRecord. Затем управление пере- ходит к пользователю. Когда пользователь щелкает на кнопке Save, запись со- храняется с помощью функции dbc_SaveRecord. Обратите внимание, что функция dbc^NewRecord проходит цикл по всем ак- тивным элементам управления в форме, которым соответствуют поля в наборе записей. Таким образом вы сможете избежать очистки тех элементов управления в форме, которые не содержат данных. ЕСосле щелчка на кнопке Save событие Нажатие кнопки (OnClick) этой кноп- ки должно вызывать функцию dbc SaveRecord, передавая ей название формы, содержащей данные. Код этой функции находится в файле примера, в модуле Tnod_UnboundForm- Utilities на сопровождающем книгу Web-узле. Функция сначала выполняет проверку того, изменялись ли данные формы. Ес- ли данные не изменены, программа просто выходит из функции. В противном слу- чае функция открывает соединение с набором записей. Е(ель данного действия со- стоит не в том, чтобы получать какие-либо записи, а просто чтобы определить тип ключевого поля и создать строку критерия. Строка критерия используется для по- иска в наборе записей записи с таким же ключевым полем. В результате функция
сможет определить дальнейшие действия, связанные с обновлением существую- щей или созданием новой записи. Если это новая запись, функция использует метод AddNew и проходит цикл по всем элементам управления в форме, которым соответствуют поля в наборе запи- сей. Затем функция создает запись с новыми данными. Если существует запись с таким же ключевым полем, поля копируются в набор записей, и запись обновля- ется. Кроме того, выполняется проверка на предмет того, имеет ли какое-то поле тип Auto Increment и активно ли поле. Если эти условия выполняются, значение поля обновляться не будет. В данном примере не выполняется проверка для существующей записи: изменял ли ее другой пользователь с того момента, как она была в последний раз получена из источника данных. Для системы с несколькими пользователями необходимо учесть данный момент. После успешного сохранения записи пользователь получает уведомление, и значение flagEdited сбрасывается. Поиск записей Поиск записей можно выполнить с помощью функции dbc FindRecord. Эта функция основана на возможности вводить критерии в форму в любое поле — элемент управления. Функция работает в два приема, согласно значению эле- мента управления flag Find в форме. Если флаг flag Find равен True, форма содержит критерий поиска. Если флаг имеет значение False, форма чиста, и пользователь может ввести критерий. Будет отображено сообщение, в котором пользователя просят ввести критерий и щелкнуть на кнопке Find еще раз, Чтобы получить соответствующие критерию записи. Значение по умолчанию для этого флага можно задать равным True, чтобы при открытии формы пользователь мог сразу же ввести критерий. После завер- шения работы функции критерии сохраняются в свойстве фильтра для формы, их можно в дальнейшем использовать. Функция проверяет, была ли сохранена текущая запись перед очисткой формы для ввода критерия. Код данной функции можно посмотреть в файле примера в модуле mod__UnboundFormUtilitie.s на сопровождающем Web-узле. В программе со- держится параметр, заданный константой AllowAllRecords. При установке он получает все записи из набора записей, если критерии не были заданы. Если кон- станта равна False, пользователь получает предупреждение о том, что критерий не был введен, и в результате поиск не получает никаких записей. Основная часть действия этой функции связана с созданием строки критерия, которая обеспечивает довольно гибкий механизм, с помощью которого пользова- тель может найти запись. Вы вправе использовать любую комбинацию полей в форме — функция создаст критерий с использованием логического оператора AND для всех выбранных полей. Например, в приложении чековой книжки можно ввести название штата, в результате вы получите все записи для этого штата. Если пользователь знает номер счета или банк, то для получения соответ- ствующих чеков можно ввести и эти данные. Идея создания строки критерия со- стоит в том, чтобы найти все поля формы, заполненные пользователем, а затем приступить к поиску типов полей в наборе записей, чтобы определить, как долж- на быть отформатирована строка критерия. Для текстовых полей искомое значение должно быть заключено в кавычки; для дат оно обрамляется символами решетки (#). Для чисел разделительные
Осталось 10 минут символы не нужны. Чтобы создать строку критерия, набор записей открывается без получения каких-либо записей с помощью условия Where, равного False. Затем код проходит цикл по всем элементам управления в форме, которые совпа- дают с названиями полей. Если значение элемента управления не равно строке нулевой длины или не равно Null, то в строку критерия добавляется название поля и его значение. После проверки всех элементов управления набор записей открывается с по- лученным критерием. Если количество записей не равно нулю, строка критерия сохраняется в свойстве формы Filter, и первая запись отображается в форме. Фактическое получение данных и заполнение формы осуществляется с помо- щью функции dbcJDisplayRecorcL Код этой функции находится в файле примера в модуле mod__UnboundFornUtilities. Поскольку записи получают по одной, функция Display Rec ord получает одну запись на основании источника записей, свойства Filter формы и номера записи, который передается в функцию в качест- ве аргумента. Данная информация вам пригодится, если вы захотите заполнить элемент управления в форме (например, посчитать общее количество записей). Перед обработкой данных функция выполняет проверку на изменение поль- зователем каких-либо данных в форме. Если данные были введены и изменены и после этого не сохранены (на что указывает элемент управления flagEdited), пользователь получает напоминание о сохранении элемента управления. Соединение с данными открывается с помощью X-элементов управления и свойства Filter формы (если, конечно, оно существует). Затем функция пере- ходит к указанной записи на основании аргумента intRecord. Как и в предыду- щих функциях, программа проходит цикл по элементам управления на форме, которые соответствуют полям в наборе записей. Таким образом, программа за- полняет значения на форме. Удалениезаписей Функция dbcJDeleteRecord работает аналогично предыдущим. Сначала она выводит подсказку для пользователя, чтобы тот подтвердил удаление записи; по- сле чего функция открывает набор записей и переходит к записи на основании аргумента intRecord. Далее она использует методы Delete и UpdateBatch для выполнения операции удаления. Что будет происходить дальше, определяет программа VBA для вызывающей формы. В нашем примере вызывающая форма отображает первую запись теку- щего набора записей после выполнения удаления. Создание простой несвязанной формы В данном разделе, как и в других примерах, используется приложение Check Writer. Далее мы будем работать с таблицей Bank Accounts. Форма имеет назва- ние frm BankAccountsUnbound и находится в примере приложения на сопро- вождающем Web-узле. На рис. 12.1 показана форма frrnJBankAccountsUnbound в представлении Режим формы (Normal). Данная форма содержит почти все функции, необходимые для добавления, редактирования, удаления и поиска записей. В нижнем колонтитуле формы по- мещен ряд кнопок, с помощью которых можно выполнить эти и другие функции. Кнопка Undo позволяет повторно отобразить запись после внесения в нее измене- ний, по щелчку на кнопке Save. Кнопка Print открывает другую форму приложе-
ния, а также диалоговое окно, содержащее параметры вывода на печать. Нако- нец, кнопка Done закрывает форму и, если запись не была сохранена, выводит соответствующую подсказку для пользователя. Рис. 12.1. Несвязанная форма в обычном представлении При работе с несвязанной формой изменения в записи не сохраняются до тех пор, пока пользователь не щелкнет на кнопке Save. В данной форме разработаны стандартные кнопки перемещения между записями, которые присутствуют в связанных формах Access. Кнопки перемещения между за- писями, применяемые в Access, использовать в данном случае нельзя, поскольку форма не привязана к источнику записей. В форме, кроме всего прочего, содержатся элементы, отображающие номер текущей записи, а также общее количество записей. Поскольку для обработки несвязанных форм разработаны уникальные функ- ции (описанные в предыдущем разделе), в форме должны присутствовать неко- торые специальные элементы управления, невидимые для пользователя. Эти элементы выделяются красным шрифтом и отображаются в правой верхней час- ти формы (рис. 12.2). Свойство Visible для этих элементов управления уста- новлено равным False, поэтому при работе пользователя с формой они не видны. В верхней правой части формы располагается четыре элемента управления, которые мы ранее назвали X-элементами. Они должны иметь специальные на- звания и специальные значения, чтобы программа работала правильно. Ниже показаны значения, которые используются в нашем приложении и хранятся в свойстве источника элемента управления. xProvider = "Provider = Microsoft.Jet.OLEDB.4.О" xDataSource = {устанавливается на событии открытия формы в соответствии с текущим размещением базы данных} xRecordSet = "tbl_BankAccounts” xKey = "BankAccountNumber” Несвязанная форма содержит следующие флажки, которые тоже невидимы; они также расположены в правой части окна. flag Edited по умолчанию имеет значение False. flag Find по умолчанию и*меет значение True.
Рис, 12.2, Несвязанная форма в представлении Конструктор Для оставшихся элементов управления в форме свойство Control Source не задано, кроме того, для формы не задано свойство Record Source. Можно при желании включить фильтр для формы, используя свойство Filter. Каждое поле из набора записей должно иметь элемент управления в форме с таким же назва- нием, как и поле в наборе записей. Значения по умолчанию для этих полей зада- ются в свойстве Tag, а не свойстве Default. Кроме того, элементы управления для полей должны иметь процедуру для* свойства события После обновления (AfterUpdate). Это вызов функции dbc SetEditFlag О , которая устанавливает элемент управления flag Edited при изменении значения поля. Данная форма включает минимальный объем кода. Большая часть кода находит- ся в модуле mod_UnboundFormUtilities. Программа для формы состоит из двух ка- тегорий: подпроцедуры формы (листинг 12.2) и подпроцедуры кнопок (листинг 12.3). При загрузке формы отображается первая запись на основании Х-элементов управле- ния и фильтра. Когда форма закрывается, выполняется проверка элемента управле- ния flag Edited: изменялись ли данные в форме. Если данные были изменены, функция выдает подсказку пользователю для сохранения формы. Листинг 12.2» Подпроцедуры формы Private Sub Form_Load() Me.txtRecordCount = dbc__DisplayRecord (Me, 1) If Me.txtRecordCount > 0 Then Me.txtRecordNumber = 1 Me.FlagFind = False End Sub Private Sub Form_Unload (Cancel As Integer) Dim Answer As Integer If Me . FlagEdu-ted Then Answer = MsgBox("Вы хотите сохранить изменения?", vbYesNoCancel) If Answer = vbCancel Then Cancel = True
If Answer = vbYes Then dbc_SaveRecord Me End If End Sub Каждая кнопка имеет свою подпроцедуру. Эти подпроцедуры используют вызов общих функций, описанных в предыдущих разделах. Кроме того, программа часто работает с элементами управления txtRecordNumber и txt Rec ordCount — это тек- стовые поля, содержащие информацию о номере текущей записи и общем количестве записей. Данные элементы управления используются почти во всех подпрограммах для контроля положения в текущем наборе записей. Листинг 12Л Подпроцедуры кнопок Private Sub cmdDelete_Click() If Not IsNull(Me.txtRecordNumber) Then dbc DeleteRecord Me, Me. txtRecordNumber Me.txtRecordCount = dbcJDisplayRecord(Me, 1) Me.txtRecordNumber = 1 End If End Sub Privat e Sub cmdDone_C 1ick() On Error Resume Next DoCmd.Close acForm, Me.Name End Sub Private Sub cmdFind__Click () Me. txtRecordCount = dbc__FindRecord (Me) If Me. txtRecordCount > 0 Then Me. txtRecordNumber = 1 End Sub Private Sub cmdFirst_Click() Me.txtRecordCount = dbc_DisplayRecord(Me, 1) Me.txtRecordNumber = 1 End Sub Private Sub cmdNew__Click () Me.txtRecordCount = Null Me -txtRecordNumber = Null dbc_NewRecord Me End Sub Private Sub cmdPrevious_Click() If Me.txtRecordNumber > 1 Then Me.txtRecordCount = dbc_DisplayRecord(Me, Me.txtRecordNumber - 1) Me.txtRecordNumber = Me.txtRecordNumber - 1 End If End Sub Private Sub cmdNext^Click() If Me.txtRecordNumber < Me.txtRecordCount Then Me.txtRecordCount = dbc_DisplayRecord(Me, Me . txtRecordNumber + 1) Me.txtRecordNumber = Me.txtRecordNumber + 1 End If End Sub
Private Sub cmdLast_Click() Me.txtRecordNumber = dbc_DisplayRecord(Me, Me.txtRecordCount) End Sub Private Sub cmdSave _Click () dbc_SaveRecord Me End Sub Private Sub cmdUndo_Click() If Me.FlagEdited And Me.txtRecordNumber > 0 Then dbc_DisplayRecord Me, Me.txtRecordNumber Me.FlagEdited = False End I f End Sub Private Sub cmdPrint_Click() DoCmd.OpenForm "yBank Print Dialog" End Sub Готою! Обзор Существует ряд преимуществ применения в приложении несвязанных форм, од- нако можно также назвать и серьезные причины, по которым их лучше не ис- пользовать. В данном уроке рассматривались следующие вопросы. • Несвязанные формы значительно увеличивают эффективность работы приложения, но требуют и значительных усилий по разработке. • При использовании несвязанных форм в программе необходимо дублиро- вать функции, которые для связанных форм Access предоставляет автома- тически. • ADO обеспечивает необходимые функциональные возможности для про- граммирования несвязанных форм. Проверьте себя 4 1. Чем отличается связанная форма от несвязанной? (См. раздел "Что такое не- связанные формы”.) 2. Когда вместо связанных форм лучше применить несвязанные формы? (См. раздел "Преимущества использования несвязанных форм”.) 3. Какие условия необходимо проверять при блокировании записей в несвязан- ных формах? (См. раздел "Блокирование записей”.) 4. Какие функции следует добавить в программу для несвязанной формы, чтобы достичь тех же функций, что и в связанной форме Access? (См. раздел "Программирование несвязанных форм”.) 5. Почему в качестве объекта данных для несвязанных форм лучше использо- вать ADODB, а не ADOX? (См. раздел "Ссылки в несвязанных формах”.)
УРОК Программирование элементов управления: флажок, группа переключателей, список, поле со списком Содержание урока * Обработка выбораTrue/False с помощью флажков * Программирование групп переключателей ✓ Работа со списками и полями со списками * Обработка элементов, которые не определены в списке/поле со списком * Осуществление и обработка множественного выбора в списках 3 Изучить особенности программирования флажков, переключателей, списков и полей со списками, вы сможете без труда разработать интерфейс приложения. Немного таланта, творчества и навыков программирования — и с помощью этих зомш!ут элементов вы сделаете формы более сложными и динамичными. Такие элементы управления можно использовать по отдельности или в сочетании с остальны- ми — для сбора данных, управления видом формы и ограничением или расшире- нием перечня возможных параметров вариантов выбора.
Обработка выбора True/False с помощью флажков Скорее всего, вы уже использовали флажки, группы переключателей выклю- чатели при записи значений типа Boolean. Для информации типа да/нет или True/False эти элементы управления просто идеальны, так как сочетают про- стоту и эффективность. В комбинации с другими командами программы они ста- новятся еще более полезными и представляют собой действительно мощные ин- струменты приложения. В этом уроке приведен пример использования элемента управления "флажок". Те же приемы можно применить к группе переключате- лей или выключателю. На рис. 13.1 и 13.2 показано два образца форма frm_CheckWriter из базы данных Check Writer. В нижней левой части обеих форм расположен флажок Void. В форме на рис. 13.1 этот флажок снят, в форме на рис. 13.2 — установ- лен, а на бланке чека стоит большая печать VOID. Поскольку флажок Void можно не заметить при перемещении с записи на запись, форма спроектирова- на таким образом, чтобы печать отмены чека служила визуальным сигналом для пользователя. Рис. 13.1. В форме frm_CheckWritex/)j/(i.)/c()K Void снят По определению флажок, переключатель или выключатель могут получать только значения True или False, которые соответствуют положительному или отрицательному состоянию этих элементов управления. Так как эти элементы управления небольшого размера их легко не заметить. Поэтому их эффективнее использовать с дополнительными визуальными сигналами, например печатью VOID на чеке. Обязательно учтите это при отображении важной информации (например о том, что чек недействителен).
0oi(E f Uh- Writ.-r Bank Account: 'Mechanics of Boston Jl---------ЙШСШM из *4 (Фильтр) Рис. 13.2. В форме frm_CheckWriter флажок Void установлен, на чеке отображена печать VOID Данный флажок выполняет две функции. Подобно тому, как помечают не- действительный чек в настоящей чековой книжке, такое действие реализуется ив приложении Check Writer. На форме frm_CheckWr iter флажок Void связан с полем, которое тоже называется Void и используется для хранения информации о том, сделана ли недействительной текущая запись чека в таблице. Данный элемент управления ничем не отличается от любого другого связанного элемента управления. На рис. 13.3 показано, как выглядит форма в режиме Конструктор (Design). Если флажок установлен, запись отмечается как недействительная. Программа в событии AfterUpdate для флажка отображает печать VOID на электронном бланке чека, указывающую на то, что чек был аннулирован. Программа листинга 13 Л представляет событие После обновления (AfterUpdate) для флажка Void. Это событие определяет, является ли тип опера- ции чеком, и, кроме того, определяет значение флажка. Отметка VOID становит- ся видимой, если операция выполняется для чека и поле Void равно True. Чтобы включить печать VOID, программа начинается с оператора With и обращается к свойству Со deContext Obj ect. Оператор With используется для того, чтобы не допустить многократного повторения названия объекта, к которому обращается программа. В данном случае это форма frmС lie ck Writer, и обращаться явно к каждому элементу управления на форме уже не требуется. В листинге 13.1 используется два оператора If ... Then. Они работают одина- ково и определяют тип операции для записи. Состояние Void относится только к чекам (Checks) и не касается депозитов (Deposits) или изменений (Adjustments). В первом условии если операция — чек и поле Void равно False или Null, то свойство Visible для печати VOID на чеке устанавливается равным False. Таким образом, эта печать не отображается. Второй оператор If. . .Thenвыпол- няет проверку операции (чек), но ищет значение True, проверяет, что значение
в поле Void не равно Null, и устанавливает свойство Visible для отметки VOID равным True. Печать отображается на бланке чека. Рис. 13.3. Представление Конструктор для формы frm__CheckWriterc уста- новленным флажком и отображенной печатью VOID Листинг 13.1. Событие После обновлениядля флажка Void Private Sub Void_AfterUpdate() On Error GoTo ErrorHandler With CodeContextObjeat If (.[TransType] = "Check" And_ (.Void= False Or IsNull (. Void) ) ) Then . [Void Stamp] .Visible = False Ehd If. If (.[TransType] = "Check" And_ (.Void= True And Not IsNull (.Void) ) ) Then . [Void Stamp] .Visible = True End If End With GoTo Done ErrorHandler: . MsgBox Err.Description Done: End Sub
Не забывайте о том, что в силу визуального сигнала, печати VOID или по ка- ким-то другим причинам состояние определенного поля может изменяться при перемещении от одной записи к другой. А это значит, что форма должна соответ- ственно реагировать на эти изменения. Одна запись может быть аннулирована, а вторая — нет. Следовательно, при перемещении между записями чрезвычайно важно проверять состояние формы и отображать необходимый визуальный сиг- нал. Это действие выполняется в процедуре события формы Текущая запись (OnCurrent). Анализируя программу в событии Текущая запись, вы увидите точно такой же код, как в событии После обновления для флажка Void. Когда пользователь переходит от одной записи к другой, событие Текущая запись сра- батывает и проверяет тип операции и Поле Void. В соответствии с этими условия- ми отображается или не отображается пометка VOID на чеке. В данном примере использован визуальный сигнал для пользователя. Вы можете применить тот же прием в другой программе и с другой целью. Например, в форме расположено поле под названием Locked, и программа блокирует форму на основа- нии значения отдельного поля. Данные элементы управления и приемы могут ис- пользоваться различными способами, для этого необходима только ваша фантазия. Программирование групп переключателей Предположим, что в форме необходим не выбор типа True/False, а более сложные варианты выбора. Тогда обособленность флажков может несколько ог- раничивать функции приложения (например, если пользователь должен выбрать одно из шести значений, а не одно из двух). В такой ситуации следует использо- вать группы переключателей. Флажок может быть связан только с одним полем (делая его значение равным True или False), а группа переключателей предос- тавляет большую гибкость. Выключатели, группы переключателей или флажки используются по отдель- ности или как часть группы (рис. 13.4). В верхней части рисунка находится 2 набора элементов управления. Они имеют разное состояние, когда активны и неактивны. Если эти элементы управления применяются независимо, они могут представлять тип данных из двух состояний True/False или да/нет. При ис- пользовании в группе данные элементы управления становятся одним целым — группой переключателей, где каждый выбранный параметр представляет опре- деленное пронумерованное значение. С технической точки зрения, поле Boolean имееттри состояния: да (True), нет (False) и Null. В материале этого урока мы рассматриваем значение Null для логического значения как False или "нет". Однако в вашей практике програм- мирования могут возникать случаи, когда необходимо будет отличать значение Null от значений нет/False. Помните, что значение Null — это отсутствие значения. Оно может, к примеру, означать, что пользователь решил не выбирать параметр или что параметр был не доступен. Такое значение элемента управления само по себе является важным элементом данных. В нижней части рис. 13.4 изображены три отдельные группы переключате- лей. В данном случае в каждой группе переключателей имеется только три вари- анта выбора. В группе переключателей может быть и другое количество вариан- тов: четыре, пять и больше. Группа переключателей (как одно целое) может иметь только одно выбранное значение и может быть связана только с одним по- лем. Каждая группа переключателей в нашем примере переключается на одно
из трех значений. Такие элементы управления могут быть очень полезны и эф- фективны, когда требуется предоставить несколько значений для выбора, свя- зать выбранное значение с некоторым полем и выполнить на его основании опре- деленное действие. В программе Check Writer представлен целый ряд примеров групп переключателей; два из них мы рассмотрим далее. Рис. 13.4. Примеры группы переключателей и других типов элементов управления Группа переключателей действует именно как группа. В группу переключа- телей может входить любое количество значений для выбора. Однако пользова- тель не имеет возможности одновременно выбрать несколько значений в группе. Группа фиксирует только одно значение, выбранное из нескольких вариантов. На рис. 13.5 показана форма frm__DialogCheckPrint. Она открывается по щелчку на кнопке Print в форме frm_CheckWriter, представляющей диалого- вое окно, которое видит пользователь при выводе чека на печать. В зависимости от выбранных значений, вы можете воспользоваться несколькими условиями и параметрами печати. Форма работает таким образом: пользователь щелкает на кнопке Print в форме frm_CheckWriter. Открывается диалоговое окно Print Checks Dialog, и пользователь видит параметры печати. Первая группа — пара- метры Check Туре (тип чека), для которого можно выбрать одну из трех кнопок- выключателей: бланк с чеком в верхней части, бланк с чеком в нижней части и ленточный лист чеков. Ниже находится группа параметров Print Choices, в которой пользователь мо- жет выбрать один из следующих вариантов: вывести на печать текущий чек, ряд чеков по дате, ряд чеков по номеру чека, чеки, выбранные ранее для печати, или регистр для всех операций или для выбранной даты. Обратите внимание, что при переключении с одного варианта на другой появляются и исчезают дополнитель- ные элементы управления, позволяющие задать дополнительные параметры пе- чати. Кроме того, пользователь может выбрать, нужно ли выводить на печать номера чеков и печатать корешок чека. После установки всех необходимых па- раметров пользователь щелкает на кнопке Print, чтобы начать печать выбранного чека (чеков) или регистра.
Рис. 13,5. Диалоговое окно Print Checks Dialog для программы Check Writer с двумя группами переключателей В данной форме используются две отдельные группы переключателей. В пер- вой, Check Туре, для обозначения стиля чеков применяются кнопки-выключатели. Вторая группа использует шесть переключателей с различными параметрами пе- чати. При установке переключателей Print Date Range или Register Print в форме ак- тивизируются два дополнительных поля: From Date и То Date. Если вы выберете другие варианты печати, эти элементы управления будут не доступны. Обратите внимание на использование рисунков на кнопках-переключателях в Check Туре. В приложении Check Writer были созданы и размещены на кнопках рисунки . bmp для стилей чеков. Добавление рисунков на кнопки — превосходный способ сделать форму и интерфейс более привлекательным для пользователя. Такое применение группы переключателей проиллюстрировано в программе, приведенной в листинге 13.2. В первых строках программы свойство Visible нескольких элементов устанавливается равным False. При работе с формой frmDialogCheckPrint и выборе какого-либо варианта в группе переключате- лей Print Choices появляются и исчезают различные элементы управления. Эти дополнительные элементы управления в первых восьми строках кода были сде- ланы невидимыми. Зачем? Для того, чтобы изменить интерфейс формы при пе- реходе пользователя от параметра к параметру, причем нет необходимости от- дельно проверять, какой параметр был выбран последним. Все элементы управ- ления, на которые может повлиять выбранное пользователем значение, устанавливаются невидимыми. В таком случае выбранное ранее значение не бу- дет играть особой роли; оставшаяся часть кода определяет, какое значение вы- брано в данный момент, и работает уже с этим вариантом. Листинг 13.2. Событие После обновлениядля группы переключателей Print Choices Private Sub Type of Print AfterUpdate() With Me ! [From Check] .Visible = False 1 [To Check] .Visible = False • [From Check Text] .Visible = False .! [To Check Text] .Visible = False J [From Date] .Visible = False ’ [To Date] .Visible = False
.1 [From Date Text] .Visible = False - 1 [To Date Text] .Visible = False If 1 [iype of Print] = 2 Or Me J [type of Print] = 6 Then ’ [From Date] .Visible = True ! [To Date] .Visible = True 1 [From Date Text] .Visible = True ’ [To Date Text] .Visible = True End I f, If 1 [Type of Print] = 3 Then ’ [From Check] .Visible = True • [To Check] .Visible = True ! [From Check Text] .Visible = True *! [To Check Text] .Visible = True End If End With Работа co списками и полями co списками Осталось 20 минут Список (list box) и поле со списком (combo box) — единственные элементы управле- ния Access, которые позволяют просматривать несколько столбцов (или полей) данных в одном перечне. Поэтому данные два элемента применяются довольно час- то. На рис. 13.6 изображено поле со списком, которое используется в форме lrm_CheckWriter. В верхней части формы находится список со всеми сущест- вующими банковскими счетами, один из которых может выбрать пользователь. При щелчке на стрелке "вниз" отображается список с названием банка (Bank Name), типом счета (Account Туре) и номером счета (Account Number). Этот пример также доказывает, что поле со списком может выполнять не только простую функ- цию выбора из предложенного перечня. Если ввести другой банковский счет, фор- ма обновляется, и отображаются записи операций, относящиеся к этому счету. Рис. 13.6. Поле со списком, используемое в форме frm__CheckWri ter
Разница между полем со списком и обычным списком В табл. 13.1 представлен сравнительный анализ поля со списком и обычного списка, а также описаны их общие характеристики. На рис. 13.7 приведен при- мер формы с двумя полями со списками и одним обычным списком. Таблица 13.1. Сравнение поля со списком и обычного списка Характеристика Поле со списком Список Размер Когда список не выбран пользова- телем, сворачивается до высоты одного поля Имеет размер и расположение, заданные при проектировании. Отображает более одной строки информации и всегда открыт Ввод с клавиатуры Позволяет осуществлять переход по списку по мере ввода названия с клавиатуры. Например, когда вы вводите А, список переходит на пер- вый найденный элемент, который начинается с А. Если вы после этого введете В, то будет найден первый элемент, который начинается на АВ. Данный процесс продолжается до тех пор, пока соответствий введен- ному имени не будет найдено При вводе буквы с клавиатуры список переходит к первому эле- менту, который начинается на эту букву. Если вы введете А, список переходит на первый найденный элемент, который начинается с А. Если после этого вы введете В, фокус переходит на первый эле- мент, который начинается на В, независимо от ранее введенного А Выбор Можно выбрать значение из списка или ввести значение, которого в спи- ске нет (выбор зависит от значения свойства Ограничиться списком (Limit То List) поля со списком) Можно выбрать только элемен- ты из списка Наличие множест- венного выбора Позволяет выбрать только одно значение Предоставляет разные варианты выбора, как одного, так и не- скольких значений Рис. 13.7. Пример формы с полями со списками и обыч- ным списком И список, и поле со списком — очень мощные элементы управления, по- скольку позволяют отображать более одного поля данных. Можно определить не- сколько столбцов для одной записи или строки и связать эти данные с каким- либо полем. После ознакомления с использованием свойств списка вы сможете широко использовать их в приложениях.
На рис. 13.8 и 13.9 отображено диалоговое окно свойств для поля со списком и ок- но обычного списка, соответственно. Обратите внимание, что, помимо универсальных свойств (Имя (Name) и Данные (Control Source)), эти два элемента управления имеют также и другие общие свойства. Вы должны хорошо разбираться в этих свойствах, поскольку они существенно влияют на работу элементов управления. Как показано в примерах, эти свойства можно установить программно, в результате чего заметно изменится внешний вид и функции элемента управления. Полный список свойств списка и поля со списком вы найдете в справочной системе Access. Рис. 13.8,Диалоговое окно свойств для поля со списком Рис. 13,9. Диалоговое окно свойств для списка Помимо свойств, общих для списка и поля со списком, каждый из этих эле- ментов управления обладает уникальными для своего интерфейса свойствами. В табл. 13.2 описаны дополнительные свойства поля со списком.
Несмотря на то, что Access применяет при работе со столбцами в программе VBA систему индексов, которая начинается с нуля, при обращении к столбцу данных для списка используется система на базе 1. Это означает следующее: если необ- ходимо обратиться к первому столбцу в свойстве Присоединенный столбец (Bound Column) данного элемента управления, то следует использовать индекс 1. Чтобы обратиться к этомуже столбцу в программе, применяется индекс 0. Таблица 13.2. Другие свойства поля со списком Свойство Описание Число строк списка (List Rows) Количество строк в списке, который отображается при от- крытии поля со списком Ширина списка (List Width) Это значение отличается от свойства Ширина (Width) эле- мента управления. Свойство Ширина списка может быть уже или шире, чем фактическая ширина элемента управ- ления; оно устанавливается в комбинации со свойством Ширина столбца (Column Widths). Обратите внимание на следующее: если не задано значение Ширина столбца, ис- пользуется принятая по умолчанию ширина элемента управления. Таким образом, если вы решили расширить несколько столбцов, чтобы лучше отобразить информацию, необходимо будет ввести значения для ширины столбцов. В противном случае столбцы будут обрезаны (если их ши- рина в этом свойстве не задана) Ограничиться списком Значение да/нет определяет, обязательно ли должно введенное (Limit То List) пользователем значение соответствовать одному из элементов поля со списком, или допускается ввод новых значений Список имеет одно особенное свойство, Несвязное выделение (MultiSelect), которое указывает, разрешен ли множественный выбор значений. Существует три возможных значения этого свойства: Отсутствует (None), Простой (Simple) и Со связным выбором (Extended). Отсутствует (None) Множественный выбор невозможен Простой (Simple) Множественный выбор разрешен. Чтобы выбрать строку, щелкните на ней мышью или нажмите < Пробел > Со связным выбором Множественный выбор разрешен. Строки выделяются с помо- (Extended) щью щелчка мышью с одновременным удерживанием клави- ши <Shift>. Можно выбрать несколько соседних строк, щелкнув на первой и расширив выделенную область с помощью мыши или стрелок управления курсором. Кроме того, удерживая нажатой клавишу <Ctrl> и щелкая на строке, вы выберите или отмените выделение этой строки Заполнение значений элементов управления Используя свойства Тип источника строк (Row Source Туре) и Источник строк (Row Source) для поля со списком или обычного списка в программе VBA, можно влиять на отображение информации, что позволяет динамически изме- нить источник данных для списков, порядок элементов в списке (сортировку) и поля или столбцы, которые перечислены в списке. Пример работы этих свойств приведен на рис. 13.10, где показана форма yCheck Search Dialog, открывающаяся при щелчке на кнопке Find в окне CheckWriter.
Рис. 13.10. Форма yCheck Search Dialog, содержащая группу переключателей и список Форма yCheck Search Dialog позволяет выбрать различные типы поиска на ос- новании критерия. В разделе Type of Search перечислено пять вариантов. Обра- тите внимание, что группа переключателей используется для управления видом списка. При изменении типа поиска (например, с поиска по номеру чека Checks by Check Number на поиск по получателю Checks by Payee) вид списка изменяет- ся. Пролистайте список вверх или вниз, пока не будет отображена желаемая строка или запись. При двойном щелчке диалоговая форма yCheck Search Dialog закрывается, и открывается выбранная запись. Кроме того, необходимую запись можно выбрать одним щелчком, после чего следует щелкнуть на кнопке ОК. Форма закроется, и будет отображено окно выбранной операции. Данный механизм работает посредством использования свойства Источник строк (Row Source) для списка, в зависимости от выбранного параметра типа поиска в группе переключателей. Обратите внимание: изменяется не только тип информации, но и ширина столбцов — таким образом размещаются новые дан- ные. Приведенный пример иллюстрирует эффект использования в программе свойств Источник строк и Ширина столбцов (Column Widths). В листинге 13.3 представлен фрагмент программы для события После обновления (AfterUpdate) в группе переключателей, которая изменяет вид списка. Листинг 13.3. Событие После обновления для группы переключателей Type of Search Private Sub Type_of_Search_AfterUpdate() Me!Keyword.Visible = False With Me 1 [By Search type] .RowSource = " " Select Case 1 [Type of Search] Case 1 Forms!frm_CheckWriter.TabControl.Pages("Checks").SetFocus 1 [Search Text] .caption = "Select the Check Number to Search For" 1 [By Search type] .ColumnCount = 5 1 [By Search type] .Columnwidths = ".65 in;.65 in;l.l in;0.5 in;0 in" ! [By Search type] .BoundColumn = 5 ! [By Search type] .RowSource = "SELECT
[tbl__CheckWriter].[CheckNumber], [tbl_CheckWriter].[CheckDate], [tbl_CheckWriter].[Payee], [tbl_CheckWriter].[PaymentAmount], [tbl_CheckWriter] . [TransID] As Amount PROM [tbl_CheckWriter] WHERE (( [tbl__CheckWriter] . [TransType]=’Check’ ) and [tbl_CheckWriter].[AccountNumber] = [Forms] ! [frm_CheckWriter] ’ [BankAccountNumber] ) ORDER BY [tbl_CheckWriter].[CheckNumber]” Case 2 Forms!frm_CheckWriter.TabControl.Pages("Checks").SetFocus 1 [Search Text] .caption = "Select Payee Record to Search For" ! [By Search type] .ColumnCount = 5 1 [By Search type] .Columnwidths = "1.1 in;.65 in;.5 in;0.65 in;0 in" 1 [By Search type] .BoundColumn = 5 1 [By Search type] .RowSource = "SELECT [tbl_CheckWriter].[Payee], [tbl_CheckWriter].[CheckDate], [tbl_CheckWriter].[CheckNumber], [tbl_CheckWriter] . [PaymentAmount] As Amount, [tbl_CheckWriter].[TransID] FROM [tbl_CheckWriter] WHERE (([tbl_CheckWriter].[TransType]=’Check’) and [tbl_CheckWriter].[AccountNumber] = [Forms] ! [f rm_CheckWriter] ! [BankAccountNumber] ) ORDER BY [tbl_CheckWriter]. [Payee] , [tbl_CheckWriter]. [CheckDate] " ЕСредставленный фрагмент программы может выполнить несколько задач. В данном примере показан код для значений 1 и 2 и для параметров выбора Checks By Check Number и Checks By Payee в форме. Это значения вариантов выбора в группе переключателей. Анализируя код, можно понять, что параметры в списке основаны на значении Case. Программа изменяет свойство Caption для метки, которая долж- на правильно описывать тип поиска. С этого момента количество столбцов устанавли- вается равным 5, при этом используется свойство Column Count (Число столбцов). В комбинации со свойством Число столбцов (Column Count) устанавливается значение Ширина столбцов (Column Widths), чтобы данные отображались коррект- но, а ширина столбцов вмещала данные. Обратите внимание, что в данном случае свя- занный столбец (bound column) — столбец, информация которого сохраняется в по- ле, — не меняется. Необязательно все время использовать один и тот же связанный столбец. На практике может оказаться целесообразнее сохранять один и тот же стол- бец для данного элемента управления даже при изменении источника строк. Нако- нец, в программе обновляется свойство Источник строк (Row Source). В первом слу- чае оно задается строкой SQL, во втором — используется запрос (ChecksByPayee). Изменение любого из описанных выше свойств приводит к сбрасыванию элемента управления и повторению запроса по каждому элементу при каждом изменении. В результате могут возникнуть серьезные проблемы, связанные со скоростью работы приложения при установке свойства (особенно если используется сложный запрос) или при работе с большими исходными таблицами данных. Следовательно, на время придется установить свойство Источник строк (Row Source) равным пустой строке. Элемент управления будет обновлен быстрее, поскольку источника строки нет. Данная операция выполняется с помощью следующей строки кода. 1 [By Search type] .RowSource = После установки всех свойств Row Source следует установить равным назва- нию запроса или строке SQL.
Вы уже знаете, как используется группа переключателей для изменения вида списка. Примеры программ в листингах 13.4 и 13.5 из приложения Check Writer де- монстрируют несложные способы создания динамических, интерактивных форм. В листинге 13.4 используется событие После обновления (After Update) по- ля со списком, в котором обрабатываются данные и вид формы. Поле со списком Bank Account в форме frm CheckWriter изменяет или фильтрует записи для формы на основании выбора пользователя. Листинг 13.4. Событие После обновления поля со списком BankAccount Private Sub BankAccount_AfterUpdate() Dim rst As New ADODB.RecordSet On Error GoTo ErrorHandler rst.Open "SELECT * FROM tbl_BankAccounts WHERE [BankAccountNumber] = ” & Chr(34) & Me.BankAccount & Chr(34), CurrentProj ect.Connectionr adOpenForwardOnly With Me .BankName = rst!BankName .BankAccountNumber = rst!BankAccountNumber .ABANumber = rst’ABANumber If .TabControl .Value о 0 Then .TabControl.Pages(0).SetFocus Else TabControl_Change End If End With rst.Close GoTo Done ErrorHandler: MsgBox Err.Description Done: End Sub Это простой, но очень важный фрагмент. В данном случае форма задается так, что она фильтрует операции с чеками и отображает операции только для опреде- ленного банковского счета. Вы можете не прибегать к фильтрации значений в форме — программа сделана так, что посредством простого выбора в поле со списком вы будете иметь возможность изменить источник записи для всей формы. Это очень удобный для пользователя способ создания фильтров в форме, который позволяет осуществлять фильтрацию в форме так, что вам не придется использовать какие-либо команды меню. Обработка элементов, не представленных в списке Одно из самых полезных свойств поля со списком — возможность обрабаты- вать данные, которых в списке нет. Свойство Ограничиться списком (Limit То List) и событие Отсутствие в списке (On Not In List) работают вместе и опреде- ляют, как элемент управления обрабатывает случаи, когда пользователь вводит в поле со списком значение, отсутствующее в перечне. Поле со списком Payee в форме frm_CheckWriter задано так, чтобы пока- зать, как предоставить конечному пользователю возможность обновлять список
в случае появления новой информации. В данном примере поле со списком Payee позволяет выбрать значение из предопределенного списка получателей платежа. Свойство Ограничиться списком (Limit То List) было установлено равным False, т.е. пользователь может ввести имя, отсутствующее в списке. Однако чтобы получить более законченный интерфейс, свойство в нашем примере было поставлено на True, чтобы пользователь мог выбрать только элементы списка. Кроме того, в событие Отсутствие в списке (On Not In List), которое происходит при вводе отсутствующего в списке значения, был добавлен код листинга 13.5. Про- грамма выводит вопрос, хочет ли пользователь добавить нового получателя в список для дальнейшей работы. Если пользователь отвечает No, программа завершает рабо- ту. Если пользователь отвечает Yes, программа добавляет новую запись. Листинг 13.5. Код события Отсутствие в списке для поля со списком Payee Private Sub Payee_NotInList (NewData As String, Response As Integer) Dim cnn As ADODB.Connection Dim PayeeTB As New ADODB. RecordSet Dim Answer As Integer On Error GoTo ErrorHandler Answer = MsgBox("This Payee is not in file. Add it to the tblPayees list? ” , _ vbQuestion + vbYesNo, "New Payee") If Answer = vbNo Then Response = ac Dat a Err Continue . Else Response = acDataErrAdded Set cnn = Currentproject.Connection PayeeTB. CursorType = adOpenKeySet PayeeTB.LockType = adLockOptimistic PayeeTB.Open "tblPayees", cnn, , , adCmdTable With PayeeTB ' Добавить нового получателя в таблицу tblPayees .AddNew 1tblPayees = NewData .Update End With PayeeTB.Close Set PayeeTB = Nothing cnn.Close Set cnn = Nothing End If GoTo Done ErrorHandler: MsgBox Err.Description Done: End Sub В листинге 13.5 рассмотрена довольно простая ситуация, когда таблица Payees состоит из единственного поля. Как правило, в таблицах содержится несколько полей, в том числе поля, которые требуют ввода данных пользователем перед соз- данием новой записи. Возможно, вы захотите расширить этот пример еще больше, открыв для пользователя форму ввода данных, позволяющую задать значения для всех полей записи, после чего список будет обновлен.
Осуществление и обработка множественного выбора Осталось 10 минут В отличие от поля со списком или группы переключателей, список (list box) пре- доставляет возможность множественного выбора, который в Access задается свой- ством Несвязное выделение (MultiSelect). Свойство Несвязное выделение мо- жет иметь одно из трех значений: Отсутствует (None), Простой (Simple) или Со связным выбором (Extended). Между двумя последними значениями существуют некоторые отличия. Значение Простой позволяет выбрать строку, щелкнув на ней мышью. Значение Со связным выбором позволяет выбрать записи с использова- нием клавиш <Shift> или <Ctrl> и щелчка мышью на каждой строке. Вы можете вы- брать группу смежных строк, щелкнув мышью на первой и последней строках и удерживая нажатой клавишу <Shift>. Клавиша <Ctrl> позволяет выбрать строки в любом порядке. В модуле Recurring Payments находится список, для которого свойство Несвязное выделение (MultiSelect) задано равным Со связным выбором (Extended), как на рис. 13.11. Программа в событии Нажатие кнопки (OnClick) для кнопки Process проходит цикл по всем выбранным строкам и создает чеки для каждой выбранной записи. Рис. 13Л1. Форма Recurring Payments и список с возмож- ностью множественного выбора Вы должны знать некоторые положения, необходимые при работе со свойст- вом Несвязное выделение. ListCount Целое значение, которое определяет общее количество элементов в списке ListIndex Индекс строки (начиная с 0). Используется для того, чтобы опре- делить, какая строка списка выбрана в данный момент SelectedProperty Применяется для определения, выбран ли конкретный элемеш в списке. Значение True/False указывает, выбрана ли строка ItemsSelected Набор значений типа Variant, которые определяют строку эле- ментов, выбранных в списке. Используется с другими свойствами и позволяет получать данные из конкретных строк и столбцов списка Эти свойства имеются также и в поле со списком.
В форме frm_RecurringPayments пользователь может задать несколько пе- риодических платежей. Сначала необходимо указать все выплаты, которые счи- таются периодическими. Для этого щелкните на кнопке Setup. В результате бу- дет отображена форма, которая создает новые списки платежей. Прежде чем платежи можно будет использовать в форме /rrn_RecurringPayments, каждый платеж следует ввести в список в этой форме. Когда наступает момент создания чеков, пользователь просто выбирает элементы из списка Recurring Payments для обработки. Выбрав все необходимые элементы, пользователь щелкает на кнопке Process, чтобы создать чеки для платежей. Для обращения к столбцам программа использует переменную varitem. Помни- те, что при обращении к конкретному столбцу необходимо указать строку и стол- бец, поскольку вы обращаетесь к строке, представленной переменной varitem. ,Листинг 13.6 содержит фрагмент программы для события Нажатие кнопки (OnClick) кнопки Process. Листинг 13.6. Событие Нажато клопкидля кнопки Process Dim rst As New ADODB. RecordSet Dim varitem As Variant W On Error GoTo ErrorHandler ' Проверка выбора элементов If Me.Recurring_Payments.ItemsSelected.Count = 0 Then MsgBox "Please select checks to process.’* 1, vbCritical, "No checks Selected.” Me.Recurring_Payments.SetFocus GoTo Done End If 1 Проверка выбора банковского счета If IsNull(Me.BankAccount) Then MsgBox "Please select a Bank Account", vbCritical, "No Bank Account.” Me.BankAccount.SetFocus GoTo Done End If rst.Open ”tbl_CheckWriter”, Currentproject.Connection, adOPenKeySet, adLockPessimistic 1 Открытв набор записей для таблицы tbl_CheckWriter и выписать новые чеки With rst 1 Начатв обработку в цикле для всех элементов, 1 выбранных в списке Recurring Payments For Each varitem In Me.Recurring_Payments.ItemsSelected . AddNew .Fields("TransType”) = "Check" .Fields("AccountNumber") = Me.BankAccount . Fields ("CheckNumber") - dbc__CheckNum (Me.BankAccount) .Fields("CheckDate”) = Date .Fields("Payee") = Me.Recurring_Payments.Column (lf varitem) . Fields (" Payment Amount") = Me.Recurring_Payments.Column(2, varitem)
. Fields ("Memo") = Me.Recurring_Payments.Column (3 , varitem) .Fields("Voucher") = "Payee: ” & Me.Recurring^Payments.Column(1, varitem) & " Amount: " & Format(Me.Recurring_Payments.Column (2, varitem), "Currency") & ” Date: 11 & Date & vbCr & * vbLf & Me.Recurring_ Payments.Column(3, varitem) .Update Next varitem End With rst.Close MsgBox "Checks created successfully.", vbExclamation, "Process Status" DoCmd.Close acPorm, Me.Name GoTo Done ErrorHandler: MsgBox Err.Description Done: End Sub Программа начинается с объявления переменных для процедуры. Затем она выполняет стандартные проверки на предмет того, что необходимые элементы были действительно выбраны и, кроме того, выбран банковский счет. Далее про- грамма начинает обрабатывать выбранные элементы. Набор записей CheckTB от- крывается с использованием ADO на основании таблицы tbl_CheckWriter, по- скольку именно в этой таблице введены данные. Начинается цикл, и программа проходит по всем элементам коллекции Items Selected. Для каждой строки, полученной из коллекции, задается информация чека. Сначала операция сохра- няется как чек, затем сохраняется номер счета и дата. Из других столбцов списка заполняются поля Payee, Аш оunt и Мето. Информация объединяется путем конкатенации в поле Voucher, для чего соз- дается строка. В результате поле получает это значение. .Fields("Voucher") = " Payee: " Me.Recurr ing__Payments.Column(1, varitem) & " Amount: " & Format(Me.Recurring_Payments.Column(2, varitem) , "Currency") & " Date: " & Date & vbCr & vbLf & Me.Recurring Payments.Column(3, varitem) В данном примере для обработки выбранных строк используется свойство Items Selected. Чтобы создать цикл с целью проверки, выбрана ли строка, можно использовать свойства Listcount, List Index и S elect edProperty. Конкатенация строк В предыдущем разделе был представлен фрагмент программы, описывающей соз- дание строки путем конкатенации. Затем полученная строка использовалась для за- полнения поля Voucher на чеке, чтобы не нужно было заново вводить данные в стро- ку. Конкатенация — важный прием, которым необходимо овладеть. Он позволяет создать строку из отдельных фрагментов данных. В дальнейшем эту строку вы може- те хранить в одном поле. Кроме того, конкатенацию используют для создания строк операторов SQL или текстовых строк, которые отображаются в окне сообщения. Ключевой компонент конкатенации — символ амперсанда (&) или "плюс" (+), которые используются для объединения отдельных операторов. Главное отличие
между этими двумя операторами заключается в следующем: "плюс” может объеди- нять только текстовые данные. Амперсанд позволяет объединить как текстовые, так и нетекстовые данные, кроме того, он преобразует нетекстовые данные в текст. Если для нетекстовых данных используется оператор +, можно преобразовать данные в текстовый формат. Например, функция CStr() преобразует строку втекстовый тип данных. = "Сегодняшняя дата: " + CStr(DateO) Ниже приведено два примера, демонстрирующих конкатенацию двух строк данных. В первом примере из строк First Name и Last Name создается резуль- тирующая строка Name, представляющая собой цельную текстовую строку. Об- ратите внимание, что в примере объединено три элемента: строка First Name, пробел и строка Last Name. Между строками следует добавить пробел, посколь- ку при конкатенации пробелы автоматически не добавляются. Всегда учитывай- те эти моменты, иначе может получиться что-то вроде “JohnDoe”, без пробела. First Name] = John Last Name] = Doe Concatenate: [First Name] & " " & [Last Name] Resultant: ’’John Doe" Следующий пример подобен первому, но он несколько сложнее. В нем объе- диняется несколько строк текста и ссылки на поля, в том числе вызов функции. First Name] = John Last Name] = Doe Amount] = 3,299.50 Concatenate: "Pay To: ” & [First Name] & ” ” & [Last Name] & ” " & Format$(Date (), "mm/dd/yyyy") & ” " & _ Format $ ([Amount] , ’’Currency")" Resultant: "Pay To: John Doe 11/09/1999 $3,299.50" В нижней части формы l'rm_CheckWriter расположена кнопка Create Check Stub (создать корешок чека). Программа, представленная в листинге 13.7, созда- ет строку текста путем конкатенации нескольких фрагментов данных в строке Voucher. Вначале она определяет, пусто ли поле Voucher. Если это так, получен- ная в результате конкатенации строка присваивается полю. Если же сущест- вующее поле Voucher заполнено, отображается окно сообщения с запросом, запи- сывать ли новые данные поверх существующей информации корешка чека. Пользователь может щелкнуть на кнопке Yes, тогда программа перезапишет су- ществующий корешок чека, заменив старые данные строкой, полученной в ре- зультате конкатенации: Me! [Voucher] = "Pay То: " & Me! [Payee] & ” Me![CheckDate] & " ” & Format$(Me![Amount], "Currency”) Листинг 13.7. Код события нажатие кнопки для кнопки Create Check Stub Private Sub cmdCr eat eChecks tub_Click () Dim Response As Integer If IsNull(Me![Voucher]) Then
Me! [Voucher] = "Pay To: ” & Me! [Payee] & ” ” & Me* [CheckDate] & ” ” & Format $ (Me! [Amount] r "Currency") Else Response = MsgBox("Do you want to overwrite the Check Stub?", 36, "Create Stub") If Response = vbYes Then Mel [Voucher] = "Pay To: ” & Me! [Payee] & ” ” & Me! [CheckDate] & ” ” & Format $ (Me! [Amount] , "Currency") End If End If End Sub Готово1, Обзор В этом уроке вы изучили такие элементы управления, как флажок, группа пере- ключателей, список и поле со списком. Кроме того, вы научились обрабатывать информацию, которая отображается в форме, и связывать события с элементами управления. В этом уроке были рассмотрены такие вопросы. • Настройка элементов управления с выбором значений. • Использование программы для изменения свойств Источник строк спи- ска и поля со списком. I • Обработка элементов, не указанных в списке. • Создание кода обработки случаев, когда пользователь вводит в поле со спи - ском текст, отсутствующий в перечне списка. • Осуществление и обработка множественного выбора. • Применение списка для выбора нескольких значений одновременно. • Создание динамической формы с использованием изученных элементов управления и возможностей помимо ввода данных. • Использование изученных элементов управления для изменения вида, ме- ханизма и функций форм. • Конкатенация данных в одну строку. Проверьте себя 1. Какой интерфейс следует предпочесть в каждой из следующих ситуаций. а. Вы хотите, чтобы на форме располагалось поле Posted. Причем для запи- сей, отмеченных как Posted, форма должна быть заблокирована, а для за- писей, не отмеченных как Posted, форма должна быть свободна. (См. раздел "Обработка выбора True/False с помощью флажков”.) б. Пользователю следует предоставить возможность выбирать сразу несколь- ко элементов списка. (См. раздел "Разница между полем со списком и обычным списком”.) в. Необходимо создать элемент управления, в котором перечислен ряд эле- ментов. Первый столбец должен быть связан с полем под названием ItemNumber (номер элемента), причем пользователю следует предоставить возможность вводить начало номера элемента, после чего список перейдет на самое близкое число. (См. раздел "Разница между полем со списком и обычным списком”.)
2. Назовите главное отличие поля со списком от обычного списка. (См. раздел ’’Разница между полем со списком и обычным списком** .) 3. Для какого элемента управления используется свойство Отсутствие в списке (Item Not In List)? Назовите основные действия, которые следует предпринять в ситуации, когда пользователь вводит элемент, отсутствующий в списке. (См. раздел ’’Обработка элементов, не представленных в списке**.) 4. Что такое конкатенация и почему понимание этого процесса имеет важное значение в программировании? (См. раздел "Конкатенация строк*’.) 5. Что представляет собой свойство/коллекция ItemsSelected и как оно ис- пользуется в списках? (См. раздел "Осуществление и обработка множествен- ного выбора”.)

УРОК Программирование подчиненных и ленточных форм Содержание урока * Понятие подчиненных форм * Создание субформ v Определение формы для элемента управления субформы v Соединение главной и дочерней форм * Ссылки на элементы управления в субформах Осталось 30 кинут Суб формы предоставляют большие возможности для отображения и ввода дан- ных, особенно при использовании данных, располагающихся сразу в нескольких таблицах и имеющих отношения с различными элементами. Ленточные формы предназначены для одновременного отображения несколь- ких записей из одной таблицы, при этом используются приемы редактирования и поиска, а также столбцы с вычислениями и суммирующие показатели. В дан- ном уроке будут рассмотрены примеры использования субформ и ленточных форм для отображения данных. Понятие субформы Субформа, или подчиненная форма (subform),— это форма внутри другой формы. Она позволяет использовать данные из одной формы внутри другой фор- мы. Например, в приложении Check Writer основная форма frm_CheckWriter отображает регистр чеков суб формы в представлении непрерывной формы. Эле-
мент управления субформы — это контейнер для отображения другой формы. Представление формы, которое отображается в элементе управления суб формы, зависит от представления формы, используемой в субформе. Существует три основных типа представлений форм. • Л исты данных (datasheets). Отображают несколько записей, используя по одной строке на запись. • Формы (forms). Отображают одну запись в форме. • Ленточные формы (continuous forms). Отображают несколько записей в форме. Создание подчиненной формы В суб форме может отображаться одно из трех представлений формы. Форма внутри контейнера (элемента управления субформы) может либо отображать те жеданные в другом представлении, либо представлять совсем другие данные. На рис. 14.1 показана форма frm_BankAccounts, отображающая одну запись. Форма frm CheckWriter в файле примера CheckWriter.mdb— это диалоговое окно со вкладками, содержащее вкладку для непрерывной субформы. Рис. 14.1. Форма Bank Accounts Предположим, вы решили отобразить в этом диалоговом окне со вкладками ин- формацию о банковском счете. Рекомендуем добавить новую вкладку и субформу. Добавление субформы (рис. 14.2) позволяет отобразить данные в нескольких раз- ных форматах, в том числе по одной записи за раз или по несколько записей сразу. Сначала в элемент управления вкладки на форме frm_CheckWriter добавляется страница вкладки. Затем на страницу вкладки добавляется элемент управления субформы под названием Bank Accounts. Субформу можно добавить в любую форму. Более того, в форму допускается до- бавлять несколько субформ. Субформа может даже содержать еще одну субфор- '• 'г-му, но вложение форм допускаются только на 2 уровня.
t* fi m - < । k /viit . П X Puc. 14.2. Добавление в форму субформы Определение свойства Объект-источникдля элемента управления субформы После того, как вы разместили в форме элемент управления подчиненной формы, необходимо указать, какая форма будет отображаться внутри этого эле- мента управления. Примените свойство Объект-источник (Source Object). В на- шем примере выберите форму frm__BankAccounts из списка форм, которые ото- бражаются в свойстве Объект-источник элемента управления. В форме Bank Accounts показаны элементы управления, использующиеся для хранения дан- ных каждого банковского счета. После установки свойства Объект-источник (Source Object) сама форма со всеми элементами управления отображается внутри элемента управления Подчиненная форма (рис. 14.3). Редактировать форму и изменять ее характеристики, можно с помощью эле- мента управления Подчиненная форма (Subform). Помните: если эта форма используется другой подчиненной формой или отобража- ется сама в другой части приложения, изменение формы приведет ее к изменению и в других местах. Вы работаете не с копией, ас оригинальной версией формы. Если вы задали свойство Объект-источник (Source Object) для субформы, то для отображения формы больше предпринимать ничего не придется. С подчи- ненными формами можно выполнять довольно много действий. Например, огра- ничить количество записей, отображаемых в подчиненной форме, чтобы оно сов- падало с записями, которые представлены в главной форме.
X Рис. 14.3. Выбор свойства Объект-источник для элемента управления Подчиненная форма (Subform ) Возможно, вы захотите связать форму Bank Accounts, отображаемую в суб- форме, с полем со списком, находящимся в главной форме CheckWriter. 3 Присоединение подчиненной формы к записи главной формы При создании субформы можно связать с ней главную форму, если воспользо- 20ми°ут ваться общим полем или выражением. Тогда в подчиненной форме будут ото- бражаться только записи, которые связаны с главной формой. Если при создании субформы Microsoft Access находит предопределенную связь или соответствие первичного или внешнего ключа, в свойствах Link Child Fields и Link Master Fields субформы отображаются названия по- лей, которые определяют эту связь. Необходимо проверить корректность автома- тической связи. Если главная форма основана на запросе (или если ни одно из перечисленных условий не выполняется), Access не может автоматически поста- вить соответствие между полями, чтобы создать связь. Значения свойств Подчиненные поля (Link Child Fields) и Основные поля (Link Master Fields) имеют одинаковое количество полей и представляют данные одного и того же типа. В данном примере (рис. 14.4) поле BankAccountNumber со- держится в обеих таблицах — tbl_CheckWriter и tblJBankAccounts. Назва- ние поля BankAccountNumber, которое находится в поле ввода Подчиненные поля (Link Child Fields), взято из таблицы tbljBankAccounts, содержащейся в субформе frm__BankAccounts. Название поля BankAccountNumber, которое на- ходится в поле ввода Основные поля (Link Master Fields), взято из таблицы tbl CheckWriter, которая содержится в форме frm_CheckWriter.
Рис. 14.4. Присоединение подчиненной формы к главной Действительно, данные не могут не совпадать, однако названия полей или эле- ментов управления должны отличаться. Например, поле BankAccountNumber в субформе может бьпь связано с полем AccountNumber в форме frm_CheckWriter, поскольку они содержат одно и то же значение. В данном примере связь между формами — один к одному, так как в форме Bank Accounts отображается по одной записи за раз. При выборе банковского счета из поля со списком в главной форме вы изменяе- те банковский счет, который отображается в форме. Когда поле BankAccountNumber изменяется в главной форме, в элементе управления суб формы применяется внут- ренний фильтр. Таким образом, будут отображаться только записи, в которых но- мер счета BankAccountNumber в CheckWriter или Check Register совпадает со значе- нием BankAccountNumber. Работа с субформами ленточных форм Наибольшим преимуществом субформ является их способность отображать связь не один к одному, а один к нескольким. Часть один обычно представлена в главной форме, а субформа представляет часть несколько. Пример такой связи можно увидеть в форме Check Register; frm_CheckWriterRegisterSubform яв- ляется непрерывной формой (рис. 14.5). В окне свойств показано, что представление формы по умолчанию (Default View) равно Continuous Forms. Обратите внимание, что в разделе Detail формы со- держится две строки элементов управления, что является одним из преиму- ществ, которыми обладает форма по сравнению с листом данных. Лист данных
ограничен только одной строкой неформатированных данных. В непрерывной форме могут содержаться элементы управления с различным цветом фона и шрифтами, поля со списками, флажки и даже командные кнопки. Рис. 14.5. Создание ленточной формы При использовании формы в качестве субформы она вкладывается внутрь другой формы, как лист данных или представление формы. На рис. 14.6 показа- на форма на вкладке Register формы f rm_CheckWriter. Необходимо отметить, что в этой форме содержится также несвязанная основа для объекта OLE, в кото- рую включен рисунок для листа бухгалтерской книги. Данный рисунок исполь- зуется просто как фон и никак не влияет на элемент управления субфсрмы. Свойство Объект-источник (Source Object) для элемента управления субформы установлено равным форме frm_CheckWriterRegistezSubform(cM. рис. 14.6), а в . свойствах Основные поля (Link Master Fields) и Подчиненные поля (Link Child Fields) используется общее поле Account N umber. При запуске этой формы все записи выбранного банковского счета отобража- ются в непрерывной форме. Записи выбираются по полю Account Number. Без за- данной связи отображались бы все записи из таблицы Check Writer. /-Ц< Как обратиться к элементам управления 8 подчиненных к. У формах УОшиут Форма frm_CheckWriterRegister представляет собой одну из самых интерес- ных форм приложения, поскольку для элементов управления в ней используется рядуникальныхвычислений(см.рис. 14.5 и 14.6).
Рис. 14.6. Связь элемента управления субформы с главной формой В форме Check Register отображаются данные из таблицы tbl_CheckWriter: чеки, депозиты и исправления. Все эти данные отличаются друг от друга. Эле- мент управления Check # содержит формулу, отображающую номер чека, если строка — чек. Он будет оставаться пустым в случае депозита или исправления. Это осуществляется путем проверки значения номера чека: если оно равно О, то элемент управления исходит из предположения, что вы работаете не с чеком. = IIf ( [CheckNumber] =0г 11 ’’ r [CheckNumber] ) Тип операции равен либо Check, либо Deposit, либо одному из определенных пользователем наборов исправлений. Если операция — чек и она аннулирована (Void), то на типе операции отображается слово VOID, указывающее на то, что данная операция не учитывается ни в одной из сумм: =IIf([Void]=-1, "VOID-" & [TransType].[TransType]) Последний элемент управления, Balance, вычисляет динамическую общую сумму для регистра чеков. Программа просматривает поле TransID (номер опера- ции) и суммирует все записи для текущей и всех предыдущих операций. =DSum (" 0 + [Depos i t Amount ] - [ Payment Amount ] ", •' tbl_CheckWri t er ", "TransID" <= [Forms] ! [frm_CheckWriter] ! [frm__CheckWriterRegisterSubform] .Form! [TransID] and [AccountNumber] = [Forms] ! [frm__CheckWriter] ! [BankAccount] and Void <> True") Вычисление значения должно начинаться с 0+. В противном случае формула выдаст ошибку, поскольку в ней не будет начальной точки. Обратите внимание, что при вычислении используется ссылка на поле TransID в форме для элемента управления субформы, что требует специального обозначения.
Forms![frm_CheckWriter]![f rm_CheckWriterRegisterSubform].Form! [TransID]. В данном случае применен следующий формат. Forms! [название главной формы] ! [название элемента управления субформы} .Form! [элемент управления субформы] После ссылки на элемент управления суб формы используется ссылка . Form, которая переносит внутренний фокус на форму элемента управления субформы. В результате вы сможете обращаться к элементам управления в этой форме. Некоторым приведенная выше формула может показаться ошибочной, так как в ней используется поле TransID (автоматически присвоенный номер), и опе- рации не группируются по дате. Например, если автоматически номер операции увеличивается последовательно на 1, то после выписки всех чеков за предыду- щую неделю, вы будете иметь возможность выписать чек на определенную дату (за прошлую неделю), даже если не сделали этого вовремя. Но данная операция будет включена в следующий блок операций, поскольку сортировка (или фильтр DSUM) выполняется только по полю TransID. Обзор В этом уроке вы изучили подчиненные формы (субформы). Используя их, можно готом! отображать по одной записи или сразу несколько записей, если вы работаете с листом данных или представлением непрерывной формы. В уроке рассматри- вались перечисленные ниже темы. • Суб форма — это форма внутри другой формы. • Элемент управления субформы можно создать внутри любой формы; она определяется с помощью свойства Объект-источник (Source Object) для элемента управления субформы. • Субформу можно связать с главной формой, используя свойства Основные поля (Link Master Fields) и Подчиненные поля (Link Child Fields). • Чтобы элемент управления суб формы автоматически заполнял связи меж- ду формами, в формах должны содержаться связи, ранее определенные на базе какого-либо общего поля. • Использование ленточных форм позволяет отобразить отношение одной записи (в главной форме) к нескольким записям (в субформе). I • К элементам управления в субформе можно обращаться с помощью добав- ления ссылки .Form после имени элемента управления суб формы. Проверьте себя 1. Что такое субформа?(См. раздел "Понятие субформы”.) 2. Назовите три типа форм, которые могут отображаться в суб форме. (См. раздел "Понятие субформы”.) 3. Какое свойство позволяет отображать форму в элементе управления субфор- мы? (См. раздел "Определение свойства Объект-источник для элемента управления субформы”.) 4. Какие свойства позволяют связать суб форму с главной формой? (См. раздел "Присоединение подчиненной формы к записи главной формы”.)
5. Какой тип данных необходим для создания связи между формой и суб- формой? (См. раздел "Присоединение подчиненной формы к записи глав- ной формы”.) 6. Назовите способы задания ссылки на элемент управления в подчиненной форме. (См. раздел "Как обратиться к элементам управления в подчинен- ных формах”.)

УРОК Программирование вкладок Содержание урока * Использование вкладок ✓ Сравнение элементов управления с вкладками и многостраничных форм v* Программирование элементов управления с вкладками Осталось 30 минут Широкое использование вкладок в комплексе Microsoft Office и операционной системе Windows свидетельствует о популярности и эффективности этих элемен- тов управления. Применение вкладок в приложениях может сделать работу пользователя более удобной и усовершенствовать характеристики приложения. Программирование элементов управления с вкладками позволяет расширить возможности формы и, соответственно, приложения. Зачем используют вкладки Почему элементы управления с вкладками пользуются такой популярно- стью? Прежде всего, они позволяют создать удобный и красивый интерфейс пользователя. Поскольку вкладки входят в стандартный интерфейс Windows, пользователи уже привыкли видеть и пользоваться ими. Этот тип элементов управления может быть предназначен для группирования информации или функций согласно логической структуре и организации, а также обеспечивает эффективное использование рабочего пространства приложения. Кроме свойственной этим элементам управления простоты использования, их легко программировать и использовать в самых различных задачах. С точки зре- ния разработчиков, элементы управления с вкладками предоставляют программи- сту отличный инструмент. В программе можно работать со страницами вкладок, управлять видом самого элемента управления и изменять его свойства. Все эти ха- рактеристики объясняют причины популярности и эффективности данного типа элементов управления. На рис. 15.1 показан элемент управления с вкладками, раз- работанный для формы frm CheckWriter в приложении CheckWriter.
Рис, 15.1. Форма frrn_CheckWriter и пример элемента управления с вкладками Существует немало причин, по которым пользователь выбирает элементы управления с вкладками (начиная с внешнего вида и заканчивая их функцио- нальными возможностями). Если вы хотите сделать вид приложения классиче- ским и облегчить тем самым работу пользователя (либо стремитесь усовершенст- вовать возможности приложения путем разделения данных и элементов управ- ления), вкладки станут для вас незаменимым инструментом. Элементы управления с вкладками следует использовать в следующих ситуациях. • Чтобы сделать интерфейс приложения похожим на классический интер- фейс Windows. Чтобы разбить данные на логические группы или функции и разместить их на отдельных вкладках. Чтобы более эффективно использовать пространство приложения. Чтобы связать элементы управления с одним источником записей и не прибегать к созданию нескольких форм для элементов управления, кото- рые на одной форме не помещаются. Естественно, можно использовать вкладки и для других целей. За редким ис- ключением, способ применения элементов управления с вкладками ограничен только вашей фантазией. С их помощью можно осуществлять любые задачи, но существует несколько ограничений. Ниже приведен список основных преиму- ществ, а также ограничения в работе с элементами управления с вкладками. Преимущества. • Использование вкладок в несколько строк. Можно задать свойство Несколько строк (MultiRow), чтобы выбрать количество строк вкладок, которое будет применено в приложении. • Управление внешним видом формы. В качестве основы можно выбрать один из трех вариантов — Tabs, Buttons или None. Если вы создаете много-
страничную форму и при этом не хотите тратить много времени на про- граммирование, используйте вариант None. Применение рисунков на корешках вкладок. На корешках вкладок можно разместить как текст, так и рисунки в формате. bmp. Не забывайте, что ви- зуальные элементы (рисунки и пиктограммы) делают работу пользователя более приятной. Управление отображением страниц. Можно изменять отображение вкла- док по ходу работы программы, скрывать и отображать какие-либо стра- ницы. Эту возможность следует использовать в том случае, когда, в зави- симости от условий, следует сделать доступными определенные данные или функции на страницах. Порядок страниц. Можно изменять в программе порядок отображения страниц. Использование уровней элементов управления. Поверх элемента управ- ления с вкладками можно задать дополнительные элементы управления. Это позволяет создать "плавающий" элемент управления, который ото- бражается на всех страницах — но только один. • Добавление суб форм. В элементе управления с вкладками допускается размещать субформы. Можно даже задать разные субформы на каждой странице элемента управления с вкладками. Ограничения. • Добавление или удаление страниц по ходу работы программы. Несмотря на то, что в процессе выполнения программы можно скрывать или заново ото- бражать страницы, удалять или добавлять их нельзя. Добавлять или уда- лять страницы допускается только в представлении Конструктор (Design). • Использование вложенных элементов управления с вкладками. Вклады- вать один элемент управления с вкладками в другой нельзя, его можно сделать только "плавающим" (доступным для всех страниц внешнего эле- мента управления). • Изменение ориентации текста. Ориентацию текста изменить вы не смо- жете. Текст на корешках вкладок отображается только горизонтально. Сравнение элементов управления с вкладками и многостраничных форм Элементы управления с вкладками, по существу, представляют собой разно- видность многостраничной формы. С многостраничной формой вы могли озна- комиться в ранних версиях Access или в других приложениях. Многостранич- ная форма (multipagedjorm) — это форма, в которой используется разрыв стра- ницы, разделяющий одну форму на несколько разделов. Такое деление формы позволяет расширить свободное пространство формы, так как в обычном случае оно ограничено размерами окна. Помните, что в хорошо спроектированной фор- ме нельзя в одном месте сосредоточить большое количество элементов управле- ния. Элементы управления должны быть размещены с определенным интерва- лом, чтобы форма легко воспринималась, красиво выглядела и была удобной в использовании. Разрывы страниц позволяют разбить форму на отдельные разделы. Элемент управления с вкладками развивает концепцию многостраничной формы. Гораздо
проще разработать и обрабатывать одну форму, связанную с одним источником записей. Кроме того, освобождается рабочее пространствр. В настоящий момент элементы управления с вкладками более практичны, они значительно облегчают жизнь разработчика и пользователя. Этот урок посвящен использованию элементов управления с вкладками, вы узнаете об их преимуществах по сравнению с многостраничными формами. Если же вы захотите потренироваться, попробуйте использовать на каком-либо этапе многостраничный формат. Преодолев все трудности, связанные с освоением дан- ного формата, вы почти наверняка согласитесь, что элементы управления с вкладками делают разработку более простой и быстрой. Помните, что многостраничные формы используются для создания одной формы, которая содержит различные элементы управления. Однако в силу не- скольких причин рекомендуется использовать вкладки. Во-первых, элемент с вкладками представляет собой контейнер для нескольких страниц (рис. 15.2). Каждая страница отдельная, она имеет свои свойства, а также элементы управления, которые входят в коллекцию для этой страницы. В то же время к элементам управления и свойствам можно обращаться так, как если бы они были частью формы. Таким образом, каждый элемент управления, содержа- щийся в коллекции страниц для элемента управления с вкладками, является так- же частью коллекции формы. Эта уникальная особенность позволяет без особого труда разместить элементы управления на странице элемента с вкладками и свя- зывать его с полем в источнике записей формы. Кроме того, ко всем элементам управления можно обращаться так, как если бы они были размещены прямо в форме, а не находились внутри другого элемента управления. Рис. 15.2. Представление Конструктор для формы frm_CheckWriter— пример элемента управления с вкладками Во-вторых, если вы работаете с многостраничной формой и используете раз- рывы страниц, необходимо создать кнопки для перемещения с одной страницы
на другую. В многостраничных формах отсутствуют встроенные кнопки навига- ции. Поэтому, разрабатывая большую форму, необходимо учитывать отличия в переходе от одной страницы к другой. Однако эта задача может оказаться не- простой. Элемент управления с вкладками такие проблемы устраняет — вы по- лучаете возможность перехода со страницы на страницу: с помощью вкладок или с помощью кнопок. Кроме того, в многостраничной форме необходимо правильно спроектировать каждый раздел, чтобы избежать эффекта "перепрыгивания", вызванного разли- чиями в размере разделов и расположением одних и тех же элементов управле- ния на разных страницах. В противном случае элементы управления будут за- метно перемещаться с их точного положения, так как не для всех частей интер- фейса правильно задан размер и расположение. В-третьих, длина формы ограничена величиной 22 дюйма (почти 59см), что представляло серьезную проблему для Access 2.0 и Access 95, Как создать одну форму, на которой должно поместиться большое количество элементов управле- ния, если их общая длина больше 22 дюймов? В ранних версиях Access эту про- блему решали посредством использования суб форм. Элемент управления с вкладками переводит вопрос ограничения размера в разряд теоретических. Можно создать большое количество стрдниц-вкладок, длина которых может зна- чительно превышать 22 дюйма. Итак, элементы управления с вкладками представляют собой просто поколе- ние многостраничных форм. Однако многостраничные формы не совсем беспо- лезны. В некоторых случаях использование многостраничной формы будет более удачным решением, чем элемент управления с вкладками. Впрочем, такие слу- чаи довольно редки. Осталось Программирование элементов управления с вкладками го минут Программирование вкладок может в несколько раз увеличить функциональные возможности элемента управления. Изучив необходимые свойства и способы рабо- ты с ними, вы сможете обрабатывать элемент управления с вкладками в процессе выполнения программы и разрабатывать более мощный интерфейс приложения. Элемент управления с вкладками вы вправе рассматривать как контейнер, в котором хранятся элементы управления для каждой страницы. Каждую стра- ницу можно считать коллекцией элементов управления на этой странице. Пре- имущество состоит в том, что элементы управления на странице являются также частью коллекции элементов управления формы. К элементам управления на странице можно обращаться точно так же, как к элементам управления на фор- ме. Таким образом, работа с элементами управления на страницах-вкладках ана- логична работе с любыми другими элементами в форме. Свойства и методы элементов управления с вкладками Как и в любом элементе управления Access, можно программно изменять многие свойства элементов управления с вкладками. В табл. 15.1 перечислены свойства, относящиеся к элементам с вкладками.
Таблица 15.1. Свойства элементов управления с вкладками Название свой- Функция Устанавливает- ства ся в ходе работы программы Несколько строк (MultiRow) Позволяет задавать корешки вкладок в несколько Нет строк. По умолчанию свойство равно нет (No). Если это свойство задано равным Нет и корешки вкладок шире, чем элемент управления, Access добавляет полосу прокрутки и при необходимости обрезает ширину корешков вкладок Стиль (Style) Предоставляет возможность выбирать стиль Да вкладок: Ярлычки (Tab), Кнопки (Buttons) или Нет (None) Высота ярлычка (TabFixedHeight) Позволяет выбирать высоту корешков вкладок. Да Если значение свойства равно 0, высота уста- навливается такой, чтобы помещался заголовок вкладки и рисунок Ширина ярлычка (TabFixedWidth) Вы можете выбрать ширину каждого корешка Да вкладки. Если значение свойства равно 0, кореш- ки вкладки имеют ширину, достаточную для ото- бражения текста и рисунка. Если в элементе управления несколько строк корешков вкладок, ширина корешков вкладки изменяется так, чтобы общая ширина каждой строки была равна ширине элемента управления Рисунок (Picture) Позволяет отобразить рядом с текстом на корешке Нет вкладки растровое изображение (.bmp). Чтобы отобразить только рисунок, в свойстве заголовка оставьте пустое поле Изменение (On Change) Предоставляет возможность задать и присвоить Нет макрос или код, который будет выполнен при пе- реходе с одной вкладки на другую. Это свойство часто используется в том случае, если необходимо выполнять какие-либо действия в ответ на переход с одной вкладки на другую Индекс вкладки (Page Index) Вы можете указать положение корешка вкладки Да или страницы по отношению ко всем остальным вкладкам Visible (для от- дельной вкладки) Позволяет скрыть или отобразить отдельную Да вкладку или страницу элемента управления с вкладками Стили элементов управления с вкладками Для элементов управления с вкладками можно выбрать один из трех стилей: Ярлычки (Tab), Кнопки (Buttons) или Нет (None). По умолчанию используется стиль Ярлычки (см. рис. 15.1). На рис. 15.3 и 15.4 показана одна и та же форма, для которой задан стиль Кнопки и Нет, соответственно.
S' h- tk WrdF Banks#, xa it- |»4ethan>cs of Boston I Checks .. Deposits J Adjustments I Register' Puc. 15.3. Форма f rm CheckWriterc использованием для вкладок стиля Кнопки Рис. 15.4. Форма frm CheckWr? ter с использованием для вкладок стиля Нет Выбор стиля зависит, в основном, от вида формы, однако в некоторых ситуа- циях (независимо от внешнего вида) один из стилей может быть предпочтитель- нее. При работе с элементом из нескольких страниц лучше выбирать стиль Ярлычки (Tab). Он придает форме аккуратный вид, хорошо знаком пользователю
и подходит, когда корешки вкладок расположены в несколько строк (свойство Несколько строк (MultiRow)). Кнопки в несколько строк имеют намного худ- ший вид. Если проект формы предполагает только две или три страницы, для переме- щения между ними лучше использовать кнопки. В данном случае кнопки будут так же красивы и понятны в использовании, как и вкладки. Выбор третьего стиля (Нет) может показаться бесполезным, учитывая, что элемент управления все-таки предназначен для работы с вкладками. Однако иногда возникают ситуации, когда требуется сделать несколько страниц без вкладок или кнопок. Приведем довольно удачный пример — разработка интер- фейса для пр ограм мы-мастера. В случае формы-мастера, например AddAc- countwizard, элемент с вкладками используется для каждой страницы мастера. А поскольку в программе-мастере существует определенный порядок, в котором должна быть представлена информация, пользователь не должен иметь возмож- ность свободного перемещения со страницы на страницу. Предоставление такой свободы в форме-мастере приведет к проблемам, ведь пользователь сможет выполнять необходимые действия в неправильном поряд- ке. Средствами перемещения с одной страницы на другую в данном случае будут специальные кнопки для перемещения вперед и назад, что позволит выполнять на каждом этапе условную проверку корректности введенных данных. В данной ситуации лучше убрать все вкладки и кнопки, которые обычно служат инстру- ментами навигации. Что более важно, для разработки такой формы удобнее ис- пользовать не многостраничную форму, а элемент управления с вкладками. Подробнее о создании форм для программы-мастера см. урок 25. Изменение стиля вкладок в программе Удачным приемом считается использование программы для изменения стиля вкладок по ходу работы приложения. Предположим, что некоторые пользовате- ли должны иметь доступ только к странице Deposit формы. Вы не хотите, чтобы эти пользователи имели возможность создавать чеки или просматривать их ре- гистр. При открытии формы frm_CheckWriterLimitedFunctionalityпользо- ватель может ввести один из двух идентификаторов: управляющий или пользо- ватель. Если выбран Supervisor (управляющий), то будет отображена нормальная форма frm_CheckWriter, на которой представлены все вкладки. Если же поль- зователь выбирает User (пользователь), он видит только одну вкладку — страни- цу Deposit. Обратите внимание, что в форме в этом случае вкладки отсутствуют. При просмотре той же формы в представлении Конструктор вы увидите, что она идентична форме frm_CheckWriter. Исключение составляет программа в событии Открытие (On Open), которая определяет пользователя и его уровень доступа. Если пользователь идентифицирует себя как пользователя, отображает- ся только одна страница элемента управления с вкладками — Deposit, и элемент управления с вкладками устанавливается на стиль Нет, что предотвращает про- смотр и доступ к другим страницам. Если пользователь идентифицирует себя как управляющий, он видит форму в ее нормальном режиме, со всеми вкладками. Программа для изменения вида вкладок довольно проста, она устанавливает свойство Style для элемента управления. Можно использовать одно из трех зна- чений: Tabs (0), Buttons (1) или None (2), как в конце программы события Открытие (On Open), приведенной ниже.
If InputBox ("Please enter in either Supervisor or User" z "Log In") =_ "User" Then Me.TabControl.Style = 2 Me.TabControl.Pages(1) .SetFocus End If Me.Tabcontrols.Visible = True В начале программы события Открытие находится строка, которая делает элемент управления с вкладками невидимым. Тогда пользователь не видит фор- му изначально открытой со всеми вкладками, т.е., зарегистрировавшись как пользователь, он не увидит, как исчезают вкладки. Запрос на ввод идентифика- ционного статуса выполнен с помощью функции InputBox. Если пользователь вводит User, вкладки отключаются (стиль устанавливается равным 2), а фокус переходит на страницу первой вкладки. Обратите внимание, что страницы нуме- руются, начиная с индекса 0. Отображение и сокрытие страниц Существует еще один замечательный прием — управление отображением от- дельных страниц на элементе управления с вкладками. В результате вы сможете получить невероятный контроль над внешним видом элемента управления и дос- тупом пользователя к определенным страницам вкладок. В данном случае, вме- сто сокрытия всех вкладок, можно скрыть только отдельные из них, установив со- ответствующее значения для свойства Visible страницы. В нижней части формы frm_CheckWriterLimitedFunctionality6buia создана новая кнопка, Hide Tabs, которая позволяет пользователю ввести название вкладки, после чего программа скрывает указанную страницу. Программа работает следующим образом. Private Sub btnHideTabs_Click() Dim TabName As String TabName = InputBox("Введите название вкладки, которую вы хо- тите скрыть.", "Скрытв вкладки") With Me.TabControl , .Pages(0).Visible = True .Pages(1).Visible = True .Pages(2).Visible = True .Pages(3).Visible = True End With Select Case TabName Case "Checks" Me.TabControl.Pages("Checks").Visible = False Case "Deposits" Me.TabControl.Pages("Deposits").Visible = False Case "Adjustments" Me.TabControl.Pages("Adjustments").Visible = False Case "Register" Me.TabControl.Pages("Register").Visible = False Case Else MsgBox "Введено неправильное название.", vbCriticalz_ "Ошибка в названии вкладки" End Select Сначала все вкладки устанавливаются видимыми (Visible). Затем програм- ма вызывает функцию InputBox, чтобы пользователь мог ввести название
Осталось 10 минут вкладки. Оператор Select Case используется с целью определить, какая вкладка должна быть сделана невидимой. Обратите внимание, что в этом приме- ре для страницы вкладки применяется название элемента управления, а не но- мер страницы. Использование приемов ограничения доступа к определенным вкладкам формы может обеспечить дополнительную защиту данных. Естественно, пред- ставленные типы приемов безопасности довольно примитивны. Но в сочетании с другими приемами они могут стать важным элементом эффективной системы защиты данных приложения. Использование события Изменение Иногда при переходе пользователя с одной вкладки на другую требуется выпол- нить какое-либо действие. В такой ситуации на помощь приходит событие Изменение (On Change) набора вкладок. Например, в форме frm_CheckWriter при переходе с вкладки на вкладку срабатывает событие Изменение (On Change). Поскольку каждая вкладка на форме создана для различных типов операций, при переходе с одной вкладки на другую должны отображаться только записи, относящиеся к конкретной вкладке. Таким образом, если пользователь находит- ся на вкладке для чеков, должны отображаться только операции с чеками. Если пользователь находится на вкладке для депозитов, должны быть видны только депозиты. Далее представлен код события Изменение для набора вкладок в фор- ме frm CheckWriter. Private Sub TabControl^Change() Dim CurConn As ADODB.Connection Dim CheckTB As New ADODB.RecordSet Dim FindCrit As String Set CurConn = Current Project. Connection On Error GoTo ErrorHandler With Me Select Case .TabControl.value Case 0 1 Чеки - Checks .Filter = •' [TransType] = ’Check'” .FilterOn = True .Requery Case 1 ’ Депозиты - Deposits ..Filter = " [TransType] = 'Deposit' ,f , ' .FilterOn= True .Requery Case 2 ’ Исправления - Adjustments .Filter "[TransTypel <> 'Deposit* AND [TransType] <> ’Check'" .FilterOn = True .Requery Case 3 ’ Регистр - Register DoCmd. RunCommand acGndSaveRecord .frm_CheckWriterRegisterSubform.Requery If Not IsNull(.[TransID]) Then .lrm_CheckWriterRegisterSubform. SetFocus .frm_CheckWriterRegisterSubform.Form![TransID].Enabled = True .frm^CheckWriterRegisterSubform.Form![TransID].SetFocus
DoCmd.FindRecord Forms! [Check Writer Limited Functionality]![TransID] End If End Select Select Case Me.TabControl.value Case 0, I, 2 .NavigationButtons = True .New.Visible - True .Delete.Visible = True .btnDetails.Visible = False ’ Переход на соответствующий элемент ’ Check Writer, которьд указан в Register If IsNull(![TransID]) Then DoCmd.GoToRecord acActiveDataObject, , acLast Else FindCrit = "TransID = 11 & Me! [TransID] Set CheckTB = Forms![Check Writer Limited I Functionality] .RecordSetClone CheckTB.Find FindCrit If Not CheckTB.EOF Then Forms![Check Writer Limited Functionality].Bookmark = CheckTB.Bookmark End If CheckTB.Close Set CheckTB = Nothing End If Case 3 .NavigationButtons = False .New.Visible = False .Delete-Visible = False .btnDetails.Visible ~ True End Select End With GoTo Done ErrorHandler: If Err.Number = 2105 Then New_Click() Resume Next End If •» - * > Done: End Sub В этой программе используется два оператора Select Case, которые изме- няют вид вкладок и информацию, отображаемую на них. Оба оператора прове- ряют страницу, на которой находится элемент управления. Первый оператор ис- пользуется для изменения записей — в результате будут отображаться только записи для конкретной вкладки. Таким образом, для вкладки Checks, имеющей индекс 0, фильтр отображает только операции-чеки. Для вкладки Deposits, имеющей индекс 1, фильтр отображает только депозиты. Такая фильтрация за- писей выполняется для всех четырех вкладок. Второй оператор Select Case делает видимыми дополнительные кнопки нави- гации. Затем выполняется проверка того, введен ли в поле Trans ID номер опера- ции. После этого программа перемещает пользователя на указанную запись для
случаев, когда в регистре чеков (Check Register) была выбрана какая-либо запись. В противном случае будет выбрана последняя запись. Если пользователь работает с вкладкой Register, кнопки навигации Delete и New становятся невидимыми. о Готово! Обзор В данном уроке рассматривался вопрос программирования элементов управле- ния с вкладками и описывались преимущества использования этого типа эле- ментов по сравнению с многостраничной формой. В уроке были рассмотрены сле- дующие вопросы. • Элементы управления с вкладками могут быть чрезвычайно полезны при разработке дружественного интерфейса. С точки зрения разработчика, эти элементы управления несложно создавать и обрабатывать. • Элемент управления с вкладками обладает уникальной особенностью: он может рассматриваться как контейнер для страниц в форме. Каждая стра- ница, в свою очередь, имеет собственные свойства, с которыми можно рабо- тать и которые представляют коллекцию элементов управления для этой страницы или вкладки. В то же время, элементы управления на странице также являются частью коллекции элементов управления всей формы. Разобравшись со свойствами набора вкладок, можно использовать их в программе. С их помощью несложно изменить внешний вид набора вкла- док, выбирая разные стили. Кроме того, в программе допускается изме- нять вид и функции формы при переходе с одной вкладки на другую в со- ответствии с требованиями конкретной вкладки, на которой находится пользователь. Проверьте себя 1. Почему элементы управления с вкладками так эффективны? (См. раздел "Зачем используют вкладки”.) 2. Какой прием следует использовать, чтобы сделать определенную кнопку на главной форме видимой на странице 0 и невидимой при переходе на страни- цу 1? (См. разделы "Свойства и методы элементов управления с вкладками" и "Изменение стиля вкладок в программе”.) 3. С помощью какого свойства можно определить, на какой вкладке находится поль- зователь? (См. раздел "Свойства и методы элементов управления с вкладками”.) 4. Могут ли элементы управления с вкладками содержать подчиненную форму? (См. раздел "Программирование элементов управления с вкладками”.) 5. Какой прием необходимо использовать, чтобы отобразить отдельные страни- цы или вкладки, а другие сделать невидимыми? (См. раздел "Отображение и сокрытие страниц”.)
УРОК Окна сообщений и приемы обработки ошибок в программе Содержание урока v Использование функции Access MsgBox v Различные типы ошибок в программе ** Обработка ошибок v Коллекция Error и объект Err ЭВ этом уроке мы рассмотрим два самых популярных элемента в программирова- нии приложения. Речь пойдет о связи с пользователем посредством окон сообще- ний и об обработке ошибок. Осталось 30 минут Функция MsgBox Вероятно, одной из самых популярных функций является функция MsgBox (окно сообщения). Она используется довольно часто, поскольку обеспечивает простой способ взаимодействия программы VBA с пользователем. Эта функция не только отображает сообщение, но и возвращает ответ пользователя. Выбор ограничен предопределенным набором кнопок, но в большинстве случаев они описывают все необходимые варианты реакции пользователя.
► Функция MsgBox имеет следующий синтаксис. | MsgBox (текст [, кнопки] [, заголовок] [, файл__справки , контекст\} \При вызове этой функции отображается диалоговое окно со строкой тек- ста. Это строковое выражение может достигать длины до 1024 символов и U включать константу vbdRLF, обозначающую начало новой строки. Параметр кнопки — это необязательное числовое выражение, которое не только отображает набор кнопок, но и определяет пиктограмму, представ- ленную в окне, указывает кнопку по умолчанию и модальность окна сообще- ния. Когда форма открывается как модальная, это обозначает, что перед пе- реходом к другому объекту необходимо сначала закрыть данную форму. Список наборов кнопок представлен в табл. 16.1. В программе можно ис- пользовать числовое значение или (для большего удобства) текстовую кон- станту. Таблица 16.1. Значения и константы для кнопок в функции MsgBox Значение Набор кнопок Константа 0 ОК vbOKOnly 1 OK, Cancel vbOKCancel 2 Abort, Retry, Ignore vbAbortRetryIgnore 3 Yes, No, Cancel vbYesNoCancel 4 Yes, No vbYesNo 5 Retry, Cancel vb RetryCancel 6-15 He используются Чтобы выбрать пиктограмму, необходимо добавить к значению кнопки еще одно значение. Обратите внимание, что эти числа представляют биты в Двоичной системе, что позволяет прибавлять параметры, а также делает их взаимоисклю- чающими. Значения для пиктограмм представлены в табл. 16,2. Таблица 16.2. Значения и константы для пиктограмм в функции MsgBox Значение Пиктограмма Константа Рисунок о 16 32 48 64 Отсутствует Критическое сообщение vb Critical Предупреждение-вопрос Предупреждение- сообщение Информационное сооб- щение vbQuestion vbExc1ama t i on vblnformation 80,96, 112, 128, He используются 144, 160, 176, 192, 208,224,240
Кроме того, можно задать кнопку по умолчанию, добавив еще один параметр в ар- гумент кнопки. В табл. 163 представлены значения для кнопок по умолчанию. Таблица 16.3. Константы для кнопок по умолчанию в функции MsgBox Значение Кнопка по у молчанию Константа 0 Первая кнопка vbDefaultButtonl 256. Вторая кнопка vbDefaultButton2 512 Третья кнопка vbDefaultButton3 768 Четвертая кнопка vbDefaultButton4 По умолчанию окно сообщения является модальным для приложения: это означает, что пользователь должен ответить на окно сообщения, прежде чем он продолжит работу с текущим приложением. Если указать в функции MsgBox значение 4096 (соответствующая константа — vbSystemModal), окно сообщения станет модальным для системы, т.е. все приложения будут приостановлены, по- ка пользователь не ответит на окно сообщения. В функции MsgBox доступно еще несколько параметров, описанных в табл. 16.4. Таблица 16.4. Значения и константы других параметров в функции MsgBox Значение Действие Константа 16384 Добавляет в окно сообщения кнопку Help vbMsgBoxHelpButton 65536 Переводит окно сообщения на передний план vbMsgBoxSet Foreground 524288 Выравнивает текст по правому краю vbMsgBoxRight 1048576 Переводит текст в систему чтения справа нале- vbMsgBoxRtlReading во для арабского языка и иврита В качестве примера предположим, что в окне сообщения необходимо исполь- зовать кнопки Yes/N о в комбинации с кнопкой Help и пиктограммой предупреж- дения, причем кнопка No должна быть кнопкой по умолчанию. Значение аргу- мента будет следующим. vbYesNo + vbExclamation + vbDef aultButton2 + VbMsgBoxHelpButton = 4 + 48 + 256 + 16384 = 16692 Необязательный аргумент заголовок— это строковое выражение, которое отображается в строке заголовка окна сообщения. Если данный аргумент пропу- щен, в панели заголовка отображается название приложения. Если в приложении содержится кнопка Help, необходимо указать значения для двух параметров: файл^справки и контекст. Аргумент файл^справки — строка, в которую включено название файла справки. Аргумент контекст — чи- словое выражение, номер раздела справки для соответствующей темы. Если в окне отсутствует кнопка Help, можно нажать клавишу <F1>. При щелчке на кнопке Help будет вызвано приложение Microsoft Help Workshop или Microsoft HTML Help Workshop. Оно загружает специальный файл справки, определенный строкой файл_справки, и отображает раздел справки, определенный параметром контекст. Дополнительную информацию о справочной системе можно получить в электронной справочной системе Microsoft Access по ключевым словам HelpContextlDfr HelpFtleProperties. При щелчке на кнопке Help окно сообщения не должно закрываться и возвращать значение. Функция MsgBox может возвращать значение, представляемое кнопкой, на которой щелкнул пользователь. Эти значения перечислены в табл. 16.5.
Таблица 16.5. Значения, которые возвращает функция MsgBox, и соответствующие им константы Значение Описание Константа 1 ОК vbOK 2 Cancel vbCancel 3 Abort vbAbort 4 Retry vb Retry 5 Ignore vbIgnore 6 Yes vbYes 7 No vb N о Пример использования функции MsgBox приведен в листинге 16.1. Эта под- процедура взята из формы frm__BankAcountsUnbound приложения Check Writer. Подпрограмма будет вызвана, если форму закрыть или выгрузить. Если элемент управления flagEdited имеет значение True, значит, пользователь изменил данные в форме или ввел новые данные и не сохранил их. Если значение flag- Edited равно True, отображается окно сообщения, в котором предлагается со- хранить внесенные изменения. Функция вызывается со значением vbYesNoCan- cel для кнопок, поэтому отображаются кнопки Yes, No и Cancel. Функция воз- вращает значение, определяющее ответ пользователя. Это значение присваивает- ся переменной Answer. Если Answer содержит значение, соответствующее кнопке Cancel, переменная Cancel устанавливается равной True, и форма не за- крывается. Если Answer содержит значение, соответствующее кнопке Yes, будет вызвана функция uf__SaveRecord для сохранения данных. Наконец, если поль- зователь щелкнул на кнопке No, форма будет закрыта без сохранения данных. Листинг 16.1. Пример использования функции MsgBox Private Sub Form_Unload(Cancel As Integer) Dim Answer As Integer If Me.FlagEdited Then Answer = MsgBox ("Do you want to save your changes?", vbYesNoCancel) If Answer = vbCancel Then Cancel = True If Answer = vbYes Then uf-SaveRecord Me Ehd If End Sub В приложении Check Writer задается как минимум 90 вызовов функции MsgBox, и это обычная ситуация для реального приложения. Обязательно ис- пользуйте мощные возможности, предоставляемые данной функцией, чтобы обеспечить взаимодействие с пользователями. Продукт EZ Extensions от Database Creations, Inc. (www. databasecreations. com) содержит особое окно сообщения, которое может быть специально настроено и ис- пользовано вместо стандартного окна сообщения Access. Оно совместимо со стандарт- ным окном Access, а также обеспечивает возможность использования специальных пиктограмм, различных шрифтов и размеров шрифтов, различных способов выравни- вания текста и задания других параметров — цвета шрифта, цвета фона и т.д.
Осталось 20 минут Ошибки Предположим, что вы успешно завершили проверку синтаксиса с помощью редакто- ра VBA, а также исправили ошибки, которые находит Access при компиляции при- ложения. Таким образом, остаются только ошибки, происходящие в ходе работы приложения. Ошибки в процессе выполнения программы могут быть вызваны раз- личными причинами. Они описываются следующими типами ситуаций. • Происходит фатальная ошибка, и приложение завершает работу. • Происходит неучтенная в программе ошибка, и отображается служебное диалоговое окно Access. • Происходит ошибка, возможность которой была учтена в программе, и программа обрабатывает ошибку. • Происходит неизвестная приложению ошибка, которая не вызывает ошибку Access. Типы ошибок Фатальная ошибка — это ошибка, которая не подлежит восстановлению и приводит к завершению работы приложения. Как правило, она возникает в ре- зультате действий за пределами среды Access, поэтому Access ее обработать не может. Фатальные ошибки, как правило, происходят при вызове функций Win- dows API. Вызовы Windows API — это вызовы процедур библиотеки Windows из приложения. Примером такого типа вызова может служить получение разреше- ния экрана. Чтобы получить информацию подобного рода, обратитесь к Windows. Фатальные ошибки, в общем-то, не могут быть исправлены или учте- ны в программе VBA, поэтому в данном разделе мы остановимся на типах оши- бок, которые можно контролировать в программе. Диалоговое окно ошибки Access отображается для ошибок, возможность ко- торых не была учтена в программе (рис. 16.1). Данное свойство вам пригодится при разработке, поскольку оно позволяет определить конкретную строку кода, вызвавшую ошибку. Щелкните на кнопке Debug в служебном окне ошибки — откроется окно VBA. В результате вызвавшая ошибку строка кода будет выделе- на цветом. Конечные пользователи не должны сталкиваться с таким результатом при работе приложения. Используя обработку ошибок, следует уведомить поль- зователя .об ошибке, но он не должен сам решать данную проблему, поскольку программа либо исправляет ошибку, либо игнорирует ее. Как было указано в списке возможных ситуаций, связанных с ошибками, по- следний тип ошибки — это неизвестная приложению ошибка (например, логиче- ская ошибка программы). При этом пользователь не будет уведомлен, ведь при- ложение работает так, как его запрограммировали. Проблема состоит в том, что программа будет выполнять неверные действия и выдавать неправильный ре- зультат. Обычно такую ошибку тяжелее всего обнаружить. С неизвестными в приложении ошибками можно работать двумя способами. • Тестировать, тестировать и еще раз тестировать. • Проверять результаты в программе — вводить дополнительную, резерв- ную проверку результатов. Чтобы ознакомиться с простым примером такого рода проверки результата, пред- ставьте себе электронную таблицу с числами. Создайте столбец, в каждой строке ко- торого вычисляется промежуточная сумма всех значений по данной строке. Затем промежуточные суммы сложите, чтобы получить сумму всех чисел. Теперь для про-
верки результата создайте новую строку, в которой будут суммироваться числа в ка- ждом столбце — промежуточная сумма для каждого столбца. Общая сумма промежу- точных столбцов должна быть равна первой сумме, полученной в результате сложе- ния промежуточных сумм по строкам. Если подобные действия не выполняются, значит, ошибка, которую необходимо исправить. Рис. 16 J. Диалоговое окно ошибки Access Данный тип проверки ошибок довольно специфичен для каждого приложе- ния. Поэтому в данном уроке мы будем рассматривать только ошибки, которые может выявить Access. Кроме ]того, приложение Check Writer содержит большое количество кода, предназначенного для обработки специфических ошибок, ко- торые могут происходить в этом приложении. Такие процедуры описываются во многих разделах книги. » Элементы обработки ошибок Access и ADO предоставляют четыре основных элемента программирования для обработки ошибок. • Коллекцию Errors. • Объект Err. • Операторы VBAE г го г, • Событие Error. Когда Access обнаруживает ошибку, в большинстве случаев для нее создается специальный объект. Такие объекты ошибок в Access, как Access и ADO, основы- ваются на средствах обнаружения ошибок. Коллекция Errors — часть объект- ной модели ADO. Объект Err — часть объектной модели Access. Помимо этих двух элементов, в Access существует событие Error. Оно происходит тогда, когда в форме или отчете встречается ошибка. Коллекция Errors Если ошибка происходит в объекте ADO, в коллекции Errors объекта Connec- tion создается объект Error. Эти объекты называют ошибками доступа к данным (data access errors). Когда происходит ошибка, коллекция очищается, в нее записы- вается новый набор объектов. Хотя коллекция существует только для одного события ошибки, это собьпие может генерировать несколько ошибок. Все ошибки хранятся в коллекции Errors, которая является объектом объекта Collection, а не ADO. Коллекция Errors имеет одно свойство, Count, которое отображает количе- ство ошибок или объектов ошибок. Свойство Count имеет значение 0, если оши- бок не было. Каждый объект Error содержит несколько свойств, включая
Description, HelpContext, HelpFile, Number и Source. Если произошло не- сколько ошибок, ошибка самого нижнего уровня становится первой ошибкой в коллекции, а ошибка самого верхнего уровня — последней. В том случае, если произойдет ошибка ADO, объект VBA Err отобразит номер ошибки для первого объекта в коллекции Errors. Чтобы узнать о других ошиб- ках ADO, следует просмотреть коллекцию Errors. (Пример коллекции ошибок Errors в ADO см. в листинге 16.3 далее в этой главе). Объект Err Объект Err создается в VBA. Когда происходит ошибка, информация о ней сохраняется в объекте Err, который может содержать информацию только об од- ном объекте за раз. Поэтому при возникновении ошибки объект Err очищается и затем обновляется новой информацией о последней ошибке. Объект Err обладает несколькими свойствами, включая Number и Descrip- tion. Кроме того, объект Err имеет два метода: Clear — для очистки информа- ции из объекта Err и Raise — для имитации ошибки. Если произошла ошибка, имеющая отношение к механизму баз данных Jet или ADO, дополнительную информацию следует искать в коллекции Errors. si • Операторы ошибок VBA В VBA используется два основных оператора для обработки ошибок: On Er- ror и Resume. Оператор On Error включает или отключает обработку ошибок. Существует три формы оператора On Error. • On Error GoTo метка • On Error GoTo 0 . к \ • On Error Resume Next Оператор On Error GoTo метка активизирует процедуру обработки ошибок. Метка указывает на начало процедуры. После выполнения этого оператора сразу же активизируется обработка ошибок. Если происходит ошибка, программа пе- реходит на строку, обозначенную аргументом метка; метка должна находиться в начале процедуры обработки ошибок. Чтобы отключить обработку ошибок, используется оператор On Error GoTo 0. Этот оператор, кроме отключения обработки ошибок, обнуляет свойства объекта Err. Оператор On Error Resume Next игнорирует строку, которая вызвала ошибку, и продолжает выполнение программы со следующей строки. Процедура обработки ошибок при этом не вызывается. Данный оператор пригодится также в том случае, если требуется проигнорировать ошибки. Кроме того, он может ис- пользоваться для проверки значения объекта Err сразу же после строки, на ко- торой, предположительно, может произойти ошибка, и обработать ошибку в этой же процедуре, а не в процедуре обработки ошибок. Чтобы вернуться в главную процедуру из процедуры обработки ошибок, ис- пользуйте оператор Resume. Если выполнение программы должно прекратиться после ошибки, оператор Resume использовать не обязательно — просто выйдите из процедуры. Как и для оператора On Error, для оператора Resume-существует три формы. • Resume или Resume О з» • Resume Next • Resume метка Уро 16. Окна сообщений и приемы обработки ошибок в программе 259 /
Оператор Resume или Resume 0 возвращает программу к строке, на которой произошла ошибка. Он используется, в основном, в тех случаях, когда пользова- тель должен что-либо исправить. Например, ошибка произошла по причине того, что пользователь неверно ввел название файла, который должен быть открыт в программе. После обнаружения ошибки можно вернуть выполнение программы назад и снова запросить у пользователя имя файла. Если процедура обработки ошибок исправляет или игнорирует проблему, ко- торая вызвала ошибку, используется оператор Resume Next. Он возвращает вы- полнение программы на строку, следующую сразу же за строкой, в которой про- изошла ошибка. Если выполнение программы должно продолжаться с какого-то другого мес- та, а не со строки, в которой произошла ошибка, используется оператор Resume метка. Он переводит программу к строке, определенной аргументом метка. Событие Error I Для форм и отчетов Access включает событие Error. Оно происходит, когда Осталось в форме ил и отчете встречается ошибка, и предоставляет хороший способ пере- ю минут хвата ошибки, если программа VBA в этот момент не работает. Для перехвата ошибок создается процедура события для события On Error. Процедура предла- гает один из следующих вариантов, в зависимости от того, где произошла ошиб- ка: в форме или в отчете. Private Sub Form_Error (DataErr As Integer, Response As Integer) 1 Здесь находятся операторы обработки ошибки End Sub Private Sub Report_Error(DataErr As Integer, Response As Integer) ’ Здесь находятся операторы обработки ошибки End Sub Обе подпрограммы имеют два аргумента: DataErr и Response. DataErr — код ошибки, который возвращает объект Err при возникновении ошибки. Обра- тите внимание, что объект Err не получает информацию об ошибке, когда она происходит. Для определения типа ошибки используется аргумент DataErr. Второй аргумент, Response, должен содержать одну из следующих констант. acDataEr г Continue Игнорирует ошибку и продолжает работу, не отображая служебное сообщение Access об ошибке acDataErrDisplay Отображает принятое по умолчанию в Access сообщение об ошибке (используется по умолчанию) При использовании значения асDataErrContinue можно вместо стандартно- го сообщения об ошибке отобразить собственное сообщение. Процедуры обработки ошибок Очевидно, существует довольно много способов для обработки ошибок, кото- рые происходят в формах, отчетах или в программе. Каждая форма и отчет, а также каждая функция и подпрограмма могут (и должны) иметь свою процеду- ру обработки ошибок. Это вполне нормально, когда значительная часть процесса разработки посвящена обработке ошибок. Анализируя различные компоненты приложения Check Writer, вы увидите большое количество примеров процедур обработки ошибок. Возможно, одна из самых часто используемых приведена в листинге 16.2.
Листинг 16.2. Структура процедуры обработки ошибок Function SampleCode 1 Здесь расположены операторы Dim On Error GoTo ErrorHandler ’ Здесь находится код функции GoTo Done ErrorHandler: ’ Здесь находится программа обработки ошибок MsgBox err.description ’ Здесь находится оператор Resumef или ничего ’ не заданоf и функция просто завершает работу Done: ’ Здесь находятся завершающие операторы End Function ' Оператор On Error активизирует обработку ошибок; когда происходит ошибка, выполнение программы продолжается со строки с меткой ErrorHan- dler. Это может быть любая метка, составленная в соответствии с правилами VBA. Программа обработки ошибок работает с ошибкой, после чего возобновляет выполнение в теле процедуры или просто выходит из функции или подпрограм- мы. Включение оператора MsgBox в процедуре обработки ошибок — стандартный способ уведомить пользователя о том, что произошла ошибка. " '$1 Когда происходит ошибка в функции или подпрограмме, для которых не написана собственная процедура обработки ошибок, VBA возвращается в вызывающую процедуру и ищет код обработки ошибок там. Данный процесс продолжается до тех пор, пока не будет найдена процедура обработки ошибок. Если процедура об- работки ошибок не найдена, программа отображает служебное сообщение Access. Создание процедуры обработки ошибок Когда в приложении происходит ошибка, вы можете выбрать один из сле- дующих вариантов. л • Проигнорировать ошибку и возобновить выполнение программы. • Исправить в программе проблему, которая привела к ошибке, и возобно- вить выполнение. • Попросить, чтобы пользователь исправил проблему, и возобновить выпол- нение. • Уведомить пользователя о проблеме и продолжить выполнение программы. • Уведомить пользователя о проблеме и прервать выполнение программы. В данном разделе мы рассмотрим фрагмент программы для общей процедуры обработки ошибок, информирующей пользователя о проблеме. Информацию об ошибке мы получаем из объектов Error и Err. В листинге 16.3 представлена процедура обработки ошибок, которая может ис- пользоваться в процедуре, работающей с соединением ADO. Если происходит ошибка, выполняется фрагмент программы, следующий за меткой ErrorHandler. Программа сначала проверяет, содержит ли объект Error какие-либо элементы. Если объект Error не пуст, программа выполняет проверку, содержится ли в объек- те Error такая же ошибка, что и в Err. Если это так, то возникшая ошибка — это
ошибка ADO, описание всех ошибок из коллекции Error содержится в переменной strMessage. Если нет, значит, ошибка произошла из VBA; будет отображено зна- чение Err .Description. Данная процедура обработки ошибок используется в форме frm_BankAccountsUnboundприложения CheckWriter. Листинг 16.3. Общая процедура обработки ошибк Dim erm As New ADODB.Connection Dim errX As ADODB.Error Dim strMessage As String On Error GoTo ErroHandler ’ Здесь находится код процедуры GoTo Done ErrorHandler: If cnn.Errors.Count > 0 Then If err.Number = cnn.Errors.Item(0).Number Then 1 ошибка является опмбкой соединения ADO For Each errX In cnn.Errors strMessage = strMessage & err .Description & vbCRLF Next MsgBox strMesssage, z "Обработка ошибок ADO" End If Else ’ ошибка является ошибкой VBA MsgBox err.Description, z "Обработка ошибок VBA" End If Done i ---------- Другие идеи ЕСри проектировании приложения можно различными способами расширить его возможности по обработке ошибок. Тем не менее, описать все эти приемы в данной книге мы не можем- Далее мы представим лишь некоторые из них. • Создайте определенную пользователем ошибку. Если произойдет что-то не так в данных приложения или в действии, которое выбрал пользователь, можно использовать метод Raise объекта Err, который вызовет ошибку и запустит стандартную процедуру обработки ошибок. Для определенных пользователем ошибок используется диапазон значений 513-65535, кото- рые задаются в качестве аргумента в методе Raise. Создайте стандартную процедуру обработки ошибок, которая вызывается из нескольких процедур. Запишите ошибки в журнал ошибок. Создайте таблицу, в которой будет храниться информация об ошибках, происходящих в ходе работы прило- жения. Затем можно проанализировать историю ошибок и усовершенство- вать приложение или увидеть тенденции появления ошибок. Вместо того, чтобы просто отображать сообщение об ошибке, можно обес- печить отчет о проблеме для вывода на печать и направить его в группу технической поддержки приложения. Кроме того, можно также автома-
тически создать сообщение электронной почты, которое будет отправлено в службу поддержки. Грн Обзор В этом уроке была рассмотрена функция MsgBox, а также способы обработки ошибок, готово! возникающих в приложении. Основные идеи данного урока изложены ниже. • Одна из самых популярных функций — функция окна сообщения MsgBox. Она обеспечивает простой способ взаимодействия программы VBA с поль- зователем — путем отображения сообщения и возвращения в программу реакции пользователя. • Создав процедуру обработки ошибок, вы сможете уведомить пользователя о проблеме и избежать непредвиденного прерывания работы приложения. • В процедурах обработки ошибок может быть выполнено определенное дей- ствие, которое либо игнорирует ошибку, либо исправляет проблему без участия пользователя. • В процессе разработки необходимо уделить особое внимание вопросам раз- работки ошибок. Проверьте себя 1. Почему функция MsgBox является одной из самых часто используемых? (См. раздел "Функция MsgBox”.) 2. Опишите четыре возможные ситуации, когда в ходе выполнения программы происходит ошибка. (См. раздел ‘'Ошибки”.) 3. Когда и почему происходят фатальные ошибки? (См. раздел "Типы ошибок”.) 4. Как уменьшить вероятность возникновения ошибки приложения? (См. раздел "Типы ошибок”.) 5. Назовите типы объектов ошибок и случае использования каждого из них. (См. раздел "Элементы обработки ошибок”.) 6. Когда в программе следует применять операторы Resume и Resume О? (См. раздел "Операторы ошибок ГВА”.) 7. Какой тип ошибки происходит, если свойство err. number возвращает значе- ние б00?(См. раздел "Другие идеи”.)
ЧАСТЬ III Суббота. День. Обзор 1. Верно ли, что кнопочная форма является одним из типов системы меню? 2. Правильно ли утверждение о том, что для создания кнопочной формы должен использоваться менеджер кнопочных форм? 3. Можно ли строку меню создать с помощью объекта Commandsаг Access 2002 или путем создания макроса? 4. Верно ли, что события Клавиша вверх (KeyUp), Клавиша вниз (KeyDown) и Клавиша вправо (KeyRight) — три типа событий клавиатуры? 5. Какое (или какие) из следующих утверждений верно для несвязанных форм? а. Они не имеют постоянного соединения и открытого представления дан- ных, находящихся в основе формы. б. Они получают по одной записи за раз. в. Они улучшают скорость работы программы. г. Изменения записей не попадают под контроль программы. Ь. Все вышеперечисленное. 6. Верно, ли что при использовании несвязанных форм Access автоматически обрабатывает блокирование записей? 7. Назовите три функции, которые необходимо включить в несвязанную форму, чтобы она стала функциональной. 8. Назовите два недостатка использования несвязанных форм. 9. В каких случаях лучше применить не флажок, а группу переключателей? 10. Верно ли, что в поле со списком можно выбирать несколько элементов одно- временно? 11. Какие из свойств являются уникальными для обычного списка (list box) и поля со списком (combo box)? a. Controlsource’ б. RowSource в. Font Size г. After Update д. Column Width e. Bound Column ж. Multi Selection
12. Вы хотите написать программу, которая будет происходить тогда, когда поль- зователь выбирает элемент, отсутствующий в списке. В каком событии дол- жен быть помещен этот код? a. After Update б. Before Update в. In List г. Not In List 13. Назовите три основных типа представлений формы. 14. Верно ли, что субформу необходимо связывать с главной формой? 15. Назовите самую главную причину, по которой следует отдать предпочтение непрерывной форме, а не листу данных. 16. Какие свойства используются для связывания данных подчиненной формы с формой? 17. Назовите три аргумента в пользу использования элементов управления с вкладками. 18. Какое событие следует использовать для выполнения программы при перехо- де пользователя с одной вкладки на другую? a. After Update б* On Click в. On Change г. On Tab Click 19. Верно ли, что свойство Visible можно устанавливать только для элемента управления с вкладками в целом? 20. Какие три стиля вкладок используются в приложении Access?

УРОК Импорт и экспорт данных Содержание урока * Основные концепции импорта и экспорта данных * Создание спецификаций импорта/экспорта v Программирование интерфейса импорта * * Программирование интерфейса экспорта Э Возможности коммуникации между разными приложениями стали стандарт- ным компонентом в разработке современных прикладных продуктов. Установ- ление связи между двумя отдельными программами, перенос данных из сущест- зоршмут вующеи версии в более новую версию программы, общий доступ к данным с раз- личных платформ — важные возможности, однако наиболее значимой из них является импортирование и экспортирование данных. Таким образом, одной из основных функций в любой программе баз данных является возможность импор- та и экспорта данных. К счастью, в Access включен мощный встроенный мастер, который помогает выполнить все действия, необходимые для импорта или экспорта данных. Кроме того, учитывая возможности VBA, можно спроектировать специальные интер- фейсы, предоставляющие пользователям еще более понятные средства для обра- ботки внешних данных. Импорт и экспорт Access содержит встроенные возможности импорта и экспорта — мощные, гибкие и простые в использовании. Можно импортировать или экспортировать данные в другую базу данных, в электронные таблицы или базу данных SQL, поддерживающую ODBC. Фактически, Access предоставляет возможность прямо импортировать или экспортировать данные из ряда популярных готовых про- дуктов — баз данных и электронных таблиц. Кроме того, Access делает возмож-
ным обмен данными со стандартными текстовыми файлами, что значительно расширяет функции приложений. В табл. 17.1 перечислены форматы, в которые можно импортировать данные и из которых можно экспортировать данные баз данных Access. Таблица 17.1. Файловые форматы, которые поддерживаются в Access Источник данных Версия/формат Базы данных Access 2.0, 7.0/95, 8.0/97, 9.0/2000 Microsoft Access Project 9.0/2000 dBASE III, III+, IV и 5 Для соединения с версией 7.0 требуется Bor- land Database Engine версии 4.x или выше Paradox 3.x, 4.x, 5.0 Для соединения с версией 8.0 требуется Bor- land Database Engine версии 4.x или выше Электронные таблицы Microsoft Excel Электронные таблицы Lotus 1-2-3 Microsoft Exchange Текстовые файлы с разделителями Тестовые файлы фиксированной ширины HTML 3.0, 4.0, 5.0, 7.0/95, 8.0/97, 9.0/2000 .wks, .wkl, .wk2, .wk3 и .wk4 Все версии Все наборы символов Все наборы символов Для списков; версия 3.x для списков и таблиц XML Таблицы SQL, Microsoft FoxPro и все ос- Visual FoxPro 2.x, 3.0,5.0 и 6.x (только импорт) тальные источники данных, поддержи- вающие ODBC Импорт данных В Access можно выполнять два типа импорта данных: собственно импорт (когда данные копируются в базу данных) и создание связанной таблицы. При импорте данных информация копируется в существующую базу данных и стано- вится ее частью. Данные могут образовать новую таблицу или присоединиться к существующей таблице. Второй тип, связанная таблица, означает, что информа- ция остается внешней для базы данных и не будет в действительности импорти- рована в базу данных. Какой метод лучше? Ответ на этот вопрос зависит от нескольких факторов. Им- порт данных в базу данных рекомендуется выполнять в следующих ситуациях. • Когда очень важна скорость работы приложения. Локальные таблицы обеспечивают лучшую эффективность. Работа Access оптимизирована на операции с локальными данными в формате Access. • Когда не используется общий доступ к данным для нескольких приложе- ний баз данных. В этом случае другие внешние приложения не будут по- лучать доступ к данным в таблице. • Информация, которая содержится в таблице, не часто обновляется, или данные представляют одномоментную информацию. • Осуществляется преобразование из одного формата в другой, поэтому не требуется поддерживать старый (существующий) формат.
Метод создания связанных таблиц предпочтителен в следующих ситуациях. • В структуре приложения есть таблицы баз данных из базы данных, кото- рая хранится отдельно от базы данных приложения. • Необходима постоянная возможность обновления данных, а исходные дан- ные должны быть доступны другим приложениям. • • Информация часто обновляется из других приложений. • Размер файла базы данных превышает установленный в Access предел для локальных таблиц— 1 Гбайт. Вопросы, касающиеся импорта данных Импорт данных — в действительности несложный процесс. Трудности могут возникнуть не в том, как перенести данные в Access, а как проверить, что данные в локальных таблицах обновляются правильно. Импорт данных можно разбить на следующие этапы. 1. Организация данных. 2. Формат данных. 3. Создание соответствий данных. 4. Присоединение записей. В следующих четырех разделах эти этапы рассматриваются более подробно. Организация данных для импорта Способ объединения и организации данных зависит от используемой плат- формы баз данных. Если база данных, из которой должны быть скопированы данные, представляет другую базу данных Access, можно импортировать всю таблицу или ее отдельные части. В последнем случае используйте запрос и им- портируйте результаты запроса. Кроме того, вы вправе извлечь информацию из нескольких таблиц в один запрос, а затем импортировать этот результат. тс Информация, которая извлекается из базы данных и таблицы, из которых , и она, полностью определяется тем, что необходимо импортировать в текущую ба- • зу данных. Сначала следует собрать информацию или импортируемые данные из соответствующих таблиц. Когда информация будет собрана, можно перехо- дить к ее форматированию. Форматирование данных Исходя из возможности чтения многих различных типов файловых форма- тов, первым шагом для импорта данных в Access является получение файла дан- ных в формате, который может читать Access. Этот формат зависит от типа внешней программы, из которой будут получены данные. При импорте данных из других баз данных Access конвертировать данные нет необходимости. Даже если данные поступают из другой базы данных, Access мо- жет читать их непосредственно (без конвертирования) из таких источников, как FoxPro, dBASE и Paradox. Кроме того, Access воспринимает данные из электрон- ных таблиц — Excel и Lotus. Что же делать в тех случаях, когда данные импортируются в Access из не- стандартной платформы? Например, вы работаете со старой системой на базе MS- DOS, старой универсальной ЭОМ или с популярным ранее, но сейчас малоис- пользуемым форматом Btrieve. В таких ситуациях данные потребуется преобра-
зовать в формат, который доступен для чтения в Access. В большинстве случаев это означает экспорт данных из внешнего приложения в текстовый файл. Текстовые файлы могут иметь много разных форматов, но их условно можно разделить на две группы: с разделителями или фиксированной ширины. В тек- стовом файле с разделителями (delimited text file) поля разделены определен- ными символами, и каждая отдельная запись представляет собой отдельную строку. Символы-разделители (delimiters) — это принятые стандартные симво- лы: запятая, точка с запятой, пробел или символ табуляции. Кроме того, в не- стандартных текстовых форматах иногда используются другие специально опре- деленные символы. Для файла с разделителями не нужно определять ширину полей (рис. 17.1). Каждая строка считается отдельной записью, и при чтении строк слева направо каждый символ-разделитель будет указывать на новое поле. 1Ы ( hMhWiiM <sv btoKHui “ X файл Правка Формат -Вид Справа 'Tran.sID,1"TrinsType,/AccountNumbtf"1'Chec1fiNurr.bsr'',nCheckDaU,,Fiyeel'I'Fayrr.entAmour.t','’Depo5nArriount''r,Memo,1’Cteai!-dn,*Void.’1 а "Print","Voucher*,“Selected" 2,"Beginning Belance","233 42 8964",0,23/3/2000 0 00 00. ’,$0.00,$1600.00,"Initial Balance Transfer from Other Account",1,1,0,0 3,"Check",“233 42 8964“,101,30/1/2000 0D0W,"R*ndomHW,$125C 00 $0 00,“BookOrder #950215-23u,l Д0,“Рау To. Random House 1/30/2000 $1,250.00",0 CE-puung BalMice","I23 456 555“ .0.28/'/2000 0:0000, $0 00 $2ЮП0„1М,0 5,'Deposit',’123 456555’Д28/1/2000 0.00.00," ",$0 00,$:o0 00. OjUJJD 6,"Other Income'," 123 456 555",0,9/2/2000 0 90 00," ",$0.00,$60.00„0,0,0„0 8, Check", "23342 8964",103,30/1/20000.0000, binnacle Publishing",$275 35,$0.00,"For Code Print Pro Documentation", 1,1,0,0 9,"Deposit","233 42 8964",0,30/1/2000 0 00 00," ",$0.00,$9500.00,“Monthly Check Receipts ,1,1,0„0 11,"Check","233 42 8964",102,24/1/20000^060,"Pre-Press",$256.37,$0.00,"AdFilm for Access Advisor",l,0,0„0 12,"Check","233 42 8964’,1 j4,25/1,2030 DAW/Heritage Pnnt-re ",$12562j,$0j0Q,*New Ye il I Can Run My Б-жьш Brochures",! Д0„0 13, Check",“233 42 8964",105,25/1/2000 0:00.00,"Keystone Videos",$1560 00.$0 00,"Access Developer Videos",1,1,0„0 14,"Che-k","233 42 8964",106,27/1/2000 000.00, IDO Books",$236123,$0.00, 'PC World Access 2 Bible Books",0,0,0„0 15,"Check","233 42 8964",107,27/1/2000 0:00:90, 'Champlin",$570.00,$0.00, Boxes for Products",0,0,0,"Pay To: Champlin 1/27/201 0 $570.00 ‘,0 16,“Check", '233 42 8961 ',108^0/1/2000i: 00 DO, Stab of Connecticut'1,$125632,$0.0D, 'January Sales Taxes", 0,0,0„0 17,“Deposit","233 42 8964",0,31/1/2000 0:00:00," ",$0.00,$1000 00,"Deposit from Samson Corp." Д1.0.Л 18,"Interest1, 23342 8964” Д1/2/20000.00:00," '',$0.00,$10.00,"January 1995Interest',1,1,0„0 19,"ServiceCharge' ,"233 42 8964",0,l/2/2000 0.00.00," ",$18 35,$0.00,'January 1995 ServiceCharge",1,1,0„0 22,"Check","123 456 555"ДО/2/2000 ОЙОЩ’АА Test Supplier 1",$15.03,$0.00,"PO 95020111",0,0,0„0 23,"Check","23342 8964",10918/2/20 l0:0ft00,"PrivatePrinlers",$205.64,$0.00„0,0,0„0 24,"Check","123436 555"ДОД /3/2000 0.00:00, "HeritageOil",$25.00,$0.00„0.0,0„0 26, "Check", "23342 8964",110,17/3/20000:00.00, “Roadside Diner", $20.00,$0.00,0,0,0„0 28,"Deposit","23342 8964",0,17/3/2000 0 00.00,"",$0.00, $100.00,0,1,0,0 29,"Check","233 42 8964",111,22/3/20000:00.00," Acme Vending",$99.00,$0 00„0,0,0,0 30,"Check" ,"23342 8964“,112,22/3/20009.Gi) 00 "Acme Vending",$99.99,$0.00, Д0,0„0 31,'Check","233 42 8964",113,15/3/2000 000;00,"PrivatePriniers",$52.00,$0.00,0,0,0,0 32, "Check","123 456 555",204,15/3/20000:00:00, "AcmeVending",$20.00,$0.00,0,0,0,0 Рис. 17Л. Пример текстового файла с разделителями, где для отделения по- лей используется запятая. Обратите внимание, что первая строка содер- жит названия полей Файл фиксированной ширины, или файл с фиксированной шириной полей (fixed-width file), не использует символов для разделения полей. В данном форма- те каждая запись также находится в отдельной строке. Однако текстовый файл форматируется таким образом, что в нем указывается ширина каждого поля. Попросту говоря, данные форматируются так, что поля выравниваются в струк- туре типа столбцов (рис. 17.2). Ширина столбцов определяет размер полей, при- чем данные каждого поля должны помещаться в размер столбца. Создание соответствий данных Создание соответствий (mapping) — это установление соответствий поля во внешней таблице с полем в целевой таблице, а также внешней таблицы с целевой таб- лицей. Очевидно, если импортируемая информация не должна присоединяться к су- ществующим таблицам, данный вопрос решать не требуется. Однако в большинстве случаев вам придется записывать данные в уже существующие таблицы.
□ |Ы 1 h- f iiiti 1 n.vdwl'llfi (<1 W»n<n*inl . 1 П * *айг I1P4BM вид Всгмка Формат спреем 2 & Н Л Л М » о 2 Beginning Balance 233 42 8964 D 23/3/2000 0:00:00 $0.00 $1' 3 Check 233 42 8964 101 3Q/1/2000 QsOO:CO Random House $1250.00 $0 4 Beginning Balance 123 455 555 0 28/1/2000 0:00:00 $0.00 52Г 3 Deposit 123 456 555 0 28/1/2000 0:00:00 $0.00 $2t 6 Other Income 123 455 555 0 9/2/2000 0:00:00 $0.00 $5( 8 Check 233 42 8964 103 30/1/2000 0:00:00 Pinnacle PUblishix.r $275.35 $0 9 Depo it 233 42 8964 0 30/1/2000 0:00:00 $0.00 $9.' 11 Check 233 4 2 8964 102 24/1/20 0 0 0:00:00 Pre-Press $256.37 $0 12 Check 233 42 8964 104 25/1/2000 0:00:00 Heritage Printers $1256.23 $0 13 Check 233 4 2 8964 105 25/1/2000 0:00:00 Keystone Videos $1560.00 $0 14 Check 233 42 8964 106 27/1/2000 0:00:00 IDG Books $2361.23 $Q 15 Check 233 42 8964 107 27/1/20 0 0 0:00:00 Champlin $570.00 $0 16 Check 233 42 8964 108 30/1/2000 0:00:00 State of Connecticut $1256.52 $0 17 Deposit 233 42 8964 0 31/1/2000 0:00:00 $0.00 $lt 18 Interest 233 42 8964 0 1/2/2000 0:00:00 $0.00 $1( 19 Service Charge 233 42 8964 0 1/2/20 0 0 0:00:00 $18.35 $0 22 Check 123 456 555 202 9/2/2000 0:00:00 AA Test Supplier 1 $15.03 $0 23 Check 233 42 8964 109 18/2/2000 0:00:00 Private Printers $205.64 $0 24 Check 123 456 555 203 1/3/2000 0:00:00 Heritage Oil ?25.00 $0 26 Check 233 42 8964 110 17/3/2000 0:00100 Roadside Diner $20.00 $0 28 Deposit 233 42 6964 0 X7/3/2000 0:00:00 $0.00 $U 29 Check 233 42 6964 111 22/3/2000 0:00:00 Acme Vending $99.00 $0 30 Check 233 42 8964 112 22/3/2000 0:00:00 Acme Vending $99.99 $0 31 Check 233 42 8964 113 15/3/2000 0:00:00 Private Printers $52.00 $□ 32 Check 123 456 555 204 15/3/2000 0:00:00 JLcn® Vending (20.00 $0 33 Check 233 42 8964 114 2/3/2000 0:00:00 Private Printers $320.00 $0 34 Check 233 42 89c»4 US 2/3/2000 0:00:00 Acne Vending $176.CO $0 35 Check 2ЭЭ 42 8964 116 28/10/1999 0:00:00 $0.00 $0 36 Check 233 42 8964 117 28/10/1999 0:00:00 $0.00 $0 37 Check 233 42 8964 118 28/10/1999 0:00:00 $0.00 $0 38 Check 233 42 8964 119 28/10/1999 0:00:00 Al'S Costume Shop $0.00 $0 39 Check 233 42 8964 120 28/10/1999 0:00:00 Rudy’s Steak House $0.00 $0 40 Check 233 42 8P64 121 31/Ai/1999 0:00:00 $0.00 IC 1 Дяе ^Фава Рис. 17.2. Пример файла фиксированной ширины. Обратите внимание на формат в ви- де столбцов: каждый столбец определяет отдельное поле При создании соответствий внешних данных с существующими таблицами воз- никает три вопроса: соответствие, определение и порядок данных. Первый вопрос со- стоит в том, чтобы правильно установить соответствие между полями и таблицами. Для этого необходимо знать определение, функцию или предназначение полей и таб- лиц. Представим старое школьное упражнение, в котором предлагается два столбца с терминами и их определениями. Задание состоит в том, чтобы поставить в соответст- вие терминам из левой части правильные определения из правой части таблицы. По- ля и таблицы из внешнего источника могут иметь другие названия, но само содержа- ние соответствует существующим полям и таблицам. Например, во внешней таблице может находиться поле PayToName, а во внутренней — поле Payee. В обоих случаях эти поля в различных таблицах выполняют одну и ту же функцию: описывают имя получателя по платежу в чеке. Второй важный вопрос — определение полей. В данном случае вам придется более подробно ознакомиться со структурой полей и таблиц. На этом этапе необходимо не только знать названия полей в разных таблицах, но уметь сравнить их типы данных, длину и другие характеристики. Вы должны очень тщательно все проверить, чтобы убедиться, что определения полей и таблиц согласованы правильно. Сравните список определений полей во внешнем источнике данных и целевой базе данных и убедитесь, что информация для импорта полностью им соответствует. Ниже перечислены свой- ства, которые требуется учитывать при импорте данных. Тип данных Необходимо соотнести числовые типы, текст, даты и т.д. Длина поля Требуется привести в соответствие отличия в размере по- лей (во избежание потери данных при импорте) Правила проверки Следует учесть все правила проверки данных, которые корректности применяются для данного поля данных
Последний шаг при установлении соответствий между источниками дан- ных — это определение порядка, в котором будет импортироваться и обновлять- ся информация. Ваша база данных, скорее всего, является обычной реляционной базой данных. Это означает, что в ней установлены связи между таблицами, а значит, данные должны переноситься в базу данных в определенном порядке. Например, таблицу BankAccounts необходимо заполнить раньше, чем данные бу- дут импортированы в таблицу Check Writer, поскольку в таблице Check Writer есть внешний ключ, связывающий ее с таблицей BankAccounts. Следовательно, данные должны быть обновлены в правильном порядке. Если в связях таблиц в базе данных используется целостность ссылок, при попытке импортировать данные в неверном порядке произойдет ошибка. Целостность ссылок делает обя- зательным существование родительской записи, прежде чем будет создана за- пись, которая на нее ссылается. При импорте данных следует помнить о следующих моментах. Сначала должны обновляться таблицы соответствий. Даже если связь не была установлена, лучше начинать именно с таблиц соответствий. Родительские таблицы должны обновляться раньше, чем их производные (дочерние) таблицы. При импорте таблицы, содержащей поле с автоматической нумерацией в качестве первичного ключа, необходимо удостовериться, что в результа- те присоединения внешних данных к таблице числа не будут автоматиче- ски перенумерованы Access. Если они перенумеруются, произойдет своего рода эффект волны, который потребует, чтобы была обновлена вся соот- ветствующая этим полям информация. Присоединение данных После сбора данных необходимо преобразовать их в формат, знакомый и дос- тупный для чтения Access. Указав соответствия данных, просто присоедините или запишите импортируемые данные. При непосредственном импорте данных в базу данных можно воспользоваться двумя подходами: использовать запросы или ADO. Данные приемы будут рассмотрены далее, в разделе "Методы импор- та/экспорта данных". Осталось 20 минут Вопросы, касающиеся экспорта данных Процесс экспорта данных во многом подобен процессу импорта данных. Экспорт данных состоит из аналогичных этапов организации данных, форматирования, установления соответствий и, наконец, непосредственно экспорт или запись дан- ных во внешний файл. И в этом случае Access поддерживает популярные прило- жения баз данных и электронных таблиц, поэтому во многие форматы данные можно экспортировать непосредственно. Кроме того, как и для операции импор- та, можно экспортировать данные в базы данных SQL, совместимые с ODBC, или в текстовые файлы. Далее представлены действия, необходимые для экспорта данных. 1. Сбор данных. 2. Форматирование данных. 3. Установление соответствий данных. 4. Экспорт записей. В следующих разделах эти шаги рассмотрены более подробно.
Сбор данных для экспорта Для обработки существующих данных используется запрос или программа VBA, которые и создают набор записей с информацией, требующей обработки в процедуре экспорта. Access позволяет экспортировать данные в различных форматах. Форматы, которые поддерживаются для экспорта, совпадают с фор- матами для импорта данных (см. табл. 17.1). Форматирование данных для экспорта Как и в случае с импортом данных, Access поддерживает многие форматы экспорта данных. Выбранный формат экспорта определяется внешней програм- мой, в которую будут экспортированы данные. Данные можно экспортировать в другую базу данных Access, другие базы данных, например, dBASE или Para- dox, любую базу данных, которая поддерживает ODBC, или в стандартную про- грамму электронных таблиц, например, Excel или Lotus. Установление соответствий данных г При создании соответствий данных для экспорта необходимо рассмотреть те же факторы, что и при импорте данных. Отдельно остановимся на экспорте данных в текстовый файл, когда необходимо указать все аспекты целевого файла. Во многих случаях вы не можете контролировать внешние программы, и данные необходимо экспортировать в конкретном формате, заданном этими программами. В такой ситуации экспорт данных должен включать установление соответствий. Сна- чала следует поставить в соответствие данные из двух источников, т.е. установить со- ответствие полей с полями или таблиц с таблицами. В файле, в который будут экс- портированы данные, должны быть обязательно указаны правильные названия по- лей, которые определяются структурой внешней программы. В Access этот процесс облегчается, поскольку существует возможность автоматического определения пер- вой строки файла, чтобы она содержала названия полей. Затем необходимо проверить все определения полей. Во многих случаях, исходные основные свойства полей потребуется преобразовать или переопределить. Информа- ция должна быть сформатирована надлежащим образом до того, как данные будут записаны в текстовый файл. Необходимо проверить следующие свойства. Тип данных Необходимо соотнести числовые типы, текст, даты и т.д. Длина поля Требуется привести в соответствие отличия в размере полей (во избежание потери данных при импорте) Правила проверки Следует учесть все правила проверки данных, которые при- корректности данных меняются для данного поля Важен порядок, в котором будет экспортирована информация. Если внешняя программа, в которую экспортируются данные, требует форматирования данных в определенном порядке, данный вопрос также необходимо учесть при экспорте. г Процесс импорта/экспорта В Access существует несколько возможностей импорта и экспорта данных. Выбор процесса зависит от степени контроля, которую должен иметь над пара- метрами операции конечный пользователь. Для простого и быстрого переноса данных можно использовать встроенную программу-мастер экспорта/импорта Access. Однако для создания собственного интерфейса следует использовать не- которые встроенные методы Access и написать специальную программу для об- работки интерфейса импорта/экспорта данных.
Спецификации импорта/экспорта В Access включена довольно полезная функция, которая позволяет создавать спецификации импорта и экспорта для текстовых файлов. Она пригодится в тех случаях, когда можно создать одну спецификацию и затем использовать ее по- стоянно для обоих типов файлов: с разделителями и фиксированной ширины. Перечислим ситуации, когда можно использовать файл спецификации. Необходимо автоматизировать процесс импорта/экспорта. • Требуется импортировать информацию из нескольких текстовых файлов в одни и те же таблицы. • Необходимо экспортировать данные в один и тот же текстовый файл. Спецификация импорта или экспорта сохраняется с названием по умолча- нию: имя файлa_ImportSpec или имя файла_ЕхрогСЗрес. Спецификация хра- нится в базе данных и представляет собой системный объект Access. Чтобы соз- дать файл спецификации, можно использовать какую-либо из программ: мастер Import Text или Export Text. Мастер создает список информации, которая необхо- дима в процессе импорта или экспорта данных, например, формат файла, соот- ветствия полей, свойства полей и т.д. Мастер импорта можно запустить, выбрав команду Файл ^Внешние данные^Импорт (File^Get External Data1^ Import). По- сле выбора текстового файла откроется программа-мастер. В левом нижнем углу окна расположена кнопка Дополнительно (Advanced), по щелчку на которой ото- бражается форма, приведенная на рис. 17.3. Рис. 17.3. При щелчке на кнопке Дополнительно в мастере импор- та/экспортаЛс с ess открывается диалоговое окно спецификаций Мастер импорта/экспорта можно использовать только в текстовых файлах в которых не известен конкретный формат файла. Для баз данных Access и других известных стандартных форматов спецификации импорта/экспорта применять нельзя. Обратите внимание на основную информацию по форматированию файла, кото- рая отображается в форме. Это переключатели, указывающие формат файла (с разделителями (Delimited) или с фиксированной шириной полей (Fixed Width)). При выборе файла с разделителями становятся активными поля Разделитель
полей (Field Delimiter) и Ограничитель текста (Text Qualifier). Поле Разделитель полей позволяет выбрать символ, который будет служить разделителем в текстовом файле. Поле Ограничитель текста определяет, как должны быть заданы текстовые строки: в одинарных кавычках, двойных кавычках или без кавычек. Кроме того, можно указать, какой язык и кодировка используются в процессе импор- та/экспорта. Параметр Кодовая страница (Code Page) позволяет выбрать набор сим- волов, используемый при импорте/экспорте данных. Кроме того, можно также оп- ределить, как форматируются поля даты и времени (для корректного чтения фай- лов). Установите порядок, в котором в датах указываются дни, месяцы и годы, и укажите формат года (из двух или четырех цифр). В этом окне можно также за- дать символ-разделитель для данных даты и времени» I Определение полей дат— довольно важный этап при импорте информации из разных стран, поскольку стандарты, принятые, например, в США, отличаются от стандартов дат, принятых в европейских странах. Задав параметры форматирования, можно переходить к определению инфор- мации о полях. Каждое поле должно быть задано в отдельной строке. Сначала следует ввести название поля. Во многих файлах, предназначенных для импорта или экспорта, первая строка файла используется для хранения названия поля. Можно ввести эту информацию вручную и определить свойства полей в разделе Формат файла (File Format). Введите название поля, затем его тип данных (текстовый, денежный, числовой и т.д.). После этого определите, является ли поле индексированным. Таким образом, вы укажете Access, что при импорте данных должен создаваться индекс поля. 6 качестве альтернативы созданию файла спецификации в Access можно также оп- ределить тип файла, создав файл Schema. ini. Файл Schema .ini предназначен для предоставления Access характеристик конкретного источника данных. Так вы можете предоставить подробный файл спецификации для всех параметров источни- ка данных. Использование файла Schema. ini — довольно удачный прием для ав- томатизации процесса импорта/экспорта, к которому вы будете обращаться в своей дальнейшей работе. Однако в данной книге он не рассматривается. Методы импорта и экспорта данных После того, как будут получены основные фрагменты информации, можно начинать процесс импорта (в данном примере), щелкнув на кнопке Начать импорт (Start Import), как на рис. 17.4. При анализе кода (см. листинг 17.1) вы убедитесь, что импорт выполняется с помощью одного из трех методов Access: Transfer Dat abase, Transferspreadsheet или TransferText. Эти методы мо- гут использоваться для импорта или экспорта данных в Access или из Access. Метод Transfer Database Метод Transfer Dat abase позволяет импортировать или экспортировать дан- Й ные. В нем используется следующий синтаксис. Т DoCmd.TransferDatabase [тип^операции] , тип_базы~данных, ТС имя__базы_данных [, тип_ объекта], источник, целевой_объект{, только_ структура] [, сохранить_логин_ид] С Обратите внимание: когда метод Transfer Database используется для им- порта таблиц, создается новая таблица с данными. Указанный метод не присое- диняет данные к существующей таблице. Аргументы метода определяются сле- дующим образом.
ТИП— опера ции Одна из трех констант: acExport (экспорт), ас Import (импорт) или а с Link (связь) ТИП— базы—данных Название типа баз данных, совместимость с которым поддерживается в Access: Microsoft Access Jet 2.x Jet 3.x dBASE III dBASE IV dBASE 5 Paradox 3.x Paradox 4.x Paradox 5.x Paradox 7.x Базы данных ODBC ИМЯ— ба зы__да иных Полное имя и путь файла ТИП— объекта Одна из следующих констант: асТаЫе ас Query ас Form ас Report асМасго acModule ас D at аАс с ess Page acServerView acDiagram acStoredProcedure источник Имя объекта, который должен быть импортирован в базу данных целевой—объект Имя объекта в целевом файле только— структура Значение типа Boolean, которое указывает на необ- ходимость импортирования только структуры дан- ных, либо импортирования и структуры данных, и самих данных сохра нить—логиН—ид Значение типа Boolean, которое указывает, что требуется сохранить данные логина и пароля для соединения с базами данных ODBC Метод Transferspreadsheet ► Метод Transf erSpreadsheet позволяет импортировать или экспортировать и данные из файлов стандартных электронных таблиц, которые поддерживает т Access. д К DoCmd.TransferSpreadsheet операции] [, тип_среды, ] И имя—таблицы, имя_файла [, есть_имена—полей] [, диапазон] с
Аргументы метода определяются следующим образом. тип_операции muri—среды ммя_таблицы ИМЯ—файла Одна из трех констант: ас Export (экспорт), ас Import (импорт) или ас Link (связь) Название типа электронных таблиц, совместимость с кото- рым поддерживается в Access: acSpreadsheetTypeExcel3 acSpreadsheetTypeExcel4 acSpreadsheetTypeExcel5 acSpreadsheetTypeExcel7 acSpreadsheetTypeExcel8 acSpreadsheetTypeExcel9 acSpreadsheetTypeLotusWKl acSpreadsheetTypeLotusWK3 acSpreadsheetTypeLotusWK4 acSpreadsheetTypeLotusWJ2 — только японская версия Название таблицы Access, в которую необходимо импорти- ровать данные, или название таблицы, из которой экспор- тируются данные Полное имя и путь файла есть_имена~_полей Значение типа Boolean, которое указывает, содержит ли первая строка файла электронных таблиц названия полей диапазон Выражение, которое указывает строки ячеек для импорта. Этот параметр используется только для операций импорта данных Метод TransferText ► Метод TransferText — метод для импорта данных из текстовых файлов в фай- 11 лы HTML. DoCmd.TransferText [тип_операции] [, имя_спецификации, \ Т< имя_таблицыг имя_файла [, есть_имена__полей\ [, имя_таблицы_НТМ1э\ £ [, кодировка] С Аргументы метода TransferText определяются следующим образом. тип__операции Одна из следующих констант: acExportFixed (экспорт для файла фиксированной ширины); acExportHTML (экспорт для файла HTML); ас Export Merge (экспорт для объединения); acImportDelim (экспорт для файла с разделителями); ас Import Fixed (импорт для файла фиксированной ширины); acImportHTML (импорт для файла HTML); acLinkDelim (связь для файла с разделителями); acLinkFixed (связь для файла фиксированной ширины); acLinkHTML (связь для файла HTML) имя_спецификации Имя файла спецификации импорта или экспорта, созданно- го в Access
имя_таблицы Название таблицы Access, в которую необходимо импорти- ровать данные, или название таблицы, из которой экспор- тируются данные имя_файла Полное имя и путь файла есть_имена_полей Значение типа Boolean, которое указывает, содержит ли первая строка файла названия полей имя_ та блицы__НТМЬ Название таблицы или списка в файле HTML, в которые должны быть импортированы данные или в которых уста- навливается ссылка кодировка Значение, определяющее используемый набор символов Создание интерфейса импорта ег В Естественно, вы вполне можете использовать в своем приложении встроен- ный мастер импорта, который предоставляет Access. Однако, чтобы обеспе- чить более доступную среду конечному пользователю приложения, можно создать специальный интерфейс для импорта данных. Конечный пользова- тель не должен разбираться во всех тонкостях форматирования файлов. Предложить ему хорошо спроектированную форму, где он сможет легко за- дать все необходимые параметры. Подобный подход позволяет получить больший контроль над тем, какие файлы импортируются в приложение и как обрабатываются данные файлов. Элементы интерфейса импорта Все элементы интерфейса для импорта данных имеют некоторые общие ха- рактеристики. На рис. 17.4 показан пример формы импорта данных. В этой утилите пользователи приложения Check Writer могут импортировать инфор- мацию из внешних источников в программу. Пользователь откроет данную форму, если щелкнет на кнопке Import в главном меню. В форме показаны все компоненты, которые необходимы для стандартной формы импорта данных. Пользователь должен ввести информацию для импорта (Payee Listing — список получателей, Bank Account Information— информация о банковском счете или Bank Transactions — банковские операции), а затем выбрать файл, из которого импортируются данные (при этом используется кнопка Open File). Далее поль- зователь вводит путь файла и его название в текстовом поле (или он может сра- зу же ввести путь и имя файла в текстовое поле) и переходит к обработке дан- ных, щелкнув на кнопке Start Import. Анализируя диалоговое окно Import Data Dialog, можно увидеть все основные компоненты импорта данных, крупна переключателей позволяет выбрать тип информации для импорта. Окно содержит текстовое поле для пути и имени фай- ла, а также кнопку для запуска процесса импорта данных. —ДааДЕ Мы приведем довольно простой пример, но в нем присутствуют все основные ком- поненты утилиты импорта данных. Используя такой дизайн интерфейса, можно добавить в него более сложные возможности. Например, пользователь сможет указать, какие поля из файла данных необходимо импортировать. В данном при- мере импортируется вся информация, а программа и спецификация импорта при- меняются для выборочного удаления ненужной информации.
Рис. 17.4. Утилита импорта данных в программе Check Writer Запуск и завершение процесса импорта Описанные выше методы импорта проиллюстрированы в примере импорта данных. После определения основных параметров (какие данные должны быть импортированы и из какого файла) пользователь щелкает на кнопке Start Import, чтобы начать процесс импорта. В тексте кода вы увидите, что выполняются сле- дующие действия. Сначала программа проверяет, всели необходимые параметры заданы. Затем определяется, какие данные импортируются в приложение: полу- чатели платежей, банковские счета или операции, что осуществляется с помо- щью оператора Select Case, который обращается к группе переключателей Choos eDat аТуре в форме. Затем программа анализирует выбранный файл и за- дает соответствующие параметры для импорта на основании типа и формата файла: Access, Excel или текстовый файл. После определения формата операция импорта завершается с помощью соответствующего метода Access: Trans ferDa- tabase, Transferspreadsheet или TransferText. Весь процесс импорта происходит в событии Нажатие кнопки (On Click) кнопки St art Import. Первая операция импорта осуществляется для таблицы Payees. Программа в листинге 17.1 иллюстрирует несколько важных вопросов. Во-первых, она проверяет, вся ли информация, необходимая для выполнения импорта, задана. Затем начинается импорт с использованием оператора Select Case, который определяет, какие данные будут импортированы. В первом случае обрабатывается информация по получателям (Payee). Затем работает следующий вложенный оператор Select Case, который используется для определения, ка- кой тип файла, а следовательно, и какой из трех методов должен применяться для операции импорта. I ,________________________________________________.____________________ Листинг 17.1. Событие нажатие кнопки для кнопки Start Import Private Sub cmdS tart Imported ick() Dim rst As New ADODB . Recordset Dim strNewTableName As String Dim str Existing Table Name As String Dim strFileType As String On Error GoTo ErrorHandler
1 проверка, введено ли имя файла If IsNull (Me.selFileName) Then MsgBox "You must enter the path and filename.", vbExclamation,_ "Error" Me.selFileName.SetFocus GoTo Done End If * если была выбрана новая таблица, проверка введенного имени таблицы If Me.NewTable = True And IsNull (Me.TabieName) Then MsgBox "You must enter the new tablename. ", vbExclamation,_ "Error" Me.TabieName.SetFocus GoTo Done Ead If DoCmd.Hourglass True DoCmd.Setwarnings False ' проверка типа данных и параметров Select Case Me. Choos eDat aiype Case 1 strExistingTableName = "tbl__Payees" Case 2 strExistingTableName = " tbl__BankAc counts " Case 3 strExistingTableName = "tbl__CheckWriter" Case Else MsgBox "You must select a datatype.", vbExclamation, "Error" Me.ChooseDataType.SetFocus GoTo Done End Select If Me.Newtable = True Then strNewTableName = Me.TabieName Else strNewTabl eName = " tbl_Temp " On Error GoTo ErrorHandler End If ' проверка корректности типа файла и импорт данных во временную таб- лицу или новую таблицу strFileType = Right $ (Me. selFileName, 3) Select Case StrFileType Case "mdb” DoCmd.TransferDatabase aclmport, "Microsoft Access" Me.selFileName, acTable, strExistingFileName, StrNewTableName Case "X1S" DoCmd.Transferspreadsheet aclmport, acSpreadsheetTypeExcel97,_ strNewTableName, Me. selFileName, True Case "txt", "csv" DoCmd.TransferText acImportDelim, , s trNewTabl eName, __ Me. seiFi 1 eName, True Case Else MsgBox "You did not select a correct file type. Choose *.mdb, *.xls, *.txt or *.csv." GoTo Done End Select
1 Ели выбрана новая таблица, то Done, в противном сд^чае - гфисоеди- нение данных If Me. Newt able = False Iben ' загустить загфос присоединения данных из временной таблицы в но- вую таблид/ . DoCmd.RunSQL "INSERT INTO " & strExistingTabl eName &_ ’’SELECT tbl_Temp. * ” &_ "FROM tbl_Temp" DoCmd.DeleteObject actable, ”tbl_Temp” End If ’ отображение сообщения о завершении гдоцесса импорта MsgBox "Import Completed.”, vbExclamation, "Import Status" GoTo Done ErrorHandler: MsgBox Err.Description Done: DoCmd.SёtWarnings True DoCmd.Hourglass False Application.Echo True End Sub Кроме этого кода, происходит еще один процесс. В форме пользователь может им- портировать таблицу как новую таблицу или импортировать данные в существующие таблицы. В первом случае импорт выполняется из базы данных Access. Метод Trans - ferDatabase (если он используется для импорта таблиц) импортирует всю таблицу. Применяя этот метод, вы не сможете импортировать только данные. Следовательно, программа импортирует таблицу, после чего использует операторы VBA для ее обра- ботки. В данном случае программа применяется для обработки информации о полу- чателях. Открываются два набора записей: первый — для импортированной табли- цы, а второй — для локальной таблицы Payees. Затем программа проходит цикл по импортированной таблице и для каждой записи создает новую запись получателя в таблице Payees. В таблице импорта для таблицы Bank Accounts вместо этого исполь- зуется запрос присоединения данных. После завершения импорта данных все временные таблицы удаляются, и ото- бражается сообщение, которое уведомляет пользователя о том, что импорт ус- пешно завершен. В примере продемонстрировано довольно много способов влия- ния на данные в процессе импорта: при создании спецификации импорта; после помещения данных в таблицу; в ходе запроса присоединения данных или в про- грамме VBAb процессе обновлений ADO. Создание интерфейса экспорта Создание интерфейса экспорта аналогично разработке интерфейса импорта. В данном случае цель остается той же: либо упростить процесс экспорта, либо предос- тавить пользователю больший контроль над экспортом данных. Экспорт можно осу- ществить с помощью тех же приемов, которые используются для импорта. Элементы интерфейса экспорта Форма ExportChecks в базе данных Check Writer является примером интер- фейса экспорта, в которой представлены все основные элементы интерфейса
(рис. 17.5). Группа переключателей позволяет пользователю выбрать тип экс- портируемой информации: Payee Listing — список получателей, Bank Account Information — информация о банковском счете или Bank Transactions — банков- ские операции. Обратите внимание, что при выборе банковских операций ото- бражаются дополнительные элементы. Пользователь выбирает счет и диапазон дат для операций, которые будут задействованы для экспорта. Затем отобража- ются все операции, соответствующие данному критерию. Рис, 17.5, Пример утилиты экспорта в базе данных Check Writer Пользователь может отобрать записи для экспорта, что является примером воз- можности многоуровневого выбора. Допускается выбрать тип данных и конкретные группы записей (сгруппированные, к примеру, по номеру банковского счета и по диа- пазону дат). Пользователь может также выбрать для экспорта отдельные записи из данного источника данных. Выбрав запись, введя путь и имя файла, пользователь щелкает на кнопке Start Export, чтобы начать процесс экспорта. Как и при импорте данных, программа должна получить информацию о том, что, куда и как должно быть экспортировано. В любом интерфейсе экспорта необходима информация о экс- портируемых данных: какие записи будут экспортированы, куда и как. Программирование интерфейса экспорта Событие Нажатие кнопки (On Click) для кнопки Start Export (см. листинг 17.2) в форме экспорта запускает процесс экспорта, который начинается с проверки того, что заданы все необходимые параметры экспорта. Пользователь должен выбрать тип данных для экспорта, указать, какие записи экспортируются и куда. Листинг 17.2. Событие Нажатие кнопки для кнопки Start Export Private Sub cmdS tart Exported ick () Dim strQueryName As String •i On Error GoTo ErrorHandler
1 проверка типа файла If IsNull(Me.seiFileType) Then - MsgBox "You must enter a file type.”, vbCritical, "Error" Me.selFileType.SetFocus GoTo Done Ehd If ’ проверка гг/ти и имени файла If IsNull(Me.selFileName) Then MsgBox "You must enter in the path and filename.’’, vbCritical,_ "Error" Me.selFileName.SetFocus GoTo Done End If . » Select Case Me.SelectType Case 1 strQueryName = "qry_ExportPayees" If DCount("*", strQueryName) = 0 Then MsgBox "You have not selected any Payee records to export.", vbCritical, "Error" GoTo Done End If Case 2 strQueryName = " qry_Expo rt BankAc count s " If DCount("*", strQueryName) = 0 Then MsgBox "You have not selected any Bank Account records to export.", vbCri t i cal, "Error" GoTo Done 'End If Case 3 strQueryName = "qry_ExportTransactions" If DCount("*", strQueryName) = 0 Then MsgBox "You have not selected any Transactions records to export.", vbCritical, "Error" GoTo Done End If End Select DoCmd-Hourglass True ' отключение предупреждений, чтобы избежать запросов на обновление DoCmd.SetWarnings False ' если файл существует, удалить его If Dir (Me . selFileName) о Then Kill Me.selFileName End If 1 экспорт выбранных записей в отдельную таблицу и загг/ск метода Select Case Me.selFileType Case "Access (*.mdb)" ' база данных Access If Nz (Me.selFileName) = " " Then MsgBox "You must enter a table name for an Access Export" GoTo Done Else DoCmd.TransferDatabase acExport, "Microsoft Access",
Me.selFileName, acTable, strQueryName, Me.selTableN^me End If Case "Ekcel (*.xls)" 1 электронные таблицы Excel DoCmd. Trans ferSpreadsheet acExport, acSpreadsheetTypeExcel97 , strQueryName, Me. selFileName r True Case "Text (*.csv)” 1 текстовый файл DoCmd.TransferText acExportDelim, , strQueryName, Me.selFileName, True End Select MsgBox "Export Completed Successfully." GoTo Done ErrorHandler: MsgBox Err.Description Done : DoCmd.Hourglass False DoCmd.SetWarnings True End Sub I Private Sub Form_Load() SetMarks False End Sub Private Sub FromDate^Af terUpdate () Me.Subfrm.Requery End Sub Готово? Выполняются обычные проверки. Обратите внимание, что в программе ис- пользуется функция DCount, которая быстро определяет, выбраны ли записи для каждого из типов данных. Если ни одна запись не выбрана, отображается сооб- щение об ошибке. Кроме того, если задано расширение .mdb (базы данных Access), система выполняет проверку корректности введенного названия табли- цы. После этого программа запускает оператор Select Case, который определя- ет тип данных для обработки. Для каждого типа данных выполняется запрос на создание таблицы. Создается новый запрос для выбранных данных, затем ис- пользуется вложенный оператор Select Case, который определяет, какой фор- мат данных требуется экспортировать, на основании введенного имени файла и его расширения. Далее выполняется собственно экспорт данных с использова- нием одного из трех методов: TransferDatabase, TransferTable или Trans- ferText. Синтаксис методов почти такой же, как и для операции импорта. Как и в примере с импортом данных, можно управлять различными парамет- рами процесса экспорта несколькими способами. Данные обрабатываются на не- скольких этапах: на этапе создания файлов спецификации, в ходе выполнения запросов для экспорта выбранных записей или в процессе самого экспорта. Обзор Импорт и экспорт — это средства расширения связей с другими программами и по- лучения информации, доступной для обработки в программе. В данном разделе вы изучили общие вопросы, касающиеся импорта и экспорта данных в приложениях Access. Более сложные операции импорта и экспорта могут потребовать решения дополнительных задач. Однако все они починяются общим принципам, описанным в данном уроке. В уроке рассматривались следующие аспекты.
Основные этапы импорта заключаются в организации, форматировании, установлении соответствий между данными и присоединении записей. Основные этапы экспорта — это сбор данных, форматирование, установ- ление соответствий между данными и экспорт данных. • Импорт и экспорт данных — достаточно простые и понятные операции. Технически они очень просты, однако требуют времени. • После преодоления "барьера коммуникации" (определения форматов, не- обходимых для связи с другими программами, и т.п.) остается только на- писать запросы или операторы SQL, которые извлекут из базы данных не- обходимую информацию. • Для определения спецификаций импорта и экспорта можно использовать мас- тер Access, который выполнит ряд необходимых операций автоматически. Важно отметить, что в материале данного урока в программе не были включе- ны процедуры проверки данных, поскольку эти вопросы не касаются рассматри- ваемой темы. Однако о проверке корректности данных не следует забывать при создании процедур, удаляющих или добавляющих записи. Пример такой проце- дуры — процедура, сравнивающая количество записей, которые должны быть импортированы, с записями, которые фактически были записаны в таблицу. Проверьте себя 1. Назовите последовательность действий при выполнении импорта или экспорта данных. Почему этот порядок имеет значение? (См. раздел "Импорт и экспорт”.) 2. Верно ли, что Access позволяет экспортировать данные только в базы данных? Опишите ограничения, если они существуют, для импорта и экспорта дан- ных. (См. раздел "Импорт и экспорт”.) 3. Где в Access устанавливаются спецификации импорта/экспорта? (См. раздел "Спецификации импорта/экспорта”.) 4. Какие три метода VBAдля выполнения импорта и экспорта данных обеспечи- вает Access? (См. раздел "Методы импорта и экспорта данных”.) : m

УРОК Приемы, способствующие ускорению работы приложения Содержание урока * Настройка аппаратного обеспечения на максимальную эффективность * Значительное увеличение скорости работы за счет компиляции про- грамм Сжатие базы данных * Создание баз данных . mda для достижения большей эффективности ✓ Организация базы данных в библиотеки ✓ Увеличение абсолютной скорости работы базы данных V Увеличение воспринимаемой скорости работы базы данных ЭПри создании приложения необходимо стремиться к тому, чтобы оно работало максимально быстро. Иногда приложения баз данных работают медленно, по- скольку обрабатывают сотни тысяч записей; а некоторые приложения работают зоминут не лучшим образом по тон причине, что плохо написаны. Чем больше база дан- ных, тем медленнее она будет работать. Если в небольших базах данных еще можно невнимательно отнестись к программированию, то при работе с объемны- ми базами данных неудачный результат программирования может привести к недопустимому снижению скорости приложения. Таким образом, вы должны использовать самые эффективные приемы программирования даже для самых маленьких баз данных и сделать скорость приоритетной целью для всех прило- жений. В этом уроке описан ряд приемов, которые позволят увеличить эффек- тивность работы приложений Access.
Аппаратное обеспечение и память Формально минимальным требованием к оперативной памяти компьютера для работы с данной версией Access в оперативных системах Windows ХР или Windows 2000 является 256 Мбайт оперативной памяти плюс еще 32 Мбайт на ка- ждый одновременно работающий продукт Office (причем в данном случае мы гово- рим о минимуме). Если вы собираетесь заниматься серьезной разработкой в Access, необходимо иметь в распоряжении как минимум 512 Мбайт оперативной памяти. Память в данном случае даже более важна, чем частота процессора. Увеличение памяти с 256 Мб до 512 Мб позволит удвоить или даже утроить скорость работы приложения. Изменение частоты процессора на 100 МГц при том же объеме памя- ти дает лишь очень незначительное улучшение. Значение компиляции для скорости работы приложения Если приложение содержит хотя бы одну строку кода VBA, чрезвычайно важно понимать, что представляет собой компиляция программ и какое значе- ние она имеет для работы приложения. В Access содержится код двух основных типов: программы, созданные в окне редактора Visual Basic, и программы, кото- рые может понимать и выполнять Access. Перед выполнением написанную процедуру VBA-кода должен обработать компилятор, который преобразует ее в форму, понятную для Access. В Access от- сутствует настоящий компилятор; программа преобразуется в предварительно скомпилированный код, после чего для его выполнения используется пр о грамма- интерпретатор. Код в преобразованной форме называют скомпилированным, т.е. прошедшим компиляцию. Если выполняется процедура, которая не была скомпилирована, сначала она должна быть скомпилирована, затем передана в интерпретатор для выполнения. На самом деле это происходит не на/уровне процедуры, а на уровне модуля. При вызове процедуры модуль, содержащий процедуру, и все модули, содержащие процедуры, которые вызывает данная процедура, загружаются и компилируют- ся. Можно скомпилировать код вручную или оставить его для компиляции в Ac- cess при выполнении программы. Однако для компиляции кода требуется неко- торое время, поэтому эффективность работы, если компиляцию каждый раз вы- полняет Access, может значительно пострадать. Помимо времени, которое требуется для компиляции кода в Access в процессе выполнения программы, нескомпилированные программы занимают намного больше памяти, чем скомпилированные. Когда приложение полностью скомпи- лировано, в память при вызове процедуры загружается только скомпилирован- ный код. При запуске нескомпилированной процедуры Access не выгружает не- скомпилир о ванный код после его компиляции, поэтому в памяти остается две версии одного и того же кода. Перевод программы приложения в скомпилированное состояние Существует только один путь скомпилировать все приложение: выберите ко- манду Debug ^Compile в меню редактора Visual Basic. После элемента меню Compile находится внутреннее имя проекта (рис. 18.1). Чтобы получить доступ к меню Debug, необходимо открыть какой-либо модуль.
Рис. 18.1. Компиляция программы Внутреннее имя проекта — это имя файла, которое используется при первом соз- дании файла базы данных Microsoft Access. Внутреннее имя проекта можно изме- нить, выбрав параметр имя проекта Properties в меню Tools окна Visual Basic. Имя проекта располагается перед текстом Properties в нижней части меню. При изменении внутреннего имени проекта база данных декомпилируется. Для компиляции сложных или больших приложений с большим количеством кода VBA может потребуется много времени. После компиляции приложение не- обходимо закрыть. Чтобы скомпилировать все модули, Access придется загру- зить все их в память. Код будет оставаться в памяти до тех пор, пока вы не за- кроете Access. В предыдущих версиях Access (до Access 2000) на панели инструментов Visual Ba- sic находилась кнопка Compile. Теперь она отсутствует. Выход из скомпилированного состояния В предыдущих версиях Access при изменении любого кода приложение ста- новилось декомпилированным. В данной версии Microsoft Access декомпилиру- ются все фрагменты кода, задействованные в каких-либо изменениях, но не все приложение целиком. К декомпиляции отдельных частей кода приводят следующие изменения. Изменение формы, отчета, элемента управления или модуля, содержащего код. (Если не сохранить измененный объект, приложение будет сохранено в предыдущем состоянии.) • Добавление новой формы, отчета, элемента управления или модуля (в том числе и добавление нового кода для существующей формы).
• Удаление или переименование формы, отчета, элемента управления или модуля. При изменении таких объектов, как отчеты или формы, в процессе выполне- ния приложения в программе VBA соответствующие фрагменты кода будут де- компилированы при изменении объектов. (Часто это происходит во время работы программы-мастера.) Если в приложении в ходе его работы создаются объекты, например отчеты или формы, то при создании объектов фрагменты приложения становятся декомпилиро- ванными. (Часто это также происходит при работе программы-мастера.) Использование недокументированного параметра /decompile Иногда случается так, что база данных остается нескомпилированной, неза- висимо от ваших действий. Возможно, вы запустили программу и увидели толь- ко сообщение об ошибке, которое информирует о том, что Access не может найти проект или библиотеку. Возможно, вы получаете ошибку компиляции, хотя знаете, что проблем в коде или синтаксических ошибок нет. Чтобы выявить базу данных, которая не скомпилирована, а затем скомпилировать ее, выполните из командной строки /decompile. Возможно, вы уже видели параметры командной строки: /nonstartup, /cmd или /compact. Параметр /decompile запускает Ac- cess специальным образом, поэтому при открытии базы данных все модули Vis- ual Basic сохраняются как текст. Данный прием используется для объектов мо- дулей и всех программ для форм и отчетов. Декомпиляция существенно отличается от другого состояния базы данных: просто нескомпилированного состояния. Нескомпилированное состояние — это состоя- ние, когда какой-либо из модулей не прошел компиляцию. Недокументированная команда /decompile вызывает декомпиляцию каждого модуля базы данных, а также упорядочивает код для базы данных. Никакой другой прием Microsoft не подчищает код базы данных лучше, чем эта команда. Чтобы декомпилировать базу данных, выберите команду Пуск1^ Выполнить (Start^Run) и введите msaccess/decompile (рис. 18.2). Далее введите название файла базы данных, которую необходимо открыть. При этом удерживайте нажа- той клавишу <Shift>, чтобы команды из макросов autoexec в меню Пуск не вы- полнялись во время запуска базы данных. В противном случае может оказаться возможным выполнение кода модуля в базе данных. Это означает, что Access должен скомпилировать код перед запуском. Если Access начинает компилиро- вать базу данных, команда декомпиляции не работает. О том, что декомпиляция не работает, узнать никак нельзя; просто проблемы, возникающие в нескомпи- лированной базе данных, не будут зафиксированы. Рис. 18.2. Декомпиляция программы
Access будет загружаться, как обычно. Открывая базу данных, вы увидите контейнер баз данных Access. Это означает, что декомпиляция закончена. После завершения декомпиляции сразу же выйдите из Access (закройте программу), а затем загрузите Access обычным способом. После выхода и перезагрузки Access можно открыть базу данных. Откройте любой модуль, чтобы войти в окно редактора Visual Basic. Кроме того, вы можете открыть любую форму, для которой написана программа Visual Basic, и отобра- зить окно программы. Затем выберите Compile имя_проекта. После компиляции базы данных закройте модуль и вернитесь в контейнер баз данных. Сжатие базы данных после компиляции После каждой компиляции базу данных необходимо сжимать. В окне базы дан- ных выберите команду Сервис^Служебные программы^Сжать и восстановить базу данных (Tools^Database Utilities^Compact and Repair Database). Когда вы завер- шите сжатие, Access станет выполнять процедуры гораздо быстрее, чем обычно, и размер базы данных уменьшится как минимум на половину по сравнению с тем, каким он был до сжатия. Определение декомпилированной базы данных и автоматическое повторение компиляции Необходимо следить затем, чтобы база данных всегда находилась в скомпилиро- ванном состоянии. Ваши заказчики могут вносить небольшие, а в некоторых случаях и даже очень сложные изменения в приложение, а потом жаловаться, что их система работает медленно. Действительно, некоторые клиенты могут быть квалифициро- ванными разработчиками, однако большинство клиентов, которые вносят изменения в базу данных Access, ничего не знают о компиляции или сжатии. Чтобы посмотреть, скомпилирована ли база данных, откройте окно Visual Basic для любого модуля, отобразите окно Debug и введите ? IsCompiled(). Если база данных скомпилирована, в окне будет отображено значение True. Если база данных находится в состоянии декомпиляции, в окне отображает- ся False (рис. 18.3). Рис. 18.3. Проверка состояния компиляции базы данных Чтобы разрешить проблему наличия нескомпилированных баз данных, мож- но создать интерфейс, который автоматически определяет нескомпилированную базу данных и предоставляет пользователю возможность скомпилировать при- ложение. Данная программа будет запускаться каждый раз при открытии базы данных. Пользователю все равно придется сжимать базу данных вручную, но са- мой сложной задачей является компиляция. На рис. 18.4. показано сообщение, которое автоматически отображается, если база данных не скомпилирована. В программе листинга 18.1, испрльзуется встроенная функция Access Is Com- piled, определяющая состояние компиляции для приложения. Если приложе-
ние не скомпилировано, отображается окно сообщения (см. рис. 18.3). Пользова- тели могут выбрать один из двух вариантов действий. Если они тестируют при- ложение, то могут отказаться от компиляции, поскольку этот процесс занимает некоторое время, а на данном этапе скорость работы приложения для них может быть неважна. Если же они решили провести компиляцию, то просто щелкают на кнопке Yes. Рис. 18.4. Диалоговое окно, которое помогает пользователю скомпилировать приложение Листинг 18.1. Модуль Visual Basic, который обнаруживает и автоматически компили- рует нескомпилированное приложение Dim MsgTxt As String If Not IsCompiledO Then MsgTxt =, "Файл программы находится в декомпилированном состоя- нии . ” & vbCrLf MsgTxt = MsgTxt & "Это может привести к серьезным проблемам в эф- фективности работы. ” & vbCrLf MsgTxt = MsgTxt & "Хотите скомпилировать файл программы?" Response = MsgBox (MsgTxt, vbYesNo+vbQuestion, "Проверка эффек- тивности") If Response = vbYes Then ’ Можно отобразить окно сообщения с просьбой подождать, ’ пока идет компиляция базы данных DoCmd.Echo False 1 Отключить отображение экрана, ’ чтобы не было видно, как открывается и закрывается модуль DoCmd.OpenModule " имя_любого_модуля" ' Открыть любой модуль базы данных DoCmd.Selectobject acModule, " имя_любого_модуля" ’ Необходимо выделить модуль после того, как он будет открыт RunCommand (acCmdCompileAndSaveAllModules) г Эта команда вы- полняет компиляцию и сохраняет базу данных DoCmd.Close acModule, "имя любо го__мо дуля" ’ Закрыть модуль по- сле завершения компиляции и сохранения DoCmd.Echo True ’ Включить отображение экрана MsgTxt = "Файл программы был скомплирован" & vbCrLf MsgTxt = MsgTxt & "Теперь выберите команду Сервис «^Служебные про граммы1^ Сжать и восстановить базу данных " MsgTxt = MsgTxt & vbCrLf & "из меню над контейнером базы дан- ных." Response = MsgBox(MsgTxt, vblnformation, "Компиляция успешно завершена." End If End if
Автоматически выполнить сжатие открытого файла программы нельзя, од- нако пользователь может, как в примере, получить инструкцию на выполнение команды Сервис^Служебные программы^Сжать и восстановить базу данных. Если база данных открыта, после ее сжатия перезапускается файл макроса Autoexec. Создание файлов ,mde и передача их пользователям Осталось гоминут Одним из способов гарантировать постоянную скомпилированость программы приложения всегда, является сохранение конечного продукта базы данных в формате .mde. При сохранении базы данных в виде файла .mde Access компи- лирует все программные модули (включая модули форм), удаляет весь доступ- ный для редактирования исходный код и сжимает базу данных. Новый файл . mde не содержит исходников, но все равно работает, поскольку содержит ском- пилированную копию всей программы. Представленный прием — не только превосходный способ защитить исход- ный код приложения, он также предоставляет возможность создавать конечные продукты из баз данных меньшего размера (поскольку они не содержат исходно- го кода), программные модули которых всегда находятся в скомпилированном состоянии. Так как программа всегда скомпилирована, приложение использует меньше памяти, кроме того, не тратится лишнее время на компиляцию кода в процессе работы приложения. Итак, просмотреть существующий код вы не сможете, если он скомпилиро- ван. Однако действуют также и другие ограничения. • Нельзя просматривать, изменять или создавать формы, отчеты или моду- ли в представлении Конструктор (Design). • Нельзя добавлять, удалять или изменять ссылки на библиотеки объектов или базы данных. • Нельзя изменять имя проекта Visual Basic для базы данных, используя диалоговое окно Options. • Нельзя импортировать или экспортировать формы, отчеты или модули. Однако обратите внимание, что таблицы, запросы и макросы могут быть импортированы из баз данных, которые не имеют тип- mde, или экспор- тированы в эти базы данных. Из-за этих ограничений распространить конечную версию приложения в виде файла . mde может быть невозможно. Например, если в приложении в процессе работы создаются формы, то распространять базу Данных как файл . mde нельзя. Преобразовать файл .mde в обычный файл базы данных вам не удастся. Поэтому всегда сохраняйте копию исходной базы данных! Чтобы изменить приложение, откройте обычную базу данных, а затем после завершения всех изменений снова создайте конечный файл с расширением .mde. Удалив исходную базу данных, вы не сможете работать с объектами в представлении Конструктор. Для сохранения файла в формате . mde должны выполняться некоторые усло- вия. Во-первых, если включены средства защиты данных, при создании файла . mde необходимо иметь все соответствующие права для базы данных. Кроме то- го, если база данных тиражируется, все таблицы и свойства дублирования перед
созданием файла .mde должны быть удалены. Наконец, необходимо сохранить все базы данных или надстройки в системе ссылок как файлы .mde, в противном случае они не смогут использоваться в приложении. Сначала следует закрыть базу данных, если она открыта. Если не закрыть те- кущую базу данных, Access попытается закрыть ее вместо вас и задаст вопрос о сохранении изменений. Если доступ к базе данных общей, то все пользователи должны закрыть базу данных, поскольку Access требует монопольных прав на работу с ней. Чтобы сохранить базу данных как файл .mde, выберите команду Сервиса Служебные программы ^Создать MDE-файл (Tools^DatabaseUtilities^Make MDE File), как на рис. 18.5. Рис. 18.5. Сохранение базы данных как файла . mde Если необходимая база данных закрыта и при этом не открыта никакая, ука- жите базу Данных, которую вы хотите сохранить как файл .mde, в диалоговом окне Сохранение файла MDE под именем (Database То Save As MDE), после чего щелкните на кнопке Сохранить (Make MDE File). Если при выборе команды Создать MDE-файл была открыта база данных, этот этап будет пропущен, Access предполагает, что работа будет выполняться с ранее открытой базой данных. Чтобы использовать другую базу данных, от- мените команду Создать MDE-файл, закройте базу данных и выберите эту ко- манду еще раз. Появится запрос на имя базы данных, которую необходимо со- хранить как файл . mde.
В диалоговом окне База данных для сохранения как MDE (Database То Save As MDE) укажите имя, диск и папку базы данных. Не пытайтесь сохранить файл .mde с тем же именем файла, что у исходной базы данных. Не удаляйте и не перезаписывайте исходную базу данных! Как отмечалось выше, преобразовать файл .mde в обычную базу данных невозможно, а в файле . mde вы не сможете редактировать объекты. Если вы удалите или потеряете ис- ходную версию базы данных, работать с объектами базы данных в режиме кон- структора больше не удастся. Организация часто используемого кода в библиотеке Если вы завершили разработку приложения, и оно готово к передаче конеч- ным пользователям, можно поместить часто используемый код, который нико- гда не изменяется конечным пользователем, в базу данных библиотеки. База данных библиотеки (library database) — это внешняя база данных программ Access, на которую ссылается база данных приложения. За счет того, что приходится вызывать код из библиотеки, а не использовать его непосредст- венно в основном приложении, происходит потеря скорости. Однако данный прием имеет одно преимущество: код библиотеки никогда не попадет в состоя- ние декомпиляции, даже если приложение создает или модифицирует объекты в процессе работы, или пользователи добавляют новые объекты и изменяют уже существующие. Разместив код в базе данных библиотеки, вы можете значительно увели- чить эффективность работы приложения и сделать ее стабильной в течение продолжительного времени. Что наиболее важно, файл базы данных будет раз- делен на две базы данных меньшего размера: чем меньше база данных, тем бы- стрее она будет работать. Первый шаг в создании ссылок на процедуры внешней базы данных — соз- дание внешней базы данных со всеми ее модулями (аналогично созданию лю- бой другой обычной базы данных Access). Все процедуры, объявленные как Private, не будут доступны вызывающему приложению, поэтому необходимо хорошо продумать, какая часть программы должна быть доступна другим ба- зам данных, а какая — нет. После создания второй базы данных и создания или экспорта ее объектов (форм, отчетов, модулей) можно создать ссылку из файла главной программы на эту базу данных (с которой работают пользователи). Чтобы создать ссылку, сначала откройте любой модуль в базе данных главно- го приложения в представлении Конструктор. В представлении конструктора, в меню Tools окна Microsoft Visual Basic становится доступной команда References (рис. 18.6). После выбора команды Tools1^References отображается диалоговое окно References (рис. 18.7). В нем необходимо задать все ссылки, которые ^потребуют- ся для использования средств автоматизации OLE или других баз данных Access как баз данных библиотек. При создании ссылки на другую базу данных Access (в отличие от ссылки на сервер OLE, который был создан с помощью других инструментов разра- ботки, например, Visual Basic .NET) может потребоваться найти базу данных в окне проводника. Используйте кнопку Browse, как при открытии внешней базы данных. \
Рис, 18.6. Выбор элемента меню References Рис. 18.7. Просмотр и выбор ссылок Если вы выберете внешнюю базу данных Access, в диалоговом окне References возле ее названия будет установлен флажок, который указывает на то, что в про- грамме используется ссылка на эту базу данных. Чтобы удалить ссылку, снова зайдите в диалоговое окно References и снимите флажок соответствующего элемента. Создав все нужные ссылки, щелкните на кнопке ОК. После установления ссылки на базу данных вы будете иметь возможность вы- зывать процедуры в этой базе данных, как если бы они находились в базе данных приложения. Какое бы событие ни привело к декомпиляции базы данных при-
ложения, база данных, на которую оно ссылается, всегда остается скомпилиро- ванной, кроме ситуации, когда ее открывают и изменяют прямо из Access. Увеличение абсолютной скорости приложения При освещении вопросов эффективности работы приложения слово эффектив- ность часто используют как многим слова скорость. В разработке программного обеспечения скорость бывает двух типов: абсолютная и воспринимаемая. Абсолютной скоростью называют фактическую скорость выполнения неко- торой функции приложением, например, время, которое требуется для выполне- ния определенного запроса. Воспринимаемая скорость — это явление, которое заключается в том, что ко- нечный пользователь воспринимает одно приложение работающим быстрее, чем другое (даже если на самом деле может быть наоборот), за счет предоставления ему визуальной обратной связи во время выполнения какой-либо задачи. Вели- чина абсолютной скорости измеряется в единицах времени; воспринимаемая скорость в единицах времени не выражается. На перечисленные ниже моменты, касающиеся увеличения фактической скорости, вам следует обратить особое внимание. • Поддержание приложения в скомпилированном состоянии. • Организация процедур в "оптимальные" модули. • Открытие баз данных в монопольном режиме. • Регулярное сжатие баз данных. В среде одного пользователя база данных должна быть открыта в монополь- ном режиме. Если приложение является независимым (т.е. отсутствуют про- граммы, в отношении к которым используется совместный доступ по сети), монопольный режим при открытии базы данных может существенно ускорить работу. (Фактически, первый пользователь открывает базу данных в моно- польном режиме, после этого доступ к нет других пользователей становится невозможным.) Чтобы открыть базу данных в монопольном режиме, выберите имя файла в диалоговом окне Открытие файла базы данных (Open), щелкните на стрелке справа от кнопки Открыть (Open), затем выберите Монопольно (Open Exclusive) из открывшегося списка (рис. 18.8). Все описанные выше методы прекрасно подходят (и необходимы) для того, чтобы приложение работало на оптимальном уровне эффективности, однако су- ществуют и другие способы увеличения абсолютной скорости приложения. ЕСоч- ти все этапы разработки, от форм до модулей, могут быть оптимизированы таким образом, чтобы увеличить абсолютную скорость работы базы данных. В следую- щих разделах методы оптимизации эффективности описаны более подробно. Минимизациясложности,а также размеров форм и отчетов Важным моментом улучшения эффективности работы форм и отчетов являет- ся уменьшение их сложности и размеров. Далее мы представим некоторые идеи, которые могут быть использованы для минимизации сложности, а также разме- ров форм и отчетов. । • Минимизация количества объектов на форме или в отчете. Чем меньше объектов используется, тем меньше ресурсов необходимо для отображения и обработки формы или отчета.
Использование соответствующихm uno вданных Рекомендуетсявсегда явно объявлять переменные с помощью функции Dim, а не присваивать любые значения переменным, которые не объявлены с исполь- зованием Dim. Чтобы гарантировать, что все переменные в приложении будут явно объявлены перед применением в процедуре, выберите команду Tools ^Options в окне редактора Visual Basic и установите флажок Require Variable Declaration на вкладке Editor. По возможности вместо типов Single и Double используйте Integer и Long Integer. Последние два типа занимают меньший объем памяти и требуют меньше времени для обработки, чем Single и Double. В табл. 18.1 отображена относи- тельная скорость числовых типов данных, используемых в Access. Таблица 18,1. Типы данных и скорость обработки вычислений с соответствующими значениями_____________________________________________________________ Tun данных Относительная скорость обработки Integer/Long Самая быстрая Single/Double Быстрая Currency Медленная Variant Самая медленная В своей работе используйте не только типы Integer и Long Integer, но также по возможности применяйте целочисленные, а не точные математические опера- ции. Например, чтобы разделить одно число типа Long Integer на другое число того же типа, можно использовать такой оператор. X = Longl/Long2 Данный оператор представляет собой стандартную математическую функ- цию, применяющую операцию с плавающей точкой. Ту же функцию можно вы- полнить с помощью целочисленного оператора. X = Longl\Long2 Конечно, целочисленные операции допускается выполнять не во всех случа- ях. Чаще всего они применяются для операций с процентами. Например, можно получить процентную долю с помощью такой формулы. X = Total/Value Ту же .операцию можно осуществить с помощью целочисленного деления, сначала умножив общую сумму на 100, а затем применив целочисленный оператор. Х = (Total*100) \Value а Кроме того, по возможности используйте строковые функции ($). При работе с переменными типа String применяются строковые функции — например, Str$ О , а не ее эквивалент Str (), который работает с типами Variant. Исполь- зование строковых функций при работе со строками более эффективно, посколь- ку Access не требуется выполнять преобразование типов переменных. Чтобы получить часть строки с помощью функции Mid$ (), можно опустить третий параметр — в результате вы получите строку до конца. Например, для получения части строки, начинающейся со второго символа и возвращающей все оставшиеся символы, используется такой оператор. szReturn = Mid$(szMyString, 2)
При работе с массивами используйте динамические массивы Erase и ReDim, чтобы восстановить используемую память. Динамически изменяя размер масси- вов, вы обеспечите использование только того объема памяти, который необхо- дим для размещения массива. Кроме того, что в программах должны применяться оптимизированные пере- менные, следует по возможности применять в вычислениях константы. Констан- ты облегчают чтение программы и не замедляют приложение, если перед выпол- нением программы оно скомпилировано. Создание более быстрых процедур Ускорить процедуры можно несколькими способами, оптимизируя алгорит- мы, которые в них используются. Если в процессе разработки не забывать о во- просах эффективности, то следует использовать описанные ниже методы. Некоторые функции Access выполняют аналогичные задачи, но существенно отличаются по времени выполнения этих задач. Вероятно, вы часто используете такие функции. Выбор самого эффективного способа выполнения той или иной операции может в значительной мере повлиять на скорость работы приложения. • Операторы For/Next работают быстрее, чем операторы Select Case. • Функция IF () выполняется гораздо медленнее, чем стандартный набор операторов I f/Then/Else. • Функции With и For Each ускоряют обработку нескольких объектов и/или их свойств. • Рекомендуется изменять значение переменной с помощью оператора Not, а не оператора If/Then. (Например, используйте х = Not (у), а не If у = true Then х = false.) • Применяйте метод Re query вместо действия Re query. Метод работает значительно быстрее. • При использовании средств автоматизации OLE следует получать объекты из ссылок во время компиляции приложения, а не в процессе выполнения программы, используя функции GetObject и CreateObject. Использование контрольных переменных Когда вы обращаетесь в программе к элементам управления формы, то може- те выбрать очень медленный или очень быстрый способ обращения к объектам формы. Самый медленный способ — обращаться к каждому элементу управле- ния явно. В этом случае Access должен будет последовательно искать имя фор- мы, начиная с первого по алфавиту имени формы в базе данных, пока не найдет необходимую форму в списке всех форм приложения (таблица msysObject). Ес- ли название формы начинается с z, то для базы данных с большим количеством форм этот процесс займет достаточно много времени. Например: Forms! [frm_CheckWriter] ! [BankAccountNumber] = something Forms! [frm_CheckWriter] ! [BankAccountName] = something Forms! [frm__CheckWriter]! [Payee] = something Если программа находится в модуле класса для формы frm^CheckWriter, можно использовать ссылку Me. Ссылка Me обращается к открытому объекту (форме или отчету) и заменяет ссылку Forms! [имя^формы]. В результате про- грамма очень быстро переходит сразу к имени формы, например:
Me![BankAccountNumber] = something Me! [BankAccountName] = something Me![Payee] = something Если программа хранится не в форме, а в процедуре модуля, можно использо- вать контрольную переменную следующим образом. Dim frm As Form set frm = Forms! [frm^CheckWriter] frm! [BankAccountNumber] = something frm! [BankAccountName] = something frm! [Payee] = something Если применить такой код, то вам придется искать название формы только один раз. Еше быстрее позволяет выполнить те же действия конструкция With. With Forms! [frm_CheckWriter] ! [BankAccountNumber] = something ! [BankAccountName] = something ! [Payee] = something End With В результате вы сможете обращаться к переменной, а не к фактическому элементу управления. Конечно, если требуется не задавать значения в элементе управления, а использовать значения из элемента управления, то можно просто создать перемен- ную, содержащую это значение, а не обращаться к элементу управления. Увеличение воспринимаемой скорости приложения Воспринимаемая скорость — это скорость приложения, которую воспринимает конечный пользователь. Данный вид скорости можно увеличить с помощью раз- ных приемов. Воспринимаемая скорость обычно связана с обеспечением визуаль- ной обратной связи в течение того времени, пока компьютер занимается выполне- нием какой-либо задачи. Обратная связь может, например, иметь вид поля, в кото- ром в процессе обработки данных будет отображаться процент выполнения задачи. Загрузка и использование скрытых форм Если некоторые формы используются и отображаются достаточно часто, то вы можете скрывать их, а не закрывать. Чтобы скрыть форму, установите ее свойство Visible равным False. Если форму понадобится отобразить снова, установите ее свойство Visible снова равным True. Формы, которые остаются загруженными, используют память, но отображаются быстрее, чем формы, которые при каждом просмотре должны заново загружаться. Кроме того, если вы морфируете (morph) форму или отчет, т.е. изменяете вид формы или отчета путем изменения их свойств, форма должна оставаться скрытой до тех пор, пока не будут внесены все изменения (пользователь не должен видеть, как форма постепенно меняется). Использование песочных часов I Если приложение должно выполнить достаточно длительную объемную задачу, примените в качестве обратной связи песочные часы. Курсор в виде песочных часов покажет пользователю, что компьютер не завис, а просто выполняет задачу. Чтобы включить отображение песочных часов, используйте метод Hourglass. DoCmd.Hourglass True
Вы сможете переключить курсор в стандартное состояние, применив такой оператор: DoCmd.Hourglass False Применение процентного счетчика Вместе с песочными часами при выполнении циклических процедур следует использовать также процентный счетчик, который предоставляет обратную связь пользователю и показывает, что приложение занято. Он также четко опре- деляет, на каком этапе выполнения задачи находится приложение. Во фрагменте кода, показанном ниже, используется цикл с процентным счетчиком, который отображает выполнение задачи (от 0% до 100%, с шагом в 1%). Dim iCount As Integer , iCount2 As Long Dim Result As Integer Result = SysCmd(acSysCmdlnitMeter, "Выполнение цикла", 100) For iCount = 1 To 100 Result = SysCmd(acSysCmdUpdateMeter, iCount) For iCount! = 1 To 50000: Next iCountl r задает паузу, чтобы счетчик можно было прочитать Next iCountl Result = SysCmd(acSysCmdRemoveMeter) Первый шаг в использовании процентного счетчика— его инициализация. Счетчик инициализируется с помощью функции SysCmd. Result = SysCmd(acSysCmdlnitMeter, "Выполнение цикла", 100) В этой строке используется константа Access acSysCmdlnitMeter, которая указывает функции, что вы инициализируете счетчик. Второй параметр — текст, который должен отображаться слева от счетчика. Наконец, последнее зна- чение — это максимальное значение счетчика (в данном случае 100%). Данное значение может быть любым. Например, при выполнении цикла по набору из 504 записей счетчик может заканчиваться значением 504, что позволяет в любой момент передать число записей в функцию SysCmd; Access определяет, какое ко- личество делений счетчика должно быть заполнено. После инициализации счетчика можно передавать ему значение, обновляю- щее счетчик. Чтобы обновить счетчик, потребуется снова вызвать функцию SysCmd и передать ей константу acSysCmdUpdateMeter и новое значение счет- чика. Помните, что значение, которое вы передаете функции, — не обязательно процент, отображаемый счетчиком. По завершении цикла вызовите функцию SysCmd (acSysCmdRemoveMeter), чтобы удалить счетчик с панели состояния. Обзор В данном уроке вы изучили способы, которые помогают ускорить работу прило- Готоао! жений. В уроке были рассмотрены следующие вопросы. • Настройка аппаратного обеспечения для достижения максимальной эф- фективности. • Существенное увеличение эффективности за счет поддержания программы в скомпилированном состоянии. • Сжатие базы данных. • Повышение эффективности с помощью создания баз данных . MDE.
• Организация базы данных в виде библиотек. • Использование приемов для увеличения абсолютной скорости базы данных. , • Применение приемов для увеличения воспринимаемой скорости работы: песочные часы, счетчик состояния и другие. Проверьте себя 1. Какой оптимальный объем оперативной памяти необходим для работы в Mi- crosoftAccess? (См. раздел "Аппаратное обеспечение и память”.) 2. Зачем используется компиляция программы? (См. раздел "Значение компиля- ции для скорости работы приложения”.) 3. Как скомпилировать файл базы данных Access? (См. раздел "Перевод про- граммы приложения в скомпилированное состояние") 4. Следует ли выполнять сжатие базы данных после компиляции? (См. раздел "Сжатие базы данных после компиляции”.) 5. Какие преимущества имеет использование файла .mde? (См. раздел "Создание файлов .mde и передача их пользователям”.) 6. С какой целью производится деление файла базы данных на библиотеки? (См. раздел "Организация часто используемого кода в библиотеке”.) 7. Какие приемы используются для увеличения абсолютной скорости приложе- ния? (См. раздел "Увеличение абсолютной скорости приложения”.) 8. Как отобразить песочные часы и счетчик состояния задачи при выполнении объемных задач? (См. раздел "Увеличение воспринимаемой скорости прило- жения”.)
УРОК Создание окон-заставок с анимацией. Информационные и стартовые окна приложения Содержание урока v Отображение стартовых окон * Анализ стандартных стартовых диалоговых окон * Создание основных типов стартовых форм ✓ Использование Access для открытия и закрытия диалоговых окон ✓ Добавление анимации Э Практически в любом профессиональном приложении используются стартовые формы. Они имеют большое значение в силу нескольких причин. Во-первых, ба- за данных и приложение могут загружаться достаточно долго, и пользователи Оояалос. n зоминут должны оставаться в приложении во время выполнения процесса загрузки. Воз- можно, вы будете напоминать им о загрузке последней версии программного обеспечения. Если пользователи обращаются к данным, хранящимся в отдель- ной базе данных, потребуется проверить, знают ли они, к какому файлу обраща- ются, и с необходимой ли базой данных они работают. Все эти элементы можно представить в виде удобного информационного окна.
Чем больше информации отображается в системе, тем больше шансов умень- шить количество ошибок, которые могут произойти на следующих этапах. Если вы будете постоянно обеспечивать полезную информацию оператору системы, то приложение будет работать эффективнее. В этом уроке вы научитесь создавать три типа информационных окон. • Заставки (splash screens). • Информационные окна About. • Стартовые окна. Создание окон-заставок Окно-заставка (splash screen) — это форма, которая отображается в течение нескольких секунд, а затем исчезает. Обычно ее можно увидеть, когда пользова- тель в первый раз открывает приложение. Она используется в таких целях. • Чтобы отобразить информацию о приложении: название, версию, регист- рационную информацию. • Чтобы пользователю было на что смотреть, пока загружается приложение. На рис. 19.1 показано типичное окно-заставка. Это форма frm Splash Screen из базы данных Check Writer. г < hi-, k ..filer foi Mic soft л с. ss Check Writer for Access Copyright © 2003 by Database Creations, he. AS Rights Reserved. Puc, 19,1. Окно-заставка приложения Check Writer Форма для окна-заставки создается аналогично любой другой форме. На рис. 19.2 в режиме конструктора показана форма-заставка, которая исполь- зуется в приложении Check Writer. Обратите внимание на компоненты, этой формы: логотип компании, логотип продукта, а также несколько текстовых по- лей и надписей, содержащих информацию о программе. При создании собствен- ной формы-заставки можно присоединить логотипы и другие рисунки или задать их как встроенные объекты. Кроме того, можно добавить в форму фоновый рисунок или другую информа- цию, которая потребуется пользователям при первом запуске приложения. Создавая форму, учитывайте ее размер. Раскрывающиеся окна всегда отображаются поверх других форм. Кроме того, окна-заставки не разворачи- ваются на полный экран, как другие формы. Поэтому необходимо создать достаточно большую форму, чтобы на ней поместилась вся необходимая ин- формация.
Рис. 19.2. Представление Конструктор (Design) для окна-заставки в приложении Check Writer Не устанавливайте свойство Modal формы-заставки равным True, поскольку, пока отображается эта форма, другие процессы должны работать. Если форма за- дана как модальная, вы не сможете работать с другими окнами, пока не будет за- крыта модальная форма. На рис. 193 показан лист свойств формы frm_SplashScreen: форма задана как всплывающая, отключены полосы прокрутки, кнопки навигации и кнопки выбора записей. Пользователь не должен взаимодействовать с данной формой; она предназначена только для просмотра. Рис. 19.3. Лист свойств для:£гт_3р1 ashScreen Автоматический запуск формы при открытии базы данных После добавления объектов и элементов управления необходимо указать Access, как должна открываться форма. Поскольку форма является окном-
заставкой, Access отображает ее при первом запуске приложения. Такого резуль- тата можно достичь несколькими способами. Задать форму как стартовую. Вызвать форму из стартовойформы. Открыть форму из макроса autoexec. Если вы используете свойство startup, убедитесь, что в приложении нет макро- сов autoexec. Они влияют на то, какая форма будет отображаться первой при запуске приложения. Установка формы какстартовой Чтобы задать форму как стартовую, выполните следующие действия. 1. Выберите команду Сервис^ Параметры запуска (Toolsd>Startup). Будет ото- бражено диалоговое окно Параметры запуска (Startup) — рис. 19.4. Рис. 19.4. Стартовое диалоговое окно 2. В поле со списком Вывод формы/страницы (Display Form/Page) выберите фор- му, которая должна отображаться в качестве заставки. В данном поле пере- числены все формы, которые находятся в текущей базе данных. Диалоговое окно позволяет также управлять другими элементами, отображаемыми при открытии приложения, например, окнами баз данных, панелями инструмен- тов и строкой состояния. Вызов формы из стартовой формы Заставк^ также можно вызвать из другой формы, являющейся стартовой. Для этого откройте другую форму и добавьте код в событие Загрузка (On Load), как показано ниже. При загрузке этой формы будет открыта и форма-заставка. Private Sub Form_Load() DoCmd. OpenForm " frm__SplashScreenn End Sub Использование макроса autoexec для открытия окна-заставки В более ранних версиях Access макросы autoexec применялись для выпол- нения определенного действия или ряда действий при первом запуске базы дан- ных. При открытии базы данных Access ищет макрос под названием autoexec и, если находит такой макрос, выполняет его автоматически.
Чтобы получить макрос autoexec, создайте макрос, содержащий действия, которые необходимо выполнить при открытии базы данных. Затем сохраните его под названием autoexec. Пример макроса autoexec, который используется для отображения окна-заставки, приведен на рис. 19.5. В более ранних версиях Access макросы autoexec часто использовались для управления параметрами запуска. В новых версиях Access для установки пара- метров запуска применяется диалоговое окно Параметры запуска. Осталось 20 минут Использование событий Таймер Поскольку окна-заставки отображаются на экране всего несколько секунд, необ- ходимо указать Access, как долго должна отображаться заставка и что делать по- сле того, как она закроется. В некоторых случаях потребуется отложить другие события на время, пока заставка остается открытой. Для этого используется со- бытие Таймер (Timer). Запустив макрос или процедуру события в процессе выполнения события Таймер (Timer), вы получаете возможность управлять действиями, которые выполняются в Access в любой момент времени. Например, можно открывать другие формы, выпол- нять макросы или управлять анимацией, которая используется в заставке. На рис. 19.6 показан лист свойств для формы frm_SplashScreen с выбран- ными свойствами Интервал таймера (Timer Interval) и Таймер (On Timer). Пе- риод времени задают в свойстве Интервал таймера; это действие можно выпол- нить и в программе с помощью следующего оператора. Me.Timerlpterval — X Здесь х— число миллисекунд (тысячных долей секунды). Чтобы установить обновление формы через каждые 5 секунд, введите в этом операторе или в поле свойства значение 5000. Свойство Таймер используется для определения действия, которое происходит по- сле отображения формы в рамках указанного интервала времени. Пример такого со- бытия представлен в следующем фрагменте программы. Обратите внимание: когда завершается отведенное время, форма под названием frm_AttachmentManager от- крывается, а форма f rm SplashScreen закрывается.
Private Sub Form_Timer() NumTime = NumTime + 1 If NumTime = 1 Then DoCmd.OpenForm "frm_AttachmentManager", acNormal, i i i i "Startup" End If If NumTime = 3 Then DoCmd.Close acForm, ’'frrn-SplashScreen'1 End End Sub Puc. 19.6. Установка событий таймера При установке интервала таймера равным 0 событие таймера выполняться не будет. Вы можете устанавливать необходимые действия, использовав событие Загрузка (On Load) и изменив событие On Timer следующим образом. Private Sub Form__Load () intTime = 0 ’ Инициализация переменной Me. Timerinterval = 500 ’ Установка таймера на полсекунды End Sub Private Sub Form_Timer() intTime = intTime + 1 ’ увеличение счетчика таймера Select Case intTime Case 6 ’ прошло 3 секунды ’ Открыть форму Attachment Manager в ’ стартовом режиме для проверки присоединенных таблиц DoCmd.OpenForm "fгm_AttachmentManager" , acNormal, z z z z "Startup" Case 8 ’ прошло 4 секунды ' закрыть эту форму DoCmd.Close acForm, Me.Name End Select End Sub
Программа в событии Form_Load устанавливает интервал таймера (переменную intTime) равным нулю. Обратите внимание, что свойство Timerinterval установ- лено равным 500, т.е. таймер работает с интервалом в полсекунды. Событие Form_Timer используется для управления действием, происходящим по истечении определенного промежутка времени. Оператор intTime = intTime + 1 указывает Access, что необходимо увеличить время на1. Когда интервал времени достигает 6, открывается форма frm_AttachmentManager. Когда интервал времени достигает 8, закрывается текущая форма frmJSplashScreen. Добавление анимации в окно-заставку Вы можете создать более интересные заставки, используя в форме анимацию. В форме frm_SplashScreeh можно применить простые приемы анимации, ко- торые сделают форму более красивой (рис. 19.7). Рис. 19.7.Дизайн окна-заставки с анимацией В данной форме на экране во время ее загрузки мигает текст Loading, please wait Такого результата можно достичь с помощью одной дополнительной стро- ки кода в событии On Tinier формы. Листинг 19.1. Программа для добавления мигающего текста Private Sub Form_Timer() intTime = intTime + 1 ' увеличение счетчика таймера Me.LoadingMessage.Visible = Not Me.LoadingMessage.Visible ' Пе- реключение сообщения о загрузке Select Case intTime Case 6 ' прошло 3 секунды ’ Открыть форму Attachment Manager в r стартовом режиме для проверки присоединенных таблиц DoCmd.OpenForm ”frm__AttachmentManager" , acNormal, , , f "Startup" Case 8 1 прошло 4 секунды ’ закрыть эту форму
DoCmd.Close acForm, Me.Name End Select End Sub Мигающий текст задан как надпись под именем Load: ngMessage. Эта строка ко- да, добавленная в событие Form_Timer, попеременно включает и отключает отобра- жение надписи, что создает впечатление мигания. Установить скорость мигания можно с помощью свойства Интервал таймера (Timer Interval). В этом примере ин- тервал задан равным 500, т.е. текст появляется и исчезает ("мигает") приблизительно каждые пол секунды. Когда счетчик достигнет значения 8, форма закрывается. Создание информационных окон About Одним из стандартных интерфейсов, предложенных почти в каждом прило- жении, является информационное окно About. Данную форму можно отобразить выбрав соответствующий параметр в меню Help или щелкнув на рисунке, лого- типе или скрытой области окна. Окно About, используемое в приложении Check Writer, показано на рис. 19.8. Это типичное информационное окно, которое применяется в стандартных при- ложениях. В нем вы увидите название приложения, номер версии, информацию об авторских правах и имена разработчиков. Рис. 19.8. Окно About в приложении Check Writer Окно About обычно устанавливается как всплывающая форма модального ти- па, в которой отображается основная информация о приложении. Пользователь должен выйти из формы прежде, чем приступать к выполнению какого-либо действия в приложении. Осталось 10 минут Добавление функциональных возможностей в окно About Кроме отображения стандартной информации о приложении, можно добавить в форму About и некоторые функциональные возможности, например кнопки для открытия других форм, гиперссылки и звуковые эффекты.
Обратите внимание, что окно About в приложении Check Writer содержит три кнопки. Кнопка ОК используется для закрытия формы, а кнонка System Info от- крывает форму frm__Syst eminformat ion. Эта форма используется для отобра- жения информации об операционной системе пользователя и версии Access. Аналогично, кнопка Support выводит простую форму frmTechSupport, которая обеспечивает информацию о возможностях получения технической поддержки по данному приложению. В нижней части формы находится надписьwww.databasecrations.com. Она представляет собой гиперссылку, при щелчке на которой открывается ссылка на главный Web-узел компании. Задать эту ссылку несложно. Просто добавьте соот- ветствующий URL в свойство надписи Адрес гиперссылки (Hyperlink Address) — рис. 19.9. Рис. 19.9. Добавление гиперссылки Если гиперссылку необходимо использовать для соединения с удаленным URL, удостоверьтесь, что пользователь с помощью браузера может установить соедине- ние с URL, кроме того, он должен обладать правами доступа к этой Web-стран и це: Если вы предполагаете, что у пользователей может быть не установлен браузер или конфигурация соединения, предоставьте им дополнительные возможности для установки соединения с удаленным документом по мперссылке. Вернемся к окну About (см. рис. 19.8); обратите внимание, что первый символ в тексте каждой кнопки подчеркнут. Это означает, что для каждой кнопки задана клавиша доступа, т.е. при нажатии <Alt> и клавиши подчеркнутого символа фокус переходит на эту кнопку. Можно задать клавишей доступа любой символ из текста Подпись (Caption) этой кнопки, установив перед ним знак амперсанда (&). Не используйте один и тот же символ в качестве клавиши доступа для нескольких кнопок в одной форме. Если нескольким кнопкам присвоена одинаковая клавиша доступа, при нажатии комбинации клавиш <АИ+КЛавиша доступа> будет вы- брана кнопка, расположенная первой в порядке перехода по табуляции. Но это может быть не та кнопка, которую следует выбрать. Добавление звука в окно About Информационное окно About можно сделать более веселым, если вы добавите звуковое сопровождение при открытии формы. Для этого потребуется вставить i
в форму звуковой клип. Точное положение и размер клипа не имеют особого зна- чения, поскольку его размер можно установить при открытии формы. На рис. 19.10 звуковой клип в проекте формы окна About представлен стандарт- ной пиктограммой звука. Рис. 19.10. Добавление на форму звукового клипа После добавления звукового клипа необходимо активизировать этот объект, установив его свойство Доступ (Enabled) равным Да (True) и изменив свойство Автоматический запуск (Auto-Activate) на значение При получении фокуса (Get Focus). Наконец, фокус на элементе управления устанавливается с помощью события Загрузка (On Load) для формы. Ниже представлен код события Загрузка (On Load) для формы About. Обратите внимание, что в этом фрагменте операторы заданы для звукового файла под назва- нием Sound. Сначала фокус переходит на этот объект, чтобы звучало звуковое со- провождение. Затем ширина и высота объекта устанавливаются равными нулю для того, чтобы пиктограмма звука не отображалась в форме при ее открытии. Private Sub Form__Load() Me.Sound.SetFocus Me.Sound.Height = 0 Me.Sound.Width = 0 End Sub Звукового сопровождения не будет, если установить свойство Вывод на экран (Visible) этого объекта равным Нет (False).
Создание стартового окна Стартовая форма (первая форма) —г это форма, которая отображается при первом запуске приложения. Как правило, она используется для того, чтобы дать пользователю указания по установке или настройке приложения. Кроме того, в ней может быть предложен ролик для знакомства с приложением или обучаю- щие средства. Как видно из рис. 19.11, стартовая форма (First Screen) для приложения Check Writer под названием frm_FirfetScreen предоставляет пользователю основные инструкции по данному приложению. Форма состоит из нескольких надписей, текстового поля, кнопки, флажка и одного несвязанного объекта, который ис- пользуется для отображения рисунка. Рис. 19,11. Стартовая форма в режиме конструктора Кнопка Continue используется для закрытия формы frm FirstScreen и от- крытия следующей формы — главного меню приложения, обучающей или де- монстрационной формы. Проверка значения для отображения стартового окна Флажок Don't Show This Screen Again позволяет пользователю указать, следу- ет ли отображать стартовую форму при каждом запуске приложения. Если поль- зователь предпочитает больше не видеть эту информацию, то при запуске при- ложения первая форма будет пропущена. Для этого используется код в событии Открытие (On Open) стартовой формы, в котором выполняется проверка значе- ния, выбранного пользователем. В приложении Check Writer для открытия формы First Screen используется событие Закрытие (On Close) для формы frm__AttachmentManager. Private Sub Form_Close() If Me.OpenArgs = "Startup" Then DoCmd.OpenForm "frm_FirstScreen"
End If End Sub Обратите внимание, что данная программа открывает форму First Screen, да- же если установлен флажок, который указывает на то, чтобы она больше не ото- бражалась. Чтобы определить, должна ли открываться форма (согласно выбору пользователя), в коде события Загрузка (On Load) формы frm FirstScreen вы- полняется проверка параметра, выбранного пользователем. Private Sub Form_Load() If Me.SkipFirstScreen Then DoCmd.Close acFormf Me.Name End If End Sub Форма frm FirstScreen связана с таблицей tbleLocalSettings, состоя- щей из двух полей. Поле Programversion используется для хранения номера текущей версии, который отображается в информационном окне About. Поле SkipFirstScreen указывает, должна ли отображаться первая форма. Если зна- чение данного поля равно True (пользователь не желает, чтобы отображалась первая форма), стартовая форма будет сразу же закрыта. Эта задача выполняется путем программного выбора кнопки cmdContinue в стартовой форме. Сохранение значения для отображения стартового окна « Поскольку пользователь может задать отображение стартового окна, в про- грамму должен быть включен способ хранения этого параметра, и приложение должно определять, следует ли открывать форму. Так как форма связана с табли- цей tbl Local Settings, можно хранить соответствующее значение в поле этой таблицы, для чего используется поле SkipFirstScreen. Приложение проверяет значение данного поля, определяя, должна ли отображаться первая форма. Это поле представлено в форме флажком с надписью Don't Show This Screen Again. Если пользователь устанавливает этот флажок, значение поля изменяется на True. Таким образом, при последующем запуске приложения форма First Screen проверяет значение поля. Если поле имеет значение True, форма сразу же закрывается. В противном случае форма будет открываться каждый раз при за- пуске приложения, пока пользователь не снимет флажок. Убедитесь, что значение поля SkipFirstScreen установлено равным False, если хотите, чтобы при первом запуске приложения отображалась стартовая форма. Готово! Обзор В этом уроке вы изучили несколько типов форм, используемых в приложениях. В уроке были рассмотрены следующие темы. • Окна-заставки могут использоваться для отображения информации о при- ложении во время его запуска. • Информационная форма About — часто используемый в приложениях тип формы. Он обеспечивает подробную информацию о приложении, а также может включать контактные данные и информацию об авторах продукта. • Стартовые окна предоставляют инструкции по использованию приложе- ния, предлагают дополнительную помощь по обучению работе с приложе-
нием и могут даже включать ссылки на учебник или демонстрационный ролик приложения. В данном уроке вы научились управлять отображени- ем этих форм, а также овладели некоторыми приемами добавления в фор- му функциональных возможностей, анимации и звука. Проверьте себя 1. Какое событие может быть использовано для управления действиями, проис- ходящими в форме? (См. раздел "Использование событий Таймер”.) 2. Как установить гиперссылку на кнопке формы? (См. раздел "Добавление функциональных возможностей в окно About”.) 3. Как добавить звук в форму или элемент управления на форме? (См. разделы "Добавление функциональных возможностей в окно About", "Добавление звука в окно About”.) 4. Как определить, должна ли отображаться форма согласно выбору пользовате- ля? (См. разделы "Создание стартового окна", "Проверка значения для ото- бражения стартового окна", "Сохранение значения для отображения старто- вого окна”.)

УРОК Создание справочных систем Содержание урока * Использование утилиты Help Viewer v Разработка справочных тем ✓ Применение средств по разработке справочных систем ✓ Присваивание идентификаторов разделам справки * Вызов справочной системы из форм и элементов управления Осталось 30 минут Справочная система — один из основных компонентов любого приложения. Многие разработчики не уделяют достаточного внимания этому компоненту либо по причине отсутствия знаний, необходимых для создания такого рода системы, либо из-за недостатка времени. Если вы сможете разработать и ин- тегрировать в приложение хорошую справочную систему, то значительно увеличите его шансы на успех. В этом уроке вы научитесь добавлять в при- ложение справочную систему. Использование утилиты Help Viewer Утилита Help Viewer отображает файлы, составляющие справочную сис- тему. Быстрее всего Help Viewer можно отобразить, нажав <F11>. Кроме то- го, можно выбрать Help в строке меню. На рис. 20.1 показано окно Help Viewer для приложения Check Writer. Утилита Help Viewer отображается при нажатии <F1> в любой части формы Check Writer. Окно Help Viewer включает следующие элементы.
• Область Topic (Раздел справки). • Область навигации Navigation. • Панель инструментов. Рис. 20.1. Отображение справочной системы в приложении Check Writer В области Topic отображается текст раздела справки. В области навигации, расположенной слева от области Topic (Раздел справки), находится вкладка Contents (Оглавление). Панель инструментов представлена в верхней части окна и содержит кнопки для выполнения следующих задач. • Отображение или скрытие инструментов навигации. • Перемещение вперед или назад по просмотреннымтемам. • Вывод текущего раздела справки на печать. • Установка параметров для отображения окна Help Viewer. Вкладка Contents (Оглавление) отображается в виде дерева. Рядом с каж- дой темой верхнего уровня расположена кнопка Open (Открыть) и пикто- грамма книги. Если щелкнуть на кнопке Open (Открыть), она изменится на кнопку Close (Закрыть), пиктограмма книги — на изображение открытой
книги, а под элементом верхнего уровня вы увидите одну или несколько раз- делов этой темы. Рядом с каждым разделом справки отображается пиктограмма вопроситель- ного знака. При выборе раздела в области Topic (Раздел справки) будет представ- лена информация этого раздела справки. Созданиесправочнойсистемы Для разработки справочной системы требуются не только значительные уси- лия, но и время на планирование. Прежде, чем приступить к описанию содер- жимого справки, необходимо определить список всех важных свойств и функций приложения и схематически организовать эти элементы. Создание схемы спра- вочной системы напоминает разработку плана статьи или книги. Порядок эле- ментов долясен соответствовать порядку расположения функций в приложении. После завершения работы над справочной системой ее схема должна быть напо- минать содержание. Если схема справочной системы разработана, можете переходить к написа- нию справочной информации, отображаемой в разделах справки. Содержимое каждого раздела справки разрабатывается в формате HTML и хранится в отдель- ном файле HTML. Для создания тем справки можно использовать Microsoft Word или любой другой инструмент, позволяющий создавать файлы HTML. Формат HTML обеспечивает гибкие возможности по разработке справоч- ной системы. Помимо текстового содержания, можно также добавлять в раз- делы справки рисунки, звуки, анимацию или любые другие элементы, кото- рые предоставляют необходимую пользователю информацию. На рис. 20.2 показан HTML-файл, написанный в Microsoft Word, для темы Writing a Check (Создание чека). Тема Writing a Check включает информационный текст, рисунки и не- сколько ссылок, выделенных цветом и подчеркнутых. При размещении ука- зателя мыши над такой областью его вид изменяется на кисть руки. Это означает, что, щелкнув, вы перейдете к теме, соответствующей данному ключевому выражению. Чтобы собрать все файлы разделов справки в формат, доступный для про- смотра через Help Viewer, необходим инструмент для разработки справочной системы. Инструменты разработки справочных систем выполняют следую- щие функции. Компилируют все справочные файлы в один файл(. chm), который можно включить в состав готового продукта. Создают содержание, указатель и средства для контекстного поиска. Обеспечивают интерфейс взаимодействия с Windows HtmlHelp API, чтобы справочную систему можно было интегрировать в приложение. Для разработки справочных систем можно использовать различные средства разработки. Версия разработчика Microsoft Access 2000 содержит продукт HTML Help Workshop. Два других популярных инструмента — Doc-To-Help и Robo Help. Список всех доступных инструментов можно найти Web-узле Microsoft (www.microsoft.com/), выполнив поиск по ключевому слову HTML Help.
Рис. 20.2. Создание разделов справки с помощью Microsoft Word В данной книге мы не будем подробно описывать этапы создания справочной системы с помощью этих инструментов разработки. Для их эффективного ис- пользования необходимо учесть ряд вопросов, особых для каждого инструмента разработки. Созданию действительно профессиональных справочных систем по- священо немало толстых книг: например Building Enhanced HTML Help with DHTML and CSS (Создание сложных справочных HTML-систем с помощью DHTML и CSS) Джанин Кляйн (Jeannine Klein). 3 Определение идентификаторов для разделов справки Осталось ' 20 минут Далее мы расскажем об использовании инструментов разработки справочных систем для определения свойств программного интерфейса приложения (application programming interface, API) для программы HtmlHelp. В данном уроке свойства HtmlHelp API устанавливаются с использованием Html Help Workshop. Создание файла заголовков Приложение получает справочную тему из справочной системы, передавая в приложение идентификатор раздела справки. Каждой теме в справочной системе должен соответствовать уникальный идентификатор раздела справки. Чтобы присвоить идентификатор каждой теме, необходимо создать файл заголовков.
Файл заголовков (header file) — просто специальный тип текстового файла, ко- торый содержит данные в предопределенном формате. На рис. 20.3 показан файл заголовков для справочной системы приложения Check Writer. t'bftrk WntPi h (. iHKHOT - П X Файл Правка Формат Виц Справка #Sfine~n)H WELCOME f «define IDH'WRITECHECK 2 «define IDH'ACCOUNT 3 «define IDH STUB 4 «define IDH DELETECHK 5 «define IDHZCKAMOUNT 6 Puc. 20.3. Создание файла заголовков для справочной системы Файл Check Writer .h содержит информацию о заголовках для справочной системы Check Writer. При его создании можно использовать Блокнот (Notepad) или любое другое приложение для работы с текстовыми файлами. Каждая строка в файле присваивает уникальный идентификатор одному раз- делу справки, используя следующий синтаксис. ttdefine <символьное имя> <идентификатор> Записи в файле заголовков напоминают программу. Команда #define ис- пользуется для выполнения оператора присваивания. Символьное имя— это описательное имя, которое применяется для ссылки на тему справки: оно долж- но состоять только из буквенных символов, без пробелов. Идентификатор — это числовое значение, которое используется для ссылки на соответствующий раздел справки. Каждый идентификатор в файле заголовка должен быть уникальным. Записи следует создавать в соответствии с порядком идентификаторов, чтобы впоследствии с файлом было легче работать. Кроме того, если умножить каждый номер идентификатора на 10,100 или 1000, то в случае необходимости будет го- раздо проще добавить новый раздел справки. Добавление файла заголовков в проект справочной системы После того, как вы создадите файл заголовков, содержащий идентификаторы для каждой темы, его необходимо будет включить в проект справочной системы. Чтобы добавить файл в справочную систему, выполните следующие действия. 1. Откройте HTML Help Workshop. 2. Откройте файл проекта справочной системы (. hhp). 3. Щелкните на кнопке HtmIHelp API Information в окне HTML Help Workshop. Откроется диалоговое окно HtmIHelp API Information (рис. 20.4).
Рис. 20.4. Включение файла заголовков в спра- вочную систему 4. Щелкните на кнопке Header File на странице Мар диалогового окна HtmlHelp API Information. Появится диалоговое окно Include File. 5. Используйте кнопку Browse, чтобы выбрать название созданного ранее файла заголовков. Затем щелкните на кнопке ОК. Имя файла заголовков отобража- ется на вкладке Мар. Если перед символьным названием раздела справки в файле заголовков поста- вить префикс IDH, HTML Help Workshop автоматически проверит при компиляции проекта, существует ли в нем данный раздел справки. Файл заголовков используется для присвоения идентификаторов разделов справки, которые будут использоваться в справочной системе. Далее следует указать, какой файл раздела (или файл HTML), соответствует каждому иденти- фикатору раздела справки. Чтобы установить соответствия между идентифика- торами и файлами HTML, выполните следующие действия. 1. Перейдите на вкладку Alias диалогового окна HtmlHelp API Information (рис. 20.5). 2. На вкладке Alias щелкните на кнопке Add. Появится диалоговое окно Alias (рис. 20.6). 3. В первом поле на вкладке Alias введите первый символьный идентификатор, созданный в файле заголовков. 4. В раскрывающемся списке Use it to refer to this HTML file: выберите название файла справки HTML, который хотите использовать для символьного иден- тификатора. Затем щелкните на кнопке ОК. На вкладке Alias диалогового ок- на HtmlHelp API Information отображается строка Alias. 5. Введите определения псевдонимов для каждого из символических идентифи- каторов, которые были указаны в файле заголовков. 6. После завершения работы с определениями псевдонимов щелкните на кнопке ОК вкладки Alias, чтобы их сохранить.
Map Alias Alias strings to HTML files: IDH_CKAMOUNTEntering the CheckAmount ht IDH_DELETECH K.=D eleting An U nwanted Chhcl1 I DH_S TUB «Creating a Check Stub in the Check' ID H_WE LCD M E Welcome, htm IDH_WRITECHECK«DeatBig a New Ch*ck him OK Cancel Рис. 20.6. Добавление псевдо- нима HtmlHelp API Puc.20.5. Установление соответствий между идентификаторами и файлами HTML Обязательно сохраняйте и компилируйте проект справочной системы, когда вно- сите в него какие-либо изменения. Тестирование определений HtmlHelpAPI HTML Help Workshop предоставляет возможность тестирования установлен- ных соответствий HtmlHelp API, которую можно использовать, чтобы удостове- риться, что символьные идентификаторы разделов справки соответствуют пра- вильному разделу. Для тестирования идентификатора раздела справки необхо- димо выполнить следующие действия. 1. Выберите команду Test1^HtmlHelp API из меню Help Workshop. Появится диа- логовое окно Test HtmlHelp API (рис. 20.7). Рис. 20.7. Тестирование определений HtmlHelpAPI 2. Используйте кнопку Browse, чтобы выбрать название скомпилированного файла справки, если он не выбран автоматически. В поле Command перейдите к НН HELP_CONTEXT. Введите в поле Map Number идентификатор раздела, ко- торый требуетёя протестировать.
Осталось 10 минут 3. Щелкните на кнопке Test. Откроется окно Help Viewer, отображающее тему справки. Эта тема соответствует идентификатору раздела, указанному в диа- логовомокнеТе8Ш1ш1Не1рАР1. Если Help Viewer отображает не тот раздел справки или вообще не отображает раздел справки, ошибка может заключаться в следующем. • Правильный ли файл заголовков выбран на вкладке Мар в окне Test HtmIHelp API? • Был ли введен символьный идентификатор для файла HTML, выбранного на вкладке Alias диалогового окна HtmIHelp API Information? • Совпадает ли символьный идентификатор на вкладке Alias с идентифика- тором, указанным в соответствующем файле заголовков? • Был ли сохранен и заново скомпилирован проект? После проверки определений Html Help API можно присоединять справочную систему к приложению Access. Присоединение файла справки к приложению Access ЕСЛИ файл справки проверен и он работает корректно, несложно связать его с приложением Access. В приложении может отображаться общая справка для форм или конкретные разделы справки, относящиеся к полям, командным кнопкам и элементам меню, а Определение справки для формы Каждая форма располагает двумя свойствами, касающимися справочной сис- темы. Это Файл справки (HelpFile) и Идентификатор справки (HelpContextID). Свойство Файл справки используется при установлении источника для всех раз- делов справки, которые требуется отобразить для данной формы. Свойство Иден- тификатор справки содержит идентификатор раздела справки, который должен применяться в качестве общей справки по данной форме. Чтобы задать свойство Файл справки (HelpFile), введите путь и имя файла для скомпилированного справочного файла (. chm), который должен использоваться в форме. На рис. 20.8 показаны параметры справки для формы Check Writer. Форма Check Writer связана с файлом Checkwriter. chm. Если не указать путь файла справки, то Access будет искать данный файл в папке приложения. Старайтесь не использовать в приложении прямо введенные пути к файлам, что может привести к ошибкам в процессе выполнения приложения или к некоррект- ным действиям программы. Свойство Идентификатор справки (HelpContextID) для формы Check Writer задано равным 1. Параметры Идентификатора справки, которые ис- пользуются для формы, совпадают с идентификаторами разделов справки, указанными в диалоговом окне HtmIHelp API Information. Идентификатор 1 в справочной системе Check Writer соответствует разделу справки Welcome. Когда пользователь, находясь на форме, нажимает <F1>, Help Viewer ото- бражает раздел справки Welcome.
Рис. 20.8. Интеграция справки для формы Отображение разделов справки для элементов управления Вы можете создать отдельный раздел справки для каждого элемента управ- ления в форме. Находясь на этом элементе управления, пользователь может нажать <F1>, чтобы просмотреть раздел справки, описывающий активный элемент управления. Для присоединения элемента управления к определенно- му разделу справки необходимо установить свойство Идентификатор справки (HelpContextID) для этого элемента управления. Справочный файл, который используется с целью предоставить справку на уровне отдельных элементов управления, — это файл, указанный в свойстве Файл справки (HelpFile) для формы. Можно связывать элементы управления с идентификаторами, указан- ными в файле заголовков для справочной системы. При создании справочной информации для элементов управления в форме держите под рукой содержание файла заголовков. Советуем разместить и файл заголовков, и окно Конструктор на экране одновременно (рис. 20.9). Устанавливая свойство Идентификатор справки для переключателей, за- дайте значение Идентификатор справки и для их надписей тоже, тогда соответ- ствующий раздел справки будет отображаться независимо от того, где щелкает пользователь. (Некоторые пользователи будут щелкать на тексте рядом с пере- ключателем, а йе на самом элементе управления.)
Рис. 20.9. Создание справочной системы науровнеэлементовуправления формы Если в файле справки не содержатся специальные разделы для элементов управления формы, то оставьте свойство Идентификатор справки для этих эле- ментов управления равным 0 (значение по умолчанию). Если пользователю по- требуется получить справку по элементу управления, будет отображена общая справка по форме. Не забудьте задать свойство Идентификатор справки (HelpContextID) для формы. Если свойство Идентификатор справки равно 0, то для форм и для всех элементов управления со свойством Идентификатор справки, рав- ным о, отображается справка по Microsoft Access. Тестирование созданной справочной системы Соединив разделы справки с элементами управления в форме, обязательно протестируйте справочные связи в форме. На рис. 20.10 показан раздел справки, который отображается при нажатии <F1>, когда фокус находится на поле Bank Account в форме CheckWriter. Чтобы протестировать связи в справочной системе, откройте форму. Нажмите <F1> для каждого элемента управления в форме. Для элементов управления, не имеющих собственных разделов Идентификатор справки» должна отображать- ся общая справка по форме.
г 1 j Selecting a Bank Account to Work With When in the Chee к Writer form, you have the option to work with any account in your Banking system. To select a bank account different from the default account, click on the combo box next to the Bank Account field at the top of the form. Alistofyour bank accounts will drop down and you can select one by clicking on the correct account. Puc. 20.10. Тестирование специальной справочной системы для формы Готово! Обзор Профессиональное приложение должно иметь хорошо составленную и подроб- ную справочную систему. Пользователи приложения чувствуют себя более уве- ренно, приступая к работе с приложением, если знают, что могут в любой момент быстро получить необходимую и точную информацию по тому или иному вопро- су. Удачно составленная справочная система уменьшает время, потраченное со- трудниками службы технической поддержки, и повышает эффективность при- ложения. В этом уроке рассматривались такие вопросы. В приложениях Access справочная система отображается с помощью Win- dows Help Viewer. Разделы справки создаются в формате HTML. Чтобы создать справочную систему, необходим определенный инструмент для разработки справочных систем, например, HTML Help Workshop. Интерфейс HtmIHelp API предоставляет возможность отображать отдель- ные разделы справки в справочной системе. Вы можете отобразить справку по форме Access, используя соответствую- щие свойства для формы и элементов управления на ней. Проверьте себя 1. Назовите три компонента среды Help Viewer. (См. раздел "Использование утилиты Help Viewer”.) 2. Укажите первый этап разработки справочной системы. (См. раздел "Создание справочной системы”.)
3. Какая утилита позволяет приложениям отображать справочную систему?1 (См. раздел "Определение идентификаторов для разделов справки”.) 4. Для чего предназначен файл заголовков справочной системы? (См. раздел "Создание файла заголовков”.) 5. Назовите два свойства, которые используются в форме Access для отображе- ния разделов справки. (См. раздел "Присоединение файла справки к прило- жению Access”.) 6. Назовите источник списка идентификаторов разделов справки, которые ис- пользуются в форме. (См. раздел "Отображение разделов справки для элемен- тов управления”.)

ЧАСТЬ Суббота. Вечер. Обзор 1. Назовите пять параметров функции MsgBox. 2. Верно ли, что параметр кнопки в функции MsgBox определяет также пикто- грамму, которая должна отображаться в окне сообщения? 3. Опишите отличия между окнами сообщения, модальными на уровне прило- жения и модальными на уровне системы. 4. Какое (какие) из следующих утверждений верны? а. Обработка ошибок в программе включается с помощью оператора On Er- ror GoTo 0. б. Оператор Resume 0 отключает обработку ошибок. в. Оператор Resume Next возвращает выполнение программы на строку, ко- торая следует сразу за строкой, в которой произошла ошибка. г. Все вышеперечисленные утверждения верны. д. Ни одно из перечисленных выше утверждений не верно. 5. Назовите типы файловых форматов, которые можно импортировать в прило- жение Access или экспортировать из Access. 6. Из каких основных этапов состоит процесс импорта данных? 7. Что такое спецификация импорта/экспорта и где ее можно создать? 8. Перечислите методы, которые могут использоваться для переноса данных. 9. Что важнее для увеличения скорости работы Microsoft Access: память или бо- лее быстрый процессор? 10. Назовите три варианта выхода приложения из скомпилированного состояния. 11. Как называется недокументированная команда, которая способна значитель- но ускорить работу программы Access и одновременно "подчистить" файл ба- зы данных? 12. Какие действия нельзя выполнять с файлом базы данных . MDE? 13. Верно ли, что окно-заставка — это один из видов системы меню? 14. Верно ли утверждение о том, что пользователь не может работать с другими окнами, пока не будет закрыта модальная форма? 15. Макрос AutoRun используется для выполнения действия или ряда действия при первом открытии базы данных. Так ли это? 16. Верно ли, что при установке события таймера равным 0 событие не будет вы- полняться?
17. В какой области окна Help Viewer отображается текст раздела справки? 18. Верно ли утверждение о том, что содержимое разделов справки создается в формате HTML? 19. Какую функцию из перечисленных ниже не выполняют инструменты разра- ботки справочных систем? а. Компиляции всех справочных файлов в один файл с расширением . СНМ. б. Создания содержания, указателя и утилиты контекстного поиска. в. Обеспечения интерфейса для взаимодействия с Windows HtmlHelp API. г. Вставки идентификаторов разделов справки в формы и поля приложения. 20. Какое свойство используется для присоединения файла справки к элементу управления? a. HelpContextID б. OnHelp в. OnKeyDown г. Caption

Часть V. Воскресенье. Утро Урок 11. Урок 24. Упаковка проложения. УрОК 25. Урок 28. Урок 29. Урок 30. Создание запросов SQL Server —УрОК 23.-- - ’ Арх и тентуро приложения ^Урох21. Создание диалоговых окон поиска Программирование диалоговых окон и отчетов, работе с элементами управленияАсСптеХ Программирование форм-мастеров для ускорения обработки данных УрОК 26* Исттмяяяше надстроек в приложении^ --Часть VI. Воскресенье. День- Урок 27. Программирование и использование присоединенных файлт Обеспечение защиты баз данных Access ' Access и клиент-серверные данные
Урок25^ Прогреми __._—----------------— ^.ггг- ,-----------------------------------,-, , ——— ------- Урок24^;^^^^ ynoi^a^gjg^Bg@feteffl окон иошёШ^Ш35оТ№й' V Урок 21 Созданиедиал жвясж'он поиска сэлементами^ар^вления ActiveX мастеров
УРОК Создание диалоговых окон поиска Содержание урока * Основные характеристики диалоговых окон * Создание диалогового окна поиска * Изменение элементов для поиска ✓ Поиск выделенного элемента в форме </ Вызов формы диалогового окна поиска 30 минут Microsoft Access предлагает несколько встроенных приемов для поиска данных, однако каждый из них требует от пользователя знание механизма его поиска. Возможно, вы считаете, что пользователь может поставить курсор на поле ищелкнуть на кнопочке с биноклем, но данный метод не всегда очевиден и поня- тен. Еще меньше шансов, что пользователи, которые работают с приложением Access, будут пытаться создать запрос по форме, особенно если они почти нико- гда не работали с Microsoft Access. Диалоговое окно поиска позволит быстро вы- брать метод просмотра данных, найти желаемую запись и отобразить ее на любой форме ввода данных. Поскольку во многих приложениях Access интерфейс Microsoft Access частично или полностью скрыт, вопрос программирования диа- логового окна поиска становится первоочередным. Основные характеристики диалоговых окон Диалоговые окна представляют собой значительную часть любого приложе- ния. Они помогают управлять переходом из одной области приложения в другую и предоставляют несколько вариантов действий пользователя, которые в про- тивном случае потребовались бы часы программирования или ручных операций.
Создание новых диалоговых окон, предоставляющих пользователю варианты выбора, позволяет упростить приложение и сделать его более понятным. Пользо- ватели могут легко переходить от одного выбранного варианта к другому, что уменьшает затраты на обучение работе с программой и значительно увеличивает ее эффективность. При щелчке на кнопке Search в форме frm_CheckWriter отображается диалого- вое окно Search for Check/Deposit/Adjustment (поиск для чека/депозита/исправления), которое содержит группу переключателей под названием Type of Search (тип поиска) и список, в котором показаны все элементы, доступные для поиска в форме frm_CheckWriter(pnc. 21.1). Рис. 21.1. Использование диалогового окна для поиска записи Группа переключателей Type of Search содержит пять разных вариантов по- иска. При выборе переключателя содержимое списка изменяется и отображает информацию, соответствующую данному типу поиска. Например, для варианта Checks By Check Number (чеки по номеру) в списке отображаются все чеки в че- ковой книжке, отсортированные по номеру чека. Для варианта Deposits By Deposit Date (депозиты по дате) в списке отображаются все депозиты из чековой книжки, отсортированные по дате депозита. Когда пользователь выбирает эле- мент в списке и щелкает на кнопке ОК, диалоговое окно закрывается, и в форме frw_CheckWri ter отображается выбранная в списке запись. И формы ввода данных, и диалоговые окна представляют собой формы, одна- ко диалоговые окна обладают рядом уникальных характеристик. Самая важная из них заключается в следующем: поля обычно не связаны с источником данных. Поскольку они предназначены просто для перехода из одной формы в другую или от одной записи к другой, диалоговым окнам не требуется собственный ис- точник данных. Элементы управления в диалоговом окне — это все, что необхо- димо для определения последующих действий. Ниже приведен ряд свойств, уникальных для диалоговых окон.
Автоматический размер (Auto Resize) Выравнивание по центру (Auto Center) Всплывающее окно (PopUp) Модальное окно (Modal) Тип границы (Border Style) Кнопка оконного меню (Control Box) Кнопки размеров окна (Min Max Buttons) Кнопка закрытия (Close Button) Да (True) — диалоговое окно изменяет размер, чтобы вместить все элементы управления в форме Да (True) — диалоговое окно отображается в центре экрана Да (True) — форма отображается поверх всех осталь- ных окон Да (True) — пользователь не может выбрать другое ок- но, пока не будет закрыто данное диалоговое окно Окна диалога (Dialog) — отображается толстая рамка постоянного размера Да (True) — отображается кнопка Control Menu в верх- нем левом углу формы Отсутствуют (None).— скрывает кнопки Свернуть/ Восстановить (Minimize/Maximize) Да (True) — отображается кнопка Close (Закрьпь), при этом свойство Кнопка оконного меню должно иметь значение Да Мы перечислили традиционные параметры диалоговых окон, однако эти на- стройки используют не всегда. Параметры диалогового окна frmDialog- CheckSearch приведены на рис. 21.2. Рис. 21.2. Установка свойств диалогового окна Параметр Всплывающее окно (Pop Up) указывает на то, что диалоговое окно должно отображаться поверх всех остальных окон. Однако если диалоговое окно выводит во время работы еще одно окно (например, окно параметров печати — Print Preview), то в этом случае диалоговое окно будет находиться поверх второго окна. Если вы используете свойство Всплывающее окно (Pop Up), то должны его закрыть, прежде чем отображать другое. Если по какой-либо причине это диало- говое окно должно оставаться открытым, его можно скрыть. Раньше для диалоговых окон всегда использовалась толстая рамка постоян- ного размера (что указывало на модальность диалоговых окон). Тем не менее, со- временные возможности разрешения экрана и явная тенденция к предоставле-
нию пользователю большей свободы приводят к тому, что стиль Тип границы (Border Style) уходит в прошлое, диалоговые окна отображаются с обычной рам- кой, и их размеры можно изменять. Осталось 20 минут Модальные диалоговые окна используются в последнее время довольно редко. Концепция окон и программирования, основанного на событиях, состоит в том, что пользователь должен сам решать, какие действия ему выполнять и когда. Ста- райтесь не использовать модальные диалоговые окна, за исключением тех случа- ев, когда требуется строго провести пользователя по определенному пути и удер- живать его в диалоговом окне, пока он не выполнит определенное действие либо пока он не закроет диалоговое окно. Свойство Выравнивание по центру (Auto Center) работает в комбинации со свойством Всплывающее окно и управляет тем, что диалоговое окно отображается в центре экрана. Несмотря на то, что центрированное диалоговое окно всегда мож- но переместить, в следующий раз оно все равно будет открыто в центре экрана. Единственной причиной использования данного свойства может быть ситуация, когда в среде приложения используется большое количество различных разреше- ний изображений, и диалоговые окна (которые, как правило, меньше форм ввода данных) могут при более крупном разрешении быть размещены в углу экрана. Ес- ли приложение открыто с меньшим разрешением, диалоговое окно может оказать- ся частично за пределами экрана, а в некоторых случаях оно станет недоступным. Создание диалоговых окон поиска ЕСервый этап в создании диалогового окна поиска — это создание формы, анало- гичной нормальной форме ввода данных. Установите для формы описанные вы- ше свойства так, чтобы она выглядела, как диалоговое окно. Затем необходимо добавить в диалоговое окно элементы управления. Типич- ное диалоговое окно поиска, например форма frm DialogCheckSearch, вклю- чает следующие элементы управления. • Группа переключателей для выбора типа поиска. • Список или поле со списком для отображения элементов, доступных для поиска. • Набор командных кнопок для начала поиска или отмены диалогового окна. Один из переключателей следует установить по умолчанию, чтобы при открытии диалогового окна какой-то из параметров уже был выбран, а в списке отображался соответствующий набор элементов. На рис. 21.3 показана установка параметра по умолчанию для группы переключателей Type of Search. Вы можете создать в диалого- вом окне любое количество разных вариантов; единственное ограничение — физиче- ский размер экрана. Если требуется предоставить неограниченный выбор вариантов, группу переключателей можно заменить полем со списком. Если в форме представлено пять или меньше параметров, советуем использовать для них группу переключателей. Если же параметров больше пяти, удобнее офор- мить их в виде поля со списком. После установки типа поиска, выбранного по умолчанию, необходимо прове- рить, соответствует ли свойство Источник строк (RowSource) для списка этому параметру. Тогда при открытии формы в списке будут автоматически отобра- жаться необходимые элементы, которые соответствуют выбранному типу поис-
ка. На рис. 21.4 показаны настройки свойства Источник строк (RowSource) для списка в диалоговом окне frm DialogCheckSearch. Рис. 21.3. Установка параметра поиска по умолчанию Рис. 21.4. Установка свойства Источник строк, принятого по умолчанию
Изменение элементов списка Каждый раз, когда пользователь выбирает другой параметр поиска, содер- жимое списка должно изменяться. Чтобы изменить содержимое списка, исполь- зуется событие После обновления (AfterUpdate) для группы переключателей. На рис. 21.5 показано событие После обновления для группы переключателей Type of Search. Рис, 21.5. Изменение содержимого списка В событие Type _Of_Search_ AfterUpdate включает оператор Case, исполь- зуемый для определения выбранного пользователем параметра. Каждая ветка оператора Case содержит одинаковые операторы, которые задают разные значе- ния в зависимости от выбранного типа поиска. Перед Case используется следующий оператор: [By Search Type] .RowSource = " ” . Это один из самых важных приемов, на который вам следует обратить внимание в этом уроке. Данный оператор устанавливает свойство Источник строк (RowSource) для поля со списком на Null. Это действие является обя- зательным: если источник строки будет иметь корректное значение, соответ- ствующее настоящей строке, при каждом изменении других свойств (ColumnCount, ColumnWidth, BoundColumn и др.) будет постоянно повторяться за- прос по источнику данных. Если в поле со списком содержится 100000 записей, вре-
мя ожидания увеличится: поле со списком должно будет четыре раза получить дан- ные — первый.раз, когда устанавливается Источник строк (RowSource), и еще три раза, когда устанавливаются три других свойства. Первый оператор в каждой ветке оператора Case изменяет активную страни- цу в элементе управления вкладки для формы frm_CheckWriter. Страница вкладки в форме f rm__CheckWriter должна соответствовать типу поиска, вы- бранному пользователем в диалоговом окне. Например, если пользователь решил выполнить поиск депозита по его дате, в форме Check Writer необходимо перейти на вкладку Deposits. Второй оператор задает заголовок для списка в диалоговом окне поиска. В за- головке отображаются инструкции, соответствующие выбранному типу поиска. Например, при выборе параметра Deposits By Deposit Date в списке будет пред- ставлен заголовок Select the Deposit to Search For (выберите депозит для поиска). В следующих трех строках программы устанавливаются свойства столбцов списка. ColumnCount Columnwidths BoundColumn Количество столбцов в списке Ширина столбцов Столбец, содержащий ключевое поле (TransID) Обратите внимание на следующее: свойство Ширина столбцов (ColumnWidth) для последнего столбца (TransID) в каждом операторе Case равно 0, что скры- вает столбец в списке. Кроме того, последний столбец в каждом операторе Case — связанный, и, хотя он и не отображается, его значение можно получить с помощью свойства Присоединенный столбец (BoundColumn). Последний оператор в каждом операторе Case задает свойство Источник строк (RowSource) для списка. В нем используется оператор SQF SEFECT, кото- рый получает значения для отображения в столбцах списка, а также определяет порядок сортировки строк списка. Подробнее о создании операторов SQL см. урок 9. Осталось 10 минут Поиск выбранной записи Когда пользователь выбирает запись в списке элементов, представленном в диалого- вом окне юиска, и щелкает на кнопке ОК, в форме ввода данных отображается вы- бранная им запись. Программа для кнопки ОК использует свойство Присоединенный столбец (BoundColumn) для списка, чтобы найти запись в источнике записей формы ввода данных. Профессиональные программисты используют для поиска записи два метода. Установите курсор в ключевом поле вызывающей формы и используйте метод FindRecord. Примените метод RecordsetClone и свойство Bookmark для поиска записи. Метод FindRecord может быть использован только в том случае, если в Re- cordSource для формы применяется ключ из одного поля, и форма включает элемент управления, связанный с ключевым полем. Конечно, всегда можно до- бавить в форму скрытое поле или использовать ключ путем конкатенации, но чаще всего данный метод применяется только для ключей из одного поля.
Поиск по индексированному полю обеспечивает значительно большую эффектив- ность, чем поиск по неиндексированному полю. В последнем случае Access необ- ходимо использовать медленный последовательный поиск от первой до последней записи в таблице. На рис. 21.6 показана процедура события OK Click для диалогового окна frm DialogCheckSearch. Сначала выполняется проверка, что пользователь вы- брал элемент в списке. Если ни одна запись списка не выбрана, значение списка равно Null. Для поиска записи необходимо всего четыре оператора: во-первых, выбрать вызывающую форму с помощью команды Select Object. Затем курсор следует поместить на ключевом поле (TransID), воспользовавшись методом Set- Focus. После этого примените команду FindRecord, которая установит указа- тель записей на требуемую запись. Диалоговое окно поиска будет закрыто. Рис, 21.6. Использование метода FindRecord для поиска записи Открытие диалогового окна поиска из формы Можно добавить в форму ввода данных командную кнопку, которая будет от- крывать диалоговое окно, используемое для поиска данных. На рис. 21.7 пока- зана командная кнопка Search для формы frm_CheckWriter. Командная кнопка Search в форме frm_CheckWriter применяете процедуру со- бытия Нажатие кнопки (OnClick) для открытия диалогового окна поиска. Процеду-
pa Search_OnClick, которая открывает диалоговое окно frm_DialogCheckSearch, довольно проста. DoCmd.OpenForm ” frm_DialogCheckSearch” РиС. 21.7.Использование кнопки, которая открывает диалоговое окно поиска Готова! Обзор Диалоговые окна поиска предоставляют пользователям гибкие возможности для поиска записей в базе данных. В каждой форме приложения должно содержаться собственное диалоговое окно поиска, с собственным набором критериев для по- иска. В данном уроке рассматривались следующие вопросы. • Диалоговые окна предоставляют простой и удобный способ перемещения от одной области приложения к другой. • В диалоговых окнах обычно отсутствуют источники записей. • При работе с модальными диалоговыми окнами пользователь должен вы- полнить все действия в диалоговом окне, прежде чем сможет работать с другими окнами. • Свойство Источник строк (RowSource) для списка определяет элементы, которые отображаются в списке. • Метод FindRecord используется для отображения в форме ввода данных той записи, которую пользователь выбрал в диалоговом окне поиска. • Чтобы открыть окно поиска для формы ввода данных, используйте ко- мандную кнопку.
Проверьте себя 1. Какое свойство устанавливает, что диалоговое окно должно отображаться поверх всех остальных форм? (См. раздел "Основные характеристики диалоговых окон”.) 2. Какое свойство диалогового окна указывает на то, что пользователь для перехода к работе с другими окнами должен либо выбрать параметры в диалоговом окне, ли- бо закрыть его? (См. раздел "Основные характеристики диалоговых окон”.) 3. Назовите три типа элементов управления, которые чаще всего используются в диалоговых окнах. (См. раздел "Создание диалоговых окон поиска”.) 4. Какой оператор обязателен при создании процедур событий, изменяющих свойство Источник строк (RowSource) для списка или поля со списком? (См. раздел "Изменение элементов списка”.) 5. Какое свойство (и значение свойства) могут сделать столбец списка невиди- мым? (См. раздел "Изменение элементов списка”.) 6. Назовите два метода, которые используются в программе для поиска в источ- нике записей формы. (См. раздел "Поиск выбранной записи”.) 7. Какое событие командной кнопки применяется для открытия диалогового окна поиска? (См. раздел "Открытие диалогового окна поиска из формы”.)
УРОК Программирование диалоговых окон и отчетов, работа с элементами управления ActiveX Содержание урока * Проектирование диалогового окна печати / Программирование отчетов , ✓ Работа с элементом управления ActiveX Calendar Осталось 30 минут Действительно формы для ввода и отображения данных — очень важный инстру- мент обработки данных в любом приложении. Однако не менее важны диалоговые окна, которые используются для обработки параметров выбора (перемещения по меню), поиска, печати и другой информации, не зависящей от типа данных. И формы ввода данных, и диалоговые окна представляют собой формы, поэтому они имеют довольно много подобных элементов управления, а также обладают об- щими свойствами. Как показано в этом уроке, хорошо спроектированные диалого- вые окна могут сделать систему более функциональной и значительно повысить эффективность работы пользователей с приложением. В данном уроке рассматри- вается также программирование отчетов с использованием (и без него) диалогового окна печати, которое значительно расширяет функциональные возможности при- ложения. Применив программирование отчетов, можно получить контроль как над внешним видом приложения, так и надданными.
Наконец, с помощью элементов управления ActiveX в базе данных можно бы- стро усовершенствовать продукт. Элементы управления ActiveX — самодоста- точные функциональные объекты, которые запускается буквально сразу же ис- пользовать в формах и отчетах. Реализацию элементов управления ActiveX в Ac- cess мы проиллюстрируем на примере элемента управления Calendar. ) Элементы проектирования диалогового окна Диалоговые окна созданы на базе форм, однако, как правило, не используют связанные формы. Это означает, что диалоговые окна не имеют источника данных (например, в них не включены таблица или запрос). Диалоговое окно отображается либо без предопределенных параметров, либо с параметрами, заданными по умол- чанию, которые пользователь может изменить. В некоторых диалоговых окнах (которые называют "умными") сохраняется последний набор параметров, выбран- ный пользователем, а также таблица для них. Такую возможность можно запро- граммировать в событии Открытие (ОпОреп) для формы либо реализовать через связанный выбор. Такая возможность зависит от модели данных. Отметим, что диалоговые окна обладают специальными свойствами, отличными от свойств форм ввода данных. Подробнее см. в уроке 21. Создание и использование диалоговых окон печати Диалоговые окна печати позволяют определить, какие отчеты и как выводят- ся на печать. Несмотря на то, что в Microsoft Access включена кнопка для вывода на печать содержимого листов данных, форм и отчетов, а также предлагаются другие эффективные инструменты для создания отчетов, среднестатистический пользователь тратит слишком много времени на обработку источников данных для отчета и вывода на печать желаемых данных. При создании отчета с использованием Microsoft Access вы создаете только шаблон, через который проходят данные. Объект отчета предоставляет все воз- можности вычислений и форматирования, обеспечивающие хороший внешний вид отчета; однако точность отчета определяется именно данными, которые пе- редаются в отчет. Каждый отчет обладает единственным источником данных, которым может быть таблица, запрос или оператор SQL. При Использовании запроса вы вправе обратиться к оптимизированному оператору SQL. Отметим, что при этом реали- зуется возможность взаимодействия между запросом, отчетом и понятным для пользователя диалоговым окном. Вы просто выполняете отчет, а диалоговое окно и запрос работают вместе и передают необходимые данные в отчет. Простое диа- логовое окно отчета представлено на рис. 22.1, а более сложная форма отчета — на рис. 22.2. Как видно из рисунка, в формы включено лишь несколько элементов управ- ления. В форме расположены две группы переключателей. Первая предназначе- на для выбора типа бланка чека, на который выводится отчет, а вторая — для оп- ределения записей, выводимых на печать. Два текстовых поля позволяют поль- зователю вводить (по желанию) заголовки, которые будут включены в отчет. Наконец, поля From Date и То Date используются в запросе и включают в отчет только записи, в которых дата последнего перевода (поле Last Purchase Date) по- падает в диапазон между датами From Date и То Date.
Рис, 22,1, Форма frm_DialogBankPrint— упрощенное диалоговое окно отчета Рис, 22,2, Форма frm^Di a logCheckPrint— более сложное диалоговое окно отчета Отображение диалогового окна печати Можно добавить командную кнопку на главной форме или использовать дру- гой метод открытия диалогового окна, который будет применяться для вывода данных на печать. Например, на рис. 22.2 в разделе формы Check Туре содержит- ся кнопка Print. Программа, которая открывает форму frm_ Dialog Bank Print, очень проста. В событии Нажатие кнопки (OnClick) кнопки Print главной формы Check Writer находится следующая команда. DoCmd.OpenForm "frm_DialogBankPrint" Разработка диалогового окна печати Пример, используемый для иллюстрации диалогового окна печати, очень прост. Основные приемы, продемонстрированные в этом примере, — это реали- зация взаимодействия между диалоговым окном и отчетом, а также фильтрация данных для отчетов. Первый шаг — создание формы и использование желаемых параметров диалого- вого окна. Возвратившись к рис. 22.1, вы увидите, что форма frmJDialogBankPrint содержит две группы переключателей, несколько несвязанных текстовых полей, две командные кнопки и соответствующие надписи. Переключатели используются исключительно для хранения параметров, ко- торые выбрал пользователь для вывода на печать: тип записей (только текущая запись, все записи, список) и назначение (предварительный просмотр, печать). Кнопка Print содержит процедуру использования этих значений. Значения в по- лях First Title и Second Title применяются для взаимодействия с отчетом, кото- рый, в свою очередь, влияет на источник записей отчета. Взаимодействие запросов с диалоговыми окнами печати Форма frmJDialogBankPrint — простой пример диалоговой формы для вывода данных на печать. Более сложный пример — форма frmJDialogCheckPrint (см. рис. 22.2). В этом диалоговом окне на печать выводятся разные записи, в зависи- мости от выбора пользователя. В представленном ниже фрагменте используется ме- тод openReport, одним из его аргументов является оператор SQL WHERE, который ог- раничивает диапазон данных, выводимых на печать. Например, здесь фильтруются
Осталось 20 минут записи, значение поля CheckDate для которых находится в диапазоне от FromDate до ToDate (эти параметры были введены в форме frm_pialogCheckPrint). Следую- щий фрагмент кода взят из события Нажатие кнопки (OnClick) кнопки ОК: DoCmd. OpenReport RptName, acNormal, ,_ 11 [Account Number] =Forms! [Check Writer] " _ ! [Bank Account] And [TransType] = & TxnSel & w 1 AND_ [Check Date] >= _ Forms’ [frm_DialogCheckPrint] ! [From Date] And [Check Date] <= Forms! [f rm__DialogCheckPrint] ! [To Date] " Когда выполняется отчет и используются эти критерии, то отчет получает значения, введенные в диалоговой форме печати, и использует их для выбора за- писей. Во многих приложениях пользователь должен открыть запрос и ввести значения, которые он будет использовать. В других приложениях применяются параметрические запросы, которые появляются во время запуска запроса. В профессиональных приложениях данные приемы не применимы. Необходимо позволить пользователю самому управлять приложением из интерфейса, а не за- давать его поведение из среды программирования. Обеспечьте пользователю мак- симальные возможности управления. В качестве альтернативы можно открыть отчет, а затем задать свойство Re- cordSource данного отчета. Такого результата можно достичь с помощью мето- да OpenReport. Например, если вы хотите запустить отчет BankAccount и вклю- чить в него только операции по чекам, используйте приведенную ниже строку кода. Она следует за методом OpenReport и устанавливает источник записей с помощью строки SQL. Reports![Rpt_BankAccounts].Recordsource = "SELECT * FROM [tbl_BankAccounts] WHERE [Type] = ’Checking'" В этой строке кода в качестве источника записей используется строка SQL, и отчет получает инструкцию, что на печать должны быть выведены только за- писи, для которых тип счета равен ' Checking'. Кроме того, можно задать в источнике записей название таблицы или запроса. Reports![Rpt_J3ankAccounts].Recordsource = tbl^BankAccounts Несмотря на то, что аргумент критерии метода OpenReport использовать удоб- нее, существуют некоторые причины для установки набора записей отчета в программе. Возможно, вам понадобится вывести на печать сложный отчет, кото- рый выполняет большое количество вычислений и включает такие сложные запро- сы, как, например, запрос Union. Еораздо проще создать запрос и определить его так, чтобы он ссылался на элементы управления в диалоговом окне печати, чем строить в программе строку SQL, которая будет использоваться в качестве крите- рия в методе OpenReport. Советуем задать запрос и настроить его программно. Вывод отчетов на печать из диалогового окна Отчет выводится на печать только после того, как программа скроет модальное диалоговое окно печати. Таким образом, если отчет печатается в режиме предва- рительного просмотра (Print Preview в группе переключателей на форме), окно предварительного просмотра не будет скрыто под модальным диалоговым окном печати. При выводе на печать проверяется значение в группе переключателей Print Destination. Переменная Report Dest получает значение ас Preview, если выбран параметр Print Preview, и acNormal — если выбран параметр Print. Наконец, для вывода отчета на печать используется метод OpenReport. В форме frm__EialogBankPiint для выбора второго параметра печати применя-
ется переменная ReportDest, кроме того, в отчет передается фильтр, если выво- дится на печать только текущая запись (используется текущее поле Bank Account). В форме frm DialogCheckPrint метод OpenReport не использует пе- ременную для типа печати, так как вся печать выполняется непосредственно на принтер (а печать с предварительным просмотром не предусмотрена). И /ft Помните, что созданный фильтр отчета и критерии запроса не являются взаимоис- ЛёЁЯ ключающими. Если вы выберете только текущую запись, а дата последнего чека ~ (Last Purchase Date) не попадает в выбранный в диалоговом окне диапазон, в отчете записи будут отсутствовать. Взаимодействие отчетов с диалоговыми формами печати Диалоговые формы печати и отчеты могут взаимодействовать разными спосо- бами. Посредством обращения к элементам управления в диалоговом окне отчет может отображать информацию, которую вводит пользователь, или информа- цию, заданную в программе. Например, в форме frm__DialogBankPrint два текстовых поля используют- ся для того, чтобы пользователь мог по желанию ввести заголовки отчета. В отче- те, приведенном на рис. 22.3, для вывода отчета на печать были применены поля First Title и Second Title из формы frmJDialogBankPrint. Заголовки отчета — это просто текстовые поля с вычислениями, которые используют значения из диало- говой формы. Если вы посмотрите на источник элемента управления для данных двух заголовков, то увидите, что источником для них являются элементы управ- ления с диалогового окна печати. Источник элемента управления для этих двух элементов отчета устанавливается следующим образом. =[Forms] * [frm_DialogBankPrint]’[First Title] =[Forms]![frmJDialogBankPrint]![Second Title] Простой, но очень эффективный прием! BANK ACCOUNT LISTING Arst optional title - Print Current BankAccount Second optional title - Printed on 04-15-03 Account Number Type Bank Name ДВД Number City 112233 Checking SBM 112233 । 123 456 555 Checking Bank of International 344 23433 Birmingham 12345678 Checking SBM 2004986 man ch ester 233 42 89Б4 Savings Mechanics of Boston 1552427717 Boston ! <1 ? Й — W ШI i й д ? Puc. 22.3. Отчет грь_ВапкАссоипЬвключает два дополнительных поля заголовков, которые ссылаются на текстовые поля в диалоговой форме печати
Данный пример предельно упрощен, однако представленный прием не огра- ничивается только простыми случаями. Можно ссылаться на значения из форм в отчетах, запросах, модулях и даже в других формах. Существует возможность запросить необходимую информацию у пользователя, а также задать видимые или невидимые элементы управления с информацией, извлеченной из таблицы исходных параметров. Задайте элементы управления в открытой форме и после этого обращайтесь к ним из отчета. Необходимо только помнить: чтобы ссылать- ся на элементы управления, они должны находиться в открытой форме. Следова- тельно, иногда лучше скрыть форму (задав Visible = False). Тогда она оста- нется открытой, но не будет видимой для пользователя. Затем можно обратиться из отчета к элементам управления в этой форме. Такой прием очень прост в при- менении, его главное достоинство состоит в том, что он позволяет без особого тру- да получить необходимую информацию. Программирование отчетов Итак, вы уже ознакомились с некоторыми приемами, используемыми для создания отчетов в программе. Вы теперь знаете, как изменить записи, которые отображаются в отчете, а также разместить на самом отчете информацию, полу- ченную из формы. Access предоставляет довольно мощный инструмент создания отчетов. Вы уже создавали отчеты, но, вероятно, еще не умеете использовать со- бытия, которые существуют в отчетах, и не знает, как задавать их программно. Некоторые функции и свойства отчетов можно запрограммировать, что позволит увеличить функциональные возможности приложения. Разделы отчетов Чтобы разобраться в вопросе программирования отчетов, необходимо пони- мать, что представляют собой разделы отчета и как они взаимодействуют с отче- том и между собой. В любом отчете присутствуют следующие разделы: верхний и нижний колонтитулы отчета, верхний и нижний колонтитулы страницы, раз- дел деталей. Access позволяет, помимо стандартных разделов отчета, создавать и другие разделы, которые можно установить в листе свойств Grouping and Sorting. Ниже описаны стандартные разделы отчета. • Разделы верхнего и нижнего колонтитулов отчета (Report Header и Report Footer). Выводятся на печать в начале и конце отчета, соответственно. Верх- ний колонтитул отчета располагается перед верхним колонтитулом страницы. Этот раздел можно использовать для отображения логотипа или другой ин- формации компании либо как титульную страницу отчета. Нижний колонти- тул отчета — его последний раздел; однако на последней странице отчета он выводится перед нижним колонтитулом страницы. Данный раздел можно ис- пользовать для отображения суммарных показателей по отчету. Разделы верхнего и нижнего колонтитулов страницы (Page Header и Page Footer). Отображаются в верхней и нижней части каждой страницы. Верх- ний колонтитул страницы отображается после верхнего колонтитула отчета на первой странице и размещается на каждой следующей странице отчета. Данный раздел идеально подходит для предоставления заголовков столбцов, номеров страниц или другой подобной информации. Нижний колонтитул страницы отображается внизу каждой страницы отчета, и в этом разделе можно задать вычисляемые поля, отображающие суммарные показатели или номера страницы.
• Область данных (Details). В ней представлена основная часть информации отчета. Данный раздел присутствует на каждой странице, он повторяется для каждой записи. В зависимости от того, как заданы дополнительные разделы, они отобража- ются до или после раздела деталей. Эти разделы содержат и группируют записи, требующие отображения. События разделов Каждый раздел содержит характерные события, в которых можно выполнять определенный код. Ниже перечислены события, присутствующие в каждом раз- деле любого отчета. • Форматирование (On Format). Позволяет задать макрос или процедуру события для раздела. Access выполняет макрос или процедуру при форма- тировании данного раздела. • Печать (On Print). Макрос или процедура, присвоенные событию Печать какого-либо раздела, выполняются, когда Access приступает к печати раз- дела или отображает его в режиме предварительного просмотра. • Возврат (On Retreat). Макрос или процедура события выполняются после того, как Access обработает событие Форматирование, и до того, как будет обработано событие Печать. Это событие выполняется только в том слу- чае, когда программа Access должна перейти к предыдущей странице, ес- ли один из разделов не помещается на страницу и важно при использова- нии параметра Keep Together (не разделять на разные страницы). Код про- цедуры события будет обработан во время перемещения назад. После этого события снова выполняется событие Форматирование. События отчетов Каждый отчет, созданный в Access, имеет события, которые могут содержать демшут код. Эти событияцелают выполнение отчетов единым целым. • Открытие (On Open). Макрос или код VBA, который используется в Access при выполнении отчета в режиме печати (Print) или предварительного про- смотра (Preview). Это событие предшествует всем остальным событиям. Здесь можно помещать программу, которая открывает или скрывает от- крытые формы или другие открытые отчеты, а также программно устано- вить элементы управления в отчете. • Закрытие (On Close). Макрос или код, который выполняется при закры- тии отчета. Это событие сработает также при выходе из окна предвари- тельного просмотра, если вы щелкните на кнопке Close. В данном событии можно поместить код, который отображает скрытые формы или отчеты или обновляет записи. Например, здесь может находиться программа, от- мечающая записи как выведенные на печать. Код данного события выпол- няется, когда пользователь закрывает отчет. • Включение (On Activate). Событие, происходящее в тот момент, когда элемент управления получает фокус в режиме предварительного просмотра. Вы може- те написать в этом событии программу, которая будет отображать специальное меню для пользователя в течение всего сеанса предварительного просмотра. • Отключение (On Deactivate). Событие, срабатывающее, когда отчет в ре- жиме предварительного просмотра становится неактивным. Здесь можно
отключить дополнительные меню или панели инструментов, доступные в режиме предварительного просмотра. • Отсутствие данных (On No Data). Событие, срабатывающее в том случае, когда источник записей отчета не содержит данных. Здесь можно помес- тить код, который будет отображать уведомление об отсутствии данных и закрывать отчет. • Страница (On Page). Макрос или процедура, которая выполняется после выполнения события Форматирование (On Format) для раздела, но перед выводом раздела на печать. • Ошибка (On Error). Событие, которое можно использовать для ввода мак- роса или кода VBA, отображающего соответствующие сообщения в ответ на происходящие при выполнении отчета ошибки. Когда вы научитесь программировать отчет, несложно будет увеличить его эффективность и расширить возможности. Пример программной обработки отче- та Check Register (регистр чеков) приведен на рис. 22.4. Обратите внимание, что в отчете rpt CheckRegister содержится несколько контролируемых програм- мой элементов, например, два вспомогательных заголовка и полосатая раскраска строк данных. CHECK REGISTER Enter Your Name In Setup Mechanic* of Boston Account Number 233 42 8964 Puc. 22.4. Отчет rpt Check Register иллюстрирует возможности программирования отчета, которые позволяют задать довольно сложные визуальные эффекты В отчете Check Register используется несколько событий. При его запуске при- меняется специальный чередующийся цвет фона для строк данных. Для этого в программе устанавливается цвет фона для текстовых полей отчета. (Под самим элементом управления был дополнительно нарисован флажок.) Первая строка кода этого отчета находится в событии Форматирование (On Format) верхнего колонти- тула страницы и задает скрытое поле backgroundsettting, используемое для указания того, каким должен быть цвет фона строки: белым (0) или серым (-1).
Вместо использования для хранения значения поле, можно объявить глобальную переменную отчета. Но в данном примере применяется текстовое поле. Вы имеете возможность включить его свойство Вывод на экран (Visible) и посмотреть, как значение текстового поля при форматировании и выводе отчета на печать из- меняется с -1 на 0. Программа, переключающая цвет фона с белого на серый, обрабатывается в событии раздела Область данных. Данная программа помещена именно в этом разделе, поскольку она влияет на основную информацию отчета. В событии ис- пользуется следующий код. Dim х As Integer ' Используется для пересчета столбцов If Me .backgroundsetting = 0 Then For x = 1 To 9 Step 1 Me (“column11 & x) .BackColor = 16777215 Next x Else For X = 1 To 9 Step 1 Me("column" & x) .BackColor = 12632256 Next x End If Me.backgroungsetting = Abs(Me.backgroundsetting) + (-1) Программа работает следующим образом: сначала она объявляет перемен- ную, которая используется в циклах For. . .Next, Затем проверяет текущее со- стояние текстового поля backgroundsettting. Если его значение равно О, про- грамма проходит цикл по каждому из девяти элементов управления и задает для них цвет фона 16777215, т.е. белый. Если значение поля — не 0 (а -1), цвет фона устанавливается равным 12632256, светло-серым. В последней строке кода применен довольно привлекательный прием. По- скольку значения поля могут быть только -1 (True) или О (False), программа к модулю текущего значения прибавляет-1. Таким образом, знание математики поможет избавиться от необходимости задавать значение дважды: один раз для случая, когда поле равно 0, и еще один раз — когда -1. Программа объявляет переменную х, используемую как счетчик столбцов. Если вы посмотрите на свойства каждого текстового поля, то увидите их назва- ния — columnl, column2, columns и т.д., которые способны сэкономить время программиста. Вместо создания определенного количества строк кода, в которых должно устанавливаться значение каждого элемента управления по отдельности, можно использовать цикл. Это прекрасный прием, когда в программе требуется обработать много элементов управления. Вы не ограничены в программе только поверхностными изменениями отчета. Можно выполнять вычисления или обрабатывать данные в программе, а не на уровне запроса или отчета. Например, чтобы вычислить динамическую сумму при отображении каждой операции, задайте в программе переменную и прибав- ляйте к ней (в событии Форматирование (On Format) раздела Область данных) сумму по каждой операции. В отчете гр tChec k Register данную задачу можно выполнить следующим образом. Объявляется переменная Public под именем runningbalance. Затем в событии Форматирование верхнего колонтитула отче- та ее значение устанавливается равным нулю. Программа будет помещена в этом событии, поскольку значение должно сохраняться во всех страницах отчета. Ес- ли установить его в событии Форматирование для верхнего колонтитула страни- цы, оно будет переустанавливаться каждый раз, когда начинается новая страни- ца отчета. В конце листинга находится такая строка кода.
runningbalance — runningbalance + Nz([DepositAmount]) - Nz ( [PaymentAmount] ) Конечно, пример очень прост. Необходимое действие можно выполнить и без программы, используя свойство RunningSum. Мы хотим подчеркнуть, что для вычислений и обработки данных можно использовать не только запросы; Зачас- тую, чтобы создать отчет, который будет быстро обработан и напечатан, следует выполнить вычисления именно в программе. В предыдущих примерах внимание было сосредоточено на событии Форматирование (On Format). В каких же случаях используется событие Печать (On Print)? Его применяют, например, для проверки, выводился ли данный отчет на печать. Откройте набор записей, перейдите на запись, которая печатается в данный момент, и установите поле Printed равным True. Например, в приме- ре отчета код в событии Печать раздела Область данных открывает набор записей и находит операции по ее идентификатору. Когда запись будет найдена, она от- мечается как выведенная на печать (Printed). Использование элемента управления ActiveX Calendar Access предоставляет готовый встроенный элемент управления ActiveX Cal- endar, который можно применять в любой форме. Как показано на рис. 22.5, элемент управления Calendar отображает календарь на месяц. Если вы щелкне- те на каком-либо дне месяца, квадрат для этого дня становится "утопленным". Настроить вид данного элемента управления можно, используя его свойства. Рис. 22.5. Элемент управления ActiveX Calendar отобра- жает календарь на месяц На рис. 22..6 показано диалоговое окно Calendar Properties, которое позволяет изменять отображение компонентов даты в календаре. На вкладке General (Общие) можно изменить представление месяцев — задать сокращенный формат (Jan, Feb, Маг и т.д.) или полный формат (January, February и т.д.), а также дней недели (Monday, Tuesday, Wednesday и т.д.). Флажки в правой части диалогового окна Properties позволяют включить или отключить отображение других компо- нентов календаря. На вкладках Font (Шрифт) и Color (П,вет) можно изменить
шрифт и цвет каждого компонента в календаре. События данного элемента управления позволяют получать дату, выбранную пользователем. Рис. 22.6. Конфигурация внешнего вида элемента управления ActiveX Calendar Несмотря на то, что этот элемент управления несложно добавить в любую форму, он предоставляет немного программируемых возможностей. Кроме того, он не устанавливается автоматически вместе с Access. Поэтому при передаче приложения конечным пользователям необходимо также передавать и регистри- ровать файлы, необходимые для работы с календарем. Обзор В этом уроке вы ознакомились с элементами проектирования диалогового окна и Готово! рассмотрели пример проектирования диалогового окна печати. Кроме того, вы научились использовать программирование для создания отчетов и узнали, как применяется элемент управления ActiveX Calendar. В данном уроке были рас- смотрены такие возможности. • Создание мощных диалоговых окон, предоставляющих пользователям широкие возможности поиска данных. • Проектирование и программирование диалоговых окон печати, которые ограничивают либо расширяют возможности конечного пользователя. • Многие приемы, изученные в предыдущих уроках, можно в сочетании с различными событиями отчетов использовать для программирования более функциональных отчетов. • При программировании отчетов можно выполнить два типа действий: на- строить внешний вид отчета и обработать данные. Использование про- граммы для установки параметров внешнего вида позволяет сделать отчет более динамичным и расширить его возможности, • Вы можете скрывать и отображать элементы управления в соответствии со значениями параметров или содержимым определенных полей. • Существует возможность выполнять вычисления или извлекать данные из другого источника, а не только из источника записей отчета. В результате
обеспечиваются более широкие возможности для проектирования отчетов, поскольку вы не ограничены отображением только тех данных, которые содержатся в источнике записей, установленном для отчета. • Для расширения функций продукта в нем могут использоваться готовые элементы управления AcitveX. Проверьте себя 1. Какими основными характеристиками обладает диалоговое окно? (См. раздел "Элементы проектирования диалогового окна”.) 2. Какое значение имеют свойства Модальное окно (Modal) и Всплывающее окно (Popup)? (См. раздел "Элементы проектирования диалогового окна”.) 3. Какие элементы управления должны присутствовать в диалоговом окне печа- ти? (См. раздел "Разработка диалогового окна печати”.) 4. Какую команду проще всего использовать для выполнения отчета из диалого- вого окна печати через программу VBA? (См. раздел "Вывод отчетов на печать из диалогового окна”.) 5. Из каких основных частей состоит отчет? Какие события срабатывают для этих разделов отчета? (См. раздел "Программирование отчетов”.) 6. Какое событие следует использовать для установки сообщения, отображаемо- го при возникновении ошибки? (См. раздел "Программирование отчетов”.)
УРОК Архитектура приложения Осталось 30 минут Содержание урока * Понятие архитектуры приложения для готового приложения ✓ Структурирование программы VBA и осуществление компиляции у Использование конфигурации файла программы I Данный урок посвящен структурированию приложения и добавлению в прило- жение необходимых стандартных функций. Предположим, вы уже создали таблицы, формы, отчеты и прочие элементы, составляющие приложение, а также включили дополнительные элементы, реа- лизующие общие функции программы. Эти элементы присутствуют в любом профессиональном программном обеспечении. Основные из них были рассмотре- ны в предыдущих уроках. Далее будет изложена информация о структуре, необ- ходимой для любого приложения. Элементы, необходимые в приложении Помимо специальных и уникальных функций, приложение должно содер- жать следующие функциональные возможности. • Стартовые формы и информационные окна About (см. урок 19). • Кнопочные формы или системы меню (см. урок 11). • Систему защиты данных (см. урок 28). • Процедуры обработки ошибок (см. урок 16). • Справочную систему (см. урок 20). • Систему поддержки.
с Все эти элементы, за исключением поддержки, рассматриваются в данной книге. Система поддержки должна включать одну или более функций из сле- дующего списка. • Техническая поддержка. • Управление индивидуальными параметрами. • Архивация. • Создание резервных копий. • Восстановление файлов базданных. • Сжатие баз данных. • Системная информация. Окно технической поддержки В дополнительной форме, которая обычно отображается из окна About или раскрывающегося меню справки, попавшие в тупик пользователи смогут найти координаты службы технической поддержки, которая поможет решить им свои проблемы. Укажите в окне технической поддержки телефонные номера, номера факсов, адреса электронной почты и/или Web-сайты, где пользователи могут по- лучить техническую поддержку. Управление индивидуальными параметрами В данном случае под индивидуальными параметрами (preferences) подразу- меваются не только предпочтения пользователя, но и информация о приложе- нии, пользователе, организации и т.д. Вы можете ввести эту информацию жест- ко, в момент разработки приложения, однако в таком случае приложение не бу- дет гибким, легким в работе, и пользователь не сможет, работая с продуктом, легко задавать свои настройки. Как правило, система индивидуальных параметров разрабатывается во время проектирования приложения. Возможно, вы не позволите пользователям кон- тролировать системные параметры (например, версию или авторские права), но сможете предоставить им возможность выбирать способ работы приложения. Так, каждый пользователь может задать для себя способ поиска данных или ис- пользовать собственные параметры по умолчанию. Индивидуальные параметры могут принадлежать к одной из трех групп. Системные. • Настройки по умолчанию. • Настройки пользователя. Системные настройки — это параметры, которые существуют в единствен- ном экземпляре и одинаковы для всех пользователей. В этой категории находят- ся такие параметры, как информация о лицензиях, параметры защиты данных, стартовые параметры и т.д. Параметры по умолчанию, в отличие от системных настроек, могут быть разными для разных пользователей. Если для конкретного пользователя не был установлен специальный набор параметров, то используют- ся настройки по умолчанию. Возможно, некоторые файлы в приложении разме- щаются в зависимости от пользователя, который определяет цвет формы, заголо- вок отчета и т.д. Подобно тому, как пользователи работают со специальными па- раметрами защиты данных, с помощью индивидуальных настроек они могут управлять способом работы приложения.
Индивидуальные настройки обычно хранятся в отдельной таблице либо ло- кально на компьютере клиента, либо на сервере, либо с использованием обоих вариантов. Существует две различные схемы для обработки индивидуальных па- раметров: метод одной записи и метод нескольких записей. В методе одной запи- си для каждого параметра создается свое поле, и в таблице, таким образом, раз- мещается всего одна запись. В принципе, можно использовать отдельную запись для отдельного пользователя, если поддерживаются индивидуальные настройки для каждого пользователя. В методе нескольких записей запись соответствует индивидуальному параметру. Этот метод имеет одно преимущество: отпадает необходимость в изменении схемы таблицы при добавлении еще одного параметра. Недостаток же заключается в том, что каждое значение параметра хранится как текстовое, а не как значение опреде- ленного типа (как в поле). В большинстве случаев это вполне приемлемо, но если не- обходимо сохранить индивидуальные настройки как числовое значение, значение да- ты/времени, объект OLE или другой тип, лучше использовать метод одной записи. В приложении Check Writer предложена таблица настроек, приведенная на рис. 23.1. Это пример метода одной записи. На рис. 23.2 те же настройки ото- бражаются в виде листа данных с использованием метода нескольких записей. Рис. 23.1. Представление Конструктор (Design) для таблицы индивидуаль- ных настроек; использован метод одной записи Вы можете использовать данные в таблицах непосредственно из программы или с помощью функций, подобно тому, как вы получаете обычные табличные данные. Рекомендуется применять функцию, которая получает значения индивидуальных настроек. Таким образом, вы сможете легко обращаться к значениям в формах, отче- тах и в программе. В приложении чековой книжки модуль под названием Prefer- ence Functions содержит две функции — GetPref и SetPref, Они могут использо- ваться для получения и установки значений индивидуальных настроек из таблицы настроек. Листинг данных функций представлен в разделе "Условная компиляция", далее в этой главе. Условные константы компилятора применяются дия обработки двух различных типов таблиц из одной и той же базы кода.
Рис. 23.2. Представление Лист данных (Datasheet) для таблицы индивиду- альных настроек; применен метод нескольких записей Для использования функции Get Pref требуется только передать ей название необходимого параметра. Функция возвращает значение этого параметра типа Variant (так как тип параметров может отличаться). Если происходит ошибка или если указанный параметр не существует, возвращается значение Null. При- ведем пример вызова функции Get Pref. StrCompanyName = dbc_GetPref("Company Name") Использовать функцию SetPref более сложно. Во-первых, если параметр существует, его значение заменяется новым. Если параметр отсутствует, то он добавляется в таблицу настроек. Если не произойдет ошибок, то функция воз- вратит значение True, указывающее, что параметр был успешно установлен. Функция SetPref имеет следующие аргументы. • Название параметра (тип String). • Значение параметра (rnnVariant). • Тип данных ADO, который применяется только для создания нового пара- метра (по умолчанию используется значение adWChar). • Размер поля (по умолчанию используется 255). Третий и четвертый аргументы применяются только в методе одной записи. Приведем пример вызова данной функции: BlnSnccess dbc_Se t Pref ("Report Header”, ’’The Acme Corporation", adWChar, 100) Архивация Архивация — это процесс перемещения записей данных из активной базы данных в отдельную базу данных. Обычно перемещенные записи удаляются из активной базы данных, что сокращает количество записей в базе данных прило- жения. Архивация имеет следующие преимущества.
• Уменьшается размер таблиц данных, увеличивается эффективность за- грузки форм, выполнения запросов, отчетов и т.д. • Уменьшается время на загрузку форм и установку значений элементов управления. • Уменьшается количеств о элементов, из которых пользователь должен вы- бирать в списках и комбинированных списках, что также сокращает вре- мя и усилия. • Уменьшаются требования к объему памяти для хранения файла базы данных. • Сокращается время на создание резервных копий, и уменьшается размер необходимых для этого носителей. Итак, архивация обладает серьезными преимуществами, которые экономят время и средства и помогают повысить эффективность работы приложения, од- новременно сохраняя данные, которые могут понадобиться в дальнейшей работе. Создание резервных копий Если вы когда-либо иметь дело с базой данных Access, которая была поврежде- на и не подлежала восстановлению, то можете понять, насколько важно резервное копирование базы данных. Можно один раз вручную создать копию файла про- граммы, и если в него не вносятся изменения, спокойно хранить эту копию. Код в листинге 23.1 содержит функцию, которая используется для резервного копирования в приложении. Бе можно вызвать щелчком на кнопке в форме, а в качестве аргумента передать имя резервного файла. Функция проверяет, яв- ляется ли имя файла именем текущей базы данных, и в таком случае возвращает сообщение, что она не может записать копию в файл текущей базы данных. В противном случае функция создает копию файла. В этой копии содержится метка даты; файл резервной копии имеет расширение . bak. Листинг 23.1. Функция резервного копирования BackupFile Public Function dbc_BackupFile(fileBackup As String) As String Dim FileName As String On Error GoTo ErrorHandler If fileBackup = CurrentDb.Name Then dbc_BackupFile = "Невозможно записать копию в файл теку- щей базы данных." GoTo Done End If filename = dbc^GetDirPart(fileBackup) & Left(dbc_GetFileNamePart(fileBackup), _ Len (dbc__Get Fil eName Part (f ileBackup) ) - 4) & Format (Now ()) , «YYYYMMDDHHMMSS") & ” . bak 11 FileCopy fileBackupf FileName dbc_BackupFile = fileBackup & ” скопировано в ” & FileName GoTo Done ErrorHandler: dbcJBackupFile = Err.Description End Function
Восстановление Функция Repair позволяет пользователю выбрать файл MDB и восстановить его после ошибки. Иногда возникает необходимость в восстановлении файлов ба- зы данных Access. Восстановление требуется в тех случаях, когда файлы данных получают повреждения или фрагментируются. Вы не сможете восстановить файл базы данных, в которой вы работаете в данный момент. Базу данных можно вос- становить в случае, если она не используется монопольно и если связанными формами в этой базе данных не используются присоединенные таблицы. Невоз- можно восстановить базу данных, которая в данный момент используется други- ми пользователями. Окно системной информации В приложении должно находиться окно системной информации, в котором содержится информация, полезная для пользователя или для специалиста из службы технической поддержки, который пытается решить проблему приложе- ния. Системная информация в данном окне может включать следующее: теку- щую версию Access; файл инициализации для Access; название и размещение текущего файла программы .mdb; размещение программы Access; размещение присоединенных файлов данных; версию программы; текущего пользователя; системную дату и время. Данное окно информационное, оно не требует от пользователя никаких дейст- вий, кроме щелчка на кнопке ОК, чтобы закрыть форму. Обычно это окно можно вызывать из окна About или другой вспомогательной формы, чтобы разработчик имел возможность помочь пользователю решить возникающие программные проблемы. Пример окна System Information приложения Check Writer показан на рис. 23.3. Рис. 23.3. Окно System Information Программа для этой формы представлена в листинге 23.2. Все действия проис- ходят в событии Form_Load. Листинг делится на три части: информация Access, информация приложения и информация текущего сеанса. Информацию Access программа получает с помощью функции SysCmd. Информация о приложении получена из объекта Currentproject и из таблицы MsysObjects. Таблица
MsysObjects используется для определения количества присоединенных таблиц в приложении. Если используется только один файл, то отображается файл при- соединенной таблицы. Если применяется несколько файлов, то отображается со- общение Use the Attachment Manager (Воспользуйтесь диспетчером связанных таблиц). Если в базе данных отсутствуют присоединенные таблицы, то отображает- ся сообщение, указывающее, что присоединенные таблицы не используются. Ин- формация о сеансе предоставлена функциями CurrentUser и Now. Листинг 23.2. Подпроцедурадля загрузки формы окна системной информации Private Sub Form__Load () On Error GoTo ErrorHandler With Me ' Информация Access .AccessVer = SysCmd (acSysCmdAccessVer) .RunTime = Ilf(SysCmd(acSysRunTime), "Yes", "No") .IniFile = SysCmd(SYSCMD_INIFILE) .AccessDir = SysCmd (SYSCMD ACCESSDIR) ’ Информация приложения .ProgramFile = Currentproject.Name .ProgramDirectory = CurrentProj ect.Path If DCount("Database", "MsysObjects", "Database <> " &_ Chr (34) &_ DLookUp("Database", "MsysObjects"r "Type =6") &_ Chr(34) = 0 Then .AttachedTo = DLookup("Database", "MsysObjects", "Type = 6" Else .AttachedTo = "Несколько файлов, используйте Attachment Manager." End If ’ Информация сеанса .User = Currentuser() .SystemDateTime = Now() End With GoTo Done ErrorHandler: MsgBox Err.Description Done: End Sub Используя такую форму, можно отобразить даже больше информации — все, что будет полезно для технической поддержки приложения. Продукт EZ Access Developer Suite от Database Creations, Inc. содержит мощные и гибкие интерфейсы, включающие все перечисленные выше функции, в том числе управление настройками, менеджер архивации, файловые утилиты и окно систем- ной информации. На сопровождающем данную книгу Web-узле находится ссылка на демонстрационную версию этого продукта.
Осталось 20 минут VBA-код Существует довольно много различных способов обработки программы VBA, ко- торые включают методы компиляции и структурирования программы. Методы обработки программы влияют в целом на технические свойства и эффективность работы приложения. Компиляция Как вы уже знаете из предыдущих уроков, код VBA хранится в проекте Visual Basic. Чтобы выполнить программу, ее необходимо сначала скомпилировать. Mi- crosoft Access сохраняет код в двух состояниях: исходную версию программы и скомпилированную версию. При каждом изменении исходного кода скомпи- лированная версия удаляется. Access компилирует необходимые модули при их использовании, если они на этот момент не скомпилированы. Такой компиляции следует избегать, поскольку о наличии ошибок компиляции необходимо знать до выполнения программы. Проект можно скомпилировать с использованием ко- манды Debug^Compile Project в окне редактора Visual Basic. Параметры компиляции При выборе команды Tools ^Options в окне редактора Visual Basic отобража- ется диалоговое окно, в котором можно задать параметры компиляции Access (рис. 23.4). В нижнем правом углу вкладки General находятся два параметра. Рис, 23.4. Параметры компиляции • Compile On Demand. Ограничивает код, который будет скомпилирован при открытии формы. Access компилирует только используемые функции. • Background Compile. Компилируется любой песком пилированный код, если приложение Access не занято другой обработкой. Рекомендуется всегда полностью компилировать приложение, прежде чем пере- давать его конечному пользователю.
Свойство IsCompiled Состояние компиляции проекта можно проверить с помощью свойства Is- Compiled объекта Application. Это свойство возвращает значение типа Boo- lean, которое указывает, находится ли проект в скомпилированном состоянии. Если значение False (0), то проект не был полностью скомпилирован. Это зна- чение также будет установлено в следующих случаях: в проект был добавлен но- вый модуль, модуль был изменен, удален или не сохранен после компиляции. Условная компиляция Иногда определенные программы могут не подходить для конкретной среды. Например, приложение по-разному работает в различных версиях Access, либо код применим только для определенных версий Windows. Другими причинами, вызвавшими подобную ситуацию, могут быть операторы отладки или локальные настройки приложения для разных языков. Чтобы существовала программная база, которая может выполняться в различных типах среды, в Access и VBA предложена концепция, называемая условной компиляцией. Условная компиляция используется для выполнения блоков программы из- бирательным образом. Для этого необходимо следующее. 1. Условная константа компилятора, которая обозначается с использованием #Const. 2. Директива #If. . . #Then. . . #Else (возможно применение встроенных ди- ректив). Пример использования констант компилятора можно найти в модуле mod_PreferenceFunctions приложения CheckWriter. Программа этого модуля представлена в листинге 23.3. Как отмечалось в одном из предыдущих разделов, существует два метода работы с настройками: метод одной записи и метод не- скольких записей. Модуль разработан для работы с каждым из этих методов, а выбор метода обрабатывается с помощью констант компилятора. Листинг 23.3. Функции настроек ’ Перед использованием этих функций необходимо задать тип системы настроек, ' которая используется в приложении f и включить соответствующую таблицу PConst Preferencesystem = 1’1- одна запись, 2 - несколько записей #If Preferences System = 1 Then Const PrefTable As String = "tbl_Preferences” #Else Const PrefTable As String = "PreferencesII” ttEnd If Public Function dbc_GetPref(strPrefName As String) As Variant ’ Функция возвращает настройки для заданного названия параметра 1 или Null, если такого параметра нет Dim rst As ADODB.Recordset On Error GoTo ErrorHandler Set rst = New ADODB.Recordset rst.ActiveConnection = Currentproject.Connection rst.CursorType = adOpenKeyset
# If PreferenceSystem = 1 Then rst.Open "SELECT * FROM *' & PrefTable If rst.RecordCount = 1 Then dbc_GetPref = rst(strPrefName) Else dbe_GetPref = Null End If #End If # If PreferenceSystem = 2 Then rst.Open "SELECT * FROM ” & PrefTable & "'WHERE PrefName = " &_ Chr(34) & StrPrefName & Chr(34) If rst.RecordCount = 1 Then dbc_GetPref = rst!PrefValue Else dbe_GetPref = Null End If # End If GoTo Done ErrorHandler: dbe_GetPref = Null Done: End Function Public Function dbc^SetPref(strPrefName As String, varPrefValue As Variant, Optional strPrefType = "adWChar" Optional IngPrefSize = 255) As Boolean Dim varX As Variant ' Функция устанавливает значения для заданного параметра настроек • Если такой параметр не существует, он будет создан ' Если он существует, старое значение меняется на новое ' Функция имеет такие аргументы: ' str Pref Name - название параметра ' varPrefData - значение параметра 1 strPrefType - тип данных ADO, который используется только при создании нового параметра ' Этот аргумент необязателен и по умолчанию имеет тип String ' Функция возвращает True, если параметр был успешно задан, ' или False, если при установке параметра возникла проблема #If PreferenceSystem = 1 Then Dim rst As ADODB.RecordSet Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table Dim col As New ADOX.Column On Error GoTo ErrorHandler Set rst = New ADODB.Recordset rst.ActiveConnection = Currentproject.Connection rst. Open PrefTable, , adOpenKeySet, adLockPessimistic, adCmdTable проверка, существует ли поле On Error Resume Next varX = rst(strPrefName) rst.Close If Err.Number = 3265 Then
1 Поле не существует, создать новое поле On Error GoTo ErrorHandler cat.ActiveConnection = Currentproject.Connection col.Name = strPrefName col.Type = strPrefType col.DefinedSize = IngPrefSize col.Tables(PrefTable).Columns.Append col Set cat = Nothing End If 1 изменение значения поля On Error GoTo ErrorHandler rst. Open Pref Table, , adOpenKeyset, adLockPessimistic, adCmdTable rst(strPrefName) = varPrefValue rst.Update #End If #If Preferencesystem = 2 Them Dim rst As ADODB. Recordset On Error GoTo ErrorHandler Set rst = New ADODB.Recordset rst.ActiveConnection = Currentproject.Connection rst.Open PrefTable, , adOpenKeyset, adLockPessimistic, adCmdTable rst.Find ("PrefName = 1 " & strPrefName & " ' ") If rst.EOF Then 1 добавить новый параметр rst.AddNew rst’PrefName = strPrefName rst!PrefValue = varPrefValue rst.Update Else ’ параметр существует rst!PrefValue = varPrefValue rst.Update End If #End If dbc_SetPref = True GoTo Done ErrorHandler: dbc_SetPref = False Done: End Function В первой части кода, представленного в листинге 23.3, содержатся общие операторы объявления. Константа Preference System используется для опреде- ления метода в системе индивидуальных настроек. Значение 1 соответствует ме- тоду одной записи, а значение 2 — методу нескольких записей. Обратите внима- ние, что значение константы Pref Table устанавливается на другую таблицу на основании константы Pref erenceSystem,что осуществляется с помощью опера- торов #If, #Then, #Else и #EndIf.
Обе функции (GetPref И SetPref) содержат операторы #If, #Then, #Else H#EndIf, которые определяют метод, используемый для обработки настроек. Когда компилятор обрабатывает код, компилируется и используется только та его часть, которая относится к данному методу настроек. Константы условного компилятора всегда имеют статус Private для модуля, в котором они заданы. Константы компилятора, имеющие статус Public, с помо- щью директивы ftconst задать нельзя. Чтобы определить константы компилятора Public, используйте окно Project Properties, затем введите константы компи- лятора в поле Conditional Compilation Arguments на вкладке General. VBA определяет константы, которые должны использоваться в программе, в директиве #If. . .Then. . .#Else, не определяя их в директиве Const. Эти кон- станты имеют глобальную сферу действия и относятся ко всем модулям проекта (табл. 23.1). Таблица 23.1. Встроенные константыусловной компиляции Константа Описание Vba6 True для VBA версии 6.0 winic True для 16-битовой среды разработки Win 3 2 Тrue для 32-битовой среды разработки Нас True для среды Macintosh Декомпиляция Приложение можно и скомпилировать, и декомпилировать. Это действие выполняется нечасто, однако иногда может понадобиться исправить некоторые ошибки, возникающие в Access, которые время от времени происходят при до- бавлении ссылки на новую библиотеку или изменении операционной системы. Декомпилировать весь проект можно одним из следующих способов. • Изменить название проекта. • Использовать в командной строке при запуске Access команду /decompile. Модульная структура Access и VBA предоставляют возможность работы с несколькими модулями в базе данных или проекте. В каждом модуле может находиться одна или не- сколько функций или подпроцедур, а также глобально объявленные константы и переменные. Вы можете решить объединить весь код в один модуль. Однако при этом возникает проблема: всякий раз, когда необходима одна функция, в память загружается весь модуль, что существенно снижает эффективность работы приложения. С другой стороны, если все функции находятся в отдельном модуле, при каж- дом вызове новой функции Access будет останавливать приложение для загрузки нового модуля. Советуем разбить функции и подпроцедуры на логические груп- пы, которые удобно загружать одновременно. Если функции связаны, поместите их в одном модуле. Если функция вызывает другую функцию, также поместите обе функции в один модуль. Также рекомендуется сохранять объявления и пере- менные РиЫ ic в отдельном модуле.
10 кинут Конфигурация файла программы Вы можете управлять поведением Access и вашего приложения путем конфигу- рации различных параметров и свойств. Ниже описаны некоторые параметры и свойства. Параметры запуска Access предоставляет различные параметры запуска, которые управляют ра- ботой приложения. Эти параметры находятся в диалоговом окне Параметры запуска (Startup), которое вызывается командой Сервис^ Параметры запуска (Tools^Startup). Данные параметры можно также задать с помощью VBA и ADO. Эти свойства определяются Microsoft Access; механизм баз данных Jet не распо- знает их автоматически. Когда свойство устанавливается в первый раз, его необходимо создать и при- соединить к коллекции Properties для объекта, к которому оно относится. По- сле того, как свойство будет добавлено в коллекцию, вы сможете задавать его значение подобно другим свойствам ADO. Когда свойство устанавливается впер- вые в интерфейсе пользователя, оно добавляется в коллекцию Properties, при- чем его можно задать без присоединения к коллекции. При создании кода для установки этих свойств необходимо включить процедуру проверки ошибок, что- бы удостовериться, что настраиваемое свойство уже существует в коллекции Properties. При создании свойства корректно определите его тип (Туре), пре>кде чем оно бу- дет добавлено в коллекцию Properties. Перечислим некоторые определенные Microsoft Access свойства, которые от- носятся к объекту Application: AppTitle, Арр I con, StartupShowDBWindow, StartupShowStatusBar, AllowShortcutMenus, AllowFullMenus, Allow- BuiltlnToolbars, AllowToolbarChanges, AllowBreaklntoCode, AllowSpe- cialKeys, Replicable и ReplicationConf lictFunction. Процедуры запуска Существует три возможных варианта для запуска кода VBA при открытии ба- зы данных. • Использовать аргумент /х макрос из командной строки, который запус- кает указанный макрос при запуске приложения. В этом макросе должна вызываться процедура VBA. • . Применить макрос AutoExec, который автоматически выполняется при запуске Access, * Установить параметр Вывод формы/страницы (Display Form/Page) в диалого- вом окне Параметры запуска (Startup). Тогда при запуске Access автоматиче- ски выполняется код в событии OnLoad или ОпОреп для данной формы. Сжатие Сжатие файла базы данных значительно увеличивает эффективность работы приложения. Для выполнения этой важной функции необходимо осуществить определенную подготовку.
Что такое "сжатие" База данных Access сжимается, когда необходимо убрать удаленные ранее объекты, которые занимают память. При удалении данных или объектов в базе данных Access файл может фрагментироваться, что приводит к неэффективному использованию дискового пространства. При сжатии базы данных создается ко- пия файла, и порядок хранения файла на диске изменяется. Это оптимизирует эффективность базы данных. Если готовый продукт создан так, что данные нахо- дятся в отдельном файле, а приложение — в отдельном, и вы защитили прило- жение от возможных изменений пользователями, сжатие выполнять не придет- ся. В остальных случаях, прежде чем передавать приложение конечным пользо- вателям, необходимо осуществить сжатие базы данных. Для сжатия требуется монопольный доступ к базе данных программы, вы- полняющей сжатие, т.е. другие пользователи не могут работать с базой данной во время ее сжатия. Это один из недостатков Access по сравнению с такими систе- мами управления базами данных, как SQL Server. СУБД позволяют работать с базами данных во время сжатия или создания резервной копии файла. Выполнение сжатия в программе Базу данных также можно сжать с использованием VBA и ADO/JRO посред- ством метода CompactDatabase. Этот метод копирует и сжимает закрытую базу данных и предоставляет несколько вариантов выбора, которые касаются измене- ния версии, порядка сортировки, использования кодирования и других аспектов сжатия. Метод CompactDatabase имеет следующий синтаксис. JetEngine. CompactDatabase (исходное_соединение t целевое_соединение) В данном случае исходное_ соединение — это строка, определяющая соединение с исходной базой данных, которую необходимо сжать. Исходное^соединение долж- но быть закрыто. Целевое^соединение— это строка, определяющая соединение с целевой базой данных, созданной при сжатии. Если целевое, соединение уже су- ществует или если существует другой файл с таким же именем, при сжатии произой- дет ошибка. Нельзя выполнить сжатие одной и той же базы данных, т.е. базы дан- ных, в которой исходное соединение и целевое_соединениесовпадают. Необходимо каким-то образом автоматизировать этот процесс или хотя бы предоставить пользователям способ периодического сжатия баз данных. Невоз- можно сжать базу данных, с которой пользователь работает в данный момент или с которой работают другие пользователи. Программа в листинге 23.4 может использоваться для программного сжатия файла. Функция получает один или два параметра. Если в базе данных для сжа- тия установлен пароль, то необходимо задавать второй параметр. В процессе сжатия данная функция создает копию файла базы данных, переименовывает ее и сжимает назад в первоначальное имя файла. Листинг 23.4. Функция сжатия Public Function dbc CompactFile (fileCompact As String, Optional pwd As String = Dim errloop Dim SizeBefore As Long Dim SizeAfter As Long Dim Percentcompaction As String Dim fileBackUp As String
On Error GoTo ErrorHandler ' получить размер файла перед сжатием f = FreeFile Open FileCompact for Binary Shared As #f SizeBefore = LOF(f) Close f ’ создать перед сжатием резервный файл fileBackUp = Mid(fileCompact, 1, Len(fileCompact) - 3) & "bak" If Dir (fileBackUp) о Then ’ удалить резервный файл, если он уже существует Kill fileBackUp Ehd If Name fileCompact As fileBackUp ' выполнить сжатие If pwd = ”” Then DBEngine.CompactDatabase fileBackUp, fileCompact Else DBEngine.CompactDatabase fileBackUp, fileCompact, , ,_ ” : pwd= ’’ & pwd End If 1 вычислить размер нового файла f = FreeFile Open FileCompact For Binary Shared As #f SizeAfter = LOF(f) Close f 1 вычисление процента сжатия и отображение сообщения Percentcompaction = (SizeBefore - SizeAfter)/SizeBefore MsgBox fileCompact & 11 сжато на ” & Format (PercentCompaction,- "процентов") GoTo Done ErrorHandler: For Each errloop In DBEngine.Errors MsgBox "Опмбка сжатия! ,r & errloop.Description Next errloop Done: End Function Готово! Обзор В этом уроке вы изучили структуру приложения и узнали, как обеспечить функ- циональные возможности, необходимые для любого приложения. В уроке были рассмотрены следующие вопросы. • Готовое приложение должно включать стартовые формы, окно About, кно- почную форму или систему меню, обработку ошибок, справочную систему и поддержку. • Система поддержки включает техническую поддержку, управление инди- видуальными настройками, архивацию, резервное копирование, восста- новление, сжатие и системную информацию.
• Существует две схемы обработки индивидуальных настроек: метод одной записи и метод нескольких записей. Каждый из них обладает своими дос- тоинствами и недостатками. • Функция CompactDatabase может дефрагментировать базу данных, уменьшить дисковое пространство, которое занимает файл, и улучшить эффективность работы базы данных. Проверьте себя 1. Какие существуют схемы для работы с индивидуальными настройками? Опиши- те преимущества и недостатки каждого метода. (См. раздел "Управление инди- видуальными параметрами”.) 2. Назовите пять преимуществ архивации данных. (См. раздел “Архивация”.) 3. Какие ограничения имеют возможности восстановления баз данных? (См. раздел “Восстановление”.) 4. Какие данные отображаются в окне системной информации? (См. раздел "Конфигурация файла программы”.) 5. Какой метод используется для сжатия базы данных в программе? (См. раздел “Сжатие”.)
УРОК Упаковка приложения Содержание урока * Анализ особенностей файлов .mde Использование версии Runtime <✓ Установочная программа ЭВ этом уроке будет рассказано, как приготовить приложение для передачи ко- нечным пользователям. Речь пойдет о средствах, используемых для установки приложения, компьютерной среде конечного пользователя и т.д. Осталось 30 минут Файлы .MDE Access обеспечивает специальный тип базы данных, который не допускает просмотр кода и проектирование форм и отчетов со стороны пользователей. Это файл .mde. В некоторых случаях конечную версию приложения следует сохра- нять именно в этом формате. Что представляет собой файл .mde Файл .mde — это копия файла .mdb, из которой удален весь исходный код; в ней содержится только скомпилированный код. Этот формат используется для передачи приложений тем пользователям, которые не имеют возможности изме- нять текст программы. Поскольку в файле .mde отсутствует исходный код, он имеет меньший размер, чем файл . mdb. Кроме того, формат . mde обладает сле- дующими преимуществами: он всегда остается скомпилированным, не допускает просмотр и изменение программных модулей пользователями, а также предот- вращает изменения в формах и отчетах.
Свойство MDE Существует свойство MDE, с помощью которого можно определить, была ли база данных сохранена как файл . mde. Если база данных сохраняется как файл . mde, Ac- cess добавляет в псе свойство MDE и устанавливает его назначениеТ (тип String). Свойство MDE не существует для баз данных, которые не являются файлами . mde. При попытке определить это свойство произойдет ошибка в файле .mde. Создание файла .mde Можно изменить формат файла базы данных файл .mde, выбрав команду Сервис^Служебные программы^Создать MDE-файл (Tools1^ Database Utilities1^Make MDE File). При создании файла . mde Access выполняет следующие действия. Удаляет весь доступный для редактирования исходный код. Компилирует все модули. Сжимает базуданных. Обязательно сохраните копию исходной базы данных, чтобы сохранить исходный код. Версия Runtime В серии Office Developer Edition компания Microsoft предоставила разработ- чикам такие средства распространения приложений Access конечным пользова- телям, которые не требуют приобретения самого продукта Access. Это прекрас- ный способ передать приложение сотням или тысячам пользователей, которые не приобрели Microsoft Office Professional -(включающий Access). Несмотря на то, что такой тип передачи приложения конечным пользователям имеет существен- ное преимущество, за него тоже придется платить. Дело в том, что версия Run- time (т.е. предназначенная для использования Access во время работы приложе- ния) обладает некоторыми ограничениями. Они касаются того, что эта версия не может быть использована сама по себе, без приложения. Как разработчик вы должны знать эти ограничения и обеспечивать функциональные возможности, которые заменяют недостающие функции. Далее представлен список функций, отсутствующих в версии Runtime. • Окно баз данныхскрыто. • ' Окна макросов и модулей скрыты. • Недоступны представления Конструктор (Design). • Ограничен выбор элементов меню — отображаются только те элементы, которые были явно включены в приложении. • Отсутствуют встроенные панелей инструментов — отображаются только специальные панели инструментов, которые были созданы в приложении. • • Отсутствуют файлы справочной системы Access — отображаются только файлы справки, созданные вами для данного приложения. • Отсутствует встроенная функция обработки ошибок — если вы не вклю- чили процедуры обработки ошибок, то системные ошибки Access, которые
20 минут происходят в процессе работы приложения, вызывают непоправимый сбой программы. • Не работают некоторые комбинации клавиш. В основномг это те комбина- ции клавиш, которые относятся к окну баз данных, представлениям Конструктор, элементам меню, элементам справочной системы и обработке ошибок. Программа установки Практически в любом программном обеспечении в конечную версию продукта включается какая-либо программа для установки приложения. Работая с архи- тектурой операционных систем Windows, необходимо обеспечить работу прило- жения будет в этой операционной системе — операционная среда должна озна- комиться с вашей программой. Данные функции можно установить с помощью программы установки. В этом уроке вы ознакомитесь с процессом установки про- граммного обеспечения на компьютере пользователя. Причины использования программы установки В готовый продукт необходимо включить определенную программу установки. Исключение составляют случаи, когда приложение является одним файлом базы данных, не использующим ссылок на другие файлы. Ваше приложение почти навер- няка будет разделено хотя бы на две базы данных: одну — для данных и одну — для программы. В таком случае необходимо удостовериться, что ссылки из одной базы данных на другую работают независимо от того, где пользователь разместит прило- жение. Данную проблему можно решить с помощью программы установки. Кроме того, в приложении, скорее всего, используется ссылка, библиотека, элемент управления ActiveX, справочный файл или другой аналогичный эле- мент. Если эти надстройки не будут установлены на компьютере пользователя в нужном месте, при первом запуске приложения произойдет сбой. Программа ус- тановки соответствующим образом обрабатывает установку надстроек на компь- ютере пользователя. Еще одна причина для использования программы установки приложения связана с созданием файлов программы на рабочем столе, включением элементов меню и добавлением пиктограмм ярлыков. Без этих элементов пользователь вы- нужден будет запускать сначала Access, а потом искать приложение с помощью диалогового окна Открытие файла базы данных (Open), что не только неэффек- тивно, но и неудобно для пользователя. Программы установки содержат также сжатые версии ваших файлов, поэто- му распространение кода занимает меньше места. В результате можно реализо- вать более эффективную передачу продукта на компакт-диске, установку при- ложения по сети или через Internet. Если вы решили предоставлять продукт вместе с Access Runtime, то необхо- димо установить много файлов, записать много элементов в реестрах и устано- вить дополнительные компоненты. Использование программы установки, кото- рая предоставляется в комплекте с Office Professional, позволяет без труда вклю- чить версию Runtime в состав продукта. Использование мастера упаковки и установки Мастер упаковки и установки (Package and Deployment Wizard), предостав- ляемый в комплекте с Office Developer, обеспечивает средства для создания ус-
тановочной программы, которая будет работать с приложениями на базе Access, Access Runtime и Microsoft Data Engine (MSDE). Разработанную программу уста- новки можно передать пользователю различными способами: от записи на диске- те до передачи по сети, включая все промежуточные варианты — установочные компакт-диски и сетевые программы. Процесс передачи приложения конечным пользователям с использованием мастера упаковки и установки показан на рис. 24.1, Рис. 24.1. Процесс передачи готового продукта с использованием мастера Подготовка приложения для передачи конечным пользователям включает че- тыре основных этапа. • Создание пакета. • Запись пакета на компьютер пользователя ("развертывание" пакета). • Установка пакета. Тестирование пакета. Установка и тестирование Прежде, чем передавать продукт конечным пользователям, необходимо за- пустить программу установки и протестировать результаты установки. По тем же причинам, что вы тестируете приложения на наличие дефектов, необходимо также протестировать установочную программу и удостовериться, что она кор- ректно выполняет все необходимые задачи. Так как существуют значительные различия в компьютерной среде пользователей, может возникнуть ряд проблем;
Осталось 10 минут многие переменные связаны с аппаратным обеспечением компьютера, операци- онными системами и другими приложениями, которые будут работать одновре- менно с вашим. Чтобы запустить программу установки, найдите файл Setup. ехе, созданный на этапе развертывания программного пакета. Запустите файл Setup .ехе, затем следуйте подсказкам и инструкциям, чтобы установить приложение. Программуустановки для приложения CheckWriter, созданную с помощью мастера упаковки и установки, можно найти на сопровождающем Web-узле. Загрузите и выполните файл Setup, ехе. Вы должны протестировать установочную программу и приложение в раз- личных операционных системах с целью удостовериться, что программа будет корректно работать для всех пользователей. Несмотря на то, что количество раз- личных комбинаций параметров процессоров, скорости, памяти, операционной системы и других характеристик практически неограниченно, необходимо вы- брать хотя бы основные варианты и протестировать приложение для них. Вопросы использования программы установки Программа установки должна знать, в какой среде осуществляется установка программного обеспечения. Действия, которые она выполняет, могут сущест- венно отличаться в различных конфигурациях компьютера и другом установ- ленном программном обеспечении. Общие вопросы Поскольку разработанное вами приложение написано в Access, необходимо учесть и особенности его работы на компьютере, на котором установлена не- сколько версий Access или другая версия Access. Обязательно проверьте записи реестров и посмотрите, какая версия Access установлена на компьютере. Эту проверку нельзя выполнить в приложении — корректная версия Access уже су- ществует и была загружена (ведь приложение работает). Следовательно, такую проверку необходимо выполнить еще в программе установки или задать специ- альные свойства меню, которые будут содержать информацию о версии Access, необходимой для работы вашего приложения. Данная проблема упрощается, ес- ли в состав своей программы вы включаете версию Runtime, поскольку в данном случае программа установки установит версию Access Runtime и корректно соз- даст все команды меню. Вопросы использования мастера упаковки и установки Если вы включаете в приложение версию Access Runtime, размер продукта мо- жет существенно увеличиться — как минимум до 160 Мбайт. Таким образом, ис- пользовать дискету для распространения приложения нельзя. Для применения страниц данных Access необходим Microsoft Internet Explorer (IE) версии 5.0 и выше. IE 5.0 устанавливается как часть программы ус- тановки и не будет использоваться как броузер по умолчанию, за исключением случаев, когда на компьютере уже была установлена более старая версия IE. —Вы можете задать специальные параметры мастера упаковки и установки (Package and Deployment Wizard) с помощью Visual Basic 6.0, изменив программу Setupl .vbp. Дополнительную информацию см. в документации Microsoft
Про граммы сторонних производителей Для создания установочной программы приложения использовать Package and Deployment Wizard не обязательно. Существуют и другие возможности — про- граммы, предоставленные независимыми производителями. Самые популярные продукты разрабатываются компаниями Wise Solutions, Inc. и InstallShield Software Corporation. Компания Wise Solutions, Inc., находящаяся в Кантоне (Мичиган), США, вы- пускает несколько приложений для создания программ установки, которые мо- гут предоставлять различные функции в зависимости от необходимого типа ус- тановки. Продукт Wise for Windows Installer обеспечивает более широкие воз- можности, чем Package and Deployment Wizard. Компания InstallShield Software Corporation, из Шаумберга (Иллинойс), США, также выпускает продукты для создания программ установки, в том числе InstallShield Professional и InstallShield Developer. Кроме того, можно выбрать различные варианты выполнения программы ус- тановки. Некоторые программы используют механизм, включающий скомпили- рованный файл сценария и ряд файлов САВ, в которых хранятся файлы данных. Другие программы используют Windows Installer (MSI), конфигурацию, которая состоит из таблиц и файлов баз данных, объединенных в один файл MSI. Формат MSI — открытый стандарт, созданный компанией Microsoft. Для продуктов, ис- пользующих Windows Installer, базы данных и файлы обрабатываются механиз- мом Microsoft, который и устанавливает приложение. Механизм Installer входит в состав операционных систем Windows 2000, ME и ХР. Компания SageKey, которая находится в Пентиктоне, Канада, разрабатывает сценарии для Wise Solutions и InstallShield. Эти сценарии включают необходи- мые функции не только для установки ваших файлов, но и для установки (при необходимости) всех файлов, которые требуется для работы с Access Runtime. Готово! Обзор В этом уроке вы узнали, как конфигурировать приложение для установки и ее выполнения в необходимой и оптимальной среде. Данный урок включал сле- дующие основные вопросы. • Файл .mde содержит только скомпилированный код, он используется разработчиками приложений, пользователи которых* не должны иметь возможности изменять программу. Версия Access Runtime обладает некоторыми ограничениями, которые де- лают ее невозможно для использования отдельно от приложения. Вы должны знать эти ограничения и отдельно обеспечивать недостающие функции Access в приложении. Для обработки всех необходимых в приложении файлов следует включить в состав продукта программу установки. Эта программа осуществляет ус- тановку присоединенных файлов данных, ссылок, библиотек, объектов ActiveX, справочных файлов и т.д. • Программа установки необходима и для других целей: создания ярлыков и пиктограмм на рабочем столе и элементов меню, сжатия файлов, уста- новки Access Runtime, отображения файлов ReadMe и лицензионных со- глашений, установки другой информации технической поддержки. Про- грамма установки позволяет также удалить приложение с помощью деин- сталляционного компонента.
• Программа установки и приложение должны быть протестированы для различных параметров операционных систем и конфигураций компьюте- ра, чтобы обеспечить корректную работу приложения для максимального числа пользователей. • Помимо средств Package and Deployment Wizard, можно использовать сис- темы создания программ установки, разработанные сторонними произво- дителями. Проверьте себя 1. Какими особенностями обладает свойство MDE? (См. раздел "Файлы .MDE”.) 2. Перечислите функции Access, которые не работают в версии Access Runtime. (См. раздел "Версия Runtime”.) 3. Назовите основные причины использования установочных программ. (См. раздел "Причины использования программы установки”.) 4. Назовите четыре этапа передачи приложения конечным пользователям с ис- пользованием Package and Deployment Wizard. (См. раздел "Использование мастера упаковки и установки”.) 5. Какие факторы влияют на установку приложения на компьютере пользовате- ля? (См. раздел "Установкаи тестирование”.)

УРОК Программирование форм- мастеров для ускорения обработки данных Содержание урока * Понятие программы-мастера «✓ Основные понятия структуры мастера Создание общего мастера 'Z Анализ программы-мастера Осталось 30 минут Программы-мастера {wizards) применяются в функциях Access и других ком- мерческих продуктов с целью упростить пользование программы, в том числе для того, чтобы помочь пользователю выполнить то или иное действие. В данном уроке вы ознакомитесь с основными особенностями мастеров и рассмотрите при- мер мастера, разработанного для приложения Check Writer. Что такое "мастер" Microsoft Access содержится несколько встроенных мастеров, которые пре- доставляют пользователю инструкции на каждом этапе выполнения той или иной задачи. Эти мастера обеспечивают пошаговый интерфейс пользователя с кнопками навигации, позволяющими вернуться на шаг назад, перейти к сле- дующему шагу, отменить действие или завершить его. Назовем некоторые аспекты, о которых следует помнить при проектировании программы -мастера.
• Используйте программу-мастер для пошагового прохождения определен- ного процесса. „ • Каждый шаг мастера должен представлять шаг к завершению данного процесса. • Порядок действий должен быть четко определенным. • Стиль кнопок, шрифтов и элементов управления должен быть одинаковым для всех страниц мастера. • Страницы не должны быть переполнены элементами и информацией. • Для облегчения ввода информации пользователем следует уделить особое внимание установленным по умолчанию значениям. Структура мастера Программу-мастер можно создать разными способами, для этого используют- ся различные объекты Access. Например, используйте одну форму и элементы управления (страницы), чтобы разделить страницы мастера. Либо примените главную форму с подчиненными формами для каждой страницы. Кроме того, можно задать отдельную форму для каждой страницы мастера. При разработке мастера решите, какой из подходов целесообразнее. В этом уроке использован подход, несколько отличающийся от перечисленных выше. Мы применим одну форму и элемент управления Tab (вкладка) на ней, каждая страница вкладки бу- дет соответствовать странице мастера. Данный подход имеет следующие пре- имущества. • Весь мастер хранится в одном объекте Access — в форме. • Элемент управления Tab предоставляет свойства и методы, упрощающие программирование. Например, в программе можно установить фокус на определенную страницу, скрыть страницу и т.д. • Корешки вкладок в элементе управления Tab вы вправе отобразить или сделать невидимыми, в зависимости от необходимости. Их можно даже оформить в виде кнопок. • Необходим только один набор кнопок навигации. Обычные кнопки, которые используются в мастере, — это Next (Далее), Back (Назад), Cancel (Отмена) и Finish (Готово). Данные кнопки будут находиться не на элементе управления вкладки, а на главной форме. Кроме того (хоть и не обяза- тельно), обычно в левой части окна мастера помещается рисунок. Для выбранной нами структуры мастера в приложении Check Writer можно разместить один ри- сунок на главной форме или несколько разных рисунков на каждой странице, что повлияет на размер элемента управления вкладки. Он занимает почти всю область главной формы, если включает рисунки, или составляет только некото- рую часть формы, если форма содержит рисунок. В нашем примере используется только один рисунок в форме, поэтому мастер занимает меньше памяти. Создание мастера с вкладками Мастер New Bank Account, разработанный для приложения Check Writer, по- зволяет рассмотреть на примере основные особенности архитектуры. Мастер содержит общие элементы управления и спроектирован таким обра- зом, что можно дополнять, копировать и изменять его для дальнейшего исполь-
зования в других приложениях. Программа также структурирована так, чтобы достичь большей гибкости и легкости в использовании. На рис. 25.1 показан мастер в представлении Конструктор (Design). Рис. 25.1. Представление Конструктор для мастера Итак, пример мастера содержит рисунок, элемент управления вкладки кнопки навигации. Программное обеспечение для мастера управляет тем, какая страница вкладок отображается, а также какие кнопки навигации активны или отключены. В обычном режиме, когда форма открыта, вкладки скрыты, но в представле- нии Конструктор они видны, чтобы с ними было легче работать. В левой части формы находится рамка несвязанного объекта для рисунка. В нижней части формы располагаются четыре кнопки навигации: Cancel, Back, Next и Finish. Они используются для перемещения по страницам мастера. Флажок в нижнем левом углу формы обычно не отображается. Он называется StatusForward и применяет- ся для определения направления перемещения по мастеру (вперед/назад). Формы-мастера обычно проектируются со свойством Тип границы (Border Style), чтобы диалоговое окно отображалось без полос прокрутки и элементов для выбора записей. Далее представлены правила для кнопок программы в этом мастере. • Кнопка Back на первой странице всегда отключена. • Кнопка Finish отключена на всех страницах, кроме последней. • Кнопка Forward всегда отключена на последней странице и может быть от- ключена на других страницах, в зависимости от того, заполнил ли пользо- ватель данные на определенной странице. • Кнопка Cancel всегда активна. Начальная страница мастера представлена на рис. 25.2. На этой странице не- обходимо указать данные о мастере и его предназначение. В данном примере мастер содержит девять страниц. По мере необходимости страницы можно добавлять. Аналогично, если использовать все девять страниц не обязательно, можно удалить страницы или проигнорировать их. Вы вправе добавить все необходимые элементы управления на любую страни- цу. Программа в форме управляет переходом между разными страницами. В данном уроке описывается программа для всех кнопок навигации, кроме того,
даны дополнительные комментарии о том, как можно их модифицировать для других приложений. Мы рассмотрим также подпроцедуру для события формы Открытие (Form Open) и общую подпроцедуру, которая вызывается для измене- ния страницы. Рис. 25.2. Начальная страница мастера Осталось 20 минут Подпроцедура для события формы Открытие Подпроцедура Form Open устанавливает стиль вкладок на None, чтобы пользо- ватель не видел вкладок при открытии формы. Инициализируются кнопки, и ус- танавливается активной первая страница. В листинге 25.1 приведен код этой под процедуры. Листинг 25.1. Подпроцедура открытия формы мастера Private Sub ForrnjDpen (Cancel As Integer) ’ установка стиля вкладок на None Me.wzdPages.Style = 2 1 инициализация кнопок и переход на первую страницу Me.cmdBack.Enabled = False Me.cmdBack.Enabled = False Me.wzdPaged.Pages(0).SetFocus End Sub С помощью элемента управления вкладки (Tab) можно убрать страницы вкладок, установив стиль на значение 2. Мы изменяем стиль на значение 2, так как по умолча- нию вкладки должны отображаться, чтобы в режиме конструктора можно было пе- реходить со страницы на страницу. Однако когда пользователь запускает форму мас- тера, необходимо установить контроль над последовательностью событий, чтобы пользователь не пропустил какие-либо шаги. Подпроцедура отключает также кнопки Back и Finish. Чтобы перейти на первую страницу мастера, потребуется только уста- новить фокус на страницу 0. Нумерация страниц вкладок начинается с 0. Кнопка Next К следующим указаниям мастера можно перейти с помощью кнопки Next. Она запускает код, приведенный в листинге 25.2.
Листинг 25.2. Подпроцедура по щелчку на кнопке Next Private Sub cmdNext_Click() Dim tbc As Control установить флажок состояния на forward Me.StatusForward = True (вперед) * перейти на следующую страниц Set tbc = Me’wzdPages Me.wzdPages.Paged(tbc + 1).SetFocus сделать активной кнопку Back Me.cmdBack.Enabled = True если последняя страницаf отключить кнопку Next и сделать активной кнопку Finish If tbc = Me.wzdPages.Pages.Count -1 Then Me.cmdNext.Enabled = False Me.cmdFinish.Enabled = True End If End Sub Эта программа срабатывает, когда пользователь щелкает на кнопке Next. Она устанавливает фокус на следующую страницу. Элемент управления StatusFor- ward получает значение True, которое указывает, что в данный момент движе- ние происходит вперед по страницам мастера. Элемент управления tbc устанав- ливается на текущую страницу и используется для перехода на следующую страницу. Кнопка Back становится активной. Если новая текущая страница — последняя страница мастера, то кнопка Next отключается, и активизируется кнопка Finish. Косвенно при щелчке на кнопке Next срабатывает еще одна процедура. Это происходит, когда пользователь переходит на другую страницу элемента управ- ления вкладки. При этом срабатывает событие Изменение (OnChange) для эле- мента управления набора вкладок (код события приведен в листинге 25.3). Листинг 25.3. Подпроцедура изменения страницы мастера Private Sub wzdPageexchange () Обрабатывает перемещение между страницами и изменения ' при смене страницы; в этой процедуре можно выполнить: ’ пропуск страниц 1 изменение порядка отображения страниц ’ проверку корректности введенных данных перед 1 переходом на следующую страницу If Me. StatusForward Then ' Перемещение вперед Select Case Me.wzdPages.Value Case 0 Case 1 Case 2 Case 3 Case 4 Case 5
f Case 6 Case 7 Case 8 End Select Else 1 Перемещение в обратном направлении Select Case Me.wzdPages.Value Case 0 Case 1 Case 2 Case 3 Case 4 Case 5 Case 6 Case 7 Case 8 End Select End If End Sub Данная подпроцедура вызывается при загрузке формы: когда пользователь щелкает на кнопках Next или Back. Подпроцедура предназначена для обработки перемещения между страницами мастера. В зависимости от направления и от того, на какой странице находится в данный момент пользователь, может осуществлять- ся проверка ошибок, т.е. проверка того, что пользователь ввел корректную и пол- ную информацию на предыдущем этапе. Если обнаружена ошибка, можно доба- вить код, который будет переходить назад на предыдущую страницу и отображать сообщение об ошибке. Листинг 25.3 представляет пустой шаблон для необходимого кода. Соответствующий код включается в оператор Case в зависимости от направ- ления и номера страницы. Значение оператора Case — это номер новой текущей страницы. Если используется другое количество страниц (а не 9, как в примере — индексы от 0 до 8), необходимо добавить или удалить соответствующие операторы Case. Пример настоящей подпроцедуры приведен далее в этом уроке. Кнопка Back Программа для кнопки Back аналогична программе для кнопки Next. Она ус- танавливает фокус на предыдущую страницу мастера. Элемент управления tbc устанавливается на текущую страницу, и кнопка Next становится активной. Ес- ли новая текущая страница является первой страницей мастера, то кнопка Back отключается. Кнопка Finish также неактивна, а элемент управления StatusFor- ward получает значение False, которое указывает, что перемещение происхо- дит по направлению к первой странице мастера. Программа для события Нажатие кнопки (On Click) кнопки Back приведена в листинге 25.4. \ Листинг 25.4. Подпроцедура нажатие кнопки для кнопки Back Private Sub cmdBack__Click () Dim tbc As Control установить флажок состояния на Back Me.StatusForward = False перейти на предыдущую страницу и сделать активной кнопку Next Set tbc = Me•wzdPages
Me.wzdPages.Pages(tbc - 1).SetFocus Me.cmdNext.Enabled = True если первая страница, отключить кнопку Back If tbc = 0 Then Me.cmdBack.Enabled = False ' отключить кнопку Finish Me.cmdFinish.Enabled = False End Sub Кнопка Cancel Поскольку пользователь должен иметь возможность в любой момент отме- нить действия мастера, кнопка Cancel активна всегда. Программа события Нажатие кнопки (On Click) для этой кнопки приведена в листинге 25.5 — она используется для закрытия формы. Если вы хотите добавить еще какой-либо корректировочный код перед закрытием мастера (например, отменить выбор, сделанный пользователем перед нажатием кнопки Cancel), его следует включить в это событие. Листинг 25.5. Подпроцедура, выполняемая по щелчку на кнопке Cancel Private Sub cmdCancel_Click() ’ Отменить действия мастера и закрыть форму DoCmd.Close acform, Me.name End Sub Кнопка Finish На последней странице мастера должна быть активной кнопка Finish. Событие Нажатие кнопки (On Click) должно начинать выполнение всех действий, выпол- няемых пользователем. Событие должно заканчиваться закрытием формы после выполнения всех необходимых действий. Подробнее о том, как установить мастер в Access в качестве надстройки см. урок 26. Осталось 10 минут Пример программы-мастера Приложение Check Writer содержит форму frm_AddNewAccountWizard. Этот мастер используется для создания Нового банковского счета. Начальная страни- ца мастера была показана на рис. 25.2, а первая страница мастера — на рис. 25.3. В листинге 25.6 представлены только те подпроцедуры, которые имеют специфи- ческие для данной формы функции. Подпроцедуры для кнопок навигации и подпро- цедура FormOpen остаются без изменений независимо от того, для чего используется мастер; Листинг 25.6 содержит три процедуры, которые являются уникальными для мастера New Account Wizard: Form_Load, Finish и wzdPages__Change. Подпроцедура Form Load инициализирует элемент управления xDataSource на форме для того, чтобы мастер мог использовать утилиты несвязанных форм (см. урок 12). Функция Finish вызывает функцию несвязанной формы
dbc_SaveRecord, которая сохраняет запись нового счета, и закрывает форму мастера. Рис. 25.3. Начальная страница мастера New Account Wizard Листинг 25.6. Подпроцедуры мастера New Account Wizard Private Sub Form_Load () ’ Инициализирует источник данных для функций несвязанных форм 1 Предполагается, что источник данных находится в той же папкег что приложение Me .xDataSource = "Data Source = " Application.CurrentProject.Path A ”\CheckWriterData.mdb" End Sub Public Funtion Finish() ’ Вызвать функцию сохранения записи dbc__SaveRecord Me DoCmd.Close acForm, Me.Name End Function (несвязанной формы) Private Sub wzdPages_Change () ’ Обрабатывает перемещение между страницами и изменения 1 при смене страницы; в этой процедуре можно выполнить: ’ пропуск страниц ' изменение порядка отображения страниц ’ проверку корректности введенных данных перед ’ переходом на следующую страницу If Me.StatusForward Then 1 Перемещение вперед Select Case Me.wzdPages.Value Case 0 z Case 1 Case 2 ' Установить элемент управления на тип счета 1 в зависимости от заголовка выбранного параметра Me.Туре = Me.Controls("TypeLabel" &_ Trim(str(Me.selType))).caption Case 3 ,* 1 Предотвратить отображение данной страницы для
’пользователя, если поле Bank Account имеет значение , Null If IsNul1(Me.BankAccountNumber) Then Me.wzdPages(2).SetFocus Case 4 Case 5 1 Предотвратить отображение страницы для пользователя, 1 если поля на предыдущей страницы не заполнены If IsNull (Me.ABANumber) Or _ IsNull(Me.StartingCheckNumber) Then Me.wzdPages.Pages(4) .SetFocus End If Case 6 ’ Пропустить эту страницу, если у пользователя ’ нет последней выписки из счета If Me.HaveLastStatement о 1 Then Me.wzdPages.Pages(7).SetFocus Hhd If Case 7 ’ Пропустить эту страницу, если у пользователя ’ есть последняя выписка из счета If Me.HaveLastStatement = 1 Then __ Me.wzdPages.Pages(8).SetFocus End If Case 8 End Select Else 1 Перемещение в обратном направлений Select Case Me.wzdPages.Value Case 0 Case 1 Case 2 Case 3 Case 4 Case 5 Case 6 1 Пропустить эту сцзаницу, если у пользователя 1 нет последней выписки из счета If Me.HaveLastStatement о 1 Then _ Me.wzdPages.Pages(5).SetFocus End If Case 7 1 Пропустить эту страницу, если у пользователя 1 есть последняя выписка из счета If Me.HaveLastStatement = 1 Then _ Me.wzdPages.Pages(6).SetFocus End If Case 8 End Select End If End Sub Большую часть подпрограммы wzdPageexchange () составляет проверка данных. При перемещении вперед программа проходит по страницам 2, 3, 5, 6 и 7. Обратите внимание, что оператор Case для определенной страницы сраба- тывает сразу же, как только страница становится активной. На странице 2 вы- полняются действия в зависимости от данных, введенных на первой странице.
На странице 3 проверяется значение BankAccountNumber, введенное на страни- це 2. Если оно равно Null, то фокус возвращается на страницу 2, поскольку это обязательное поле. Аналогичная проверка выполняется на странице 5 на основа- нии обязательных данных со страницы 4. На странице 5 (рис. 25.4) пользователя спрашивают, имеет ли у него последняя банковская выписка. Если он отвечает Yes, то отображается страница 6 (рис. 25.5); в противном случае отображается страница 7. Этот пример иллюстрирует, как задается условное отображение страниц в зависимости от введенных пользователем значений. £ Ч Account Wizard Mil о Их I Do you have you Last statement for this* account? Cancel < ft** tjeirt > Puc. 25.4. Страница 5 мастера New Account Wizard Puc. 25.5. Страница в мастера New Account Wizard В обратном направлении перемещения по страницам действуют те же прави- ла: пропускать страницы, которые не нужно отображать в зависимости от вы- бранного пользователем ответа на странице 5. Готово! Обзор В этом уроке вы изучили проектирование программ-мастеров. Мастера исполь- зуются для предоставления пошаговых инструкций пользователям при выпол- нении какого-либо процесса. В данном уроке были рассмотрены следующие вопросы.
* Стандартный интерфейс пользователя для мастера включает кнопки Cancel (Отмена), Back (Назад), Next (Далее) и Finish (Готово). • Мастер проектируется таким образом, чтобы пройти по всем этапам про- цесса, причем каждый шаг мастера приближает вас к выполнению про- цесса. Порядок действий должен быть строго определенным. • Дизайн интерфейса должен быть одинаковым для всех страниц мастера. Не переполняйте страницы лишними элементами. • Для мастера может использоваться элемент управления набора вкладок, где каждая страница вкладки представляет страницу мастера. При этом вся пр о грамма-мастер будет содержаться в одной форме Access. Элемент управления вкладки обеспечивает свойства и методы, упрощающие про- граммирование функций интерфейса. Проверьте себя 1. Что необходимо учесть при проектировании программы-мастера? (См. раздел "Что такое “мастер”.) 2. Перечислите способы проектирования мастера, которые могут использовать- ся с объектами Access. Какими преимуществами и недостатками обладает каждый подход? (См. раздел "Структура мастера”.) 3. Какие общие правила относятся к кнопкам навигации мастера? (См. раздел "Создание мастера с вкладками”.) 4. Какие функции можно выполнять при смене страниц мастера? (См. раздел "Кнопка Next”.) 5. Объясните предназначение элемента управления StatusForward. (См. раздел "Кнопка Next”.)

УРОК Использование надстроек в приложении Содержание урока v Использование надстроек ✓ Применение реестра с надстройками Access У Использование диспетчера надстроек ✓ Создание базы данных библиотек Осталось 30 минут В этом уроке вы сможет получить основное представление об использовании над- строек Access. Так как существует огромное количество вариантов, уровней и на- строек, этот урок станет лишь первым шагом использования базы данных биб- лиотек в качестве надстройки. Что такое "надстройки" Терминология, касающаяся надстроек (odd-ins), очень неоднозначна. Над- стройками в том или ином контексте называют программы-мастера, конструкто- ры, библиотеки, надстройки меню. Попросту говоря, надстройка — это компо- нент, который не является частью продукта Microsoft Access. Надстройки можно получить из следующих источников. • Они входят в состав продукта Access от Microsoft. Приобретены как отдельный продукт у внешних разработчиков. Специально разработаны для данного приложения. Среди надстроек, предоставляемых в Access, — мастера элементов управле- ния, мастера форм, мастера диаграмм, конструкторы полей, объектные библио- теки, диспетчер кнопочных форм, диспетчер связанных таблиц, мастер форми- рования документов, мастер анализа эффективности и др. Некоторые надстрой- ки для Access созданы внешними разработчиками.
Компания Database Creations, Inc. поставляет надстройки как часть продукта EZ Access Developer Suite, в частности, EZ Application Builder. Среди других произво- дителей — FMS и Black Moshannon Systems. Кроме того, можно разработать собст- венные надстройки, как описано далее в этой главе. Итак, надстройки поступают из различных источников; они могут иметь раз- личные типы. По типу соединения с Access надстройки делятся на два основных класса: соединения типа ссылок или реестры. Надстройки, присоединенные к Access посредством ссылок, обычно называют библиотеками. Надстройки со ссылками, как правило, предоставляют функ- циональные возможности через программу VBА, путем вызова функции. Надстройки, присоединенные через реестр, относятся к категории масте- ров, конструкторов и надстроек меню. Надстройки меню — самая понятная группа, поскольку надстройки отображаются в подменю Сервиса Надстройки (Tools«=> Add-Ins). Диспетчер надстроек всегда находится в этом подменю. По иронии судьбы, диспетчер надстроек сам является надстройкой. Многие над- стройки меню разработаны внешними производителями или представляют специально разработанный компонент. Это не означает, что вы можете соз- дать только надстройку, которая отображается в этом меню. Вы вправе соз- дать также надстройки, которые запускаются другим способом. Если над- стройка не использует меню Надстройки (Add-Ins), то она является мастером (объектом Access). Мастера используются для того, чтобы помочь пользователю или разработчи- ку выполнить определенную задачу, которая может состоять в создании или из- менении объекта Access, элемента управления или свойства. Надстройки делят- ся на следующие категории. • Мастера объектов данных — для таблиц и запросов. • Мастера интерфейса пользователя — для форм, отчетов, страниц доступа к данным. • Мастера элементов управления — для создания новых объектов на фор- мах, отчетах или страницах доступа к данным. • Конструкторы свойств — для установления значений свойств. • Конструкторы выражений — для создания выражений. Схема, представленная на рис. 26.1, поможет лучше разобраться в различных категориях мастеров и конструкторов. Итак, что делать дальше? Программист должен знать, как подключить над- стройки в Access и сделать так, чтобы они работали. В следующем разделе рас- сматриваются общие вопросы, касающиеся надстроек. I Общие вопросы использования надстроек При работе с надстройками необходимо учитывать различные аспекты, на- пример, тип файла, ссылки в различных базах данных, свойства форм и вопросы работы нескольких пользователей. Типы файлов Обычно надстройки Access имеют файловое расширение .mda или .mde. Файл . mda может быть открыт, а программа в нем доступна для просмотра. Расширение . mda указывает на то, что файл является надстройкой, а структура файла — такая
же, как в файле .mde. Расширение .mde можно использовать не только для баз данных, но и для надстроек. Чтобы обеспечить защиту программы, надстройку следует представить в виде файла .mde. Файл .mde можно создать с помощью ко- манды Сервисослужебные программьОСоздать MDE-файл (Tools^Database Utilities^Make MDE File). Файл . mde содержит только скомпилированный код и не включает исходного кода программы. и Мастер объектов данных — для таблиц и запросов HIKEY_LOCAL_MACHINE\ I SOFTWARE\Microsoft\Office\ 9.0\Access\Wizards Мастера интерфейса пользователя — для форм, отчетов и страниц доступа к данным Содержит мастера, поддерживаемые Microsoft, диспетчер надстроек, диспетчер связанных таблиц, надстройки сторонних производителей HIKEY LOCAL,MACHINE\ SOFTWARE\Microsoft\Office\ --------2------Т-“77” Через ссылки Меню Надстройки Рис, 26.1, Структура надстроек Access Ссылки на различные базы данных При использовании надстроек код находится как в главной базе данных, так и в базе данных надстройки. Чтобы обратиться к базе данных надстроек, в кото- рой в данный момент выполняется программа, используется объект CodePro- ject или CodeData, который возвращает ссылку на базу данных надстройки. Если вы хотите обратиться к базе данных, которая в данный момент открыта в Access, используйте объект CurrentProj ect или CurrentData.
База данных надстройки может содержать любой тип объектов, который включает обычная база данных. При ссылке на какой-либо объект необходимо быть уверенным, что вы ссылаетесь на него в правильной базе данных. Макросы, которые вызываются из надстроек, сначала проверяются в базе данных надстройки. Если Access не находит макрос в базе данных надстройки, он проверяет текущую базу данных. Статистические функции по группе данных (Dcount, Dmin, Dmax, Dlookup) всегда обращаются к данным в текущей базе данных, а не к базе данных биб- лиотеки. Общий дизайн Интерфейс надстройки рекомендуется моделировать на настройках, которые поставляются с Microsoft Access. Пользователи, вероятно, уже знакомы с их ин- терфейсом, и вы сможете таким образом максимально упростить использование надстроек и сократить затраты на обучение пользователя. Чтобы сделать интерфейс специальных надстроек подобным интерфейсу над- строек Access, используйте следующие приемы. Установите свойство Выравнивание по центру (AutoCenter) для формы равным Да (Yes). Отключите средства выбора записей. Отключите полосы прокрутки, если только они не нужны из-за размеров окна надстройки. Не используйте кнопки навигации, кроме форм с несколькими записями. Разместите элементы управления одинаково для каждой формы. Используйте диалоговый режим, чтобы не допустить переход пользовате- ля к следующей форме до выполнения необходимых условий. Применяйте многостраничные формы с кнопками навигации, что сведет объем надстройки к одной форме. Подробнее о приемах размещения надстройки в сдной форме см. урок 25. Вопросы, касающиеся работы нескольких пользователей Надстройки всегда открываются в режиме коллективного доступа, что позво- ляет нескольким пользователям получить доступ к объектам надстройки. Пом- ните: если надстройка должна записать данные назад в базу данных, необходимо открыть надстройку в доступном для чтения и записи режиме. Осталось 20 минут Мастера Мастера выполняют одну главную цель: они предназначены для предоставления пошаговых инструкций пользователю, выполняющему определенную задачу. В случае со встроенными мастерами, предоставленными в составе Access, это мо- гут быть задачи создания баз данных, таблиц, запросов, форм, отчетов, элемен- тов управления или установки значений или выражений. Мастер создания ново- го банковского счета был рассмотрен в уроке 25. В программах-мастерах обычно
используются формы, рисунки и вспомогательный текст, который помогают пользователю понять необходимые действия и одновременно скрывает техниче- ские подробности этих действий. В зависимости от задачи, которая должна быть выполнена, мастера можно разделить на различные категории (см. рис. 26.1). Мастера объектов данных и мастера интерфейса пользователя Мастера объектов данных и интерфейса пользователя позволяют создать новую таблицу, запрос, форму, страницу доступа к данным или отчет. Access предлагает ряд встроенных мастеров объектов, которые находятся в диалоговых окнах Новая таблица (New Table), Новый запрос (New Queiy), Новая форма (New Form), Новая страница доступа к данным (New Data Access Page) и Новый отчет (New Report). Мож- но создать программу-мастер, которая также будет отображаться в одном из этих диалоговых окон. Для этого создайте запись реестра (см. далее в этом уроке). Мастера элементов управления Мастера элементов управления помогают пользователю добавить в форму, от- чет или страницу доступа к данным элемент управления Access или ActiveX. Мастер элементов управления запускается, когда пользователь выбирает элемент управления в наборе инструментов и перетаскивает его на форму, отчет или страницу доступа к данным. Мастер запускается только в том случае, если в на- боре инструментов выбран инструмент мастера. Конструкторы Конструкторы, или построители (builders), — это упрощенная версия мастера. Вместо того, чтобы выполнять задачу, конструктор обычно создает выражение или один элемент данных. Конструктор выражений (Expression Buider, в русскоязычной версии Access — Построитель выражений) встроен в Access. Он используется для не- скольких различных свойств в форме или отчете. Обычно он используется как источ- ник элемента управления. Конструктор запросов (Query Builder— Построитель запросов) может использоваться как источник записей для формы. Кроме того, при- меняются конструктор фильтров Input Mask и другие программы-построители. Если построитель существует для конкретного свойства, рядом с названием свой- ства на листе свойств отображается небольшая кнопка построителя с символом (...). Надстройки меню В отличие от мастеров и конструкторов, возможности надстроек меню гораздо шире возможностей создания выражений или выполнения одной задачи. Обычно надстройки меню работают с несколькими объектами или программой Access. При- мерами надстроек меню являются Database Documentern Performance Analyzer. Если надстройка меню установлена, она доступна в подменю Сервис^ Надстройки (Tools'^Add-Ins). Если надстройка отображается в меню, ее можно выполнять за пре- делами определенного объекта или свойства, как программу-мастер. Установка мастера или надстройки меню Работая с мастером или надстройкой меню, вы можете выбрать один из двух способов установки надстройки: непосредственно через программу установки или интерактивно через утилиту диспетчера надстроек Access. В любом случае
для каждой надстройки будут созданы записи в реестре. Записи реестра может создавать программа установки или диспетчер надстроек. Одна из возможностей диспетчера надстроек — это функция удаления надстроек. Прежде, чем мы пе- рейдем к анализу механизма диспетчера надстроек, рассмотрим записи реестра, необходимые при использовании надстроек. Записи в реестре для надстроек На рис. 26.2 показан редактор реестра (Registry Editor), в котором отображается запись для меню надстроек. Эта запись находится в ветке HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Office\ll. p\Access\Menu Add-Ins, содержащей все запи- си, которые отображаются в подменю Сервис^ Надстройки в Access. В данном случае показан только Диспетчер надстроек (Add-In Manager), но можно добавить в эту ветку и собственные надстройки, которые будут отображаться в меню. Рис. 26.2. Запись реестра для диспетчера надстроек Для мастеров используется ветка реестра HKEY_LOCAL__MACHINE\SOFTWARE\ Microsoft\Office\ll. O\Access\Wizards. Эта ветка и все содержащиеся в ней по умолчанию элементы изображены на рис. 26.3. Помещая запись в одну из этих папок, вы указываете Access на существова- ние мастера в контексте, определенном папкой. Например, вы можете создать собственный мастер запросов и добавить ключ в папку Query Wizards. Если вы запустите Access и создадите новый запрос, данный мастер будет отображаться вместе с другими программами-мастерами в той же ветке. В зависимости от типа мастера используются разные ключи реестра. Необходимые записи для каждого типа программы-мастера можно найти в документации Microsoft. Утилита диспетчера надстроек Чтобы использовать Диспетчер надстроек (Add-In Manager), для надстройки потребуется задать два элемента.
• Свойства базы данных Title, Company и Comments . • ТаблицуUSysReglnfо. Й ГЗ Control Wizards Ш El ComboBox ЗВ El CommandButton .и ("j ListBox ЗВ El OptionGroup ш fl SubformSubreport Й S3 TextBox [£ S3 Data Access Page Wizards Й S3 Form Wizards S3 AutoForm: Columnar •ft AutoForm: Datasheet l §1 AutoForm: PivotChart El AutoForm: PivotTable fill AutoForm: Tabular ? S3 Chart Wizard :• ftl Design View & Form Wizard S3 Pivot Table Wizard &P1 Preferences S3 AutoFormat •• Documentor H -E] Property Wizards S3 FieldName El FuriganaControl Й S3 InputMask 3B S3 LinkChildFields ж S3 LinkMasterFields & fli ODBCConnectStr & S3 Picture LdSl Query Wizards S3 Crosstab Query Wizard :• & Design View S3 Find Duplicates Query Wizard Si Rnd Unmatched Query Wizarc El Simple Query Wizard В (Bl Report Wizards • ASI AutoReport: Columnar El AutoReport: Tabular 1 1 Business Form Wizard Cj Chartwizard Puc. 26.3. Записиреестра для мастеров Свойства Title, Company и Comments дая базы данных отображаются дис- петчером надстроек и показывают пользователю, какая это надстройка. Чтобы
установить эти свойства базы данных перед установкой надстройки, выполните следующие действия. 1. В окне базы данных (Database) выберите команду Файл «^Свойства базы данных (File«=>Database Properties). 2. В диалоговом окне Свойства щелкните на корешке вкладки Документ (Summary). 3. Введите значения в поля Название (Title), Учреждение (Company) и Заметки (Comments), чтобы описать надстройку. 4. Щелкните на кнопке ОК. Таблица USysReglnfo должна включать поля и данные, определяющие запи- си реестра Windows, которые должны быть созданы при установке надстройки (см. табл. 26.1). Таблица 26.1. Структура таблицы USysReglnfo Поле ТИПЛОЛЯ Описание Subkey Text Имя субключа, который содержит информацию реестра для данной надстройки Туре Number Тип значения, которое должно быть создано для субключа: суб ключ (0), строка String (1) или DWORD (4) ValName Text Название элемента реестра, который должен быть создан при установке надстройки Value Text Значение, которое должно храниться в записи реестра, опре- деленнойполем ValName В поле Subkey можно использовать строку HKEY__CURRENT__ACCESS PROFITE\ ТипНадстройки\ИмяНадстройки, которая поможет создать соответствующую запись в реестре. Эта строка применяется диспетчером надстроек для определе- ния размещения в реестрах информации, касающейся Access, на компьютере пользователя. Она позволяет Access создать запись для надстройки в нужном мес- те. Если пользователь запускает Access с параметром /profile в командной стро- ке, эта строка помогает удостовериться в том, что запись в реестре Access будет создана для указанного профиля пользователя. Если он не использует эту коман- ду, то запись создается в субключе реестра \HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft:\Office\2203\ Access\AddInType. —jfegA Существуют различные профили пользователей. Профиль, который используется для запуска Access из командной строки, — этот не тот профиль, который был создан при регистрации пользователя в операционной системе. Профиль пользо- вателя, определенный в операционной системе, относится ко всем программам в системе и используется для хранения системных данных отдельных пользовате- лей. Профиль пользователя Access относится только к Access, и только если при- ложение Access было запущено из командной строки. Кроме того, можно использовать строку HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft \Office\2003\Access\Тип Надстройки, чтобы указать, что записи реестра для определенной надстройки должны всегда создаваться в данной ветви реестров, а профили пользователей Access должны быть проигнорированы. Обратите внимание, что в данном случае необходимо указать полный путь реестров к субключу надстройки. В табл. 26.2 приведен пример таблицы USysReglnfo.
Таблица 26.2. Пример таблицы USysReglnfo Subkey Type ValName Value HKEY_CURRENT_ACCESS_PROFILE\Menu 0 Add-Ins\&Create Functions Table HKEY_CURRENT_ACCESS_PROFILE\Menu 1 Library |ACCDIR\FunctTable.mda Add-Ins\&Create Functions Table HKEY_CURRENT_ACCESS_PROFILE\Menu 1 Expression =AddFuncToTable() Add-Ins\&Create Functions Table Возможности диспетчера надстроек не ограничены установкой надстроек ме- ню. Диспетчер надстроек может устанавливать также надстройки-мастера, если в таблице USysReglnfo указана информация реестров. Таблица USysReglnfo не создается автоматически при создании нового файла .mda. В эту таблицу добавляются записи, соответствующие необходимым над- стройкам. Данная таблица содержит поля, показанные на рис. 26.4. Рис. 26.4. Структура таблицы USysReglnf) Таблица USysReglnfo — это системная таблица, обычно она скрыта. Чтобы отобразить ее, выберите команду Сервис^Параметры (TooLs^Options) пере- йдите на вкладку Вид (View), затем установите флажок Системные объекты (System Objects). Каждая запись в таблице USysReglnfo используется для описания субключа или значения, которое долясно быть добавлено в реестр диспетчером надстроек. Дия каждой надстройки необходимо задать как минимум три записи. Запист выполняют такие действия. 1. Создают субключ для надстройки. 2. Добавляют запись библиотеки. 3. Добавляют выражение. Для хранения других значений реестра, которые могут понадобиться для оп- ределенных надстроек, используются дополнительные записи. Обратите внима-
ние, что различным типам конструкторов и мастеров соответствуют различные записи. Надстройки библиотек Если объекты модулей Access позволяют использовать общие процедуры различ- 10мш^п нымобъектам Access, базы данных библиотек допускают использование общих процедур в разных базах данных Access. В результате еще больше сокращается дублирование кода и упрощается поддержка программы (поскольку она нахо- дится в одном месте, а не в нескольких местах приложения). Кроме того, можно оформить базу данных библиотеки как файл . mde с защищенным исходным ко- дом и оставить исходную программу главного приложения открытой. База данных библиотеки подобна другим базам данных Access, содержащим таблицы, запросы, формы, страницы доступа к данным, отчеты и модули. Вы можете открыть ее точно так же, как и любую другую базу данных, отличие лишь заключается в способе загрузки. К функциям и подпроцедурам в базе данных библиотеки, объявленным как Public, можно обращаться только из текущей базы данных. Процедуры, объяв- ленные как Private, доступны только в библиотеке базы данных. Кроме того, процедуры, которые хранятся в модуле класса, не доступны за пределами базы данных библиотеки. Создание базы данных библиотеки Чтобы создать базу данных библиотеки, выполните следующие действия. 1. Создайте библиотеку с помощью форм, модулей и других объектов новой базы данных. к 2. Выполните тестирование и отладку базы данных библиотеки. 3. Выполните компиляцию и сжатие базы данных библиотеки. 4. Переименуйте базу данных библиотеки, чтобы она имела расширение . mda, или преобразуйте базу данных в файл . mde. Отладка баз данных библиотек Рекомендуется протестировать и отладить функции библиотеки до того, как вы присоедините базу данных библиотеки к приложению; однако иногда это сде- лать невозможно. В определенных случаях не удается протестировать библиоте- ку, не вызвав ее из приложения. Иногда библиотека работает хорошо до тех пор, пока она не будет вызвана из приложения. Чем больше вы тестируете библиотеку саму по себе, тем лучше. Ключ LoadOnStartup Запись реестра, ключ LoadOnStartup, обеспечивает способ автоматической загрузки базы данных библиотеки при запуске Access. Можно добавить ключ LoadOnStartup в следующую ветку реестра: HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Office\ll.O\Access\Wizards. Запись данного ключа — это строка, содержащая путь и имя файла библиоте- ки, которая должна быть загружена при запуске Access. Кроме того, в поле зна- чения Value следует ввести значение rw.
Использование ключа LoadOnStartup для загрузки библиотеки приводит к то- му, что Access загружается медленнее. Библиотека занимает память независимо от того, вызываются ли какие-либо ее функции, поэтому возможности ключа LoadOnStartup следует использовать в меру. Ссылки Ссылки указывают Access на то, где находится база данных библиотеки. Чтобы просмотреть список ссылок, откройте окно редактора Visual Basic, либо открыв мо- дуль, либо просмотрев программы для формы или отчета. Затем выберите из меню команду ToolsReferences — откроется диалоговое окно References (рис. 26.5). Рис. 26.5. Диалоговое окно References Ссылки становятся некорректными, если они изменяются, и Access не может найти файл по указанному адресу. Поскольку ссылки хранятся в базе данных, которая ссылается на функции, они не обновляются автоматически при перемещении библиотеки. Если Access не может найти ссылку на основании абсолютного пути, который хранится в базе данных, приложение ищет относительный путь к базе данных, в которой находится эта ссылка. Поэтому храните ссылку в той же папке, что и ба- за данных, которая на нее ссылается. Если вы потом переместите файлы, то про- блем со ссылкой не возникнет. Если Access не может найти файл в относительном пути, то выполняется поиск в папке, в которой установлена программа Access. Если и этот вариант не работает, проверяются системные каталоги Windows. По- следний поиск ссылки выполняется для всех каталогов, которые включены в системной переменной PATH. Кроме того, можно использовать реестры для хранения информации о местопо- ложении базы данных библиотеки, используя ключ реестра Ref Lib Paths в ветке HKEY__LOCAL_MACHlNE\Software\Microsoft\ -Office\lL 0\Access. Для каждой библиотеки должно быть использовано новое значение строки. В качестве пути для этой ссылки применяется название базы данных библиотеки и значение. Создание ссылки Создать ссылку можно двумя способами: используя диалоговое окно References (см. рис. 26.5) или в программе.
В отличие от записей реестра для мастеров и надстроек меню, которые уста- навливаются для всех баз данных, ссылки определяются для каждой базы дан- ных отдельно. Использование диалогового окна References хорошо работает на этапе разработки приложений, пока ссылки не меняются и не исчезают. В про- грамме установки следите за тем, чтобы библиотеки были установлены в пра- вильном месте и чтобы использовались правильные версии этих библиотек. Как дополнительную функцию можно использовать программу, которая добавляет, проверяет или удаляет ссылки. Чтобы создать ссылку вручную, выполните следующие действия. 1. Откройте окно редактора Visual Basic. 2. Выполните команду Tools^References. 3. Выберите из предложенного списка ссылку, которую следует добавить, или щелкните на кнопке Browse, чтобы найти библиотеку для ссылки. 4. Установите приоритеты ссылок. Это важно, если какое-то имя функции ис- пользуется в нескольких библиотеках. Сначала происходит обращение к биб- лиотеке, имеющий высший приоритет. Работа со ссылками в программе Access содержит объекты Reference, которые позволяют работать со ссыл- ками в программе. Однако в данной книге рассматривать вопросы работы со ссылками мы не будем. Информацию по работе со ссылками в программе можно получить из документации Microsoft. Вызов ссылки Если функция или подпроцедура в базе данных библиотеки объявлена как Public, можно вызвать процедуру так же, как если бы она находилась в текущей базе данных. Для вызова процедуры из библиотеки используйте метод Run. Он позволяет определить библиотеку, в которой расположена функция, путем определения названия проекта, используемого для библиотеки. [Имя_Библи отеки] . Имя_функции Будьте внимательны при именовании функций библиотеки, чтобы они не совпадали с названиями функций в текущей базе данных. Access использует процедуру в текущей базе данных, а не функцию в базе данных библиотеки. Эту проблему можно решить, если не использовать для функций одинаковых назва- ний или поставить перед именем функции название модуля, как показано ниже. 1Имя_Модуля] .Имя_функции Создание библиотеки из модуля Приложение Check Writer содержит модуль, который может использоваться для всех несвязанных форм. Он называется mod__UnboundFormUtilities. По- скольку это достаточно общий модуль и его можно использовать также в других базах данных, мы сделали его базой данных библиотеки. Для создания библио- теки были выполнены следующие действия. 1. Модуль разрабатывается в базе данных приложения, так как это позволяло более легко просматривать и отлаживать программу. 2. После тестирования модуля была создана новая пустая база данных с расши- рением .mda — CheckWriterLibrary .mda.
Готово! 3. Модуль мы переместили из базы данных приложения в новую пустую базу данных библиотеки, после чего он был удален из базы данных приложения. 4. В окне редактора Visual Basic в базе данных приложения была создана ссылка на новую базу данных библиотеки с помощью команды Tools^References (см. рис. 26.9). 5. Базу данных приложения и базу данных библиотеки мы скомпилировали, чтобы убедиться, что они не содержат ошибок. 6. В заключение приложение было протестировано на работу с базой данных библиотеки. Обзор В этом уроке вы узнали, как расширить функции Access с помощью надстроек. Эту задачу можно выполнить на различных уровнях и различными способами, причем Access приобретает очень специальные функции и возможности. В дан- ном уроке были рассмотрены следующие темы. • Надстройки могут быть предоставлены в составе Access, куплены у внеш- них разработчиков или специально разработаны для приложения. • Существует два основных типа надстроек, которые различаются по соеди- нению: ссылки или реестр. • Надстройка может содержать объекты тех же типов, что и обычная база данных, но необходимо внимательно следить за ссылками на объекты над- строек и объекты текущей базы данных. • Диспетчер надстроек использует информацию реестра, указанную в таб- лице USysReglnfo, которая содержится в надстройке. • Ссылки указывают Access на то, где находится база данных библиотеки. Просмотр и работа со списком ссылок осуществляется в окне VBA или в диа- логовом окне References, которое вызывается командой Tools1^ References. Проверьте себя 1. Назовите три возможных источника надстроек. (См. раздел “Что такое “надстройки”.) 2. Чем отличаются основные типы надстроек? (См. раздел "Что такое “надстройки”.) 3. Какими характеристиками обладает тип файла .mda? (См. раздел "Типы файлов”.) 4. Какие способы используются при установке надстройки? (См. раздел "Установка мастера или надстройки меню”.) 5. Опишите предназначение и процесс создания таблицы USysReglnfo. (См. раздел "Утилита диспетчера надстроек”.) 6. Назовите основные этапы состоит создания базы данных библиотек? (См. раздел "Создание базы данных библиотеки”.)
ЧАСТЬ Воскресенье. Утро. Обзор 1. Верно, ли что метод FindRecord можно использовать для полей с несколь- кими ключами? 2. При установке какого свойства равным значению True пользователь должен закрыть диалоговое окно, прежде чем он сможет перейти в другую форму? 3. Какое из указанных ниже свойств не используется для диалогового окна? a. Popup б. Modal в. AutoCenter г. Recordsource 4. Какое свойство устанавливается для списка или поля со списком в диалого- вом окне, чтобы изменить список элементов, отображаемый в диалоговом ок- не поиска? 5. Назовите основные возможности диалоговых окон поиска и печати. 6. Какая из следующих строк программы VBA использует корректный синтак- сис для вывода данных на печать? a. DoCmd.PrintReport "testreport", acNormal 6. DoCmd.OpenReport acNormal, "testreport" в. DoCmd.OpenReport ”testreport", acNormal 7. Где должны быть размещены программы событий отчета? 8. Какая функция позволяет определить версию, тип версии (Runtime), файл инициализации и каталог Access? 9. Верно ли, что параметр Background Compile будет компилировать только используемые функции? 10. Какое средство используется в Access и VBA для задания программной базы, которая может быть использована в различных системах? а. Глобальные константы. б. Условная компиляция. в. Функции индивидуальных настроек. г. Декомпиляция. д. Ни один из перечисленных выше вариантов. 11. Какие вы знаете способы запуска кода VBA при открытии базы данных?
12. Назовите как минимум три причины для использования установочной про- граммы. 13. Перечислите основные вопросы, которые должны учитываться при проекти- ровании программы-мастера. 14. Назовите преимущества использования элемента управления вкладки в фор- ме мастера. 15. Верно ли, что в обычном мастере необходимы только такие кнопки навига- ции: Next (Далее), Back (Назад), Cancel (Отмена)? 16. Какое из следующих утверждений неверно? а. Кнопка Back (Назад) на последней странице мастера должна быть всегда отключена. б. Кнопка Finish (Готово) отключена на всех страницах, кроме последней. в. Кнопка Forward (Далее) всегда отключена на последней странице. г. Кнопка Forward (Далее) может быть отключена для разных страниц масте- ра, в зависимости от того, заполнил ли пользователь всю необходимую информацию на определенной странице. д. Кнопка Cancel (Отмена) всегда активна. 17. Верно ли, что надстройка Access — это компонент, который не является ча- стью основного продукта Microsoft Access? 18. Назовите как минимум пять примеров надстроек, предоставленных в составе Access. 19. Какое файловое расширение используется для надстроек Access? а. . MDB б. . MDE в. .MDA г. . ADE д. Все перечисленные выше. 20. Какая ветка реестров используется для мастеров?
Урок 27, Программира^ни^^ файлов.... . J — -- - - — - -~. Урок 28«-'~- •' - Обеспечение зашитыбалдонных-........... ~. " ACCeSS ........._Z.SS^i=-- ---"“:;'-":rSF~...----•~^==... ... ;^== :^-::r:r::^ УрОК 29- : ^^:---- -:— ;—--------------------------------------------------------------------------------------------------------------------------------------------------------— ....................................................................................................... +- ' ...................... ..............................~'T=.....................................
УРОК Программирование и использование присоединенных файлов Содержание урока Определение связанных таблиц «✓ Использование связанных таблиц Применение инструментов, пр ед оставленных Асе ess ✓ Анализ средств программирования ADO для связанных таблиц ✓ Создание простой формы — менеджера присоединенных таблиц В этом уроке вы научитесь делить базу данных на две части: клиентскую и сер- верную. Связь между этими двумя составляющими базы данных осуществляется с помощью присоединенных, или связанных таблиц. Вы научитесь работать с этим видом связи, а также изучите функции, доступные для обработки соеди- нения в VBA. Файловые вложения В Access вложенные (присоединенные) таблицы называют связанными таб- лицами (linked tables). Связи позволяют прочитать, а в некоторых случаях и об- новить данные во внешнем источнике данных, при этом не выполняя импорт данных. Формат внешнего источника данных не меняется, поэтому можно про- должать использовать файл в программе, в которой он был изначально создан, а кроме того, добавлять, удалять или редактировать данные в нем с помощью Microsoft Access. Эти внешние источники данных могут быть представлены не
только другими файлами Access . mdb, но и файлами Access . adp, . mdw, . mda и .mde. Помимо Access, можно устанавливать связи с Excel, текстовыми файла- ми, Outlook, Exchange, Paradox, HTML, dBASE, SQL Server, источниками дан- ных ODBC и Sharepoint Team Services. Разработчики приложений обычно хранят таблицы данных в отдельном от программы файле. Такой прием работы называют клиент-серверным приложе- нием (front end/back end application). Данный метод имеет ряд преимуществ. Файлами данных лучше управлять на сервере, тогда как клиентское прило- жение эффективнее работает на компьютере пользователя. Это позволяет обеспечить совместный доступ к приложению нескольких пользователей, осуществить репликацию, резервной копирование, защиту данных и т.д. • • Большие базы данных должны обрабатываться более мощной системой управления базами данных: SQLServer, а не Microsoft Access. • Данный прием уменьшает сетевой трафик и увеличивает эффективность работы приложения. I. j • Отдельные файлы делают возможной независимую поддержку клиентско- го приложения. На рис. 27.1 показан типичный пример конфигурации связанных таблиц в при- ложении. На этом рисунке изображено шесть разных соединений. Количество соеди- нений может быть разным. На рисунке представлено три разных источника данных; они могут отличаться друг от друга, поскольку находятся на разных серверах, отно- сятся к разным данным, существуют в различных типах файлов или могут быть раз- делены в соответствии с правами пользователей. Кроме того, на рисунке показан ис- точник защиты данных. Эта база данных может содержать секретную информацию относительно безопасности данных приложения, что делает необходимым отделение этой информации от остальных данных. Кроме того, в приложении может существо- вать отдельная архивная база данных, в которой хранится вся история записей. Эти записи не должны изменяться, поэтому для такой базы данных нечасто выполняется резервное копирование. Архивные данные запрашиваются очень редко, обычно они являются доступными только для чтения. I Еще один тип присоединенной базы данных — это данные конфигурации про- граммы. В этой базе данных хранятся такие элементы, как индивидуальные на- стройки и параметры программы. Они предоставляют администратору опреде- ленный контроль над клиентским приложением, не требуя изменения програм- мы или объектов в приложении.
Принципы связывания таблиц Обычно связь с таблицей из другой базы данных устанавливается с помощью команды Файл*=>Внешние данные^Связь с таблицами (File^Get External Data1^ Link Tables). Можно также создать связь, выбрав Таблицы (Tables) в окне базы данных и щелкнув на кнопке Создать (New), а затем указав способ создания таб- лицы Связь с таблицами (Link Table). На экране будет отображено диалоговое окно Связь (File Link), где следует вы- брать необходимый файл. Вы можете задать связь с файлом данных Access или файлом другого типа. Типы источников данных, с которыми можно устанавли- вать связь, зависят от драйверов, установленных в Access. Если в диалоговом ок- не отсутствует необходимый источник данных, запустите еще раз программу ус- тановки Access и доустановите недостающие драйверы. В зависимости от типа файла, выбранного в диалоговом окне Связь, отобра- жается список таблиц, которые содержатся в выбранном файле. Вы можете вы- брать одну или несколько таблиц, которые должны быть присоединены к прило- жению. Access использует различные пиктограммы для связанных таблиц и таб- лиц, которые хранятся в текущей базе данных. В пиктограмме для присоединенного файла изображена стрелка вправо. Если удалить пиктограмму присоединенного файла, то будет удалена и ссылка на эту таблицу, а не сама внешняя таблица. Управление связями может оказаться довольно утомительным процессом, особенно при наличии большого количества таблиц и нескольких файлов дан- ных. Вы не ограничены единственным источником данных, поэтому таблицы могут быть взяты из нескольких разных источников. Возможна потеря связей, если присоединенный источник данных недоступен по ряду следующих причин. • Внешний источник данных был перемещен. • Не работает сервер, на котором находится внешний источник данных. • Не работает сеть. • Пользователь не обладает правами, необходимыми для доступа к внешне- му источнику данных. • Изменились названия совместно используемых ресурсов. Если происходит одна из перечисленных выше ошибок, необходимо обновить ссылки. Кроме того, часто требуется задать ссылку на другой файл данных (например, если для различных компаний или разных проектов используются разные наборы файлов данных). Чтобы выбрать другую компанию, следует пере- определить источник данных, который присоединяется к приложению. Средства Access Помимо мастера связей с таблицами (Table Link Wizard), Access предоставля- ет инструменты разделения баз данных (Database Splitter) и диспетчер связан- ных таблиц (Linked Table Manager). Менеджер связанных таблиц обеспечивает средства анализа ссылок, их об- новления или изменения. На рис. 27.2 показано, как запустить диспетчер свя- занных таблиц командой Сервис^ Служебные программы^Диспетчер связанных таблиц (Tools^Database Utilities1^Linked Table Manager). Интерфейс диспетчера связанных таблиц показан на рис. 27.3. Связанные таблицы перечислены вместе с другими источниками данных. Вы можете вы-
брать, какие таблицы следует обновить, и указать необходимость изменения пу- ти связанной таблицы. Рис. 27.2. Запуск диспетчера связанных таблиц Рис. 21.3. Интерфейс диспетчера связанных таблиц Диспетчер связанных таблиц хорошо работает для некоторых приложе- ний, но обладает рядом ограничений. С помощью собственной программы можно создать более совершенный менеджер присоединенных файлов, кото- рый будет обладать большими возможностями, чем диспетчер связанных таблиц Access. В этом уроке вы продолжите разработку мощного менеджера присоединенных файлов.
Э Вопросы программирования При работе со связанными таблицами в программе VBA используется две юТминут объектные модели ADO. • ActiveXData Obj ects2,7 (ADODB). • ADO Extensions2.7 для DDL и защиты данных (ADOX). Существуют разные версии ADODB и ADOX. На момент написания этой книги были известны версии с 2.0 по 2.7. Access может работать с различными версиями. Ре- комендуется использовать самую новую версию. ADODB позволяет работать с наборами записей, но не с определениями таб- лиц Access. Поэтому для обработки структур таблиц используется вторая мо- дель — ADOX. Указанные модели выполняют и другие функции, но основное внимание мы уделим тем из них, которые применяются для работы со связан- ными таблицами. Чтобы использовать в приложении средства ADOX, необходимо установить ссылку на библиотеку типов ADOX, в дополнение к ссылке на библиотеку ADODB, которая уже установлена (так как Access по умолчанию подключает эту библиоте- ку). Описание библиотеки ADOX — Microsoft ADO Ext. for DDL and Security. Имя файла библиотеки — Msadox. dll, а идентификатор программы — ADOX. Ссылки устанавливаются в редакторе VBA с помощью команды ToolS1^ References. При этом отображается диалоговое окно, показанное на рис. 27.4. Рис. 27.4. Диалоговое окно References Основы использования ADOX для определений таблиц можно проанализиро- вать с помощью функции, приведенной в листинге 27.1. Эта функция находится в модуле mod_JJtilityFunctions приложения Check Writer и выводит на печать список таблиц из окна Immediate в текущем файле .mdb вместе со свойствами каждой таблицы. Чтобы выполнить функцию непосредственно в окне программы Visual Basic, про- сто поместите курсор на код функции и нажмите <F5>. Обратите внимание, что данный прием не работает в модулях классов.
! Листинг 27.1. Функция Li st Tabi eProper ties () 1 Функция распечатывает список таблиц и их свойства из окна ’ Immediate с использованием объектов данных ADOX ActiveX Dim cat As New ADOX.Catalog Dim tbl As ADOX.Table Dim i As Integer cat.ActiveConnection = Currentproject.Connection For Each tbl In cat.Tables Debug.Print tbl.Name; Tab(20), tbl.Type For i = 0 To tbl.Properties.Count - 1 Debug.Print Tab(5); tbl.Properties.Item(i).Name, Tab(50); tbl.Properties.Item(i).Value Next End Function Каталог ADOX Анализируя листинг функции List Table Properties, необходимо сначала определить понятие каталога. Каталог (catalog) содержит коллекции таблиц, представления, данные пользователей, группы и процедуры. Они описывают структуру источника данных или, как ее иногда называют, схему (schema). Новый каталог ADOX можно создать путем объявления переменной как нового каталога ADOX, что представлено в операторе Dim cat As New ADOX. Catalog. Каталог обладает несколькими свойствами. Свойство ActiveConnection должно быть установлено на соединение текущего проекта. Соединения — это средства для взаимодействия приложения с источником данных. Оператор cat .ActiveConnection = Currentproject.Connection в примере устанав- ливает активное соединение для нового каталога на соединение в текущем проек- те. Объект Currentproject имеет несколько коллекций и свойств, которые со- держат специфические объекты в текущей базе данных Access. В данном случае свойство Connection возвращает ссылку на текущий объект Connection для ADO (объекты данных ActiveX) и соответствующие свойства этого объекта. Доступ к таблицам с помощью каталога . Каталог ADOX содержит коллекцию Tables. Каждая таблица в этой коллек- ции имеет такие объекты: Columns, DateCreated, DateModified, Indexes, Keys, Name, Parentcatalog, Properties и Type. Нас интересуют следующие объекты таблиц. • Name — имя таблицы. • Туре — тип таблицы; для связанных таблиц этот объект имеет значение ‘link. • Properties — коллекция свойств таблицы. Коллекция свойств таблицы Для каждой таблицы в коллекции Tables существует коллекция Proper- ties, которая содержит свойства данной таблицы. ADO получает доступ к дан- ным и услугам провайдеров OLE DB. Для Access это провайдер Jet OLEDB, по-
этому свойства являются функцией этого провайдера. Свойства включают сле- дующие элементы. • Temporary Table (Временная таблица). • Jet OLEDB:Table Validation Text (Текст проверки корректности таб- лицы). • Jet OLEDB:Table Validation Rule (Правило проверки корректности таблицы). • Jet OLEDB: Cache Tink Name/Password (Ссылка/пароль в кэш-памяти). • Jet OLEDB: Remote Table Name (Имя удаленной таблицы). • Jet OLEDB: Link Provider String (Имя провайдера). • Jet OLEDB: Link Datasource (Источникданных ссылки). • Jet OLEDB: Exclusive Link (Исключительная ссылка). • Jet OLEDB: Table Hidden in Access (Таблица, скрытая в Access). При выполнении функции, приведенной в листинге 27.1, вы увидите список таблиц базы данных с перечисленными выше свойствами. Назовем основные свойства, которые относятся к присоединенным таблицам. • Jet OLEDB: Remote Table Name. Содержит название таблицы в удален- ном источнике данных, • Jet OLEDB; Link Provider String. Строка, описывающая провайдер. Для данных Access это пустая строка. Для данных Excel свойство будет иметь значение вида Excel 5 .о;HDR=YES;1МЕХ=2; для данных dBASE это строка вида dBase 5.0; HDR=NO; IMEX=2 ;. Каждый провайдер имеет собственный формат и свои параметры. В этой строке могут также быть указаны регистрационное имя и пароль пользователя. • Jet OLEDB: Link Datasource. Путь и имя файла внешнего источника данных. Связанные таблицы Как вы уже знаете, можно вывести список таблиц в базе данных, а также об- ращаться к связанным таблицам и их свойствам. Кроме того, можно изменить источник данных для установленной ссылки. Этим приемам и посвящен данный раздел, так как при работе с базами данных часто возникает необходимость из- менить ссылку: обратиться к данным из другой папки, диска, сервера или даже из другого сетевого домена. Чтобы осуществить эти задачи, необходимо удалить связанную таблицу из каталога и определить новую ссылку. Для этого придется изучить несколько ме- тодов ADOX. Прежде, чем удалять таблицу, следует создать новый каталог (см. предыду- щий раздел). Затем установите соединение для этого активного каталога на со- единение текущего проекта; после чего выполните метод Delete Table, задав название удаляемой таблицы, и обновите коллекцию Tables. Все эти действия выполняет следующий фрагмент кода. Dim cat As New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection cat.Tables.Delete strNameOfTabieToBeDeleted cat.Tables.Refresh
После того, как таблица будет удалена из каталога и файла .mdb Access, необ- ходимо добавить новую связанную таблицу с тем же названием, но из другого ис- точника данных. Для выполнения этой задачи определите новую переменную каталога и новую переменную таблицы ADOX. 1. Установите активное соединение для нового каталога на соединение текущего проекта. 2. Определите родительский каталог новой таблицы как созданный только что каталог. 3. Укажите имя таблицы и задайте ее свойства. Свойства таблицы включают ис- точник данных, имя удаленной таблицы, строку с данными о провайдере. Ес- ли вы заново устанавливаете ссылку на ранее удаленную таблицу, то следует временно сохранить значения свойств из старой таблицы, чтобы их можно было использовать для новой таблицы. 4. Установите свойство Jet OLEDB.- Create Link на значение True. Таким об- разом вы устанавливаете ссылку при присоединении связанной таблицы к коллекции таблиц. 5. Присоедините новую таблицу к коллекции Tabi е s. Все эти действия выполнены в программе, приведенной в листинге 27.2. Листинг 27.2. Программа для установления связи с новой таблицей Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table cat.ActiveConnection = Currentproject.Connection Set tbl.Parentcatalog = cat tbl.Name = strTableName tbl.Properties ("Jet OLEDB:Link Datasource”) = strDataSource tbl.Properties("Jet OLEDB:Remote Table Name") = strRemoteTable tbl.Properties("Jet OLEDB:Link Provider String") = strProvider cat.Tables.Append tbl Set tbl = Nothing Если таблица, с которой вы устанавливаете связь, является таблицей Microsoft Access, то свойство Jet OLEDB: Link Provider string устанавливать не обязательно. Менеджер присоединенных файлов В этом разделе будет разработана форма, которая обеспечивает общие функ- ции, необходимые в приложении Check Writer. Форма называется Attachment Manager (Менеджер присоединенных файлов). Она предоставляет следующие функциональные возможности. • Работает с любым количеством присоединенных таблиц, связанных с од- ним источником данных. • Обеспечивает возможность работы с различными источниками данных (Access, dBase, Excel, ODBC). • Проверяет связанные таблицы при запуске приложения. Если ссылки корректны, программа открывает следующую форму приложения. Если же в ссылках есть ошибки, программа открывает форму менеджера при- соединенных файлов, чтобы пользователь мог выбрать новый файл.
Предоставляет интерфейс пользователя, позволяющий при выборе из ме- ню приложения изменить файл, к которому присоединены таблицы. Отображает текущие связанные таблицы и информацию о них. Отображает ошибки для каждой отдельной таблицы, если нарушены ссылки. Дизайн формы Форма frm_AttachmentManager— это одна форма (без подчиненных форм), которая использует только одну внешнюю функцию для вызова диалогового окна Open File (см. далее в этом уроке). Менеджер присоединенных файлов можно открыть прямо из окна контейнера баз данных или из программы VBA. Если менеджер открывается из программы VBA и при этом опущен аргумент стартовых параметров, форма проверяет теку- щие связанные таблицы на наличие ошибок. Если ошибок нет, форма менеджера присоединенных файлов сразу же закрывается. Пользователь даже не знает, что происходит. Затем программа открывает следующую форму приложения. Если в ссылках связанных таблиц найдена какая-либо ошибка, то форма становится видимой, уведомляет пользователя о проблеме и предлагает способ выбрать дру- гой файл для ссылки. Если менеджер присоединенных файлов открывается без строкового значения па- раметров запуска, то форма отображает текущее состояние таблиц и обеспечивает диалоговое окно, в котором пользователь может изменить файлы связанных таблиц. В основе визуального дизайна формы лежит главный элемент управления с тремя вкладками. Эти вкладки действуют следующим образом (рис. 27.5). Рис. 275. Форма менеджера присоединенных файлов в представлении Конструктор (Design) Страница 0: вкладка List of Currently Attached Tables (Список текущих свя- занных таблиц) содержит список под названием ListStatus; в нем пере- числены все связанные таблицы и информация о них.
• Страница!: вкладка Attach Table(s) to File (Присоединить таблицу(ы) к файлу) выводит сообщение для пользователя и предоставляет интерфейс для выбора нового файла. • Страница 2: вкладка List of Attached Tables and Errors (Список связанных таблиц и ошибок) содержит список под названием Err о г List; в нем пере- числены ошибки, связанные со ссылками на таблицы. Программа X Список на вкладке List of Curently Attached Tables заполняется с использованием 10минут ФУНКЦИИ Fill Li st. В свою очередь, эта функция вызывает функцию GetLinkedTables. # Текст программы для функции см. в модуле класса формы f rm__Attachment- Мападегбазы данных Checkwriter. mdb. I Функция GetLinkedTables получает информацию о коллекции таблиц ката- лога ADOX и записывает ее в массив, используемый в форме. В форме на самом деле применяется два массива. • LinkedTables: строковый массив с информацией о ссылках, по одной за- писи для каждой таблицы, где: LinkedTables (о, х) — название таблицы х, LinkedTables (1, х) — название удаленной таблицы для таблицы х, LinkedTables (2 , х) — источник данных для таблицы х, LinkedTables (3 , х) — строка с данными провайдера для таблицы х, LinkedTables (4 , х) — сообщение об ошибке для таблицы х, LinkedTables (5, х) — новый источник данных для таблицы х. • Linked Files: строковый массив присоединенных файлов, по одной запи- си на каждый файл, где: LinkedFiles (у) — источник данных у. Эти массивы имеют сферу действия Public по отношению к функциям и под процедурам формы и используются в некоторых из этих процедур. Еще до выполнения события открытия формы (Form Open) выполняются функции Fill Li st и GetLinkedTables, инициализируются массивы, и запол- няется список на странице 0 элемента управления с вкладками. Действия про- граммы, связанные с событием Form Open, показаны на диаграмме алгоритма (рис. 27.6). На форме расположено две кнопки: с помощью первой из них пользователь может вызвать диалоговое окно File Open, чтобы выбрать файл, который должен быть присоединен к базе данных; с помощью второй кнопки можно осуществить присоединение этого файла к базе данных. Подпроцедура cmdAttachFile Click () запускается, когда пользователь щелкает на кнопке Attach/Reattach. Данная функция проверяет, корректно ли выбранное пользователем имя файла, после чего помещает имя файла в массив LinkedTables, который используется функцией dbc AttachTable для уста- новки связей с таблицами. Функция dbc^AttachTable вызывается для каждой таблицы, которая должна быть присоединена к базе данных, и возвращает сооб- щение об ошибке в массиве LinkedTables, если обнаруживает проблемы со
ссылками. После того, как функция установит (или попытается установить) ссылки, проверяется логическая переменная LinkErrors. Если была найдена проблема, отображается вкладка ошибок, и список на этой вкладке заполняется с помощью функции Fill Err о г Li st. Если ошибок нет, то вы увидите вкладку List of Currently Attached Tables, а список будет обновлен данными о новых при- соединенных таблицах. После этого пользователь просто закрывает форму. Рис. 27.6. Обработка события Открытие формы (Form Open) для формы менеджера присоединенных файлов Так как основную часть работы выполняет функция dbc_AttachTable, мы рассмотрим листинг этой функции (листинг 27.3). Если вам понятен изложен-
ный выше материал, то легко сможете разобраться с операторами, которые ис- пользуются в этой функции. Листинг 2 7.3. Функция Attach Tabi в Public Function dbc^AttachedTable(strTable As String, strRemo- teTable As String, strProvider As String, StrDataSource As String) As String 1 функция связывает таблицы "strTable" и 11 strRemoteTable" ’ в файле "StrDataSource" с использованием провайдера "strProvider" Dim cat As New ADOX.Catalog Dim tbl As New ADOX.Table On Error GoTo ErrorHandler cat.ActiveConnection = Currentproject.Connection Set tbl.Parentcatalog = cat 1 добавить новую таблицу с суффиксом 1 tbl.Name = strTable & "1" tbl.Properties("Jet OLEDB:Link DataSource") = StrDataSource tbl.Properties("Jet OLEDB:Remote Table Name") = strRemo- teTable If strProvider <> "Access" Then tbl.Properties(" Jet OLEDB:Link Provider String") = strProvider End If tbl.Properties("Jet OLEDB:Create Link") « True cat.Tables.Append tbl cat.Tables.Refresh 1 новая таблица успешно присоединена, нужно удалить 1 старую таблицу и переименовать новую cat.Tables.Delete strTable tbl.Name = strTable cat.Tables,Refresh Set tbl = Nothing dbc_AttachTable = "" GoTo Done ErrorHandler: Select Case Err.Number Case 3011 dbc_AttachTable = "Таблица не найдена в ” & StrData- Source Case Else dbc^AttachTable = Err.Description End Select Done: End Function В форме Attachment Manager находятся и другие подпроцедуры. Подпроцедура ListStatuS—DblClickвыполняется при двойном щелчке на списке таблиц. Она отображает всю информацию о таблице в окне сообщения. Аналогичная функция
выполняется в процедуре ErrorListClick, когда пользователь щелкает на списке ошибок. Кнопка возле текстового поля Filename выполняет подпроцедуру, которая отображает диалоговое окно Open File. Фактически это действие осуществляет функция dbc_OpenFile, которая находится в модуле mod__FileUtilities, а функция dbc_OpenFile вызывает функцию API GetFilelnfo из библиотеки М sac cess . ехе. Функция отображает стандартное для приложений Office диало- говое окно Open и после выбора файла возвращает название файла и его путь. Последняя часть программы формы Attachment Manager выполняется в событии Form Unload. Эта подпроцедура срабатывает при закрытии формы (либо в программе, либо если пользователь щелкает на кнопке закрытия окна). Если форма была открыта не с помощью аргумента Startup (параметры запуска), то никаких действий не происходит. В противном случае, если существуют другие ошибки в ссылках, отображается вопрос, хочет ли пользователь выйти из прило- жения. Если пользователь отвечает Yes, то приложение закрывается; если No — форма остается открытой, пока не будут исправлены все нарушенные ссылки. Работа с формой Чтобы использовать форму Attachment Manager, необходимо сначала задать связи таблиц в Access с помощью команды Файл^Внешние данные^Связи с таблицами (File^Get External Data^Link Tables). В форме Attachment Manager можно изменить файлы, на которые указывают таблицы, а также обновить связи с внешними таблицами и определить ошибки в ссылках (если они есть). Открывая форму Attachment Manager в обычном режиме, вы увидите вкладку Attach Table(s) То File и диалоговое окно, которое отображает сообщение и запрос на новый файл (рис. 27.7). Рис, 27,7,Диалоговое окно Attachment Manager На этом этапе пользователь может просмотреть текущие присоединенные файлы, щелкнув на корешке вкладки List of Currently Attached Tables. Связанные таблицы отображаются так, как показано на рис. 27.8. Если в базе данных — несколько связанных файлов, отображается только вкладка List of Currently Attached Tables, кроме того, появляется окно сообщения There is more than one attached file. Cannot process (В базе данных несколько присоединенных файлов. Обработка невозможна). При двойном щелчке на конкретной таблице из списка открывается окно сообщения, в кото- ром приведена информация об этой таблице (рис. 27.9).
Рис, 27.8. Вкладка List of Currently Attached Tables r? Attachment Manager List of Currently Attached Tables | AttachTable($) to File I able Name jRemote Table Name I DataSource ||Type/Provider String* |tbl_P. ttil ’ • tbl BankAccount: tbl BankAccounts C:\Documents and Setting5\Larry\My Documents Access I tbl CheckWriter tbl_CheckWriter ; C:\Documents and 5ettings\Larry\My Documents Access rbl "□mp.jr,1. >Гцр \Г nt ,no .-tt - a । Ltr-njir^rrc1 Acr* Puc. 27.9. Просмотр информации о таблице Дополнительные возможности Форма Attachment Manager является хорошей отправной точкой для создания бо- лее сложной модели. Вы можете разработать дополнительные функции, например, возможность обрабатывать несколько присоединенных файлов, возможность автома- тической проверки текущего каталога в случае ошибок в ссылках, обеспечения схе- мы-дерева с группами таблиц и источниками данных, хранения истории присоеди- ненных файлов, выбора источников данных на основании сохраненного имени. Корпорация Database Creations, Inc. (www.databasecreations.coni) разра- ботала более сложный менеджер присоединенных файлов, который входит в со- став продукта EZ Developer Suite и может выполнять все перечисленные выше до- полнительные функции.
обзор В этом уроке вы изучили серверную и клиентскую архитектуру, а также узнали, Готово! какустановить соединение между этими двумя частями приложения с помощью присоединенных (связанных) таблиц. Кроме того, вы научились обрабатывать это соединение в программе с использованием объектов ADO. В данном уроке рассматривались следующие вопросы. • Связанная таблица представляет соединение с внешним источником данных. • Связанные таблицы используются для более эффективного управления данными, которые находятся отдельно от приложения клиента. Кроме то- го, они помогают улучшить эффективность работы приложения. • Функции программирования ADO для связанных таблиц основаны на библиотеке ADOX. Каталог ADOX используется для хранения определений таблиц и инфор- мации о связях. Проверьте себя 1. Какими причинами может быть вызвано нарушение ссылки на связанную таблицу? (См. раздел "Основные принципы связанных таблиц”.) 2. Какие две объектные модели ADO позволяют программисту работать со свя- занными таблицами? (См. раздел "Вопросы программирования”.) 3. Какое свойство провайдера Jet OLEDB содержит название таблицы из уда- ленного источника данных? (См. раздел "Коллекция свойств таблицы”.) 4. Назовите три аргумента в пользу использования формы Attachment Manager в приложении. (См. раздел "Менеджер присоединенных файлов”.) 5. Какие дополнительные функции обеспечивает менеджер присоединенных файлов Attachment Manager по сравнению с менеджером связанных таблиц Linked Table Manager? (См. раздел "Менеджер присоединенных файлов”.)

УРОК Обеспечение защиты баз данных Access Содержание урока v Средства защиты баз данных Access Защита данных на уровне общего доступа * Защита данных на уровне пользователя * Шифрование как средство защиты данных ✓ Другие вопросы защиты данных Оапа/юа 30 минут При проектировании приложения необходимо обязательно учитывать вопросы защиты приложения и данных, которые оно поддерживает. В этом уроке будут подробно рассмотрены средства защиты данных в программе. Мы предполагаем, что вы ужезнакомы с основными концепциями и интерфейсом пользователя для защиты данных в Access. Web ресурсы На сопровождающем сайте этой книги вы можете найти файл Security.MDB, который содержит текст всех программ, рассмотренных в данном уроке. Возможные средства безопасности Access предоставляет различные средства защиты базы данных: и простые функции, и более сложные средства. Выбранные для конкретного приложения средства защиты данных зависят от природы приложения, особенностей его ди- зайна и хранения данных, а также желаемого уровня безопасности.
Защита данных предполагает и защиту программы и защиту данных. Неко- торые методы защищают данные приложения; другие — предназначены для защиты программы. В табл. 28.1 представлены различные приемы и особенности методов обеих групп, а также предложены возможные комбинации методов, по- скольку можно использовать несколько методов одновременно. Таблица 28.1. Методы защиты баз данных Access Метод Степень защиты данных Степень за- щиты программы Комментарии Уровень совместного доступа Средняя Средняя Все пользователи имеют один и тот же пароль Уровень пользователя Хорошая Хорошая Можно контролировать доступ для отдельных пользователей Шифрование Хорошая Средняя Предотвращает чтение данных с использованием внешней про- граммы Файл . MDE Нет Лучшая Защищает весь код программы, но не данные Уровень совместного доступа и шифрование Хорошая Средняя Уровень пользователя и шифрование Лучшая Хорошая Файл . mde и шифрование Хорошая Лучшая Уровень совместного дос- тупа, шифрование и файл .mde Хорошая Лучшая Уровень пользователя, шифрование и файл .mde Лучшая Лучшая Обеспечивает лучшие возможно- сти относительно защиты данных и защиты программы В следующих разделах каждый метод будет рассмотрен отдельно. Мы опишем также реализацию этих методов с помощью программ VBA. Защита на уровне совместного доступа При использовании средств защиты на уровне совместного доступа база дан- ных Access защищается с помощью пароля. Чтобы открыть ее, пользователь должен указать правильный пароль. Для того чтобы открыть соединение с базой данных, используя пароль, необходимо задать пароль в методе Open соединения ADO, как показано ниже. Dim cnn As New ADODB. Connect ion cnn.Open 1,Provider=Microsof t. Jet .OLEDB.4.0; " & "Data Source=C:\nwind.mdb;Jet OLEDB:Database Password=password;" Чтобы изменить пароль базы данных, применяются не средства ADOX, обыч- но используемые для баз данных Jet, а объектная модель JRO. Объектная модель JRO (Jet and Replication Objects) содержит объекты, свойства и методы для соз- дания, изменения и синхронизации копий базы данных, а также средства для работы с паролями баз данных и другие возможности.
Ha В окне редактора Visual Bask должна быть установлена следующая ссылка HaJRO: "Microsoft Jet and Replication Objects 2.6 Library". В отличие от ADO и ADOX, средства JRO не используются с другими источ- никами данных (не Microsoft Jet). Изменить пароль можно только при сжатии базы данных. Ниже представлен текст программы, которая применяется для из- менения пароля базы данных. .. Dim je As New JRO.JetEngine j е. CompactDatabase "Data Source=C: \nwind.. mdb; ” , "Data Source=C:\nwind2.mdb;" & "Jet OLEDB:Database Password=newpassword" ' Прием изменения пароля базы данных, показанный в этом листинге, проиллюст- рирован в файле Security.mdb на сопровождающем Web-узле, в модуле mod_SecurityFunctions. Так как вы не можете сжать базу данных в тот же файл, сжатие выполняется с копией базы данных. Следовательно, необходимо написать программу для про- верки существования файла, требующего сжатия. Если такой файл существует, его следует удалить. После сжатия базы данных, можно удалить исходную базу данных и переименовать сжатую, задав ей исходное имя. Защита на уровне пользователя Модель безопасности Access состоит из рабочих групп, групп, пользователей и прав доступа. Информация о группах и пользователях содержится в файле рабо- чей группы с расширением .mdw. По умолчанию данный файл называется System.mdw, но это имя можно изменить. Следовательно, допускается работать с несколькими файлами рабочих групп, но только один файл может соответство- вать приложению в данном конкретном сеансе работы. Кроме того, только один файл рабочей группы используется несколькими приложениями. Информация о правах доступа хранится в файле базы данных Access. Этот файл включает присваивания прав доступа ц каждому объекту для группы или пользо- вателя. Права доступа могут содержать до восьми разных типов в зависимости от объекта, для которого осуществляется защита. На рис. 28.1 показано окно User and Group Permissions, в котором перечислены возможные права доступа. При проектировании приложения необходимо обеспечить систему безопасности с выделяющимся интерфейсом и функциями, отсутствующими в стандартном интер- фейсе защиты баз данных Access. Это особенно актуально для приложений, которые распространяются с использованием версии Access Runtime, поскольку в них вообще' не доступен стандартный интерфейс защиты баз данных Access. Пожалуй, одной из самых популярных функций защиты данных является возможность изменения па- роля пользователя. Ниже перечислены функции, которые наиболее часто использует администратор, обеспечивающий защиту данных. • Изменение пароля пользователя. • Добавление нового пользователя. • Определение пользователя в группу. • Удаление пользователя из группы. • Удаление пользователя.
Рис. 28.1. Окно Userand Group Permissions Кроме того, можно обеспечить возможность создания групп и присвоения прав доступа в программе. Так как были названы не самые популярные возможности ин- терфейсов защиты баз данных, а объем материала не позволяет рассмотреть все функции более подробно, эти средства в данном уроке не рассматриваются. Однако вы должны помнить о том, что, используя описанные в данном уроке приемы, можно включить в приложение и другие варианты защиты баз данных. Остало ,t> 20 минут Объекты ADOX для защиты баз данных Прежде чем переходить к разработке стандартных интерфейсов защиты баз дан- ных, необходимо рассмотреть объекты системы безопасности, с которыми вы будете работать. Объекты защиты баз данных содержатся в объектной модели ADOX, а не ADO. Объектная модель ADOX включает расширения модели ADO, специально предназначенные для обработки информации защиты данных. На рис. 28.2 модель проиллюстрирована графически. Рис. 282. Объектная модель АРЮХ для защиты баз данных В объекте Catalog находится две коллекции: Groups или Users. Они, в свою очередь, включают другие коллекции. Коллекция Groups содержит кол- лекцию Users, а коллекция Users — Groups. Такая перекрестная структура
обеспечивает возможность поиска пользователей, являющихся частью группы, и групп, в которые входит пользователь. Изменение пароля пользователя Для изменения пароля пользователя необходимы две стандартные функции. • Функция, позволяющая пользователю изменить свой пароль. • Функция, позволяющая администратору изменить дароль пользователя. В листинге 28.1 показана функция, которая выводит запрос для ввода нового пароля пользователем. Если операция завершается успешно, функция возвраща- ет значение True. Если происходит какая-либо ошибка, функция возвращает значение False. Листинг 28.1. Функция для изменения текущего пароля пользователя Public Function ChangecurrentPassword() As Boolean Dim cat As ADOX.Catalog Dim strOldPassword As String Dim strNewPassword As String Set cat = New ADOX.Catalog cat.ActiveConnection = Currentproject.Connection strOldPassword = InputBox("Введите старый пароль”, "Изменение пароля для " & Currentuser()) strNewPassword = InputBox(’’Введите новый пароль”, "Изменение пароля для ” & Currentuser()) If strNewPassword <> InputBox(’’Повторите ввод", __ "Изменение пароля для ” & Currentuser О ) MsgBox "Опмбка при вводе пароля" GoTo Done End If cat.Users(Currentuser()).ChangePassword strOldPassword, strNew- Pas sword ChangeCurrentPas sword = True MsgBox "Операция изменения пароля успешно завершена.” GoTo Done ErrorHandler: MsgBox Err.Description ChangeCurrentPassword = False Done: End Function Обратите внимание, что в данном случае используется функция Current- User (), которая возвращает текущее активное имя пользователя. Сначала соз- дается новый каталог ADOX с соединением текущего проекта. После этого функция отображает запрос на ввод старого пароля пользователя, а затем дваж- ды запрашивает новый пароль. Далее используется метод ChangePassword коллекции Users каталога, который изменяет пароль пользователя. Если все действия выполнены успешно, функция отображает уведомление об успешном завершении операции, после чего возвращает значение True в вызывающую программу. В листинге 28.2 функция не является интерактивной (т.е. в ней не используются функции InputBox), а ее параметры позволяют изменить любой пароль пользователя. Эта функция, как правило, должна использоваться в ре- жиме администратора.
Листинг 28.2. Функция для изменения пароля пользователя Public Function ChangePassword(strUserName As String, strOldPass- word As String, strNewPassword As String) As Boolean Dim cat As ADOX.Catalog Set cat = New ADOX.Catalog cat.ActiveConnection =CurrentProject.Connection cat.Users(strUserName).Changepassword strOldPassword, strNewPassword Change Password = True GoTo Done ErrorHandler: MsgBox Err.Description ChangePassword = False Done: End Function Добавление нового пользователя Функция, приведенная в листинге 28.3, добавляет в рабочую группу нового пользователя. Она имеет два обязательных параметра: имя пользователя и па- роль. Работает данная функция следующим образом: создается новый объект каталога и затем присоединяется к коллекции Users этого каталога имя пользо- вателя и пароль. Если функция выполняет все перечисленные выше действия без ошибок, то она возвращает значение True; в противном случае функция возвра- щает в вызывающую процедуру значение False, Листинг 28.3. Функция для добавления нового пользователя Public Function AddUser (strUserName As String, strPassword As String) As Boolean добавляет нового пользователя Dim cat As ADOX.Catalog On Error GoTo ErrorHandler Set cat = New ADOX.Catalog cat.ActiveConnection = Currentproject.Connection cat .Users .Append strUserName, strPassword AddUser = True GoTo Done ErrorHandler: MsgBox Err .Description AddUser = False Done: End Function Определение пользователя в группу Чтобы определить пользователя в одну из существующих групп, необходимо присоединить имя группы к коллекции Groups этого пользователя. В листин- ге 28.4 показан способ выполнения этой операции. Функция требует два обязательных аргумента: имя пользователя и группы, в которую должен быть
добавлен пользователь. Если функция выполняется без ошибок, она возвращает значение True. В противном случае функция возвращает в вызывающую проце- дуру значение False. Листинг 28.4. Функция для определения пользователя в группу Public Function AssignUserToGroup(strUserName As String, strGroupName As String) As Boolean ’ Добавляет пользователя в одну из существующих групп Dim cat As ADOX. Catalog * On Error GoTo ErrorHandler Set cat = New ADOX.Catalog cat.ActiveConnection = Currentproject.Connection cat.Users(strUserName).Groups.Append strGroupName AssignUserToGroup = True GoTo Done ErrorHandler: MsgBox Err.Description AssignUserToGroup = False Done: End Function Удаление пользователя из группы Процесс удаления пользователя из группы подобен добавлению пользова- теля: имя группы удаляется из коллекции Groups этого пользователя. В листинге 28.5 для работы с коллекцией Groups определенного пользовате- ля используется метод Delete. Если функция выполняется без ошибок, она возвращает значение True. В противном случае в вызывающую процедуру возвращается значение False. Листинг 28.5. Функция для удаления пользователя из группы Public Function RemoveUserFromGroup (strUserName As String, strGroupName As String) As Boolean 1 Удаляет пользователя из существующей группы Dim cat As ADOX.Catalog On Error GoTo ErrorHandler Set cat = New ADOX.Catalog cat.ActiveConnection = Currentproject.Connection cat.Users(strUserName).Groups.Delete strGroupName RemoveUserFromGroup = True GoTo Done ErrorHandler: MsgBox Err.Description RemoveUserFromGroup = False Done: End Function В листинге 28.6 показано, как можно удалить пользователя из рабочей груп- пы. Эта функция получает в качестве параметра имя пользователя, который
будет удален из рабочей группы. Как и для предыдущих функций, создается но- вый объект каталога с соединением с текущим проектом. Используя метод Delete для коллекции Users, можно удалить конкретного пользователя из группы. Если функция выполняется без ошибок, она возвращает значение True. В противном случае в вызывающую процедуру возвращается значение False. Листинг 28.6. Функция для удаления пользователя Public Function RemoveUser (strUserName As String) As Boolean Dim cat As ADOX.Catalog On Error GoTo ErrorHandler Set cat = New ADOX.Catalog cat.ActiveConnection = Currentproject.Connection cat.Users.Delete strUserName RemoveUser = True GoTo Done ErrorHandler: Z MsgBox Err.Description RemoveUser = False Done: End Function Открытие защищенной базы данных Если база данных защищена каким-либо методом безопасности, при ее от- крытии с использованием соединения ADODB требуется указать регистрационное имя пользователя и пароль. Dim cnn As New ADODB.Connection cnn.Provider = “Microsoft.Jet.OLEDB.4.0” cnn.Properties("Jet OLEDB:System Database") = ”c:\system.mdw") cnn.Open "Data Source=c:\northwind.mdb;User Id=Admin; Pa ssword=pas sword; •’ Свойство соединения Jet OLEDB; System database специфично для провай- дера Microsoft Jet, оно определяет файл рабочей группы. Прежде чем обращаться к свойствам провайдера из коллекции Properties, необходимо определить, ка- кой провайдер используется. Следовательно, сначала указывается провайдер, а затем можно определить свойство для файла рабочей группы. Наконец, можно открыть соединение с источником данных, именем пользователя и паролем. Осталось J0 минут Шифрование Несмотря на все результаты методов защиты на уровне совместного доступа или на уровне пользователя, файл .mdb все же можно открыть в текстовом редакторе и прочесть его содержимое как последовательность символов ASCII. Подобное действие может не представлять особой проблемы, если программа является обычной процедурой, однако файл .mdb иногда содержит секретные данные. Чтобы устранить данный пробел в системе безопасности, Access предоставляет средства шифрования, или кодировки (encrypting). При шифровании база дан-
ных Access сжимается и становится недоступной для дешифровки любой про- граммой, служебным дешифровщиком или текстовым редактором. Шифрование можно выполнить с помощью метода JRO сжатия базы данных. Dim je As New JRO.JetEngine je.CompactDatabase ”Provider=Microsoft.Jet.OLEDB.4.0;’’ & "Data SourcesC:\nwind.mdb", & *’Provider=Microsoft. Jet. OLEDB .4.0;” & "Data SourcesC: \nwind2 .mdb; ” & "Jet OLEDB:Encrypt DatabasesTrue” Перед выполнением таких преобразований базы данных, как шифрование или преобразование в формат . mde, всегда создавайте резервные копии. Метод шифрования создает сжатую копию исходной базы данных. В про- грамме следует обязательно выполнять проверку на наличие файла с таким именем. Кроме того, потребуется добавить код для присвоения файлу исходного имени после выполнения операции шифрования. Файл .МОЕ Один из вариантов защиты текста программы — записать программу в формате .mde. Как описано в уроке 24, файл .mde представляет собой копию файла .mdb, из которой удален весь исходный код; файл - mde содержит только скомпилирован- ную версию программы, что, очевидно, защищает программу, поскольку доступ к исходному тексту приложения невозможен. Данный метод делает невозможным переход в режим Конструктор (Design) для какого-либо объекта. Он не защищает данные, операцию открытия объекта или выполнение кода. Следовательно, этот метод представляет собой важное, но ограниченное средство защиты. Подробнее о файле .mdeсм. урок 24. Другие аспекты защиты приложения Помимо конкретных методов защиты приложения, встроенных в Microsoft Access, необходимо учесть и другие аспекты, чтобы обеспечить полную защиту приложения и его данных. Это средства безопасности файлов, сокрытие объектов базы данных от пользователя, отключение различных клавиш, которые предос- тавляют доступ к областям, запрещенным для пользователя. Файловая безопасность Даже если приняты все описанные выше меры безопасности, вам необходимо использовать защиту файлов на уровне операционной системы. В противном слу- чае любой человек, имеющий доступ к файлу базы данных, может просто использовать Windows для копирования, перемещения, замены или удаления файлов. Обязательно используйте методы защиты приложения и данных на уровне операционной системы. В системах Windows 95/98/МЕ особенных пара- метров защиты не существует. Для обеспечения эффективной системы безопасности необходимо использовать средства Windows NT/2000/XP. Подроб-
но о защите баз данных с использованием Windows в этой книге не рассказывает- ся, однако можно получить всю необходимую информацию по этому вопросу из книг на компьютерную тематику. Один из возможных источников — книга Сер- верная безопасность в Windows 2000 для чайников (Windows 2000 Server Security for Dummies). Сокрытие окна базы данных Удачным методом сохранения контроля над приложением и данными из Ac- cess является сокрытие окна базы данных. Данный метод осуществляется командой Сервис^Параметры запуска (Tools^Startup Options). В диалоговом ок- не Параметры запуска (рис. 28.3) находится флажок Окно базы данных (Display Database Window). Сняв этот флажок, вы скроете окно базы данных — в резуль- тате пользователи не смогут получать доступ к ее объектам. Конечно, существуют способы снова отобразить окно базы данных. Методы для отображе- ния скрытого окна базы данных и способы предотвращения этих действий описаны в следующих двух разделах. Рис. 28.3. Диалоговое окно Параметры запуска (Startup Options) StartupShowDBWindow — это свойство объекта базы данных, которое отвеча- ет за отображение окна базы данных при запуске приложения. Чтобы задать это свойство в программе, добавьте код, приведенный в листинге 28.7. Программа использует условие ошибки, чтобы определить, существует ли данное свойство. В строке, следующей за оператором On Error Resume Next, это свойство полу- чает значение False; но если свойство не существует, происходит ошибка 3270. В случае обнаружения данной ошибки свойство создается, и ему присваивается значение False. Листинг 28.7. Установка свойства StartupShowDBWindow Dim db As Object Dim prp As Property Set db = CurrentDb On Error Resume Next db. Properties (’'StartupShowDBWindow") = False If err.Number = 3270 Then ’ свойство не найдено Set prp = db.CreateProperty("StartupShowDBWindow", 1, False) db.Properties.Append prp End If
Пример формы frin_DatabaseSecurityStartupProperties в файле Security.mdb на сопровождающем Web-узле иллюстрирует методику измене- ния свойств базы данных (на основании процедур из листингов 28.7,28.8 и 28.9). Отключение клавиши Bypass При первом запуске приложения баз данных программа начинается с выпол- нения аргумента командной строки /х макрос, макроса AutoExec и/или начальной формы, установленной в свойствах базы данных. Если при запуске приложения удерживать нажатой клавишу <Shift>, эти действия будут пропуще- ны. В результате может нарушиться безопасность приложения, и пользователь получит доступ к тем объектам приложения, к которым получить не должен. Следовательно, устанавливая свойство AllowBypassKey на False, можно не до- пустить возможность отключения подобных действий с помощью удерживания клавиши <Shift>. Чтобы отключить клавишу Bypass, установите свойство Al- lowBypassKey равным False. В листинге 28.8 продемонстрировано выполнение этого действия. Обработка ошибок в данном листинге подобна аналогичной про- цедуре в листинге 28.7. Листинг 28.8. Установка свойства AllowBypassKey Dim db As Object Dim prp As Property Set db = CurrentDb On Error Resume Next db.Properties("AllowBypassKey”) = False If err.Number = 3270 Then ’ Свойство не найдено Set prp = db.CreateProperty("AllowBypassKey", 1, False) db.Properties.Append prp End If Отключение специальных клавиш Свойство AllowBypassKey может использоваться, чтобы предотвратить по- лучение пользователем доступа к приложению в противоречии с правилами безопасности приложения. Специальные клавиши перечислены в табл. 28.2. Код для отключения специальных клавиш приведен в листинге 28.9. В этой процеду- ре устанавливается (или добавляется, если оно еще не существует) свойство AllowSpecialKeys, как в предыдущих двух листингах. Таблица 28.2. Специальные клавиши______________________________________________ и Специальная комбина- Действие ция клавиш <Alt+Fl> (<F11>) <Ctrl+Fll> <Ctrl+Break > <Ctrl+G> Отображает окно базы данных Переключается между специальной панелью меню и встроенной панелью меню Прерывает выполнение программы Отображает окно Immediate
Листинг 28.9. Установка свойства Dim db As Object Dim prp As Property Set db = CurrentDb On Error Resume Next db.Properties("AllowSpecialKeys") = False If err.Number = 3270 Then 1 Свойство не найдено Set prp = db.CreateProperty("AllowSpecialKeys", 1, False) db.Properties.Append prp End If Все параметры чувствительны к порядку, более поздние переопределяют задан- ные ранее. Готово! Обзор В этом уроке речь шла о значении защиты баз данных, были описаны различные методы защиты приложения и данных. Кроме того, были представлены мате- риалы и примеры, иллюстрирующие применение методов защиты баз данных Access в программе. Этот урок включает следующие темы. Существует несколько методов защиты баз данных, каждый из которых имеет свои преимущества в зависимости от типа приложения, особенностей его ди- зайна, работающих с ним пользователей и способов хранения данных. Параметры безопасности предназначены для защиты программы иданных. При использовании защиты базы данных Access на уровне совместного досту- па база данных получает пароль, с которым работают все пользователи. Объект ADOX обеспечивает расширения для реализации защиты базы данных на уровне пользователя, а объект JRO предоставляет методы для реализации защиты на уровне совместного доступа. Шифрование базы данных защищает данные от чтения вне Access с помо- щью другой программы. Файлы . mde защищают прежде всего текст программы. Разработчик должен также рассмотреть другие средства защиты баз дан- ных. Среди них — файловая безопасность с позиции операционной системы, сокрытие окна базы данных, отключение клавиши Bypass, отключение других клавиш, которые могут нарушить безопасность приложения. Проверьте себя 1. Какой метод безопасности оптимален для защиты данных? (См. раздел "Возможные средства безопасности”.) 2. Какой метод безопасности оптимален для защиты и данных, и программы? (См. раздел "Возможные средства безопасности”.) 3. В каком файле хранятся права доступа? (См. "Защита на уровне пользователя”.) 4. Частью какого объекта являются коллекции Groups и Users? (См. раздел "Объекты ADOX для защиты баз данных”.)
5. Какие дополнительные меры предосторожности, кроме средств защиты баз данных, предоставленных Access, следует реализовать для обеспечения безо- пасности приложения? (См. раздел "Другие аспекты защиты приложения”.) 6. Какие результаты дает шифрование приложения? (См. раздел “Шифрование”.) 7. Какое свойство используется для отключения клавиши Bypass? (См. раздел "Отключение клавиши Bypass”.)

УРОК Access и клиент-серверные данные f Содержание урока * Понятие клиент-серверной архитектуры м* Понятие Microsoft Data Engine 2000 (MSDE 2000) ✓ Выбор необходимого механизма баз данных * Работа с базами данных Access и SQL Server * Перенос базы данных Access в SQL Server Осталось 30 минут При проектировании приложения баз данных следует учесть все необходимые для пользователей свойства текущей и будущей среды приложения. Приложение должно быть достаточно гибким, чтобы иметь возможность приспособиться к расширяющимся потребностям пользователей. Базы данных Access способны решить многие задачи в небольших рабочих группах. Однако для работы боль- шого количества пользователей или при обработке больших массивов данных не- обходим настоящий клиент-серверный механизм баз данных. Понятие клиент-серверной архитектуры В клиент-серверной вычислительной среде две или более сетевых рабочих станции могут иметь совместный доступ к централизованному источнику дан- ных. Приложение разделено на два компонента: клиентский (client, front-end) и серверный (server, back-end). Клиентский компонент обычно устанавливается на рабочей станции пользователя и включает функции интерфейса пользователя: кнопочные формы, формы, отчеты и пр. Серверный компонент, как правило, на- ходится на сетевом сервере, в нем хранятся только данные из базы данных. Сер- верная база данных выполняет функции, которые не видимы для пользователя:
передает данные в клиентскую часть приложения для отображения на форме или в отчете, получает обновленные данные от клиента, ограничивает доступ к дан- ным посредством методов защиты баз данных. Вы уже начали знакомство с клиент-серверной архитектурой, используя в приложении связанные таблицы Access. Однако среда баз данных Access — не настоящая клиент-серверная архитектура. Jet, механизм баз данных Access, на- зывают файл-серверным механизмом баз данных. Файл-серверные механизмы баз данных выполняют перемещение данных (клиент-сервер). Для выполнения запроса Access необходимо посредством Jet передать все данные таблиц, которые используются в запросе, на рабочую станцию клиента. После этого рабочая стан- ция клиента должна обработать запрос и выдать результат. Настоящие клиент-серверные механизмы выполняют не только функцию пе- реноса данных. При выполнении запроса или хранимой процедуры в клиент- серверной базе данных сервер обрабатывает запрос или процедуру. Затем он пе- ресылает результат клиенту, что не только уменьшает сетевой трафик, но и спо- собствует более эффективному использованию процессоров клиента и сервера. Microsoft Data Engine 2000 (MSDE 2000) — клиент-серверный механизм баз данных, который входит в состав Access 2003. Это уменьшенная версия Microsoft SQL Server 2000, оптимизированная для работы на персональном компьютере или в небольшой сетевой среде. л Понятие Microsoft Data Engine 2000 MSDE 2000 — удачное решение разработки приложения для рабочей груп- пы, состоящей в данный момент из нескольких пользователей, но которая в перспективе может вырасти до сотен или даже тысяч пользователей. MSDE 2000 спроектирован с использованием того же механизма баз данных, что и SQLServer2000. Базы данных, которые разрабатываются в MSDE 2000, скорее всего, можно будет прямо переносить в SQL Server 2000. MSDE 2000 на 100% совместим с SQL Server 2000, однако некоторые функции SQLServer в данном механизме отсутствуют. MSDE 2000 работает в операционных системах Windows NT 4.0, Windows 98, Windows 2000, Windows ME и Windows XP. Следовательно, вы можете устано- вить MSDE 2000 либо на сетевом сервере, либо даже на персональном компьюте- ре. MSDE2000 предоставляет возможности SQLServer 2000, обеспечивая такие функции, как создание журналов транзакций, восстановление баз данных, за- щиту баз данных и настоящую клиент-серверную распределенную обработку прямо на персональном компьютере. Если целевая группа приложения имеет большое количество пользователей или значительные объемы операций, вместо механизма MSDE 2000 необходи- мо использовать SQL Server 2000. Несмотря на то, что MSDE 2000 не имеет ог- раничений относительно количества одновременных пользователей приложе- ния, этот механизм оптимизирован для работы пяти пользователей. Сущест- вуют и другие ограничения: размер базы данных — не больше 2 Гбайт, возможность использовать не больше 2 процессоров и неспособность поддер- живать все функции репликации баз данных. 3 Основным аргументом в пользу работы с MSDE 2000 является то, что разра- ботчик не должен соединяться с SQL Server 2000 при создании приложения. И клиентскую часть приложения, и базу данных можно разработать с исполь- зованием Access и MSDE 2000. Серверную часть базы данных несложно перене- сти в SQLServer для тестирования пользователями, а впоследствии — для реа- лизации приложения.
Сравнение возможностей Jet и MSDE Так как MSDE 2000 предоставляет довольно мощные возможности для разра- ботки приложений, может показаться, что целесообразнее использовать его для всех приложений. Однако максимальная гибкость возможностей, как обычно, имеет свою цену — более высокая сложность работы. С базами данных Jet все просто — после установки Access необходимо лишь установить базу данных при- ложения, и Jet автоматически войдет в состав Access. Создание и поддержка баз данных MSDE 2000 — более сложные процессы, чем создание базы данных Jet. MSDE 2000 содержит некоторые автоматические функции динамического изменения конфигурации и восстановления системы после ошибок, но более крупные базы данных обычно должны быть сконфигури- рованы администратором баз данных. С другой стороны, поврежденные базы данных Jet зачастую восстановить невозможно. Необходимо проанализировать рабочую среду целевой группы пользователей, чтобы определить, какой механизм баз данных использовать в приложении. Ра- ботают ли в этой группе специалисты, которые умеют поддерживать такую сер- верную базу данных, как MSDE 2000? Сколько памяти и свободного места на диске доступно на рабочих станциях и на сервере? Требуется ли в приложении серьезная система безопасности для защиты секретных данных? Будет ли при- ложение использоваться большим количеством пользователей? С какими масси- вами данных приложение будет работать? Несмотря на то, что для баз данных Jet система безопасности не обязательна, MSDE 2000 требует обязательного внедрения защиты баз данных, аналогично параметрам безопасности Windows NT. Поэтому приложение MSDE 2000 требует достаточно квалифицированных сотрудников, которые смогут установить учет- ные записи пользователей и пароли. Для работы с MSDE 2000 необходим компьютер с процессором не ниже Pen- tium 166 МГц и оперативной памятью минимум 32 Мбайт (хотя рекомендуется работать с памятью 64 Мбайт и выше). Для обычной установки MSDE 2000 тре- буется приблизительно 45 Мбайт пространства на диске — 25 Мбайт для файлов программы и 20 Мбайт для файлов данных. Как правило, современные рабочие станции соответствуют этим требованиям. При желании можно хранить файлы программы и файлы данных на отдельных дисках. Помните, что для файлов ба- зы данных требуется дополнительное пространство. Если окажется, что пара- метры аппаратного обеспечения ближе к минимальным требованиям, то помни- те, что базы данных Jet обычно требуют меньшего объема памяти и пространст- ва, чем такие же базы данных, разработанные в MSDE 2000. В любой компьютерной системе, где установлено программное обеспечение Microsoft 2001 года (или новее), необходимо иметь в распоряжении мини- мум 128 Мбайт. В некоторых ситуациях точно определить количество потенциальных пользо- вателей и объем операций приложения невозможно. Если приложение будут ис- пользовать только несколько пользователей и оно будет работать с относительно небольшими объемами данных, оптимальным решением пока останется Jet. Access включает мастер Преобразование в формат SQL Server (Upsizing Wizard) для автоматического импорта базы данных Jet в MSDE 2000.
Осталось 20 минут Использование MSDE Прежде чем приступать к работе с базами данных MSDE 2000, запустите SQL Server Service Manager. Этот диспетчер управляет соединениями между прило- жениями и базами данных MSDE. Запуск SQL Server Service Manager Чтобы запустить SQL Server Service Manager, выберите Service Manager из папки MSDE в меню Пуск (Start). На экране появится окно SQL Server Service Manager (рис. 29.1). MSDE 2000 не устанавливается автоматически при установке Office 2003. Этот компонент можно установить вручную с компакт-диска Office 2003. Подробнее о выполнении установки см. документацию Office 2003. Чтобы установить соединение с базой данных MSDE 2000, выберите SQL Server for Services. Затем щелкните на кнопке Start/Continue, чтобы запустить этот раздел. По- сле запуска SQL Server Service рядом с сервером в SQL Service Service Manager поя- вится зеленая стрелка, а кнопки Pause и Stop станут активными. На рис. 29.2 пока- зан SQL Server Service Manager с работающей программой SQLServer. С работающим SQL Server Service Manager можно создать базы данных MSDE 2000 или установить с ними соединение. Создавая базу данных MSDE 2000 из Access, необходимо сначала создать проект Access. Понятие о проектах Проект Access можно использовать для создания и поддержки базы данных MSDE, а также для создания объектов интерфейса пользователя (форм, отчетов, страниц доступа к данным, макросов и модулей), которые получают данные из MSDE 2000. Окно базы данных проекта выглядит аналогично привычному окну базы данных Access. Создание объектов интерфейса пользователя практически не отличается от создания этих объектов в Access. На рис. 29.3 показано окно ба- зы данных нового проекта. Рис. 29.1. Запуск SQL Server Рис. 29.2. Запуск службы SQL Server Service Manager Несмотря на то, что объекты данных — таблицы, представления и хранимые про- цедуры — вы создаете в проекте, хранятся они в отдельной базе данных MSDE 2000 (. MDF). Файл MSDE 2000 создается автоматически при создании нового проекта
Рис. 29.3. Просмотр окна базы данных для проекта I Представления и хранимые процедуры можно сравнить с запросами Access. Пред- ZjgUy ставления — это запросы типа SELECT (на выбор данных). Хранимые процеду- ры — это запросы на выполнение действия или запросы с параметрами. Диаграм- мы баз данных подобны отношениям в базах данных Access. Создание проекта Чтобы создать проект Access, выполните следующие действия. 1. Запустите Microsoft Access, выберите команду Файл ^Создать (File^New) в меню Access. На экране появится панель задач Создание файла (New File), как на рис. 29.4. 2. В разделе Создание (New) выберите ссылку Проект с новыми данными (Project Using New Data). Появится диалоговое окно Файл новой базы данных (File New Database), представленное на рис. 29.5. 3. Выберите папку для нового проекта и введите MyCSProject в поле имени файла. Затем щелкните на кнопке Создать (Create). Появится окно Мастер баз данных Microsoft SQL Server (Microsoft SQL Server Database Wizard), как на рис. 29.6. 4. Введите в поле имени сервера (local). Установите флажок Доверительное соединение fUse Trusted Connection). Введите в поле имени базы данных MyCSProjectSQL. Затем щелкните на кнопке Далее (Next). На экране появит- ся последнее окно мастера (рис. 29.7). »Параметр (local) используется при создании базы данных MSDE 2000 на отдель- ном компьютере. Чтобы создать базу данных на сетевом сервере, выберите из списка имя сервера.
Рис. 29.4. Панель задач Создание файла 5. Щелкните на кнопке Готово (Finish). Мастер создаст новую базу данных MSDE 2000 и новый проект Access. На экране появится окно базы данных для нового проекта. Рис. 29.5. Диалоговое окно Файл новой базыданных Для создания новой базы данных MSDE 2000 и нового проекта Access может по- требоваться несколько минут.
Работа с данными в проекте немного отличается от работы с таблицами и за- просами в базе данных Access. Однако после некоторого знакомства с инструмен- тами конструктора данных проекта использовать их будет так же просто, как создавать таблицы и запросы в Access. Рис. 29,6, Мастер баз данных Microsoft SQL Server Рис. 29.7. Последнее окно мастера баз данных Microsoft SQL Server Создание таблицы Создание таблицы в проекте Access аналогично созданию таблицы в базе дан- ных Access. Чтобы создать новую таблицу, выполните следующие действия. 1. Выберите объект Таблицы (Tables) в контейнере баз данных. Затем выберите Создать таблицу в режиме конструктора (Create Table in Design View) в окне объекта Таблица. 2. Введите МуТаЫе в поле имени новой таблицы и щелкните на кнопке ОК. Бу- дет отображено представление Конструктор (Design) для новой таблицы. На рис. 29.8 показано представление Конструктор таблицы BankAccounts.
В представлении Конструктор таблица отображается в формате электронных таблиц. Первые два столбца — такие же, как для окна Конструктор в базе данных Access. В столбце Имя столбца (Column Name) введите названия полей таблицы. Второй столбец содержит типы данных для каждого поля. В столбце AllowNulls отображается флажок, который определяет, можно ли оставлять в поле значения Null. Как и в базе данных Access, для ввода информации, которая описывает предназначение поля, используется столбец Описание (Description). Остальные свойства, которые можно определить для каждого поля или имени столбца, ото- бражаются в окне Свойства (Properties) в нижней части конструктора таблиц. Рис. 29.8. Представление Конструктор для таблицы базы данных MSDE 2000 Создание таблиц и запросов для базы данных SQL Server может занять до- вольно много времени. При переносе существующей базы данных из Access MSDE 2000 или SQL Server начинать эту работу с нуля не нужно. Большую часть работы за вас выполнит специальный Мастер преобразования в формат SQL Server (Microsoft Access Upsizing Wizard). > Перенос базы данных в MSDE Существующую базу данных Microsoft Access (. MDB) можно конвертировать в WMuLym базу данных SQL Server автоматически, с помощью Мастера преобразования в формат SQL Server (Microsoft Access Upsizing Wizard). Этот мастер создает новую базу данных SQL Server и импортирует все таблицы базы данных
Access. Мастер импортирует структуры таблиц, индексы, правила проверки корректности данных, значения по умолчанию, автоматическую нумерацию, отношения и, конечно же, данные. В то же время структура новой базы дан- ных будет максимально соответствовать всем функциональным возможно- стям SQL Server. Кроме того, можно также преобразовать в новый проект Microsoft Access формы, отчеты, макросы и модули приложения. Перед преобразованием базы данных в новый формат создайте резервную копию базы данных Access. Ниже приведен пример, который преобразует базу данных CheckWriter. Для конвертации базы данных Access выполните следующие действия. 1. Откройте базу данных Access, которую вы хотите преобразовать. Запустите SQL Server Service Manager. 2. Выберите команду Сервис^Служебные программы^Преобразование в формат SQL Server (Tools^Database Utilities ^Upsizing Wizard). Будет отображено пер- вое окно мастера (рис. 29.9). Рис. 29.9. Мастер преобразования в формат SQL Server 3. Установите переключатель Создать базу данных (Create new database) и щелкните на кнопке Далее (Next). Появится второе окно мастера (рис. 29.10). 4. Это окно используется для определения информации о соединении для новой базы данных SQL Server. Введите в поле местонахождения сервера новой базы данных SQL Server текст (local). Установите флажок Доверительное соединение. Введите в поле имени новой базы данных Check WriterSQL. За- тем щелкните на кнопке Далее. 5. Следующее окно мастера (рис. 29.11) используется для выбора таблиц, кото- рые должны входить в новую базу данных. Щелкните на кнопке », чтобы выделить все таблицы в списке Имеющиеся таблицы (Available Tables). Затем щелкните на кнопке Далее.
^кажите qe - SQL Server для базы данных, (tecaf) Д Задайте код входа и пароль для учетной гаписи, обладающей правами CREATE DATABASE на сервере. 171 Доверительное соединение 'Отмена J < Цазад 11 Далне > г од Е){т»да: Пароль Задайте им» новой базы данных SQL Server. EeckWrlterSQL ZZZZZ Готово Рис. 29.10. СозданиеновойбазыданныхSQL Server Рис. 29.11. Выбор таблиц для новой базы данных SQL Server 6. В следующем окне мастера (рис. 29.12) можно выбрать из ряда представлен- ных возможностей SQL Server желаемые функции: индексы, правила провер- ки корректности данных, значения по умолчанию и пр. Установите требуе- мые флажки и щелкните на кнопке Далее, чтобы продолжить создание базы данных. 7. На рис. 29.13 представлено окно для создания нового проекта Access, кото- рый будет использоваться с базой данных SQL Server. Введите путь и имя файла нового проекта. Щелкните на кнопке Далее. 8. В последнем окне мастера (рис. 29.14) щелкните на кнопке Ротово (Finish). Для создания новой базы данных SQL Server и проекта Access необходимо не- сколько минут. Процесс продвижения преобразования базы данных отображает- ся в виде полосы состояния в специальном окне.
н*р преобразования в <|юрмп1 St 4 Snivel До .усквется преобразование в фор SQL Server не только данных, но и атрибутов таблиц. О рндексы ГР] правила проверки назначения Какие атрибуты таблиц следует преобразовать? О значения по умолчанию [5] с^язи таблиц ® ORI о триггеры Какие дополнительные данные нужно включить? I ’ Добавлять поля штампа времени в таблицы? Да, определяется мастером Отмена i <Ца-сд £ал< > i Г fneo Рис. 29.12. Выбор возможностей, предоставленных SQL Server Рис. 29,13. Создание проекта Access После завершения конверсии базы данных мастер отображает отчет мастера преобразования в формат SQL Server (пример такого отчета показан на рис. 29.15). В данном случае отчет содержит информацию о преобразовании базы данных Access и приложении, а также информацию об ошибках, которые про- изошли при выполнении этого процесса. Просмотрев эту информацию, закройте окно отчета. Мастер автоматически загрузит новый проект Access. Вы можете просмотреть отчет о процессе создания новой базы данных позже. Имя файла отчета— это имя файла приложения Access с расширением .snp (например, Checkwriter, snp). Когда на экране появится новый проект, просмотрите все новые объекты, соз- данные мастером. Может оказаться, что некоторые запросы Access не были кон- вертированы. Информация об ошибках, произошедших в ходе конвертации, на-
ходится в отчете Мастера преобразования в формат SQL Server. Для этих данных можно вручную создать представление или хранимую процедуру. -правка Отмена Рис. 29,14, Последнее окно мастера Рис. 29.15. Просмотр отчета мастера преобразования
На сопровождающем сайте этой книги можно найти версию приложения Check Writer для SQL Server, полученную из базы данных Access путем использования мастера преобразования в формат SQL Server. Проект называется Check- WriterCS.adp. Обзор С помощью Access и MSDE 2000 в приложении можно реализовать настоящую архитектуру клиент-серверной базы данных. MSDE 2000 обеспечивает практиче- ски все функциональные возможности и мощность SQL Server, но с базами дан- ных MSDE 2000 можно работать на персональной рабочей станции. В данном уроке были рассмотрены следующие вопросы. • Клиент-серверные базы данных обрабатывают запросы на сервере и пере- дают по сети в приложение только полученные результаты. • MSDE 2000 и SQL Server — это примеры настоящих клиент-серверных ме- ханизмов баз данных. • MSDE 2000— это уменьшенная версия SQL Server 2000, которая может использоваться на отдельном персональном компьютере или на сетевом сервере. • Jet — файл-серверный механизм баз данных, который предоставляет дос- таточные возможности для работы с небольшими базами данных и мень- шими объемами данных. • Проекты Access используются для работы с базами данных MSDE 2000. • С помощью мастера Мастера преобразования в формат SQL Server можно автоматически конвертировать базу данных Access в клиент-серверное приложение. Проверьте себя 1. Чем отличаются файл-серверные и клиент-серверные базы данных? (См. раздел "Понятие клиент-серверной архитектуры”.) 2. В каких операционных системах можно работать с MSDE 2000? (См. раздел "Понятие Microsoft Data Engine 2000”.) 3. Для какой рабочей среды Jet является оптимальным решением баз данных? (См. раздел "Сравнение возможностей Jet и MSDE”.) 4. Для чего предназначен SQL Server Service Manager? (См. раздел "Использование MSDE”.) 5. В каком типе файла хранятся таблицы, представления и хранимые процеду- ры проекта? (См. раздел "Понятие о проектах”.)

УРОК Создание запросов SQL Server Содержание урока у Проверка соединения SQL Server для проекта V Работа с запросами SQL Server ч/ Обработка данных с помощью хранимых процедур ✓ Использование определенных пользователем функций для выполнения вычислений Осталось 30 минут Из урока 29 вы узнали, как конвертировать базы данных Access в SQL Server и использовать проекты Access для работы с таблицами SQL Server. В этом уроке вы продолжите изучение данного материала. Речь пойдет об использо- вании проектов Access для создания запросов, которые получают и обраба- тывают данные SQL Server. Вы можете создать объекты данных SQLServer (таблицы и запросы) в проекте, однако эти объекты данных в действительности хранятся в отдельной базе данных MSDE 2000 (файл . MDF). Файл MSDE 2000 создается автоматически при конвертировании данных из файла Access . mdb или при создании нового проекта. Access предоставляет средства отображения названия файла базы данных для проекта. Проверка соединения базы данных проекта ~ Вы можете определить имя базы данных MSDE 2000, которая связана с текущим проектом, выбрав команду Файл ^Соединение (File ^Connection). Эта команда отображает диалоговое окно Свойства соединений (Data Link
Properties), представленное на рис. 30.1. В нем находятся свойства соедине- ния базы данных для текущего проекта. Рис. ЗОЛ. Определение соединения базы дан- ных проекта Свойства ссылок данных, показанные на рис. 30.1, — это свойства соедине- ния с базой данных CheckWriterDataSQL. Свойства для установления соединения с базой данных MSDE2000 описаны в уроке 29. Запросы в проекте Запросы в проекте Access используются так же, как и запросы в базе данных Access: для просмотра, изменения, добавления или удаления данных. Проекты предоставляют три типа запросов для работы с данными. • Представления (views). • Хранимые процедуры (stored procedures). • Определенные пользователем функции (user-defined functions). Создание представления Представления подобны запросам в базах данных Access. С представле- ниями можно работать в конструкторе запросов (Query Designer), который напоминает окно конструктора в Access. Представления используются для получения строк данных из одной или нескольких таблиц. Представление можно применить в качестве источника записей для формы или как источ-
ники строк для комбинированного списка. Чтобы создать представление, выполните следующие действия. 1. Выберите объект Запросы (Queries) в окне базы данных, затем выберите ко- манду Создание запроса в режиме конструктора (Create View in Designer). От- кроется Конструктор запросов (Query Designer). 2. Чтобы добавить таблицу в конструктор запросов, щелкните правой кнопкой мыши в окне Конструктор запросов и выполните в контекстном меню команду Добавить таблицу (Add Table). В окне Добавление таблицы (Add Table) выбе- рите одну или несколько таблиц и щелкните на кнопке Добавить (Add), чтобы поместить таблицы в окно конструктора. 3. Выберите столбцы и введите критерии выбора, как при проектировании за- просов в базе данных Access. На рис. 30.2 показано представление vwBankAccountList в окне конструктора запросов. Нижняя область окна конструктора запросов (с сеткой) используется по- добно аналогичной области в запросе Access. Однако в данном случае строки и столбцы поменялись местами, т.е. названия столбцов, которые включаются в за- прос, перечислены в таблице как строки. Название таблицы и критерий для каж- дого столбца отображаются как столбцы для каждого названия столбца. • Рис. 30.2. Работа с конструктором запросов Представление нельзя использовать для выполнения запросов на действие Access — UPDATE, INSERT или APPEND. Для этих типов запросов применяются хранимые процедуры.
Осталось 20 минут Создание хранимых процедур Хранимая процедура (stored procedure) представляет собой специальный тип за- проса, который позволяет использовать команды, обновляющие данные в базе данных. Создание хранимой процедуры больше напоминает написание процеду- ры Visual Basic, чем создание представления или запроса. Чтобы создать храни- мую процедуру, сначала перейдите на вкладку Запросы в контейнере баз данных. Затем выберите Создание запроса в режиме конструктора (Create View in Designer). Конструктор запросов используется для хранимой процедуры и для создания представления одинаково. Окно Конструктор для хранимой процедуры spBankAccountsAlphabet! zed показано на рис. 30.3. Рис. 30.3. Работа с хранимыми процедурами t Хранимая процедура spBankAccountsAlphabetized содержит те же табли- цы, столбцы и критерии, что и представление vwBankAccountListing. Разница состоит лишь в том, что процедура spBankAccountsAlphabetized определяет порядок сортировки в столбце BankName. Вы можете определить порядок сортировки для столбца в представлении. Одна- ко чтобы отсортировать представление, необходимо использовать условие ТОР 100 PERCENT с оператором Select. При добавлении порядка сортировки (Sort Order) в представление Access автоматически включает условие ТОР 100 PERCENT в оператор Select. Условие ТОР ухудшает эффективность работы, поскольку приводит к тому, что сортировка выполняется на машине клиента, а не на сервере. Условие ТОР не обязательно для сортировки запросов Select в хранимой процедуре. Сервер выполняет сортировку данных хранимых процедур.
В хранимую процедуру можно добавить представление. При работе с графическими инструментами конструктора запросов для созда- ния хранимой процедуры Access преобразует ваши действия в язык программи- рования Transact-SQL. Команды Transact-SQL — это команды, которые действи- тельно выполняет SQL Server при выполнении запроса. Вы можете просмотреть программу Transact-SQL для хранимой процедуры, выбрав команду Вид^Режим SQL (View^SQL View) из меню конструктора запросов. На рис. 30.4 показано представление SQL для хранимой процедуры. pH ihkA< t «Н1П1 >Л1|г1ъИн>11 >м| «о |МН('Н11'1Я крон.» — П X ’U • **1^ *1 I f W II— 4=11 tWWVIbV4 AS SELECT BankAccountNumber, Type, BankName FROM dbo.tbl .BankAccounts ORDER BY BankName Puc. 30.4. Просмотр представления SQL для хранимой процедуры Вносить изменения в хранимую процедуру можно либо в представлении Конструктор, либо в представлении SQL. При работе с хранимой процедурой до- пускается переключаться между режимами разных представлений. Работая в окне представления SQL, вы вернетесь в режим Конструктор, если выберете ко- манду Вид Ф Режим конструктора (View^ Design View). Все изменения, внесенные в запрос в представлении SQL, отображаются в представлении Конструктор, а все изменения в запросе окна представления Конструктор немедленно обновляются в окне представления SQL. Если вы имеете опыт разработки хранимых процедур, можно создать новую хра- нимую процедуру непосредственно в окне SQL Чтобы выполнить хранимую процедуру с различными значениями критериев для каждого запуска процедуры, следует добавить параметр в критерии храни- мой процедуры. Параметр — это определенная величина, обозначающая крите- рий столбца. Например, вам необходимо получить все чеки за определенный пе- риод. Однако в одном случае это будут чеки за январь 2000 года, а в другом слу- чае — чеки за декабрь 2000 г. В хранимой процедуре spchecksIssuedReport используются параметры ®begindate и ©enddate (рис. 30.5). Хранимая процедура spchecksIssuedReport получает два параметра дат: ©begindate и ©enddate и представляет собой просто оператор SELECT, который выбирает все поля из таблицы tbl__CheckWriter для диапазона дат, определен- ного этими параметрами. В представлении параметры не используются.
Рис, 30.5. Создание хранимой процедуры с параметром Осталось 1 о минут Создание пользовательских функций Определенные пользователем функции (user-defined functions) сочетают лучшие черты представлений и хранимых процедур в одном запросе. В пользовательские функции разрешено передавать параметры. Кроме того, эти функции могут включать представления, хранимые процедуры или другие функции. Опреде- ленные пользователем функции нельзя использовать для обновления, вставки или удаления данных в базе данных. Чтобы создать функцию, выберите объект Запросы и используйте команду Создать функцию в режиме конструктора (Create Function in designer ). Откроется окно Конструктор запросов (Query Designer). Вы можете добавить в новую функцию табли- цу, представление или другую функцию, выбрав соответствующий элемент из списка таблиц, представлений и функций в окне Добавление таблицы (Add Table). На рис. 30.6 показано представление SQL для функции fnChecklssuedDateR- ange. Функция fnChecklssuedDateRange возвращает доступную информацию о чеках, выданных в рамках заданного диапазона дат. Переменные дат ©begindate и ©enddate содержат начальную и конечную даты для диапазона дат, переданного в функцию вызывающей программой. Оператор RETURNS TABLE показывает, что функция возвращает таблицу данных, содержащую одну или более записей. Опера- тор RETURN содержит один оператор SQL. При выполнении функция осуществляет запрос, указанный в операторе SELECT. Оператор SELECT получает строку или строки данных из базы данных. Таблица, которая является результатом выполнения опера- тора SELECT, становится значением RETURN для функции. По существу, определенная пользователем функция представляет собой упрощенную версию хранимой процедуры. Если запрос должен получать один или несколько параметров и возвращать одно значение или одну таблицу, то для этого запроса необходимо использовать определенную пользователем функцию,
а не хранимую процедуру. Хранимые процедуры предназначены для выполне- ния более сложных операторов запроса: нескольких операторов SELECT, обнов- ления таблиц или нескольких наборов результатов. “ fn< ( uf функция ALTER FUNCTION dboJnChedSisSuedDateRange ©begindate datetime, ld< lie. datetime) RETURNS TABLE AS RETURN ( SELECT dbo.tbl CheckWriter. *| FROM dbo.tbljCheckWriter WHERE (CheckDate BETWEEN ©begindate AND ©enddate)) Puc, 30.6. Создание пользовательской функции Готоео! Обзор Используя Access и MSDE 2000, можно реализовать настоящие клиент- серверные приложения баз данных. MSDE 2000 обеспечивает практически все функции и возможности SQL Server, при этом с ним можно работать на персо- нальном компьютере. В данном уроке рассматривались следующие вопросы. • Проекты Access используются для работы с базами данных MSDE 2000. • Представления и хранимые процедуры SQL Server подобны запросам Access. • Представления и определенные пользователем функции могут получать, но не обновлять данные. • Хранимые процедуры и определенные пользователем функции могут по- лучать параметры. Проверьте себя 1. В каком типе файла хранятся таблицы, запросы и диаграммы баз данных проекта? (См. раздел "Запросы в проекте”.) 2. Какой тип объекта используется для обновления базы данных: представле- ние, определенная пользователем функция или хранимая процедура? (См. раздел "Создание представления”.) 3. Как определить, к какой базе данных присоединен проект? (См. раздел "Проверка соединения базы данных проекта”.) 4. Верно ли, что при необходимости отсортировать результаты запроса исполь- зуется представление? (См. раздел "Создание хранимых процедур”.)
ЧАСТЬ Воскресенье. День. Обзор -1 1. Назовите как минимум две причины, которые приводят к нарушению ссылок в базе данных. 2. Верно ли, что ADODB используется для работы с определениями таблиц Access? 3. Какой из следующих операторов применяется для создания нового объекта каталога? a. Dim cat As ADO.catalog 6. Dim cat As New ADO.catalog в. Dim cat As New ADOX.catalog Г. Dim cat As ADOX.catalog Д. Dim cat As New ADODB. catalog 4. Какая строка кода должна использоваться для установления нового объекта каталога на текущее соединение базы данных? 5. Верно ли, что Excel может использоваться как источник для связанной таблицы? 6. Назовите четыре метода защиты программы приложения. 7. Верно ли, что объекты безопасности содержатся в объектной модели ADOX? 8. Какое (какие) из следующих утверждений о шифровании в Access верны? а. Шифрование осуществляется с использованием метода сжатия баз данных JRO. б. Для дешифрования необходим пароль. в. Шифрование не защищает базу данных от чтения с помощью служебной программы. г. Шифрование использует объектную модель ADOX. д. Ни одно из перечисленных утверждений не верно. 9. Назовите методы, кроме средств безопасности Access, которые могут защи- тить приложение от несанкционированного использования. 10. Верно ли, что AllowBypassKey — это свойство объекта Application Access? 11. В каком типе архитектуры несколько сетевых рабочих станций могут иметь совместный доступ к централизованному источнику данных? 12. Верно ли, что Access является хорошим примером настоящей клиент- серверной среды? 13. Какой механизм баз данных перемещает данные между сервером и рабочей станцией?
14. Какой максимальный размер может иметь база данных в механизме MSDE 2000? 15. Верно ли, что объекты данных в базе данных MSDE 2000 хранятся в файле .mdb? 16. Какой из перечисленных объектов не является объектом MSDE 2000? a. Table б. Stored Procedure В«View I г. Query 17. Какая среда из перечисленных ниже больше подходит для разработки при- ложения с помощью MSDE 2000? а. Десять или более одновременных пользователей и большие объемы обнов- лений. б. В рабочей среде есть база данных SQL Server 2000, и вы являетесь внеш- ним разработчиком. в. Пять или менее одновременных пользователей и незначительные объемы обновлений. г. Рабочая среда состоит из устаревших рабочих станций с небольшим объе- мом памяти и минимальным пространством жесткого диска. 18. Какую из этих операций можно выполнить с помощью представления? a. INSERT б. UPDATE 4 В. SELECT г. Ни одну из перечисленных выше. 19. Какой тип запроса следует использовать, чтобы эффективно отсортировать результаты запроса SQL Server? 20. Верно ли, что определенная пользователем функция SQL Server может при- меняться для обновления данных?

Приложение В этом приложении даются ответы на вопросы, приведенные в конце каждой части книги. Ответы на вопросы к части "Пятница. Вечер" 1. Системы управления базами данных предоставляют возможность создавать таблицы, устанавливать связи между ними, а также хранить данные. 2. Окно редактора Visual Basic в Access 2003 представляет собой отдельную программу. 3. Существует два типа процедур: подпрограммы и функции. Их отличие состо- ит в том, что функция возвращает значение в вызывающую процедуру, а подпрограмма — нет. 4. Visual Basic for Applications (VBA) — это язык, используемый в модулях Microsoft Access. Jet — это стандартный механизм баз данных, который применяется для хранения таблиц данных в Microsoft Access и Visual Basic. Microsoft Database Engine (MSDE) — сокращенная версия SQL Server, которая может использоваться как альтернатива Jet. 5. Неверно. 6. г. 7. Auto List Members. 8. б. 9. Общий дизайн, подробный дизайн, программирование и документация, тес- тирование и отладка. 10. Компиляция проверяет программу на наличие синтаксических ошибок и преобразует некоторые ссылки. При компиляции программа преобразуется в форму, понятную для компьютера, что позволяет значительно ускорить вы- полнение программ. Кроме того, после компиляции программы необходимо сжать базу данных. 11. Окна Immediate, Locals и Watches. 12. Точка прерывания останавливает программу, когда выполнение доходит до конкретной строки кода. Контрольное выражение устанавливается пользо- вателем и останавливает программу, когда конкретная переменная или эле- мент управления достигают установленного значения. 13. На листе свойств (Property). 14. Неверно.
15. a. 16. в. 17. Dim. 18. Если в начале каждого модуля используется оператор Option Explicit и все переменные в программе объявлены, Access выполняет программу VBA гораздо быстрее. 19. Ключевые слова Public или Global определяют переменную в рамках всей программы, а ключевое слово Private ограничивает сферу действия пере- менной одной процедурой. 20. а, г. Типа Text не существует, а текстовые переменные имеют тип String. Number не является типом числовых данных Visual Basic, для чисел сущест- вуют типы данных Integer, Currency, Long, Single и Double. Ответы на вопросы к части "Суббота. Утро" 1. Логические конструкции — это определенный класс операторов VBA, кото- рые управляют способом работы программы. Обычно программа выполняет операторы поочередно, в порядке их появления. Логические конструкции используются для изменения порядка выполнения операторов. 2. Логические конструкции включают условные выражения (If-Then-Else, Select Case) и циклы (Do While, For Next). 3. Вложение встречается при размещении одного оператора If-Then-Else в теле другого оператора If-Then-Else и позволяет создавать сложные булевы выражения. 4. При использовании оператора Do Until код выполняется по крайней мере один раз, поскольку условие для выхода из цикла выполняется в конце его прохожде- ния. Цикл Do While выполняется до тех пор, пока условие истинно. 5. Верно. 6. Функция. 7. г. 8. в. 9. г. 10. Верно. 11. б. 12. Выберите файл для открытия. 13. в. 14. Неверно. 15. Набор записей. 16. Неверно. 17. Неверно. 18. Пессимистическое блокирование. 19. а. 20. в.
Ответы на вопросы к части "Суббота. День" 1. Верно. 2. Неверно. 3. Неверно. ' 4. Неверно. 5. д. 6. Неверно. Для несвязанных форм необходимо специально разрабатывать к функ- ции, которые для связанных форм создаются Access автоматически, включая блокирование записей, и функции соединения формы с источником данных. 7. В несвязанную форму требуется включить следующие функции: соединение с источником записей, поиск/выбор записи из источника записей, загрузка элементов управления на форме с данными, получение записи (записей), ре- дактирование записи, сохранение записи, удаление записи, перемещение между записями (например, переход к первой записи, последней записи, следующей или предыдущей записи), отмена изменений, которые были вне- сены в запись (до ее сохранения). 8. Использование несвязанных форм имеет следующие недостатки: для дублирова- ния функциональных возможностей связанных форм придется потратить немало времени на программирование; кроме того, сложно сделать непрерывные формы или представление листа данных, тогда как в связанной форме это выполнить очень просто. 9. Отдельный флажок может находиться в одном из трех состояний: True, False или Null. В ситуации, когда пользователь должен выбрать одно из большего числа значений, рекомендуется использовать группу переключате- лей. В группе переключателей можно предоставить больше трех значений для выбора. 10. Неверно. В поле со списком можно выбирать только одно значение. Множест- венный выбор возможен в обычном списке. Это объясняется природой элементов управления: в поле со списком отображается только один элемент, а в обычном списке можно отобразить несколько строк записей или элементов. 11. б, д, е, ж. См. урок 13. 12. г. Помните, что для правильного использования события Not In List необхо- димо установить свойство Limit То List равным No. Тогда все записи, которые вводит пользователь и которые отсутствуют в списке, будут вызывать код из со- бытия Not In List. Если установить свойство Limit То List равным Yes, то при вводе записей, отсутствующих в списке, будет отображаться сообщение об ошибке до тех пор, пока вы не выберете элемент из списка. 13. Формы (forms), листы данных (datasheets) и непрерывные формы (continuous forms). 14. Неверно. Субформа может быть не связана с главной формой. 15. Непрерывная форма позволяет форматировать все строки и столбцы и ис- пользовать для каждого столбца любой элемент управления, тогда как лист данных почти не обеспечивает контроль над отображением информации. 16. Link Child Fields и Link Master Fields. 17. Элемент управления с вкладками применяется в нескольких целях. Например, чтобы придать программе классический вид Windows-приложения. Сточки зре-
ния логики, вкладки используются для разделения данных или элементов управления на группы по смыслу или функциям. Кроме того, использование вкладок может объясняться физическими ограничениями рабочего пространст- ва — элементы с вкладками позволяют сэкономить место. 18. в. При каждом переходе с одной вкладки на другую срабатывает событие On Change. Это событие может быть довольно полезным, поскольку позволяет обработать все изменения на вкладках в одном событии. Вы имеете возмож- ность написать программу, которая выполняется в событии On Change для каждой отдельной вкладки, чтобы проверить текущую страницу вкладки, а затем отобразить соответствующим образом элементы управления или вы- полнить определенные действия. 19. Неверно. Свойство Visible можно установить отдельно для каждой вклад- ки, а не только для всего элемента управления, что позволяет контролиро- вать, какие страницы отображаются и когда. 20. None (вкладок нет), Tabs (корешки вкладок) и Buttons (кнопки). См. урок 15. Ответы на вопросы к части "Суббота. Вечер" 1. Функция MsgBox содержит следующие пять параметров: текст, кнопки, за- головок, файл справки, контекст. 2. Верно. Параметр кнопки определяет не только кнопки, которые отображают- ся в окне сообщения, но и пиктограмму, кнопку, выбранную по умолчанию, и модальность формы. 3. Состояние модальности на уровне приложения требует, чтобы пользователь отве- тил на окно сообщения, прежде чем он продолжит работу с текущим приложени- ем, которая была приостановлена на время отображения окна сообщения. Мо- дальность на уровне системы означает, что пользователь не сможет работать ни с одним из приложений, пока не ответит на окно сообщения. 4. в. 5. Access предоставляет несколько средств для импорта и экспорта данных. Кроме того, можно импортировать и экспортировать данные в нескольких разных форматах (см. урок 17). Ниже приведен сокращенный список: • Excel (все версии); • dBASE (III, III+, IV, 5 и 7); • Lotus (версии до 4 включительно); • Текстовые файлы (с разделителями и фиксированной ширины). 6. Процесс импорта данных включает следующие основные этапы. • Организация данных. • Форматированиеданных. • Установление соответствий данных. • Присоединение записей. Сначала необходимо собрать и организовать импортируемые данные. Затем следует отформатировать данные, чтобы они были читаемыми в Access и со- ответствовали существующей структуре данных. Затем выполняется самый важный этап импорта — установка соответствия между данными. Это про- цесс сравнения импортируемых данных со структурой данных, которая ис-
пользуется в приложении. Необходимо продумать, каким элементам прило- жения будут соответствовать таблицы, поля, тип данных, размер и другие характеристики импортируемых данных. Все это важно при установлении соответствий данных. Неправильно заданное соответствие между размерами полей может привести к потере данных. Аналогично, установление непра- вильного ключевого поля от одной таблицы к другой может привести к по- вреждению всех данных. 7. Спецификация импорта/экспорта — это файл, который предоставляет Access набор правил для импорта или экспорта данных из текстового файла или в текстовый файл. После создания спецификацию импорта/экспорта можно использовать со всеми текстовыми файлами обоих типов: с разделителями или фиксированной ширины. Спецификация хранится в базе данных и явля- ется системным объектом Access, который можно применять при запуске импорта данных. Для создания файла спецификации используют мастер им- порта или мастер экспорта Access. Программа-мастер создает список всей информации, которая имеет важное значение для процесса импорта или экс- порта — формат файла, соответствия полей, свойства полей и т.д. См. раздел "Процессы импорта/экспорта", урок 17. 8. Существует три основных метода для переноса данных. Выбор одного из них определяется характером данных, а также типом операции (экспорт, импорт или ссылка). TransferDatabase * Transferspreadsheet • TransferText См. урок 17. 9. Объем памяти имеет более важное значение, чем частота процессора. При увеличении объема оперативной памяти с 64 Мбайт до 128 Мбайт можно вдвое, а то и втрое увеличить скорость работы приложения, тогда как при увеличении частоты процессора и неизменной памяти эффективность возрас- тает незначительно. 10. Первый вариант — изменение формы, отчета, элемента управления или про- граммного модуля. (Если не сохранить измененный объект, приложение ос- танется в скомпилированном состоянии.) Второй вариант — добавление новой формы, отчета, элемента управления или модуля (в том числе и добавление нового кода для существующей формы). Третий вариант — удаление или переименование формы, отчета, элемента управления или модуля. 11. Decompile. 12. С файлом базы данных . MDE нельзя выполнять следующие действия: • просмотр, изменение или создание форм, отчетов и модулей в представле- нии Design (Конструктор); • добавление, удаление или изменение ссылок на библиотеки объектов или базы данных; • изменение имени проекта VBA для базы данных с использованием диало- гового окна Options (Параметры);
• импорт или экспорт форм, отчетов и модулей. Однако следует отметить, что таблицы, запросы и макросы могут быть импортированы и экспортированы в базы данных, имеющие другое расширение (не . MDE). 13. Неверно. 14. Верно. 15. Верно. 16. Верно. 17. Topic (Раздел справки). 18. Верно. 19. г. 20. а. Ответы на вопросы к части "Воскресенье. Утро" 1. Неверно. 2. Modal 3. г. 4. RowSource 5. Диалоговое окно поиска должно иметь несколько стандартных элементов. Са- мый простой способ получить ответ на этот вопрос — посмотреть, какая ин- формация необходима для выполнения поиска. Чтобы выполнить поиск, за- дайте искомое значение (его следует получить от пользователя). Затем опреде- лите место (места), где необходимо это значение искать. Следовательно, нужен элемент управления, который будет получать искомое значение, и элемент управления, в котором будет указано место выполнения поиска. В окне поиска будут полезны и другие элементы (например, добавление критериев или логи- ческих операторов), однако обязательны элементы "что" и "где". Диалоговое окно печати должно иметь следующие возможности: элемент управления для выбора пользователем отчета, который выводится на печать; количество копий; тип вывода (предварительный просмотр или печать). Кроме того, могут использоваться другие элементы управления, задающие дополнительные параметры печати — дополнительные заголовки или фильтры. Пример самого простого диалогового окна печати — форма у Bank Print Dialog, более сложные возможности иллюстрирует форма yCheck Print Dialog. 6. б. Команда OpenReport имеет следующий синтаксис и аргументы. • Имя отчета: фактическое имя объекта отчета. • Вид: тип представления, печать на принтер или предварительный про- смотр. • Имя фильтра: название запроса, который может быть использован для фильтрации записей в отчете. • Условие Where: условие WHERE оператора SQL, которое может применять- ся для ограничения количества записей отчета. 7. Код событий вы можете поместить в следующих событиях отчета. • On Open
• On Close • On Activate • On Deactivate • On No Data • On Page • On Error Кроме того, существует также возможность поместить программу, соответст- вующую определенному разделу или группе отчета. Назовем такие события: • On Format • On Print • On Retreat 8. Функция SysCmd. 9. Неверно. Параметр Background Compile компилирует весь нескомплирован- ный код, если процессы Access не заняты другой задачей. 10. б. 11. Использовать аргумент командной строки /х макрос, макрос AutoExec или установить запись Display Form/Page (Вывод формы/страницы) в диалоговом окне Startup (Параметры запуска). 12. Установочная программа может использоваться для проверки корректности ссылок данных между клиентской и серверной базами данных; установки необходимых ссылок, библиотек, элементов управления ActiveX, справоч- ных файлов; создания ярлыков приложения на рабочем столе и новых ко- манд меню для вызова приложения. 13. Каждая страница мастера должна быть отдельным действием в выполнении определенного процесса; имеет смысл строго определенный порядок шагов; кнопки, шрифты и элементы управления для разных страниц мастера должны быть одинаковыми, а страницы — непереполненными; наконец, как можно больше должны использоваться значения по умолчанию, чтобы облегчить работу пользователя. 14. Весь мастер содержится в одном объекте Access — форме; вкладка предос- тавляет свойства и методы, упрощающие программирование; вкладки в элементе управления Tab могут быть отображены или скрыты в зависимости от ваших требований; для мастера требуется задать только один набор кно- пок навигации. 15. Неверно. В мастере должна быть еще кнопка Finish (Готово). 16. а. Кнопка Back (Назад) всегда недоступна на первой странице. 17. Верно. 18. Примеры надстроек Access: мастера элементов управления, мастера форм, мастера диаграмм, конструкторы полей, объектные библиотеки, диспетчер кнопочных форм, диспетчер связанных таблиц, архивариус, мастер анализа быстродействия и многие другие программы. 19. д. 20. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Off ice\ll .O\Access\Wizards.
Ответы на вопросы к части "Воскресенье. День" 1. Ссылки таблиц могут быть нарушены, если источник данных, с которым ус- танавливается связь, не доступен в силу ряда возможных причин: не работа- ет сервер, на котором расположен источник внешних данных; не работает сеть; пользователь не имеет необходимых прав доступа к источнику внешних данных; были изменены имена совместного доступа. 2. Неверно. Для работы с определениями таблиц Access используется ADOX. 3. в. 4. cat.ActiveConnection = Currentproject.Connection 5. Верно. 6. Текст программы можно защитить с помощью следующих методов: защита на уровне совместного доступа, защита на уровне пользователя, шифрование HMDE. 7. Верно. 8. а. 9. Среди других методов защиты приложений от несанкционированного досту- па — безопасность операционной системы, сокрытие окна базы данных, от- ключение клавиши Bypass (которая может отменить выполнение макросов Autoexec и параметров запуска), отключение специальных клавиш. 10. Неверно. 11. Клиент-серверная архитектура. 12. Неверно. 13. Файл-серверный. 14. 2 Гбайт. 15. Неверно. 16. г. 17. в. 18. в. 19. Хранимую процедуру. 20. Верно.
Предметный указатель A F ActiveConnection, 416 AddNew, 162 ADO, 153 ADODB, 200; 415 ADOX, 200; 415 Объектная модель, 430 AllowBypassKey, 437 AllowSpecialKeys, 438 Application, 133 Auto Center, 339 Auto Resize, 339 autoexec, 308 AutoKeys, 188 FindRecord, 343 For...Next, 112 FROM, 146 H Help Viewer, 319 HtmIHelp, 322 I If...Then...Else...End If, 103 IsCompiled, 367 в J Bookmark, 343 BoundColumn, 343 Bypass, 437 Jet, 33 L c LoadOnStartup, 404 Calendar, 356 COBOL, 31 CompactDatabase, 372 Connection, 416 CurrentProject, 416 M MDE, 376 Microsoft Data Engine 2000, 442 Microsoft Database Engine, 33 D Msadox, 415 MSDE 2000, 442 dBASE, 31 Declare, 139 DELETE, 150 Dim, 88 DLL, 139 Do...Loop, 108 MsgBox, 253 константы, 254 синтаксис, 254 о Object Browser, 136 E On Format, 353 On Print, 353 Err, 259 Error, 260 Errors, 258 On Retreat, 353 OnClick, 349 OpenReport, 350 Option Explicit, 87 ORDER BY, 146
р Архитектура Properties, 371 Public, 74 приложения, 359 Б R База данных библиотеки, 295 RecordsetClone, 343 Repair, 364 RowSource, 340 Running Sum, 356 Runtime, 376 открытие, 434 свойства, 402 сжатие, 291 ссылка, 295 Безопасность, 427 файловая, 435 s Библиотека, 396 отладка, 404 SELECT, 146 предикаты, 147 Select Case...End Select, 106 SQL, 145 SQL Server Service Manager, 444 SQLServer, 33 StartupShowDBWindow, 436 создание, 404 создание из модуля, 406 Библиотека баз данных, 137 Блокирование на уровне записи, 166 на уровне страницы, 166 обработка ошибок, 164 оптимистическое, 164 T пессимистическое, 163 Блокирование записи, 198 TransferDatabase, 275 Transferspreadsheet, 276 TransferText, 277 в Вкладка, 241 и назначение, 241 отображение, 249 UPDATE, 150; 163 сокрытие, 249 Внешнее приложение, 134 V Внешняя база данных соединение, 155 Variant, 92 Visual Basic, 30 Восстановление, 364 Вычисляемое поле, 157 w д WHERE, 146 With...End With, 113 Данные блокировка, 131 защита, 132 A импорт, 268 присоединение, 272 Автозапуск, 307 Анимация, 311 Аргумент, 118 Архивация, 362 проверка корректности, 151 Декомпиляция, 289; 370 Диалоговое окно, 337 References, 405 Диспетчер надстроек, 400 модальное, 255
Настройка, 183 открытие из формы, 344 Параметры запуска, 371 печати, 348 Преобразование макроса, 46 программирование, 348 Свойства, 402 создание, 340 Сохранение, 45 Дизайн общий, 55 подробный, 55 Динамически присоединяемая библиотека, 139 Диспетчер надстроек, 400 Диспетчер присоединенных файлов создание, 418 Диспетчер связанных таблиц, 413 Добавление записи, 162; 201 пакета записей, 167 пользователя, 432 Доступ к данным, 131 3 Запись добавление, 162 поиск, 203; 343 редактирование, 169 удаление, 172; 204 Запрос, 456 Заставка, 306 Защита, 428 на уровне пользователя, 429 на уровне совместного доступа, 428 и Идентификатор справки, 323 Именование объектов баз данных, 95 переменной, 80; 93 полей, 95 элементов управления, 96 Импорт, 268 интерфейс, 278 источник данных, 269 методы, 275 присоединение данных, 272 создание соответствий, 270 формат, 269 Индивидуальные параметры, 360 Инициатор, 33 Интерфейс импорта, 278 экспорта, 281 Источник строк, 340 к Календарь, 356 Каталог, 416 Кнопка, 47 Кнопочная форма, 180 Командная кнопка, 47 Компиляция, 50; 60; 288; 366 параметры, 366 условная, 367 Конструктор, 47; 119; 399 формы, 31 Конструктор запросов, 145 Контрольное выражение, 65 Л Логическая конструкция, 101 м Макрос, 43 окно, 43 преобразование в код, 45 сохранение, 45 Мастер, 383 интерфейса пользователя, 399 объектов данных, 399 проектирование, 383 создание, 384 структура, 384 элементов управления, 399 Мастер кнопок, 47 Мастер преобразования в формат SQL Server, 448 Мастер упаковки и установки, 377 Меню пользовательское, 182 Механизм баз данных, 130 Многостраничная форма, 243 Модальность, 255 Модуль, 40; 119 создание, 123
Модуль класса, 121 Модуль отчета, 119 Модуль формы, 119 н Набор вкладок свойства, 245 создание, 245 стиль, 246 Набор записей, 154 количество, 159 навигация, 170 открытие, 163 Надстройка, 395 использование, 396 проектирование, 398 Нажатие кнопки, 181 Настройки индивидуальные, 360 системные, 360 Непрерывная форма, 235 Несвязанная форма, 198 добавление записи, 201 поиск записи, 203 создание, 204 ссылки, 200 удаление записи, 204 функции,199 Несвязанное поле, 156 о Область данных, 353 Обработка данных клиент-серверная, 33 файл-серверная, 33 Объект данных ActiveX, 153 Объект-источник, 233 Объектная модель, 133 Объявление переменной, 87 предварительное, 87 явное, 87 Окно Immediate, 49 Locals, 63 Watches, 63 авторазмер, 338 всплывающее, 339 выравнивание по центру, 339 информационное, 312 кода, 50 модальное, 339 системной информации, 364 технической поддержки, 360 Окно базы данных сокрытие, 436 Окно макроса, 43 Оператор вложенный, 105 логический, 101 обработки ошибки, 259 Оптимизация приложения, 297 Отключение клавиш, 437 Отладка, 60 использование меню, 66 Отчет, 352 колонтитулы, 352 область данных, 353 разделы, 352 события, 353 Ошибка, 257 блокирования записи, 164 в процессе выполнения, 62 доступа к данным, 258 логическая, 257 обработка, 258 оператор, 259 процедура обработки, 260 синтаксическая, 60 сообщение, 62 фатальная, 257 п Пакет управления базами данных, 30 Панель инструментов, 184 Параметры компиляции, 366 Параметры запуска, 371 Пароль, 431 Переменная, 86 глобальная, 90 именование, 86 локальная, 89 объявление, 87 правила именования, 93 текстовая, 91 Перехват нажатия клавиш, 193 Подменю, 185 Подпрограмма, 40; 117 Подчиненная форма, 231 Объект-источник, 233
присоединение, 234 создание, 232 элементы управления, 236 Поиск записи, 203 Порядок событий, 77 Построитель, 47; 399 Представление создание, 456 Приложение архитектура, 359 клиент-серверное, 412 конфигурация файла, 371 оптимизация, 297 присоединение справки, 326 создание файла .mde, 376 элементы, 359 Присоединенный столбец, 343 Проверка вводимых значений, 76 Программа установки, 377 Проект, 34; 444 создание, 445 Проектирование, 54 Процедура в запросе, 127 в форме, 126 обработки ошибок, 260 создание, 123 сохранение, 51 хранимая, 33 Процедура запуска, 371 Процедура события, 72 создание, 73 Процентный счетчик, 303 р Раздел отчета, 352 Разделитель, 270 Редактирование записи, 169 пакета записей, 171 Редактор Visual Basic, 48 Реестр, 400 Режим SQL, 459 Резервная копия, 363 Репликация, 132 с Свойства базы данных, 402 набора вкладок, 245 элемента меню, 186 Связанная таблица, 411 Сжатие, 371 в программе, 372 Сжатие базы данных, 291 Символ-разделитель, 270 Синтаксис, 30 проверка, 60 Системные настройки, 360 Событие, 32; 58; 71 изменение, 250 порядок, 77 при закрытии формы, 78 при обновлении данных, 77 при открытии формы, 78 при создании записи, 78 • при удалении, 78 присвоение функции, 74 процедура, 72 Событие клавиатуры, 190 Клавиша вверх, 191 Клавиша вниз, 191 Нажатие клавиши, 192 Создание библиотеки, 404 диалогового окна, 340 диспетчера присоединенных файлов, 418 информационного окна, 312 кнопочной формы, 180 мастера, 384 модуля, 123 набора вкладок, 245 несвязанной формы, 204 подчиненной формы, 232 представления, 456 проекта, 445 процедуры, 123 процедуры события, 73 соотвествий, 270 справки,321 ссылки, 405 строки меню, 183 таблицы, 447 Справка, 319 идентификатор, 323 присоединение к приложению, 326 создание, 321 тестирование, 325 Ссылка, 405
вызов, 406 создание, 405 Строка меню, 182 добавление команд, 185 присоединение к форме, 189 создание, 183 Структура модулей, 370 Субформа, 231 Т Таблица доступ, 416 свойства, 417 связанная, 411 создание, 447 удаление, 417 Таймер, 309 Тестирование, 60 Тип данных, 91 Точка останова, 65 Удаление записи, 172; 204 таблицы, 417 Упаковка программы сторонних производителей, 380 Уровень приложения, 130 Условная обработка, 102 Установка, 377 тестирование, 378 Ф Файл .mde, 293 Файл заголовков, 323 Файл с разделителями, 270 Файл с фиксированной шириной полей, 270 Файловая безопасность, 435 Форма автозапуск, 307 кнопочная, 180 конструктор, 31 многостраничная, 243 непрерывная, 235 несвязанная, 198 подчиненная, 231 присоединение меню, 189 связанная, 197 скрытая, 302 стартовая, 308; 315 Формат .mde, 375 Функция, 40; 118 MsgBox, 253 создание, 460 Хранимая процедура, 34 X-элемент управления, 200 ц Целостность ссылок, 173 проверка, 173 Цикл, 108 ш Шифрование, 434 э Экспорт, 272 интерфейс, 281 методы, 275 соответствия, 273 формат, 273 Элемент меню, 186 Элемент управления именование, 96 Эффективность, 297
Научно-популярное издание Керри Н. Праг, Дженнифер Рирдон, Лоренс С. Казевич, Дайана Рид, П. В. Фэн Интенсивный курс программирования в Access 2003 за выходные Литературный редактор О.В. Ожигова Верстка О.В. Линник Художественный редактор С, А. Чернокозинский Корректоры 3.В.Александрова, Л А. Гордиенко, О.В. Мишутина Издательский дом "Вильяме". 101509, Москва, ул. Лесная, д. 43, стр. 1. Изд. лиц. ЛР № 090230 от 23.06.99 Госкомитета РФ по печати. Подписано в печать 25.08.2004. Формат 70X100/16. Гарнитура Times. Печать офсетная. Усл. печ. л. 38,7. Уч.-изд. л. 27,2. Тираж 3000 экз. Заказ № 381. Отпечатано с диапозитивов в ФГУП "Печатный двор" Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чкаловский пр., 15.

Освойте программирование в Access 2003 за выходные! I Ь »и< *д< *111.1 и и । п 'пик >1н,1 и । Д' III. |> IK ЛИ -Д1 ‘III.Ml II I им .-I j пднмо I И Л -I >Н I I • I;« I 'I IM 1..1Г4 и dи*! и и । о H| н >i | мм mi ip< hmiii иi i. A< < (•'.. '()(): ( )Д1М I l|J<)( ми *м.1 I hl I H 1 < mi? мм т ному i oiiiiiu 111 ) .Ml) KI к >, ны Д< Hilo IIP .11 IUM.IHIU I» I l| )OI I MM мирон.ширм в At i pv,, н mo 1 pi bun., up in.жомы ( о мсми новыми тннмлшх 1ями, которые п редОс ihbjihci Ai(>v.s 200 J A может, вам просто нравится преодолевать i рудное!и ? В любом случае перед вами решение — Интенсивный к\рс программирования в Access 2003. Откроите книгу в пятницу вечером, и уже днем в воскресенье после 30 кратких и содержательных уроков - вы сможете приступить к делу и начать разработку приложении для работы с данными в А< cess 2003. Нет ничего проще’ Сопровождающий Web-узел На Web у ли www wiley com nmpbooks ргадие находян я j ь дующие полезные м.ip реалы • 7• • тг кото| >i ни Hi )М() • ( , (ЩЫ1И11. нания • Hpi-u-p* 1 иданни*. lb НОЛЬ АуРМОИ В М Ih'pnajlP УрОЮН атс । и базы данных План обучения Пятина /.'< “Н'р I \ iK. I l.li Р • Ввод» inи- it А' । t . П I iptii р iMMi 1| к ib.ii и и • ( )| Mill pin ив h модулям • Ди .айн, if, iiip< >i .nun И ОН1.1ДК I ( obhliii'i Mtn It), iде выполняли я iipoi рамм i Суббота VipO О \ pOkOB. <4J<J • Переменные и правила именования • Циклы, jioi ические операторы и быстрый выход из циклов • Процедуры, модули и классы модул* и • Архитектура Access • Работа с данными в программе • Добавление, обновление и удаление запиши < исполь юванием ADO День 6 уроков, 3 часа • нопочные формы, специал! ны»‘ M"HHi и о»)Ытия !* Ливиагуры * Использование нквя донных форм • Прел раммиронание л ip м ни юв управления флажок, 1 руппа IK [X КЛЮЧгПОЛРИ, писог, ПОЛИ - О ' НИ! КОМ • ПОДЧИНЕННЫЕ И ЛРНЮЧНЫР формы Ф WILEY \x ilvv t(1111 ^1лиАЛсктика Поггтиг<* * Дилпгктину' п Internet по <1?4р«'<*у hltp wwvv aialcl<tikл corn • Про раммированме •IH'Mi'IHOh yil| МИЛИЦИЯ 1 и вкладками • Ош. оои|Ц|‘н.1И н о1 >ра(ю1ка ошибок Вечер И / . ’ ос i • Импорт м ikiiiopi данных • Увеличение i корон и работы прилежа ьния илдн.т 1'Кон ,а« тавок i жшмациеи, поля About и 3ai рузочных окон • Создание с травочны.х систем Воскресенье о । рок> -в 3 - Созданиефор1 дл^ ПОИ КОВЫХ диалог/ ,• н • Диалп-о«ы о- н , т^’ и элементы у г оавл^ия Ac tr/eX • Архитектура рилеж^н,-. • Упаковка приложения • Програгv ирс. .т и< фор типа "мае ер" • использование аадс’г/,. . Д> НВ 7 УД' Ш, / ii> : • Про рамтлирование приг<х-диж I' /файлов • ’ сп^ Ч‘ НИ* .г И1Ы *JJ / анны/А ‘ А И-11И<а рнрр. < bdi>A дачнь / С сада нир зал ро< ок в С