МУЛЬТИМЕДИЙНЫЙ САМОУЧИТЕЛЬ НА CD-ROM
TeachPro™ Microsoft®
Access 2003
Мультимедиа Технологии и Дистанционное Обучение МОСКВА 2006
™ Мультимедийный самоучитель на CD-ROM: TeachPro MS Access 2003/ Под ред. Г.Антонова. — М.: ММТиДО, 2006. — 424 с.: ил. ISBN 5-9230-0165-9 TeachPro MS Access 2003 - это мультимедийный, интерактивный, обучающий видео курс на CD-ROM по работе с одной из популярных программ – MS Access 2003 Процесс обучения предельно прост и максимально приближен к занятиям с преподавателем. Вы видите на экране «фильм», как работать с программой в различных режимах и слышите пояснения «преподавателя». Вам постоянно приходится отвечать на контрольные вопросы «преподавателя», указывая на соответствующие поля на экране, или выполнять определенные тестовые задания. В случае затруднения - система поможет подсказкой. Имеется удобная поисковая система и возможность навигации по закладкам. По каждому из пользователей ведется статистика пройденного материала, фиксируется дата изучения урока, процент прослушанной части урока, число правильных ответов и ошибок, фиксируется количество использованных подсказок. Статистика выводится в виде протокола поурочно. Большой объем учебного материала - соизмеримый с книгой более 1000 страниц, позволяет утверждать, что учебник рассчитан как для начинающих, так и для специалистов, уже владеющих основными навыками работы с TeachPro MS Access 2003 и стремящихся к достижению профессиональных результатов в своей работе. Общая продолжительность озвученных уроков – 37 часов 27 минут. Общее количество уроков – 234. Количество контрольных и тестовых вопросов – 6093. Благодаря возможности текстового сопровождения (режим титров), данным курсом могут пользоваться слабослышащие. В комплект мультимедийного самоучителя «TeachPro MS Access 2003» на CDROM входит книга, в которой представлен весь лекционный материал курса с иллюстрациями. Строго говоря, книга не предназначена для изучения MS Access 2003, а скорее это справочник, в котором можно найти нужную тему по содержанию и по предметному указателю. Книга позволяет также эффективно планировать учебный процесс, вести работу в классе.
ISBN 5-9230-0165-9
© ООО «Мультимедиа Технологии и Дистанционное Обучение», 2006
КРАТКОЕ СОДЕРЖАНИЕ Глава 1. Основы создания приложений Access .........................33 Глава 2. Знакомство с таблицами, создание таблиц.................38 Глава 3. Подробнее о таблицах. Импорт и присоединение таблиц (общая часть) .........................93
Глава 4. Подробнее о таблицах. Импорт и присоединение таблиц (профессиональная часть).............................106
Глава 5. Основы реляционных СУБД (общая часть) ...............115 Глава 6. Запросы ........................................................................139 Глава 7. Формы ...........................................................................179 Глава 8. Элементы управления и макросы ..............................204 Глава 9. Отчеты ..........................................................................231 Глава 10. Страницы доступа к данным .....................................249 Глава 11. Основы программирования на VBA .........................261 Глава 12. Специальные средства Access VBA.........................293 Глава 13. Специальные средства Access VBA (продолжение) .......................................310
Глава 14. Важнейшие для нас функции Access и VBA ............340 Глава 15. Пример "Платежное поручение"...............................355 Глава 16. Связи с Office .............................................................402 Предметный указатель ............................................................410
СОДЕРЖАНИЕ Руководство пользователя ..................................................11 Установка системы TeachPro на компьютер ...............................................13 Первый вход в систему..................................................................................14 Содержание курса. Выбор нужной лекции .................................................16 Основной рабочий экран системы TeachPro ...............................................18 Область демонстрации урока........................................................................20 Панель управления системы TeachPro.........................................................20 Клавиши управления демонстрацией урока................................................21 Клавиши изменения режимов обучения......................................................21 Дополнительные функциональные клавиши TeachPro ..............................21 Подсказка ................................................................................................21 Закладки .............................................................................................................23 Поисковая система.........................................................................................26 Устранение возможных проблем с программой .........................................27
Глава 1. Основы создания приложений Access .................33 1.1. Введение ..................................................................................................33 1.2. Что нового ...............................................................................................35
Глава 2. Знакомство с таблицами, создание таблиц.........38 2.1. Область задач ..........................................................................................38 2.2. Работа с таблицами.................................................................................40 2.2.1. Общие приемы работы с таблицами ...........................................40 2.2.2 Открытие, копирование, удаление таблиц ..................................42 2.2.3. Работа с буфером обмена.............................................................44 2.2.4. Работа с макетом таблицы ...........................................................47 2.2.5. Формат таблицы............................................................................49 2.2.6. Использование текстового поля ..................................................50 2.2.7. Режимы создания таблицы ..........................................................52 2.3. Типы полей ..............................................................................................56 2.3.1. Общий обзор типов полей............................................................56 2.3.2 Типы Счетчик и Код репликации.................................................59 2.3.3. Числовые типы. Точность чисел. Критерий выбора нужного типа ............................................................60
2.3.4 Текстовый тип и тип МЕМО........................................................ 63 2.3.5. Тип дата/время и логический тип. Форматы изображения........................................................................... 66 2.3.6. Тип гиперссылка. Использование гиперссылок........................ 69 2.3.7. Добавление гиперссылок............................................................. 71 2.3.8. Тип Поле объекта OLE ................................................................ 74 2.3.9. Ключевой статус поля ................................................................. 77 2.4. Индексирование таблиц......................................................................... 80 2.5. Установка ограничений для полей ...................................................... 83 2.6. Маски ввода ........................................................................................... 87 2.7. Подстановка в поля ............................................................................... 90
Глава 3. Подробнее о таблицах. Импорт и присоединение таблиц (общая часть) ..........................93 3.1. Импорт, присоединение и экспорт таблиц Access .............................. 93 3.2. Импорт списков Excel. Ограничения в форматах списка.................................................................. 96 3.3. Присоединение списков Excel. Экспорт в формат Excel.................... 99 3.4. Импорт и присоединение текстовых файлов..................................... 101 3.5. Экспорт в текстовые файлы ........................................................................ 104
Глава 4. Подробнее о таблицах. Импорт и присоединение таблиц (профессиональная часть)...106 4.1. Формат Dbase........................................................................................ 106 4.2. Формат Paradox. ................................................................................... 107 4.3. Формат HTML ...................................................................................... 109 4.4. Формат XML. Специфика реализации импорта, экспорт.................... 112
Глава 5. Основы реляционных СУБД (общая часть).......115 5.1. Смысл многотабличных БД ................................................................ 115 5.2. Создание многотабличных БД ............................................................ 118 5.3. Мастер нормализации Access.............................................................. 120 5.4. Исправление опечаток ......................................................................... 123 5.5. Использование мастера нормализации Access в ручном режиме .............................................................................. 125 5.6. Виды отношений между таблицами. .................................................. 128
5.7. Связывание таблиц в Схеме данных. Подтаблицы. Условия для создания различных отношений между таблицами...........................129 5.8. Проблемы целостности данных...........................................................133 5.9. Реализация целостности в Access........................................................136
Глава 6. Запросы................................................................139 6.1. Запросы. Общее представление...........................................................139 6.2. Конструктор запросов ..........................................................................141 6.3. Заполнение условий отбора, урок 1 ....................................................144 6.4. Заполнение условий отбора, урок 2 ....................................................148 6.5. Создание вычисляемых полей .............................................................151 6.6. Построитель выражений ......................................................................154 6.7. Некоторые виды запросов....................................................................157 6.7.1. Запрос на выборку ......................................................................157 6.7.2. Запрос на выборку с групповыми операциями ........................158 6.7.3. Запрос на создание таблицы ......................................................162 6.7.4. Запрос на обновление.................................................................165 6.7.5. Запрос на добавление .................................................................169 6.7.6. Запрос на удаление .....................................................................171 6.7.7. Перекрестный запрос .................................................................174
Глава 7. Формы ..................................................................179 7.1. Автоформы. ...........................................................................................179 7.2. Основные элементы Конструктора форм ...........................................180 7.3. Действия в Конструкторе форм...........................................................182 7.4. Изменение размера и выравнивание объектов формы ......................185 7.5. Изменение интервала объектов формы. .............................................187 7.6 Области формы. Ввод меток.................................................................188 7.7. Области формы. Форматирование полей и меток. ............................190 7.8. Ввод свободных, вычисляемых полей и рамок объектов..................192 7.9 Ссылки на элементы формы. Режимы формы. Свойства формы...........................................................................................195 7.10. Связанные формы. Главная и подчиненная ленточные формы ........................................................................................198 7.11. Создание главной и подчиненной ленточной формы......................199
7.12. Способы связывания форм ................................................................ 201
Глава 8. Элементы управления и макросы ......................204 8.1. Ссылки на элементы управления в формах из других объектов Access......................................................... 204 8.2. Форматирование поля со списком. Ссылки на нужную колонку списка. ......................................................... 206 8.3. Общие сведения о макросах. Порядок выполнения и именования .......................................................... 208 8.4. Вызов макроса элементом управления "поле со списком"............... 212 8.5. Вызов макроса кнопкой. Условия в макросах. Вывод сообщений ....................................................................................... 214 8.6. Переключатели и группы переключателей........................................ 217 8.7. Флажки и выключатели. ...................................................................... 221 8.8. Сохраненные фильтры. Фильтры. Вызов их макросами. Фильтр как параметр макроса............................... 224 8.9. Использование гиперссылок на формах............................................. 228
Глава 9. Отчеты..................................................................231 9.1. Печать таблиц и форм. Сохранение формы как отчета. ................... 231 9.2. Конструктор отчетов. Зоны отчета. .................................................... 232 9.3. Отчет табличного вида. Смена источника записей. Нумерация записей и итоговые функции.................................................. 233 9.4. Сортировка и группировка отчета. ..................................................... 235 9.5. Нумерация страниц. Развернутые надписи........................................ 237 9.6. Отчет в виде письма. Адресные этикетки.......................................... 239 9.7. Отбор режима вывода данных для отчета из формы ........................ 241 9.8. Параметры печати отчетов. Снимки отчетов..................................... 243 9.9. Экспорт отчетов в различные форматы ............................................. 245
Глава 10. Страницы доступа к данным ............................249 10.1. Страницы доступа к данным. Автостраница. Особенности конструктора страниц.......................................................... 249 10.2. Параметры группировки.................................................................... 250 10.3. Многоуровневая группировка данных. ............................................ 251 10.4. Перегруппировка данных. Итоговые поля групп............................ 253
10.5. Добавление связанных полей ............................................................254 10.6. Создание сводной таблицы. Панель инструментов сводной таблицы....................................................256 10.7. Области и промежуточные итоги. Имена полей сводной таблицы. ..................................................................257 10.8. Диаграммы и сводные таблицы.........................................................259
Глава 11. Основы программирования на VBA ................... 261 11.1. Виды модулей. Преобразование макротаблицы в модуль. .............261 11.2. Окно редактора VBA. Подокна. Ввод текста. Комментарии. .........263 11.3. Процедура. Имена процедур обработки событий............................265 11.4. Условие If. Блок If… then… Else.......................................................267 11.5. Инструкция Option Explicit. ...............................................................269 11.6. Блок Select Case...................................................................................270 11.7. Написание функций............................................................................272 11.8. Префиксы Public и Private ..................................................................273 11.9. Использование функций в запросах и формах.................................275 11.10. Использование функций в других приложениях ...........................278 11.11. Функция MsgBox. .............................................................................280 11.12. Функция MsgBox. Точки останова..................................................282 11.13. Окно Immediate. Аргументы. Значения функции MsgBox............283 11.14. Значения функции MsgBox. Функция InputBox.............................284 11.15. Рекурсивный вызов процедуры. Цикл For..Next ............................286 11.16. Циклы Do While и Do Until. .............................................................289 11.17. Метки и переходы на метку. ............................................................290 11.18. Обработка ошибок. ...........................................................................291
Глава 12. Специальные средства Access VBA ................293 12.1. Обычные переменные. Типы и способы объявления ......................293 12.2. Пользовательские типы и массивы. ..................................................295 12.3. Пользовательские типы и массивы. Команда Debug.Print. .............296 12.4. Динамические массивы. .....................................................................298 12.5. Создание массива функцией Array....................................................300 12.6. Основные объектные типы. Просмотрщик объектов ......................301 12.7. Объявление объекта DAO.Recordset. Просмотр полей ...................303
12.8. Редактирование записей в DAO.Recordset. Объявление БД........... 305 12.9. Редактирование записей в DAO.Recordset ....................................... 307
Глава 13. Специальные средства Access VBA (продолжение) ...............................................310 13.1. Объект ADODB.Recordset. ................................................................ 310 13.2. Блок With. End With. Редактирование записей в ADODB. Recordset.................................................................................... 312 13.3. Recordset как источник данных для формы. .................................... 314 13.4. Идентификатор Me. Обработка события Current. ........................... 316 13.5. Проходы по набору записей собственными элементами управления .............................................................................. 318 13.6. Создание собственных счетчиков записей ...................................... 320 13.7. Добавление и удаление записей........................................................ 323 13.8 Работа с закладками. Обработка ошибок при работе с записями... 325 13.9. Метод Requery. Функции по подмножеству в полях формы. ........ 327 13.10. Обмен между набором записей и массивом. Метод GetRows...... 330 13.11. Процедуры класса DoCmd для работы с записями. Урок 1.......... 333 13.12. Процедуры класса DoCmd для работы с записями. Урок 2.......... 334 13.13. Процедуры класса DoCmd для работы с записями. Урок 3.......... 337
Глава 14. Важнейшие для нас функции Access и VBA....340 14.1. Текстовые функции Asc и Chr........................................................... 340 14.2. Текстовые функции Mid, Len, UCase, LCase ................................... 342 14.3. Текстовые функции Str, Val. ............................................................. 345 14.4. Текстовая функция String. ................................................................. 346 14.5. Применение функции Format к числам и датам .............................. 348 14.6. Форматирование значений времени. ................................................ 350 14.7. Функции даты и времени................................................................... 351 14.8. Функции преобразования типов. ...................................................... 353
Глава 15. Пример "Платежное поручение" ......................... 355 15.1. Платежка 1 .......................................................................................... 355 15.2. Платежка 2 .......................................................................................... 358 15.3. Платежка 3. ......................................................................................... 360 15.4. Платежка 4. ......................................................................................... 363
15.5. Платежка 5...........................................................................................366 15.6. Платежка 6...........................................................................................368 15.6.1. Начинаем делать Платежку 6 ..................................................368 15.6.2. Обработка при помощи Visual Basic.......................................369 15.7. Платежка 7. Синхронизация вкладок................................................373 15.8. Платежка 8. Новая платежка..............................................................375 15.9. Платежка 9. Настройка календаря.....................................................379 15.10. Платежка10. Удаление. ....................................................................380 15.11. Платежка11........................................................................................382 15.11.1. Печать (Создание формы и запроса).....................................382 15.11.2. Печать (Создание отчета).......................................................384 15.11.3. Печать (Изменение интерфейса отчета) ...............................387 15.11.4. Печать. Параметры страницы................................................389 15.11.5. Печать (Запись численного выражения прописью).............390 15.12. Платежка12........................................................................................392 15.12.1. Фирмы. Создание форм..........................................................392 15.12.2. Фирмы. Редактирование формы............................................394 15.12.3. Фирмы. Создания обработчика событий ..............................397 15.13. Платежка13. Параметры запуска...................................................4399
Глава 16. Связи с Office .....................................................402 16.1. Публикация в Word.............................................................................402 16.2. Публикация в Word. Анализ в Excel. ................................................403 16.3. Простые примеры слияния с Word. Запуск из Access. ....................403 16.4. Простые примеры слияния с Word. Запуск из Word........................406 16.5. Простые примеры слияния с Word Использование шаблона..............................................................................408
Предметный указатель ......................................................410
Руководство пользователя
Руководство пользователя
13
Установка системы TeachPro на компьютер Это производится один раз, а потом, чтобы начать работать, достаточно только вставить компакт-диск в дисковод и запустить соответствующее приложение из окошка TeachPro. Если Вы хотите работать с курсом попеременно на нескольких компьютерах (скажем, в школе и дома), достаточно по одному разу установить TeachPro на каждом из них и в дальнейшем просто переставлять диск. Следуйте нашей инструкции, и у вас все получится. 1. Вставьте компакт-диск с программой TeachPro в дисковод CD-ROM. Данный диск снабжен автозапуском, и откроется окно, в котором нужно нажать кнопку «установить программу», если автозапуск отключен, проделайте пункты 2, 3, если нет, переходите к пункту 4. 2. Дважды щелкните мышкой по иконке Мой компьютер на Вашем рабочем столе, далее щелкните по иконке, изображающей CD-ROM. 3. Сейчас перед Вами список файлов, содержащихся в корневом каталоге диска CD-ROM. Найдите файл Teachrun.exe и запустите его. Достаточно снова щелкнуть по нему два раза мышью. 4. Через несколько секунд установятся необходимые драйвера и ярлыки. Если возникнут сообщения об ошибке установки, возможно у Вас отсутствуют права администратора. 5. Если Вы работаете в операционной системе Windows 95, то необходимо установить библиотеку Microsoft DirectX 5 (Dx5eng.exe) из корневого каталога, позволяющую разворачивать окно программы TeachPro на весь экран независимо от разрешения экрана монитора. Если эта библиотека или ее более поздняя версия уже установлена или Вы работаете в операционных системах Windows 98/2000/XP, то соответственно, приложение Dx5eng.exe инсталлировать не следует.
14
TeachPro Microsoft Access 2003
6. В конце установки Мастер предложит Вам перезагрузить компьютер, рекомендуем согласиться. В стартовом меню Пуск во вкладке Программы в меню TeachPro появились две вкладки: TeachPro и TeachPro Help.
Первый вход в систему Для запуска необходимо выбрать в стартовом меню Пуск в подменю Программы пункт TeachPro, далее TeachPro MS Access 2003. После запуска программы появится стартовое окно. Рассмотрим поле для ввода имени пользователя и кнопки Регистрация и Удалить. Система TeachPro позволяет работать с одним пакетом (CD-ROM) не одному, а нескольким пользователям. Так, Вы можете учиться всем классом, всем коллективом, или обучаться на компьютерных курсах. Разумеется, в определенный момент времени работать с курсом может только один человек, но зато TeachPro запоминает каждого зарегистрировавшегося пользователя и ведет по нему свою базу записей. Для каждого из обучаемых TeachPro запоминает: - имя пользователя; - последнюю лекцию; - статистику по лекциям, т.е. что прослушано полностью, что частично, а к чему еще не пристули; - дату последнего запуска про граммы; - закладки (пометки), которые пользователь создал для себя, чтобы лучше ориентироваться в лекциях; - общее время работы с программой. Поэтому, сколько бы людей ни работало в системе, Вы можете быть уверены, что компьютер знает все о Вашей личной работе с данным курсом. Рассмотрим, как происходит регистрация. Нажмите на клавишу Регистрация. В появившемся окошке наберите свое имя или то имя, под которым Вы хотите видеть себя в списке пользователей. Нажмите мышью на клавишу OK или на клавиатуре на Enter. Если же Вы пере-
Руководство пользователя
15
думали регистрироваться – Отмена. Как видите, к списку имен добавилось Ваше имя, и теперь можно продолжать работу. Кстати, заметим, что при каждом следующем запуске программы окошко Имя будет содержать имя того пользователя, который работал в системе последним. Его, как бы, приглашают продолжить ранее прерванную работу. Если имя надо поменять, достаточно нажать мышкой на клавишу в правой части окна, а в выпавшем списке выбрать нужное Вам имя. Для удаления имени из списка необходимо: - вывести в окошке ненужное имя; - нажать на клавишу Удалить. Поскольку эта операция необратима, система обязательно переспросит «Хотите удалить имя из списка?». Нажмите на клавишу Ok, и лишнее имя исчезнет из системы. Клавиша Отмена - отказ от удаления имени. Рассмотрим остальные части экрана. В графе Предыдущий запуск системы показана дата, когда пользователь, чье имя сейчас активно, в последний раз работал с системой Графа Пройдено материала показывает, какой процент от общего объема уже пройден. Если Вы только в первый раз запустили программу и зарегистрировались, естественно, там будет показано 0 процентов. Графа Общее время работы покажет то время, которое Вы затратили, обучаясь по курсу. В нижней части экрана расположены еще три клавиши. Кнопка О программе вызывает диалоговое окно с информацией о разработчиках. Кнопка Помощь вызывает справочную систему. После нажатия на эту кнопку Вы попадёте в справочную систему (для её отображения вызывается Internet Explorer), где в привычном гипертекстовом формате Вам расскажут о том, как работать с программой, и о ее характеристиках. Чтобы вернуться в программу TeachPro, необходимо нажать кнопку TeachPro на панели задач. Кнопка Выход в комментариях не нуждается. Нажмите ее - и Вы завершите работу с программой.
16
TeachPro Microsoft Access 2003
Содержание курса. Выбор нужной лекции Все занятия с курсом расположены в виде некоторой иерархической структуры. Уроки в каждой подглаве представлены в следующем наборе: - лекции; - контрольные занятия; Материал разбит на главы. Каждая глава в свою очередь состоит из тематических частей, причем количество колеблется от одной до двадцати. Часть содержит несколько лекций, с которыми пользователь и работает. Продолжительность одной лекции не превышает 12-15 минут, т.к. это время является оптимальным для освоения нового материала. Темп изложения материала на наших занятиях весьма высок, и Вам часто захочется прослушать некоторые отрывки лекции несколько раз. Реальное время работы с одним уроком, учитывая повторные прослушивания трудных мест, тестовый и контрольный режимы, в среднем составляет от 30 минут до 1 часа. Разумеется, учить материал лучше всего по порядку, не перескакивая через лекции. Если Вы впервые работаете с курсом, то после заглавного экрана Вы попадете сразу в оглавление. Это сделано для того, чтобы можно было получить общее представление о том объеме материала, который Вам предстоит изучить. Но если Вы уже работали с системой, то появится страничка с той подглавой (и со всеми ее уроками), на которой Вы остановились в прошлый раз. Как видите, TeachPro помнит все. Допустим, мы в первый раз работаем в программе, и вот экран Содержание. Мы видим полный перечень разделов курса. Если навести курсор на любой раздел, и нажать на левую кнопку мыши, то мы перейдем на страничку с уроками (или подглавами) этого раздела. Но не торопитесь это делать - мы еще не со всем разобрались. Так что продолжим. Слева от строк с названием уроков расположены значки, которые несут полезную смысловую нагрузку. Смысл их в следующем: нам необходимо всегда знать, сколько материала мы уже изучили, какие уроки прослушали полностью, какие частично, а к каким даже не приступали. И такой значок, меняя свою форму, показывает нам, насколько изучен тот урок, слева от которого он стоит. Вот все варианты:
Руководство пользователя
17
! – часть урока прослушана или весь урок, но Вы не прошли контрольный и тестовый режимы; √ – материал изучен полностью.
● – обозначает название главы или подглавы. Иерархическое содержание построено так, что имеет несколько уровней вложенности, и тем самым вы сможете перейти на вложенную подглаву, посвящённую какой-либо теме. Уроки, предназначенные для освоения тем глубже, более продвинуто, отмечены как II уровень. Для возврата назад к списку глав предусмотрено две кнопки в правом верхнем углу: - возврат к листу содержания предыдущей главе - возврат в корневой список глав TeachPro меняет эти значки автоматически. Кнопка Статистика вызывает детальную статистику по лекциям, которая запоминает для каждого урока: - дату изучения этого урока; -
процент прослушанной части урока от длительности урока;
-
сведения о прохождении урока в контрольном и тестовом режиме: 1.
число правильных ответов и общее число во-
просов; 2.
число ошибок (число заданий, на которые был дан правильный ответ не с первой попытки);
3.
счётчик использования подсказки.
Такая информация отображается только для тех уроков, которые загружались хотя бы один раз. При первом запуске программы окно «Статистика прой-
18
TeachPro Microsoft Access 2003
денных уроков» будет пустым. В дальнейшем появится список названий глав, а между ними – информация о тех уроках, которые были пройдены. Если при повторном запуске урока вместо неправильных ответов будут введены правильные, информация о прохождении урока обновится. При этом старые лучшие результаты не сбрасываются, и чтобы пройти курс сначала, надо зарегистрироваться под другим именем. Теперь, когда мы описали страницу Оглавления, перейдем к системе управления уроком.
Основной рабочий экран системы TeachPro После выбора нового урока в оглавлении и до начала реальной работы с ним пройдет времени минута, максимум две. За это время нужная часть курса, содержащая этот самый урок, загрузится в память Вашего компьютера, пройдет процесс распаковки данных.
Сначала разберемся, как происходит обучение пользователя в системе TeachPro. Суть занятий предельно проста и максимально приближена к реальным занятиям в аудитории с преподавателем. Вы слышите голос лектора, и одновременно видите все те операции, которые лектор производит на своем компьютере. То есть, идет реальная работа с изучаемой программой, при этом
Руководство пользователя
19
все происходящее на экране подробно комментируется и объясняется. Дополнительно Вы имеете возможность отслеживать те действия лектора, которые на экране при работе с той или иной программой обычно не видны. Скажем, какая кнопка мыши и когда была нажата, какие клавиши, комбинации клавиш и в каком порядке нажимались на клавиатуре. Эффект достигается такой, как если бы рядом с Вами сидел опытный педагог, все бы Вам показывал и рассказывал, а Вы бы еще постоянно прерывали его и переспрашивали: «А сейчас что ты нажал, а как ты это сделал?». Имеется 4 режима обучения, разберемся с ними подробно. Обучение в непрерывном режиме Как видно из названия, урок идет без перерыва, поэтому около 15 минут придется воспринимать информацию «на одном дыхании». Вы, конечно, в любой момент можете ее остановить, нажав на Стоп или на Пауза. Обучение в пошаговом режиме Урок разбит на некоторое количество частей, или шагов. Их может быть 10 - 20 в уроке, и каждый содержит некоторый фрагмент материала, о котором говорит лектор. После прослушивания одного шага лекция прерывается, и Вы можете начать слушать следующую часть лекции, либо еще раз пройти предыдущую. Контрольный режим Здесь Вам предложат самостоятельно сделать то или иное действие. Это может быть изменение соответствующей опции в меню, нажатие на клавишу на панели инструментов или применение комбинации клавиш клавиатуры. Чаще всего пользователя просят самостоятельно повторить те действия, которые лектор только что произвел. Тестовый режим Здесь от пользователя потребуется максимум внимания и знания предметной области. Вам придется самостоятельно решить несколько задач, которые поставит лектор. То есть выполнить самому ряд действий, оперируя с мышью и клавиатурой. Это потребует твердого знания всего материала этого урока.
20
TeachPro Microsoft Access 2003
Область демонстрации урока В рабочей области демонстрируется непосредственная работа лектора с этой программой: перемещается курсор мыши, набирается текст, формируются таблицы, открываются меню и т. д.
Панель управления системы TeachPro
Ее основная задача - дать Вам возможность самому управлять процессом обучения: вызывать систему помощи, ставить свои закладки в наиболее интересных местах и т.д. Забегая вперёд, скажем, что с этой панели можно вызвать дополнительные панели – панель закладок и панель текста лекции. Окно с автоматически прокручиваемым текстом лекции будет особенно полезно для глухих и для людей с ослабленным слухом, или же при отсутствии звуковой карты на компьютере. Теперь рассмотрим, из чего состоит управляющая панель программы. Перед нами ряды клавиш и информационная панель. Начнем с клавиш. Каждая из них имеет надпись или значок, поясняющий действия. Они имеют две позиции, нажатую или отжатую. Кроме того, клавиши могут быть доступными или недоступными в данный момент времени. Доступные клавиши выглядят вот так. А недоступные - так. Это может означать, что в текущем режиме такая клавиша бессмысленна, как, скажем, Подсказка в режиме непрерывной демонстрации. Далее представлен полный перечень всех клавиш и краткое описание их функций.
Руководство пользователя
21
Клавиши управления демонстрацией урока Повтор вопроса - в режимах «контрольный» и «тестовый» нажатие на эту клавишу приводит к повторению вопроса преподавателя. Стоп - остановка прослушивания урока Старт - начать (или продолжить) урок Пауза – временная (короткая) остановка Вернуться назад на один шаг Перейти на шаг вперед Перейти в конец урока Перейти в начало урока
Клавиши изменения режимов обучения Обучение в непрерывном режиме Пошаговый режим Контрольный режим Тестовый режим Каждый новый урок по умолчанию начинается в непрерывном режиме (клавиша Фильм утоплена в панель). Чтобы перейти в другой режим, достаточно нажать на нужную клавишу.
Дополнительные функциональные клавиши TeachPro Подсказка Используется только в контрольном и тестовом режимах. Суть ее проста - когда Вы совсем не знаете, как выполнить задание лектора, нажимайте на Подсказку. Поскольку в тестовом режиме Вам придется самостоятельно выполнять не одно, а серию действий, то и подсказка может быть получена отдельно по каждому из них.
22
TeachPro Microsoft Access 2003
1. Если потребовалось щелкнуть мышью в определенную область экрана, курсор принимает форму красного вопросительного знака. При вызове подсказки TeachPro проявит искомую область: - если необходимо кликнуть левой клавишей мыши – область загорится красным цветом: - если необходим двойной щелчок левой клавишей мыши, область загорится синим; - если необходимо кликнуть правой клавишей мыши (например, как для вызова контекстного меню) – область загорится зелёным цветом. Будьте внимательны: если в уроке требуется двойной щелчок, а вы нажали на мышь один раз, ответ будет занесён в статистику с ошибкой. Иногда (очень редко) может потребоваться нажатие мыши при зажатой клавише Shift, Alt или Ctrl. При этом подсказка загорится, как и прежде, то поверх появится надпись Shift и т.д. В некоторых уроках реализован также механизм Drag and Drop, так называемое перетаскивание объектов при помощи мыши. Вам потребуется нажать левую кнопку мыши в одной области экрана, протащить мышь по экрану и отпустить в другой области экрана. При подсказке первая область будет мигать красным, вторая – зелёным цветом. В случае если потребуется выделить диапазон ячеек, в качестве подсказки будут указаны верхний левый и правый нижний угол. При проведении линий потребуется провести линию из начальной точки, в конечную. При прохождении тестовых серий, при раскрытии вложенных подменю, бывает достаточно только подведения мыши, без нажатия. Такие области также будут отмечены красным цветом, но система среагирует уже при подведении мыши в некоторую область экрана, и урок пойдёт дальше. В качестве областей для нажатия мыши могут быть не только прямоугольники, но, хотя и довольно редко, области с многоугольными границами. Или же потребуется перечислить все области на экране, объединённые каким-либо признаком, или указать хотя бы одну из них. Если при этом вызвать подсказку, она будет оформлена в следующем виде: - если необходимо указать несколько точек-областей на экране (в произвольном порядке), то такие области будут отмечены красным цветом; - если важен порядок перечисления точек, при подсказке каждая область будет снабжена номером 1, 2, 3..; - если достаточно указать одну область из всего набора (например, действие можно сделать любым способом среди альтернативных), такие области будут отмечены каждая оранжевым цветом.
Руководство пользователя
23
2. Если же понадобится нажать клавишу или их комбинацию на клавиатуре, курсор принимает чёрно-белую форму. При вызове подсказки система TeachPro нарисует окошко, где отобразятся те клавиши, на которые требуется нажать для продолжения занятия. Некоторые клавиши потребуется нажать в сочетаниях с Shift, Ctrl, Ctrl+Shift или Alt. Иногда при ответе потребуется нажать не одну клавишу, а ввести целую строку текста, если это обусловлено ситуацией в уроке. Например, ввести адресную строку текста, значение ячейки таблицы, или просто ввести число, которое только что видели на экране. На экране отметится белый прямоугольник, в котором необходимо ввести этот текст последовательным нажатием клавиш, и нажатие каждой клавиши отобразится в строке текста на экране. Также можно получить подсказку по очередной клавише. Обычно такой ввод нечувствителен к регистру, но в случае смены языка появится сообщение, если надо переключить клавиатуру с английского на русский. 3. Вопросы с вариантами ответов. По ходу лекции могут возникать текстовые вопросы с четырьмя или менее вариантами ответа. В таком случае надо будет указать мышью текст правильного ответа. Если же в качестве ответа на вопрос предлагается «да» или «нет», необходимо указать правильный вариант мышью. При необходимости можно воспользоваться подсказкой, и область правильного ответа отметится красным.
Закладки Система закладок дает Вам возможность отмечать те места в лекциях, которые Вас особенно заинтересовали. Поскольку процесс обучения весьма индивидуален, то и наборы закладок у каждого свои. Когда на первом экране Вы выбираете свое имя, подгружаются именно Ваши закладки. Вот несколько случаев, когда нужно поставить закладку: 1. Часть материала урока так и осталась непонятой. Отметьте это место, и в дальнейших лекциях, где такой материал будет использоваться на других примерах и в ином контексте, Вы сможете сопоставить приемы работы и разобраться в сложной теме. 2. Вам показали какой-нибудь интересный прием или метод, и Вы поняли, где в своей работе сможете его использовать. Перед началом проектирования можно быстро перелистать нужные, отмеченные в лекциях элементы. 3. Когда готовятся лекции для школьников и студентов
24
TeachPro Microsoft Access 2003
Как их ставить? Если нажать на клавишу Закладка, то урок будет приостановлен, панель управления TeachPro заменится панелью управления закладками. Вот она.
В левой части расположен список закладок, уже существующих в системе. Если названия всех закладок не поместились на экране, можно воспользоваться полосой прокрутки и найти нужную. Чтобы перейти по закладке, можно дважды щелкнуть мышью по ее названию, либо, отметив закладку (однократный щелчок мышью), нажать на клавишу Перейти к… А над списком находится комментарий к текущей (отмеченной) закладке, указывает полное название закладки, дату ее создания, а также номер лекции, на которой она поставлена. Далее расположен набор клавиш. Они недоступны в панели управления уроком, ими можно воспользоваться только отсюда. Итак, клавиши управления системой закладок. Главная. Возвращает Вас обратно к панели управления уроком. Создать. Создает новую закладку. Если на эту клавишу нажать, появится небольшое меню, где в строке названия можно набрать текст, обозначающий закладку, а потом нажать на клавишу Да, (если передумали, нажмите на клавишу Отмена). Когда Вы добавляете в системе новую закладку, она, конечно же, появляется в общем списке. Удалить. Если какая-то закладка больше не нужна, щелкните один раз по ее названию в списке, а потом нажмите на клавишу Удалить - и ее не станет. Перейти к…. Область демонстрации урока изменится, отражая тот момент в лекции, на который поставлена закладка. Продолжаем тему «Дополнительные функциональные клавиши на главной, управляющей панели курса». Далее – переход к следующему уроку Текст - вызывает окно с текстом лекции Оглавление - возвращает Вас обратно к страничке с оглавлением данной лекции.
Руководство пользователя
25
Панель с текстом лекции выглядит так:
Нам осталось рассмотреть информационную панель главного экрана системы TeachPro. Она имеет несколько областей, в каждой из которых содержится свой тип информации. В самом центре управляющей панели курса находится вот такое окно.
Time - Общее время работы с уроком. Vol. - Уровень громкости. Для того, чтобы изменить его, надо навести курсор мыши на ползунок панели, нажать левую кнопку мыши и, не отпуская ее, переместить ползунок до желаемого уровня. Lesson - Номер текущего урока. Message - В этой строке Вас информируют о фирме, предоставившей оболочку для данного курса, попеременно высвечивая название фирмы и адрес ее сайта. Этот значок показывает, что после каждой лекции система остановится, и Вы сможете работать дальше по своему усмотрению. Выбрав такой значок, Вы можете прослушать весь лекционный материал курса без перерыва. Этот режим предназначен для организации массовых лекционных занятий в больших аудиториях, где есть необходимость в непрерывном звучании нескольких лекций подряд. Выберите снова соседний значок, и после каждой лекции опять будет остановка. Линейка состояния – Вся она условно отображает общее время урока, а ее темная часть - уже прослушанный материал. На линейке находятся деления. Это контрольные точки. Причем в разных режимах линейка отградуирована по-разному. Когда текущая позиция урока подойдет к такому делению (темная полоска «доползет» до очередной отметки), в пошаговом режиме изложение материала остановится, а в контрольном -
26
TeachPro Microsoft Access 2003
после звукового сигнала Вас попросят самостоятельно произвести некоторое действие. Клавиши Перейти на шаг вперед и Вернуться назад на один шаг переводят текущую позицию урока соответственно на одно деление вперед или назад. Для этого же предназначены деления линейки в режиме Фильм. В самом низу информационной панели Вы видите бегунок, уцепившись за него мышкой, можно перемещаться по уроку быстрее.
Поисковая система Несколько слов о поисковой системе курса. Она чрезвычайно полезна и в процессе обучения, и в реальной работе с изучаемыми системами. Вы всегда сможете быстро и легко отыскать любой материал данного курса. От Вас требуется только четкость в формулировках. Войдите в содержание и нажмите на клавишу Найти. Перед Вами поисковая панель. Введите название искомой темы в поле редактирования или выберите ее из списка (он представлен в алфавитном порядке). Затем выберите из нижнего окна название урока, в котором данная тема рассматривается (в этом окне даётся название раздела и урока, в котором рассматривается ключевое слово). Далее нажмите на кнопку Перейти к…. Вы окажетесь не только в нужном уроке, но и в нужном его фрагменте. То есть именно там, где описывается выбранное Вами понятие.
Руководство пользователя
27
Устранение возможных проблем с программой При возникновении любых неполадок в работе с программой обращайтесь в службу технической поддержки нашей фирмы: Телефон: (495) 673-76-93
Проблемы при инсталляции программы Проблема
Решение проблемы
Для пользователя Windows2000/XP (без прав администратора) появляется окно с красным знаком без текстового сообщения
Для установки необходимо иметь права администратора. Установите себе права администратора.
Кнопки отображаются чёрными прямоугольниками
Установлен режим 16 или 256 цветов. Переключите монитор в режим с большим количеством цветов.
Диск не работает через локальную сеть.
Для обучения в локальной сети покупайте специальные сетевые версии, этот диск может работать только с CD-ROM.
Сообщение: Не установлено ни одного поддерживающего звукового устройства.
Нет звуковой карты; не установлены драйвера или нарушен интерфейс MCI .
ВНИМАНИЕ! Программа не будет проигрываться в музыкальных центрах, DVD проигрывателях и CD плейерах т. к. это диск для компьютера и имеет специальный формат.
28
TeachPro Microsoft Access 2003
Проблемы при запуске программы Проблема
Решение проблемы
Если программа не запускается (моргает чёрный экран)– при наличии двух CD-ROM, один из которых пишущий.
Повторите инсталляцию с устройства, буква которого меньше по алфавиту.
Не отображаются шрифты (в случае Windows98/ME).
Если у вас есть CD-ROM с коллекциями 6000, 12000, 15000 шрифтов, не устанавливайте все эти шрифты сразу(!), Windows нормально поддерживает до 500 шрифтов.
Не отображается видео (звук идёт).
Произведена усечённая выборочная установка Windows95/98, необходимо зайти в Панель управления – Установка и удаление программ – Установка Windows – Мультимедиа – установите кодеки видеосжатия.
Ошибка распаковки урока.
Возможно, не читается файл урока с CD-ROM, или же у пользователя без прав администратора нет доступа к временным файлам или к каталогу Windows.
Руководство пользователя
29
Затруднительные ситуации при проигрывании урока Проблема
Решение проблемы
Через 10-15 минут урок «стопорится».
Урок кончился, и необходимо загрузить следующий. При движении мыши вниз экрана появится всплывающая панель, нажмите «Оглав.».
Не играет звук.
Возможно, наушники вставлены в гнездо на передней панели CDROM. Вставьте наушники в гнездо звуковой платы сзади компьютера.
При запуске урока только чёрный экран.
Такое бывает, когда звук идёт, но не подключены колонки, и видео тоже идёт, но не установлены кодеки видеосжатия (в случае усечённой установки Windows). Произведите полную установку Windows.
TeachPro Microsoft®
Access 2003
Глава 1. Основы создания приложений Access
33
Глава 1. Основы создания приложений Access 1.1. Введение Вы приобрели этот диск и решили изучить систему управления базами данных Microsoft office Access 2003 из пакета Microsoft Office. Как и любой другой курс, изданный, кмак в электронном виде, так и в виде учебника, наш курс тоже имеет свою аудиторию. Ну и наверняка, раз вы приобрели этот диск и решили изучить наш курс при помощи нашей системы обучения, вы, скорее всего, не являетесь достаточно квалифицированным специалистом в этой области и, скорее всего, даже являетесь начинающим. Может быть, вы даже не имеете соответствующего образования. Но, тем не менее, вам пришлось столкнуться с базами данных из Microsoft office Access 2003. А это значить, что вам, скорее всего, оказалось недостаточным тех обширных возможностей, которые предоставляют вам другие программы из набора Office, такие как Microsoft Word и Microsoft Excel. Например, такая программа, как Microsoft Excel, обладает достаточно широкими возможностями по работе с базами данных. Может быть, вас не устроил Microsoft Excel или объем ваших данных достаточно вырос, и вам стало неудобно пользоваться программой Microsoft Excel .И вам понадобилось воспользоваться самой сложной из программ офисного пакета Microsoft Office Access. Надо сказать, что эта программа гораздо сложнее. Особенно по сравнению с другими программами набора Office Microsoft Word и Microsoft Excel. Раз вы решили изучить программу Microsoft office Access 2003, то, наверное, вы уже сталкивались с другими программами Microsoft Office, такими, как Word, Power Point и другими. Но, надо отметить, что, конечно же, человек начинает изучать офисные приложения не с Microsoft Access. Обычно начинают знакомство с Microsoft Word. Далее по сложности, наверное, это Microsoft Power Point и Microsoft Excel. Надо сказать, что все остальные программы Microsoft Office, такие как Word, Excel, Power Point, Front Page и т.д., обладают достаточно простым, интуитивно понятным интерфейсом. И внутри этих программ, человек, начав работу, сразу же может видеть результаты своих так сказать трудов. И реально получить непосредственный результат. Например, запустив текстовый редактор Microsoft Word, при помощи которого чаще всего и происходит подготовка всех текстовых документов, мы сразу же получаем такой лист, на котором можно ввести какой-либо текст. И при этом, сразу же получить непосредственно готовый результат на нашем экране компьютера. И если не требовать каких-то достаточно тонких потребностей по форматированию и созданию каких-либо данных, то в принципе, какой-либо обычный текстовый документ, заявление и т.д. можно получить достаточно легко. Да и все те кнопки, которые располагаются в верхней части нашего окна, точно так же, как и меню, интуитивно понятны. Закроем это приложение. Сохранять этот документ, конечно же, не будем.Отметим второе приложение, такое, как Microsoft Office Excel, ей также достаточно часто пользуются.Эта программа, конечно же, немножко сложнее, чем Microsoft Word, но тоже интуитивно понятно. И, если, так сказать, Word можно представить себе, как тетрадку в линейку, то Microsoft Excel, пользуясь так сказать школьной терминологией, это тетрадка в клетку, в каждой ячейке которой, можно ввести какой-либо текст или же какую-либо другую информацию. Например, какое-либо число. И точно так же как и в случае с Microsoft Word, мы сразу же получаем непосредственный результат на нашем экране. Все достаточно наглядно и просто. И, как мы видим, эту таблицу можно заполнить достаточно легко, не спотыкаясь о сложности управления этой программой и, конеч-
34
TeachPro Microsoft Access 2003
но же, так же как и в Microsoft Word, в принципе есть здесь и свои трудности, на овладение которых тоже необходимо достаточно большое время и нужно стать профессионалом. Надо отметить, что кнопки на панели инструментов так же, как и кнопки меню, здесь имеют немножко более сложную структуру, чем в Microsoft Word. Конечно же, надо сказать, что если вы достаточно хорошо знакомы с какой-либо программой Microsoft Office, с Word, Excel, Power Point и т.д., то это достаточно хорошее подспорье для изучения других программ Microsoft Office, в частности Microsoft ACCESS. Поскольку, достаточно много возможностей, реализованных в какой-либо из офисных программ, реализовано аналогичным образом и в других программах офисного пакета. И навыки, приобретенные в какой-либо из этих офисных программ, лишними не будут. Точно также вам помогут и общие навыки по работе в системе Windows, которые в принципе претерпели некоторые изменения от Windows 95 до ХР. Правда, общие работы с этими операционными системами, тем не менее, остались достаточно похожими и интуитивно понятными. И пользователь, который работал с любой из этих систем, будет достаточно комфортно чувствовать себе и в любой другой из них. Ну и, конечно же, такие навыки, как работа с файлами, каталогами, как можно добраться до какого-либо файла на нашем компьютере, открыть его и записать обратно, тут необходим минимум, который, конечно же, необходим при работе с любым приложением в офисных приложениях и вообще при работе на компьютере. Окно Microsoft Windows XP в стандартной поставке выглядит приблизительно таким образом. Сейчас, поскольку мы работает достаточно много с офисными программами, поэтому на нашем рабочем столе мы расположили вот эти несколько наиболее популярных офисных программ. Вернее ярлыки к ним. Это такие ярлыки, как Word, Excel и, конечно же, Microsoft Office AC 2003. Рассмотрим теперь более подробно нашу программу Microsoft Office AC 2003, с которой мы и будет работать в дальнейшем. В принципе, Microsoft AC достаточно удобен, если человек сталкивается с такими стандартными экономическими и бухгалтерскими вопросами, как создание платежек, создание какихлибо структурированных данных. Например, создание списка товаров, услуг, пайс листы всякого рода, расписание уроков, расписание движения транспорта. Ну, например, список телефонных номеров и т.д. Область применения, в которых мы достаточно успешно можем применить Microsoft Office AC достаточно широка. Ну и, конечно же, надо отметить, что Microsoft Office AC это в первую очередь порядок в делах. Т.е., если у нас есть, например, правильно организованная база данных, например, со списком персоналов, то мы тогда можем быть уверенными, что мы никогда не забудем изменить фамилию человека, его паспортные данные и т.д., и ввести их неправильно. Например, в случае, если он по каким-либо причинам поменял свой паспорт, место жительства и т.д. Надо отметить, что совершенство любой базы данных заключается в том, что любая единица информации в нем хранится точно в одном единственном отведенном ему месте. Фамилия хранится в одном месте, паспортные данные в другом, и все это соединяется лишь в тех случаях, когда возникает в этом необходимость. Запустим теперь программу Microsoft Office AC и посмотрим, как все это будет выглядеть на практике. Для этого достаточно щелкнуть дважды на вот этом ярлыке. И вот исходный вид программы Microsoft AC мы можем видеть на нашем экране перед нами. Откроем теперь какую-либо базу данных. И вот мы можем видеть готовый пример уже созданной базы данных Microsoft AC. Он включает в себя некий каталог товаров, покупателей, заказов, служащих и движение всех этих данных между этими категориями внутри нашей программы Microsoft AC. Первое, что мы, конечно, видим, это вот эта главная кнопочная форма, при помощи которой мы можем вызвать каждую из отдельных таблиц по отдельности. Например, если щелкнем на кнопке Фрукты, то можно увидеть все те единицы этих товаров, которые у нас есть в нашей базе данных. Мы можем передвигаться по этому списку, вызывая все разного рода фрукты и
Глава 1. Основы создания приложений Access
35
их свойства, включая их стоимость. Можем вызвать какой-либо другой список. Например, список покупателей, которые тоже, как мы видим, состоит из разных данных об этом человеке или об этой фирме. В отдельных формах базы данных мы можем видеть соответствующие так сказать единицы. Из них состоит наша база данных. Кроме них мы можем видеть и различного рода отчеты по тем, уже введенным данным, которые у нас есть. Например, щелкнем на кнопке продаже по месяцам и можно увидеть тот отчет, который при этом подготовил нам компьютер. Как мы видим, у нас этот отчет за ноябрь 1996 года, который состоит из первой вот такой страницы. Далее мы можем передвигаться, увидев все записи, которые входят в этот отчет. Кроме этих двух основных видов документа мы можем перейти и в основную нашу форму, в которой и происходит создание, и редактирование нашей базы данных. В ней мы можем вызвать и сами таблицы, в которых сконцентрированы все наши данные. Например, если мы щелкнем на таблице Служащие, то можно увидеть, как выглядит эта таблица и какие в нем здесь есть поля и какие здесь есть данные. Ну, конечно же, надо сказать, что все наши таблицы надо держать достаточно организованно, поскольку любое изменение в какой-либо ячейке одной из этих таблиц, сразу же вызовем по цепочке изменения во всех остальных документах. В частности, различного рода отчетах, формах и т.д., поскольку они все взаимосвязаны между собой. Конечно же, это требует максимального количества подготовительной работы по созданию и структурированию нашей базы данных и составлению отдельных его элементов, таких как таблицы, таких, как создание запросов, форм, отчетов и т.д. Поэтому, конечно же, невозможно просто открыть Microsoft AC и сразу же создать в нем какуюлибо базу данных, без всякой подготовки. Прежде, чем мы получим какой-либо более или менее удобоваримый вариант, пройдем достаточно много времени на всякого рода подготовительные работы. В отличие, конечно же, от Word, Excel и т.д., где, то, что мы вводим, сразу же можно видеть в виде готового результата. Ну, в принципе, несколько облегчает работу то, что, конечно же, скорее всего это база данных, база данных Microsoft AC не является первой базой данных, с которой вы сталкивались. Скорее всего, вы уже сталкивались с базами данных. Возможно, когда работали с какими-либо системам в бухгалтерии, или в других программах аналогичного порядка. В Microsoft AC в отличие от других стандартных программ, оперирующих с базами данных, дает нам возможность выполнять любые действия и выдавать любые отчеты и формы так сказать, своими руками. И позволяет не привязываться к тем стандартным действиям, которыми мы ограничены различными специализированными программами. Например, бухгалтерскими
1.2. Что нового Продолжим наше занятие. Что касается вида моего экрана, то, если вы работаете в системе Windows XP, то он, конечно же, вам должен быть хорошо знаком. Разрешение моего экрана в процессе работы с данным курсом 800х600 единиц. Возможно, вы будете работать с большим разрешением, что, конечно же, в принципе, более удобно, поскольку большее количество информации может быть размещено на вашем экране. Но, тем не менее, все файлы примеров, которые будут созданы, будут созданы именно при этом разрешении. Использование этих примеров на вашем компьютере не должно создать больших проблем. А что касается терминологии, то, к сожалению, русская терминология находится еще, в принципе, в процессе становления. Принято считать, что любой термин можно считать устоявшимся, если он прожил в данном языке, ну, хотя бы лет 5. Входящая в жизнь компьютерная технология, конечно же, она молодая, и изменяется достаточно быстро. Поэтому может быть, я буду использовать такие слова, которые вы возможно еще не знаете. Ну, разумеется, в каждом курсе делаются некото-
36
TeachPro Microsoft Access 2003
рые предпочтения. Что касается предпочтения, то они будут достаточно очевидны из нашего курса. В принципе, надо сказать, что людям от Microsoft Office AC обычно нужно что-то достаточно конкретное. Надо сказать, что достаточно сложные ограничения накладывают на наш курс возможности показа по сетевым возможностям Microsoft Office AC, поскольку показать работу одновременно нескольких компьютеров в одном компьютере достаточно сложно. И поэтому показывать все в одном экране технически нет никакой возможности. Ну, а поскольку Microsoft Office AC чаще всего используется в экономических задачах. А также в управленческих целях. Поэтому мы достаточно мало коснемся таких вопросов, как организация баз данных звуков, изображений и т.д. А также мало будем уделять времени уже готовым решениям, которые, конечно же, есть в Microsoft AC так же, как и в других приложениях Microsoft Office. Надо сказать, что, конечно же, используя Microsoft AC, тем не менее, надо быть достаточно аккуратными и точно осознавать все те вычисления, которые мы закладываем в основу наших баз данных. Например, если мы пользуемся базами данных АС в экономических целях, в бухгалтерии и т.д., то бездумно его применение и разного рода ошибки могут привести к ненужным результатам. Запустим теперь нашу программу Microsoft Office AC и рассмотрим подробнее его уже в действии. Щелкнем дважды на вот этом знаке. И вот, Microsoft AC 2003 уже запустился перед нами, и мы можем оценить весь тот интерфейс, который разработчики этой программы создали для нас. Несколько слов добавим об отличии Microsoft AC 2003 от предыдущих версий. Ну, в принципе, отметим, что, конечно же, Microsoft AC на сегодняшний день является, скорее всего, лучшей программой по работе с базами данных. С одной стороны мы имеем достаточно удобный интерфейс. Ну и с другой стороны, конечно же, достаточно мощное средство по обработке данных. Ну, надо отметить, что по сравнению с предыдущими версиями Microsoft AC изменений достаточно мало. Надо отметить, что добавлено в принципе не новые средства, которых в принципе не было в предыдущих версиях, а, скорее всего, те недостающие, необходимость которых была вызвана, так сказать, жизнью. Или же исправлены те компоненты, которые в принципе были в более ранних версиях, но работали не так, как надо. Но, надо отметить, что еще в предыдущих версиях Microsoft AC все было достаточно хорошо продумано. Но, среди основных новшеств, надо отметить о возможности альтернативного ввода. Например, голосового. Но, правда, надо сказать, что это достаточно сомнительная возможность. Появилось еще распознавание рукописного текста. Конечно, все это хорошо. Но надо сказать, что я еще не встречал человека, который бы всерьез рассматривал эти возможности, поскольку в принципе, и головой ввод и рукописный текст достаточно капризный в использовании. Да и работают чаще всего эти возможности только с английским языком. А русский варианты, если они и есть, слабее, по своим возможностям. Но надо сказать, что еще одна возможность, которая и более важна, эта поддержка XML формата, который увеличивает степень интеграции Microsoft AC Интернетом и т.д. В этой версии Microsoft AC мы также можем работать и с базами данных, созданными в более ранних версиях акцесса. Это, конечно же, достаточно удобно, поскольку надо сказать, что в каждой новой версии Microsoft AC есть новые форматы и раньше приходилось все время преобразовывать из одного формата в другой, для того чтобы мы могли работать с соответствующими базами данных. Ну, в данном случае ситуация несколько упростилась. Мы можем непосредственно работать с базами данных, созданными в предыдущих версиях программы Microsoft AC. Хотя, конечно же, у нас есть возможность преобразовать их к новому, более широкому по своему возможностям формату Microsoft AC последней версии. Надо еще отметить, конечно же, и внешний вид нашего приложения. Ну, в принципе, он достаточно похож на тот внешний вид, который имеет и другие приложения Microsoft Office, такие, как Word, Excel и т.д. Но, в принципе по своей расцветке и виду кнопок, и интерфейса, отличаются от Microsoft AC предыдущих версий. Ну, надо еще отметить,
Глава 1. Основы создания приложений Access
37
конечно же, область задач, которая появилась в правой части нашего экрана. Она позволяет достаточно удобно пользоваться самыми наиболее популярными командами и возможностями, которые нам необходимы именно в данный конкретный момент. Ну, на этом в принципе можно бы и закончить введен6ие в Microsoft AC и уже приступить непосредственно к работе в этой программе.
38
TeachPro Microsoft Access 2003
Глава 2. Знакомство с таблицами, создание таблиц 2.1. Область задач Начнем наше занятие. Итак, запустим Access и рассмотрим, что такое база данных и из чего он состоит. Программу Access, так же как и любую программу можно запустить разными путями. В частности через кнопку Пуск, Все программы или же в принципе, если у нас ярлык этой программы выведен на наш рабочий стол, то можно просто щелкнуть дважды на этом ярлыке. И вот перед нами открылось окно Microsoft Access 2003, в котором справа у нас расположено окно области задач. В нем несколько разделов, в частности раздел Открыть. В этом разделе у нас расположено несколько баз данных, которые использовались в работе последними. Ну и, кроме того, здесь же находится пункт Создать файл, при помощи которого можно перейти в область задач создания нового файла. В верхней части этого окна расположена система помощи, в которой мы можем ввести какую-либо интересующую нас информацию и найти справку по этому вопросу. В принципе, можно было заметить, что также как и в любой другой программе в системе Windows, так же, как и с любой кнопкой и любой частью, если мы наш курсор остановим на одну секунду, то появляется вот такая подсказка ярлык, которая вкратце описывает, что представляет собой данная возможность. В частности, вот в этом месте находятся Web страницы на Web узле Microsoft Office Online ниже, например, мы можем подойти к какому-либо файлу, и найти в каком месте нашего диска он находится. Вот, в частности Создать файл, это перейти в область задач создания файлов. Точно также в принципе эта система действует и на любой кнопке, которая находится у нас в Microsoft Office. В принципе это касается, конечно же, и любой другой программы из системы Windows. Это окно области задачи является одним из нескольких, которые приготовили для нас разработчики Microsoft. Если мы щелкнем на вот этом треугольнике наверху этой области, то можно увидеть все те возможности, которые у нас здесь есть. Наряду с областью задач, приступая к работе, здесь у нас есть возможность переключаться на Справку, на Поиск, на Поиск файлов, Буфер обмена, Создание файла и Справка по шаблону. Каждая из этих возможностей обладает собственным окном и собственными настройками. Ну, рассмотрим их по порядку. Следующая это Справка. Если мы на ней щелкнем, то окно области задач будет выглядеть вот таким образом и наверху, конечно же, у нас расположена область ввода, в которую мы можем ввести одно или несколько ключевых слов, по которым, и будет происходить система помощи. Ну, рядом находится стрелка для начала помощи. Мы можем щелкнуть на оглавление и посмотреть весь список доступных нам пунктов, которые находятся в строенной системе помощи Microsoft Access, ну или же можем подключиться к одной из возможностей через Интернет. Подключение к Web узлу, Автоматическое обновление и т.д. Кроме этого, здесь еще есть несколько возможностей, которые перечислены ниже. Помощь, учебный курс, загрузка и т.д. Следующая возможность, это возможность поиска, при помощи которой мы опять-таки можем провести поиск каких-либо ключевых слов по интересующему нас вопросу. В частности в Интернете или в каких-либо других местах, выбирая соответствующую строчку из вот этого выпадающего курса. Можем искать в Учебном курсе, в Системе помощи, в Автономной справке, в Office и т.д. Следующее окно, которое у нас здесь есть, это окно поиска файлов, при помощи которого мы можем найти файл на нашем жестком диске. Причем мы можем ввести шаблон для поиска или целиком название файла, ну и выбрать область поиска и тип файла, который мы хотим при этом искать.Область поиска можем ограничить при помощи соответствующих переключателей, которые
Глава 2. Знакомство с таблицами, создание таблиц.
39
открываются, щелкнув на вот этом выпадающем меню. Ну, как мы видим, сейчас у нас включен Мой компьютер, на котором в принципе мы можем снять или поставить галочки на каждом из жестких дисков или других областей нашего компьютера. Конечно же, галочка означает, что эта область включается в область поиска, а если мы снимем галочку в соответствующих местах, то, конечно же, эти места из области поиска будут исключены. Ну и, мы можем поставить или снять галочку с пункта верхнего уровня и соответственно включаются или выключаются все пункты более низкого уровня для поиска. Ну, конечно же, если мы вообще везде снимем галочки, то так поиск проходить нигде не будет. Поэтому, в принципе, надо поставить галочки на интересующих нас местах, и далее выбрать тип файлов, который мы хотим включить в систему поиска. Ну, тут приблизительно та же самая система, что с выбранными размещениями файлов. Т.е. мы должны выбрать те типы файлов, которые мы хотим искать в данном конкретном случае. Ну, как мы видим, сейчас у нас включены все Файлы Office и все Web страницы. Мы можем искать, например, только файлы Access, выключив файлы Word, Excel, и других типов. Вот в таком виде мы будем искать только файлы Access, которые расположены на нашем компьютере в тех местах, которые мы только что выбрали. Ну, как мы видим, тут достаточно просто проводить поиск, достаточно подобрать параметры и далее щелкнуть на кнопку Найти. Здесь же находится пункт, Расширенный поиск файлов, при помощи которого у нас будет больше возможностей по реализации возможностей поиска. Если мы щелкнем, то появляется вот такое окно немного другого типа, в котором мы можем выбрать уже не только, так сказать, одномерный поиск по ключевым словам, но и комбинировать их друг с другом при помощи связки и/или. Можем выбрать различные условия: содержит, не содержит, свойство по ключевым словам, редакции, размерам, тексту и т.д. Ну, в общем, здесь более широкие возможности, которые предоставляет нам Microsoft Access. Рассмотрим следующую возможность. Следующая возможность, которая есть у нас в области задач, это работа с Буфером обмена, т.е. с той средой, которая позволяет нам обмениваться какими-либо файлами, фрагментами, объектами и т.д. между различными частями программы, и различными программами в том числе. Сейчас, как мы видим, буфер обмена у нас пуст, поскольку мы пока никаких операций по копированию и перемещению таких фрагментов не делали. Ну, рассмотрим эту возможность позже, а сейчас рассмотрим следующую возможность, это Создание файла. В результате появляется вот такая возможность, в которой мы можем выбрать один из нескольких вариантов. Это создание новой базы, данных, пустой страницы, проекта с имеющимися данными, проекта с новыми данными или же создать базу данных из имеющегося файла. Ну, кроме этого, шаблон мы можем искать в сети, в Интернете, или же на жестком диске нашего компьютера. Последняя возможность, которая здесь у нас есть, это найти Справку по шаблону. В принципе у нас шаблонов пока нет, поэтому опять-таки этот пункт у нас не доступен. Как мы видим, эта область задач позволяет нам решать довольно много различного типа разного рода задач по созданию базы данных и работы с ними. Кроме этого, у нас в верхней части этой области задач расположены три кнопки Назад, Вперед, и Домашняя страница, при помощи которых мы можем опять-таки передвигаться между несколькими видами области задач. Ну, в принципе, эти кнопки практически дублируют те возможности, которые у нас есть при помощи выпадающего меню в верхней части этого окна. Ну и, конечно же, если эта область задач нам совсем не нужна, мы можем щелкнуть вот на этом крестике и ее закрыть.
40
TeachPro Microsoft Access 2003
2.2. Работа с таблицами 2.2.1. Общие приемы работы с таблицами Откроем теперь какую-либо уже существующую базу данных и рассмотрим основные вопросы, связанные с ним. Для этого перейдем к пункту Приступая к работе и откроем одну из тех баз данных, которые у нас были в работе ранее. Щелкнем, например, на вот этом пункте. Перед нами появляется вот такая база и при этом надо сказать, что автоматически область задач исчезает с нашего экрана. Она уже выполнила свое дело, так сказать помогла нам запустить базу данных. А теперь мы должны работать уже непосредственно с ней. Как мы видим, перед нами сразу же открылась главная форма, которая создана именно для вот этой базы данных. А рядом находится вот такая стандартная область, в которой у нас перечислены все возможности, связанные с нашей базой данных, эта возможность просмотра таблицы с которой она состоит, просмотра запросов, форм, отчетов и т.д. Т.е. всех тех частей, из которых и состоит наша база данных. Ну и самое главное, конечно же, в любой базе данных, это таблица. Т.е. это так сказать те контейнеры, в котором и расположены все данные, с которыми мы оперируем в данной базе данных. Как мы видим, сейчас мы как раз расположены на области таблиц, в которых у нас перечислены все таблицы, из которых состоит эта база данных. Здесь их, как мы видим, несколько. В каждой из которых, сосредоточен определенный список соответствующих данных.В частности, вот эта таблица служащие, вбирает в себя всех служащих. которые у нас есть в виде таблиц. Если мы на ней щелкнем дважды, то открывается соответствующая таблица, которая в принципе выглядит приблизительно так же, как обычная таблица. Например, в Excel. Т.е. у нас перед глазами вот такая клеточная структура. Здесь одна строка является одной записью нашей таблицы, в которой перечислены все те данные, которые касаются конкретно одного служащего. В нашем случае, как мы видим, здесь у нас несколько полей, которые вбирают в себя код служащего, его имя, фамилию, должность, отдел, дата рождения и т.д. Каждая строка, которая содержит соответствующую информацию, в терминологии базы данных обычно называются записью. А каждая колонка или столбец, обычно называют полем. Т.е. это у нас поле имени, должности, и т.д. Но, надо сказать, что записи у нас, конечно же, по своей идеологии они идентичны, имеют одну и ту же структуру. Т.е. в каждой записи одинаковое количество ячеек, и одинаковый набор этих ячеек. А вот в отношении полей тут немножко более сложная система. Т.е. каждое поле в базе данных имеет свою собственную структуру. Например, вот это поле. Оно состоит из данных типа строка, вот это поле код служащего состоит из данных типа целое число, точно так же как поле, дополнительно. Рядом у нас находится поле дата рождения, которое представляет собой уже другой тип данных, а именно дату, которая в принципе похожа на, например, поле отдел, где у нас данные в виде строки, но на самом деле здесь немножко отличаются эти данные. Поскольку, например, в дате рождения соответствующие данные имеют достаточно строго определенный формат. Здесь, например, нельзя вводить буквы, нельзя вводить другие какие-либо символы. А нужно вводить соответствующие цифры и точки в том порядке, в котором это обычно принято при вводе дат. Ну, точно такую структуру имеет следующее поле Дата, Name, в которое мы можем перейти, сдвинув, соответствующий ползунок и последняя область данных, это данные в виде объектов, в которые мы можем вводить объекты произвольной формы. В частности, у нас вот в этом месте введен точечный рисунок. Можно его посмотреть, щелкнув на нем дважды. Открывается соответствующая картина, нарисованная в стандартном средстве Windows. закроем теперь этот рисунок.
Глава 2. Знакомство с таблицами, создание таблиц.
41
Перейдем в начало нашей таблицы. Попробуем открыть другую таблицу. Для этого мы можем, конечно же, закрыть эту, но можем просто-напросто, перейдя на главное окно базы данных, просто-напросто щелкнуть на каком-либо другом из таблиц. В частности, если мы выберем пенсионный фонд, то можем видеть еще один тип данных, который у нас использован в виде поля, это гипер ссылки, каждая из которых представляет собой обычную ссылку на какой-либо ресурс в Интернете. Откроем таблицу данных Заказы и можем видеть еще один тип данных, который у нас здесь есть, это так сказать булевой тип. Т.е. это тип, который можем выбрать или не выбрать. Что отображается в виде вот этого флажка, его можем поставить или можем убрать. Т.е. тут всего лишь два значения. Здесь нельзя ввести ни число, ни текст, ничего, кроме вот такого флажка. Различные таблицы, которые у нас есть в нашей базе данных, например, вот эта таблица Служащие, очень часто связаны друг с другом. А не живут так сказать изолировано. В частности, с нашими служащими связана определенная информация. И это можно видеть по вот этому плюсу, который находится рядом, с левой стороны. Если мы щелкнем, например, на вот этом плюсе, то открывается еще дополнительная информация, которая связана с этой записью. Закроем теперь. Щелкнем на минусе, чтобы обратно вернуть таблицу в исходное состояние. Рассмотрим эту же таблицу в режиме конструктора. Для этого щелкнем на вот этой кнопке. И можно увидеть все те поля, которые у нас в этой таблице были. В частности код служащего, имя, фамилия, должность и т.д. И можно увидеть, какого типа является это поле. Как мы видим, код служащего у нас является счетчиком, т.е. таким типом данных, который представляет собой просто-напросто уникальный номер этой записи в нашей базе данных. Следующие несколько полей у нас являются текстовыми полями в виде строки, далее у нас находятся два поля Дата, Время. И последнее поле Фото, это у нас тип данных объекты. Ну, как мы видим, все это отображается сразу же, как только мы становимся на какую-либо строку в нижней части этого конструктора, в которой можно видеть различного рода характеристики, связанные с этим полем. В частности, с вот этим полем Отдел, можно видеть, что связано несколько параметров. Первый из них, это размер поля, который задает 50 символов на одну информацию. Далее, в принципе, можно ввести формат поля, маска и т.д. Можно или нет, оставить пустые строки и т.д. Если перейдем на дату, здесь можно увидеть свои параметры, которые характеризуются именно для поля типа Даты. Здесь, как мы видим, есть маска ввода, которая и жестко регламентирует, как будет выглядеть этот тип данных в нашей таблице. Щелкнув вот на этом выпадающем списке, можно увидеть, какие типы данных в принципе возможны у нас в таблице. Как мы видим, наряду с текстовыми, наряду со счетчиком и датой времени, у нас есть возможность, еще определить поле в виде текста в несколько строк. Можно определить числовое поле, денежное поле, которое будет характеризовать финансовые данные, в конце которых будет приписываться соответствующая денежная единица. В частности, в России это, конечно же, рубль. Логическое поле, которое может принимать одно из двух значений, что соответствует постановке или нет соответствующего флажка. Мы это уже видели. Далее поле объектов, при помощи которого можем вводить в нашу запись какие-либо объекты, гипер ссылка для ссылок на какие-либо ресурсы или же мастер подстановок. Как мы видим, здесь у нас довольно большие возможности по выбору типов полей. Точно также можно рассмотреть и в режиме конструктора любые другие таблицы из списка, который у нас есть. Например, щелкнув на таблице Заказы, можно увидеть здесь, как расшифровываются типы полей, которые находятся именно в этой таблице. Как мы видим, при помощи вот такого режима конструктора, можно просмотреть структуру данной конкретной таблицы. При необходимости можно изменить тип соответствующего поля.
42
TeachPro Microsoft Access 2003
Можно изменить его название или добавить, или удалить соответствующее поле. Конечно, в том случае, если мы хотим отредактировать структуру нашей таблицы. Ну и можем, конечно же, изменить параметры соответствующего поля, изменив там размер, если оно является типом текстовым, или другие какие-либо параметры.
2.2.2. Открытие, копирование, удаление таблиц Продолжим теперь наше занятие. Попробуем теперь создать новую базу данных. Это можно сделать несколькими путями. Во-первых, воспользоваться кнопкой Создать, которая находится в левом верхнем углу нашего экрана. В принципе, эта кнопка аналогична кнопкам в других приложениях, в которых тоже присутствует такая возможность создать новый пустой документ. Но, кроме этого, конечно же, создать новый документ можем и при помощи области задач, которая у нас находится в правой части нашего экрана. Здесь у нас тоже присутствует аналогичная кнопка Создать файл. Ну и в любом случае, щелкнем на вот эту кнопку или на вот эту, Создать файл, в любом случае мы попадаем на область задач, которая специально ориентирована на создание новой базы данных. И здесь у нас есть несколько возможностей. Первая из возможностей как раз и является созданием новой базы данных. Имеется в виду пустая база или же здесь есть у нас еще несколько возможностей. А именно создать пустую страницу, создать проект с имеющимися данными, проект с новыми данными, или же создать базу данных на основе уже имеющегося файла. Ну и. конечно же, можно найти какие-либо шаблоны в сети. Мы сейчас создадим, новую пустую базу данных. Для этого щелкнем на вот эту первую строчку. В результате открывается вот такое стандартное окно, в котором нам, до того, как мы создадим новую пустую базу данных, предлагают сохранить ее на нашем жестком диске и присвоить ему какое-либо имя. В этом Microsoft office Access отличается от других приложениях Microsoft office, в которых можно создать новый документ, не сохраняя его на диске. Сначала создается новый документ, с которым мы можем работать и лишь затем, при закрытии этого документа, нам и понадобиться присвоить ему какое-либо имя и сохранить. Ну, а сейчас у нас в программе Microsoft office Access последовательность действий как раз обратная, нам предлагают ввести имя. Ну, это связано именно с конкретной спецификой работой Microsoft office Access, работой базами данных, которая требует наличие этого файла на жестком диске. Конечно же, первое, что можно увидеть, это вот это стандартное имя, которое предлагает нам Microsoft office Access для новой базы данных. Конечно, в принципе мы можем согласиться с этим именем, хотя такое построение файлов в принципе является порочной практикой. Лучше, конечно, придать нашей базе данных какие-либо более осмысленные имена. Сейчас напишем, например, вот таким образом, и щелкнем на кнопке Создать. В результате можно увидеть, что область задач у нас исчезла с экрана, и появилась вот эта новая база данных. Как можно видеть, здесь у нас есть закладки, с помощью которых мы можем создавать таблицы. А соответствующие возможности у нас есть и для создания запросов, для создания форм, отчетов и т.д. Вернемся сейчас к таблицам. Ну, прежде, чем мы займемся созданием таблицы, попробуем немножко разобраться и освоиться работой с конкретной таблицей, которая уже есть и создана на нашем жестком диске. Для этого откроем уже существующую базу данных. Это можно сделать при помощи пункта меню Файл, или же при помощи кнопки Открыть или же можно воспользоваться одной из уже открытой базы данных, с которой мы работали в последнее время. Список нескольких последних файлов, открытых нами, можно видеть в этой части меню.
Глава 2. Знакомство с таблицами, создание таблиц.
43
Кроме этого, то же самое можно сделать и при помощи области задач, которая обычно у нас расположена в правой части нашего экрана. Для этого, конечно же, ее надо вызвать. Это можно сделать при помощи пункта меню вид и далее области задач или щелкнув на кнопке Ctrl F1. Также можно было бы просто щелкнуть на вот этой кнопке создания нового файла. При этом открывается область задач, правда не совсем в том месте, в котором мы хотим открыть уже у существующего файла. Для этого достаточно переключиться в тот тип области задач, которая нам нужна. В частности, щелкнем на пункте, приступая к работе, в котором мы можем видеть несколько опять-таки последних баз данных. Откроем одну из баз данных, и вот перед нами база данных, с которыми уже знакомились ранее. Откроем ее на возможности просмотра таблиц и откроем одну из таблиц, которая здесь у нас уже есть. Например, таблица Служащие. Щелкнем дважды на этой таблице, и вот эта таблица появляется перед нами. Как мы видим, эта таблица открылась вместе со своими данными, вместе с записями. В принципе, обратим внимание на вот эту нижнюю часть этой таблицы, в которой у нас есть несколько возможностей. Первая из них, это возможность узнать, сколько же записей в этой конкретной таблице. Как мы видим, здесь стоит число 7. В принципе, 7 достаточно малое число. Можно прямо одним взглядом охватить, что именно 7 записей как раз и находится в нашей таблице. Ну и здесь можно еще увидеть число единиц, которое означает текущую запись. Т.е. та запись, на которой у нас стоит так сказать фокус ввода, что отражается вот в этом треугольнике, который показывает текущую активную запись. Ну и передвигая на соответствующие другие записи, можно увидеть, как это число меняется при каждом щелчке мыши или передвижения при помощи клавиш на клавиатуре. Но, кроме этого мы можем передвигаться и при помощи вот этих кнопок со стрелками, которые здесь находятся. Вот здесь у нас есть возможность передвигаться на одну запись вверх или вниз. Мы можем передвигаться сразу же на первую запись, при помощи вот этой кнопки. Можем передвигаться сразу же на последнюю запись. И кроме этого, мы можем передвинуться сразу же на вот этот пустой счетчик, который находится в самом низу нашей таблицы. И при помощи него мы можем ввести новую запись в нашу таблицу. Передвигаться по базе данных по записям мы уже разобрались, как это делается. Закроем теперь эту таблицу. Рассмотрим, как нам можно копировать таблицы из одного места в другое. Для этого достаточно выделить ту таблицу, которую мы хотим копировать. Далее, как обычно можем, например, щелкнуть на правую кнопку, вызвав контекстное меню и щелкнуть на кнопку Копировать. При этом эта таблица целиком попадает у нас в буфер обмена, готовая для последующей вставки. Аналогичную операцию можно проделать и при помощи соответствующей кнопки Копировать, которая у нас находится в панели инструментов наверху нашего окна. И после того, как мы скопировали все это в буфер обмена, мы можем уже вставить его в нашу базу данных. Ну, для этого можем опять-таки щелкнуть на правую кнопку мыши, вызвать контекстное меню и выполнить пункт Вставить. Или же можем выбрать аналогичный пункт из панели инструментов. Пункт Вставить. Щелкнем. В любом случае, как бы вы не выбрали эту операцию, появляется вот такое окошко стандартного вида, в котором нам предлагают, во-первых, выбрать один из трех вариантов вставки. Это вставка только структуры, структуру и данных, или добавление данных в таблицу. И предлагает ввести имя новой таблицы. Как мы помним, у нас таблица называлась Служащие. Сейчас введем какоелибо другое имя, для того чтобы имена не повторялись. Например, напишем Сотрудники. И оставим параметры вставки, как и есть по умолчанию, Структура и данные. Щелкнем на кнопке ОК, ну и, как мы видим, у нас появилась новая таблица, таблица сотрудники. Если мы щелкнем на ней дважды, то, как мы видим, у нас эта таблица выглядит точно так же, как и таблица Служащие. Конечно же, она является точной ее копией. В ней, как мы видим, 7 записей, и в принципе, ну и в принципе, прокрутив, можно увидеть, что это одно и то же. Закроем теперь.
44
TeachPro Microsoft Access 2003
Попробуем теперь удалить эту таблицу. Ну, конечно же, удалить лучше ту таблицу, которую мы только что создали, для того чтобы не портить нашу базу данных. Для этого опять-таки достаточно щелкнуть на правую кнопку мыши, и выбрать в контекстном меню пункт Удалить. Или же можно просто-напросто встать на эту таблицу и щелкнуть на кнопку Delete. В любом случае появляется вот такое стандартное окошко, в котором нам предлагают подтвердить выбранную нами операцию. Хотим ли мы правда, удалить эту таблицу, или же мы случайно нажали на эту кнопку, и тогда, щелкнув на кнопке Нет, мы вернемся к исходному состоянию. Ну, сейчас щелкнем на кнопке Да. И в результате эта таблица, таблица Сотрудники, исчезла с нашего набора базы данных. Вставим теперь эту же таблицу в нашу пустую базу данных, которую мы только что создавали. Для этого, конечно же, проще всего ее вызвать опять. Для этого щелкнем на пункте меню Файл, и далее наша база данных, которую мы создавали. Щелкнем на ней. Вот. она у нас появилась перед нами. и далее. при помощи контекстного меню, щелкнем на правую кнопку мыши, выберем пункт Вставить. Ну, конечно же, опять появляется то же самое окно, с тремя вариантами выбора. На этот раз вставим только структуру. И далее выберем имя для нашей базы данных. Опять напишем Сотрудники. И щелкнем на кнопке ОК. Ну и. как мы видим, эта таблица появилась у нас в базе данных. Если мы щелкнем дважды, можно увидеть, что вот эта таблица состоит из тех же самых полей, что и исходная таблица, таблица Служащих. Но в отличие от нее, она абсолютно пустая. В ней ни одной записи нет. Закроем эту таблицу. Теперь попробуем вставить в нее как раз те данные, которые там были. Для этого можем щелкнуть на правую кнопку мыши, выбрать опять пункт вставить и на этот раз выбрать последний пункт Добавление данных в таблицу. Но на этот раз надо быть осторожным. Поскольку, в отличие от первых двух случае, сейчас как раз нам нужно выбрать именно то имя нашей таблицы, которое у нас уже есть, иначе нам не миновать ошибки. Дело в том, что, конечно же, добавление данных в таблицу, предполагает, что таблица есть и в нее мы как раз и хотим добавить. Если мы выберем какое-либо имя, которого нет на нашей базе данных. Например, наберем вот такой случайный набор букв и щелкнем на кнопке ОК, то. конечно же, появляется вот такое предупреждение об ошибке. Поэтому выберем, конечно же, имя таблицы, которое у нас уже есть. Ну, это, конечно же, у нас Сотрудники. И щелкнем на кнопке ОК. И можно увидеть, что все эти данные благополучно ввелись у нас в эту таблицу. Для того, чтобы в этом убедиться, щелкнем дважды и можно увидеть, что все 7 записей благополучно перекочевали в эту таблицу.
2.2.3. Работа с буфером обмена Продолжим наши занятия и рассмотрим сейчас вопрос, как нам работать с буфером обмена памяти. Как нам выделять какие-либо данные, и какие копировать. А также познакомимся с некоторыми вопросами, связанными с тем, что данные не всегда можно успешно копировать из одного места в другой, если поля не активизированы. В принципе, по нашей таблице мы можем передвигаться, как при помощи мыши, щелкая на ту ячейку, в которую мы хотим попасть или же при помощи клавиатуры, нажимая на соответствующие кнопки со стрелками, передвигаясь вверх вниз, или вправо влево по нашей таблице. Ну и, конечно же, мгновенно выделяются те данные, которые находятся в данной ячейке этой таблицы. Как только мы попадаем в какое-либо поле нашей таблицы, в какую-либо ячейку, мы можем сразу же внести здесь какую-либо информацию, нажав на соответствующие кнопки на нашей кла-
Глава 2. Знакомство с таблицами, создание таблиц.
45
виатуре. Например, вместо координатора продаж, можно ввести, например, продавец. Как можно заметить, как только мы ввели первую же букву с клавиатуры, старая запись сразу же исчезла, и мы начали набирать новый текст. Ну, а если бы мы хотели изменить что-либо в нашей, уже существующей записи в какой-либо ячейке, ну, например, в фамилии ввести какие-либо изменения. Если мы не хотим заново набирать весь текст, надо что-либо предпринять. Например, нажать на клавише F2, перейдя в режим редактирования, или же можем щелкнуть кнопкой мыши в то конкретное место этой ячейки, в которую мы хотим ввести какуюлибо информацию. Ну, например, эту фамилию Вилкин переделаем на Вилочкин, в результате чего запись слегка изменила свой вид. Но, отметим опятьтаки, что, если мы находимся на какой-либо записи в таком выделенном формате, то передвигать вправо влево при помощи стрелки. А внутри ячейки мы пока передвигаться не можем. Для этого надо опять-таки щелкнуть на кнопке F2 или щелкнуть на кнопку мыши, перейдя в режим редактирования. А теперь, как раз, щелкая на кнопке вправо влево, мы передвигаемся уже внутри вот этой ячейке по соответствующим буквам вправо или влево. Можем воспользоваться еще одной интересной комбинацией клавиш, это Shift-пробел. Только, если мы воспользуемся ею так, как сейчас, т.е. когда мы находимся в режиме редактирования, то, конечно же, мы допустим ошибку, мы введем пробел. Поэтому щелкнем на кнопке Esc и, передвигая в ту или иную сторону по нашим ячейкам в нашей таблице. Сейчас, если мы щелкнем на кнопке Shift и Пробел, мы выделяем всю нашу запись целиком. Ну, в принципе, это обычная практика и по другим приложениям Windows клавиши F2 и Shift и Пробел, одинаково действуют в других приложениях. Ну, кроме этого есть еще одна стандартная операция, которая должна быть знакома с программой Excel, это клавиши Ctrl-Пробел, которая выделяет уже не одну запись, а одно поле целиком. Вот такой вот вертикальный столбец. Ну и, конечно же, легко догадаться, что если щелкнем на Ctrl, Shift и Пробел, то мы выделим всю таблицу целиком. И, конечно, щелкнув на какую-либо кнопку на нашей клавиатуре, одновременно с передвижением по нашей ячейке, снимаем все выделения, которые на ней есть. Рассмотрим еще одну интересную горячую клавишу, клавишу F8, которая вызывает расширение выделения. Ну, сейчас, как мы видим, у нас выделена одна ячейка. Если мы щелкнем еще раз, то она выделяется уже целиком, а не только внутренняя ее часть, далее выделяется вся запись, и еще одно нажатие на клавише F8 вызывает выделение всей таблицы. Далее, нажав на клавише Esc, мы сбросим действие этой команды и далее, перемещаясь по нашей таблице, мы снимаем все выделение, возвращаясь к обычной процедуре движения по ячейкам. Ну и, конечно же, можем воспользоваться операциями с мышей. Т.е. нажатием, например, на какойлибо из заголовков поля, вызывает его активизацию целиком, вот этого поля. Точно также можем выделить и всю запись целиком. Конечно же, можно выбрать и несколько полей одновременно, так же, как и несколько записей одновременно, пользуясь мышью в этом случае. Нажимая и проходя по тем записям или по тем полям, которые мы хотим одновременно выделить. Но это, достаточно стандартная возможность и других приложений Windows. Ну и, конечно же, если мы какие-либо выделенные области хотим удалить, в частности мы сейчас выделили вот эту запись, несколько записей вернее, щелкнем на правую кнопку мыши и щелкнем на кнопу Удалить. В этом случае удаляются те три записи, которые были выделены, ну и, конечно же, появляется вот такое стандартное окно, в котором нам предлагают подтвердить или отменить вот это, достаточно, необратимое действие. Ну, сейчас щелкнем на кнопке "Да", подтверждая эту операцию. Точно также мы можем выбрать и удалить какое-либо из полей. Например, выберем поле "Отдел", далее щелкнем на правую кнопку мыши и выберем пункт Удалить столбец. Ну, опять-таки появляется стандартное окно с подтверждением, щелкнув на которое, появляется еще одно окно. в котором нам предлагают под-
46
TeachPro Microsoft Access 2003
твердить удаление и соответствующих индексов нашей базы данных. Поскольку поле в таблице является уже более сложным элементом, чем запись, и в базе данных может быть сохранена и информация об индексировании, т.е. упорядочению по этому полю. Сейчас щелкнем на кнопке "Да" в результате чего, в конце концов, у нас это поле целиком удаляется с нашей таблицы. Рассмотрим теперь, как можно копировать области нашей таблицы из одного места в другое. Во-первых, можем выделить какую-либо из данных, внутри ячейки, щелкнуть на правой кнопке мыши и копировать. И далее вставить его в другое место. Ну, например, вот сюда. Для этого щелкнем на правую кнопку мыши и выберем пункт Вставить. В результате мы вот это имя Мария передвинули с одного места на другое. Точно также можем выделить и несколько ячеек одновременно. Для этого надо подождать, пока мышка превратится вот в такой крестик и далее выделить, например, вот эти 4 ячейки. Далее правая кнопка мыши и копировать. И затем надо выбрать ту ячейку, начиная с которой мы хотим вставить наши данные. Например, с вот этой области. Далее щелкнем на правую кнопку мыши. Выберем пункт Вставить. Ну, как мы видим, сейчас ничего не произошло. Дело в том, что в данной программе вставка организована несколько по-другому. А именно, после того, как мы выделили и скопировали какую-либо область в буфер обмена, мы, для того чтобы ее вставить, должны выделить абсолютно аналогичную область. Ну, т.е. поскольку мы выделяли и копировали область 2х2, то должны выделить тоже аналогичную область и в нашей таблице. Например, вот в это место. А теперь, если мы щелкнем на правую кнопку мыши и выберем пункт Вставить, как мы видим, появилось вот такое стандартное окно, в котором нам предлагают подтвердить наше изменение. И то, что должно при этом произойти, можно увидеть на нашей таблице. Если мы щелкнем на кнопке "Нет", то мы возвратимся к предыдущему виду нашей таблицы. А если щелкнем на кнопке "Да", то эти изменения будут зафиксированы. Щелкнем сейчас на "Да", и как мы видим, вот эта область ячейки из 4 ячеек, повторилась в нашей таблице вот в этом месте, чуть ниже. Надо сказать, что аналогичная ситуация и в отношении записи. Если мы выделим какую-либо запись и ее скопируем, то для того чтобы ее вставить и продублировать, нам нужно будет, просто-напросто, создать сначала пустую запись. Для этого, например, введем какое-либо имя. Например, вот таким образом. Что мы здесь введем, абсолютно все равно. Далее выделим. Правая кнопка мыши и Вставить. И, как мы видим, вот эта 6 строка у нас продублировалась вот в этом месте, вместе со всеми своими данными. Ну, надо сказать, что не всегда так гладко происходит вставка и копирование. Ну, попробуем, например, выделить вот эту ячейку. Щелкнем на правую кнопку мыши и выберем пункт Копировать. И далее попробуем его вставить в место Даты рождения. Ну, конечно же, в принципе понятно, что фамилия к дате рождения имеет достаточно отдаленное сходство, но тем не менее, попробуем выделить эту ячейку, щелкнуть на правую кнопку мыши и выбрать пункт Вставить. Конечно же, как и можно было бы и ожидать, появилась вот такая запись, что введенное значение не соответствует маске ввода. Ну, конечно же, фамилия датой никак не может быть. Щелкнем на кнопке ОК. Нам еще раз разъясняют этот вопрос. Щелкнем на ОК еще раз. И окончательный вердикт, что программа вставить ничего не смогла. Хотя эта запись и изменилась, но на самом деле фиксации этой операции нет. Если мы передвинемся в другое место, то мы можем видеть, что восстанавливается старое значение, которое здесь и было. Т.е., конечно же, на месте даты опять восстанавливается дата. Интересным является обратная операция. Попробуем вот эту дату скопировать куда-либо. Для этого выделим правую кнопку мыши и выберем пункт Копировать. И попробуем его вставить в какое-либо текстовое поле. Выберем его для этого. Далее правая кнопка мыши и Вставить. И на этот раз, как мы видим, обратная операция у нас про-
Глава 2. Знакомство с таблицами, создание таблиц.
47
изошла достаточно гладко. Поскольку понятно, что дата в принципе является вот такой текстовой единице. А обратная, не любая текстовая единица является, конечно же, датой. Ну, как мы видим, мы в принципе разобрались, как в нашей таблице передвигаться по ней от ячейки к ячейке, и как выделять разного рода комбинации ячеек. Мы узнали как их копировать с места на место, из одной области таблицы в другую.
2.2.4. Работа с макетом таблицы На этом уроке мы ознакомимся с макетом таблицы. Научимся с ним работать, научимся, как сортировать, фильтровать данные в таблице. Познакомимся также с областью ввода таблицы и чтением длинных полей. Научимся вводить в них большое количество информации и т.д. Откроем теперь одну из баз данных, которая у нас есть на жестком диске. Ну, в частности откроем из области задач, в которой у нас расположены несколько баз данных, с которыми мы работали недавно. Достаточно подойти к той строчке, которая нам нужна, в частности к этой, и щелкнуть на ней. Вот, перед нами появилась эта база данных, главная кнопочная форма. Но нас сейчас больше интересуют таблицы. Поэтому откроем вот это главное окно баз данных и сосредоточимся на первой из таблиц, таблицы служащие. Для того чтобы ее открыть, достаточно щелкнуть дважды на ней. И вот перед нами появилась вот эта таблица. Рассмотрим теперь, что можно делать с этой таблицей. В ней мы можем переходить из одной записи в другую, как при помощи мыши, так и при помощи клавиатуры, нажимая на кнопке со стрелками. А также можем воспользоваться линейкой перехода по записям, которая находится у нас в нижней части этого окошка, нажимая на соответствующие кнопки. И, конечно же, кроме этого мы можем видеть вот в этом окне порядковый номер записи нашей таблицы. Вот сейчас мы находимся на 5 записи. Нажав на кнопку Вниз, мы передвинулись на следующую, 6 запись. Можно передвинуться вверх, на 5, 4 запись. Как мы видим, одновременно с передвижением записи меняется и цифра в соответствующем окне. Кроме этого, эту цифру мы можем ввести и непосредственно, руками. Написав здесь, например, число 6 и щелкнув на кнопку Enter, мы сразу же попадаем на 6 запись. Ну, конечно, сейчас у нас тут записи достаточно мало, и поэтому можно передвигаться и при помощи мыши или клавиатурой. Но, если у нас таблица состоит из достаточно большого количества записи, то, конечно, возможность непосредственно перескочить на нужный номер записи, иногда бывает достаточно удобно для работы. Ну и, конечно же, мы можем передвинуться прямо на первую или последнюю запись, воспользовавшись соответственно кнопкой с соответствующим действием. Ну и, конечно, общее количество записей тоже можно увидеть в нижней части этого окна. Кнопка со звездой служит для добавления новой записи в нашу таблицу. Ну, в принципе, если нам нужно добавить новую запись в нашу таблицу, нам необходимо совершить действие таким образом. Ну, во-первых, надо учитывать, каким образом мы вводим вот этот главный индекс. Он вводится автоматический, или так сказать, от руки. У нас сейчас индекс вводится от руки, поэтому вводить его нам ненужно. Он появится сам собой. А если бы он не был автоматически вводимым, тогда нам нужно было бы вводить какой-либо уникальный индекс, для идентификации этой записи. Ну, а сейчас нам достаточно прямо вводить и заполнять соответствующие поля новой записи. Например, встанем на вот эту пустую строку и здесь надо определиться, хотим ли мы повторить последнюю запись, которая у нас находится перед этим или же хотим ввести какое-либо новое значение. Ну, если мы хотим повторить. то нажмем на кнопку Ctrl и на апостроф. Это там, где русская буква "Э". Щелкнем, и как мы видим, у нас появилась новая 8 запись, и вот это слово, которое было в предыдущей записи, оно продублировалось строкой ниже. Ну, теперь проще всего
48
TeachPro Microsoft Access 2003
передвигать табуляцией на следующие поля и заполнять их по очереди. Щелкнем сейчас на кнопку табуляции, перейдем на поле Фамилию. И опять-таки мы можем ввести какое-либо новое имя или же ввести старое, нажав на кнопку Ctrl и апостроф. Сейчас введем какое-либо новое. Например, введем так. Ну и. щелкнув на табуляции, теперь нам нужно ввести его должность. Конечно же, должность у него Главный бухгалтер уже не подойдет, введет его просто-напросто бухгалтером. Опять щелкнем на табуляцию, введем следующее поле, которое в принципе у нас является дополнительным параметром. В принципе, сейчас мы можем его пропустить и введем, щелкнув на кнопку табуляции, опять-таки просто-напросто Отдел. Ну, тут мы можем опять щелкнуть на Ctrl или апостроф или буква Э / по-русски/. И определить этого человека в бухгалтерию. Ну, как мы видим, вот таким образом мы заполнили новое поле. А если мы сейчас щелкнем где-либо на другом месте нашей записи, то это поле уже окончательно зарегистрируется вот в таком виде в нашей таблице. Причем надо отметить, что в отличие от того, что мы привыкли в других приложениях Офис, на самом деле вот это измененная таблица уже попала на наш жесткий диск и там соответствующие файлы автоматически изменились. Т.е., если мы сейчас закроем всю нашу таблицу и откроем заново, эта запись там уже будет, в отличие от, например, Word, где. для того, чтобы измененный файл попал на жесткий диск, предварительно надо нажать на кнопку Сохранить. Что еще мы можем сделать с нашей таблицей. Мы, в принципе, можем изменить какие-либо поля, например, местами. Например, фамилия, имя поменять местами. Для этого достаточно схватить его и перетащить, например, влево. Вот сейчас, как мы видим, у нас на первом месте стоит фамилия, а на втором имя. Кроме этого мы можем изменить границы соответствующих полей, если они у нас по каким-либо причинам не устраивают. Например, вот эта должность, явно не влезает в соответствующее отведенное ему поле. Поэтому мы можем расширить и увидеть целиком всю эту надпись. Конечно же, мы можем сделать и обратную операцию, уменьшая соответствующие поля, для того чтобы мы могли видеть больше данных на нашем экране. Можем удалить какое-либо поле. Например, удалим вот это поле Имя. Для этого достаточно его выделить. Щелкнуть на правой кнопке мыши и, вызвав контекстное меню щелкнуть на пункте Удалить столбец. Как мы видим, появилось вот такое окно, в котором нам предлагают подтвердить выбранное нами действие. Щелкнем на кнопку "Да", и в результате можем увидеть, что соответствующее поле исчезло с нашего экрана. Кроме этого, можем выделить какой-нибудь столбец и щелкнуть на пункте Добавить столбец. В результате чего появляется вот такое пустое поле. Конечно же, мы можем что-либо туда скопировать. Например, выбрать фамилию поля. Далее выбрать пункт Копировать и вставить его вот в это пустое поле, поле 1. Для этого выберем его. Выберем пункт Вставить. Ну, появляется окно подтверждения. Щелкнем на кнопке Да. И в результате получаем дублирование вот этого поля, поля Фамилия на следующем поле. В принципе, можем мы, конечно же, поменять и название этого поля. Вместо вот этого ничего незначащего поля 1, какое-нибудь другое. Для этого опять щелкнем а правую кнопку мыши и выберем пункт Переименовать столбец и напишем здесь какое-либо другое значение. Например, просто-напросто напишем Псевдоним. Вот, такое поле мы сейчас сформировали в нашей таблице. Ну и напоследок, удалим вот это поле, которое мы только что создали. Ну, для этого опять-таки достаточно его выделить. Щелкнуть на правую кнопку мыши и выбрать пункт Удалить столбец. Согласимся с этим действием. Да.
Глава 2. Знакомство с таблицами, создание таблиц.
49
2.2.5. Формат таблицы Рассмотрим теперь, каким образом нам можно изменить макет этой таблицы. Это можно сделать несколькими путями. Для этого можно, например, войти в пункт меню Сервис, далее Параметры, щелкнуть. Появляется вот такое стандартное окно Параметров, на котором есть довольно много вкладок. Выберем здесь вкладку Режим таблицы. Здесь мы можем поменять цвет шрифта, цвет фона, цвет сетки. Можно поменять и сам шрифт и т.д. Здесь довольно много настроек. Закроем теперь вот это окно. Щелкнем на кнопке ОК. И отметим, что изменить внешний вид вот этой таблицы можно еще и по-другому. Для этого можно выбрать пункт меню Формат и далее режим таблицы. Щелкнем. Появляется вот такое окно, в котором, как мы видим, тоже есть несколько параметров, первый из которых, это настройка оформления, настройка линии сетки и т.д. Попробуем, например, выбрать цвет фона. Вместо белого, выберем вот такой желтый. Сразу же мы можем видеть на образце, как все это будет выглядеть на самом деле. Можем включать или выключать линии сетки. А также выполнять таблицу в приподнятом или утопленном виде. Например, выберем вот такой приподнятый вид. В этом случае, как мы видим, цвет фона стал вот таким серым. В принципе, выберем обычное оформление, как и было изначально, и выберем опять-таки какой-либо цвет фона. Например, выберем вот такой зеленоватоголубоватый, и щелкнем на кнопке ОК, чтобы зафиксировать все наши изменения. И в результате можно увидеть, как будет по-другому выглядеть наша таблица. так, отметим, что для того, чтобы изменить настройки нашей таблицы, его внешний вид, конечно же, лучше всего воспользоваться пунктом Формат и далее режим Таблицы, поскольку именно вот в этом режиме мы непосредственно перед глазами можем видеть образец того, как будет выглядеть эта таблица. Можем изменить, например, еще цвет сетки. Возьмем вот такой, ярко красный цвет и вид границы выберем не сплошной линии, а, например, в виде штриховки. В принципе, сейчас граница таблицы особо не видна, а для того чтобы было более ярко видно, что мы будем делать, например, изменим вид горизонтальной линии сетки. Его сделаем опять-таки штриховой линией, получая вот такой внешний вид нашей таблицы. Изменим и вертикальную линию сетки. Сделаем его, например, точечной, в результате получая вот такой результат на нашем экране. Согласившись со всеми изменениями, щелкнем в результате на кнопке ОК, получая соответствующий внешний вид нашей таблицы на нашем экране. Изменения, которое мы проделали в этой таблице, ее внешнего вида, абсолютно не повлияли на то, как будут выглядеть другие таблицы этой базы данных. Например, если откроем вот эту таблицу Заказы, то можно увидеть, что его внешний вид остался, как и прежде, с черными разделительными, сплошными полосками сетки и с белым фоном, в отличие от вот этой таблицы, в которой мы этот внешний вид, конечно же, координально поменяли. Внешний вид таблицы можно регулировать и изменять, и при помощи панели инструментов. Для этого щелкнем на пункте меню Вид, далее Панель инструментов и вызовем Панель инструментов Формат режим таблицы. Если мы щелкнем, то соответствующая панель появляется на нашем экране, вот этой третьей строкой. И в нем мы можем тоже переходить по полям, настраивать его шрифт, размерность, жирность шрифта, цвет заливки, и т.д. Например, поменяем цвет текста. Выберем вот такой синий цвет и можем сразу же видеть результат на нашем экране. Но точно также можем поменять, например, цвет заливки вот таким одним щелчком или выбрать из набора цветов, например, вот такой желтый. Можем, например, изменить размер шрифта, чуть-чуть его увеличить. Можем поменять вид сетки. Как мы видим, сейчас у нас есть и вертикальные и горизонтальные сетки. Мы можем какиелибо из них отключить. Например, оставить только горизонтальные линии или же оставить только вертикальные линии, или же снять и то, и другое, переходя к вот такому виду сетки. Возвратимся к исходному виду, ко-
50
TeachPro Microsoft Access 2003
гда у нас сетка есть и вертикальная и горизонтальная. Можем изменить вид нашей таблицы, выбрав выпуклый или вогнутый стиль. Например, вот такой выпуклый, или вот такой вогнутый стиль. К чему это приводит, можно видеть на нашей таблице. Надо, конечно же, отметить, что, как бы мы не меняли формат и написание какой-либо отдельной ячейки, это сразу же отобразиться на всех ячейках одновременно, поскольку в Access-е такое понятие отдельной ячейки нет. А все форматирование соотносится уже ко всем ячейкам, ко всей таблице вместе. Но, конечно же, разные таблицы в одной базе данных, могут иметь различное форматирование. Данные в таблице можно сортировать. Например, если мы встанем на это поле Должность и щелкнем вот на этом пункте Сортировка по возрастанию, то можно увидеть, как расположились по возрастанию поле Должность и в нашей таблице. Можно щелкнуть на рядом стоящую кнопку Сортировать по убыванию. В этом случае, конечно же, записи располагаются в обратном порядке. Точно также можно выбрать любую другую запись. Например, вот эту Дополнительно. И щелкнуть на вот этой кнопке, эти записи расположатся по возрастанию этого параметра. Можно по возрастанию, например, вот этой даты, даты найма на работу. Т.е. мы можем сортировать и наши записи по любому полю, которое у нас есть на нашей таблице. Ну и ту же самую операцию можно проделать через контекстное меню. Если щелкаем на правую кнопку мыши и выберем пункт Сортировка, по возрастанию или по убыванию. Например, щелкнем по вот такой сортировке, и мы получаем обратный порядок расположения записей по отношению к полю Дата найма. Попробуем теперь для нашей таблицы применить такое понятие, как Фильтр. Т.е. отбор содержания в каком-либо соответствующем поле, какого-либо текста. Например, выберем вот это поле Должность. Выберем первое слово Координатор, и щелкнув на правую кнопку мыши, выберем пункт Фильтр по выделенным. В этом случае отфильтровываются все те записи, в которых нет слова Координатор в поле Должность. И останутся, конечно, вот эти две записи, в котором у нас в поле Должность есть Координатор маркетинга и координатор продаж. Т.е. слово Координатор присутствует в обоих этих записях. Конечно же, этот фильтр можно отключить. Для этого щелкнем на правую кнопку мыши и выберем пункт Удалить фильтр. Или же можно воспользоваться вот этими клавишами. Здесь у нас есть Удалить фильтр. Если мы щелкнем на этой кнопке, тоже мы восстанавливаем исходный вид нашей таблицы. Выберем, например, теперь вот это слово Маркетинг и на этот раз включим фильтр по выделенному, с панели инструментов. Конечно же, мы приходим к тому же самому результату. Отменим теперь этот фильтр и щелкнем на кнопке Изменим фильтр. В результате, в поле Должность появляется вот такая запись. Т.е. ищутся все слова, содержащие слово Маркетинг, или же можем искать по любым другим словам, которые используются в этих полях в какой-либо записи. Например, ищем Главный бухгалтер и щелкнем теперь на кнопке применения фильтра. В результате мы увидим, что главный бухгалтер у нас в нашей базе данных всего один и его фамилия Немец. Ну и остальные пункты тоже можно видеть в соответствующей записи. Щелкнем теперь на пункте Удалить фильтр, возвращаясь к привычному виду нашей таблицы.
2.2.6. Использование текстового поля Можно еще выделить какой-либо текст и, щелкнув на правую кнопку мыши, выбрать не Фильтр по выделенному, а исключить выделенное. В этом случае выделяются все те записи, в котором в данном тексте как раз и нет. Т.е. в данном конкретном случае у нас удалились все записи, вернее, конечно же, не удалились, а скрылись, в котором было слово Маркетингу. Вот эта первая строчка, на которой Маркетинг, в принципе, есть, сохранилась, потому что здесь она использована несколько в другом виде. Хотя слова так сказать, и похожи, но, тем не менее,
Глава 2. Знакомство с таблицами, создание таблиц.
51
компьютеру нужно полное совпадение. Вернем теперь к исходному виду. Отменим Фильтр. Рассмотрим теперь, что представляют собой отдельные поля в нашей таблице. Для этого, попробуем открыть эту таблицу в режиме конструктора. Для этого перейдем в основное окно нашей базы данных и, выбрав, вот эту нашу таблицу Служащие, с которой мы работаем, щелкнем на пункте Конструктор. Ну и, как мы видим, перед нами появляются все те поля, которые присутствуют в нашей таблице. И рядом с ней отображается тип данных, т.е. какой тип, текстовый, дата время, логический и т.д. применяется для данного поля. Как мы видим, первое поле у нас представляет собой счетчик. Следующее поле, поле Фамилия, является текстовым типом. Конечно же, это можно и изменить. И здесь мы можем выбрать одну из тех возможностей, которую предоставляет нам Access. Ну, а сейчас пока рассмотрим, что представляет собой текстовый тип для данного поля. Ну, здесь у него есть несколько параметров, первым из которых и довольно значительным является размер поля. Как мы видим, здесь стоит число 50. Что это значит. Это значит, что в это поле можно вводить не более 50 символов. А наши попытки ввести большее количество символов, будут просто-напросто урезаться. Ну, как мы видим, максимальное число, которое мы можем здесь написать, равняется 255. В принципе вот такое требование ввода фиксированного значения для ширины отдельных полей, является достаточно стандартным для баз данных любого типа, а не только Access. И в принципе это сделано для того, чтобы программа могла легко находить любые записи в базе данных. Конечно, если каждая запись состоит из полей, размер которых достаточно фиксировано задан, то легко можно рассчитать, где будет располагаться запись с определенным номером от начала. Достаточно умножить количество записей, которые нам нужно найти на длину одной записи. Которая, конечно же, представляет собой просто-напросто сумму длин полей, в которое в него входит. Изменим, например, вот это поле с 50 на, например, до 15 единиц, задавая меньшее количество символов. Конечно же, в этом случае мы сможем ввести меньшее количество информации в это поле. Правда, имеет место и обратный эффект. А именно, за счет этого мы экономим место на жестком диске. И сама база данных становится гораздо меньше. Ну, тут, как и в любом деле, конечно же, важна разумность. Посмотрим другое поле, поле Должность. Как мы видим, здесь у нас для этого поля отведено 20 единиц. 20 символов. Изменим и это поле. Например, введем число опять-таки 15, и теперь закроем эту таблицу и выйдем из режима Конструктора. Конечно же, компьютер запрашивает, хотим ли мы сохранить изменение нашей таблицы, его макета или нет. Щелкнем сейчас на кнопку Да, в результате появляется вот такая стандартная надпись, которая нас предупреждает, что какие-либо данные мы могли потерять, в результате того, что мы усекли размеры полей в нашей таблице. В принципе, все достаточно очевидно. Т.е. те слова и та информация, которая у нас была в тех полях, в которых мы отвели меньше количество символов, конечно же, целиком там помститься не могут. Тем не менее, подтвердим выполнение этой операции. Щелкнем на кнопке Да, и откроем эту таблицу еще раз. Для этого щелкнем на ней дважды. И можно увидеть результат, к чему привело наше действие. А именно, в нашем поле Должность, все те должности, которые так сказать были достаточно длинными, в частности, больше 15 букв, конечно же, усеклись. В результате чего мы получили вот такие интересные названия. Агент по маркет, координатор, про и т.д. Ну и ввести здесь еще какие-либо буквы нам не удастся. Если мы начинаем вводить, щелкая по нашей клавиатуре, мы получаем соответствующий предупредительный звук, и ничего вводить нам не удастся. Вводить можно, например, какие-либо буквы вот в это поле, поле Продавец, которое, конечно же, меньше, чем 15 символов, но тоже до определенного количества символов. Вот, исчерпав вот этот лимит, 15 единиц, мы опять уперлись в ограничение по длине поля. Но и, конечно, то, что касается фамилии, у нас в принципе, пока никаких проблем не возникло. Поскольку, в принципе, фамилия
52
TeachPro Microsoft Access 2003
это достаточно короткая информация и в 15 букв, по крайней мере, те фамилии, которые у нас здесь есть, поместились. Попробуем теперь открыть эту таблицу еще раз в режиме конструктора. Щелкнем для этого на кнопке Конструктор. Изменим это окно, для того чтобы большее количество полей у нас поместилось в верхней части этого окна. И посмотрим, что можно делать с вот этим ограничением. Ограничением количества символов, которые можно ввести в соответствующее поле. Вот это ограничение 255, поскольку, в принципе, такие короткие понятия, как имя, фамилия, должность и т.д., конечно же, можно ограничить 255 знаками, но мы можем потребовать ввод в соответствующее поле достаточно экзотических понятий, таких как, например, какой-либо достаточной обширный текст. Для этого существует специальный тип данных. Например, выберем вот этот пункт Должность. Щелкнув на выпадающем списке, можем выбрать вот этот тип данного поля МЕМО, который и предназначен для ввода большого количества информации. Щелкнем. Ну и, как мы видим, у нас уже ограничение на количество букв в этом поле, нет. Сохраним теперь это изменение в нашей таблице. Закроем режим конструктора. Щелкнем на кнопке Да. И откроем эту таблицу в обычном виде. Для этого щелкнем на ней дважды и отметим теперь, что в поле Должность мы можем теперь ввести сколько угодно букв. Для этого проще всего выделить вот эту запись, которая здесь уже есть. Щелкнув на кнопке Ctrl+C, чтобы скопировать в буфер обмена и. щелкнув на кнопку Ctrl +V, мы можем вводить его много раз. В принципе, особо не видно, что здесь у нас много букв, поскольку просто-напросто у нас повторяющийся набор текста. Можно расширить вот это поле. Можно увидеть, что у нас в буфере гораздо больше, чем здесь видно. Можно переместиться в конец нашей ячейки и щелкнуть на кнопке End или в начало, щелкнув на кнопке Home. Можем попробовать увидеть всю ячейку целиком. Но для этого нажмем на кнопку Shift и, не отпуская, на кнопку F2. Ну и в результате можно увидеть все, что находится у нас в области вот этой ячейки. Как мы видим, у нас написан вот этот текст достаточно много раз, и этот текст представляет собой вот такое длинное, повторяющее значение. Щелкнем на кнопке ОК и закроем это окно. И отметим, что мы в наше поле, в нашу ячейку, можем ввести и многострочные данные. Для этого достаточно нажать на кнопку Ctrl, и, не отпуская на Enter. И в этом случае, вот в этом поле, которое у нас лежит во второй записи, будет состоять из двух строчек. На первой строчке написано Агент по, а на втором Маркетинг. Нажимая на стрелке вверх и вниз на нашей клавиатуре, можем видеть, как переходит и отображается в этом поле эта надпись. В принципе, если мы хотим окинуть одним взглядом обе наши строчки, то, конечно же, имеет смысл расширить поле, которое мы отводим для соответствующих записей и в результате вот эта надпись Агент по маркетингу помещается целиком на вот этих двух строках. Ну и одновременно, немножко более полно появляется должность в первой записи.
2.2.7. Режимы создания таблицы На этом уроке мы научимся создавать таблицы данных Microsoft Access. Для этого мы должны активизировать ярлык таблицы. В Microsoft Access используются три способа создания таблицы. Это создание таблицы путем ввода данных, создание таблицы с помощью мастера и создание таблицы в режиме Конструктора. Кстати, может оказаться, что перед нами не будет вот этих трех ярлыков. Ну, этого пугаться не стоит. Их можно включить и выключить по нашему желанию, т.е. если они отключены, мы их можем включить или наоборот. Ну, попробуем сейчас отключить вот эти три возможности. Для этого войдем в пункт меню Сервис, далее Параметры.
Глава 2. Знакомство с таблицами, создание таблиц.
53
Здесь у нас есть вкладка Вид, на которой у нас есть несколько переключателей, каждый из которых влияет на вид Microsoft Access при работе с ним. Ну и, в том числе мы можем включить или выключить строку состояния, которая находится в нижней части нашего экрана, включить или выключить область задач при запуске, которая находится в правой части нашего экрана. Ну и включить или выключить новые ярлыки объектов. Это именно те строчки, на которые мы сейчас обратили внимание. Если сейчас мы здесь снимем галочку с вот этой строчки и щелкнем на кнопку OK, то можно увидеть, что вот эти три строчки, которые здесь были и помогали нам создавать новую таблицу, исчезли. Конечно же, это в принципе имеет смысл, если у нас база данных и ее структура уже полностью создана, и нам не нужно ее менять. Но, если мы базу данных создаем новую или если нам нужно ввести сюда какие-либо достаточно существенные изменения, то, конечно же, эти возможности нам нужно вернуть на место. Для этого опять выберем пункт меню Сервис, далее Параметры и поставим галочку на пункте Новые ярлыки объектов, чтобы вернуть все как есть. Щелкнем теперь на кнопку OK и можем увидеть, как вот эти три пункта, помогающие нам создавать таблицы, опять появились перед нами. Давайте теперь создадим таблицу при помощи ввода данных. Для этого щелкнем дважды на вот этой строчке, и перед нами появилась вот такая пустая таблица. В ней, как можно видеть, названия полей даны в виде предопределенных значений, поле1, поле2, поле3 и т.д. Конечно же, имеет смысл переименовать эти названия по умолчанию. Для этого встанем на вот этом поле1, например, щелкнем на правую кнопку мыши и щелкнем на пункте Переименовать столбец. Как мы видим, мы зашли в процесс редактирования этого названия. Введем для этого поля новое название, например, пусть это у нас будет Номер. Щелкнем на другом поле и, как мы видим, это название у нас зафиксировалось для этого поля. Переименуем и второе поле. Щелкнем опять на правую кнопку мыши, Переименовать столбец. Пусть это у нас будет Фамилия. Займемся третьим полем. Опять правая кнопка мыши, Переименовать столбец. Ну и, конечно же, после фамилии у нас идет Имя. Ну, вот, как мы видим, три поля для нашей таблицы мы подготовили для наших дальнейших действий, введя им соответствующие названия. Представим себе, что у нас как раз в нашей таблице будет именно три поля, остальные поля нам не нужны, поэтому ими заниматься мы сейчас не будем. Введем теперь какие-либо значения. Надо сказать, что для того чтобы создать таблицу в этом режиме ввода таблицы, нам необходимо ввести хотя бы одну запись в нашу таблицу. И тогда по вот этой записи Access сам определит, какого типа поле нам взять для каждого из столбцов нашей таблицы. Конечно, в дальнейшем мы можем скорректировать эти автоматические действия Access. Ну, пока введем какие-либо значения для этой первой строчки. Например, номер пусть будет 1, введем фамилию. Пусть фамилия будет Иванов, ну и имя, Иван. Сохраним теперь сделанные нами изменения. Для этого щелкнем на кнопку Сохранить. Ну и, конечно же, нам Access предлагает ввести имя для нашей таблицы и предварительно вот в этом поле для ввода появляется то имя, которое нам автоматически сгенерировал Microsoft Access. Ну, таблица 1. Конечно, в принципе, оставлять те имена, которые генерирует за нас Microsoft Access, особого смысла нет. Поскольку они обычно составляются из какого-либо поля с номерами 1,2,3,4 или 5. Это достаточно мало вразумительные названия. И если мы хотим достаточно разумно ввести и сформировать нашу базу данных, то, конечно же, имеет смысл ввести здесь более разумное название, чем таблица1. В данном конкретном случае, поскольку это у нас еще учебная таблица, оставим все, как есть и щелкнем на кнопке ОК. Появляется вот такое стандартное окно, в котором нас предупреждает Microsoft Access, что ключевые поля у нас не заданы. Но мы можем задать сейчас ключевое поле или не задавать. Это ключевое поле помогает нам для связи другими таблицами в Microsoft Access в нашей базе дан-
54
TeachPro Microsoft Access 2003
ных. Ну, сейчас этим заниматься не будем и только щелкнем на кнопке Нет. Ну и можем в результате увидеть, как окончательно будет выглядеть наша таблица. Как мы видим, лишние поля исчезли с нашего экрана. Осталось только три поля Номер, Фамилия и Имя, т.к. мы их и вводили. И первая запись, которую мы сформировали, для этой конкретной таблицы тоже осталась. И в этой таблице мы уже можем непосредственно заняться вводом данных. Посмотрим теперь конструкцию этой таблицы. Для этого, желательно перейти в режим конструктора. Можем воспользоваться вот этой кнопкой, нажав на которую. мы можем видеть, какие режимы существуют у нас для открытия таблицы. Ну, во-первых, это режим конструктора, который мы сейчас хотим активизировать. Но и кроме этого, это, конечно же, режим Таблицы, в котором мы сейчас и держим открытой нашу таблицу. Это режим просмотра и заполнения самой таблицы. Далее режим сводной таблицы и режим сводной диаграммы. Ну, сейчас воспользуемся режимом конструктора. Выберем этот пункт. И вот перед нами появляется вот эта таблица, таблица1. с именами своих полей и с их параметрами. Ну, первый, как мы видим, это у нас Номер. Как мы видим, Microsoft присвоил ему числовой тип данных, поскольку мы там ввели число единиц, и Access додумался, что это поле должно иметь числовой тип данных. Ну и все остальные параметры, которые сопутствуют этому полю, можно видеть вот в этой части окна. У другого поля, у Фамилии, как мы видим, текстовый тип данных, для которого компьютер автоматически выделил 50 символов на одно поле. Ну и то же самое компьютерная программа Microsoft Access сделала для следующего поля, для Имени. Тоже выделив ему автоматически 50 единиц информации для ввода, 50 символов. Как можно видеть, у каждого поля, кроме своего названия и типа данных, есть еще такое поле, как описание. Это в принципе не обязательная характеристика данного поля, которое в принципе можно пока оставить и пустым. Закроем теперь эту таблицу. Для этого достаточно щелкнуть на вот этом крестике. Попробуем создать таблицу теперь с помощью мастера. Двойным щелчком откроем таблицу с помощью мастера. Перед нами появляется вот такое стандартное окно, в котором мы должны выбрать соответствующие характеристики для будущей нашей таблицы. Во-первых, мы должны выбрать, какую таблицу мы хотим создавать, Деловые или Личные. Внизу есть списков образцов таблиц. Здесь, как мы видим, тип образцов таблицы. Это такие, как Адреса, Гости, Имущества, Рецепты и т.д. Причем можно заметить, что каждый раз, когда мы выбираем определенный тип таблицы, меняются образцы полей, которые характеризуются и которые могут входить именно в данную конкретную таблицу. В частности, например для таблицы, Гости, здесь у нас Код гостя, Префикс, Фамилия, Имя супруга, Имена детей и т.д. А вот для таблицы Личное имущество, здесь уже другие поля, именно те, которые характеризуют, по мнению создателя этой программы, таблицу имущества. Здесь есть Код имущества, Тип, Помещение, Элемент, Описание, Изготовитель и т.д. В принципе, достаточно разумный выбор. Выберем теперь, например, таблицу из списка Деловые, и выберем, например, список Рассылки. Т.е. первую же таблицу, которая у нас находится в списке готовых таблиц. Выберем теперь поля, которые нам нужны для нашей таблицы из вот этого списка. Выберем, например, поле Имя и нажмем на вот эту кнопку со стрелкой. Ну, после того, как мы ввели Имя, введем еще и Фамилию для нашей таблицы. Вот мы щелкнули дважды, и Фамилия тоже появилась перед нами. Посмотрим, какие здесь поля есть. Например, Имя организации. Выберем. Как мы видим, мы можем соответствующее поле перебрасывать в поля для новой таблицы или щелкнув дважды, или же щелкнув на вот эту кнопку со стрелкой. Выберем еще какое-либо поле. Например, Адрес электронной почты. Щелкнем на нем дважды. Вот он тоже появился перед нами. Здесь, как мы видим, довольно много всяких разных полей. Добавим еще, например, такое поле, как Заметки. Перед нами, как мы видим, уже довольно нормаль-
Глава 2. Знакомство с таблицами, создание таблиц.
55
ная таблица. А если нас не устраивает название какого-либо поля, мы можем его переименовать. Для этого достаточно встать на соответствующее поле и щелкнуть на кнопке Переименовать поле. Ну и можем ввести другое название, которое нас устроит для этого поля. Сейчас оставим так, как есть. Щелкнем на кнопку Отмена. И нажмем кнопку Далее, чтобы перейти в следующую стадию создания таблицы. Появляется вот такое окно, в котором, во-первых, нам предлагают задать имя для новой таблицы. Как мы видим, компьютер автоматически предлагает нам имя Список рассылки, такое, какое было при выборе типа таблицы. Ну, мы можем согласиться или переименовать, например, назовем эту таблицу просто Рассылки. Ниже здесь есть еще способ определения ключа. Тут у нас два варианта или автоматический выбор ключа Microsoft Access-ом, или же пользователь, т.е. мы, сами должны определить ключ. Ну, пока сейчас оставим в автоматическом режиме создания ключа, и щелкнем на кнопке Далее. Далее мы попадаем на следующую стадию создания таблицы, в которой нам предлагают связать эту таблицу с другими таблицами, которые уже существуют в нашей базе данных. Ну, конечно, мы можем щелкнуть на кнопке Далее и не выполнять пункты, которые находятся в этом окне, т.е. не связывать его с другими таблицами. Сейчас, как мы видим, как раз эта таблица не связана ни с одним из существующих таблиц, но мы можем ее связать. Например, свяжем с первой таблицей, с таблицей Служащие. Щелкнем для этого на кнопке Связи. Ну и появляется вот это окно, в котором у нас есть три возможности. Это, первая, Таблицы не связаны между собой, т.к. она и есть у нас по умолчанию. Вторая возможность, это при которой Одной записи таблицы Рассылки, будет соответствовать много записей из таблицы Служащие. И третья возможность, когда Одной записи таблицы Служащие, будет соответствовать много записей таблицы Рассылок. Т.е. к одному служащему, может быть, скажем, так, прикреплено несколько рассылок. Ну, как раз эту возможность мы сейчас и выберем. В принципе, в виде пиктограммы можно видеть, как будут взаимодействовать эти две таблицы между собой. После того, как мы определились, щелкнем на кнопке OK, и как мы видим, теперь наша новая таблица связана со служащими, но не связана со всеми остальными. Можем выбрать еще какую-либо таблицу и выбрать какойлибо из типов связи, но больше связывать их ни с чем не будем, а щелкнем на кнопке Далее. Как мы видим, здесь Access предлагает нам три варианта для открытия таблицы. Т.е. мы можем изменить структуру таблицы, не согласившись с теми установками, которые мы только что создали. Можем ввести данные непосредственно в таблицу. Или же, мы будем вводить данные в таблицу с помощью формы, которую можем создавать при помощи Мастера. Выберем сейчас пункт Изменить структуру таблицы, для того чтобы мы могли посмотреть и оценить, какая же структура у таблицы, которую мы только что создали. Щелкнем сейчас на кнопке Готово. И вот, перед нами появилась структура нашей таблицы. Как мы видим, у Кода рассылки тип данных Счетчик. Следующие поля Имя, Фамилия, Имя организации и Адрес электронной почты, они у нас Текстовые поля, для каждого из которых отводится 50 символов. Ну и далее, следующее поле, поле Заметки. У него тип данных, поле МЕМО. Это поле в принципе, может намного превышать своей вместимостью тип текстовый. И здесь в принципе ввод данных уже не ограничен, в отличие от текстового поля. И последний Код служащего, Числовой тип. Перейдем теперь в режим таблицы. Для этого воспользуемся опять вот этой кнопкой и щелкнем на пункте Режим таблицы. Вот перед нами появляется наша таблица со всеми своими полями. Конечно, она пока чистая. Закроем теперь эту таблицу. Ну и последняя возможность, это создание таблицы в режиме конструктора. Если мы щелкнем дважды, то появляется вот такое стандартное окно, которое мы уже видели, когда рассматривали структуру, уже созданных таблиц, при помощи других возможностей. Ну, здесь мы непосредственно и прямо можем вводить имя для полей и вводить типы данных. Например, имя поля пусть будет Фамилия, тип данных Текстовый. Согласимся с этой воз-
56
TeachPro Microsoft Access 2003
можностью. Как мы видим, сразу же 50 единиц. Далее Имя, тип данных тоже пусть будет Текстовый. Далее, допустим, введем возраст. Для этого, конечно же, мы можем выбрать не текстовой, а уже числовой. Можем ввести, например, такое поле, как Пол, который тоже оставим текстовым. Можем ввести, например, какую-либо дату. Например, дата рождения. Она, конечно же, в этом случае можем быть не текстовой, а датой. В принципе, как мы видим, вот таким образом, мы тоже можем составить таблицу. Если мы сейчас щелкнем на кнопку Сохранить, то, конечно же, нам предложат ввести имя для таблицы. В принципе, мы можем согласиться или изменить его. Щелкнем сейчас на кнопке ОК, соглашаясь с вот этим именем по умолчанию. Опять появляется вопрос о ключевых полях. Но сейчас создавать их не будем. Щелкнем на кнопке Нет и закроем структуру этой таблицы. Мы можем видеть, что вот эта таблица 2 тоже благополучно создалась в нашей базе данных. Если мы щелкнем на ней дважды, то можем видеть, что она собой представляет. Ну, конечно же, она опятьтаки абсолютно пустая. Ну, вот, таким образом, мы при помощи вот этих трех возможностей можем создавать новую таблицу.
2.3. Типы полей 2.3.1 Общий обзор типов полей Рассмотрим на этом уроке, какие типы могут иметь поля в данной программе, какие имена следует задавать полям в наших таблицах и т.д. При создании таблиц в режиме конструкторов, которым мы сейчас как раз и являемся, приходится имя поля задавать, так сказать непосредственно. При этом, необходимо придерживаться ряда правил. Ну, имена полей, конечно же, не должны повторяться. Т.е., если у нас уже есть имя поля Фамилия, то второе поле с таким же названием Фамилия, у нас уже ввести не получится. Надо отметить, что имена полей могут содержать не более 64 знаков, с учетом пробелов, как нас и предупреждает программа вот в этом окне. Желательно избегать вставлять имена полей, совпадающие с именами функции и другими ключевыми словами, во избежание путаницы. Например, имя Name, которое достаточно популярно, может быть использовано, для своих нужд. Имена полей могут содержать любые символы, цифры и другие знаки, за исключением точки, восклицательного знака, апострофа и квадратных скобок. Точно такие же правила используются для задания имен таблиц. Кстати, мы не советуем использовать и очень длинные имена, поскольку они достаточно плохо воспринимаются, и работать с ними будет достаточно сложно. И желательно не включать в имена достаточно большое количество пробелов. А лучше, вообще обходиться без них. И в этом случае, в тех местах, где нам необходимо вставить пробел, вместо этого использовать знак подчеркивания. Например, в нашем поле Дата рождения между словами Дата и Рождения, лучше вместо пробела внести вот такое подчеркивание. В этом случае название будет выглядеть таким образом. В принципе, это, достаточно принятая форма, для создания идентификаторов. Это особенно пригодится, если мы захотим работать с этими таблицами в Visual Basic, или же, если мы хотим сохранить понятность в наших названиях и хотим мы, тем не менее, отказаться от пробелов, можем просто-напросто писать все слова слитно, но каждое из этих слов начинать с большой буквы. Например, вместо Дата найма, как здесь написано, можем уничтожить вот этот пробел и букву N, ввести большую. Вот таким образом, установив название этого поля. После того, как мы определимся с именем поля, необходимо, конечно же, задать его тип, тип данных. Наиболее удобным способом является выбор типа из списка. Вот перед нами появился выпадающий список из всех тех возможностей, для задания типа данных, который мы можем ис-
Глава 2. Знакомство с таблицами, создание таблиц.
57
пользовать. Есть у нас текстовое поле, поле МЕМО, числовое, время Дата, денежное, счетчик, логическое, поле, для связи с внедренными объектами, поле Гипер ссылка, для внедрения в нашу таблицу гипер ссылок, и Мастер подстановок. Скажем несколько слов о типах данных. Поле текстовое может содержать любую текстовую информацию, которая не требует вычисления. Поле МЕМО может содержать любое текстовую или другую информацию, которую мы не хотим ограничить каким-либо количеством символов. Числовой тип данных, как видно из названия, используется для сохранения каких-либо числовых данных. Например, количество чего-либо, размер, длина, высота и т.д. А также может использоваться в какихлибо математических вычислениях. Далее, следующий тип Дата время, которое может использоваться для хранения даты или же времени. Денежный - это, конечно же, используется для сохранения в наших таблицах каких-либо денежных данных. Далее у нас счетчик, это поле для уникального номера в нашей таблице. Он определяется автоматически. При этом надо отметить, что максимальное число записей в таблице не может превышать 2 миллиардов. Далее, логический тип данных. Это логическое Да или Нет. Т.е. два состояния, истина- ложь. Например, женат или не женат, хочу - не хочу. Поле объектов содержит ссылку на какой-либо объект, который мы можем открыть, щелкнув на соответствующем поле. Это может быть рисунок, это может быть какой-нибудь документ, такой как текстовый документ и т.д. Далее гиперссылка, которая позволяет сохранять в поле гиперссылку, с помощью которой может быть ссылка на какой-либо фрагмент данных в нашей таблице, или ж ссылку на какую-либо web страницу в Интернете или на нашем компьютере. Рассмотрим теперь, каким образом нам можно переименовывать. вставлять и удалять поля в нашей таблице в режиме конструктора. Для того чтобы переименовать какое-либо поле, достаточно просто щелкнуть на соответствующей ячейке и как-либо изменить это название. Например, изменить какие-либо буквы или вводя другие, в результате получая название немножко по-другому. Например, вот в таком сокращенном виде. Для того чтобы добавить какиелибо поля в нашу таблицу, достаточно встать на какое-либо поле, перед которым мы хотим ввести новое поле, далее щелкнув на правую кнопку мыши и выполнить пункт Добавить строку. То же самое можно сделать, щелкнув на вот эту кнопку Добавить строку на нашей панели инструментов. Как мы видим, и в этом случае у нас добавилась строка. Правда, и в том и в другом случае, строка добавляется пустая. Ну, оно и понятно, название для этого поля нам нужно будет ввести, так сказать, и на следующем шаге. Ну и ту же самую операцию можно сделать через пункт меню. Для этого выполнить пункт меню Вставка и далее Строки. Ну, как мы видим, в любом из этих трех случаев, мы получаем одно и то же, а именно, пустое поле. Ну, далее достаточно щелкнуть и ввести какое-либо название для нашего поля и автоматически появляется тип данных для него. Конечно же, можем согласиться с вот этой текстовой возможностью. но можем изменить и выбрать какую-либо другую возможность. Например, числовой тип. После того, как мы ввели вот такой текст в качестве имени для нашего поля, конечно же, ставится вопрос, а как же нам убрать какое-либо поле. Для этого достаточно просто-напросто встать на нее, опять-таки щелкнуть на правую кнопку и щелкнуть на пункте Удалить строки в нашем контекстном меню. Оно которая появилась при помощи правой кнопки мыши. То же самое можно сделать, выбрав несколько строк одновременно. Щелкнем на строке, далее на кнопку Shift или Ctrl, не отпуская эту кнопку, нажмем на правую кнопку мыши и при появлении контекстного меню, выберем пункт Удалить строки. Или же можем выполнить этот пункт из нашей панели инструментов, щелкнув на кнопке Удалить строки. В любом из этих случае, в принципе, конечно же, можно было бы воспользоваться и пунктом меню через пункт меню Правка, но в любом случае мы удалили наши лишние строч-
58
TeachPro Microsoft Access 2003
ки с нашей таблицы. Ну и аналогично можно вставить любые строки, не только в одиночном режиме, но и несколько строк одновременно. Для этого достаточно выбрать несколько строк. Например, нажмем на какую-либо строку. Далее на Shift и на вот эту строку, выделяя три строки одновременно. И теперь, не отпуская кнопку Shift, если мы щелкнем на правую кнопку мыши, появляется контекстное меню, в котором можем выбрать Добавить строки, и, как мы видим, автоматически добавляются три строки одновременно. А все остальные имена полей сдвигаются соответственно вниз. Опять-таки удалим их, и выделим вот эти три строки. Далее щелкнем на вот эту кнопку удаления и в результате мы опять возвращаемся к исходному виду структуры нашей таблицы. Надо отметить, что каждую из полей нашей таблицы мы можем поменять своим местом. Например, вот эту должность можем схватить и потащить, например, ниже, в результате чего у нас очередность появления полей в нашей таблице, как мы видим, немного изменилась. Операции с полями мы можем проводить не только в режиме конструктора, но и в режиме так сказать стандартной таблицы. Для этого перейдем на нее. Закроем вот этот режим конструктора. Нам, конечно же, предлагают сохранить изменение нашей структуры или же отказаться от нее. Щелкнем, например, на кнопке Да, чтобы сохранить все наши изменения. И далее щелкнем на вот этой таблице Служащие дважды, чтобы она появилась в обычном режиме, режиме Таблицы. Вот она появилась перед нами и точно так же, как и в режиме конструктора. Попробуем ввести и удалить какое-либо из полей. Достаточно выделить какое-либо поле, щелкнуть на правую кнопку мыши и выбрать пункт Добавить столбец. Для того чтобы у нас появилось новое поле в нашей таблице, перед тем полем, которое у нас было выделено. Точно также мы могли нажать на соответствующий столбец и выбрать вставку поля из, например, пункта меню. Для этого еще выберем пункт Вставка, и Вставка столбца. Вот появился новый столбец в поле 2. Конечно же, название у этих полей нам программа предлагает достаточно бессмысленные, поле1, поле 2, но если мы хотим их переименовать, нам достаточно выделить, щелкнуть на правую кнопку мыши и выбрать пункт Переименовать. И вместо поля 2 ввести любое другое нужное нам имя. Например, введем поле Адрес. После того, как мы ввели поля, конечно же, встанет вопрос, как же их удалить. Например, выделим вот это поле 2, проведя по нем мышкой, далее нажмем на Shift и щелкнем на правую кнопку мыши. И как мы видим, когда мы выбрали несколько полей одновременно, у нас пункт Удалить столбец, точно так же, как и Переименовать, и Добавить стало недоступно. Дело в том, что удалять нужно по одному. Для этого выделим вот этот столбец в одиночном режиме, щелкая на правую кнопку мыши, и выберем пункт Удалить столбец. Как мы видим, появляется вот такое окно, в котором нам предлагают подтвердить эту операцию, хотим ли мы удалить выделенное поле и все, содержащиеся в нем данные. Щелкнем на кнопке Да, в результате чего это поле исчезает с нашего экрана и из нашей таблицы. То же самое, например, сделаем с вот этим полем Дополнительное, которое в отличие от раннее созданного нами поля, уже содержит какую-то информацию. Если мы сейчас щелкаем на правую кнопку мыши и выберем пункт Удалить столбец. То если мы ответим Нет, то конечно же, мы отменяем это действие, а при щелчке на кнопке Да, поле исчезает вместе со всеми данными, которые в нем находились. Поэтому, конечно же, при удалении полей, надо действовать достаточно осторожно, чтобы случайно не потерять какие-либо важные данные. Ну и, конечно же, точно так же, как и в случаях с конструктором, мы можем и передвигать поля вправо или влево, меняя их очередность. Например, схватим вот этот столбец Отдел, схватим его и перетащим, например, на второе место в нашей таблице. В результате получаем вот такой его внешний вид.
Глава 2. Знакомство с таблицами, создание таблиц.
59
Точно также мы можем, например, схватить за поле Фамилию, и потащить, например, вот в это место. Ну и, конечно же, мы можем изменить и ширину каждого поля, т.е. его размер, который мы предоставили ему в нашей таблице. Вот таким образом мы увидели, как можно добавлять, удалять и изменять названия полей и их свойства в режиме конструктора и в режиме таблицы
2.3.2. Типы Счетчик и Код репликации На этом уроке мы познакомимся поближе с такими понятиями, как счетчик и код публикации. Откроем для этого какую-либо таблицу, которая у нас есть в базе данных, в режиме конструктора. Щелкнем вот на эту кнопку. Как можно видеть, первое имя поля Код служащего имеет тип Счетчик. Рассмотрим более подробно тип Счетчик. Если таблица у нас будет репетироваться, то необходимо подобрать подходящий размер для поля типа Счетчик, который используется в качестве первичного ключа таблицы. И первое, что необходимо сделать с полем типа Счетчик, это, конечно же, установить его свойства. Первое, это установить, конечно же, размер поля, которое может иметь значение длинное целое или код репликации. Если у нас между операциями синхронизации таблицы вводится меньше, чем 100 записей, тогда имеет смысл использовать для размера поля длинное целое, а в остальных случаях можно использовать код репликации, который имеет больший размер и соответственно вероятность повторения этого поля будет меньше. Хотя, конечно, если у нас имеется ограничение по дисковому пространству, то длинное целое занимает гораздо меньшее дисковое пространство, чем код репликации. Поэтому без особой нужды использовать длинное значение этого поля, смысла не имеет. При создании новой записи, автоматически генерируется значение, которое пишется в поле Счетчик. Причем генерируется оно при помощи увеличения на единицу предыдущей записи, если у нас новое значение появляется последовательным образом, или же, они могут генерироваться случайным образом, при помощи генератора случайных чисел, работающего в автоматическом режиме. Т.е. от нас не требуется ввод никакой информации и в том и в другом случае. Программа в любом варианте заполняет это поле само. И у нас никаких возможностей по изменению этого поля не имеется. Максимальное число записи с полем типа Счетчик не должно превышать 2 миллиардов. Давайте создадим новую таблицу и попробуем поработать с полем типа Счетчик. Закроем перед этим эту таблицу, далее щелкнем дважды на пункте Создать таблицы в режиме конструктора. Появляется перед нами таблица с именем Таблица 1 с абсолютно чистыми полями. Введем имя для этого поля. Пусть имя будет вот такое. Далее введем тип данных. Вместо текстового, введем Счетчик, как мы договаривались. Введем второе поле. Пусть это будет у нас Имя. И тип данных согласимся с типом данных текстовых, как предложено по умолчанию. Далее сохраним эту таблицу. Для этого закроем ее. Щелкнем на вот этом крестике. Компьютер спрашивает, сохранить ли нам изменение макета и структуру. Ну, конечно же, Да. Щелкнем на кнопке Да. Согласимся с именем таблицы, которое нам предлагает компьютер и ключевые поля, конечно же, не заданы. Ну, поскольку у нас сейчас нет цели связывать эту таблицу с другими, ключевые поля создавать не будем. Щелкнем на кнопке Нет, и вот эта таблица появилась перед нами в нашей базе данных. Откроем ее в режиме таблицы. Щелкнем на ней дважды. Вот она появилась перед нами. И, как мы видим, пока она абсолютно пуста. В нем два поля код и имя, и ни одной записи. Введем первую запись в поле Имя. Например, пусть будет вот таким образом, Иван. Ну и, как мы видим, как только мы начали вводить здесь имя, в поле Код сразу же появилась цифра 1. Попробуем ввести следующую запись. Пусть будет вот таким образом. И, как мы видим, сразу же счетчик увеличился на единицу. Вводя третье значение, получаем номер 3 для этой записи. Как
60
TeachPro Microsoft Access 2003
мы видим, поле в колонке Код заполняется автоматически без всякого нашего усилия. А если мы попробуем ввести здесь какое-либо значение, то нам это никак не удается, компьютер не разрешат нам изменять значения поля Код. Попробуем теперь удалить вот эту запись. Запись номер 3. Для этого выделим. Правая кнопка мыши и Удалить запись. Появляется вот такое окошко с подтверждением, правда ли мы хотим это сделать. Щелкнем на кнопке Да и, как мы видим, у нас теперь осталось опять две записи, первая и вторая. Теперь, если мы захотим ввести еще одну новую запись, конечно же, можно было бы ожидать, что она будет иметь код номер 3, но на самом деле, если опять ввести даже то же самое значение, как мы видим, она имеет значение кода 4. Дело в том, что, несмотря на то, что мы удалили запись, она, тем не менее, свою ячейку в базе данных заняла. И счетчик увеличивается, несмотря на удаление и изменения количества записей. Закроем теперь эту таблицу. Откроем ее в режиме конструктора и попробуем изменить вот это свойство поля. Вместо последовательных значений, поставим здесь случайные значения. Конечно же, программа предлагает нам подтвердить это изменение. Щелкнем на кнопке Да, закроем конструктор, сохраним макет. И откроем ее еще раз, вот эту таблицу в режиме Таблицы. Пока то, что мы видим, это то же самое, что было минуту назад, те же самые данные. Но, если мы сейчас попробуем ввести новую запись, например, введем Василий, то можно увидеть, какой код получает эта запись. У нее, конечно же, уже не 1,2,3,4 и следующее, конечно же, теоретически 5, а вместо этого введено вот такое случайное число. Если мы опять введем новое имя, например, вот такое, можно увидеть, что опять появился новый код, который тоже представляет собой совершенно случайное значение. Закроем теперь эту таблицу. Откроем ее в режиме конструктора опять. Попробуе6м на этот раз посмотреть, что же представляет собой код репликации. Ну, для этого изменим размер этого поля с длинного целого на код репликации. Нас просят подтвердить это действие. Щелкнем на кнопке Да, закроем эту таблицу. Сохраним все наши изменения. И откроем эту таблицу в обычном режиме. Щелкнем дважды. И можно увидеть, что у нас теперь получилось с этим полем. Для этого увеличим место для вот этого поля и. как мы видим, вот эти простые числа, которые у нас были в поле Код, например, вот эти 1,2,3,4, превратились вот в такие длинные комбинации цифр. Ну и то же самое с последними двумя записями. Хотя там числа тоже были гораздо длиннее, но не такие большие. Как мы видим, здесь у нас гораздо больше цифр и гораздо больше возможностей, так сказать, не повторится. А если мы возьмем следующее значение, например, напишем таким образом, то можно увидеть, что случайное значение для этого поля, уже выглядит так сказать совершенно непонятным образом. Ну, как можно догадаться, вероятность повторения вот таких записей уже абсолютна ничтожна. Ну и отметим еще раз, что единственно, зачем программа следит при вводе значений в поле типа Счетчик, это за уникальностью каждого номера. Каждый номер для своей записи, он уникален и не повторяется по всей длине нашей таблицы. Закроем эту таблицу. Сохраним, конечно же, все изменения и вернемся к обычному виду нашей базы данных.
2.3.3. Числовые типы. Точность чисел Критерий выбора нужного типа На этом уроке мы познакомимся с числовыми типами данных. Поговорим о проблеме точности чисел и о критерии выбора нужного нам типа числовых данных. Для этого создадим новую таблицу. Щелкнем на пункте создания таблицы в режиме конструктора. Вот появилось стандартное окно создания новой таблицы. Введем имя поля. Пусть это будет просто-напросто Имя. Тип данных пусть будет текстовым. Согласимся со значением по умолчанию.
Глава 2. Знакомство с таблицами, создание таблиц.
61
Далее введем возраст. Ну и тип данных. Вместо текстового выберем числовой. Щелкнем. Отметим, что, конечно же, числовой тип данных годится именно для хранения числовых данных, т.е. для разного рода чисел, которые получаются при заполнения полей, или же при разного рода числовых или математических операциях. Ну, конечно же, сохранить здесь какую-либо дату, время, какой-либо текст, нам не удастся. Надо отметить, что числовой тип данных имеет много подтипов, которые можно задавать при помощи вот этого свойства Размер поля. Здесь у нас, как мы видим, по умолчанию стоит длинное целое. Но, если мы щелкнем на вот этом ниспадающем списке, то здесь появляются еще несколько возможностей, которые предоставляет нам программа. И от выбора размера поля зависит точность вычисления. Размер этого поля может содержаться в одном байте, 2,4, восьми, 16 и т.д. байт. Т.е. здесь у нас размер поля увеличивается по степени 2. И соответственно этим целям служит байт, который занимает 1 байт, целое - 2байта, длинное целое - 4 байта, одинарное с плавающей точкой, двойное с плавающей точкой, код репликации и действительное число. Оставим для начала длинное целое, как нам и предлагает программа по умолчанию. Сохраним теперь эту таблицу. Оставим имя по умолчанию, таблица 1. ОК. Ключевое поле сейчас не нужно, Нет. И откроем его в режиме Таблицы. Вот оно появилось перед нами. Ну, попробуем ввести сейчас какое-либо имя. Допустим, пусть опять-таки будет Иван, и введем возраст для него. Как мы видим, в начале компьютер предлагает нам значение по умолчанию 0. Ну, введем, например, число 35. Все, как мы видим, нормально. Введем следующее имя Петр, которому пусть будет 40 лет. Как мы видим, компьютер абсолютно адекватно и нормально воспринял эти значения. Введем еще одно имя. Например, Лев. Ну и попробуем теперь так сказать ввести достаточно большое число. Дело, конечно же, не в возрасте, а просто в числе. Попробуем нащупать максимальное число, которое мы можем ввести для нашего числового поля. Введем вот таким образом. 2 1 4 7 4 8 3 6 4 и 8. В принципе, можно сказать, это на самом деле просто-напросто степень 2. Но, причем достаточно большая. Теперь же, если мы попробуем зафиксировать это изменение, щелкнув где-либо, то можно увидеть, что введенное значение не подходит для данного поля, поскольку числовое поле превышает придел, который задан нами для нашей таблицы. Щелкнем на кнопке ОК и попробуем подкорректировать это число. А именно, достаточно уменьшить всего лишь на 1. И вместо 8 введем в конце 7. И щелкнув, можно увидеть, что на этот раз, компьютер воспринял это число без проблем. Как мы видим, вот это и есть то максимальное число, которое мы можем использовать для длинного целого в наших таблицах. Закроем теперь эту таблицу. Откроем ее в режиме конструктора. Рассмотрим теперь, что еще можно сделать с вот этим полем числового типа с возрастом. Как мы видим, у нас оно имеет размер длинное целое, но возьмем теперь какое-либо другое, меньше. Например, возьмем 1 байт. Щелкнем и попробуем записать сделанное нами изменение. Щелкнем на кнопке Сохранить. Как мы видим, появилась вот такая надпись, что программа обнаружила ошибки. Дело в том, что в таком-то из полей, число при преобразовании от длинного целого к 1 байту, не поместилось в соответствующую ячейку. Что можно было и ожидать, поскольку мы там ввели достаточно большое число, состоящее из многих цифр, конечно же, в 1 байт это не войдет. 1 байт, это число, которое может принимать значение от 0 до 255. И содержимое поля, в котором обнаружена эта ошибка было удалено из нашей таблицы. Вернее, конечно же, будет. Если мы сейчас щелкнем на кнопке Нет, все вернется обратно, и мы сможем восстановить нашу таблицу в исходном виде. Но сейчас продолжим выполнение, щелкнув на кнопке Да. Откроем теперь эту таблицу в обычном режиме, ну и можно увидеть, что сейчас про-
62
TeachPro Microsoft Access 2003
изошло. А именно, число, возраст которым был определен для человека по имени Лев, исчезло с нашей таблицы. А число 35 и 40 остались без изменения. Все с ними нормально. А вот это большое число, оно, конечно же, исчезло. Поскольку компьютер преобразовать не смог, он просто-напросто предпочел совершенно удалить это значение. Ну, посмотрим, какое значение можно ввести сейчас. Если мы возьмем 256 и попробуем ввести это значение, опять возникает ошибка, так сказать, выход за пределы, предоставленных значений. Щелкнем на ОК и изменим 256 на 255, что как раз и благосклонно воспринимается нашим компьютером. Как мы видим, для 1 байта вот это число 255, и как раз является максимальным значением, которое он может сохранять. В принципе, для возраста человека, это вполне приемлемое ограничение, но если нам нужно числовое значение для каких-либо иных целей, и у нас предполагается, что это число может быть достаточно большим, то 1 байт нам, конечно же, будет недостаточен. Откроем теперь эту таблицу в режиме конструктора и посмотрим, какие здесь у нас еще есть возможности. А именно, откроем список и попробуем воспользоваться числом с плавающей точкой, одинарным числом. Сохраним эту таблицу, щелкнем на кнопке сохранить. Сейчас, как мы видим, компьютер сохранил без всяких вопросов. Поскольку преобразование с увеличением возможностей каждого из полей компьютером воспринимается так сказать более благосклонно, конечно же, чем усечение, при котором мы меньшее количество байт отводим под ту же самую информацию. Ну и откроем нашу таблицу в режиме Таблицы. Пока все записи остались так, как они и есть, что в принципе и понятно. Изменим это число теперь. Вместо 255 возьмем какое-либо другое, вот таким образом заполняя наши цифры. И если мы перейдем в другую запись, то можно увидеть, какие изменения произошли с этим числом. Дело в том, что оно каким-то образом округлилось, что в принципе можно заметить. Но дело в том, что компьютер в этом режиме, в режиме числа с одинарной точностью может хранить определенное количество значащих цифр, а все остальные он просто-напросто округляет. Вот эти значащие цифры, которые компьютер сохранил, а все остальные округлил, сохранив так сказать порядок этого числа и только. Но зато у нас появилась возможность записывать не только, так сказать, целые числа, но числа с действительной частью. Для этого достаточно ввести в соответствующий разделитель и ввести те значения, которые мы хотим, чтобы было у этого числа после запятой. Ну вот, как мы видим, опять-таки после отбрасывания тех цифр, которые компьютер не запомнил из тех же самых соображений, сохранения только определенного количества значащих цифр, после этого компьютер запомнил в соответствующей ячейке. Посмотрим теперь что произойдем, если мы будем изменять размер вот этой колонки. Будем уменьшать эту колонку, и можно увидеть определенное количество цифр с нашей таблицы пропадает, и наше число занимает все меньше и меньше места, отведенного ему нами. В принципе, конечно, несмотря на то, что мы сейчас видим гораздо меньше количество цифр, на самом деле все эти значения в компьютере сохранены. Если мы расширим таблицу, то можно увидеть, все то, что у нас скрыто от глаз. Т.е. так сказать, визуальное представление этого числа и то число, которое на самом деле хранится в компьютере, могут не совпадать. Определенные цифры могут пропадать в результате усечения видимой части, но, тем не менее, они при всякого рода вычислениях, принимают участие в полном объеме. Ну, если, тем не менее, у нас вот этого количества значащих цифр недостаточно для наших вычислений, мы можем еще увеличить точность. Для этого щелкнем на кнопке конструктора, и выберем для нашего вот этого числового поля вместо одинарной точности, понятно что, а именно числа с двойной плавающей точкой. Далее сохраним эту таблицу. Перейдем в режим таблицы и
Глава 2. Знакомство с таблицами, создание таблиц.
63
можно увидеть, что наше число на самом деле представляет собой вот такого типа число, только округленное в предыдущем случае до числа с одинарной точностью. Ну, конечно же, число значащих цифр, которое мы можем использовать в этом случае, как мы видим, гораздо больше. Ну, конечно, это имеет свою оборотную сторону, а именно, число байт, которое мы используем для хранения этого числа, конечно же, увеличивается.
2.3.4. Текстовый тип и тип МЕМО На этом уроке мы познакомимся подробно с такими типами полей, как текстовый и тип поля МЕМО. Для этого создадим новую таблицу в режиме конструктора. Щелкнем на вот этой строке дважды. Появляется вот такое стандартное окошко, в которое введем имя для нашего поля. Введем, например, простонапросто слово Текст. Далее выберем тип данных. Ну, как мы видим, компьютер автоматически предложил нам текстовый тип. Для задания типа данных, наиболее удобным, в принципе, является выбор из списка. Если мы щелкнем на соответствующей кнопке, то появляются все возможности, которые здесь есть и мы можем выбрать один из них. Но мы можем поступить и по-другому. Просто-напросто введя вот тут данные, так сказать, вручную. Достаточно ввести первую букву. Например, если введем здесь букву Т, то сразу же появляется тип текстовый, а если мы введем, например, букву Ч, то сразу же автоматически появляется тип числовой. Как мы видим, все достаточно просто. А если мы введем еще одну букву Ч, то компьютер подобрать ничего подходящего к этому буквосочетанию не смог. Введем букву Т, этого достаточно, чтобы опять вернуться к текстовому типу. Ну, после того, как мы определимся с типом данных, нужно выяснить те характеристики, которые характеризуются для этого поля. Первое и, в принципе, основной параметр для текстового типа данных, это размер поля. Как мы видим, компьютер автоматически предложил нам 50 букв для максимального числа данных, которые могут храниться в этом поле. В принципе, это более или менее большое число, ну, смотря опять-таки, для каких целей мы его используем. А если задаться вопросом, какое максимальное число здесь может стоять, то компьютер нам здесь дает подсказку. Предельное значение 255. Т.е. мы в этом месте можем написать число 255. И в этом случае, мы можем сохранять в поле под именем Текст любую текстовую информацию, которая не превышает 255 символов. А вот большее число для размера поля уже использовать нельзя. Рассмотрим пока текстовую информацию, так сказать, не содержащую большого количества символов. Введем, например, такое значение, как 15. И сохраним эту таблицу, и перейдем в обычный режим Таблиц. Ну, сперва щелкнем на кнопке Сохранить. Вставим имя по умолчанию. ОК. Ну, ключевые поля сейчас задавать не будем. Связи с другими таблицами не предусматривается пока, и откроем таблицу в обычном режиме. Щелкнем на эту кнопку. И перед нами появляется наша таблица, в которую мы можем уже вводить какие-либо данные. Напишем что-либо в этом поле. Например, напишем 1. Как мы видим, все пока вполне нормально. Далее, конечно же, будет 2. И т.д., в принципе компьютер, как мы видим, все вполне нормально воспринимает. Но, правда, надо сказать, что мы особой нагрузки здесь и не даем компьютеру. Т.е. все данные намного меньше, чем предельное значение в 15 букв. А теперь же откроем эту же таблицу в режиме конструктора опять. Щелкнем на соответствующую кнопку и попробуем изменить его размер. Вместо 15 единиц зададим всего лишь 5 единиц. Сохраним теперь макет этой таблицы. Щелкнем на кнопке Сохранить. И компьютер нас предупреждает, что некоторые данные могли быть потеряны, в связи с тем, конечно же, что мы уменьшили размер, отводимый для соответствующего текстового поля.
64
TeachPro Microsoft Access 2003
Щелкнем сейчас на кнопке Да. В принципе у нас потеря данных в данном конкретном случае не очень смущает, это у нас экспериментальная таблица. Откроем теперь эту таблицу в обычном режиме и посмотрим, что у нас получилось. Как мы видим, с первыми тремя записями 1,2,3 ничего страшного не произошло, а вот последнее 4, преобразовалось в слове "четыр", буква "e" в конце она исчезла, обрезалась, поскольку она не влезла в наш лимит в 5 букв. Даже если мы сейчас попробуем ввести его снова, вот мы сейчас встали в конец этого текста и попробуем вводить какиелибо буквы. Чтобы мы не нажимали, никаких изменений в этом поле не происходит. Мы простонапросто добрались до максимального размера символов. Ну и, если мы введем какие-либо символы в другое поле, например, вот здесь мы заняли три символа, попробуем еще ввести еще какие-либо. Например, вот так 1,2, но дальше уже никаких изменений в этом поле не происходит. Т.е. максимум в 5 знаков компьютер достаточно четко отслеживает. Попробуем теперь опять открыть в режиме конструктора эту же таблицу. А теперь сделаем другое изменение, а именно, опять увеличим размер, отводимый в этом поле, для нашего текстового значения. Введем опять число 15. А если сейчас откроем эту таблицу обратно, ну, конечно же, сначала необходимо сохранить, Да. Вот все данные, которые у нас были, остались, конечно же, без изменения, слово "четыре", конечно же, не восстановилось, "четыр" так и осталось, но зато мы можем ввести недостающую букву "e". Все теперь нормально. Теперь лимит уже не 5 знаков, как было только что, а 15. Перейдем теперь опять в режим конструктора и попробуем установить максимальное число, которое нам предоставляет 255. И опять перейдем в режим нашей таблицы. Ну, конечно же, предварительно надо сохранить. Щелкнем. Далее откроем таблицу. Немного увеличим размер, который мы можем ввести и увидеть в этом поле для нашего текста. И попробуем ввести здесь уже какую-либо, скажем так, более серьезную информацию. Для этого вызовем окно справки. Далее попробуем найти справку по типу данных. Щелкнем на вот эту кнопку. Появляется вот несколько ответов, и здесь выберем справку по первому из ответов, по заданию или изменения типа данных или размеров поля. Щелкнем. Появляется вот такого типа ответ. Раскроем чуть-чуть этот ответ. Закроем возможность поиска, для того чтобы освободить чуть больше места для нашей таблицы, и попробуем теперь скопировать какой-либо достаточно большой кусок данных из вот этой помощи в нашу таблицу. Например, выберем вот эти несколько строчек. Выделим их. Далее щелкнем на правую кнопку мыши, копировать, и теперь попробуем все это вставить в наше поле. Например, введем новое значение. Щелкнем на правую кнопку мыши, и выберем пункт Вставить. Можно видеть, что у нас теперь получилось. Мы можем видеть хвост, так сказать, того текста, который мы скопировали из нашей справки. Ну, правда, мы можем при помощи кнопок Home и End передвигаться по вот этим данным и добираться до начала наших данных и до конца. Как мы видим, весь наш текст влез в эту ячейку. Дело в том, что, судя по всему, общее количество букв в этом куске текста, оказался приемлемым для нашей таблицы. Попробуем скопировать еще больше кусок информации. Например, выделим вот эти несколько строк, далее опять правой кнопкой мыши, копировать. Вставим сюда. Правая кнопка мыши, вставить. И на этот раз уже видно, что все уже не так гладко, как нам хотелось бы. А именно, возникло вот такое предупреждение, что текст слишком длинный для вставки. Мы его целиком не можем поместить. Щелкнем на кнопке ОК, и как мы видим, компьютер не разрешил нам вставить этот текст, поскольку он вставить его целиком не смог. Посмотрим теперь, как можно редактировать то, что мы ввели в данное поле. Поскольку, несмотря на то, что у нас здесь есть ограничение 255 символов, это все равно достаточно большое число, которое целиком в визуальной части этой ячейки, конечно же, не помещается.
Глава 2. Знакомство с таблицами, создание таблиц.
65
Для этого мы можем щелкнуть на кнопке Shift и F2. Как можно видеть, данные, которые у нас были в нашей ячейке, появились вот в таком окне в области ввода. Здесь мы можем вместе их видеть целиком и спокойно заняться его редактированием. Но, надо отметить, что весь вот этот текст, который сейчас у нас разбит на три строчки, на самом деле представляет собой одну строку без переносов с строки на строку. Просто-напросто, поскольку он целиком не помещается по длине в одну строку, компьютер разбивает его на несколько строк. Но мы можем разбить и на несколько строк и принудительно. Для этого достаточно встать на любое место, которое мы хотим разбить. Например, разобьем его посередине слово "которое" и нажмем на кнопке Ctrl и Enter, для того чтобы ввести символ перевода строки по серединке нашего текста. Там, где это нам необходимо. Сделаем это еще несколько раз. Опять щелкнем на Ctrl и Enter в этом месте. И, как мы видим, вот таким образом мы разбили нашу одну длинную строку с текстом на несколько строк. А именно, на 5 строк. Щелкнем теперь на кнопке ОК. И можно увидеть, что получилось у нас в этой ячейке. Мы можем видеть только одну из строк. В частности, в данном конкретном случае на последнюю. Но, в принципе, ничего страшного в этом нет, поскольку стрелками вверх и вниз с клавиатуры мы можем передвигаться по этому тексту, по каждой из строк вверх и вниз, от начала текста до его конца. Конечно же, кнопки Home и End передвигает в пределах одной строки от начала до конца нашего текста. А если же мы хотим видеть несколько строк одновременно в нашей таблице, то для этого можем расширить его размер по вертикали. Для этого достаточно схватить за вот этот разделитель между строками, потянуть его вниз, задавая большие размеры каждой записи нашей ячейки в нашей базе данных. И, как мы видим, в нашей ячейке вот в этом месте помещается уже не одна строка, а несколько. Если мы будем передвигаться по записи внутри этой ячейки, то можем видеть его содержание. В принципе, разбить на несколько строк можно не только в отдельном окне для редактирования, но и непосредственно в этой ячейке. Для этого опять-таки достаточно нажать на кнопке Ctrl и Enter. Ну вот, как мы видим, мы ввели еще одну разбивку на несколько строк. Точно также можно и встав на конец строки, и щелкнув на кнопке Delete, мы просто-напросто уничтожаем соответствующий перенос и уменьшаем количество строк. Опять щелкнем на кнопке Delete, и как мы видим, у нас количество строк уже гораздо меньше. Вот таким образом мы достигли того, что у нас в этой ячейке просто-напросто только три строки. Что же нам теперь делать, если нам необходимо ввести в нашу ячейку текст, который превышает по своим возможностям обычное текстовое поле. Т.е. если в нем количество символов должно быть больше, чем 255. Для этого перейдем в режим конструктора и на этот раз выберем имя для нового поля. Например, пусть это будет у нас просто-напросто описанием. И вместо текстового, которое нам компьютер предлагает по умолчанию, выберем тип поля МЕМО, которое обладает более широкими возможностями по вводу текста, чем текстовое поле. Здесь ограничение уже гораздо, так сказать, более либеральное и составляет 65000 символов, что, конечно же, больше, чем в текстовом поле. Правда, у поля МЕМО есть свое ограничение. Это поле не может использоваться как индексированное поле и ключевое поле. Для поиска различного рода информации сортировки и связи с другими таблицами. Скажем, так это поле только для описательной информации. Ну, а теперь отметим еще одно обстоятельство, что вот это поле МЕМО такое, так сказать, гибкое и резиновое, за счет того, что в нашей таблице на самом деле сохраняет только ссылки на то место, где будет храниться основная информация. Она хранится за пределами конкретной таблицы в отдельном блоке данных. Попробуем теперь записать эту таблицу. Щелкнем на кнопке Save и откроем эту таблицу в обычном режиме, в режиме таблицы. Как мы видим, у нас появилось новое поле, поле описание. Сдвинем вот этот разделитель, для того чтобы мы могли видеть вот эту колонку целиком. И попробуем скопировать туда большой
66
TeachPro Microsoft Access 2003
кусок текста. Например, выберем вот такой кусок текста. Щелкнем на правую кнопку мыши, копировать и вставим вот, например, хотя бы в пе6рвую из строк. Для этого щелкнем на правую кнопку мыши и выберем пункт Вставить. Как мы видим, компьютер совершенно спокойно вставил достаточно большой кусок текста. Если мы будем щелкать на кнопке вверх и вниз, то можно увидеть все те данные, которые находятся в этом тексте. Ну, если мы опять-таки щелкнем на кнопке Shift +F2, то можно видеть весь текст. который мы сохранили в этой ячейке целиком, вот в этой области для ввода. Ну, как мы видим, вот этот кусок текста достаточно большой, состоящий из довольно большого количества строк. Щелкнем на кнопке ОК. И этим закончим наше знакомство с основными текстовыми полями, текстовым и полем МЕМО.
2.3.5 Тип дата/время и логический тип Форматы изображения Рассмотрим на этом уроке формат, тип поля, дата или время. Как можно использовать логический тип поля. Что представляет собой денежный тип. Создадим для этого новую таблицу. Проще всего создать в режиме конструктора. Щелкнем на вот этой строке дважды, вот появилось стандартное окно, для создания новой таблицы и в нем введем несколько новых полей. Введем поля в такой последовательности, пусть в начале будет фамилия. Пусть оно будет текстовым типом, далее имя. Оно, конечно, тоже имеет текстовый тип данных. Далее дата рождения. Ну, в принципе, текстовый тип данных для этого поля у нас уже, конечно же, не устроит. Хотя, надо сказать, что в принципе, конечно же, текстовый тип данных можно использовать для даты, поскольку все составляющие символы, которые нам нужны для отображения даты, конечно же, в текстовом формате тоже присутствуют, но, конечно, дату лучше хранить в специальном формате, формате Дата и время. В этом случае, у нас будет возможность выполнять над ними больше операции. А именно, мы можем сравнить две даты друг с другом, прибавлять к дате определенное количество дней, и т.д. А если мы запишем дату и время в текстовом формате, тогда этих возможностей у нас, конечно же, не будет. Поэтому щелкнем на ниспадающем списке и выберем тип Дата/время. Если обратиться к внутренней структуре этого поля, то надо отметить, что дата -время хранится в специальном числовом формате и в нем целая часть этого числового формата представляет собой дату, а его дробная часть хранит в себе информацию о времени. Access предлагает нам довольно широкий выбор формата в отображения данных, которые можно посмотреть, выбрав поле формат Поле. Щелкнув на вот этом ниспадающем списке, то можно увидеть, какие у нас здесь есть возможности. Здесь мы можем видеть различные типы времени и даты. Ну, слева у нас краткое название этого формата, а справа, какой-либо соответствующий пример. Но, для начала не выберем ни один из этих форматов. Пусть это поле отображается значением по умолчанию. Сохраним теперь эту таблицу. Щелкнем на кнопку записи. Ну, имя таблицы пусть будет, какое нам предлагает Access по умолчанию, ОК. Ну, конечно же, ключевые поля нам сейчас не интересны. щелкнем на кнопке Нет и в результате эта таблица у нас сохранилась в нашей базе данных. А теперь откроем ее в режиме таблицы. Щелкнем на кнопке Вид, и вот она появилась перед нами. Здесь у нас, как мы видим, три поля, как мы и создавали в нашей структуре. Ну и ни одной записи, конечно же, пока еще нет. Введем фамилию и имя. Пусть будет вот таким образом, Иванов фамилия, имя, не будем напрягать фантазию, пусть будет Иван, ну и дата рождения. В качестве даты введем 1 января, допустим, 1980 года.
Глава 2. Знакомство с таблицами, создание таблиц.
67
Ну и, как мы видим, нам компьютер, как только мы перещелкнули на другую строку, зафиксировал эту дату. Надо сказать, что Access нам предоставляет довольно широкую возможность для заполнения даты и времени. Например, вместо вот такой записи, введем немножко по-другому. А именно, при помощи запятых, отделяя части даты, друг от друга. Ну, например, пусть будет таким образом. Первое - запятая, второе - запятая, и далее 1981 год. Как мы видим, компьютер и в этом случае вполне адекватно воспринял наши усилия. Давайте, теперь изменим формат записи даты. Для этого перейдем в режим конструктора, щелкнем на кнопке Вид, и в формате Поле щелкнем на ниспадающем списке и выберем первую возможность Полный формат даты. Щелкнем на этой возможности и сохраним эту таблицу. Щелкнем на кнопке сохранения, перейдем в режим таблицы, ну и пока, как мы видим, у нас абсолютно ничего не изменилось в нашей записи даты. Но, дело в том, что у нас, в нашей дате пока составляющие времени нет. Раскроем это поле по ширине и попробуем ввести еще и время для нашей даты. Вот представим себе, что дату рождения мы ставим достаточно точно вплоть до часов. Но, пусть он родился в 3 часа 15 минут и 25 секунд. Как мы видим, мы вводили с разделителями между составляющими времени двоеточие. Щелкнем теперь где-либо в другом месте нашей таблицы, и как мы видим, компьютер на этот раз зафиксировал и воспринял все наши изменения. Опять теперь изменим формат записи. Перейдем в режим конструктора и выберем какой-либо другой формат. Например, выберем вот этот длинный формат записи. Перейдем опять в режим таблицы. Конечно же, нам необходимо было сохранить макет. Щелкнем на кнопке Да. И можно увидеть, как на этот раз изменилась вот эта запись, запись даты. Как мы видим, часы с минутами и секундами исчезли из этого поля, а запись самой даты превратилась вот в такую запись, при котором месяцы у нас отображаются в виде слов и в конце приписывается буква "Г", год. Ну, таким образом, можно еще менять отображения даты и отобразить ее в различном формате. Перейдем опять в режим конструктора и выберем на этот раз формат времени, длинный формат. Щелкнем. Перейдем в режим таблицы предварительно, сохранив нашу таблицу, щелкнем. Далее, режим таблицы и, как мы видим, у нас восстановилось то время, которое мы ввели для нашего персонажа. Именно 3 часа 15 минут и 25 секунд. А вот сама дата, она исчезла из визуального представления в нашей ячейке. Отметим, что, когда мы вводим время, надо быть достаточно внимательным. Например, перейдем на вторую запись. Введем здесь какую-либо фамилию. Например, Петров, и введем для него время, в соответствующую ячейку. Ну и, если мы введем его таким образом, 3 далее двоеточие и 22, и перещелкнем то, можно увидеть, как изменилась эта запись. Т.е. компьютер воспринял эту запись 3.22, как 3 часа 22 минуты и 00 секунд. В принципе, надо иметь в виду это обстоятельство, когда мы вводим время. Т.е., если мы хотели ввести 3 минуты и 22 секунды, надо было бы впереди написать 0. Вот, например, таким образом, 0 и далее 3 и далее 22, и лишь в этом случае мы гарантировано получим 3 минуты 22 секунды. Т.е. аккуратность, конечно же, никогда не помешает. Ну и, конечно же, переходя на первую строку, можно увидеть ту полную дату и время, которое сохранялось в этой ячейке. Как мы видим, вот эта составляющая даты в этой ячейке, на самом деле никуда не исчезла, она просто-напросто находится в скрытом виде, когда эта ячейке неактивна. Но, перейдем в режим конструктора и выведем полный формат даты, для того чтобы мы могли видеть все значение этого поля. Щелкнем на кнопке сохранения. А теперь рассмотрим еще один тип данных, а именно логических, Да или Нет. Например, для использования логического типа данных введем еще одно поле, например, Женат или нет наш персонаж. Для этого напишем просто-напросто Женат. Далее выберем тип данных. Ну, конечно же, опять-таки, точно так же. как в отношениях даты-времени этот тип данных тоже в принципе можно представить себе и ввести в
68
TeachPro Microsoft Access 2003
текстовом виде, написав каждый раз просто-напросто слово Да или Нет. Или женат или не женат. Ну, конечно же, разумнее ввести специальный логический тип. В этом случае опять-таки в наших дальнейших усилиях по обработке наших таблиц, мы будем иметь возможность использовать эту таблицу и вот это соответствующее поле разумнее. Поэтому щелкнем на вот этот ниспадающий список и выберем логический тип. Здесь можно посмотреть, какой формат этого поля. Как мы видим, сейчас он имеет тип Да - Нет. Но, если мы щелкнем на ниспадающем списке, то можем видеть, что он может принимать Истину-Ложь, Да - Нет, или Включено и выключено. Ну и рядом можно увидеть, как будет выглядеть это поле в каждом из трех форматов. Ну, а теперь перейдем в саму таблицу, предварительно сохранив его. Щелкнем на кнопке сохранения. Далее щелкнем на отображение в виде таблицы и можно увидеть, что в соответствующем поле появились вот такие квадраты. В них мы по желанию можем поставить галочку, если, конечно, мы уверены, что наш персонаж Иванов, конечно же, женат, а Петрова оставим холостым. Здесь галочка не стоит. Надо отметить, несколько обстоятельств по работе с логическим типом данных. Если мы передвигаемся по нашей таблице при помощи клавиш, то, как только мы попадаем на соответствующее поле, в поле логического типа, то вот этот квадратик сразу же является в фокусе ввода. Т.е. если мы сейчас щелкнем на пробел на клавиатуре, то сразу же наша галочка или вставится или снимается в соответствующем виде. Если передвинемся на Петрова и поставим здесь галочку, щелкнув на кнопке Пробел, то, конечно же, сразу же это отображается на нашем экране. Ну, еще раз щелкнув на пробел, восстанавливаем Петрова в режиме холостого человека опять. Отметим еще, что вот этот тип логический не может быть использован в качестве индексного поля и в качестве ключевого. Ну, с этими понятиями мы разберемся попозже. Перейдем теперь опять в режим конструктора и попробуем ввести еще одно поле, достаточно существенное для нашего персонажа, а именно, зарплата. Ну и, конечно же, зарплата у нас не может быть ни датой времени, ни логическим типом, она, конечно же, она должна быть специального денежного типа. Хотя опять-таки его можно ввести, как текстовый и в принципе, можно ввести его и в числовом формате. Но тип денежный, он наиболее подходящий для этого типа поля. Ну и увидим, почему. Щелкнем на этом пункте. Как мы видим, формат поля у нас сейчас стоит на денежном. А если мы щелкнем на ниспадающем списке, то можно увидеть, какие здесь у нас есть возможности. Как мы видим, по умолчанию в нашем денежном типе, в конце приписывается буква "P", что видно в этом примере. Ну и остальные особенности записи этих данных тоже можно увидеть достаточно наглядно. Ну и можно увидеть, какие здесь еще есть возможности. Можно ввести зарплату в евро, а можно ввести без приписывания денежной единицы. Можно ввести с разделителями разрядом, с процентами это число, можно и его записать, как экспоненциальное число. В принципе, достаточно разумный список, единственно, конечно же, в принципе, не понятно, почему здесь нет денежной единицы знака доллара. В англоязычной версии, вместо рубля, в качестве основной единицы, конечно, был бы использован знак доллара. Ну, а в нашей, в русскоязычной версии, используется знак рубля, в качестве основной денежной единицы. Ну, посмотрим, как все это будет выглядеть на практике. Для этого переключимся в разряд таблицы, предварительно сохранив эту таблицу. Щелкнем на кнопке сохранения, теперь щелкнем на отображение в виде таблицы и можем видеть, что теперь происходит с нашими персонажами. Как мы видим, пока ни у Иванова, и ни у Петрова, никакой зарплаты нет. Ну, это достаточно легко исправить. Пусть у нашего первого персонажа, у Иванова, зарплата будет 100 рублей. Введем 100 единиц, и как мы видим, у него сразу же появилась вот эта приписка "p", рублей. Ну и у Петрова пусть будет чуть повыше, 250 рублей. Как мы видим, точно так же, как и в случае с Ивановым, наше число преобразовалось к денежному формату.
Глава 2. Знакомство с таблицами, создание таблиц.
69
Перейдем в режим конструктора и переделаем наш тип поля, выберем другой формат. Вместо денежного, выберем, например, евро. И если мы сохраним этот макет таблицы и откроем нашу таблицу в обычном режиме, то можно увидеть, что около каждого из чисел, появилась вот такая приписка знака евро. Перейдем в режим конструктора и посмотрим, какие здесь у нас еще есть возможности. А именно, например, если посмотрим процентный вид, сохраним и посмотрим, как все это будет выглядеть. Ну, как мы видим, каждое из этих чисел умножилось на 100, и около каждого из них приписался знак процента, что в принципе, достаточно логично. Ну и перейдем в режим конструктора. Последний вид, который здесь есть, это экспоненциальное, при помощи которого, наше представление вот этих зарплат будет выглядеть вот таким, достаточно экзотическим образом. Ну, конечно же, в таком виде обычно числовую зарплату не записывают. Поэтому в принципе, вернемся к одному из более знакомых видов, которым, конечно же, является денежный тип. Это в принципе основная возможность для введения денежных операций. Запишем и окончательно посмотрим, как может выглядеть наша таблица.
2.3.6 Тип гиперссылка Использование гиперссылок На этом уроке мы научимся создавать гиперссылки. Напомним, что гиперссылки используются для открытия нужного документа, web страницы или любого файла. Для этого достаточно щелкнуть на соответствующую гиперссылку. При этом таблицы, запросы и формы должны быть открыты в режиме таблицы или же в режиме формы. Создадим какую-либо таблицу с полем гиперссылок и попробуем с ними поработать. Для этого создадим таблицу в режиме конструктора. Щелкнем дважды на этой строке. Вот, появилось стандартное окно, в котором введем первое поле. Пусть это будет поле Код, который у нас будет иметь тип Счетчик. И следующее поле, назовем это поле Ссылки, и введем для него тип, который должен иметь это поле. Как мы видим, автоматически установился тип Текстовый. Нас, конечно, это не устраивает. Щелкнем на этом раскрывающем списке и выберем тип Гиперссылка. Щелкнем. Вот мы зарегистрировали этот тип данных для этого поля. Сохраним теперь эту таблицу. Щелкнем на кнопке Сохранить. Ну, согласимся с этим именем по умолчанию. ОК. Ну, ключевые поля сейчас не нужны. Щелкнем на кнопке Нет и мы успешно сохранили нашу таблицу в нашей базе данных. Перейдем теперь в режим Таблицы. Щелкнем на вот этой кнопке Смена режима и вот перед нами наша таблица, в которой, как мы видим, два поля, поле Счетчик и поле Ссылок. Добавим теперь гиперссылку прямо в таблицу. Т.е. мы можем написать вот в этом месте текст, который мы хотим отобразить. Например, напишем таким образом. Далее введем вот такой знак. Ну и дальше нам нужно ввести непосредственно адрес того объекта, к которому мы должны пойти по этой гиперссылке. Но, прежде чем введем адрес, чуть-чуть расширим поле визуально, его часть, для того чтобы мы могли видеть всю ячейку целиком. Подтянем его в сторону, например, вот таким образом. Как мы видим, в результате у нас изменения в этой ячейке уже сразу же зафиксировались. Ну, конечно же, это нас не устраивает, поскольку мы зафиксировали только имя нашей гиперссылки, ничего там, так сказать, внутри еще нет, ни адреса, ничего. Поэтому продолжим редактирование этой ячейки. Для этого нажмем на кнопку Shift и F2. Как мы видим, перед нами появилась наша надпись вот в этом стандартном окне в области ввода. Введем опять тот недостающий символ, которым разделяются разные части гиперссылки друг от друга и далее, непосредственно адрес web страницы. Ну, он будет выглядеть таким образомHTTP.
70
TeachPro Microsoft Access 2003
Далее двоеточие, далее две косые черты, VV, Microsoft, точка, com. Это достаточно стандартный адрес страницы. Поставим еще один такой же знак разделитель. Далее нужно ввести было бы дополнительный адрес, но сейчас мы его вводить не будем. Поэтому еще один знак разделитель и далее текст подсказки. Ну, пусть это будет такой текст. Это адрес в Интернете. Вот, таким образом мы смогли сформировать одну ячейку для нашей гиперссылки. Щелкнем на кнопке ОК, и можно увидеть, как это все будет выглядеть уже в нашей ячейке. Пока в режиме редактирования. Ну, зафиксируем эти изменения. Для этого перещелкнем где-либо в другом месте и на этот раз уже наш адрес полностью готов и сформирован вот в этой ячейке. Если мы подведем наш курсор к вот этой ячейке, причем необязательно к надписи, а к любой ее части. как мы видим, наш курсор превращается в такую руку, появляется подсказка в нашем конкретном случае, это адрес в Интернете, и если мы щелкнем на этой ячейке, то автоматически загрузится страница, и мы можем посмотреть, что нового нам подготовила программа. Если мы теперь опять встанем на эту ячейку, например, подойдем при помощи кнопок на клавиатуре и далее щелкнем на кнопку F2, и как мы видим, можно видеть всю информацию, которая находится в этой ячейке. Напомним еще раз, что она состоит из 4 частей. Первая часть это само название, т.е. тот текст, который отображается в нашем окне ячейки, далее находится разделительный символ, после которого находится сам адрес в Интернете или по какому-либо ресурсу. Ну, например, адрес на нашем жестком диске и т.д. Затем, должен опять находится разделитель, после которого идет дополнительная ссылка, которая в принципе определяет место внутри этого ресурса, где мы должны открыть нашу ссылку и после этого, опять после разделителя находится некий текст, который отображается в виде подсказки. Как мы видим, в нашем вот этом первом адресе отсутствует только вот эта дополнительная ссылка. Перейдем теперь на другую ячейку и попробуем другой метод создания ссылки. Попробуем скопировать гиперссылку из какой-либо другой программы офиса. Например, из программы Word. Для этого откроем какой-либо документ с гиперссылкой. Вот, например, перед нами документ, в котором наряду с обычным текстом есть и одна гиперссылка, которую можно легко увидеть, и отличить по своему характерному внешнему виду. Если мы подойдем к этой гиперссылке, то появляется соответствующая подсказка и надпись, что, для того чтобы использовать эту гиперссылку надо нажать на кнопку Ctrl. Вот сейчас я нажимаю на кнопку Ctrl, и как можно увидеть, наш курсор превращается вот в такую руку, что дает нам возможность понять, что при нажатии сейчас мышкой на вот эту гиперссылку, мы перейдем по соответствующему адресу. А теперь же нам, конечно же, не интересен именно переход, а именно интересно копирование этой гиперссылки. Поэтому подойдя к ней, щелкнем на правую кнопку мыши, чтобы вызвать контекстное меню и в нем выберем пункт Копировать гиперссылку. Щелкнем. Вот, теперь адрес этой гиперссылки и все его параметры зафиксировались у нас в буфере обмена. Перейдем теперь к нашей базе данных. Свернем вот это окно. Теперь встанем вот на эту строку, в которую мы хотим ввести новую запись. Далее правая кнопка мыши, вот перед нами появилось контекстное меню, в котором, конечно же, нам нужно выбрать пункт Вставить. Если мы щелкнем, то, как мы видим, у нас заполнилась вторая запись, и в нем появилась вот эта гиперссылка со своим текстом. Если мы к ней подойдем, то, конечно же, появляется и соответствующая подсказка. Для того чтобы проверить эту гиперссылку в действии, щелкнем на ней. И в результате мы попадаем на то место, куда нас послала так сказать наша гиперссылка, а именно на соответствующую страницу, на нашем диске, который представляет собой одну из
Глава 2. Знакомство с таблицами, создание таблиц.
71
страниц помощи Microsoft Word. Закроем теперь эту HTML страницу, щелкнем на вот этом крестике, и мы вернулись в нашу базу данных. Надо отметить, что, конечно же, и уже используемые ссылки, точно так же, как это происходит при навигации, отличается своим цветом от не использованных. Это в принципе хорошо видно на вот этих двух строчках. По второй ссылке мы уже переходили, вызывая соответствующий документ, а первую ссылку мы и не использовали.
2.3.7 Добавление гиперссылок Попробуем теперь вставить еще одну запись, причем гиперссылку создадим сейчас таким образом, чтобы она указывала на конкретное место в какомлибо документе офиса. Ну, например, в том же самом файле Word. Для этого откроем его сначала, вот он появился перед нами, и здесь выделим какой-либо текст, который будет использоваться в качестве гиперссылки. Например, допустим, мы хотим сразу же переключиться на вот эту строчку в нашем документе. Выбрать, в принципе можно любой текст и любой его размер. Далее, щелкнем теперь на правую кнопку мыши и при появлении контекстного меню, выберем пункт просто-напросто Копировать. Вот, этот текст мы скопировали в буфер обмена, теперь, в принципе, перейдем в нашу базу данных. А этот документ мы можем даже, в общем-то, закрыть. Щелкнем на вот этом крестике. Вот мы опять попали в нашу базу данных. Встанем на то место в нашей таблице, куда мы хотим вставить гиперссылку. Далее выполним пункт Правка и выполним вот этот пункт Вставить. Щелкнем. Вот, перед нами появляется наша гиперссылка. Причем можно увидеть здесь все составляющие этой гиперссылки. И само название, которое должно появляться в нашем документе и его ссылка. А также та подсказка, которая будет появляться, когда мы подведем курсор к нему. Теперь перещелкнем наш курсор при помощи мышки, и можно увидеть уже непосредственно этот текст, который и является нашей гиперссылкой. Ну и если мы остановимся, то появляется и соответствующая подсказка. Ну, а теперь, если мы щелкнем на этой гиперссылке, то, как мы видим, мы сразу же попадаем в то место нашего текстового документа, который мы использовали в качестве гиперссылки. Закроем теперь этот документ. Он нам уже не нужен. И вот мы опять вернулись в нашу базу данных. Гиперссылку мы в наш документ можем включить и при помощи вот этой кнопки Добавить гиперссылку на нашей панели инструментов. Если мы щелкнем, появляется вот такое стандартное окно, которое поможет нам вставить гиперссылку. Щелкнем на кнопку отмены и отметим, что вставить гиперссылку можно и при помощи пункта меню Вставка и далее Гиперссылка. Это в принципе пункт меню выполняет то же самое, что и нажатие на вот эту кнопку, которую мы нажимали только что. Ну и рассмотрим, что же позволяет нам делать вот это окно. Во-первых, мы можем выбрать, что мы хотим связать с нашей гиперссылкой. Хотим ли мы с ним связать файл или web страницу. Мы можем связать нашу гиперссылку с файлом или с web страницей, которые уже существуют на нашем жестком диске или где-либо в Интернете, или в локальной сети. Для этого, при помощи вот этого окна мы можем провести навигацию по соответствующим ресурсам, выбрав соответствующий файл. Также нам помогут вот эти несколько возможностей. Посмотреть текущую папку или последние просмотренные страницы, или последние файлы. Мы можем открыть вот этот выпадающий список, выбрав какую-либо из папок на нашем жестком диске. Также мы можем выбрать какой-либо ресурс в Интернете. Или же можем воспользоваться поиском файлов. Также можем открыть новую страницу, введя непосредственно путь и выбрав, когда мы хотим вносить правку в наш документ, позже или сейчас. Или же можем связать ссылку с электронной почтой. Но, для этого, конечно же, потребуется ввести сам адрес электронной поч-
72
TeachPro Microsoft Access 2003
ты. Выберем, например, добавление гиперссылки связь с каким-либо файлом и опять выберем вот этот файл поддержка устройства ввода. Ну и сразу же, конечно же, появляется текст нашей гиперссылки, сразу же появляется его адрес. Конечно же, мы можем отредактировать вот этот текст. Например, напишем просто Поддержка устройств ввода. И весь остальной текст можем убрать и введем какую-либо подсказку. Для этого щелкнем на соответствующую кнопку. И напишем просто-напросто Это гиперссылка. Щелкнем на кнопке ОК. Ну и в принципе можем щелкнуть еще раз на ОК, чтобы зафиксировать все наши изменения. Ну, и вот эта гиперссылка у нас опять тоже появилась вместе со своей подсказкой, которая, как мы видим, только что появилась на нашем экране. Если мы сейчас на ней щелкнем, то откроется соответствующий документ Word, на который мы сейчас и сделали ссылку. Вставим еще гиперссылку. Щелкнем на этот раз на вот этой кнопке на панели инструментов и выберем способ вставки гиперссылки при помощи браузера Интернет. Щелкнем, появляется всем знакомая окно. Далее щелкнем на вот этом выпадающем списке и найдем какой-либо интернетовский адрес, на котором мы были на нашем компьютере. Например, вот этот адрес. И вот перед нами появилась соответствующая страница этого ресурса. В принципе, нам из всего этого нужен только вот этот адрес, который скопируем. Выделим. Далее правая кнопка мыши и Копировать. Больше нам ничего здесь не нужно. Закроем эту страницу. Далее вставим вот этот адрес. Для этого щелкнем на Ctrl+V. Вот он вставился. Ну, вставить можно и текст. Конечно, можно сохранить в таком виде. В принципе, не целесообразно. Ну, поэтому напишем таким образом. Например, просто-напросто Новости. Ну и можем ввести еще и подсказку для этой гиперссылки. Ну, например, вот таким образом. Мои интересные новости. Щелкнем на ОК. В принципе, у нас уже все сформировано, еще раз ОК. И опять-таки эта гиперссылка у нас появляется на нашей базе данных. Ну, конечно же, и подсказка тоже на месте. Если мы сейчас на ней щелкнем, то попадем на соответствующую Итернет-страницу прямо в Интернете. Введем еще одну гиперссылку. Щелкнем опять на ввод гиперссылке на соответствующей кнопке на панели инструментов, и выберем на этот раз пункт Связать новые страницы. Введем имя для нашего нового документа. Но, пусть это будет, например, Моя страница. Далее, как обычно текст, который должен появляться и подсказка. Ну, текст пусть будет, например, Моя гиперссылка на страницу. Введем для общности еще и подсказку, в которой просто-напросто напишем Гиперссылка. ОК. Далее нам требуется ввести, когда мы хотим внести правку в этот документ, сейчас или попозже. И определиться с местом нахождения этого документа. Мы можем согласиться с пунктом Мои документы, или же можем поместить в другое место на нашем жестком диске. Сейчас, в принципе, оставим, как есть. Щелкнем на кнопке ОК. Далее появляется вот такое предупреждение, что если страница доступа в данных создана в текущей версии, ее нельзя будет открыть в режиме конструктора 2000. Однако, если у нас есть web компоненты XP, то все вопросы будут решены. Ну, в принципе учтем это. Поскольку у нас уже есть, и этим условиям мы удовлетворяем, поэтому мы смело нажмем на кнопку ОК. И как можно видеть, появляется вот такое новое окно, в котором мы можем отредактировать нашу страницу. Ввести здесь название и другие атрибуты. Введем, например, название для нашей страницы. Для этого достаточно щелкнуть на вот этом месте нашего документа наверху и введем, например, таким образом. Страница Иванова. Далее можем ввести еще какую-либо надпись. Ну, допустим, пусть это будет краткие сведения. А теперь попробуем ввести какую-либо существенную информацию на эту страницу. Во-первых, щелкнем здесь на правую кнопку мыши и посмотрим, какие у нас здесь есть возможности по настройке. Например, можем изменить цвет заливки фона. Например, возьмем вот
Глава 2. Знакомство с таблицами, создание таблиц.
73
такой желтый фон, в результате получая вот такой вид нашей страницы. А теперь же щелкнем на правую кнопку мыши и выберем, например, цвет текста, которым он будет отображаться на нашей странице. Например, текст будет отображаться вот таким синим цветом. Ну, с настройками так сказать оформления в принципе покончим, и откроем, например, свойство раздела. Если мы здесь щелкнем, то появляется вот такое окно, в котором нам предлагают достаточно много различного рода настроек. Перейдем в другую вкладку, во вкладку Данные, в которой выберем ту таблицу, из которой мы хотим так сказать черпать наши данные. В качестве основной таблицы выберем вот эту таблицу Сотрудники. Щелкнем на ней. В результате появляется вот такое окно со списком полей, которые есть у наших сотрудников. Вот это окно мы можем закрыть, оно нам уже не нужно. В принципе, сейчас, не смотря на то, что мы уже выбрали Сотрудники, мы в принципе можем изменить свое мнение и выбрать, например, Таблицу 1. Или какую-либо другую таблицу, если бы она у нас было в нашей базе данных. Но сейчас согласимся с Сотрудниками и выберем те данные, которые здесь у нас есть. Во-первых, это имя и поместим его на нашу страницу. Ну, для того чтобы поместить, достаточно просто-напросто схватить его и перетащить на нашу страницу. Вот мы его бросили вот в это место. Как мы видим, она сразу же появилась, сдвинем нашу страницу. Расширим ее и поместим другие данные. Например, перетащим на этот раз еще и фамилию вот в это место. Конечно же, неплохо было бы вставить еще и должность, тоже перетащим и введем еще последние данные, это Отдел, в котором работает наш персонаж. Например, вставим вот в это место. Ну, конечно же, вот в таком виде оставлять нашу страницу достаточно нехорошо. В принципе, лучше бы выровнять эти данные хотя бы. Для этого схватим соответствующие ячейки и подравняем их относительно друг друга. Вот, например, таким образом. Закроем теперь и вот это правое окно области задач. Закроем и Мою страницу тоже, мы ее в принципе, уже вполне сформировали. Щелкнем на вот этом крестике. Ну и, конечно же, на вопрос сохранения и макет, и всю эту структуру данных, конечно же, надо ответить на кнопке Да. Щелкнем на кнопке Да. Вот мы опять вернулись в нашу таблицу и в нем на нашу таблицу с гиперссылками. А теперь, если мы щелкнем на вот эту 6 гиперссылку, Моя гиперссылка на страницу, то появляется наша страница, на которой, как мы видим, как раз и расположены все наши поля и надписи, которые мы вводили. В принципе, все как раз и выглядит так, как мы задумали. А теперь в нем можно увидеть ту информацию, которая у нас была во второй нашей таблице, в таблице Служащие. Ну и, конечно, при помощи вот этих кнопок следующей и предыдущей, мы можем рассматривать все записи, которые находятся на этой странице. Мы можем передвигаться и на последнюю и на первую записи, в общем, можем пользоваться всеми возможностями навигации, которые обычно есть у базы данных. Закроем теперь эту страницу. Она, как мы видим, и попробуем посмотреть эту же страницу в живом виде. Дело в том, что она у нас сохранилась, как мы помним, в моих документах. Для этого откроем папку Мои документы. Вот она появилась перед нами. Здесь у нас находятся разного рода документы и в том числе вот эта Моя страница. Щелкнем на ней дважды. И вот эта страница, страница Иванова, на которой мы столько трудились, появилась перед нами и причем появилась в обычном браузере. И в нем есть все возможности, которые мы и задумывали. И как мы видим, эта страница уже работает автономно. Ну, точно также мы можем просматривать все записи, которые присутствуют в соответствующей таблице Служащих. Мы можем передвигаться по записям, рассматривая каждую из фамилий и их персонажей, которые присутствуют в этой таблице со всеми его данными. Закроем теперь эту страницу и мы вернулись в наше стандартное окно.
74
TeachPro Microsoft Access 2003
2.3.8. Тип Поле объекта OLE На этом уроке мы ознакомимся с объектами OLE, которые служат в тех случаях, когда нам нужно в ячейку вставить какие-либо объекты, созданные в других программах. Например, ссылки на другие документы, на какие-либо картинки или вставить в эту ячейку сами эти картинки или документы. Т.е. внутрь нашей базы данных можно вставить совершенно разнообразные и разношерстные элементы. Посмотрим, как это делается. Для этого создадим новую таблицу. Как всегда создадим ее в режиме конструктора. Щелкнем дважды на вот этой строчке. Вот, появляется вот это стандартное окно Ввода новой таблицы, и введем сначала первое поле. Пусть у нас будет просто заголовок. Тип данных пусть у него будет текстовый, как и в данном компьютере по умолчанию. Вот, следующее поле пусть будет поле OLE. Введем имя для этого поля. Пусть это будет объект, поскольку именно объекты мы будем вставлять в это поле. Ну и тип данных, конечно, у него должен быть не текстовый, а поле OLE. Для этого щелкнем на вот этом выпадающем списке и выберем вот этот пункт, поле объекта OLE. Щелкнем. Теперь у нас в принципе структура нашей таблицы уже полностью готова. Если мы не хотим никаких полей, то можно записать эту таблицу и перейти в режим ее заполнения. Ну, щелкнем на кнопке сохранить. Согласимся с именем этой таблицы, таблицы1. Щелкнем на кнопке ОК. Ключевые поля нам сейчас не нужны. поскольку с другими таблицами мы сейчас связывать его не будем, поэтому щелкнем на кнопке Нет. Вот эту базу данных мы сохранили и теперь перейдем в режим ее заполнения. Для этого щелкнем на вот этой кнопке Вид, которая находится на панели инструментов, и вот эта наша стандартная таблица появилась перед нами. Как мы видим, у нас здесь два поля, два столбца, заголовок и объект, ну и, конечно же, эта таблица пока абсолютно пустая. Попробуем теперь внести первую запись. Сначала перво-наперво введем какой-либо объект. Встанем на вот эту строку. Далее мы можем поступить несколькими путями. Для начала щелкнем на правую кнопку мыши и выберем пункт Добавить объекты из вот этого контекстного меню. Щелкнем. Появляется вот такое стандартное окно, в котором в серединке находится список всех возможных объектов для вставки, которые есть и зарегистрированы на нашем компьютере. Ну и с левой стороны у нас есть переключатель, при помощи которого мы можем выбрать две возможности. Это создать новый файл или же создать объект из файла, который уже находится где-либо на нашем компьютере или в ином месте. Ну и кроме этого мы можем вставить в виде знака, так сказать, в виде ссылки или же при помощи самого объекта. Ну, перво-наперво пусть будет создать из файла, переключимся и в этом случае, конечно же, появляется вот такое стандартное поле для ввода, в котором мы ввести путь к тому файлу, который мы хотим ввести в виде объекта. Ну, конечно же, вероятность того, что мы точно знаем этот путь не велика. Поэтому легче всего списать наш объект с таблицей и с ячейки при помощи вот этой кнопки Обзор, для того чтобы ее непосредственно найти. Щелкнем вот на этой кнопке. Появляется вот такое стандартное окно обзора. Ну, конечно же, мы можем поискать в различных местах. Можем поискать в Моих документах, на Моем компьютере, в сетевом окружении и т.д. Но тут все достаточно стандартно. Ну, согласимся в принципе с папкой Мои документы, в которой тоже находится достаточно много подходящих файлов. Выберем какой-либо из файлов. Например, выберем файлы рисунка, вот эта бабочка. И щелкнем на нем дважды. Вот этот соответствующий путь к этому файлу у нас теперь появился вот в этом поле для ввода. Если мы пойдем в конец этого текста при помощи кнопки Enter, то можно увидеть название
Глава 2. Знакомство с таблицами, создание таблиц.
75
этого файла, бабочка. Конечно же, это файл рисунка. Далее мы можем поставить галочки на пункте Связь. Если мы здесь не поставим, тогда документ вставляется в виде объекта. который активизируется с помощью создавшего его приложения при желании, если мы на нем щелкнем дважды. А если мы поставим здесь галочку, тогда изображение будет связано с файлом, что позволит отражать в документе все изменения этого файла. Но пока галочку ставить не будем, щелкнем на кнопке ОК. И как мы видим, вот этот соответствующий объект попал в поле для наших объектов, что появилось вот в этой надписи. Введем для этой записи еще и заголовок. Напишем Бабочка, что соответствует содержанию. Чтобы посмотреть, что же там происходит, можно щелкнуть дважды на вот этом пункте. И в результате активизируется вот такое стандартная программа просмотра изображения факсов и в нем можно увидеть вот этот рисунок, который у нас теперь связан с нашей базой данных. Закроем теперь это окно и вернемся к нашей таблице. Попробуем вставить еще другой объект. На этот раз выберем не правую кнопку мыши и контекстное меню, а выберем пункт Вставка и далее объект. Ну, как мы видим, и в том и в другом случае мы попадаем в одно и то же окно, поскольку действие, которое мы выполняем одно и тоже. Выберем опять пункт Создать из файла. Щелкнем на кнопке Обзор, и на этот раз выберем не рисунок, а какой-либо другой документ. Например, документ Word. Щелкнем на нем дважды. Его путь появляется вот в этом окошке, наверху появляется так сказать краткое напоминание, о том, что это за документ. Щелкнем на кнопке ОК и как мы видим, этот документ тоже благополучно появился у нас в виде записи. Напишем здесь Word, ну и, чтобы активизировать этот объект, опять щелкнем на нем дважды и появляется вот этот документ Word, который мы можем просмотреть, можем отредактировать, и т.д. Пользоваться, как обычным документом. Например, удалим вот этот кусок текста и выделив, и щелкнем на кнопке Delete. Ну, а теперь, если мы попробуем закрыть это окно, то можно увидеть, что компьютер не задал никаких вопросов, что в принципе, достаточно удивительно, поэтому обычно. при любых изменениях в документах, компьютер, конечно же, автоматически все время спрашивает насчет сохранения всех наших изменений. Но, дело в том, что этот документ на самом деле не является уже отдельно стоящим документом. Он встроился в нашу базу данных. Для того чтобы убедиться, что все наши изменения не пропали, а сохранились, щелкнем еще раз на этой ячейке и, как только. появляется вот этот наш документ, можно увидеть, что все наши изменения сохранились. Ну и в принципе, то что этот документ встроился в нашу таблицу, можно еще увидеть из заголовка, который сопровождает эту таблицу. Можно увидеть надпись Документ в Таблице 1, таблица 1. Закроем теперь этот документ. Попробуем вставить этот же документ немножко по-другому. Для этого выберем правую кнопку мыши Добавить объект. Далее, Создать из файла, Обзор. Выберем этот же самый документ Поддержка устройства ввода рукописных данных. Щелкнем на нем дважды и на этот раз поставим флажок на пункте Связь. Если сейчас мы щелкнем на кнопке ОК, то, как мы видим, вот этот документ тоже вставился, как объект. Напишем опять Word и через пробел напишем - связь и вызовем этот документ. Для этого щелкнем на нем дважды. Вот появился этот документ, и попробуем провести тот же самый трюк. А именно, выделим этот фрагмент и щелкнем на клавише Delete. В результате чего этот фрагмент удалился. И теперь попробуем его закрыть. Щелкнем вот на этом крестике и на этот раз, как мы видим, нам компьютер уже просто так закрыть этот документ не дал. Появилась надпись - Не хотим ли мы сохранить изменения. Но, как мы видим, на этот раз документ ведет себя немного иначе. В принципе, это можно увидеть и из вот этого документа. Тут, как мы видим, находится абсолютно стандартная надпись, заглавие этого документа с подписью. Но, как мы видим, он на самом деле, сейчас является отдель-
76
TeachPro Microsoft Access 2003
но стоящим документом, который просто-напросто связан с соответствующей ссылкой с нашей ячейкой в таблице 1. Сохраним сейчас все наши изменения. Для этого нам сейчас нужно щелкнуть на кнопке Да, и мы вернулись в нашу таблицу. Как мы видим, между вот этими двумя записями, несмотря на то, что мы вставляли один и тот же документ, является существенная разница. Вот этот первый из этих документов, он является так сказать встроенным внутрь нашей базы данных, а следующая запись, хотя и появилась в результате вставки того же самого документа, она является отдельно стоящим документов со связью с нашей таблицей. Теперь выберем еще одну возможность вставки объекта. Для этого опять-таки выберем эту ячейку, щелкнем на правую кнопку мыши Добавить объект и на этот раз, выберем пункт Создать новый. Выберем, например, документ. Щелкнем на кнопке ОК. Ну, в результате появляется вот этот стандартный вид, всем нам знакомой по программы. Для примера, что-нибудь нарисуем на вот этом квадрате. Возьмем просто-напросто вот такой эллипс. Ну, например, возьмем два цвета, для того чтобы картинка была более красочной. Ну и вот такой кружок вполне достаточен для наших целей. Щелкнем сейчас на крестике. Закроем его. Ну и этот рисунок вставился, как объект на свое поле с надписью. Ну, как мы видим, этот рисунок тоже стал встроенным в нашу таблицу. Введем для него название. Например, так и напишем, что это, рисунок. И вызовем его, щелкнув на этом пункте дважды. Опять-таки при появлении этого документа и программы, как мы видим, появилась вот эта надпись, что этот точечный рисунок находится внутри нашей таблицы 1. Как мы видим, все наши изменения автоматически вызовут изменения соответствующего документа внутри нашей таблицы. Например, если мы вставим сюда какой-либо новый отрезок. Например, вот таким образом, перечеркнем наш круг. И щелкнем на Крестик, закрыв эту программу. Все наши изменения автоматически попали внутрь нашей базы данных. Никаких других побочных вопросов, нам, конечно же, компьютер не задал. Отметим еще одну возможность, как мы можем вставить объект в нашу таблицу. Для этого откроем соответствующую папку, внутри которой находится наш объект. Вот, например, появилась папка Мои документы, в которой у нас находятся несколько различного рода документов. Выберем, например, вот этот документ, пока таблицу мы в нашу базу данных не вставляли. Поэтому для разнообразия вставим его так сказать при помощи перетаскивания. Схватим эту книжку, потащим ее в сторону нашей базы данных, и подведем к нашей ячейке. Как мы видим, как только мы его приблизили к соответствующей ячейке, наш курсор превратился в соответствующую иконку, что подсказывает нам, что наша база данных готова принять этот объект. Отпустим теперь и, как можно увидеть. здесь появилась надпись, что подсказывает нам, что все произошло благополучно. Опять-таки сейчас попробуем перетащить ту же самую надпись в заголовок нашей таблицы, там, где у нас текстовое поле. Посмотрим, что у нас получится на этот раз. Опять-таки схватим, перетащим, подведем к нашему заголовку и, как мы видим, в это поле нам вставить ничего не удастся. Как мы видим, вставлять вот такие объекты, конечно же, можно только в поле, которое имеет характеристику, что это поле ОЛЕ. Отпустим мышку и введем какой-либо заголовок для нашей таблицы. Например, напишем Excel. Вставим теперь объект еще другим способом. Для этого вызовем опять папку Мои документы. Вот она появилась перед нами. Далее вставим на тот объект, который мы хотим вставить. Например, вставим в нашу таблицу опять-таки вот этот документ. Далее щелкнем на правую кнопку мыши. Выберем пункт Копировать. Перейдем в нашу таблицу. Далее вставим на наш объект. Правая кнопка мыши и выберем пункт Вставить. В результате, как мы видим, этот документ вставился в нашу ячейку, как объект.
Глава 2. Знакомство с таблицами, создание таблиц.
77
Далее, опять введем заголовок. Опять напишем, например, так. Ну и посмотрим, что у нас получилось. В принципе, в обоих случаях получилось одно и то же. Посмотрим, как выглядит этот объект. Щелкнем на нем дважды. И, как мы видим, опять-таки появился документ, с знакомый уже нам надписью, что этот лист встроен в нашу таблицу 1. И любые изменения, например, которые мы здесь можем провести, изменив как-либо эти данные, автоматически отобразятся в нашей базе данных. Как только мы закроем эту таблицу, никаких дополнительных вопросов по сохранению этого файла на жестком диске или где-либо, конечно же, не появляется. Это все изменения фиксируются внутри нашей таблицы 1, которая находится внутри базы данных Microsoft Excel. Как мы видим, в результате, в нашу базу данных мы можем вставить абсолютно разнородные по своей сути объекты. Как рисунки, так документы офиса, можно вставить HTML страницы, можем вставить звуковые файлы, avi файлы, в общем, практически все типы объектов, которые есть у нас на компьютере. и которые поддерживают такую вставку ОЛЕ.
2.3.9. Ключевой статус поля Познакомимся на этом уроке с ключевым статусом поля. Для того чтобы понять, что это такое, создадим новую таблицу. Как всегда зададим новую таблицу в режиме конструктора. Щелкнем дважды на этой строке. Вот, появилось вот такое стандартное окно, создание макета новой таблицы. Введем теперь какое-либо поле. Пусть это будет просто-напросто текст. Тип данных пусть будет текстовый. И, не вводя больше никаких полей, попробуем сохранить эту таблицу. Для этого достаточно щелкнуть, конечно же, на кнопке Сохранить на нашей панели инструментов. Появляется вот такое имя для нашей таблицы, которое подобрала нам программа. Ну, согласимся с этим именем. В принципе, нам сейчас это особо не важно. Это у нас тренировочная таблица. Щелкнем на кнопке ОК. И появляется вот эта стандартная надпись, с которой мы несколько раз сталкивались. А именно вопрос о ключевых полях. Ну, как мы видим, компьютер нам говорит, что хотя ключевые поля не обязательны, но они являются существенным подспорьем и необходимостью, если мы хотим установить связи с другими таблицами в нашей базе данных. Обычное щелканье на кнопке Нет, пренебрегая этой возможностью. А сейчас настало время познакомиться с этой возможностью подробнее. Сейчас щелкнем на кнопке Да, чтобы компьютер автоматически создал ключевое поле за нас. Щелкнем на Да. Ну и, как можно видеть, наше поле Текст сместилось вниз, а на первом месте появился вот такое поле, поле Код, у которого, как мы видим, тип данных Счетчик. И рядом с названием Код, можно увидеть вот такой ключ, который и говорит о том, что это поле является ключевым. Ну, сохраним теперь эту таблицу и вызовем ее в режиме Таблицы. Как мы видим, пока все достаточно стандартно, у нас два поля, поле Код и поле Текст. Поле Код является типом Счетчик. Здесь, конечно же, ничего мы вводить не будем. Счетчик на то и счетчик, чтобы компьютер автоматически подбирал здесь значения. Ну и введем какой-либо текст. В принципе, абсолютно все равно, что мы будем вводить в качестве текста. Как мы видим, каждый раз вводя какие-либо новые текстовые кусочки, нам компьютер добавляет вот это ключевое поле, код увеличивая каждый раз на единицу. Причем, как мы видим, текст в принципе может и повторяться. Вот, как сейчас. У нас три единицы повторялись несколько раз. Главное, что уникальным является вот этот код. Он никогда не повторяется. И именно по вот этому коду, который является ключевым, компьютер будет искать какую-либо запись в нашей таблице или же связывать данную запись с записью в другой таблице или в другой таблице данных.
78
TeachPro Microsoft Access 2003
Закроем эту таблицу и попробуем открыть другую таблицу, таблицу Сотрудники, которая у нас уже есть в нашей базе данных, и которая была создана ранее. Щелкнем дважды. И можно увидеть, что здесь представляет собой эта таблица. Здесь у нас некие данные о сотрудниках, которые включают в себя фамилию, имя, должность и т.д. разного рода данные по каждому из персонажей. Ну и первой строкой является код служащего, который является типом Счетчики, который является ключевым. Это можно определить, если мы перейдем в нашей таблице в режим конструктора. Так мы и сделаем, щелкнув на соответствующую кнопку и можно увидеть, что код служащего, среди которых является типом данных Счетчик, имеет статус ключевого поля, что как раз и означает, что именно по этому полю, которое является уникальным, и происходит отделение одной записи от другой. Этот статус, статус ключевого поля можно, как и присвоить, так и снять. Но, для этого достаточно встать на соответствующее поле и отключить статус ключевого поля, который можно сделать при помощи вот этой кнопки, кнопки ключевого поля на нашей панели инструментов. Или же, то же самое можно сделать, став на вот эту строку, щелкнув на правую кнопку и выбрать пункт Ключевое поле. Щелкнем, и в результате можно увидеть, что вот это поле Код служащего, перестал быть ключевым и стал обычным полем. В принципе это никак пока не повлияет на саму таблицу. Если мы сейчас ее сохраним и откроем, то можно увидеть, что пока никаких особых изменений в нашей таблице не произошло. Все те записи, которые здесь были, они сохранились в нашей таблице.Единственно, если приглядеться, можно увидеть, что в принципе сортировка в нашей таблице произошла несколько подругому. Если у нас раньше сортировалось по возрастанию вот этого кода служащего, сейчас записи нашей таблицы находятся в гораздо большем так сказать беспорядке. Перейдем опять в режим конструктора и попробуем опять присвоить этому полю статус ключевого. Для этого вполне достаточно опять щелкнуть на вот эту кнопку ключевого поля, или щелкнув на правую кнопку, выбрать тип ключевого поля. В том или в другом случае, мы в результате получаем одно и тоже, статус ключевого для этого поля. Переключимся в режим таблицы, предварительно сохранив эту структуру. Ну и, как мы видим, мы восстановили все наши исходные параметры нашей таблицы. Перейдем опять в режим конструктора и на этот раз абсолютно удалим это поле. Для этого, конечно же, достаточно простонапросто выбрать вот это поле, щелкнуть на правую кнопку мыши и щелкнуть на кнопку Удалить строчки. Конечно, появляется предупреждение о том, что в выделенных полях содержатся какие-то данные и хотим ли мы правда их удалить. Сейчас щелкнем на кнопке Да, нам эти данные сейчас не жалко. Это у нас таблица так сказать тренировочная. И как мы видим, компьютер опять предупреждает, что код служащего у нас является и ключевым полем. И подтвердить удаление требуется еще раз. Опять щелкнем на кнопке Да, ну и в результате мы лишились, как первого, так сказать, поля, так и ключевого статуса этого поля. Если мы сохраним это все дело и щелкнем на открытие нашей таблицы, то можно видеть, нашу таблицу, ну, пока абсолютно в стандартном виде. Правда, единственное изменение у нас теперь ключевого поля для этой таблицы совершенно нет. Перейдем опять в режим таблицы и попробуем задать ключевое поле. В принципе, для этого выберем какой-либо из параметров в нашей таблице, какое-либо из полей. Ну, выберем в качестве ключевого поля какое-либо из полей. Например, возьмем вот эту фамилию и щелкнем на вот этом ключе. Как мы видим, рядом с этим полем появился знак ключа, что в принципе, вроде бы, должно говорить о том, что ключевое поле мы вполне успешно задали. Но, если мы сейчас щелкнем на кнопке сохранения, то появляется вот такая надпись, что к сожалению не удалось завершить эту операцию, поскольку у нас есть повторяющие значения в индексе, в ключевых полях или связях. Т.е. по вот этому полю Фамилия, компьютеру не удалось так сказать отделить различные поля друг от друга. Там, просто-напросто есть повторяющиеся фамилии, которые есть в различных за-
Глава 2. Знакомство с таблицами, создание таблиц.
79
писях. Щелкнем на кнопке ОК. Ну, еще раз компьютер нам говорит о том, что были обнаружены ошибки. Снимем ключевой статус этого поля и посмотрим, в чем дело. Сохраним, откроем нашу таблицу и можно увидеть, что, конечно же, у нас есть повторяющиеся фамилии. Вот, например, вот эта фамилия Петров, повторяется два раза. Поэтому ключевым это поле быть не может. Перейдем опять в режим конструктора и задумаемся над тем, как же нам быть, если мы, тем не менее, хотим, чтобы это поле у нас было ключевым. Для этого достаточно выделить его опять и задать не только одно ключевое поле, но и совокупность нескольких полей, как ключевых. Добавим еще, например, имя в качестве ключевого поля. Надо сказать, что ключевым может быть не только по порядку, первые несколько полей, но любые поля в нашей таблице. Ну, выберем вот это поле Имя, и на этот раз ключевым стало именно это поле. Ну, конечно же, только одно имя опять даст нам ошибку, поскольку, наверняка, повторяющиеся имена у нас есть, но для того чтобы ключевым у нас было несколько полей, выделим их одновременно, нажав на кнопку Shift или на кнопку Ctrl. Вот мы выделили имя и фамилию, зададим ключ для обоих этих полей. Вот теперь, в принципе, вероятность того, что по имени и фамилии, по совокупности этих двух данных, у нас будут уникальные записи, уже гораздо выше. Посмотрим, так ли это. Щелкнем на кнопке Сохранить. И, как мы видим, на этот раз сохранение произошло абсолютно гладко, что как раз и означает, что все у нас в порядке. Перейдем в режим нашей таблицы и можно увидеть, что все произошло в принципе вполне нормально. А теперь попробуем ввести новую запись нового сотрудника. Встанем на последнюю строку этой таблицы. Попробуем ввести повторяющиеся поля и пустые, как компьютер будет реагировать на такого рода фокусы. Например, оставим пустыми имя и фамилию, и введем какие-либо данные в другие поля. Например, вот в поле Дополнительное, введем какие-либо числа, что означает, что в принципе запись у нас появилась, но если мы сейчас переключимся на другое поле, так сказать, попробовать зафиксировать эти изменения, как мы видим, появляется вот такая надпись, что индекс или ключ не может содержать пустое значение, значение 0, что в принципе вполне оправдано. Щелкнем на кнопке ОК и попробуем исполнить пожелание компьютера, и вставить какие-либо данные в соответствующее поле. Введем фамилию и имя, для нашего сотрудника. В принципе, попробуем опять-таки повторить это значение в поле Имя, введем опять Федор. Ну, конечно же, вводить то же самое имя, которое повторяет предыдущую запись проще всего, нажав на кнопку Ctrl и Апостроф. В этом случае автоматически повторяется последняя запись. Ну и если мы опять сейчас попробуем зафиксировать, перещелкнув, опять появляется то же самое значения. Щелкнув на ОК, понятно, что у нас просто-напросто осталось пустым Фамилия. Попробуем ввести фамилию тоже повторяющуюся. Нажмем на Ctrl и Апостроф. Теперь фамилия и имя повторяет предыдущую строчку Федор и Петров. Если мы перещелкнем, то на этот раз появилось предупреждение уже другого вида. Пустых записей в ключевых полях у нас уже нет, но, тем не менее, изменения не были успешно внесены, из-за повторяющихся значений в индексе. Понятно, Федор Петров у нас повторяется два раза. И поэтому компьютер эти два поля отличить уже друг от друга не сможет. Хотя, в принципе, другие поля и различны, но эти два поля, которые являются ключевыми и по которому компьютер, и определяет уникальность записи, должны хоть чем-то, но отличаться друг от друга. Поэтому щелкнем на ОК и вместо фамилии Петров, введем, например, фамилию Иванов. И если перещелкнем, то на этот раз у нас все произошло совершенно нормально. Но в принципе, хотя надо сказать, что и Федор у нас уже есть в нашей таблице, и Иванов тоже есть у нас в нашей таблице, но именно вот этого сочетания Федор и Иванов одновременно, у нас в нашей таблице больше нет. Это вполне уникальное сочетание. Поэтому как раз компьютер и воспринял все, как надо. Надо отметить еще одно обстоятельство. Если мы сейчас попробуем опять поменять Иванова на
80
TeachPro Microsoft Access 2003
Петрова, щелкнем на кнопке Ctrl и Апостроф, и введем, например, в конце, просто-напросто еще один пробел, то, если мы сейчас перещелкнем, то, как мы видим, появилась вот такая надпись, которая нам уже знакома, а именно, что изменения не внесены из-за повторяющихся значений. Щелкнем на ОК. Ну и, конечно же, можно увидеть, что вот этот пробел в конце, он простонапросто проигнорировался. Т.е. по дополнительному пробелу в конце, нельзя, так сказать, отличить две таблицы друг от друга. Но пробел в начале, вставить можно и он будет отличать два поля друг от друга. Вот сейчас, если у нас в первой записи, которая находится выше, Петров так сказать написано без пробела в начале, а внизу с пробелом, в качестве первого знака. Если мы сейчас перещелкнем. то компьютер на самом деле воспринял эти два изменения абсолютно спокойно. Хотя Федор и Петров, и Федор и Петров повторяются в этих двух записях, тем не менее, вот такое микроскопическое отличие между этими двумя записями есть. Вторая запись отличается от предыдущей записи, первым знаком, знаком пробела. Хотя на первый взгляд, если посмотреть на эти обе записи, они, конечно же. достаточно похожи. Но не с компьютерной точки зрения.
2.4. Индексирование таблиц Рассмотрим некоторые возможности, которые есть в программе по увеличению скорости обработки базы данных. Ну, одним из основных возможностей в этом плане, для увеличения производительности базы данных, для ускорения поиска различного рода записей, сортировки их по различным полям, существуют так называемые индексированные поля, при котором создается отдельный индекс для различных полей и это дополнительная информация по соответствующей сортировке, тоже сохраняется в основной базе данных, наряду с таблицей. Ну, посмотрим, как все это происходит. Для этого рассмотрим вот эту таблицу Сотрудники. Вызовем ее в режиме конструктора. Щелкнем на соответствующую кнопку. Вот, как мы видим, эта таблица появилась перед нами, и можем видеть все те поля, которые у нас в этой таблице существуют. А если мы посмотрим на структуру нашей таблицы. то можно увидеть, что первое поле, поле Код является у нас ключевым. Что, конечно же, отражается вот в этом ключе, который на нем находится. Ну и, можно увидеть в соответствующих свойствах этого поля, что это поле, конечно же, является индексированным, наряду с ключевым, и совпадение не допускается. Оно и понятно. Если поле является ключевым, то совпадений, конечно же, не может быть. Но, это так сказать является определением, т.е. любое ключевое поле или же несколько совокупностей полей, которые являются ключевым, по определению являются и индексированным. И сортировка по этим полям и по этому полю, автоматически сохраняется в нашем компьютере. Но, кроме этого индексированными могут быть и какие-либо другие поля или другие совокупности полей. Например, выберем поле Дополнительно, и попробуем по нему тоже провести индексацию. Ну, как мы видим, сейчас это поле не является индексированным. Попробуем ввести индекс для него. Для этого достаточно щелкнуть на вот этом ниспадающем списке и здесь у нас появляются три возможности. Это, конечно же, возможность Нет, при которой все остается, как и было без индекса. Или же, возможность Да, при котором допускаются совпадения в различных записях или же индекс создается, но совпадения не допускаются. Надо отметить то отличие, которое у простого индексированного поля имеется по сравнению с ключевым полем. Здесь совпадения могут быть. Т.е. два поля могут совпадать друг с другом и быть индексированным, и компьютер все это воспримет все вполне спокойно. В ключевых полях такое не может быть, в принципе.
Глава 2. Знакомство с таблицами, создание таблиц.
81
Например, выберем Совпадения не допускаются, и сохраним эту таблицу. Щелкнем на кнопке Сохранить. Но, как мы видим, компьютер так сказать не заругался на нас за то, что мы дали этому полю статус индексированного. Но, судя по всему, совпадения в этой таблице по этому полю нет. И попробуем открыть эту таблицу в обычном режиме. Щелкнем на вот этой кнопке. Посмотрим на пункт Дополнительно. Ну и можно, в принципе, визуально увидеть, что совпадения по вот этому полю, правда, не отмечается. Попробуем теперь ввести новое значение в этом поле. Например, возьмем какое-либо число. Например, вот такое 54. Если перещелкнуть, то в принципе, как мы видим, все в порядке. Это значение компьютер воспринял благополучно. Хотя другие поля у нас абсолютно пустые, кроме кода, который имеет тип Счетчик. Здесь автоматически появился следующий номер, увеличиваясь на единицу. Ну, а теперь, если мы попробуем в качестве дополнительного поля ввести какое-либо значение, которое повторяют одно из значений, которое здесь есть, например, введем значение 546, которое, как мы видим, у нас есть в нашей таблице. А если сейчас мы попробуем перещелкнуть, то появляется вот такая грозная надпись, что такая запись уже существует в нашем компьютере. И поле должно быть уникальным. Что мы и требовали в свойствах этого поля. Поэтому щелкнем на кнопке ОК и изменим эту запись. Достаточно изменить хотя бы на чуть-чуть. Вместо 546 введем 545, которая, в принципе, вроде бы, как у нас нет в нашей таблице. Если мы перещелкнем, то на этот раз компьютер, конечно же, все воспринял уже лучше. Перейдем теперь опять в режим конструктора и попробуем ввести индексацию и по фамилиям в нашей таблице. Для этого опять-таки можем посмотреть на нашу таблицу и увидеть, что как раз это поле является индексированным и совпадение допускается. А если мы сейчас выберем Совпадения не допускаются, и попробуем сохранить эту базу данных, то, как мы видим, компьютер не смог выполнить эту операцию, поскольку, конечно же, только одна фамилия не является достаточным для введения индексированного поля. Поскольку, вполне существуют две записи с одинаковыми фамилиями. Щелкнем на кнопке ОК. Повторяется предупреждение об ошибке. Опять ОК. И вернем обратно здесь статус по индексированному полю, но с допущением совпадений. И на этот раз, если мы щелкнем на кнопке сохранения, как мы видим, все произошло уже более гладко. Отменим теперь статус индексированного для этого поля. Щелкнем на вот этом ниспадающем списке и выберем пункт Нет. И теперь попробуем составить так называемый составной индекс, т.е. тот индекс, который будет базироваться не на одном поле, а на нескольких, одновременно. Для этого выберем вот эту совокупность Имя -Фамилия для нашего индекса. Для того чтобы теперь составить вот такой составной индекс, нам уже потребуется специальное дополнительное окно для этого действия. Это можно вызвать при помощи кнопки на панели инструментов в виде вот такой молнии. Если мы подойдем, то можем увидеть подпись Индексы. Щелкнем на вот этой кнопке. Появляется вот это окно, в котором перечислены все те индексы, которые на данный момент существуют в нашей таблице. Но, как мы видим, у нас в таблице существует 3 индекса. Первый связан с полем Отдела и здесь у нас порядок сортировки задан по возрастанию и это поле не является ключевым. Не является уникальным и не задан пропуск пустых полей. Следующий индекс, который у нас есть, это индекс, связанный с полем Код. Здесь, как мы видим, это поле является ключевым. Это, в принципе, можно увидеть и по этому ключу, который находится рядом с этим индексом. и к тому же, он является уникальным индексом. Но для ключевого поля это, в принципе, вполне резонно. Ну и пропуска пустых полей, как мы видим, нет. Ну и последнее поле, которое есть у нас здесь, это поле Дополнительное, которое тоже является индексированным. Ключевым оно не является, но уникальным, тем не менее, является. Мы, в принципе, так и задавали этот индекс. Совсем недавно, но и пропуска пустых полей нет. И все три
82
TeachPro Microsoft Access 2003
поля у нас сортируются по возрастанию. Хотя мы можем изменить этот порядок, щелкнув на вот этом выпадающем списке и вместо возрастанию, например, поставить по убыванию, изменяя этот порядок действия. Введем теперь еще один индекс, который будет на этот раз составным. Т.е. состоящий не из одного поля, как сейчас, а из нескольких. Первое, что нам необходимо сделать, это ввести имя для этого индекса. Пусть этот индекс у нас так сказать составляется на базе фамилии и имени, поэтому напишем таким образом. Фамилия, имя. Пусть это будет название для этого индекса. А теперь введем те поля, по которым и будет составляться наш индекс. Ну, первое поле, это у нас, конечно же, фамилия. И теперь нам необходимо ввести второе поле, по которому будет определяться этот индекс. Второй, конечно же, будет Имя. Вот совокупность этих двух полей и будет составлять у нас один общий индекс Фамилия- Имя. А теперь нам нужно определиться с уникальностью и другими параметрами этого индекса. Первое, хотим или нет, чтобы был пропуск пустых полей. Допустим, щелкнем на кнопке Да, чтобы компьютер не учитывал пустые поля, при сравнивании двух индексов. Ну и должны ли эти поля быть уникальными. Допустим, выберем опять-таки пункт Да и в этом случае, двух сотрудников с одинаковыми именами и фамилиями, мы принять на работу уже не сможем. Ну и в принципе, для того чтобы обойти это ограничение, можем их хотя бы распределить по разным отделам. Поэтому выберем еще третье поле и в качестве третьего поля, выберем, конечно же, поле Отдел. Ну, т.е. два человека с одинаковыми фамилиями и именами должны обязательно находиться в разных отделах. Т.е. вот эти три совокупности должны отличаться по какому-либо из параметров. Ну и рядом мы можем выбрать, должны ли все три параметра быть по возрастанию или же они могут сортироваться в каком-либо ином порядке. Ну, пусть они все сортируются по возрастанию соответствующих параметров. Закроем это окно. И сохраним вот эту нашу таблицу. Для этого щелкнем на кнопке Сохранить. Ну, как мы видим, сохранение в принципе произошло вполне нормально. Т.е. двух записей, которые не удовлетворяли бы нашим критериям, не существует. Откроем теперь эту таблицу в обычном режиме и посмотрим на нее более внимательно. Попробуем ввести какие-либо совпадения в наши таблицы. Как мы видим, у нас есть два сотрудника с более или менее подходящими параметрами, это Иванов Иван и Петров Иван. Введем для обоих из них одну и ту же фамилия. Вторую из них. Нажмем на кнопки Ctrl и Апостроф, для того чтобы повторить предыдущие значения. В принципе, можем вполне спокойно перещелкнуть. Т.е. совпадений и фамилии и имени, только у нас не вызывает никаких проблем. Поскольку эти два сотрудника так сказать отличаются по своему отделу. Иванов Иван, который у нас находится с 9 кодом, является директором и не принадлежит ни к какому отделу. Здесь у нас пусто. А вот предыдущий Иванов, работает в отделе продаж. Т.е. по этим параметрам компьютер смог отличить эти записи друг от друга. А если мы введем одинаковые, это тоже поле Отдел. Щелкнуть на кнопке Ctrl и апостроф, то, как мы видим, сейчас у нас все три поля, которые у нас объединены. Индекс сейчас одинаковый. Если мы попробуем переключиться, то, конечно же, возникает вот это страшное окно, в котором нас предупреждают, что изменения не внесены из-за повторений в наших полях. Понятно, что это означает. Щелкнем на кнопке ОК, и нам, что это надо изменить у этих двух сотрудников. Сменить имя или фамилию, это, конечно, гораздо более трудоемкая операция, поэтому нам придется их распределить по разным отделам. Но, вместо отдела продаж, поместим нашего второго Иванова в директорат. Что еще раз подчеркнет его значимость в иерархии нашей фирмы. Как мы видим, сейчас мы вполне спокойно смогли перещелкнуть и зафиксировать все наши изменения в таблице.
Глава 2. Знакомство с таблицами, создание таблиц.
83
Скажем еще несколько общих вопросов, по поводу индексирования таблиц. Надо отметить, что каждое индексирование, оно вводить дополнительную информацию в нашу базу данных, которая сохраняется вместе с основным файлом. А именно, сохраняется информация именно по сортировке по этому индексу. Ну, конечно же, несложно догадаться, что это имеет и свои положительные и свои отрицательные стороны. Ну, положительным является то, что поиск и сортировка по этому индексу, конечно, будет происходить гораздо быстрее, а отрицательным является то, что при каждом изменении нашей базы данных, введение или изменение соответствующих записей, компьютер каждый раз будет вынужден проводить сортировку по каждому из ключевых и обычных индексов. И запоминать все это так сказать по отдельности. Ну и это все, конечно же, вызывает замедление работы нашей программы. Поэтому просто так, без особой нужны, вводить индексированные поля не является целесообразным. Это надо делать только в тех случаях, если это именно необходимо. Т.е. это именно те поля, по которым мы достаточно часто проводим сортировку и поиск соответствующей информации. Иначе, вместо увеличения скорости и увеличения производительности нашей базы данных, мы, наоборот, получим замедление работы. Отметим еще одно обстоятельство, связанное с индексированием полей. Оно в принципе и понятно, что индексированное поле является уже избыточной информацией по отношению к основной базе данных. Но и так же, как и любая избыточная информация, теоретически, возможно возникновение проблемы с целостностью нашей базы данных и таблицы, при которой информация записанная в индексированных полях будет противоречить информации в основной таблице. Особенно это опасно в базе данных, в которых информация о таких индексированных полях хранится в отдельных файлах. Ну, в информации, об индексированных полях хранится вместе с основной базой данных в одном и том же файле. Но, тем не менее, такого рода коллизии, теоретически возможны.
2.5. Установка ограничений для полей Рассмотрим, какие ограничения можно ввести для ввода данных в наши таблицы и какие у программы существуют возможности для этого. Для этого создадим новую таблицу, чтобы мы могли рассмотреть подробнее эти вопросы. Создадим ее, конечно же, в режиме конструктора. Щелкнем дважды на вот этой строке. Вот появилось это стандартное окошко, в которое введем наименование, и определение наших полей. Введем первое поле. Пусть это будет поле Имя. Тип данных, пусть будет текстовой, так, как нам подсказывает нам наш компьютер. Введем следующее поле, поле Возраст. Ну и, конечно же, возраст должен быть числовым типом. Щелкнем на соответствующем виде поля, и пока у нас в наших данных нет никаких ограничений, для ввода значений. Если мы сейчас закроем эту таблицу в режиме конструктора, ну, конечно же, требуется его сохранить. Щелкнем на кнопке Да, и согласимся с этим именем. Ключевое поле, конечно же, задавать сейчас не будем. Мы сейчас занимаемся другими вопросами. Нет. Вот эта таблица 1, вызовем ее в обычном режиме. Для этого щелкнем на ней дважды. В качестве имени мы можем ввести любую абру-дакабру, совершенно не представляемого нам вида. В качестве возраста можем тоже вводить любые числа. Вот сейчас мы перещелкнули, например, возраст мой компьютер воспринял нормально. Можем ввести даже отрицательное число, вот -45 единиц. Как мы видим, компьютер тоже совершенно спокойно воспринял. В возраст можем ввести и очень большое число. Например, вот такое. Тоже, как мы видим, компьютер без возражения. Что в принципе, конечно, противоречит здравому смыслу. Поэтому удалим вот эту запись. Щелкнем на правую кнопку мыши и выберем пункт Удалить запись. Да. И вернемся в нашу таблицу в режиме конструктора. Для этого щелкнем на вот эту кнопку переключения режимов. Теперь попробуем ввести какие-либо ограничения на ввод информации в поля нашей таблицы. Ну, первое ограничение, которое приходит в голову, для нашей таблицы, это, конечно же, ограничение по возрасту. У обычного нормального человека, во-первых, возраст не может быть отрицательным и, во-вторых, должен быть каким-то более или менее разумным. А
84
TeachPro Microsoft Access 2003
если у нас разговор идет о сотрудниках, допустим, нашей фирмы, то для возраста существуют более жесткие ограничения. В частности, конечно же, возраст не может быть меньше, например, 18 лет. Поэтому напишем вот таким образом. В качестве условия на значения напишем больше, чем 18, больше или равно, введем значение по умолчанию, пусть, например, будет нижняя граница этого промежутка пригодности, 18 лет, ну и еще одно поле, которое, в принципе, не является обязательным, но, тем не менее, имеет смысл заполнить. Это сообщение об ошибке. Т.е. то сообщение, которое должно появляться, если наше введенное число не будет удовлетворять условиям на значение. Введем, например, таким образом. Возраст должен быть не меньше 18 лет. А теперь посмотрим, как все это будет выглядеть у нас в таблице. Для этого сохраним эту таблицу. Щелкнем на кнопке Сохранить. Перейдем в режим таблиц. И попробуем ввести возраст и имя для наших персонажей. Как мы видим, в первой же записи, которая у нас появляется в нашей таблице, она еще пустая, но, тем не менее, уже возраст составляет 18 лет. А это и число по умолчанию. Ну, введем имя для нашего сотрудника. Пусть это будет имя Иван. И в качестве возраста напишем для начала какое-либо, более или менее нормальное значение, которое компьютер должен воспринять. Например, введем 25 лет. Если мы переключим ячейку, то, как мы видим, компьютер совершенно спокойно воспринял эту информацию. Возраст 25 лет ему вполне понравился. А если попробуем ввести другое значение, которое не удовлетворяет условиям, например, введем 5 лет и попробуем перещелкнуть, то, конечно же, появляется надпись об ошибке. Причем надпись об ошибке появляется именно та, которую мы ввели. Возраст должность должен быть не менее 18 лет. Щелкнем на кнопку ОК и попробуем ввести другое значение. Совсем неправильное значение, допустим, -55 единиц. Конечно же, вызывает то же самое сообщение об ошибке. Щелкнем на ОК, и мы вынуждены вставить нормальное значение, например, введем 33 года. Как мы видим, это значение уже совершенно спокойно воспринято компьютером. Сохраним эту таблицу. Перейдем в режим конструктора. Щелкнем на вот этой кнопке переключения режимов, и мы опять попали в нашу таблицу в режиме конструктора. Попробуем теперь ввести ограничения и на первое поле, поле имя. Представим себе, что мы хотим принять на работу только тех сотрудников, у которых имя начинается с буквы "И", и никаких других имен. В принципе, конечно, достаточно странное пожелание, но тем не менее. Введем значение по умолчанию. Пусть это будет, например, имя Иван. Далее введем условие на значение. Напишем таким образом. Кавычки, внутри которых напишем букву "И", далее знак Звезда. Это означает, что мы готовы воспринять в качестве имени любое имя, которое начинается с буквы "И" и далее может быть любое количество иных символов. Посмотрим теперь, как это будет выглядеть, когда мы перещелкнем. Как мы видим, компьютер выдал вот такое преобразование. Наша информация, которая была помещена в кавычки, переместилась чуть правее, а здесь появилось слово like- это по-английски "Похоже". Понятно, что компьютер имел в виду. Наше слово похоже на вот эту аббревиатуру, которую мы ввели. И самое главное, первая буква должна быть буквой "И". Конечно же, нам нужно ввести сообщение об ошибке. Например, напишем просто-напросто - Введите правильное имя. Не будем уточнять, какое имя при этом правильное. А теперь перейдем в нашу таблицу, в режиме заполнения. Щелкнем сначала, конечно же, на кнопке Сохранить. Как мы видим, компьютер выдал нам достаточно грозное предупреждение, о том, что изменены условия на целостность данных и существующие данные могут не подходить к новым условиям. В принципе, логичное предупреждение, поскольку те имена в наших записях, которые мы уже ввели в нашу таблицу, у нас таблица уже не пустая, могут не подходить у тому условию, которое мы только что ввели. А именно, первая буква "И" там, в принципе может и не быть.
Глава 2. Знакомство с таблицами, создание таблиц.
85
Компьютер предлагает проверить данные на соответствие новым условиям. Щелкнем сейчас на кнопке Да, чтобы компьютер как раз это действие и произвел. Как мы видим, компьютер воспринял все вполне благополучно. Откроем его в обычном режиме ввода данных и, конечно же, все воспринялось благополучно, потому что первое и единственное слово, которое здесь у нас есть, это слово Иван. В принципе как раз то, что нужно. Введем второе значение. Например, введем имя Игорь. Возраст Игоря пусть будет 44 года и если мы перещелкнем, то как мы видим, и Иван и Игорь, в принципе, вполне нормально для нашего компьютера. Ну, а если мы введем имя Петр, и попробуем это зафиксировать, компьютер это имя не воспринимает, как правильное. Появляется вот эта надпись - Введите правильное имя. В принципе, все вполне логично. Петр начинается не с буквы "И", а с буквы "П". щелкнем на кнопке ОК. Исправим это имя. Напишем, например, имя Иосиф. Ну, пусть у него будет 18 лет. как компьютер предлагает нам по умолчанию, и как мы видим, мы вполне спокойно смогли зафиксировать это изменение. Вот эти три имени компьютер совершенно нормально воспринял. Конечно же, те же самые ограничения существуют при редактировании. Например, если вместо Игоря попробуем ввести какие-либо другие буквосочетания, то компьютер опять-таки требует от нас принять правильное имя. Попробуем ввести имя с маленькой буквы "и". Например, опять напишем Игорь с маленькой буквой "и". Если мы перещелкнем, то, как мы видим, маленькая и большая буква "И" в принципе в этих условиях принимается. Перейдем теперь опять в режим конструктора. Вот мы опять сюда перешли, щелкнув на соответствующую кнопку. Попробуем теперь поэкспериментировать с возрастом. Для этого перейдем на вот это поле и в качестве условия назначения, вместо больше или равно 18, изменим, это условие и введем ограничение не только больше 18, но и, допустим, меньше 60 лет. Т.е. введем ограничение не только нижнего возраста, но и верхнего. Для построения более сложных выражений, нам, в принципе, поможет вот эта кнопка, при помощи которой запускается окно для помощи нам в построении вот таких более сложных конструкции. Щелкнем на вот эту кнопку, появляется вот такое окно, в котором мы можем ввести различного рода условия и связать их друг с другом при помощи вот таких операторов, которые находятся в средней части этого окна. Кроме этого мы можем воспользоваться различного рода функциями, константами и операторами, которые есть у нас в программе. Например, в качестве констант выступают такие стандартные константы, как пустая строка, значение 0, истина или же ложь. В качестве оператора мы можем воспользоваться оперантами арифметическими, сравнение, логические, плюс, минус и т.д. Ну, а сейчас нам нужно более простое условие для нашего поля. В принципе больше или равно 18, у нас уже есть. К нему мы хотим еще добавить второе условие. Причем добавить мы можем при помощи этой связки. Т.е. чтобы условия выполнялись одновременно. Поэтому напишем таким образом, пробел, далее End, и далее напишем меньше или равно 60. В принципе, нам достаточно этих условий. Щелкнем теперь на кнопке ОК. И, как мы видим, эта строка у нас зафиксировалась в качестве условия. А теперь перейдем в нашу таблицу. Конечно же, прежде, чем это сделать, сохраним. Щелкнем на кнопке сохранения. Появляется та же самая подсказка, предупреждение о том, что у нас не все данные, которые уже есть, могут удовлетворять нашим новым условиям. Щелкнем на кнопке Да, чтобы компьютер проверил это. Как мы видим, все у нас в порядке с нашей таблицей. Перейдем в режим таблиц, щелкнув на вот эту кнопку, и попробуем ввести новые данные в нашу таблицу. Вместо 44, попробуем здесь ввести большее значение. Если мы здесь напишем вот такое значение большое, конечно же, компьютер выдаст нам вот такую предупредительную надпись. Правда, в надписи ничего не сказано о верхней границе, мы его просто-напросто не ввели.
86
TeachPro Microsoft Access 2003
Поэтому щелкнем на кнопке ОК, нажмем на Esc, чтобы возвратить старое значение и перейдем опять в режим конструктора. Конечно же, имеет смысл ввести в сообщение об ошибке то ограничение, которое мы ввели. Напишем таким образом. "И" не больше 60 лет. Щелкнув на кнопке Сохранить, далее режим ввода информации и попробуем ввести опять какое-либо большое значение. Допустим, чуть больше верхней границы. Допустим, 61. Как мы видим, компьютер даже 61 не воспринял, этот возраст уже критичный для нашей таблицы. Щелкнем на кнопке ОК. И введем 60. А вот 60, как мы видим, мы смогли ввести и зафиксировать. Перейдем опять в режим конструктора. Введем теперь в нашу таблицу еще одно поле, поле Дата. Конечно же, по наименованию понятно, какой у него должен быть тип данных. Конечно же, он должен быть дата-время. Попробуем ввести для него значение по умолчанию и разного рода ограничения. Значение по умолчанию пусть, например, будет сегодняшняя дата, поэтому щелкнем на вот этой кнопке. Появляется вот такой построитель выражения, в котором в пункте Функции, если раскроем его, можно увидеть встроенные функции. Здесь найдем Дата-время и в функциях, которые связаны с датой времени, выберем функцию сейчас. Щелкнем дважды. Вот он появляется у нас в этой строке. Щелкнем на ОК. И текущая дата будет у нас заполняться именно, используя сегодняшнее число, число, когда вводится соответствующая запись. Причем, еще и формат поля. Пусть нас не интересует время, в которое мы вводим нашу запись, а интересует только именно дата. Поэтому введем вот такой длинный формат даты. Щелкнем. А теперь перейдем в нашу таблицу, посмотрим, как все это будет выглядеть. Прежде щелкнем на кнопке Сохранить. Далее откроем нашу таблицу. Немного расширим поле Дата, чтобы мы могли видеть целиком все, что здесь написано и, как мы видим, по умолчанию нам компьютер на новую запись пытается заполнить вот такими значениями. Имя - Иван, возраст - 18, ну и в качестве даты берется сегодняшняя дата 21 февраля. Можем согласиться или не согласиться с этими значениями. Например, вместо 18 лет, введем другое значение, 23 года. Ну и, как мы видим, компьютер все воспринял совершенно нормально, зафиксировав вот эту дату, дату сегодняшнего дня. Вернемся теперь в нашу таблицу в режиме конструктора. Щелкнем на вот этой кнопке перехода к таблице в режиме конструктора и введем теперь ограничения на дату. А именно, попробуем сделать так, чтобы можно было ввести дату не больше, чем текущая. Как это сделать? Для этого выберем пункт Условия на значение. Щелкнем на вот этой кнопке Построители выражений. Конечно же, в принципе, любое выражение мы можем вписать без всякого построителя выражения, если мы достаточно свободно владеем соответствующей техникой написания вот эти всех сравнений. Но, в ином случае, в принципе, конечно же, можно воспользоваться этим построителем. Щелкнем на вот этой кнопке. И выберем такое ограничение - Наша введенная дата должна быть меньше или равно, так и напишем, меньше или равно, и далее сегодняшняя дата. Для того чтобы его выбрать, опять раскроем вот эти функции. Выберем встроенные функции Дата и Время, и, конечно же, нам опять нужна вот эта текущая дата. Щелкнем здесь дважды. Щелкнем на кнопке ОК. Ну и следующее, что нам необходимо сделать, это, конечно же, выбрать сообщение об ошибке. Напишем таким образом. Дата не должна быть больше сегодняшней. Ну и сохраним все эти изменения. Щелкнем на кнопке Сохранить. Ну, конечно же, опять появляется вот эта надпись, что эти изменения влекут за собой проверку всей нашей базы данных, так сказать, на целостность, удовлетворяет или нет этим условиям. Щелкнем на кнопке Да. Ну и, как мы видим, какие-то из тех данных, которые у нас есть в нашей базе данных, конфликтует с этими условиями. Ну и компьютер спрашивает, что теперь нам делать. Продолжать ли проверку сохранения, тогда кнопка Да.
Глава 2. Знакомство с таблицами, создание таблиц.
87
Для восстановления старого Нет, ну и для прекращения, кнопку Отмена. Щелкнем сейчас на кнопке Да. И перейдем в нашу таблицу в режиме ввода данных. Щелкнем на соответствующую кнопку. Попробуем теперь ввести какую-либо дату в какое-либо поле. Например, введем таким образом, введем так сказать будущую дату, 22 точка, например, 03, 2005 года. Если мы сейчас перещелкнем, то, конечно же, появляется вот такая надпись, что дата не может быть больше, чем сегодняшняя дата. Щелкнем на ОК и исправим эту дату. Введем, например, прошлый год 2004. Если мы сейчас перещелкнем, то, как мы видим, эта запись компьютером воспринята благосклонно. Конечно же, ввод текущей даты компьютером будет восприниматься вполне адекватно. Например, если введем в качестве новой строки того же самого Ивана, только возраста, например, 45 лет и перещелкнем, то увидим, 21 февраля компьютер воспринимает вполне нормально. А если мы введем в качестве даты уже 22 число, и перещелкнем, то дата не должна быть больше сегодняшней. ОК. Исправим это. Например, введем 20, и на этот раз, уже, конечно же, гораздо лучше. Как мы видим, мы в наших полях можем вводить очень много самых разнообразных ограничений на ввод. А также задавать значения по умолчанию.
2.6. Маски ввода На этом уроке поговорим о масках ввода. Это один из способов облегчения заполнения таблиц, при котором нам сразу же подсказывают в нашей ячейке, какие данные и какой структурой мы можем в нее ввести. Создадим для этого новую таблицу, создадим, конечно же, в режиме конструктора. Щелкнем дважды на вот этой строке. Появляется вот такое стандартное окно, в которое введем несколько полей. Ну, первое поле, пусть будет просто-напросто код, который у нас будет иметь тип счетчика, для того чтобы компьютер автоматически перенумеровал наши записи. И далее введем для следующего поля имя Индекс. Пусть тип поля останется текстовой, т.к. предлагает нам программа по умолчанию. Ну и попробуем ввести какое-либо значение в маске ввода. Вот в этой третей строке свойств нашего поля. Как мы видим, как только мы попали на это поле, в правой его части появилась вот такая кнопка, которая подсказывает нам о том, что мы можем на нее щелкнуть, вызвать соответствующее окно, которое поможет нам сконструировать эту маску. Сейчас этой кнопкой мы пользоваться не будем, а для того чтобы сконструировать маску ввода самостоятельно, нажмем, например, на кнопку F1, для того чтобы получить подсказку по этому пункту, контекстную подсказку. Сразу появляется вот такая подсказка, в которой в принципе можно найти необходимую нам информацию. Сдвинемся чуть пониже, и можно увидеть, какие символы мы можем использовать в нашей маске ввода, и что они означают. Например, представим себе, что мы в качестве значений в нашей маске ввода можем использовать только буквы, причем все буквы должны автоматически преобразовываться к верхнему регистру. Т.е. можем использовать только большие буквы. В принципе, для того чтобы при редактировании маски ввода у нас не исчезала справка, щелкнем на вот этой кнопке Авто мозаика, для того, чтобы у нас оба поля помещались одновременно. Далее щелкнем на маске ввода и воспользуемся перво-наперво знаком больше, при помощи которого мы и можем преобразовывать к верхнему регистру. Что можно увидеть вот в этой части помощи. Ну и далее, мы хотим вводить любые буквы. Как мы видим, любая буква характеризуется вот такой большой буквой L. Так и напишем. Введем несколько таких букв. Все зависит о того, сколько букв мы хотим ввести в это поле. Как мы видим, мы ввели 5 букв. В принципе, можно оставить таким образом, правда, надо учесть, что вот это значение, 5 букв, в принципе, конфликтует со значением Размер поля. Конфликт в чем заключается. Дело в том, что мы в нашу ячейку ввели
88
TeachPro Microsoft Access 2003
маску, состоящую из 5 букв, и все остальные поля будут просто-напросто зря занимать место на нашем жестком диске. Т.е. компьютер резервировать будет все равно 50 единиц, 50 символов, а использовать мы будем только первые 5 из них. Ну, конечно же, это абсолютно пустая и нерациональная трата нашего дискового пространства. Поэтому мы введем здесь ограничение на размер поля 5 единиц. А теперь посмотрим, как все это будет выглядеть. Сохраним теперь нашу таблицу. Щелкнем на кнопке Сохранить. И после успешного выполнения этой операции щелкнем на кнопке Вид. Как мы видим, появилась наша таблица. Она пока абсолютно пуста. И если мы щелкнем на поле, которое находится в столбце Индекс, то можно увидеть, вот такой, несколько другой вид нашей ячейки. Как мы видим, вот здесь е6сть вот такой знак подчеркивания, который определяет те места, в которых мы можем ввести различного рода буквы. Причем, если мы сейчас будем вводить, то, несмотря на то, что мы вводим маленькие буквы или большие, с нашей клавиатуры, вводятся все равно большие буквы. Они преобразуются автоматически к верхнему индексу, причем после 5 символа, чтобы мы не вводили с нашей клавиатуры, компьютер это не воспринимает, остановившись на первых 5 значениях. Можем, тем не менее, удалить и ввести заново какие-либо значения. Причем компьютер не воспринимает не только маленькие буквы, преобразовывая их сразу к большим, но абсолютно не воспринимает цифры, которые он не вводит в наше поле. Вот таким образом мы можем ввести наш индекс. А теперь же перещелкнем, как мы видим, компьютер зафиксировал эти изменения. А теперь вернемся в режим конструктора, но прежде удалим все наши записи, щелкнем на правую кнопку мыши после выделения этих записей, щелкнем на кнопке Удалить запись. Согласимся с этой операцией, перейдем в режим конструктора и изменим маску ввода. Конечно же, в качестве маски ввода для нашего индекса будет более разумным. использовать цифровые символы. Для этого, конечно же, вместо буквы L нам нужно воспользоваться другими символами. А именно символом 0. Вот что можно увидеть в помощи. Конечно же, 0 как раз то, что нам нужно для этого поля. Все то, что было мы уберем, и введем 5 знаков 0. что будет означать 5 цифр, которые мы можем ввести в эти поля. Введем теперь новое поле. Пусть это будет поле Имя. Ну, конечно же, тип у него будет текстовый, и попробуем ввести для него маску ввода. На первый взгляд, конечно же, для имени какая маска может быть. Тут в принципе, может быть любая аббревиатура, но на самом деле любое имя должно начинаться с большой буквы, а далее все остальные буквы должны быть маленькими. Это вполне естественное требование. Попробуем так и сделать. Для этого встанем на ячейку Маска ввода, далее напишем знак больше, т.е. преобразование всех знаков к верхнему разряду. Далее должна быть у нас любая буква. В качестве любой буквы у нас будет, конечно же, большая буква L. Далее все остальные буквы нам надо преобразовать к нижнему регистру, поэтому напишем знак меньше. И далее несколько букв, которые могут быть использованы для нашего имени. Вот мы ввели 10 букв L, что означает, что в нашем имени может быть не больше 10 букв. Поэтому размер поля зададим тоже в 10 единиц. В принципе. вполне достаточно нам для экспериментов. Сохраним теперь макет нашей таблицы. Щелкнем на кнопке Сохранения и откроем ее в режиме заполнения. Вот появилась наша таблица. А теперь введем какой-либо индекс. Как мы видим, сразу же появился знак подчеркивания, в который мы можем вводить соответствующие символы. На этот раз символы букв не вводятся, несмотря на то, что я сейчас на них нажимаю. А вот, как только я начал нажимать на цифры, компьютер вполне нормально это воспринял и ввел их в соответствующую ячейку. Пятую цифру, например, мы вводить не будем. Перейдем в другое поле и
Глава 2. Знакомство с таблицами, создание таблиц.
89
при этом, как мы видим, сразу же выскакивает надпись, что наша маска ввода требует ввода всех значений. Поэтому щелкнем на ОК и введем последнее недостающее значение 1. И на этот раз все воспринялось совершенно спокойно. Теперь введем имя. Ну, например, вводить будем все с нижнего регистра, совершенно не заботясь о том, что первая буква в имени должна быть большой. Введем, например, Иван. Как мы видим, первая буква сразу же ввелась так сказать большой, т.к. в принципе и должно быть, несмотря на то, что я все буквы вводил с нижнего регистра. Если мы сейчас попробуем зафиксировать это имя, перещелкнув на нашу таблицу. Как мы видим, появляется вот такая грозная надпись, что мы опять-таки не удовлетворили наши маски ввода. Дело в том, что наша маска при помощи букв L, требует ввода всех букв в соответствующие ячейки. Т.е. со всех 10 букв, а в слове Иван, конечно же, 4 букв, что меньше, чем 10. Поэтому щелкнем на кнопке ОК. Отменим вот эту запись. Щелкнем на кнопке Esc. Перейдем в режим конструктора. И вместо букв L, которая требует обязательное заполнение вот этих полей, введем знаки вопроса, что будет означать, что эти символы являются буквами, но не обязательно, все из них должны быть заполнены. В принципе, нас это больше устраивает в данном конкретном случае. Заменим и вот эту первую букву L, тоже на знак вопроса и сохраним эту структуру. Щелкнем на кнопке Сохранить. Теперь щелкнем на кнопке вызова нашей таблицы и попробуем ввести опять наше имя Иван. А теперь, если мы перещелкнем, как мы видим, наш компьютер уже совершенно спокойно воспринял вот эту запись, сохранив ее в нашей таблице. Перейдем опять в режим конструктора. Попробуем ввести другое поле, поле Дата. Далее тип, конечно же, у него должен быть Датавремя и перейдем в маске ввода, щелкнем на вот этой кнопке помощи в создании маски ввода. На этот раз воспользуемся ею. Появляется вот такое окно, в котором можно выбрать один из типов ввода нашей даты. Выберем, например, вот этот длинный формат времени. Если мы щелкнем на поле Пробы. то можно увидеть, как это поле будет выглядеть в нашей ячейке. А теперь щелкнем на кнопке Далее. Можем видеть, как будет выглядеть эта маска в структуре и можем видеть. как будет выглядеть наш заполнитель. Сейчас, как мы видим, заполнитель представляет собой вот этот знак подчеркивания. И если мы щелкнем на пробе, то можно увидеть, как будет выглядеть наша ячейке. В качестве заполнителя можем выбрать и какой-либо другой знак. Например, можем выбрать, например, вот этот восклицательный знак, тогда вот таким образом будет выглядеть наша проба. Конечно же, знак подчеркивания более привычен для таких целей. Поэтому так и оставим. Щелкнем на кнопке Далее, и далее Готово. А теперь, сохраним эту структуру. Щелкнем на вот этой кнопке. Далее перейдем в нашу таблицу и попробуем ввести дату. Вот, если мы щелкнули, на этой ячейке появляется вот этот знакомый вид нашей ячейки. Попробуем ввести здесь какую-либо дату. Например, вот таким образом. 11. 11.04. Как мы видим, компьютер все вполне нормально воспринял. А попытка ввода здесь каких-либо букв, конечно же, пресекается. Мы можем вводить только лишь цифры, при этом получая соответствующую дату. Например. таким образом. Перейдем теперь в режим конструктора в нашей таблице. Для этого щелкнем на вот этой кнопке Вид, которая находится на нашей панели инструментов. Вот открылась наша таблица. Далее введем новое поле. Например, введем такое поле, как Телефон, Тел. Пусть он представляет собой текстовый тип данных. Ну и далее введем здесь маску ввода. И в качестве маски ввода, конечно же, телефон должен представлять собой некое сочетание из цифр. Ну, представим себе, что наш телефон может представлять собой 6 или 7-значный номер. Поэтому первую цифру введем вот такой знак, 9, что будет означать, что необязательный знак. Далее введем нули, два 0, далее знак минус, которым обычно разделяют части телефонного номера. За-
90
TeachPro Microsoft Access 2003
тем опять два 0, две цифры. Далее знак минус, опять разделитель, и опять два 0. Вот в таком виде представим себе нашу маску ввода. Сохраним теперь эту структуру. Щелкнем на кнопке Сохранить. Далее откроем нашу таблицу в режиме ввода и попробуем ввести соответствующие номера телефонов для наших персонажей. Пусть первый телефон представляет собой 1,2,3, далее 4,5,6,7. Как мы видим, компьютер вполне нормально это воспринял. Конечно же, при вводе номера телефона никакие буквы не разрешается, несмотря на то, что мы их даже пытаемся ввести. Введем на этот раз номер телефона короче, состоящий из 6 цифр, вот таким образом, 1,2,3,4 и 5,6, далее перещелкнем и можно увидеть, что вот такой номер телефона тоже компьютер вполне адекватно воспринял. А вот если мы попробуем записать меньшее количество цифр в нашем телефоне. например, заполним только вот таким образом и попробуем перещелкнуть, то, конечно же, компьютер подсказывает, что эта аббревиатура не соответствует нашей маске ввода. Здесь не хватает нескольких значений. Попробуем их тоже ввести, заполнив все 7 знаков. Например, вот такой номер телефона. Как мы видим, на этот раз все прошло достаточно гладко. Ну, т.е. таким образом мы можем в наших ячейках использовать совершенно различного рода маски ввода для облегчения заполнения наших таблиц.
2.7. Подстановка в поля Разберемся, как можно вводить данные в нашу базу данных, при которых нам требуется в какую-либо ячейку вводить данные из ограниченного набора и именно для этих целей существует таблица подстановок. Т.е. это такой ниспадающий список, который должен появляться в соответствующей ячейке и в котором мы можем выбрать одну из уже заранее определенных значений. Ну, создадим для этого новую таблицу, так сказать для экспериментов. Для этого. как всегда. выберем создание таблицы в режиме конструктора. Щелкнем дважды. Появляется вот это стандартное окно, в которое введем нужные нам поля. Первое поле пусть у нас будет поле Код, которое будет иметь тип счетчика, для того чтобы компьютер автоматически нумеровал все наши записи. Далее введем следующее поле, которое пусть у нас будет поле Фамилия. И пусть эту фамилию мы хотим выбрать из списка служащих, которые у нас есть в нашей другой таблице. Как это сделать? Перво-наперво, конечно же, надо выбрать тип для нашего поля. Пусть будет текстовый. И в этом случае нам каждый раз при вводе соответствующей ячейке придется целиком набирать вручную соответствующую фамилию. Это, конечно же, достаточно утомительно и сразу же возникает вопрос, как нам облегчить этот процесс. Для этого можем использовать другой тип данных. Щелкнем на вот этом выпадающем списке и выберем пункт Мастер подстановок. Появляется вот такое стандартное окно мастера подстановок, которое поможет нам создать подстановки для нашей ячейки. И здесь у нас на первом шагу требуется выбрать один из двух возможных вариантов. А именно, при котором объект подстановки будет использовать значения из другой таблицы или запроса, или же будет введен фиксированный набор значений. Пока выберем первый из пунктов. Щелкнем на кнопке Далее. И компьютер выдает нам все таблицы, которые у нас есть в нашей базе данных. Ну, у нас в принципе, всего одна таблица, таблица Сотрудники и далее ниже мы можем выбрать значений из таблицы, из запросов и таблицы запросов. Правда, запросов у нас на самом деле нет, поэтому выберем первый пункт таблицы и, конечно же, эту единственную таблицу. Далее перейдя на следующее окно, мы можем видеть, какие поля есть в нашей таблице, таблице сотрудников. Ну и, какие поля мы хотим использовать для нашей подстановки. Ну, конечно же, достаточно разумно использовать поле фамилию. Далее мы можем щелкнуть дважды на этом
Глава 2. Знакомство с таблицами, создание таблиц.
91
пункте или щелкнуть на вот этой кнопке. При этом соответствующее поле перескочит в отдел Выбранные поля. Можем выбрать какие-либо другие поля. Например, Имя, вот тоже перебросили. Ну и, конечно же, в случае, если мы какие-либо поля не хотим видеть в списке выбранных полей, можем щелкнуть на вот этой кнопке возвращения обратно какого-либо выбранного поля и зафиксировать все наши изменения в окончательном так сказать варианте. Щелкнем теперь на кнопке Далее, после того, как мы закончили выбор полей. Далее компьютер спрашивает у нас - Хотим ли мы сортировать все наши записи по возрастанию или же по убыванию, или же мы хотим оставить без сортировки. Например, отсортируем наши записи. Сортировать мы можем по коду или же по фамилии. Сделаем по фамилиям сортировку. Пусть будет по возрастанию значения. Если же нас это не устраивает, можем щелкнуть на эту кнопку. Как мы видим, оно изменяется на по убыванию. или же обратно, по возрастанию. Каждое щелканье меняет соответствующий тип выбора. Ну, остальные поля оставим без изменения. Щелкнем на кнопе Далее, Сортировка по одному полю Фамилия нас вполне устраивает, поскольку у нас всего лишь одно поле. Хотя, конечно же, если у 2 записей фамилии совпадают, то, конечно же, в этом случае мы могли бы сортировать еще и по другому параметру. В нашем случае по коду. Сейчас это делать не будем. Оставим, как есть. Щелкнем на кнопке Далее и появляется вот такой вид нашей таблицы подстановок, в котором мы можем видеть. как будет выглядеть этот наш список Фамилии. И здесь можем поставить или снять галочку с пункта Скрыть ключевой столбец. Это в принципе рекомендуемое значение этого параметра. А если мы не скроем, то тогда мы можем видеть целиком и код и фамилия. Ну, как мы видим, у нас 2 ячейки для фамилии не заполнены в нашей таблице, поэтому здесь есть два пустых места. Скроем ключевой столбец, т.к. рекомендуется. Щелкнем на кнопке Далее. Далее нас просят задать подпись, которую будет содержать столбец подстановки. В качестве нее выбрана по умолчанию фамилия, т.е. имя нашего поля. Ну и. наконец, щелкнем на кнопке Готово. Появляется вот такое окно, которое нас предупреждает, что необходимо сохранить таблицу. Щелкнем на кнопке Да, имя таблицы, Таблица 1 пусть будет так, как есть. Не будем трогать. ОК. Ключевые поля у нас требуют задать. Щелкнем на кнопке Да. Пусть ключевым полем будет первый код счетчик. Ну, в принципе, так компьютер и распределился. И теперь посмотрим, как все это будет выглядеть. Закроем эту таблицу. Щелкнем на вот этом крестике. И откроем ее в режиме заполнения. Щелкнем на нем дважды. Ну вот, как мы видим, в качестве фамилии у нас ничего не задано, а если мы щелкнем на вот этом ниспадающем списке, то можно увидеть, какие здесь есть возможности по заполнению этого списка. Вот, например, возьмем фамилию Иванов, затем следующий пункт фамилию Петров. Надо сказать, что эти два пустых значения. Конечно же, достаточно сильно раздражает, поэтому после того, как мы ввели вот эти два значения, перейдем в нашу базу данных. И откроем таблицу сотрудники и вот эти два последних записей, которые являются явно ненормальными, выделим. Далее правая кнопка мыши и удалить запись. Согласимся с удаленьями. Сохраним все наши изменения. Закроем эту таблицу. И перейдем опять в нашу таблицу, которую мы сейчас заполняем. Если мы сейчас попробуем опять заполнить, то, как мы видим, у нас список уже более гладкий и можем совершенно спокойно заполнять нашу таблицу, не заботясь о том, что нам необходимо вводить какие-либо значения вручную. Хотя вот если мы вводим какие-либо буквы, сразу же появляется соответствующая фамилия. облегчая ввод при помощи клавиатуры. Вот, например, введем букву П, сразу же появляется Петров, введем букву Г, появляется Гильберт. Т.е. мы можем даже вводить, не требуя для ввода мышь. Достаточно вводить первую букву. Эта фамилия сразу же появляется в соответствующей ячейке. Закроем теперь эту таблицу.
92
TeachPro Microsoft Access 2003
Откроем ее в режиме конструктора. Щелкнем на соответствующей кнопке и введем еще одно поле, которое назовем Образование. Для него тоже выберем мастер подстановок в качестве поля. И на этот раз, вместо использования таблицы или запроса, выберем пункт Будет введен фиксированный набор значений. Щелкнем теперь на кнопке Далее. И компьютер нам автоматически показывает следующее окошко, в котором мы можем ввести все значения, которые мы хотим использовать в нашей таблице подстановки. Например, в качестве первого значения выберем начальное образование. Далее следующее образование, которое может быть у человека, это среднее. Далее пусть будет неоконченное высшее. И последний тип образования, это, конечно же, высшее. Вот таким образом мы сформировали этот выпадающий список. Щелкнем теперь на кнопке Далее. Вот опять компьютер нам предлагает задать подпись для нашего столбца подстановки. Пусть будет Образование, как и есть. Щелкнем на кнопке Готово. И обратим внимание на структуру нашей таблицы. Как можно видеть, наше поле фамилия имеет тип данных числовой, а образование имеет тип данных текстовый. А если мы перещелкнем на вкладку подстановки, то можно увидеть, как будет выглядеть подставка в нашей ячейке. Как мы видим, здесь у нас несколько значений, которые перечислены в пункте Источник строк. Вот наше значение начальное, среднее, неоконченное высшее и далее все наши остальные значения. Тип источника Список значений, поле со списком, тип элементов управления, ну и все остальные поля тоже заполняются соответствующим образом. В принципе, эти все поля мы могли заполнять, так сказать, вручную, самим, не пользуясь мастером создания подстановок. Ну, в принципе, это достаточно трудоемкое дело. А если мы перейдем к нашему полю фамилия, то можно увидеть, как выглядит подстановка в этом случае. Здесь у нас в качестве источника строк написана вот такая строка, которая выбирает соответствующие поля из нашей другой таблицы, таблицы Сотрудники. Источник строк, как мы видим, у нас является таблица, и тип управления поля со списком. Посмотрим теперь, как все это будет выглядеть в режиме заполнения. Щелкнем сначала, конечно же, на кнопке Сохранить. Также перейдем в режим Вид и попробуем заполнить для наших сотрудников соответствующее образование. Как мы видим, как только мы подошли к соответствующей ячейке и щелкнули, появились вот эти возможности. Допустим, Иванов имеет среднее образование, Петров - начальное, ну и т.д. Процесс заполнения, конечно, стал гораздо более легким. Если бы нам потребовалось каждый раз вводить вот это значение Высшее, начальное, среднее, конечно же, это было бы гораздо сложнее. Вот, таким образом, мы очень быстро заполнили вот эту колонку, колонку образования.
Глава 3. Подробнее о таблицах (общая часть).
93
Глава 3. Подробнее о таблицах Импорт и присоединение таблиц (общая часть) 3.1. Импорт, присоединение и экспорт таблиц Access Обычно, когда задается база данных, она заполняется так сказать вручную, строчка за строчкой. Вставляя по очереди новые записи в каждую из таблиц, которая находится внутри этой базы данных. Но различного рода таблицы, структуры и записи в базы данных, можно вставлять и иным способом. А именно, если у нас есть уже готовые блоки в каких-либо других базах данных, то мы можем использовать процедуру импорта. Или же процедуру связывания. Посмотрим, как это все происходит. Создадим, для примера новую пустую базу данных. Для этого щелкнем на панели задач, которая находится в правой части нашего окна на пункте создания новой базы данных. Появляется вот это стандартное окно по созданию файла. Здесь же появляется имя для нашего файла. Как мы видим, компьютер дал нам имя по умолчанию. В принципе мы могли бы его изменить. Сейчас оставим, как есть. Щелкнем на кнопке Создать. Вот появилась новая база данных. Как мы видим, здесь у нас пока нет ни одной таблицы. В принципе, здесь нет ни запросов, ни форм, ни отчетов и т.д. Это пока абсолютно пустая заготовка. А теперь же попробуем внести в него какие-либо данные. Конечно, можно было бы создать таблицу в режиме конструктора или с помощью мастера или созданием таблицы при помощи ввода данных. Но сейчас мы поступим по-другому. А именно, воспользуемся процедурой импорта. Для этого щелкнем на пункте меню Файл. Далее здесь у нас есть пункт Внешние данные и в нем есть два подпункта. Это Импорт и Связь с таблицами. Рассмотрим пока первую из этих возможностей. А именно, импорт из других таблиц. Щелкнем. Появляется вот такое стандартное окно, в котором нам предлагается выбрать файл для импорта, из которого мы будем черпать наши данные. Если мы раскроем список тип файлов, то можно увидеть, какого типа файл мы можем использовать для импорта данных в нашу базу данных. Как мы видим, мы, конечно же, можем воспользоваться файлами Microsoft Office Access, но кроме этого можем воспользоваться базами данных dBASE, мы можем воспользоваться листами Excel, базами данных парадоксов ODBC и т.д. Как мы видим, здесь довольно большой выбор различных форматов. Мы сейчас остановимся на файле Microsoft Office Access и выберем, например, вот эту базу данных first, которая у нас была создана ранее. После того, как мы ее выбрали, щелкнем на ней дважды, или щелкнем на кнопке Импорт. В любом случае появляется вот такое окно импорта объектов, где нам предлагают выбрать, что же мы хотим импортировать из этой базы данных. Ну, мы можем импортировать таблицы, запросы, формы, отчеты, страницы и т.д. Сейчас остановимся на таблицах. Выберем первую из этих таблиц, таблицу Сотрудники. И попробуем ее импортировать. Рассмотрим прежде вот эти кнопки, которые расположены в правой части этого окна. В принципе, предназначение этих кнопок довольно понятно из надписей, которые на них находятся. ОК, это запуск процедуры импортирования. Отмена, это отмена и выход из этого режима. Выделить все, это выделить все таблицы в данном окне. Очистить - это снять выделение. И последняя кнопка Параметры, которая является самой существенной возможностью в этом окне. Если мы на ней щелкнем, то появляется вот эта дополнительная часть в этом окне. В ней мы можем выбрать дополнительные параметры, влияющие на тип импортирования данных. Мы можем импортировать, например, и структуру и данные, или же только структуру вот
94
TeachPro Microsoft Access 2003
этой таблицы. В этом случае, данные не импортируются, и создается только совершенно пустая таблица. У нее, конечно же, будет такая же структура, как и у исходной таблицы, которую мы взяли для образца. А также мы можем импортировать запросы, как запросы или же, как таблицы. Сейчас нас больше интересует вот этот средний отдел, в котором мы оставим без изменения, т.е. копируем, как структуру, так и данные из нашей таблицы Сотрудники. Щелкнем теперь, наконец, на кнопке ОК, и можно увидеть, что в нашей пустой базе данных, в которой не было ни одной таблицы, появилась новая таблица, таблица Сотрудники. Если мы щелкнем на ней дважды, то появляется уже знакомая нам таблица, с которой мы работали ранее. Она, как мы видим, абсолютно уже заполненная. Здесь у нее есть совершенно готовая структура и все записи, которые мы вводили ранее. Надо теперь отметить одно обстоятельство. А именно то, что вот эта таблица, таблица Сотрудники является таблицей, которая находится внутри вот этой базы данных. И она уже не имеет никакого отношения к той таблице и к той базе данных, откуда мы ее импортировали. Т.е. любое изменение в этой базе данных не повлечет за собой изменение в старой. Ну и, наоборот, изменение в старой базе данных, не повлечет за собой никакого влияния на вот эту базу данных, в базе данных db1. Закроем эту таблицу и попробуем ее удалить. Для этого достаточно щелкнуть на клавишу Delete. Конечно же, от нас требуют подтвердить это действие. Щелкнем на кнопке Да, и эта таблица у нас исчезла с нашей базы данных. Но опять-таки она исчезла только из вот этой базы данных db1, а в базе данных first, откуда мы ее импортировали, она осталась, конечно же, без изменений. Выберем теперь опять пункт меню Файл, далее Внешние данные, и на этот раз выберем пункт Связь с таблицами. Щелкнем. Появляется вот такое окно. Оно, конечно же, повторяет те действия, которые мы проводили при импорте таблиц. Единственное отличие, что здесь у нас в заголовке написано слово, Связь, что указывает на том, что мы импортируем файлы уже несколько по-другому сценарию. Выберем, опять вот эту базу данных first. Щелкнем на кнопке Связь, и появляется вот такое окно, в котором, в отличие от того окна, которое у нас было при импорте, нет других вкладок. Есть только одна вкладка Таблицы. Ну и выберем опять какую-либо из таблиц. Выберем таблицу Сотрудники. Щелкнем на кнопке ОК. И вот перед нами появилась опять-таки наша база данных, в которой есть одна таблица, таблица Сотрудники. Правда, можно увидеть на вот этой пиктограмме, которая находится рядом с названием этой таблицы, вот такую стрелку, которая говорит о том, что эта таблица является не просто таблицей внутри нашей вот этой базы данных, а является так сказать ссылкой на таблицу в другой базе данных. Щелкнем на этой таблице дважды. Вот она у нас открылась здесь. Как мы видим, здесь у нас все данные и вся структура этой таблицы абсолютно идентичны той, которую мы только что видели ранее. Правда, здесь есть уже существенное отличие. А именно, все изменения, которые мы будем проводить здесь, автоматически скажутся на базе данных исходной. Поскольку на самом деле это просто-напросто вообще одно и то же место на нашем жестком диске, одна таблица, а не две разные. Попробуем что-либо сделать. Например, удалим вот эти три строки. Выделим для этого. Щелкнем на клавише Delete. Появилась, конечно же, предупреждающая надпись для подтверждения этого действия. Щелкнем на кнопке Да. И запомним, что у нас теперь записи с 3 по 7, присутствуют так сказать с пропусками. Между ними все записи мы только что удалили. Закроем эту таблицу и попробуем открыть исходную таблицу. Таблицу first. Для этого щелкнем на кнопке Открыть на нашей панели инструментов. Появляется стандартное окно открытия файла, и в нем откроем вот эту базу данных first. Щелкнем на ней дважды. Вот,
Глава 3. Подробнее о таблицах (общая часть).
95
появилась наша база данных. Откроем в ней таблицу Сотрудники. И можно увидеть, что точно так же, как в нашей базе данных, которую мы только что видели, конечно же, все записи с 3 по 7, у нас исчезли, т.е. эти две таблицы, они абсолютно идентичны и более того, это вообще одна и та же таблица. А если мы сейчас какое-либо действие предпримем в этой таблице, например, во второй таблице вместо фамилии Гильберт напишем какую-либо другую фамилию, например, Иванов. Напишем просто-напросто Иванов. Закроем теперь эту таблицу. И откроем опять нашу таблицу, с которой мы только что работали, вот эту таблицу DB1. Щелкнем на ней дважды. Вот появилась эта база данных. Появилась в ней таблицы Сотрудники. Щелкнем на ней дважды и откроем. Как мы видим, у нас во второй строчке появилась фамилия Иванов, которая заменила то, что было ранее, т.е. все то, что мы производили в базе данных DB1, автоматически отобразилось в этой базе данных DB1. Закроем теперь это окно. И мы вернулись опять в нашу базу DB1, в стандартный ее вид. Отметим, что те же самые операции, операции импорта и связи, мы можем сделать, щелкнув на правую кнопку мыши и выбрав из контекстного меню пункты, Импорт или Связь с таблицами, для вставки объектов в нашу базу данных. Выберем опять пункт Импорт на этот раз из этого контекстного меню. Опять выберем базу данных first и щелкнем на кнопке Импорт. Ну, и на этот раз возьмем не таблицу Сотрудники, а таблицу под именем Таблица 1. Выберем теперь пункт Параметры, и импортировать на этот раз будем не структуру и данные, а только структуру из этой таблицы, так сказать без данных. Попробуем, как у нас сейчас получится это действие. Щелкнем сейчас на кнопке ОК. Как мы видим, вот эта таблица у нас появилась в нашей базе данных. Если мы на ней щелкнем дважды, то появляется вот эта таблица, в которой, как мы видим, есть вся та структуру, которая была в исходной таблице, но не одной записи нет. Т.е. импортировалась только структура вот этой таблицы. Попробуем ввести сюда какие-либо данные. Введем какую-либо фамилию. Например, вот такую фамилию. Далее Образование, и заполним, таким образом, несколько полей для нашей таблицы. Допустим, пусть в этой таблице будет вот такие две записи. Закроем эту таблицу. И определимся с еще одной операцией. А именно, конечно же, если мы можем импортировать таблицы, то, наверняка, мы можем проделать и обратную операцию. А именно, операцию экспорта. Попробуем экспортировать вот эту таблицу, таблицу 1. Это мы опять-таки можем сделать двумя путями. Или щелкнуть на правую кнопку мыши и в контекстном меню выбрать пункт Экспорт, который находится вот в этом месте, или же, выделив вот эту таблицу, щелкнем на пункте файл, и далее пункт Экспорт. И в том и в другом случае появляется вот такое окно. В нем мы можем видеть название, что это экспорт объекта таблица вот этой таблицы 1. И далее нам нужно выбрать именно ту таблицу, в которую мы хотим экспортировать наш объект. Выберем опять, например, вот эту таблицу first, так сказать, будем возвращать обратно соответствующую таблицу. Далее щелкнем на кнопке Экспорт. И здесь появляется вот такое окно, в котором нам требуется выбрать, во-первых, имя нашей таблицы, а во-вторых, что мы будем экспортировать. И структуру, и данные, или же только структуру. Конечно же, различие между этими двумя возможностями в принципе понятно. Мы уже с этим сталкивались. Если мы не хотим экспортировать, совершенно пустую таблицу, то, конечно же, надо оставить переключатель на экспортирование и структуры, и данных. В принципе так сейчас и оставим, только имя нам нужно выбрать какое-либо другое. Не таблицу 1, а заменить это чем - то другим, поскольку таблица 1, конечно же, в базе данных first уже существует.
96
TeachPro Microsoft Access 2003
Поэтому, например, выберем таблица 2. Щелкнем теперь на кнопке ОК. Ну и наша таблица вполне успешно экспортировалась в соответствующую базу данных. Посмотрим, так ли это на самом деле. Для этого откроем ту базу данных, щелкнем на кнопке Открыть. Далее база данных first. Щелкнем на ней дважды. Вот появилась наша база данных и в ней, как мы видим, наряду с таблицей 1, появилась и новая запись, таблица 2. Откроем сейчас и таблицу 1 и таблицу 2. И можно увидеть, какое отличие между этими двумя таблицами. Как мы видим, вот эта таблица 2 повторяет таблицу из базы данных, в которой мы только что работали. И она кардинально отличается от своей исходной таблицы, таблицы 1 по своим записям. А вот структуры у них, конечно же, одинаковые. Т.е. мы, таким образом, вот эту таблицу успешно экспортировали из одной базы данных в другую.
3.2. Импорт списков Excel Ограничения в форматах списка Рассмотрим, какие возможности есть у Microsoft Fccess по импортированию различного рода данных из офисной программы Excel. Для этого рассмотрим вот эту нашу базу данных first и попробуем в нее импортировать из какой-либо таблицы Excel соответствующие данные. Ну, выберем для этого пункт меню Файл, далее Внешние данные и далее выберем пункт Импорт. Теперь, после того, как у нас открылась вот это окошко по импорту новых данных, выберем пункт Импорт из Microsoft Excel. Щелкнем на выборе этого типа файлов. Вот, появились все те файлы, которые у нас есть в папке Мои документы и которые являются файлами Excel, и выберем файл покупатели. Щелкнем на нем. Далее выберем пункт Импорт, в результате чего открывается вот такой мастер по импорту, который поможет нам вставить данные из нашей экселевской таблицы в нашу базу данных. И на первом из этих листов, как мы видим, есть несколько пунктов, первый из которых, что мы хотим импортировать, целиком листы или именованные диапазоны. Пока ограничимся копированием в нашу базу данных какого-либо из листа целиком, и тогда нам нужно выбрать один из тех листов, которые у нас есть в нашей таблице Excel. Как мы видим, там два листа. Лист - Поставщики и лист Покупатели. А в нижней части вот этого окошка можно увидеть образцы данных для листа Поставщики. Ну, а если мы переключимся на Покупатели, то можно увидеть, как выглядит этот лист. Выберем, для начала, например, поставщиков и после этого перейдем к следующему пункту. Щелкнем на кнопке Далее. Далее у нас появляется вот такое окошко, в котором единственное, что от нас требуется, это выбрать вид первой строчки. Т.е. то, что первая строчка содержит заголовки столбцов, или же первая строчка является тоже данными в нашей таблице и не является заголовком. В принципе, в нашей таблице Excel, если приглядеться, то реализован именно тот случай, когда в первой строчке у нас находится заголовки. Поэтому поставим здесь галочку, и в этом случае наша таблица приобретает вот такой вид. Конечно же, если мы галочку не поставим, тогда названия нам придется вводить, так сказать вручную попозже. Сейчас поставим галочку и щелкнем на кнопке Далее. Затем нам предлагают выбрать, хотим ли мы наши данные сохранить в новой таблице, так как у нас сейчас есть по умолчанию, или в какой-либо существующей таблице, которую мы можем выбрать из этого ниспадающего списка. Тогда, конечно же, станет серьезный вопрос о совместимости данных. В этом случае, если мы выберем существующую таблицу, то в ней вот эти поля должны совпадать с соответствующими полями в импортируемом листе Microsoft Excel, иначе возникнут довольно серьезные конфликты.
Глава 3. Подробнее о таблицах (общая часть).
97
Чтобы этого избежать, сейчас выберем пункт сохранения в новой таблице. Щелкнем на кнопке Далее и затем нам предлагают разобраться, какие поля мы хотим импортировать из нашей таблицы Excel, поскольку мы можем выбрать не все поля, а лишь какие-то определенные из них. А также можем сразу же определиться с тем, как будет вести себя каждое из этих полей. Являются ли они индексированными. И если являются, то, какие здесь есть возможности. Допускаются ли совпадения, или совпадения не допускаются. Как мы видим, по умолчанию у нас эти поля считаются индексированными, но допускаются совпадения. Кроме этого мы можем изменить имя нашего поля, которое по умолчанию совпадает с тем названием, которое помещается в нашем конкретном случае в первой строчке нашего листа Microsoft Excel. Ну и, конечно же, здесь находится вот это поле, в котором, если мы поставим галочку, то эта колонка целиком будет проигнорирована. Точно также мы можем выяснить судьбу, так сказать, остальных полей. Для этого достаточно переключиться вот, например, на название поставщика, на следующее поле и т.д. Но, сейчас согласимся со всеми установками по умолчанию. Щелкнем на кнопке Далее, и затем, нам предлагают выбрать ключ для новой таблицы. Ну, как мы видим, по умолчанию нам предлагают выбрать автоматическое создание ключа, при котором он создается в отдельной колонке. Но можем выбрать и пункт Не создавать ключ, в этом случае мы будет избавлены от этой возможности. В принципе, если тем не менее, ключ нам нужен, то мы можем выбрать Определить ключ, и выбрать то поле, которое у нас будет ключевым. Конечно же, в нашем конкретном случае самым разумным ключом, считается код поставщика. То же самое можно сделать и при помощи вот этого ниспадающего списка. Но, после того, как мы определились с ключом, щелкнем на кнопке Далее и затем мы должны выбрать имя нашей таблицы. По умолчанию, оно, конечно же, совпадает с именем листа в microsoft Excel. А именно, в нашем конкретном случае Поставщики. Изменять этого не будем. И далее мы можем проанализировать таблицу после импорта данных, а также вывести справку. Сейчас оставим эти два пункта так сказать без галочки, и щелкнем на кнопке Готово. Появляется вот такое окошко, в котором нам сообщают, что наше действие произошло успешно и импорт завершен. Щелкнем на кнопке ОК. И вот наша таблица Поставщики появилась в нашей базе данных. Если мы на ней щелкнем дважды, то можно увидеть вот эту таблицу уже внутри Microsoft Excel. Но, как мы видим, все вполне нормально импортировалось, включая названия и включая все данные. Если мы переключимся в режим структуры, то можно увидеть, что первый из этих пунктов является ключевым. Тип данных числовой, остальные текстовые. Т.е. все в принципе, как раз вполне подходит для тех целей, которые мы выбирали, для этой таблицы Excel. Скажем еще несколько слов о самой структуры таблицы Exell, которая пригодна для импортирования в нашу базу данных. Для этого откроем эту таблицу Exell, с которой мы только что импортировали данные. Вот она появилась перед нами и можно видеть, что у него, конечно же, два листа Поставщики и Покупатели, так, как мы видели при импортировании, но и можно увидеть, какова структура этой таблицы. Как мы видим, она, скажем так, достаточно гладкая по сравнению с базами данных. Как раз подходит по структуре. Т.е. все колонки и все данные, так сказать, находятся один под другим, и представляют собой вот такую прямоугольную таблицу данных. А если бы у нас данные в таблице Exell были бы разбросаны достаточно хаотичным образом, и не сгруппированы вместе вот таким прямоугольным образом, то в этом случае, конечно же, импортирование в базу данных было бы более проблематично. Надо отметить еще одно обстоятельство, а именно, как будет себя вести формула при импорте таблиц. Для этого перейдем в таблицу Покупатели, которую мы будем копировать следующим. И попробуем ввести какую-либо колонку с формулой. Например, введем новую колонку. Для этого щелк-
98
TeachPro Microsoft Access 2003
нем на вот этой колонке, колонке Адрес. Далее правая кнопка мыши и выберем пункт Добавить ячейки. Вот у нас появилась пустая колонка. Добавим здесь какое-либо название. Например, напишем Номер. Далее, зададим в первой ячейке просто-напросто число 1, и далее введем такую формулу. Равняется предыдущее значение и плюс 1. Щелкнем на кнопку Enter и распространим это значение на несколько последующих полей. И, как мы видим, в результате распространения этой формы, которая состоит в том, что к предыдущему значению прибавляется 1, мы получаем абсолютно стандартный ряд, 1.2.3.4.5 и т.д. Ну, а теперь попробуем импортировать эту таблицу в нашу базу данных. Для этого сохраним эту таблицу. Щелкнем на кнопку сохранения. Закроем ее. Вот перед нами появилась наша база данных, в которой щелкнем на этот раз на правую кнопку мыши и выберем пункт Импорт. Далее, как мы видим, у нас автоматически уже стоит тип файлов Exell, поскольку мы выбирали импорт именно такого типа файлов в последний раз, и выберем опять таблицу Покупатели. Щелкнем далее на кнопку Импорт. Вот появилось наше стандартное окно, и в нем мы выберем на этот раз не поставщики, а покупатели. Далее щелкнем на кнопку Далее. Конечно же, первая строка у нас содержит заголовки. Все так и есть. Щелкнем на кнопке Далее. Откроем, конечно же, в новой таблице. Опять щелкнем на кнопке Далее. Ну и оставим на этот раз название всех полей, как и было. Не будем менять описание полей и выбирать каждое из полей, импортировать или нет. Щелкнем на кнопке Далее. Ключ определим сами, как первую колонку, код покупателя. Щелкнем Далее. Ну, таблица пусть будет Покупатели, как и есть, и щелкнем на кнопке Готово. Как мы видим, компьютер все нам успешно импортировал. ОК. Вот эта таблица тоже появилась в нашей базе данных. Щелкнем на ней дважды, и можно увидеть, что у нас получилось. Как мы видим, наша таблица успешно импортировалась. И, кроме того, вот в этих местах, где у нас в этих ячейках раньше находилась формула, появилось, конечно же, их значение. От формулы не осталось ничего. Они заменились своими значениями. В принципе, что можно было и ожидать. Поскольку эта программа формулами не оперирует. Он оперирует только данными. Закроем теперь эту таблицу. Рассмотрим еще одну возможность, которая у нас есть по импорту данных Exell. А именно импорт именованных данных. Для этого откроем какуюлибо таблицу Exell. Вот перед нами открылась таблица, с которой мы только что работали. И здесь выделим какой-либо диапазон ячеек и зададим имя какое-либо имя. Например, выберем вот эти данные, которые попали сейчас вот этот прямоугольник, выделенный нами, и зададим ему какое-либо имя. Для этого достаточно встать на вот эту ячейку и задать ему имя, например, напишем таким образом. Щелкнем на кнопке Enter и после этого, вот этот кусок листа Exell приобретает вот такое имя. Можем выделить и какой-либо другой интервал и зададим ему какое-либо другое имя. Например, в принципе, этот кусок может находиться в любом месте таблицы. Например, вот таким образом, по серединке нашего листа. Выберем диапазон. Зададим ему имя. Щелкнем на кнопку Enter. И теперь у нас уже в Exell есть два имени для двух кусочков его данных. А теперь сохраним этот файл, щелкнем на кнопке сохранения, закроем его, щелкнем на вот этот крестик. Теперь щелкнем на правую кнопку мыши и выберем пункт Импорт. Выберем опять покупатели файл Exell. Щелкнем на кнопке Импорт и опять появился вот этот Мастер по импорту электронной таблицы. И на этот раз выберем пункт Именованные диапазоны. И здесь, как мы видим, наряду с вот этими двумя листами покупатели и поставщики, появились еще вот эти два диапазона. Как они выглядят можно увидеть приблизительно вот в этой нижней части этого окна. Если мы выберем Part 1, у нас в принципе уже будут готовы имена для заголовков, а если мы выберем Part 2, то в этом случае заголовки нам придется вставлять попозже вручную.
Глава 3. Подробнее о таблицах (общая часть).
99
Ну, выберем Part1, вот этот именованный диапазон. Щелкнем на кнопку Далее. Первая строка, конечно же, содержит столбцы, опять Далее. Согласимся с сохранением в новой таблице. Описание полей менять не будем. Щелкнем на кнопку Далее. В этом окне определимся ключом. Пусть он создается автоматически. Т.к. сейчас есть и щелкнем на кнопку Далее. Теперь, при импорте в таблицу, нам предлагают выбрать для него имя диапазона. а именно Part1. В принципе можно согласится с этим, не меняя это название и щелкнем на кнопке Готово. Ну, в принципе все успешно завершено. ОК. И вот эта таблица у нас тоже появилась. Если мы на ней щелкнем дважды, то можно увидеть вот эту таблицу, которая является частью соответствующего листа в Exell, представляющий собой именованный диапазон.
3.3. Присоединение списков Excel Экспорт в формат Excel Рассмотрим теперь, какие возможности есть .по внедрению и установке связи с таблицами Exell. Для этого, как всегда мы можем воспользоваться контекстным меню или же пунктом меню Файл. Воспользуемся контекстным меню. Щелкнем на правую кнопку мыши и выберем пункт Связь с таблицами. Щелкнем. Появляется вот это стандартное окно выбора связи. Ну и, конечно же, нам нужны на этот раз поэтому выберем эти типы файлов. Можем увидеть все листы, которые у нас есть в папке Мои документы. Выберем, Мои покупатели, и щелкнем на кнопку Связь. Вот появилось вот такое окно, которое является мастером по установке связи с электронной таблицей и в принципе, аналогично тому, что происходило при импорте таблицы из Exell.Опять-таки мы можем выбрать лист или же выбрать именованные диапазоны, которые у нас есть в этой таблице. Выберем, например, лист, выберем лист покупатели. Далее щелкнем на кнопке Далее. Здесь опять мы можем определиться, содержит ли первая строка заголовки или же не содержит. В нашем случае как раз и содержит. Поэтому флажок оставим. Далее щелкнем на кнопке Далее. И, как мы видим, мы сразу же попадаем на окончательное окно, в котором надо задать имя связанной таблицы. Как мы видим, количество шагов в связывании, меньше, чем в импорте таблицы из Exell. Это связано с тем, что при связывании таблиц требования более жесткие, чем при импорте, поэтому возможности по манипулированию этим процессом у нас меньше. Щелкнем сейчас на кнопку Готово. Согласимся с этим именем для нашей новой таблицы. Щелкнем. Вот появилось вот это стандартное окно, в котором нам сообщают, что связывание произошло успешно. Щелкнем на кнопку ОК. И, как мы видим, вот эта таблица появилась в нашей базе данных. И около нее можно видеть стандартную пиктограмму с вот такой стрелкой. Что означает, что мы как раз и установили связь с этой таблицей. Если мы сейчас щелкнем дважды, то появляется вот эта таблица, которая на самом деле является своего рода ссылкой на соответствующую таблицу на соответствующий лист из этого файла. Мы в принципе можем здесь редактировать совершенно спокойно, и это все будет отражаться в Exell автоматически. Правда, надо сказать, что менять структуру этой таблицы уже не представляется возможным. Если мы попробуем открыть в режиме Структура, то появляется вот такое предупреждение, в котором нам говорится, что таблица является связанной таблицей и поэтому изменение ее некоторых свойств невозможно, И хотим ли мы подтвердить это действие. Щелкнем сейчас на кнопке Да, и можем видеть, что часть свойств наших полей мы изменить не можем. Появляется вот такая красная надпись, что изменение данного свойства невозможно. Правда, это не относится ко всем полям и ко всем возможностям. Какие-то из полей, тем не менее, редактировать можно. Например, можно изменить, как мы видим, число десятичных знаков. Как мы видим, здесь синяя надпись, что здесь разрешается. Изменить маску ввода, подпись. Вот
100
TeachPro Microsoft Access 2003
значение по умолчанию мы менять не можем. Ну и т.д. Т.е. в принципе достаточно большое количество возможностей по изменению структуры таблицы будет закрыто для изменения. Кроме этого, если мы посмотрим на размер текстовых ячеек нашей таблицы, то можно увидеть. что под ним отводится максимальное число символов 255. Это связано, конечно же, с тем, чтобы программа имел возможность вставить любой текст из Exell. Закроем теперь эту таблицу. И отметим еще одно обстоятельство. А именно то, что изменять структуру и другие параметры этой таблицы внутри Exell как раз совершенно спокойно можно. Но, правда, есть одно ограничение. Если мы изменим данные этой таблицы, то это автоматически отобразиться. А вот, если мы изменим структуру этой таблицы, а также изменим, например, местоположение этой таблицы, то это уже достаточно серьезное изменение, что потребует от нас обновления связи вот этой таблицы с программой, которая будет заключаться в том, что мы вынуждены будем просто-напросто удалить эту сделку и провести все эти операции по связыванию заново. Попробуем теперь провести обратную операцию. А именно, скопировать наши данные какие-либо таблицы в Exell. Для этого выберем, например, вот эту таблицу Сотрудники, далее щелкнем на правую кнопку мыши и выберем пункт Экспорт. Появляется вот такое стандартное окно для задания файлов для экспорта и в нем вместо типа файлов, выберем тип файла Exell. Здесь у нас достаточно много возможностей и среди них выберем вот этот Exell 97-2003, последний из поддерживаемых форматов. Щелкнем. Здесь можно увидеть все те файлы Exell, которые у нас находятся в папке Мои документы, и появляется, конечно же, надпись Сотрудники, имя для нашего файла, которое совпадает с именем таблицы, которая у нас была. Мы можем согласиться с этим или изменить. Оставим. как есть и щелкнем на кнопке Экспорт. В принципе это окно закрылось. и вроде бы. ничего особенного не произошло. хотя на самом деле этот файл у нас появился в папке Мои документы, как файл Exell. Посмотрим, так ли это на самом деле. Вот, перед нами папка Мои документы и в нем можно увидеть вот этот новый файл, файл Сотрудники. который, конечно же, является листов Exell. Если мы на нем щелкнем дважды, то появляется и в нем наш файл, файл, который мы экспортировали из базы данных. В принципе можно сравнить и увидеть. что его содержание идентично тому, что у нас находится в нашей таблице. Как мы видим, лист здесь абсолютно один. В принципе это имеет свое объяснение. Конечно же, наша таблица целиком поместилась в одним лист Exell. Закроем теперь. Щелкнем на вот этом крестике. И теперь попробуем экспортировать эту таблицу, таблицу Сотрудники не в отдельный файл, а в какой-либо существующий уже лист Exell. Для этого достаточно опять-таки выполнить практически то же самое, а именно, щелкнуть на правую кнопку мыши и выбрать пункт Экспорт. И после того, как появится вот это окно для выбора пункта назначения для экспорта, опять выберем формат, в который мы хотим экспортировать. Формат, конечно же, Exell. Ну и здесь выберем в качестве имени не Сотрудники, а выберем один из тех листов, который существовал ранее. Выберем, например, файл Покупатели. Далее щелкнем на кнопку Экспорт. Как мы видим, окно закрылось и мы вернулись обратно. Попробуем теперь найти этот файл, его открыть. Перед нами открылась папка Мои документы и в нем откроем вот этот лист Exell - Покупатели. Щелкнем на нем дважды и если присмотреться к этому файлу, который у нас открылся благополучно, то можно наряду с теми двумя листами, которые на самом деле здесь были ранее листов Поставщики и листом Покупатели, появился еще третий лист. лист Сотрудники, в котором сконцентрированы все данные из нашей таблицы. В принципе можно расширить эти два поля, которые у нас, так сказать, урезались и не поместились, для того чтобы их увидеть целиком. И можно теперь сравнить опять-таки и подтвердить. что все
Глава 3. Подробнее о таблицах (общая часть).
101
данные, которые мы можем видеть на этом листе, совпадают с данными, которые находились в нашей таблице.
3.4. Импорт и присоединение текстовых файлов Рассмотрим, какими возможностями обладает программа по импорту и экспорту файлов в текстовом формате. Для этого рассмотрим вот эту базу данных, с которой мы уже работали, и попробуем в нем вставить данные из текстового файла. Опять-таки мы можем это сделать двумя способами. Можем воспользоваться пунктом меню Файл и далее использовать пункт Внешние данные и импорт или связь с таблицами, или же щелкнуть на правую кнопку мыши и здесь выбрать пункт Импорт. Выберем таким образом. Щелкнем. Появляется в результате вот такое стандартное окно, в котором мы можем импортировать различного рода таблицы из других источников. В частности, из баз данных, которые у нас есть в нашем компьютере. Сейчас, как мы видим, у нас активизирована папка Мои документы. Ну и в данном конкретном случае нас уже не интересуют файлы или другие, связанные с базами данных. А попробуем разобраться, как можно импортировать текстовые файлы. Для этого, раскроем вот этот ниспадающий список Тип файлов и найдем здесь текстовые файлы. Вот они. Щелкнем. Вот, как мы видим, у нас в папке Мои документы есть несколько текстовых файлов, которые были подготовлены ранее. И они отличаются чуть-чуть друг от друга своей организацией данных. Ну, рассмотрим сначала вот этот файл с Сотрудниками. В нем данные расположены подряд с разделителями табуляции. Щелкнем здесь сейчас на кнопке Импорт. В результате появляется вот такое стандартное окно импорта текста, в котором нам предлагают выбрать тип текстового файла с разделителями или с фиксированной шириной полей. Но в данном конкретном случае у нас как раз файл с разделителями, в котором поля разделяются как раз табуляцией. Табуляцией является вот этот квадратик, который представляет собой отображение знака табуляции в этом окне. Ну, как мы видим, в принципе, пока наши данные выглядят достаточно хаотично в этом примере. Щелкнем сейчас на кнопке Далее. И, как мы видим, сейчас уже наши данные приобрели гораздо большую стройность, поскольку компьютер учел нашу подсказку, что разделитель является табуляция и при помощи этого разделителя разделил наш непрерывный текстовый на колонки. Ну и, конечно же, нам нужно выбрать пункт, что первая строка содержит имена полей. Так оно и есть. Поставим здесь флажок и в этом случае у нас наша таблица приобретет гораздо большую стройность. Ну и, нам, конечно же, требуется выбрать, какой разделитель у нас является определяющим в нашем текстовом файле. Как мы видим, сейчас по умолчанию разделитель является табуляция, но в принципе, мы можем выбрать другие возможности. А именно, в качестве разделителя выбрать - точку с запятой, запятую. Пробел или какой-либо другой знак. Правда, если сейчас мы выберем какой-либо другой знак, например, выберем точку с запятой, щелкнем на кнопку ОК, и можем видеть, что наш компьютер, в этом случае, конечно же, абсолютно неправильно определяет колонки, поскольку, конечно же, у нас разделителем является именно табуляция, а не какой-либо другой знак. Поэтому вернемся к случаю с табуляцией, в этом случае у нас все гораздо лучше. Далее мы можем выбрать ограничитель текстов, в качестве которого мы можем выбрать двойные кавычки, одинарные кавычки, или же не выбирать ничего. А это в том случае, если у нас текстовые фрагменты заключены в соответствующие кавычки. Ну, сейчас согласимся с пунктом Нет, и пойдем далее. Щелкнем на соответствующую кнопку. Вот, появилось следующее окно, в котором нам нужно выбрать, куда мы сохраним наши данные. В новую таблицу или же в существующую. Если мы сохраняем существующую, нам нужно выбрать в какую-либо из них. Сейчас выбе-
102
TeachPro Microsoft Access 2003
рем новую таблицу, для простаты. Щелкнем на кнопку Далее и появляется следующее окно, в котором нам предлагают выбрать описание для наших полей. В нем мы можем изменять описание полей, выбирать тип для них, а также пропускать какие-либо колонки. Сейчас согласимся с тем, что импортируем все колонки. Так что ничего здесь трогать не будем. Щелкнем на кнопку Далее и надо теперь определиться с ключом, который должен быть или не должен быть в нашей таблице. Как мы видим, компьютер пытается автоматически создать ключ, в качестве которого выбирает дополнительную колонку. Мы, тем не менее, можем выбрать пункт Определить ключ, и в качестве ключа выбрать первую колонку, колонку Код. Хотя, если мы щелкнем на вот этом ниспадающем списке, в качестве ключа при необходимости можем выбрать и любую другую колонку по желанию. Теперь щелкнем на кнопке Далее и появляется последнее окно, где мы можем выбрать имя для нашей таблицы. Согласимся с этим именем Сотрудники с разделителями табуляции. И далее, опять-таки два стандартных пункта, это проанализировать таблицу или же вывести справку после работы мастера. Теперь уже у нас все готово, для того чтобы щелкнуть на кнопку Готово и создать таблицу на основе текста. Обратим внимание еще на одну кнопку, кнопку Дополнительная, которая присутствует у нас в этом окне. Она, в принципе, присутствовала и на всех предыдущих окнах тоже. Посмотрим, что она делает. Щелкнем на этой кнопке, и в результате появляется вот такое дополнительное окно, в котором мы можем задавать дополнительно и управлять импортом нашего файла. Здесь мы можем задавать галочки в тех колонках, которые мы не хотим импортировать и которые мы хотим пропустить. Допустим, пропустим колонку Должность и колонку Дата рождения, далее опять-таки мы можем выбрать формат файла с разделителями или фиксированной ширины. Мы можем выбрать разделители полей, в качестве которых у нас сейчас выбрана одна табуляция. Мы можем выбрать и какой-либо другой знак, ограничитель текста. Ну, в общем, все те поля, которые у нас уже были. Но, кроме этого можем выбрать язык для нашего файла и кодовую страницу. Ну, сейчас. Как мы видим, она стоит на Кириллице Windows, что в принципе, как раз и согласуется с нашими данными. Поэтому оставим без изменения. Также здесь присутствует и определение даты и времени, и числа, которые могут присутствовать у нас в нашей таблице. Но, в принципе, можно оставить все по умолчанию, если, конечно, у нас достаточно стандартно записаны все эти данные в нашей таблице. Ну, щелкнем теперь на кнопку ОК. И щелкнем на последнюю возможность, на кнопку Готово. Для того чтобы непосредственно создать нашу таблицу. Вот появилось вот такое окно, в котором нам компьютер говорит, что все произошло успешно и создание таблицы завершено. Щелкнем на кнопку ОК. И в результате в нашей базе данных появляется вот эта новая таблица. Посмотрим, как она выглядит. Для этого щелкнем на ней дважды и можем видеть, как из соответствующего текстового файла, нам совершенно спокойно удалось получить вот такую таблицу. Закроем теперь ее. Щелкнем теперь на правую кнопку мыши и выберем опять пункт Импорт. Вот опять перед нами появились все те текстовые файлы, которые мы только что видели и оценим вот этот файл Сотрудники. Как он выглядит в текстовом виде. Для этого откроем его в блокноте. Щелкнем на правую кнопку мыши и выберем пункт Открыть. И вот можно увидеть, как этот файл выглядел в исходном виде в текстовом. Ну, конечно же, в виде таблицы он выглядит, конечно же, более привлекательно. Закроем его. И теперь посмотрим другой файл Сотрудники, в котором разделителями являются запятые. Посмотрим, как это выглядит опять-таки в текстовом блокноте. Для этого щелкнем на правую кнопку мыши и выберем пункт Открыть. И можно увидеть, что, конечно же, вот в таком виде наш файл выглядит достаточно сложно для восприятия. Хотя точки с запятыми в качестве разделителя, они, конечно же, проглядываются. Закроем теперь это окно.
Глава 3. Подробнее о таблицах (общая часть).
103
И импортируем эту таблицу. Для этого щелкнем на кнопке Импорт. Ну, появляется опять вот такое стандартное окно, в котором мы уже, конечно же, наученные опытом, выберем пункт с разделителями. Щелкнем на кнопке Далее. И как мы видим, компьютер разумно сам подобрал точку с запятой в качестве разделителя. Нам остается только выбрать, что первую строку содержат имена полей. Щелкнем на кнопку Далее. Сохраним все это в новой таблице. Опять Далее. Ну, изменять описание полей мы не будем. Щелкнем на кнопку Далее. Определимся с ключом, в качестве которого выберем первую колонку. Опять Далее. И согласимся с импортом в эту таблицу, с именем. Дополнительные параметры трогать не будем. Щелкнем на кнопку Готово. Все произошло нормально. Импорт завершен. ОК. И, как мы видим, вот эта вторая таблица тоже совершенно успешно появилась на нашей базе данных. Хотя она была уже в исходном виде немножко другая. С разделителями не табуляцией, а точка с запятой. Если мы щелкнем на ней дважды, то можно увидеть, как выглядит вот эта таблица. Она абсолютно нормальная и успешно импортированная. Закроем ее. Рассмотрим теперь последнюю возможность, возможность импорта файла, в котором данные представлены с фиксированной шириной полей. Для того чтобы рассмотреть эту возможность, щелкнем на правую кнопку мыши. Выберем опять пункт Импорт. Вот появилось стандартное окно, в котором перечислены текстовые файлы с расширением в папке Мои документы. И в нем есть файл покупателей, который как раз является текстовым документом соответствующего формата. С фиксированной шириной ячеек. Ну, посмотрим, так ли это. Для этого щелкнем на правую кнопку мыши и выберем пункт Открыть. Вот, как мы видим, у нас этот файл загрузился в блокноте и здесь можно видеть, что, как мы и предполагали, этот файл создан таким образом, что каждая колонка имеет фиксированную ширину. Закроем теперь этот блокнот и попробуем импортировать этот файл. Для этого щелкнем на кнопке Импорт. Появляется вот такой Мастер импорта и в нем, как мы видим, компьютер достаточно разумно предлагает нам выбрать импортирование с фиксированной шириной полей, в котором интервалы заполняются пробелами. Ну, конечно, все это верно, выбор с разделителями, в качестве которого выберем запятые, табуляции или другой знак. Конечно же, нас это никак не устроит, поэтому щелкнем на кнопке Далее. Ну и здесь, нам уже придется немножко поработать. Хотя компьютер достаточно разумно определил, что у нас колонки имеют фиксированную ширину, тем не менее, он разделил эти колонки не совсем, верно. Ну, вот в частности, вот этот первый разделитель, конечно же, стоит совершенно не на своем месте. Поэтому схватим его и потащим в сторону, туда, куда нам нужно. Вот приблизительно в этом месте, конечно же, он должен находиться. Что более естественно. Поэтому отпустим теперь и с первой колонки мы уже вполне нормально определились. Теперь же вторая колонка у нас нормально определилась. Третья тоже. А вот, между 4 и 5 колонкой, здесь, конечно же, тоже нужен разделитель. Поэтому нажмем вот в этом месте, и появился соответствующий разделитель, который, правда, опять-таки требует немножко корректировки. Сдвинем его на одно деление вправо. Вот таким образом. Теперь Сдвинем всю нашу таблицу, и как мы видим, здесь требуется еще один разделитель между городом и индексом. Щелкнем, сдвинем. Пойдем дальше и, как мы видим, у нас последний разделитель, который здесь требуется, между каталогом и телефоном. Щелкнем. Сдвинем еще на одно деление вправо и вот теперь вроде бы. Как у нас все колонки разделились относительно друг друга достаточно хорошо. Щелкнем теперь на кнопке Далее, после того, как мы определились со этими колонками. Далее у нас требуют выбрать в новой таблице или в существующей мы хотим задать наши данные. Выберем пункт в новой таблице, ничего здесь не будем менять. Щелкнем на кнопку Далее. Далее требуют от нас определения, где будет находиться ключ или же совсем он не будет. Компьютер, как мы видим, пытается автоматически создавать ключ.
104
TeachPro Microsoft Access 2003
Ну, выберем определить ключ, в качестве которого, конечно же, выберем первое поле. Щелкнем теперь на кнопку Далее. Как мы видим, здесь нам требуется выбрать имя для нашей таблицы. Но, согласимся с именем покупатели. И, напоследок, щелкнем на кнопке Готово. Как мы видим, компьютер определил некую ошибку в определении ключевого поля, поля 1. В нем содержится пустое значение, что запрещено. Щелкнем на ОК. Опять на ОК. Подтверждая, что мы поняли, что ошибки у нас есть. И вот перед нами появилась наша таблица покупателей. И наряду с ней появилась еще одна таблица покупателей Ошибки импорта. Если мы щелкнем на пункте Покупатель, то можно увидеть вот эту нашу таблицу, в которой, правда, вот это первое поле, в поле, в котором у нас находится название, оно на самом деле, конечно же, лишнее. Оно у нас должно быть наверху, там, где у нас названия полей. В принципе, сейчас согласимся с тем, как есть. Так уж получилось при импортировании с фиксированной шириной. Далее рассмотрим вот это поле 6, в котором, как мы видим, правда, достаточно много пустых мест. Что как раз нам компьютер и не понравился. Закроем эту таблицу и посмотрим ошибки импорта. И в нем как раз и видно, что сплошные ошибки у нас в поле 6. И здесь перечислены все те строчки, в которых у нас есть пустые места. Ну, конечно же, мы могли разрешить использовать пустые места в полях, тогда бы этой ошибки не было. Ну, сейчас оставим как есть и в результате получая вот такую таблицу покупателей при импорте соответствующего текстового файла.
3.5. Экспорт в текстовые файлы Конечно же, мы можем не только импортировать таблицы в текстовом формате, но и связывать их. Для этого, как всегда щелкнем на правую кнопку мыши. Выберем связь с таблицами. И выберем текстовые файлы, в качестве расширения. Ну так, как сейчас есть. Выберем одну из таблиц, с которой мы уже работали. Например, Сотрудники с табуляцией, в качестве разделителей. Щелкнем на кнопке Связь. Появляется , конечно же, предупреждение, что у нас такая таблица уже есть. Перезаписать или нет. Щелкнем сейчас на кнопке Нет и выберем пункт, конечно же, с разделителями, в качестве которого у нас будет табуляция. Щелкнем на кнопке Далее. Выберем первую строку в качестве заголовка. Ну, это все мы уже выполняли ранее. Щелкнем на кнопке Далее. Опять Далее. Как мы видим, у нас количество вопросов в этом мастере было меньше, чем при чистом импортировании таблицы. Конечно же, понятно почему, поскольку при связывании, немножко другие требования. Ну, сейчас щелкнем на кнопке Готово. Но, прежде изменим имя нашей таблицы, для того чтобы у нас не возник конфликт с той таблицей. Которая у нас уже есть. Поэтому напишем просто-напросто единицу в конце этого имени. Щелкнем на кнопку Готово. Наконец появляется вот такая надпись, что все успешно завершено. ОК. И в нашей базе данных появилась вот эта новая таблицу Сотрудники, которая является связанной таблицей, что можно увидеть при помощи вот этой стрелки. Ну и значок блокнота подсказывает нам, что источником является, конечно же, текстовый документ. Если мы щелкнем сейчас дважды, то можно увидеть, как выглядит эта таблица, ее структура и ее данные. Закроем ее. И отметим, что, конечно же, работать с этой связанной таблицей можно точно так же, как и с любой другой связанной таблицей. Т.е. все что мы поменяем здесь, будет автоматически изменяться в соответствующем текстовом файле и наоборот. Конечно же, если мы можем импортировать таблицы из текстового формата, то, конечно, мы можем их экспортировать. В принципе, достаточно разумно. Поэтому, попробуем это сделать. Для этого выберем какую-либо, из сущеествующих у нас в базе данных таблиц. Например, выберем вот эту таблицу Сотрудники. Щелкнем теперь на правую
Глава 3. Подробнее о таблицах (общая часть).
105
кнопку мыши и выберем пункт, пункт Экспорт. Появляется вот такое стандартное окно экспорта объекта, и в нем мы можем выбрать тип файла, в который мы хотим экспортировать. Выберем из выпадающего списка тот тип, который нам сейчас нужен. А именно, текстовый. Вот он. Появляются все текстовые файлы, которые у нас уже есть в этой папке, папке Мои документы. Для того чтобы они у нас затерялись, выберем в качестве имени, нашим сотрудникам добавим, например, 1 и щелкнем на кнопке Экспорт. Далее от нас требуется определиться с различного рода параметрами, в качестве которых мы можем выбрать, как мы хотим экспортировать текстовый файл. С разделителями, в которых поля будут разделяться запятыми и табуляцией, или с зафиксированной шириной полей. В принципе, все зависит от наших дальнейших планов с этим текстовым файлом. Мы можем выбрать один из этих двух вариантов. Выберем с разделителями, например. Щелкнем на кнопку. Далее. И здесь мы можем выбрать, какие разделители мы хотим выбрать для разделения ячеек. Ну, мы можем выбрать точку с запятой, как сейчас у нас есть по умолчанию. Можем выбрать простую запятую. Можем выбрать пробел. Каждый из этих выборов автоматически определяет внешний вид нашей таблицы. Что можно увидеть вот в этом примере. Ну, можем выбрать знак табуляции, а также можем включать имена полей в первой строке, для того чтобы у нас все это выглядело более разумно. Щелкнем сейчас на кнопку Далее. И затем от нас требуют указать файл, в который мы хотим экспортировать наши данные. Согласимся с папкой, в которую мы хотим экспортировать в папку Мои документы. И в название файла добавим двойку. Сотрудники-2. Щелкнем сейчас на кнопку Готово. Вот, как мы видим, экспорт завершен. ОК. И все у нас произошло достаточно успешно. Попробуем сейчас провести экспорт еще раз, в качестве которого выберем Экспорт в текстовый файл с фиксированной шириной ячеек. Для этого опять щелкнем на каком-либо из файлов. Опять-таки выберем вот эту таблицу Сотрудники. Щелкнем на правую кнопку мыши. Далее Экспорт. Конечно же, мы хотим выбрать текстовый формат. В качестве имени выберем теперь Сотрудники -3. Далее щелкнем на кнопку Экспорт и выберем фиксированную ширину полей. Ну и можно видеть, как все это будет выглядеть с фиксированной шириной. Щелкнем теперь на кнопку Далее. От нас требуют теперь определить линии со стрелками, которые будут отмечать места разделения полей. Мы можем перемещать эти строки. Например, схватим первую из колонок и перетащим левее. Перетащим и следующий разделитель. Вот таким образом. Затем схватим опять следующий. Ну, вот таким образом можем формировать нашу таблицу. Конечно же, вот такие вот большие пустоты оставлять не логично в нашем файле, который должен в результате получиться. Ну, вот в результате можно определиться с тем, как окончательно должен выглядеть наш текстовый файл. Щелкнем теперь на кнопке Далее и от нас требуется утвердить файл, в котором мы хотим экспортировать наши данные. Согласимся с тем файлом, который у нас есть по умолчанию. Щелкнем теперь на кнопке Готово. Экспорт успешно завершен. ОК. И в результате мы получим экспортированный файл с фиксированной шириной ячеек. Посмотрим, как все это будет выглядеть. Для этого просто щелкнем на правую кнопку мыши. Выберем какой-либо пункт, для того чтобы просто-напросто открыть папку Мои документы. Например, щелкнем на пункт Импорт. Вот те файлы, с которыми мы работали. Вот этот файл Сотрудники-2. Можем щелкнуть на правую кнопку мыши и выбрать пункт Открыть. И можно увидеть. Как будет выглядеть этот файл с разделителями табуляции. Закроем его. А можем посмотреть вот этот файл Сотрудники-3. Щелкнем на кнопке Открыть. И можем видеть, как может выглядеть вот этот файл, в котором каждая из ячеек занимает фиксированную ширину строки. Закроем его. Закроем и вот эту папку Импорт. Она нам в принципе была нужна только, чтобы добраться до вот этих файлов и папки Мои документы. Конечно же, мы ничего сейчас импортировать не хотим и вернемся в стандартный вид нашей базы данных.
106
TeachPro Microsoft Access 2003
Глава 4. Подробнее о таблицах Импорт и присоединение таблиц (профессионалам) 4.1. Формат Dbase На этом уроке рассмотрим такой, достаточно популярный формат базы данных, как Dbase. Рассмотрим, как можно импортировать и связывать файлы такого типа, и экспортировать данные в этот тип. Первонаперво, попробуем импортировать файл типа Dbase. Для этого, как всегда нам нужно или выбрать пункт Файл и далее Внешние данные импорта. Или же в нашей базе данных щелкнуть на правую кнопку мыши, выбрать пункт Импорт. Щелкнем. В любом случае появляется вот такое стандартное окно, в котором, как мы видим, мы можем произвести импорт соответствующего файла. Сейчас, как мы видим, мы находимся в папке Мои документы и для того чтобы импортировать имена файлов нужного нам типа, конечно же, нам нужно изменить тип файлов для импорта. Сейчас, как мы видим, у нас фильтр стоит на таком типе файлов. А если мы щелкнем на вот этом ниспадающем списке, то здесь можно увидеть все возможные форматы, которые поддерживают для импорта. И среди них файлы Dbase. Как мы видим, мы можем импортировать файлы Dbase 5,3,4 версии. Ну, выберем, например, Dbase 5. В принципе, большой разницы нет для импорта, поскольку в любом случае мы будем выбирать файлы с расширением dbf. А нам сейчас главное, чтобы появились все такие файлы. Ну, а дальше при импорте, программа сама разберется с номером версии. Ну, вот, как мы видим, у нас есть файл покупателей, которые имеют расширение dbf и тип Dbase Выберем его. Далее щелкнем на кнопке Импорт. И как мы видим, мы успешно выполнили импорт этого файла. Причем, как мы видим, у нас этот файл появился с именем покупателей 1. Поскольку таблица с именем покупатели у нас уже была в нашей базе данных. Щелкнем на кнопке ОК. И в принципе, это все, что требуется для импорта файла. Закроем теперь это окно. Можно увидеть вот эту таблицу Покупатели 1, которая дополнительно появилась на нашей базе данных. Как мы видим, импорт таблиц из других баз данных, в отличие от импорта текстовых файлов, происходит, конечно же, легче. Никакого мастера и никаких дополнительных параметров, усложняющих нам работу при импорте, конечно же, не появилось. Если сейчас мы посмотрим эту таблицу Покупатели-1 и щелкнем на ней дважды, то можно увидеть, как выглядит эта таблица. Ну, в принципе, она выглядит, как обычная таблица, но есть несколько отличий, связанных с тем, что формат Dbase не поддерживает длины имена файлов и все буквы в соответствующих именах полей переводит в старший регистр. В результате чего вот имена полей приобретает такой вид. Кроме этого, файлы формата Dbase не поддерживают авто счетчик. И кроме этого, не все поля, которые есть у нас есть в файлах Dbase. Например, такие поля, как поле связывания JLE. Это надо учитывать при импорте и экспорте файлов в этот формат. Особенно, конечно же, при экспорте, которым мы займемся позже. А сейчас закроем этот файл. И попробуем на этот раз не импортировать этот файл, а установить связь с ним. Для этого, конечно же, опять-таки надо щелкнуть на правую кнопку мыши, выбрать пункт, на этот раз не Импорт, а Связь с таблицами. Щелкнем. Появилось опять вот это стандартное окно, в котором на этот раз у нас окно имеет надпись Связь. Далее выберем тип файлов. Тип файлов Dbase. Выберем вот этих покупателей. Щелкнем на кнопке Связь.
Глава 4. Подробнее о таблицах. Импорт и присоединение таблиц (проф.)
107
Появилась, как мы видим, вот такая достаточно серьезная предупреждающая надпись, о том, что индексный файл с таким именем уже существует, и подтверждаем ли мы то, что мы хотим применить этот индексный файл. В принципе, конечно же, этот файл Покупатели у нас существует. Мы с ним работали ранее. В принципе, это, конечно же, один и тот же файл. Поэтому индексный файл мы сейчас менять не будем. Щелкнем на кнопке Нет и в результате чего мы установили связь с базой данных Покупатели -2. Поскольку Покупатели и Покупатели-1 у нас уже есть. Щелкнем на кнопке ОК. Закроем это окно и можно увидеть, что в нашей базе данных появилось еще одна таблица. Таблица Покупатели-2 и рядом с ним вот такой знак, знак Dbase, что указывает принадлежность этого файла к соответствующему формату. И кроме этого здесь же находится вот такая стрелка, которая говорит о том, что у нас успешно установлена связь с этой базой данных. Щелкнем теперь дважды на вот этой таблице и можно увидеть, как она выглядит. Ну, конечно же, пока ничего необычного в этой таблице нет. Закроем эту таблицу. И попробуем теперь провести экспорт какой-либо таблицы в этот формат. В формат Dbase. При этом надо учитывать те ограничения, которые Dbase накладывает на таблицу. Ну, т.е. запрет длинных имен, и возможность работы далеко не со всеми типами полей. А теперь щелкнем на правую кнопку мыши. Например, на вот этой таблице Сотрудники и выберем пункт Экспорт. Ну, как мы видим, появилось вот это стандартное окно экспорта и выберем, например, Dbase 5. Теперь щелкнем на кнопке Экспорт. И в принципе, мы успешно экспортировали нашу таблицу. Если мы сейчас щелкнем на правую кнопку мыши и выберем пункт, например, Импорт, то можем увидеть теперь обе таблицы, и таблицу Покупатели и таблицу Сотрудники, обе из которых записаны в формате Dbase. Щелкнем теперь на кнопку Отмена, чтобы закрыть это окно. Оно нам нужно было только чтобы увидеть список файлов в папке Мои документы, и мы вернулись в стандартный вид программы microsoft Access.
4.2. Формат Paradox Рассмотрим, как данная программа взаимодействует с такими форматами базы данных, как таблицы Парадокс. Первое, что попробуем сделать, это экспортировать какую-либо из существующих таблиц в этот формат. Выберем, например, базу данных Покупатели. Щелкнем на правую кнопку мыши и выберем пункт Экспорт. Вот появилось стандартное окно экспорта, и теперь выберем тип файла, который нам нужен и местоположение на нашем жестком диске. Выберем новую папку для этой таблицы. Для этого щелкнем на пункте Создать папку. Выберем имя папки. Пусть будет, например, таким. Щелкнем на кнопке ОК и вот мы попали в эту папку. Далее выберем имя для этого файла. Пусть будет, например, опять Покупатели. И в конце припишем приписку. Щелкнем теперь на кнопке Экспорт. Но перед этим, конечно же, нам нужно выбрать тип соответствующее расширение Dbase Т.е. файлы Парадокс. Вот щелкнем на ниспадающем списке и далее найдем те файлы, которые нам нужны. Как мы видим, Dbase поддерживает работу с файлами Парадокс 3,4,5, и 7,8 версии. Ну, надо отметить, что для экспорта файлов в формат Парадокса 3.4.5. версии у нас уже все необходимое есть. В программе вполне достаточно. А для того чтобы экспортировать в файлы Парадокс 7 и 8 версии нам потребуется соответствующий движок для работы с этими файлами. Ну, в принципе, если мы сталкивались с компанией Borland и с его продукцией, то мы в этом случае можем иметь на нашем компьютере этот движок. В частности, он поставляется, например, вместе с языком программирования Delphi.
108
TeachPro Microsoft Access 2003
Но, на нашем компьютере сейчас этот движок установлен и поэтому мы смело можем экспортировать вот эту последнюю версию Парадокса 7.8. Щелкнем. И далее щелкнем теперь на кнопку Экспорт. В результате компьютер подумал так сказать и выполнил успешно экспорт этих файлов. Для того чтобы посмотреть, что у нас в результате получилось, щелкнем на правую кнопку мыши. Выберем опять пункт Экспорт. Выберем опять файлы Парадокса. Найдем соответствующее расширение. Вот файлы парадокса. И можно увидеть, что этот файл у нас появился в этой базе данных. Но надо отметить, что этот файл не единственный в этом каталоге. Для того чтобы увидеть все, что здесь происходит, посмотрим, какие еще файлы существуют в этой папке. Для этого зададим фильтр, в качестве всех файлов. Напишем вот таким образом. Звезда точка звезда. Щелкнем на кнопке Enter, и можем увидеть, что на самом деле у нас в этой папке, наряду с основным файлом покупателей, тут же появился еще один файл Покупатель, с таким расширением, т.е. данные в этом формате разместились в двух файлах. Надо сказать, что в таблице Парадокс, файлы могут располагаться не только в одном, двух файлах, но и в достаточно большом количестве файлах, поскольку каждое из индексированных полей этот формат может хранить в отдельном файле. Это надо учитывать при работе с этими файлами, чтобы при копировании, например, с одного места на другое, мы копировали не только какой-то отдельный кусок этой базы данных, но и весь комплект файлов, который входит в эту структуру. Закроем сейчас это окно, щелкнем на кнопку Отмена. И мы обратно попали в наше стандартное окно. Отметим еще одно обстоятельство, что при экспорте таблиц в таблице формата Парадокс надо учитывать те ограничения, которые накладывает на нас этот формат. В частности мы не можем применять поля с длинными именами, точно так же, как в формате Dbase, и если у нас есть такие длинные имена, то они будут просто-напросто усекаться. И, конечно же, в этом случае есть вероятность возникновения совпадения двух имен, если у них какая-то короткая часть совпадает друг с другом. Попробуем теперь импортировать эту же таблицу из формата Парадокс в программу. Для этого щелкнем на правую кнопку мыши. Выберем пункт Импорт. И далее, конечно же, для того чтобы добраться до этих файлов нам из этого типа надо перейти в тип Парадокса. Для этого щелкнем на этом ниспадающем окне выбора типа файлов и выберем файлы Парадокс. Щелкнем. Вот, появился этот файл Покупатели. Выберем его. Далее щелкнем на кнопке Импорт. Но, как мы видим, импорт произошел успешно, о чем нам говорит это окно. Щелкнем на кнопке ОК. И закроем это окно. Щелкнем на кнопке Закрыть. Вот эта новая таблица Покупатели. появилась перед нами. Щелкнем на нем дважды. И можем видеть, как она выглядит. В принципе, все достаточно нормально. Она выглядит точно так же, как обычная, совершенно стандартная таблица. Но, и, конечно же, как мы видим, при импорте не понадобилось нам настраивать какие-то дополнительные параметры и пользоваться мастером импорта файлов. В отличие от импорта файлов из таблиц, которые были созданы в Dbase или же в текстовом файле. Закроем теперь это окно. Попробуем установить на этот раз связь с этой базой данных покупатели. Для этого щелкнем на правую кнопку мыши. Выберем пункт Связь с таблицами. Далее опять перейдем в тип файлов Парадокс. И выберем этот файл Покупатели, эту таблицу. Щелкнем теперь на кнопке Связь. И как мы видим, все произошло успешно. Связь установлена. ОК. Закроем это окно. И как мы видим, у нас появилась новая таблица Покупатели, которая является связанной таблицей с соответствующей таблицей на нашем жестком диске. И как мы видим, она имеет тип Парадокс, что можно видеть вот при помощи этой аббревиатуры. И то, что она связанная таблица, можно видеть из вот этой стрелки, которая находится рядом с ней.
Глава 4. Подробнее о таблицах. Импорт и присоединение таблиц (проф.)
109
Есть еще одно интересное обстоятельство. Если мы откроем сейчас вот эту таблицу Покупатели, которую мы импортировали. Щелкнем на ней дважды, то мы можем с ней работать точно так же, как и с любой другой таблицей, которая была создана, например, внутри этой программы. А если мы сдвинем вот этот ползунок, резко вниз, то можно увидеть то место в нашей таблице, в ее конце, где мы можем добавлять новую строку и новую запись в нашей таблице. Закроем эту таблицу. Откроем другую таблицу, которая находится чуть ниже, которая является тоже таблицей Покупатели, но связанной таблицей. Щелкнем на ней дважды и сдвинем ползунок до конца вниз. И на этот раз можно увидеть, что вот эта дополнительная строка, в которую мы могли вводить новые записи, в этой таблице нет. Т.е. как мы видим, новые данные мы можем вводить в эту таблицу только внутри самой таблицы Парадокса при помощи соответствующих возможностей. А вот внутри программы вводить новые записи мы уже не можем. Она доступна нам в режиме только для чтения. Закроем эту таблицу и вернемся в обычный режим Microsoft Access.
4.3. Формат HTML Рассмотрим, какими возможностями обладает программа по взаимодействию с таким популярным форматом, как формат HTML, который, как мы знаем, применяется очень часто для web страниц, и не только. Ну и, конечно же, очень часто в web страницах находятся таблицы, которые мы можем импортировать и наоборот, экспортировать какие-либо таблицы в HTML формат. И в этом случае они будут доступны для просмотра в обычном браузере. Например, в этом случае не понадобиться для просмотра этих файлов. Ну, рассмотрим все это подробнее в нашей базе данных, которая у нас уже существует. Первое, что мы можем сделать, это экспортировать нашу какую-либо таблицу в соответствующую HTML структуру. Выберем, например, вот это файл Покупатели, щелкнем далее на правую кнопку мыши и выберем пункт Экспорт.Далее, вместо этого типа файла выберем соответствующий формат, формат HTML. Для этого щелкнем на вот этом ниспадающем списке и выберем вот этот пункт HTML документ. Далее выберем местоположение для нашего файла. Во-первых, щелкнем на папке Мои документы, внутри которой создадим новую папку. Щелкнем на кнопке создания новой папки и назовем нашу папку HTML. ОК. Вот, мы попали внутри нее и назовем этот файл Покупатели. И далее напишем HTNL. Щелкнем теперь на кнопке Экспорт. И компьютер вполне успешно провел экспорт этого файла. Щелкнем теперь на правую кнопку мыши еще раз, находясь, на таблице Покупатели. Далее опять выберем пункт Экспорт и на этот раз, выбрав опять тип файла HTML документ, обратим внимание на этот пункт, пункт Сохранить формат, который присутствует у нас на этом окне. Дело в том, что мы можем не только копировать, так сказать, содержимое наших таблиц, но и разного рода форматирование, которое присутствует у нас внутри таблицы. Например, если мы заливали нашу таблицу каким-либо цветом или еще какие-либо параметры, то это все сохранится в HTML документе, при выборе этого пункта. А сейчас попробуем выбрать этот пункт и щелкнем на кнопке Экспорт. Ну, предварительно назовем этот документ Покупатели HTML -1, чтобы отличить от предыдущего файла. Щелкнем на кнопке Экспорт. Ну и. Как мы видим, появилось вот это дополнительное окно, которое не появлялось в предыдущем случае и в котором от нас требует выбрать параметры вывода в формате HTML.
110
TeachPro Microsoft Access 2003
Мы можем выбрать различного рода шаблоны для нашей HTML страницы. Если у нас, конечно, они заранее подготовлены. И в этом случае, наша таблица будет выглядеть соответствующим образом. Ну, сейчас мы это делать не будем и отметим еще одно. Что мы можем выбрать кодировку для сохранения файла. Ну, оставим этот пункт тоже по умолчанию, так как у нас установлено в установке для Windows, и щелкнем на кнопке ОК. Как мы видим, у нас вполне успешно произошло экспортирование нашей таблицы Покупатели. Посмотрим, теперь, что у нас получилось. Щелкнем на правую кнопку мыши. Опять выберем пункт Экспорт. Далее формат HTML Документ, щелкнем. Вот появились эти два файла. Как можно видеть, по вот этой букве "e", рядом с ними, конечно же, это у нас HTML документы. И теперь попробуем посмотреть, как они выглядят в браузере. В принципе, уже первое, что можно увидеть, что первый файл по своему размеру намного меньше, чем второй. Ну, конечно же, это связано с тем, что во второй таблице в формате HTML она сохранена вместе с форматом, что, конечно же, приводит к разбуханию этого файла. Попробуем теперь открыть первый из них. Для этого щелкнем на правую кнопку мыши и выберем пункт Open, открыть. Ну и, конечно же, этот файл открывается в стандартном браузере и здесь можно увидеть, вот эту таблицу со всеми своими данными. Ну, конечно же, наверху находится название нашего файла. И внутри него находится вся наша таблица, которую можно просматривать, добираясь до любых записей в ней. Но, надо сказать одно обстоятельство, что заголовка у нашей таблицы нет. Так сказать, мы экспортировали только внутреннюю часть. Все записи, которые внутри нее находились. Попробуем теперь, как выглядит эта же таблица во втором формате. Для этого закроем эту таблицу. Щелкнем на вот этом крестике. И откроем вторую таблицу. Опять щелкнем на правую кнопку мыши, находясь на вот этом файле. Далее выберем пункт Open. Вот эта таблица появилась перед нами и на этот раз можно увидеть, что этот формат уже больше похож на табличный. Здесь же присутствует, конечно же, наименование для каждого из столбцов, да и сама таблица, конечно же, выглядит. Скажем так, больше похожую на таблицу. Хотя, конечно же, все данные в обеих таблицах, они идентичны по своему внутреннему наполнению. Ну, можно перемещаться по вот этой таблице, добираясь до любых записей в ней. Ну и, конечно же, надо отметить, что, как мы сказали ранее, все форматирование, которое у нас присутствовало в нашей базе данных, оно автоматически перешло и вот в эту HTML страницу. Закроем теперь. Щелкнем на вот этом крестике. Закроем это окно тоже. И вот мы вернулись обратно в стандартный вид окна. Попробуем теперь импортировать данные из HTML страницы. Ну, конечно же, импортировать проще всего из тех страниц, которые у нас уже есть, которые мы только что создавали. Щелкнем на правую кнопку мыши. Выберем пункт Импорт. Далее выберем файлы с расширением HTML документ. Щелкнем. Вот эти два файла. Далее щелкнем на первый из них. Щелкнем на кнопку Импорт. Далее появляется вот этот мастер, который очень похож на тот мастер, который помогал нам импортировать текстовые файлы. В первом из этих окошек нам предлагают выбрать, содержит ли первая строка заголовки столбцов. Как мы видим, первая строка заголовки не содержит. Если мы поставим здесь флажок, то компьютер выдает нам, что первая строка. Конечно же, не подходит для этой операции. Поэтому вот в таком виде, конечно же, нельзя. Флажок лучше снять. Щелкнем теперь на кнопку Далее. Как мы видим, полям этой таблицы компьютер придал вот такие названия - Поле-1, Поле-2, Поле-3 и т.д. Здесь ничего не будем менять. Щелкнем на кнопку Далее. Затем можем выбрать, как мы будем выбирать ключ. В принципе можно выбрать определение ключа, для того чтобы выбрать в качестве ключа первое поле. Далее щелкнем на кнопку Далее. Как мы видим, появилось имя для нашей таблицы. В
Глава 4. Подробнее о таблицах. Импорт и присоединение таблиц (проф.)
111
принципе, мы можем выбрать и кнопку Дополнительно, чтобы посмотреть окончательно структуру нашей таблицы. Выбрать кодовую страницу при необходимости. Можно пропустить или оставить соответствующие поля, которые у нас есть в этой таблице. Например, пропустим вот эти несколько полей и щелкнем на кнопку ОК. Далее нажмем на кнопку Готово, и в результате импорт этого файла успешно завершен. ОК. Вот появилась новая таблица Покупатели HTML. Если мы на ней щелкнем, то можно увидеть, как выглядит эта таблица. Ну, конечно же, название полей вот выглядит таким достаточно странным образом. Ну, это можно исправить. Закроем эту таблицу и можем перейти в режим конструктора. Щелкнем на соответствующую кнопку. И, конечно же, мы можем отредактировать каждое название вот этих полей, подбирая для них более разумное название. Ну, сейчас мы этого делать не будем. Закроем это окно. Попробуем импортировать файл второй, который мы создавали в виде HTML страницы. Для этого опять щелкнем на правую кнопку мыши. Выберем пункт Импорт. И выберем вот этот файл Покупатели HTML-1. Щелкнем на кнопке Импорт. Ну, конечно же, появляется вот это опять стандартное окно, окно мастера. На этот раз у нас первая строка содержит заголовки столбцов. Поэтому поставим здесь флажок, в результате этот файл уже выглядит гораздо более разумно. Щелкнем теперь на кнопку Далее. Сохраним данные в новой таблице. Щелкнем на кнопке Далее. Каждое поле сейчас менять не будем, его описание. Далее. Таблица пусть называется Покупатели, например, HTML-1. И на этот раз в дополнительное окно выходить не будем. На эту кнопку не нажмем. А просто-напросто щелкнем на кнопку Готово. В результате, в нашей базе данных появилась вот такая таблица, таблица Покупатели HTML-1. Щелкнем на ней дважды и можно увидеть, что на этот раз у нас таблица импортировалась, конечно же, успешнее. Название полей, конечно же, отражает уже смысл, содержащихся в них данных. Закроем теперь эту таблицу. Попробуем установить связь с соответствующей таблицей, с таблицей HTML. Для этого щелкнем на правую кнопку мыши, как всегда. Щелкнем на пункте Связь с таблицами. Найдем таблицу типа HTML Для этого выберем HTML документ. Ну, выберем какой-либо из этих двух файлов. Выберем, например, вот этот файл Покупатели HTML-1. Щелкнем на кнопке Связь. Ну, нам предлагают опять выбрать первую строку. Она содержит или нет заголовки. Щелкнем на этом пункте. Ну, конечно же, нам нужно пройти по всем окнам соответствующего мастера. Ну, точно так же, как в случае с импортом. Щелкнем на кнопку Далее. Ну, описание полей менять не будем. Опять Далее. Как мы видим, мы теперь можем выбрать имя для нашей таблицы. Например, назовем его Покупатели-2. Щелкнем на кнопку Дополнительно. И здесь можем выбрать еще дополнительные параметры. Ну, можем выбрать язык, кодовую страницу, можем опять-таки убрать какие-то поля из соответствующей нашей таблицы. Например, поставим флажок на вот эти поля. Щелк нем на кнопку ОК. Щелкнем сейчас на кнопке Готово. И, как мы видим, завершилось связывание таблицы Покупатели-1 с соответствующим HTML файлом. Щелкнем на кнопку ОК. И вот, как мы видим, появилась вот эта новая строка Покупатели-1, которая, как мы видим, является HTML файлов, что видно из вот этого значка. И она является связанным файлов, что видно из вот этой стрелки. Если мы щелкнем на вот этой строке дважды, то, конечно же, появляется вот такая соответствующая таблица, которая, конечно же, повторяет соответствующие данные в HTML странице. Правда надо отметить, что редактировать эту таблицу мы не сможем. Мы можем только ее просматривать. Если мы попробуем что-либо изменить, то нам компьютер это не даст. Точно так же, как не дает нам и добавляет новые записи. Дополнительные строчки для ввода новой записи в нашей таблице сейчас нет. Закроем эту таблицу и вернемся в обычный режим Microsoft Access.
112
TeachPro Microsoft Access 2003
4.4. Формат XML, Специфика реализации импорта, экспорт Рассмотрим, как наша программа взаимодействует с форматом XML это расширенная спецификация языка. И этот формат достаточно сейчас широко распространен. Попробуем для начала экспортировать какой-либо из таблиц, которые у нас уже есть в этот формат. Например, экспортируем вот эту таблицу Покупатели. Для этого, как всегда щелкнем на правую кнопку мыши и выберем пункт Экспорт. Вот, появилось стандартное окно для экспорта объектов, в котором, во-первых, надо выбрать то место, в которых мы хотим экспортировать наши файлы. Например, создадим новую папку. Для этого щелкнем на кнопке создания новой папки и выберем для нее название ХML. ОК. А теперь выберем тип файла. Ну, конечно же, нам этот тип файла сейчас не нужен. Поэтому щелкнем на вот этом ниспадающем списке и найдем здесь формат XML, который находится практически в самом конце списка. Вот этот формат. Далее щелкнем на нем. И согласимся в принципе с именем файла Покупатели, которое нам автоматически предлагает нам наш компьютер, и щелкнем на кнопке Экспорт. В результате появляется вот такое окно, в котором нам нужно выбрать несколько опций, которые влияют на то, как мы будем экспортировать нашу таблицу. Ну, мы можем выбрать экспортирование только данных, при этом создается один файл XML с данными, которые находятся внутри нашей таблицы. Можем также создавать схему наших данных, файл с таким расширением. А также можем создавать специальный файл презентацию данных, который будет, так сказать, надстройкой, над этими двумя файлами с данными и которые будут представлять собой визуализацию наших данных. Поставим сейчас флажок на всех трех возможностях, для того чтобы получить файлы всевозможных вариантов и оценить их возможности. Кроме этого, здесь есть еще кнопка дополнительная, при помощи которой можно установить еще различного рода параметры, влияющие на этот процесс. Ну, щелкнем на этой кнопке. В результате появляется вот такое окно с тремя вкладками, на которых мы можем выбрать, например, папку для экспорта нашего файла. Ну, как мы видим, мы хотим экспортировать по такому пути, в результате чего должны получить файл Покупатель с расширением XML. Ну, конечно же, щелкнув на кнопку Обзор, мы можем изменить и путь, и название для этого нашего файла. Кроме этого мы можем поставить или снять флажок с пункта Экспорт данных. Ну, конечно же, лучше все-таки оставить и, кроме этого, мы можем включить данные для экспорта таблицу Покупатель или же нет. Но, сейчас, как мы видим, мы можем копировать все записи из вот этой таблицы. Ну, кроме этого можем выбрать кодировку для наших таблиц. Все это, в принципе сейчас трогать не будем и перейдем на следующий пункт, пункт Схема, в котором мы можем выбрать все те параметры, которые влияют на следующий файл, файл с расширением XSD. В нем мы, как видно, можем включить сведения о ключе и индексе, или не включать. Мы можем, экспортировать всю эту схему или нет. Ну, лучше, конечно же, оставить, чтобы получить и этот файл тоже. Ну и кроме этого, мы можем внедрить схему в документ XML с данными, если мы поставим здесь переключатель. Тогда вот этот отдельный файл не будет создаваться, а, так сказать, оба файла будут объединены в один файл с расширением XML. Но лучше, конечно же, в принципе, по крайней мере, в данном конкретном случае создать два различных файла, чтобы мы могли затем оценить отличие этих двух файлов и данных, которые в них находятся. Ну и, конечно же, щелкнув на кнопку Обзор, мы можем изменить путь, по которому хотим сохранить этот файл. Сейчас этого делать не будем, посмотрим следующую, последнюю вкладку, в
Глава 4. Подробнее о таблицах. Импорт и присоединение таблиц (проф.)
113
которой мы можем настраивать все те параметры, которые отражаются на файле с расширением XSL, на файле презентации. Ну, как мы видим, мы можем, во-первых, конечно же, отменить создание этого файла или оставить, в зависимости от того, стоит или нет здесь эта флажок. Ну и кроме этого, мы можем задавать этот файл, как файл HTML или же, как файл ASP. Щелкнем в результате всех этих настроек на кнопку ОК. И в результате компьютер вполне успешно экспортировал нашу таблицу Покупатели в XML формат. Посмотрим, что у нас получилось. Откроем для этого папку Мои документы. Вот эта папка появилась перед нами. Щелкнем сейчас на папке XML, в которой находятся наши файлы, и можно увидеть все те файлы, которые в результате создал наш компьютер. Сначала, конечно же, он создал основной файл, файл Покупатели, с расширением XML, в котором и находится практически все данные из нашей таблицы. Кроме этого, он создал еще и таблицу стилей, таблицу XSD, ну и таблицу HTML файл Покупатели, в котором мы можем видеть уже все данные в обычном формате. Ну, посмотрим все эти файлы. Ну, например, посмотрим сначала вот этот XML файл. Для того чтобы увидеть его, как он выглядит. Щелкнем на нем дважды, чтобы его открыть. Вот открылся Microsoft Explorer и в нем, как мы видим, находятся все те данные, которые есть в нашей таблице. И как мы видим, они оформлены в виде так называемых тегов. Каждая из ячеек данных, из нашей таблицы оформлены внутри соответствующих тегов, в которых сохраняется информация о полях, в которых находится эта ячейка. Как мы видим, это файл достаточно большой и листая вверх вниз можно увидеть все те данные, вместе с соответствующей структурой таблицы, которые в нем содержатся. Закроем теперь этот файл. Щелкнем на вот этом крестике. Сейчас мы можем рассмотреть второй файл, файл Покупатели с расширением XSL, в котором находится таблица стилей. Если мы на нем щелкнем дважды, то появляется вот такой файл, в котором внутри тегов находится вся служебная информация о нашей таблице. А именно, какой шрифт использован в нем, какие в нем находятся поля, названия, центрирование каждого из полей, ну и т.д. Закроем теперь эту таблицу. А ниже находится еще один файл, файл с расширением XSD, в котором тоже находится сложная информация о нашей таблице. Как мы видим, в этих трех файлах расположена вся информация о нашей таблице и ее, так сказать, наполнении. А вот, чтобы посмотреть, как вся эта таблица будет непосредственно выглядеть, так сказать, в нормальном, табличном виде, для этого существует специальный файл Покупатель в формате HTML, который и является заголовочным файлом, файлом надстройки нашей таблицы данных. И в котором уже можно видеть все в нормальном виде. Щелкнем дважды на этом файле. И вот в таком виде, конечно же, таблица выглядит привычнее. Здесь есть все те поля, которые существовали в нашей таблице и, конечно же, все наши данные тоже. Закроем теперь это окно, закроем эту папку тоже и вот мы вернулись в обычный стандартный вид программы. Рассмотрим теперь, как можно провести обратную операцию. А именно, импортировать наши данные, которые находятся в формате XML. Для этого, как всегда, щелкнем на правую кнопку мыши. И выберем пункт Импорт. Появляется вот такое стандартное окно для импорта, в котором откроем вот эту папку XML. Щелкнем на нем дважды. Ну, пока, конечно же, наши файлы не видны, поскольку у нас открыты не те типы файлов. Но для того чтобы их увидеть, щелкнем на этом выпадающем списке и доберемся до XML форматов. Щелкнем. Как мы видим, компьютер нам позволяет импортировать из двух типов файлов. Из Покупатели с расширением XML и из файла Покупатели с расширением XSD. Посмотрим для начала первый из этих файлов. Щелкнем на нем дважды. Появляется вот такое стандартное окно для импорта XML файлов. В нем мы можем видеть таблицы, которые сконцентрированы у нас в этом файле.
114
TeachPro Microsoft Access 2003
Как мы видим, здесь у нас есть одна таблица Покупатели. В принципе, так мы и ожидали. Если мы раскроем, щелкнув на вот этом плюсе, то можно увидеть. Какие поля у нас присутствуют в этой таблице. Рассмотрим еще вот эту кнопку Параметры, которая находится в правой части этого окна. Если мы на нем щелкнем, то появляются вот такие дополнительные пункты, в которых мы можем выбрать, что мы хотим импортировать из этого XML формата. Хотим ли мы импортировать только структуру. В этом случае все внутреннее содержание таблицы пропадет и у нас создастся только абсолютно пустая таблица, в которой сохранится только информация о полях данной таблицы. Ну и хотим ли мы сохранить только данные из таблицы, добавив ее в уже существующую. В этом случае мы импортируем только данные и хотим ли мы создать и структуру, и данные внутри этой таблицы. Сейчас выберем как раз этот вариант и щелкнем на кнопку ОК. Ну и, как можно увидеть, программа успешно импортировала нам этот файл. Щелкнем на кнопку ОК. И, как мы видим, появилась дополнительная таблица, таблица Покупатели 1, в которой и сконцентрированы все наши данные из нашего формата XML. Посмотрим, к чему привело наше двойное преобразование из нашей таблицы в формат XML и обратно. Для этого щелкнем дважды на вот этой таблице Покупатели-1 и можно увидеть, что в принципе наша таблица выглядит достаточно стандартно и обычно, так же как она и была до наших преобразований. Закроем эту таблицу. И попробуем опять импортировать из формата XML. Для этого щелкнем на правую кнопку опять. Щелкнем на пункте Импорт и выберем на этот раз второй файл, файл Покупатель XSD. Щелкнем на кнопке Импорт опять. Ну, вот появилось знакомое нам окно, в котором, как мы видим, у нас те же самые параметры. Только единственное отличие, это, что хотя мы можем раскрыть или наоборот свернуть поля, которые существуют в этой таблице, тем не менее, вот эту кнопку Параметры, мы использовать не можем. Как мы видим, она у нас не активна. Поэтому щелкнем на кнопку ОК. В принципе это единственное, что мы можем сделать в нашем конкретном случае и, как мы видим, импорт этого документа произошел достаточно успешно. Щелкнем на кнопку ОК и посмотрим, что у нас получилось. Получилось, конечно, то, что мы создали вот эту еще одну таблицу, таблицу Покупатели с индексом 2. Посмотрим, как выглядят данные в нем. Если мы щелкнем дважды. Вот, как мы видим, создалась таблица с этими же полями, но она абсолютно пустая. В принципе, так и можно было ожидать. Потому что в этом файле, в файле с расширением XSD сохраняется как раз именно структура таблицы, но не сами данные. Закроем эту таблицу теперь и вернемся в стандартный вид программы. Ну и отметим еще одно обстоятельство, а именно, импортировать данные из формата XML мы можем, а вот связать с ними данные, т.е. установить связь, мы не можем, в отличие от других табличных форматов. Если мы щелкнем на правую кнопку мыши и выберем пункт связи с таблицами, и посмотрим все форматы, которые поддерживают для связи, то, как мы видим, среди них файла с расширением XML у нас нет. Поэтому щелкнем на кнопку Отмена и вернемся в стандартный вид программы Microsoft Access.
Глава 5. Основы реляционных СУБД (общая часть).
115
Глава 5. Основы реляционных СУБД (общая часть) 5.1. Смысл многотабличных БД На этом уроке поговорим о многотабличных базах данных, об избыточных данных, присутствующих в таблице. Этот урок больше посвящен теоретическим основам работы с базами данных, а не конкретно работы с данной программой. Конечно же, все это мы будем проделывать именно в этой программе. Давайте, воспользуемся той базой данных, которая у нас есть и которую мы создавали ранее. Откроем в нем вот эту первую таблицу, таблицу Покупатели. Для этого, как всегда щелкнем на ней дважды. Вот она появилась перед нами. Как мы видим, в этой таблице у нас присутствует несколько полей. Это такие, как код покупателя, которые представляют собой уникальный номер каждого из записи. Это имя, фамилия, которое характеризует каждого персонажа в этой таблице. А также город, страну и телефон. Если приглядеться к этой таблице, то можно увидеть, что в полях этой таблицы, ну, разве что за исключением первого поля, кода покупателя, названия очень часто повторяются. Например, если мы посмотрим на поле Страна, то здесь, как мы видим, у нас везде Россия. И лишь в самом конце списка у нас идет страна Белоруссия. Ну и точно также можно посмотреть на поле Город. В нем, как мы видим, тоже есть повторяющиеся названия. Хотя, конечно же, не все названия одни и те же. Есть разные, но есть и повторяющиеся, которые, как мы видим, достаточно много. Эти поля, в принципе, достаточно большие. Это, как мы видим, текстовые поля. Давайте откроем эту же таблицу в режиме конструктора. Для этого щелкнем на вот эту кнопку на панели инструментов и вот, как мы видим, перед нами появилась структура нашей таблицы, в которой можно увидеть, что для нашей страны отведено текстовое поле размером 255 единиц. А для города отведено поле, которое является, скажем, так достаточно безразмерным полем. Но при этом, это поле достаточно неудобно, для работы, поскольку не позволяет его индексировать и производить с ним определенные действия. Поэтому изменим его тоже на текстовый. Например, выберем вот такую возможность. Как мы видим, у нас автоматически появился размер поля 50 единиц. Ну, щелкнем на кнопке Сохранить. Конечно же, в принципе, хотя нас компьютер предупреждает нас о том, что некоторые записи могут быть потеряны, тем не менее, мы уверены. Что больше 50 букв в городе все-таки вряд ли бывает, поэтому щелкнем на кнопке Да, и как мы видим, запись произошла успешно. Ну, а теперь отметим, что, конечно же, даже в том случае. Если у нас под город отводится 50 единиц, все равно это достаточно большое число. Особенно, если умножить на количество записи, которое в таблице могут быть не только несколько, несколько десятков, а может быть 1000 и 1000. А в случае со страной, у нас непонятное значение, если учесть размер этого поля, 255 умноженное на количество записей в нашей таблице, может получится очень большое число. Ну, в принципе, размер файла на жестком диске может быть не очень актуальным. Поскольку память дешевеет. И в современном мире компьютеров проблема памяти не так актуальна, как ранее. Но, тем не менее, проблема с размером файлов может возникнуть, особенно, если мы хотим обмениваться этой информацией по модему или по каким-либо другим устройствам связи, даже по локальным сетям, которые тоже в принципе обладают определенным ограничениям по скорости передачи данных. Ну и в этих случаях, конечно же, размер файла уже приобретает большую актуальность, и чрезмерная величина этого показателя будет негативно сказываться на общие скорости работы с данной таблицей.
116
TeachPro Microsoft Access 2003
Ну, все эти рассуждения нас приводят к тому, что неплохо было бы сделать как-либо так, чтобы как-либо уменьшить размер данных в наших таблицах, особенно если учесть, как мы расточительно потратили наше место в нашей таблице. Как мы видим, для того чтобы сохранить всего лишь две страны, Россию и Белоруссию, нам понадобилось 255 символов умноженное на количество строк в нашей таблице. А между тем нам достаточно было бы в каждой из записей сохранить какие-либо два числа. Например, 1 или же 2. Под 1 мы бы понимали одну страну, например, Россию, а под числом 2, вторую страну, Белоруссию. И в этом случае мы бы однозначно определили принадлежность каждой записи в отношении страны. Ну и, конечно же, в этом случае нам бы понадобилось гораздо меньше места. В принципе, для определения всех стран, нам бы достаточно было бы всего лишь один байт. Поскольку байт это число от 0 до 255, ну и стран в принципе, тоже вряд ли больше в современном мире. Если их всех пронумеровать, то как раз получится то, что нам надо. Закроем теперь эту таблицу в режиме конструктора и перейдем в обычный режим, режим просмотра записей. Для этого, конечно же, достаточно щелкнуть на вот этой кнопке Вид на панели инструментов. Вот перед нами появилась наша таблица. И теперь попробуем одну из этих двух полей город и страна, сформировать немножко по-другому. А именно, так сказать, вывести в отдельную таблицу, в которой будут перечислены все города, которые присутствуют у нас в таблице. А в нашей исходной таблице достаточно сохранить его, так сказать, код, его номер во второй таблице. Для этого можем воспользоваться такой возможностью, как запросы. Для того чтобы создать новый запрос, щелкнем на вот эту кнопку с ниспадающим списком и здесь появляются у нас всевозможные возможности по действию. Здесь вместе вот этот пункт Запрос. Щелкнем на ней, появляется окно с возможностями запроса, и возьмем первый из этих возможностей, возможность конструктора. Щелкнем на кнопку ОК. Появляется вот такая стандартная форма для конструирования нового запроса. В принципе, с возможностями запросов и конструктора запросов мы более подробно ознакомимся позднее. А сейчас воспользуемся этой возможностью, для того чтобы сформировать новую таблицу, таблицу городов. Выберем поле, по которому мы хотим сформировать этот запрос. Конечно же, это у нас поле Город. Все поля наши таблицы мы можем видеть вот в этом ниспадающем списке полей. Выберем город. Конечно же, имя таблицы у нас Покупатели, которое автоматически появляется в соответствующем поле. Остальные элементы запроса мы сейчас трогать не будем, и определимся с видом нашего запроса. Для этого щелкнем на вот этой, кнопке, с ниспадающим списком, тип запроса, и выберем пункт Создание новой таблицы. Щелкнем. Для нашей таблицы нам нужно задать имя. Имя возьмем просто-напросто Города, поскольку мы хотим ввести все города, которые у нас присутствуют в нашей таблице. Конечно же, сохраним их в текущей базе данных. Хотя в принципе, мы можем выбрать сохранение в другой базе данных. Ну, сейчас пусть останется, как есть. Щелкнем на кнопке ОК. И теперь определимся с еще одним параметром, а именно, хотим ли мы, чтобы все записи в нашей новой таблице были уникальными. А в противном случае, если мы сейчас оставим все, как есть, мы в нашей будущей таблице получим 375 записей, так же. Как было в исходной таблице. Просто-напросто все поля этой таблицы перекачивают в новую таблицу. Ну, это в принципе не то, что сейчас нам нужно. Нам нужны уникальные записи. Т.е. просто-напросто список городов, использованный в нашей таблице. Поэтому щелкнем на правую кнопку мыши в нашем запросе и выберем его свойства. И здесь, как мы видим, мы можем установить уникальное значение для нашей новой таблицы. Поэтому щелкнем на ниспадающем списке и изменим свойства Нет на свойства Да. Нам нужны только уникальные значения. Закроем теперь эти свойства. Все остальные возможности оставим, как есть.
Глава 5. Основы реляционных СУБД (общая часть).
117
Теперь нам нужно создать по нашему уже сформированному запросу новую таблицу. Ну, для этого нам нужно щелкнуть на вот эту кнопку запуска выполнения запроса. Надо сказать, что выполнение запросов в любой базе данных может занимать определенное количество времени и даже достаточно большое. Щелкнем сейчас на кнопку Запуск. Ну, как мы видим, в новую таблицу будем помещено 185 записей, о чем нас предупреждает программа. Ну, как мы видим, 185 это меньше, чем 375, что связано с тем, что в нашей исходной таблице есть, конечно же, повторяющиеся записи. Некоторые города встречаются несколько раз. Сейчас щелкнем на кнопку Да, в результате в нашей базе данных появилась новая таблица, таблица Города. Если мы на ней щелкнем дважды, то можем увидеть, все те города, которые используются в нашей базе данных. Как мы видим, они у нас сейчас расположились по алфавиту и, как мы видим, каждая запись является уникальной, независящей от соседней записи. Теперь же изменим вид этой таблицы. Перейдем в режим конструктора. Для этого щелкнем на вот эту кнопку. Ну, можно увидеть, что у нас этот город занимает 50 единиц и является текстовым полем. Добавим новое поле, поле Счетчик. Для этого встанем на вот это первое поле. Щелкнем на правую кнопку мыши и выберем пункт Добавить строки. Ну, как мы видим, у нас добавилась одна строка, в которое введем название этого поля. Ну, пусть это будет у нас код города. Ну, после того, как мы ввели название для него, введем тип данных. Ну, текстовый нам сейчас не нужен, а выберем Счетчик из вот этого ниспадающего списка. Сохраним эту таблицу. Щелкнем на кнопку сохранения и перейдем в обычный режим, режим просмотра таблицы. Ну, как мы видим, около поля Город появился код города, и все наши города перенумеровались соответствующим автоматическим счетчиком. Закроем теперь эту таблицу. Попробуем то же самое сделать с другим полем нашей исходной таблицы. А именно с полем Страна, в котором, как мы видим, достаточно много информации дублируется. У нас всего две страны, которые использованы в нашей базе данных, а занимают они достаточно большое пространство. Ну, сейчас сконструируем новый запрос. Для этого, конечно же, опять щелкнем на вот этой кнопке нового запроса, выберем конструктор. Щелкнем на кнопке ОК. Выберем в качестве поля страну. С именем таблица согласимся, что это у нас, конечно же, Покупатели. Далее опять выберем тип запроса создание новой таблицы. Выберем для новой таблицы имя. Это у нас, конечно же, будет Страны. Щелкнем на кнопке ОК, сохраняя эту таблицу в текущей базе данных. Щелкнем на правую кнопку мыши на нашем запросе. Рассмотрим его свойства и в нем, конечно же, выберем уникальное значение, для того чтобы у нас появились новые таблицы, только уникальные записи из старой таблицы. Только те страны, которые не повторяются. Поэтому вместо Нет поставим здесь Да в уникальных записях. Закроем это свойство запроса и выполним его. Для этого, конечно же, нужно щелкнуть на кнопке выполнения запроса. И появляется вот такое стандартное предупреждение, о том, что, как мы и ожидали, в новой таблице будет помещено всего лишь две записи. У нас стран всего лишь две. Это Россия и Белоруссия. Щелкнем на кнопке Да. В результате чего у нас задалась новая таблица. Закроем этот запрос. Он нам уже не нужен, и можно его не сохранять. Перейдем в нашу таблицу и в нем, наряду с городом, появилась еще и таблица страны. Щелкнем на ней дважды, и вот перед нами вот эта таблица, которая содержит всего лишь две записи Белоруссия и Россия. Введем здесь опять автоматически счетчик. Для этого перейдем в режим конструктора. Далее введем новую строчку. Выделим первую строку. Правая кнопка мыши и добавить строки. Введем код страны. Тип данных у нас будет Счетчик. Сохраним. Откроем в режиме таблицы и можно видеть, что у нас обе страны, конечно же, перенумеровались. В принципе, конечно же, для такой маленькой таблицы все это можно было сделать и вручную. Но в достаточно большой таблице, конечно же, автоматический счетчик, это достаточно удобная вещь.
118
TeachPro Microsoft Access 2003
5.2. Создание многотабличных БД Закроем теперь эту таблицу и откроем старую таблицу, таблицу Покупатели. И в нем теперь введем две новые колонки. В принципе, уже понятно, какие колонки нам нужны из логики предыдущих наших рассуждений. Это, конечно же, код города и код страны, по которым мы и будем связывать вот эту нашу исходную таблицу с новыми таблицами. Для этого, конечно же, нам нужно открыть эту таблицу в режиме конструктора. Щелкнем на вот эту соответствующую кнопку, введем перед страной новое поле. Щелкнем на правую кнопку мыши и выберем пункт Добавить строки. Это у нас, конечно, это уже будет код страны. Тип данных текстовый нас сейчас, конечно, не устроит, как можно понять из той цели, которой мы хотим достичь. А именно, связать эти две таблицы. Код страны, конечно же, является целым числом. Счетчик в нашем конкретном случае нас тоже не устраивает, поскольку автоматический пересчет всех записей в этой таблице нам ничего не даст. А нам нужен просто-напросто числовой тип. Поэтому так и выберем Число. Пусть будет длинное целое, как и есть. Это нас вполне устраивает. Добавим еще новую строку перед городом, который у нас будет код, конечно же, города. Для этого щелкнем на правую кнопку мыши и выберем пункт Добавить новую строку. Далее код города. Это у нас тоже будет числовой тип. Выберем из вот этого ниспадающего списка соответствующую возможность. И сохраним эту таблицу. Щелкнем на кнопку сохранения. Если мы рассмотрим эту таблицу в режиме обычного просмотра записи, то можно увидеть два новых поля, которые, конечно же, пока пусты. Для того чтобы заполнить вот эти два поля, в принципе, конечно же, это можно сделать вручную. Например, все достаточно просто с кодом страны. Все те записи, в которых у нас есть Россия, мы должны проставить там цифру 2, а где Белоруссия, цифру 1. Конечно же, это можно сделать и вручную, но это достаточно неудобно. Конечно же, было интереснее это все сделать автоматически. Для этого у нас достаточно возможностей, и как раз для этих целей мы вполне можем воспользоваться возможностями запросов. Создадим новый запрос. Для этого щелкнем на вот этом ниспадающем списке. Выберем пункт Запрос. Выберем новый запрос в режиме конструктора. ОК. Появился вот этот новый запрос, в котором, как мы видим, у нас одна таблица, таблица Покупатели. Нам нужно связать эту таблицу с другой таблицей. Для начала, например, с кодом страны. Ну, для этого надо добавить здесь вторую таблицу. Для этого щелкнем на правую кнопку мыши и выберем пункт Добавить таблицу. Как мы видим, здесь перечислены у нас все таблицы, которые у нас есть в нашей базе данных, и выберем здесь таблицу Страны. Щелкнем на кнопке Добавить. Закроем это окно добавления страницы и, как мы видим, у нас обе эти таблицы появились перед нами. Немного расширим эту таблицы и сделаем так, чтобы нам было удобнее с ними работать. Теперь нам нужно вот эти две таблицы связать друг с другом. Ну, конечно же, понятно, что связывать мы будем по коду страны. Эти два поля у нас идентичны в обеих таблицах. Обновлять мы все это будем, конечно же, по равенству информации в поле Страна в таблице Покупатели и в поле Страна в таблице Страны. Для этого достаточно схватить вот это поле Страна в одном из таблиц и потащить его в другую сторону. В сторону Страны. Далее отпустим, и как мы видим, вот эти две таблицы стали связанными друг с другом, вот такой линией, связав соответствующие поля. Теперь же заполним так сказать сущность нашего запроса. Конечно же, обновлять мы должны поле Код страны, поэтому схватим вот это поле и перетащим его в наш конструктор запросов. Вот сюда. Ну, конечно же, имя таблицы сразу же появилось в таблице Покупатели. Изменим теперь и тип нашего запроса. Конечно же, у нас тип запроса будет обновление.
Глава 5. Основы реляционных СУБД (общая часть).
119
Ну и далее, нам нужно задать источник данных для нашего поля. Ну, конечно же, источником данных у нас будет код страны из вот этой таблицы. Для этого напишем таким образом. В квадратных скобках имя нашей таблицы Страны, далее восклицательный знак и имя поля внутри этой таблицы, которую тоже поставим в квадратные скобки. Это у нас, конечно же, код страны. Вот теперь у нас уже готово и это поле. Проведем теперь выполнение нашего запроса, выполнение обновления. Для этого щелкнем на кнопке запуска. Как мы видим, будет обновлено 375 записей. Ну, конечно же, у нас всего 375 записей и есть в исходной таблице. Т.е. обновлены будут все записи. Щелкнем на кнопке Да. И если мы сейчас переключимся на нашу таблицу, таблицу Покупатели, то можно увидеть, что у нас код страны зафиксировался в соответствующем поле. Как мы видим, около Россия стоит 2, а если сдвинемся вниз, то около Белоруссии стоит код 1. Т.е. у нас код заполнился достаточно успешно. Проведем ту же самую операцию со вторым полем, полем кода города. Здесь у нас более сложная, конечно же, обстановка. Т.е. вместо двух возможностей 1и 2, здесь уже гораздо больше. И вручную это уже, конечно же, не обработать. Поэтому выполним запрос, здесь тоже щелкнем на кнопке создания нового запроса. Выберем, конечно же, конструктор. Щелкнем на кнопке ОК. Добавим новую таблицу. Для этого правая кнопка мыши. Выберем пункт добавления таблицы. Добавить таблицу. Конечно же, в качестве таблицы нам нужны таблица городов. Щелкнем на кнопке Добавить. Закроем. Ну, а теперь нам нужно связать эти две таблицы друг с другом. Конечно же, связывать мы будем на этот раз по городам. Для этого схватим Город из одной из таблиц, перетащим во второй. И как мы видим, эти две таблицы связались друг с другом. Далее код города из первой таблицы, таблицы Покупатели перетащим в имя нашего запроса, в соответствующее поле. Далее изменим тип запроса. Вместо выборки зададим изменение обновления. Для этого щелкнем на вот этой кнопке ниспадающего списка. Выберем обновление. И в качестве параметра для нашего обновления, выберем код города из нашей второй таблицы, таблицы города. Поэтому, так же как и в предыдущем случае в квадратных скобках напишем имя нашей второй таблицы, таблицы Города. Далее восклицательный знак и внутри квадратных скобок поле из второй нашей таблицы. А именно, код города. Вот, это мы тоже заполнили. А теперь осталось выполнить этот запрос. Для этого опять-таки щелкнем на вот этой кнопке запуска нашего обновления. Ну, как мы видим, опять будет обновлено 375 записей, т.е. вся таблица. Щелкнем на кнопке Да. Закроем этот запрос. Сохранение нам этого запроса не нужно. Щелкнем на кнопке Нет. И можно увидеть, что в поле код города у нас появились соответствующие цифры, каждая из которых соответствует соответствующему городу. Ну, конечно же, там, где у нас одинаковые города, код города тоже одинаковый. Ну и, конечно же, надо ожидать, что вот эта цифра 45, которая вставила в соответствующую запись в поле Код города, соответствует тому числу, которое стоит около города Зеленоград в таблице городов. Если теперь приглядеться к нашей таблице, таблице Покупатели, то вполне можно определить, что здесь у нас есть дублирование информации. А именно, та информация, которая находится в поле Город, так сказать, в скрытом виде хранится и в другом поле. Поле Код города. Поскольку каждой цифре, которая здесь написана, соответствует соответствующий город, а список городов у нас хранится в отдельной таблице. Т.е., посмотрев на соответствующую запись, здесь можно определить код города, например, 131, и по этому коду города в другой таблице, в таблице городов найти соответствующий город. Т.е. информация однозначно определяется в каждой записи. Поэтому понятно, что вот это поле,
120
TeachPro Microsoft Access 2003
поле Город у нас уже абсолютно лишнее. Поэтому можем его выделить. Щелкнуть на правую кнопку мыши и выбрать в контекстном меню пункт Удалить столбец. В принципе, нам программа предлагает подтвердить выбранные нами действия. Щелкнем на кнопке Да и в результате это поле бесследно исчезает с нашей таблицы. Аналогичную операцию проведем и со страной, поскольку точно так же, как и с городом, у нас для страны тоже зарезервировано рядом поле, поле Код страны, в котором в виде цифры хранится номер нашей страны в другой таблице, таблице стран, в которой, как мы помним, под номером 1 у нас идет Белоруссия, под номером 2, Россия. Т.е. определение страны опять-таки однозначно. Поэтому удалим это поле тоже. Оно у нас тоже лишнее. Для этого после выделения щелкнем на правую кнопку мыши. И выберем пункт Удалить столбец. Подтвердим это действие и в результате, как мы видим, наша таблица стала меньше по объему. Оно и понятно. Вместо двух полей, текстового типа, в которых у нас хранились названия городов и названия стран, в принципе достаточно объемное. Текстовая информация у нас сохраняется теперь всего лишь его численное значение. Код города и код страны, что, конечно же, в памяти компьютера на нашем жестком диске занимает меньше места. Это облегчает работу с этими таблицами и намного ускоряет выполнение различного рода запросов. А информация, тем не менее, полностью сохранена в наших таблицах. Для того чтобы это посмотреть, откроем все наши нужные нам таблицы. Закроем запросы. Они нам не нужны. Вот наша исходная база данных и в нем, как мы видим, есть еще таблица городов. Вот она. И еще одна таблица, таблица стран. И в принципе, вот эти три таблицы у нас однозначно определяют информацию каждой записи в нашей таблице Покупатели. В нем, как мы видим, если мы возьмем какую-либо запись, можем выбрать код города по коду города Найти соответствующую запись в списке городов. Вот, например, этот город 45, Зеленоград. Можем выбрать код страны, соответствующий нашей записи и найти его тоже в соответствующей таблице стран. Т.е. полная информация у нас сохранена в нашей базе данных. При этом, как мы видим, мы сделали достаточно большую экономию места и избавились от избыточной информации, которая у нас была в нашей таблице. Правда, как мы видим, у нас уже вместо одной таблицы образовалось три, которые связаны между собой соответствующим образом, через поля Код страны и Код города. Т.е. таким образом, мы провели нормализацию наших таблиц. Т.е. разбиение на таблицы, каждая из которых состоит из простых таблиц, а полная информация получается путем комбинации всех этих таблиц вместе.
5.3. Мастер нормализации Access Мы уже познакомились с основными видами таблиц, с так называемыми плоскими таблицами, которые не зависят от других таблиц, и информация в которых сосредоточена внутри нее же, и с нормализованными таблицами, когда информация о базе данных хранит не в одной таблице, а в нескольких, которые являются связанными между собой. В частности рассмотрим опять нашу таблицу Покупатели, в которой, как мы видим, наряду с кодом покупателей, именем и фамилии, есть еще несколько полей. Это поле Город и поле Страна и телефон. И как мы можем видеть, и в поле Город и в поле Страна, одна и та же информация повторяется много раз. Что вызывает, конечно же, разбухание места, которое занимает вот эта таблица на жестком диске, в связи с тем, что в нем хранится абсолютно лишняя информация. Конечно, гораздо проще было бы ввести еще одну таблицу, в сохранены всего две записи Россия и Белоруссия, которая и используется в этом поле. А в поле Страна, которое находится вот в этой таблице, сохранит всего лишь одно числовое значение, в зависимости от того, какую страну мы хотим поставить в соответствии какой-либо записи в нашей таблице. Мы уже проводили аналогичную операцию вручную.
Глава 5. Основы реляционных СУБД (общая часть).
121
А теперь посмотрим, какие возможности есть по автоматизации этого процесса. Для этого закроем сначала эту таблицу и перейдем в обычный вид нашей базы данных. И далее щелкнем на пункте меню Сервис и далее Анализ, в котором у нас есть пункт Таблица. Щелкнем на нем. Появляется вот такой мастер, который поможет нам нормализовать нашу таблицу. Т.е. разбить одну таблицу на несколько независимые друг от друга таблицы, и связать их затем друг с другом, таким образом, что мы избавимся от ненужного дублирования одной и той же информации. На первой странице этого мастера нам показывают недостатки таблиц, в которых повторяются одни и те же данные. Как мы видим, если мы вводим в какое-либо поле одну и ту же информацию, то, конечно же, имеется достаточно большая вероятность возникновения опечатки при заполнении соответствующего поля. В частности, вот в этом поле опечатка, в результате чего информация искажена и сохранена неправильно. Ну и, как мы видим, в следующем поле, у нас просто-напросто сведения о соответствующем поле повторяется несколько раз, что тоже вызывает определенное неудобство, поскольку занимает место на жестком диске. Далее нам этот же мастер показывает, к чему могут привести и первое, и второе неудобство. Достаточно щелкнуть на кнопке Пример. И можем видеть, что каждая запись для таблиц содержит имя поставщика, его адрес и сведения повторяются много раз. А второй пример, тоже показывает, что в результате вот этой ошибки и опечатки, мы можем при подсчете, например, числа записей, в которых имеется вот такая информация, мы вместо 4, что можно было бы ожидать. Получим цифру 3. Что, конечно же, вызвано вот этой опечатки, и что, конечно же, достаточно неудобно. Именно поэтому возникает желание уйти от такого рода ошибок и привести нашу таблицу к нормализованному виду, в которых вот таких повторений не будет. Поэтому щелкнем сейчас на кнопку Далее и мы перешли к следующему окну нашей таблицы, в которых опять-таки нам разъясняют цели, которые преследует наш мастер. Ну, как мы видим, у нас вместо одной таблицы, которая была на предыдущей странице, будет несколько страниц. Ну, а о подробности работы с этими несколькими таблицами, разъясняются на примере, которые показаны на этой же странице и на примерах, которые можно вызвать, щелкнув на соответствующую кнопку на этой странице. На первую и на вторую кнопку. Каждый раз вызывается соответствующий пример, который разъясняет соответствующий аспект этой проблемы. Как мы видим, если мы таблицу разобьем на несколько таблицы, то мы можем одновременно заполнять сведения в этих таблицах, так же как показано в первом примере, обновлять данные в одном месте. При этом будут обновляться данные во всех таблицах одновременно. После вот такой вводной части, можем щелкнуть на кнопке Далее и перейти уже непосредственно к модернизации нашей таблицы. Ну, перво-наперво нам нужно выбрать ту таблицу, именно которую, мы хотим модернизировать из тех таблиц, и которые у нас есть в базе данных, и которые отображаются вот в этом окне таблицы. Ну и также можем вывести страницы с пояснениями или же не поставить здесь флажок. В этом случае первые два окошка, которые мы только что видели. Будут пропущены. Конечно же, если мы достаточно хорошо представляем себе работу с базой данных, то эти пояснения можно было бы и пропустить. В принципе, лучше оставить здесь флажок, для того чтобы более четко представлять собой, что мы хотим и можем сделать. Ну, выбрав вот эту таблицу Покупатели, щелкнем на кнопке Далее и перейдем к следующей странице, в которой нам требуется выбрать всего лишь две возможности. А именно, разделение полей выполняется мастером, или же разделение полей выполняется вручную. Для начала выполним это разделение полей с мастером, который автоматический нам разобьет таблицу на несколько таблиц. Посмотрим, как он это сделает. Щелкнем на кнопке Далее. И вот, на следующей странице, странице мастера уже можно видеть первый результат выполнения некого
122
TeachPro Microsoft Access 2003
действия над нашей таблицей. А именно, как мы видим, наш мастер разбил нашу исходную таблицу, таблицу Покупатели на 4 таблицы. Рассмотрим теперь подробнее, что же наш мастер сделал с нашей таблицей. Прежде всего немножко раздвинем эти таблицы, приведем к более удобному виду и можно увидеть, что из нашей исходной таблицы исчезли поля, связанные с городом, со страной и с именем. А вместо этого появились соответствующие три таблицы, в которых сконцентрирована информация о стране, о городе и об имени. В принципе, эти три поля как раз и являются теми полями, в которых и сконцентрирована вся наша повторяющаяся информация. Мы можем, конечно же, закрыв глаза согласиться со всеми этими изменениями, сделанные мастером, но лучше, конечно же, подойти к этому вопросу более творчески и проанализировать всю нашу ситуацию. В принципе, таблица с именем, которая нам создал компьютер, тоже можно оставить, но можно и убрать. Имя и фамилию оставить без изменения в нашей исходной таблице, а не выделять имя в отдельную таблицу. Для этого мы можем схватить имя, которое находится вот в этой таблице и перетащить его обратно в нашу исходную таблицу. Поскольку, именно таким образом, происходит уничтожение вот этой таблицы. Просто-напросто уничтожить эту таблицу мы не можем. Просто имя надо перетащить обратно. Поэтому схватим это имя. Перетащим его обратно. Причем перетащить надо именно на то место в нашей исходной таблице, где она должна стоять по порядку. Ну, вот в этом месте приблизительно, между кодом Покупателя и фамилией. Отпустим мышку, и как мы видим, вот эта дополнительная таблица, таблица с именем, исчезла с нашего окна. Теперь у нас таблиц осталось 3. Сконцентрируемся теперь на них. Здесь, как мы видим, у нас два поля, поле город и поле страна, которые выведены в отдельные таблицы. Но, если мы присмотримся к структуре, то можно увидеть, что поле страна является так сказать, связанной таблицей по отношению к вот этой таблице, таблице 2, в которой у нас сконцентрирована информация о городе. Конечно же, в принципе, можно и так оставить, поскольку информация о городе и о стране, в принципе, теоретически достаточно взаимосвязанные понятия. Но, можно сделать и несколько по-другому. А именно, сделать так, чтобы информация по стране непосредственно была отражена в исходной первой таблице. Для этого нам понадобиться уничтожить эту таблицу, а затем создать ее, как подтаблицу первой таблицы. Для этого нам нужно схватить вот эту страну поле, перетащить ее в ту таблицу, в которой она должна находиться. Прежде всего, перетащим ее обратно в таблицу 1. Как мы видим, у нас теперь осталось всего лишь две таблицы. Но страна теперь у нас попала в первую таблицу. Это нас тоже не устраивает. Ее надо выделить в отдельный, так сказать, мир. Ну, теперь уже понятно, что надо сделать. Надо схватить вот это поле страна и перетащить на пустое место в нашем окне. Вот, например, в это место. Отпустим мышку. И как мы видим, у нас образовалась новая таблица, таблица 3, в которой и сконцентрирована страна. Теперь у нас вот эта исходная таблица связана с двумя таблицами, в одной из которых сконцентрирована информация о городе, а во второй, информация о стране. Как мы видим, как только мы добавили вот эту таблицу со страной, у нас автоматически появилось окошко, в котором нам предлагают ввести имя для этой таблицы. Конечно же, имя таблица 3 достаточно пустое и ничего незначащее. И вместо этого имени, конечно же, лучше ввести более содержательное имя. Например, назовем это поле Страны. Далее щелкнем на кнопке ОК. Ну и, конечно же, это имя появилось, как заголовок этой таблицы. В принципе, точно также неплохо было бы переименовать название и вот этих двух таблиц. Выберем вот эту таблицу-2. Далее щелкнем дважды на вот этом заголовке.
Глава 5. Основы реляционных СУБД (общая часть).
123
Появляется вот такое поле, аналогичное тому, которое мы только что видели, для изменения имени этой таблицы. Для него тоже введем новое имя Города. Далее щелкнем на кнопке ОК. Ну и осталось первое имя, имя нашей исходной таблицы.
5.4. Исправление опечаток В принципе, конечно же, это имя тоже нужно было переименовать. Но сейчас пока оставим так, как есть. Поскольку теоретически, имя у этой таблицы, должно быть имя Покупатели. Поскольку Покупатели у нас уже есть таблица, эта наша старая таблица, которую мы преобразовываем, то, чтобы она не затерла старую, а возникла на новом пустом месте, оставим пока Таблица -1. Это в принципе желательно, поскольку после всех этих преобразований, старая таблица, таблица Покупатели у нас останется. И если нам что-либо не понравится во всех этих делах, мы можем все наши вновь созданные таблицы удалить и вернуться к исходному виду нашей базы данных для новой попытки его преобразования, более успешного. Сейчас, в общем, оставим вот это все, как есть и щелкнем на кнопке Далее. Ну и далее у нас появляется вопрос с ключевыми полями. Как мы видим, у нас у вот этих двух вновь созданных таблиц, у каждой из них есть ключевое поле с уникальным кодом, около каждой из которых стоит вот такой ключ, поэтому здесь ничего нам нового делать не стоит. Вот в первой, исходной таблице, как мы видим, ключевого поля нет. В принципе, из первоначального вида нашей таблицы, мы знаем, что код покупателя и должен быть ключевым полем. Т.е. тем полем, которое и определяет уникальность записи в данной таблице. Поэтому выделим это поле и щелкнем здесь на вот этом ключе. В результате, это поле приобретает статус ключевого. Ну, если бы у нас не было вот такого ключевого поля, то мы могли щелкнуть на вот этом плюсе, в результате добавить новое ключевое поле. Сейчас необходимости в таких действиях у нас уже нет. У нас все три таблицы имеют собственные ключевые поля. Щелкнем теперь на кнопку Далее, чтобы перейти к следующей странице нашего мастера. Далее возникла новая таблица, в которой компьютер предлагает нам после анализа наших исходных таблиц. Провести исправление в новых таблицах. В частности, в таблицах с городами, нам компьютер предлагает изменить те имена городов, которые, по его мнению, являются опечатками. В принципе, здесь достаточно произвольно компьютер, надо сказать, обращается с именами и с подозрительными на его взгляд городами. Ну, конечно же, вот те города, которые у нас были в исходной таблице, являются в принципе достаточно четко написанными и ошибок там не должно быть. Тем не менее, в принципе можно просмотреть, какие исправления нам предлагает компьютер. В принципе, перво-наперво он предлагает для вот этих городов, которые видны, в этой таблице, вставить те города, на которые мы хотим их заменить. Для этого достаточно щелкнуть на вот этом ниспадающем списке и выбрать какой-либо город из вот этого списка. Или же щелкнуть на Оставить, как есть, и в этом случае компьютер оставит все без изменения. В принципе, эти поля можно пропустить, и перейдем к концу этого списка, в котором уже можно увидеть, те города, для которых компьютер, так сказать, автоматически подобрал какие-то исправления. Надо сказать, что тоже достаточно странно, как можно видеть из этой таблицы. Поэтому лучше мы вернем все эти поля в исходное состояние. Для этого выделим, например, вот эту первую замену и вместо города Абакан, который, конечно же, в принципе достаточно произвольно выбран, щелкнем на пункте Оставить. Как есть. Ну и точно такую же операцию проделаем с остальными полями. Ну, конечно же, лучше использовать в этом случае клавиши клавиатуры, поскольку это будет более быстрая операция. Щелкнем на стрелку вниз, далее на пробел, в этом случае сразу же автоматически переходит это все на Оставить. Далее опять вниз, опять пробел, вниз, пробел, и т.д.,
124
TeachPro Microsoft Access 2003
как мы видим, мы достаточно быстро изменяем все эти неправильные действия компьютера и возвращаем всем городам, так сказать, его первоначальный вид. Вот, после всех этих изменений, перейдем к следующей странице. Щелкнем на кнопке Далее, и как мы видим, компьютер уже подошел к финишной странице, в которой нам предлагает еще и создать запрос для нашей базы данных. Этот запрос нам поможет связать эти несколько вновь созданных таблиц в единую структуру и далее работать именно с ней. В принципе, сейчас установим этот переключатель на кнопке Нет, т.к. у нас и есть, поскольку наша задача сейчас всего лишь создать новую структуру таблиц. Ну и еще один пункт, это вывести справку по работе с новой таблицей или запросом, или не выводить ее. В принципе, можем оставить здесь без галочки этот пункт, если мы достаточно уверены в наших силах и не хотим вызывать помощь программы. И в результате всех этих действий мы подошли к финишу нашей процедуры и можем щелкнуть на кнопке Готово. И вот можно видеть результат выполнения работы нашим мастером. Как мы видим, появилось это окно, в котором написано, что это все таблицы, созданные мастером. Щелкнем на кнопке ОК и обратим внимание на то, что мы видим на нашем экране. Здесь. Как мы видим, три таблицы, а это именно те три таблицы. На которые наш компьютер разбил нашу исходную таблицу, таблицу Покупатели. И в нем, как мы видим, есть таблица Страны, в которой у нас всего две записи. Есть таблица городов, которых достаточно много записей по числу городов, которые использованы в нашей исходной таблице. И далее у нас находится наша основная таблица, таблица Покупатели, в которой, как мы видим, отображены и город и страна, в которой проживает каждый из его персонажей. Немного расширим эту таблицу для того чтобы можно было видеть название соответствующего поля и теперь обратим внимание на вот эти плюсы, которые находятся около каждой из строчек вот в этих двух таблицах. А это именно те плюсы, при помощи которых мы можем узнать о всех записях вот этой исходной таблицы, таблицы Покупатели, в которых использована вот эта соответствующая страна или соответствующий город. Например, если мы щелкнем на вот этот плюс рядом с Абаканом, то можно увидеть все те записи, всех тех покупателей, которые живут вот в этом городе. Щелкнем на минусе. Точно также можно увидеть и покупателей, которые живут в каком-либо другом городе. Например, в Архангельске. Конечно же, тут информация у нас целиком не помещается, но можно прокрутить и посмотреть всю эту информацию вот таким образом, раскрывая эту таблицу целиком на все наше окно. Например, вот Покупатель из Белицка, из Бобруйска, ну и т.д., у нас даже есть покупатели из Восюков. Вернем эту таблицу к исходному виду. Щелкнем на вот этой кнопке восстановления. И попробуем воспользоваться теми преимуществами, которые сейчас дает нам вот это разбиение исходной таблицы на несколько таблицы. Представим себе ситуацию, когда какой-либо город, например, переименовали. Например, возьмем вот этот город, который у нас называется Гомель, и пусть его переименовали, например, в Гомель-2. Для этого достаточно приписать двойку. Далее щелкнем где-либо в другом месте и посмотрим на то место в нашей основной таблице, в которой был использован вот этот город. Для этого щелкнем на вот этом плюсе. Как мы видим, у нас из этого города персонаж с 315 номером и 316. Ну, так по этому показателю и найдем из нашей вот этой исходной таблицы соответствующие записи. Для этого прокрутим нашу таблицу вниз. И можно увидеть, что как мы и ожидали, и 315 и 316 записи преобразовались и вместо имени Гомель, в соответствующей ячейке появился город Гомель-2. Ну, конечно же, в принципе, это неправильно. Поэтому изменим это название обратно на Гомель. В принципе, у нас на вот этой таблице ничего не изменилось, но можно увидеть, что как только мы щелкнули на вот этой таблице, ее активизировали, то, конечно же, все изменения на ней зафиксировались.
Глава 5. Основы реляционных СУБД (общая часть).
125
При следующей же перерисовке, у нас название в этой ячейке появился правильным образом. Это в принципе и является преимуществом вот таких многотабличных баз данных, которые связаны между собой. Откроем теперь исходный вид нашей базы данных. Для этого щелкнем на вот этой кнопке. И можно увидеть, что здесь у нас есть наряду с исходными тремя таблицами, которые у нас были, появились, конечно же, новые таблицы города, страны и вот это имя таблица-1. В принципе, вот эта таблица Покупатели, если мы щелкнем на ней дважды, то можно увидеть, что это абсолютно та же самая исходная таблица. Которая сейчас является лишней. В принципе, ее нужно удалить. Переименовать вот эту таблицу-1 в Покупатели, и после этого наша база данных, конечно же, приобретет гораздо большую стройность. Не говоря уже о том, что любая работа с ней. Будет происходить гораздо быстрее. В связи с уменьшением его объема.
5.5. Использование мастера нормализации Access в ручном режиме На предыдущих уроках мы знакомились, как разбивать нашу таблицу, в которой есть какие-либо избыточные данные на несколько таблицы. Причем сначала мы это делали вручную, потом воспользовались мастером, который есть, и который автоматический разбил нам нашу таблицу, вот эту таблицу Покупатели на несколько таблицы. Опираясь на те повторяющиеся данные, которые есть в исходной таблице Покупатели. Попробуем сделать то же самое, но, воспользовавшись мастером, провести всю эту операцию вручную. Но для этого, щелкнем опять на пункте меню Сервис, далее Анализ, и здесь есть пункт Таблица. Щелкнем на ней. Появляется наш мастер, который на первых двух страницах, конечно же, опять нам дается некий справочный материал, который мы сейчас можем пропустить, поскольку мы ее уже читали ранее. Поэтому щелкнем на кнопке Далее. Опять страница с пояснительным материалом. Щелкнем опять на кнопке Далее и в результате мы попадаем в эту страницу, на которой уже нам нужно предпринять какие-либо действия, а именно выбрать эту таблицу, над которой мы хотим провести нашу нормализацию. Конечно же, это у нас таблица Покупатели, которая у нас сейчас и выделена, поскольку она у нас была выделена в исходном окне, в окне базы данных. Щелкнем сейчас на кнопке Далее и перейдем к следующей странице, в которой нам как раз нужно выбрать между разделением полей при помощи мастера и разделением полей вручную. Сейчас мы выберем второй пункт, поскольку автоматическое разделение мы уже использовали. И посмотрим, как это будет происходить в ручном режиме. Щелкнем сейчас на кнопке Далее и вот мы попадаем на следующую страницу, в которой, как мы видим, у нас всего лишь одна таблица, исходная. Никаких шагов по разбиению этой таблицы на несколько таблицы компьютер не предпринял и оставил это все для нас. Поэтому придется нам заниматься этим вручную. Расширим эту таблицу немного, чтобы все поля были перед нами. И теперь, те поля, которые, как мы знаем, являются кандидатами на создание новой таблицы, это, конечно же, поле город и поле страна. Выделим вот это поле город и перетащим его на свободное место. Ну и после того, как мышка превратилась в такую единицу в пиктограмме новой таблицы, отпустим ее. В результате можно увидеть, что на нашем окне появилась новая таблица с именем пока Таблица-2, в которой и сконцентрировалось поле Город. Введем имя для этой таблицы, которое в принципе, по умолчанию, как мы видим, является таблицей-2. Ну, если мы хотим согласиться с этим, мы можем щелкнуть на кнопке ОК. Ну, конечно же, лучше выбрать более вразумительное имя. Ну, введем опять имя Города. И щелкнем на кнопке ОК. Ну, вот теперь уже наша исходная таблица разбилась на две таблицы. На таблицу, в которой есть исходные поля и на ее подтаблицу Города. После этого мы можем любые поля перетаскивать
126
TeachPro Microsoft Access 2003
из одной таблицу в другую. Ну, конечно же, это должно быть оправдано. Ну, например, в принципе, мы можем вот это поле Страна перетащить из исходной таблицы в таблицы города, предполагая, что каждый город, конечно же, однозначно определяет страну, в которой она находится. Для этого мы можем ее перетащить, и в результате разбиение нашей таблицы на две таблицы, будет выглядеть вот таким образом. Во второй таблице, таблице города у нас будут сконцентрированы два поля, город и страна. Конечно же, лучше было бы создать отдельную таблицу для наших стран. Поэтому перетащим это поле обратно в первую таблицу и далее перетащим ее на свободное место в нашем окне. И вот в результате у нас образовалась другая таблица, в которой сконцентрированы все страны из нашей таблицы. Для нее, конечно же, тоже нужно выбрать более вразумительное имя, чем таблица-2. Введем для нее название Страны. Щелкнем на кнопку ОК. В результате, как мы видим, у нас образовалась вот такая структура нашей таблицы. В принципе можем выделить и еще какие-либо поля в отдельную таблицу или же перетащить из одной таблицу в другую. Это происходит достаточно просто, как мы видим. Достаточно, воспользовавшись перетаскиванием перетащить соответствующие поля из одной таблицу в другу., или же из какой-то таблицы на открытое место для создание новой таблицы. Для того чтобы переименовать какую-нибудь таблицу можем дважды щелкнуть на ее названии или же, выбрав эту таблицу, щелкнуть на вот этой кнопке переименование таблицы. В результате, в любом случае появляется вот такое окно, в котором мы можем ввести новое имя для этой таблицы. Кроме этого, мы можем определить ключевое поле для какойлибо таблицы, щелкнув на вот этой кнопке, или добавить ключевое поле, если, конечно же, его нет на нашей таблице. В частности, вот в этой первой таблице, как мы видим, у нас ключевого поля нет, в результате вот эта кнопка добавления ключевого поля стала активизированной. Ну, конечно же, добавлять новые ключевые поля сейчас смысла особого нет, вот в этой нашей исходной таблице. Поскольку мы точно знаем, что код покупателя является ключевым полем для нашей таблицы. Оно определяет уникальные записи в этой таблице. Поэтому щелкнем на вот этой кнопке определения ключевого поля. Как мы видим, вот этот ключ появился рядом с этим полем, что как раз и означает выполнение нужного нам действия, создание ключа к этому полю. Ну, теперь, после того, как мы все сделали в этой нашей таблице, щелкнем на кнопке Далее, и перейдем к исправлению опечаток для нашей таблицы, таблицы городов. Как мы видим, здесь опять все те же самые неприятности, которые у нас были при автоматическом создании и разбиении таблиц. Здесь много городов, в которых так сказать, компьютер сомневается. И в конце нашего списка, как мы видим, есть куча городов, к которым наш компьютер достаточно произвольно выбрал таблицу подстановок. Для того чтобы изменить эти действия, выбрав соответствующее поле, щелкнем на пробел. В результате переводим это поле на Оставить без изменения. И ту же самую операцию проделаем со всеми полями в этой таблице. Щелкая на кнопку вниз, переходя к следующей записи, далее на пробел, и т.д. в результате мы оставим без изменения все поля, в которых компьютер достаточно неоправданно хотел изменить название. Щелкнем сейчас на кнопку Далее. В результате мы приходим к финальному окну нашего мастера, в котором мы можем создать запрос для наших таблиц, если мы хотим это сделать, или же ответить на этот вопрос отрицательно и не создавать запрос. Сейчас мы так и сделаем. Нашей целью является только создание новых таблиц. И далее мы можем вывести или нет справку по работе с новой таблицей запроса. Достаточно неудобно, что такая справка у нас находится в самом конце работы нашего мастера. Лучше бы справку выводить до того, как мы проделали все наши действия. Но, тем не менее, структура этого мастера именно такая. Поэтому выводить сейчас справку не будем. У нас уже все создано. Щелкнем на кнопку Го-
Глава 5. Основы реляционных СУБД (общая часть).
127
тов. И в результате мы получаем вот такие три таблицы и окно, в котором нас и извещают о том. Что это все таблицы, которые созданы мастером. Щелкнем на кнопку ОК. Здесь, как мы видим, опять три таблицы. В первой из них сконцентрированы все страны, которые использованы у нас в таблице Покупатели, во второй у нас таблица городов, в которой сконцентрированы все города, используемые в нашей таблице Покупатели. И последняя таблица, таблица, которая создана на основе таблицы Покупатели, в которой и перечислены все наши персонажи, а также все те города и страны, в котором они находятся. Ну и изменения каждого из полей, теперь будет происходить не вводом нового имени, а выбором из соответствующей таблицы подстановок. Вот, например, вместо Россия, мы можем выбрать Белоруссию, или обратно Россию, по нашему выбору щелкая на вот этот ниспадающий список. И то же самое мы можем сделать в каждом из городов. Здесь появляется список всех городов, которые зафиксированы у нас в таблице городов, и можно выбрать любой из них для нашего персонажа. Ну и, конечно же, название любого из городов, или любого из стран мы можем переименовать, и в результате получим изменения и в исходной таблице во всех ее строчках одновременно. Кроме этого, мы можем, например, взять вот эту таблицу стран и посмотреть, в каких записях использована, например, вот эта страна Белоруссия. Для этого щелкнем на вот этом плюсе. В результате появляется весь тот список покупателей, которые зарегистрированы именно в этой стране. Ну, и точно также мы можем просмотреть покупатели из страны Россия. Свернем эту таблицу и откроем исходное окно, окно нашей базы данных. Ну, как мы видим, у нас наряду с исходными таблицами появились все три новые таблицы, таблицы городов, таблица стран и вот эта таблица с именем таблица-1. Конечно же, в принципе, в таблице Покупатель сконцентрирована вся старая таблица, которая у нас была. Ее уже можно совершенно свободно удалить. Для этого щелкнем на правую кнопку мыши и выберем пункт удаления. Конечно же, нам нужно подтвердить эти действия. Щелкнем на кнопке Да. И вот эту таблицу, таблицу -1, после того, как мы убедились, что наши все изменения нас устраивают, теперь переименуем в таблицу Покупатели. Для этого выберем пункт Переименовать из нашего контекстного меню. В принципе, возникло вот это окно, которое нас предупреждает, что переименование этой таблицы невозможно, пока оно открыто. Щелкнем на кнопке ОК и закроем все вот эти таблицы, чтобы такие вопросы не возникали, и поэтому щелкнем опять на правую кнопку мыши и выберем из контекстного меню пункт Переименовать. И вместо таблицы -1 выберем название Покупатели. Щелкнем где-либо и как мы видим, таблица Покупатели у нас тоже появилась в нашей базе данных. Она у нас переименовалась, если мы щелкнем на ней дважды, то можно увидеть окончательный ее вид. Как мы видим, у нас вся информация, которая бала у нас в нашей исходной таблице, она, конечно же, сохранилась, информация обо всех городах и о всех странах, но при этом структура этой таблицы изменилась. Если мы откроем эту таблицу в режиме конструктора, то можно увидеть, что вот эти два поля города и страны, имеют несколько теперь другой вид. У них, как мы видим, тип данных числовой, что просто-напросто характеризует номер записи в другой таблице, в таблице городов и в таблице стран. Закроем это вид таблицы и вернемся обратно в нашу базу данных, в исходный ее вид.
128
TeachPro Microsoft Access 2003
5.6. Виды отношений между таблицами Рассмотрим, какими отношениями могут быть связанны таблицы в базах данных. И как записи в структуре одной таблицы могут быть связаны с записями в другой таблице. И какие при этом бывают особенности. Ну, рассмотрим все это на примере базы данных, которая поставляется в стандартной поставке. Для того чтобы его открыть можно щелкнуть на пункте меню Справка, далее примеры базы данных и далее здесь у нас есть два примера. И первый из них, это учебная база данных "Борей". Щелкнем на нем. Вот перед нами появилась заставка к этой базе данных. Как мы видим, это учебная база данных, созданная для изучения и представляет собой такую виртуальную торговую компанию. Щелкнем на кнопку ОК и познакомимся уже непосредственно с этой базой данных. Можно видеть, перед нами главную кнопочную форму, которая сразу же появилась на нашем мониторе. Щелкнем сейчас на самой базе данных, на вот этом главном окне. И рассмотрим, какие здесь есть таблицы. Таблицы в базе данных, в частности вот в этой базе данных, чаще всего связываются связкой один ко многим, при котором одной из записей в какой-либо одной таблице, соответствуют много записей в другой таблице. В частности, в такой связке связанны две таблицы, таблицы Сотрудники и, например, таблицы Заказы. Поскольку каждому сотруднику соответствует некое множество заказов из второй таблицы. Для того чтобы посмотреть так ли это, щелкнем на таблице Сотрудники, чтобы ее открыть в режиме просмотра таблицы. Вот появилась эта таблица перед нами и сейчас около каждой записи можно видеть вот такой плюс, что означает, что у этой записи является некая связь с другой таблицей. Если мы щелкнем на какой-либо из плюсов, то появляется вот такая вторая таблица, таблица заказов и в нем, как мы видим, с вот этой записью фамилии Новиков, связано довольно много заказов. Как мы видим, это типичный случай связки один ко многим. Одной из записи вот в этой таблице, соответствует много записи в таблице Заказов. При этом надо сказать, что эта таблица тоже, как мы видим, связана с другой таблицей, что видно из вот этого плюса. Если мы щелкнем на нем, то можно увидеть, что каждый заказ связан с товарами. В принципе, как мы видим, у этого заказа всего один товар с ним связан, но в принципе, с заказом может быть связано и несколько товаров. Вот, например, откроем вот этот заказ, и здесь, как мы видим, с этим заказом связано уже два товара. Т.е. это классический случай связки одного со многим. Закроем эту таблицу. Щелкнем на вот этом крестике. Вернемся к стандартному виду нашей базы данных. Аналогично построены и все другие таблицы в этой базе данных. Они тоже связаны связкой один ко многим. Рассмотрим, например, другую таблицу, таблицу Типы. Как мы видим, здесь у нас перечислены типы товаров, и если мы щелкнем на каком-либо из плюсов, например, рассмотрев, как подразделяются у нас приправы, то, как мы видим, под приправами у нас подразумевается некое семейство товаров, которые характеризуются разными марками, разными поставщиками, единицей изменения и т.д. А если мы щелкнем на вот этот плюс, то можем расшифровать, что каждый из этих товаров участвует в неком количестве заказов. И это тоже реализуется связкой один ко многим. Закроем эту таблицу. Откроем таблицу Доставка. Ну и здесь у нас точно такое же положение. У нас несколько операторов по доставке товаров. Если мы раскроем соответствующий список, то можно увидеть, какие клиенты и сотрудники, и заказы, связаны с этой доставкой. Как мы видим, здесь тоже достаточно много заказов, связанных с каждым из операторов по доставке. Ну и щелкнув на этом плюсе, можно раскрыть, какое количество и какие товары входят в тот или иной заказ. Как мы видим, вот таким образом построена вся вот эта таблица. Таким образом, конечно, можно рассматривать все таблицы и рассмотреть их связь друг с другом. Но, для того
Глава 5. Основы реляционных СУБД (общая часть).
129
чтобы явственно и достаточно четко представить себе связь между отдельными таблицами в базе данных, и конечно же, лучше воспользоваться соответствующей схемой, показывающей эту связь. И именно для этого существует такое явление, как схема данных. Для этого щелкнем на вот этой кнопке на панели инструментов, кнопки отображения схемы данных, и в результате перед нами появляется схема, на которой отображены все таблицы, существующие в нашей базе данных. Внутри каждой таблицы перечислены все поля, которые там есть. Ну и далее, можно рассмотреть связки между полями в этой базе данных. Вот, рассмотрим, например, таблицу Типы товаров и, как мы видим, она связана связкой с таблицей товаров. При этом связка один ко многим. Что отображено на вот этой линии. С одной стороны здесь написана 1, а с другой стороны, вот такой знак бесконечности. Что означает, что от нас запись в таблице Типы связана со многими записями в таблице товаров. Связь происходит по полю Код типа, который одинаков в обеих таблицах. И именно совпадения этих полей и определяет связку между этими двумя таблицами. Связка между таблицами Поставщики и Товары, происходит по полю Код поставщика в таблице Поставщики и аналогичное поле в таблице Товаров. И связка тоже происходит при помощи связи один к бесконечности, т.е. один ко многим. Точно такие же связи можно увидеть и в остальных всех таблицах на этой схеме
5.7. Связывание таблиц в Схеме данных Подтаблицы. Условия для создания различных отношений между таблицами На этом уроке попробуем связать таблицы друг с другом. Попробуем это делать разными методами и к тому же попробуем создать таблицы внутри таблиц. Рассмотрим вот эту базу данных, в которой у нас есть несколько таблиц. Это такие, как таблицы Покупатели, Сотрудники, Города и Страны. Рассмотрим, например, такую таблицу, как таблицу Покупатели. Для этого надо ее активизировать здесь, как мы видим, у нас несколько полей. И наряду с именем и фамилией соответствующей какому-либо персонажу в нашей записи, здесь есть еще и два поля. Это Города и Страны, в которые отображается именно эта информация. Если мы закроем эту таблицу и откроем таблицу городов, как мы видим, здесь у нас сосредоточены все города, а в таблицах Страны перечислены те страны, которые используются у нас в базе данных. В принципе, всего 2 страны. Как мы видим, все эти таблицы пока не связаны друг с другом при помощи связи. Никаких подтаблиц у этих таблиц не возникает. Попробуем так сказать исправить эту неприятность. Например, возьмем таблицу Города и попробуем ее связать с таблицами Покупатели. Для этого достаточно выбрать пункт меню Вставка, далее подтаблица. И здесь у нас появляются все те таблицы, которые у нас существуют в нашей базе данных. Ну, конечно же, в данном конкретном случае нам нужна таблица Покупатели. После того, как мы определились с этим делом, нам нужно связать эти две таблицы друг с другом, по какому-либо полю. В принципе, в качестве подчиненного поля, если мы щелкнем на вот этом ниспадающем меню, появляются все те поля, которые существуют в таблице Покупатели. Ну и, конечно же, если мы хотим связать с городом, то нам, конечно же, нужен код города. Щелкнем. И связать его с основным полем вот эту таблицу городов нам нужно по соответствующему полю Код. И вот, после этого, как мы выбрали эти два поля, по которому будут проис-
130
TeachPro Microsoft Access 2003
ходить взаимосвязь этих двух таблиц, щелкнем на кнопку ОК. Как мы видим, компьютер пытается создать эту связь. Сейчас щелкнем на кнопку Да, чтобы эта связь образовалась. И у нас, как мы видим, все прошло достаточно успешно. Около каждой из записи в таблице Города появился этот плюс, что означает, что связь между этими двумя таблицами установилась. Если мы сейчас щелкнем на вот этом плюсе, то можно увидеть, в каких записях использован город Архангельск. Можем раскрыть, например, запись, связанную с городом Барнаул. И, наконец, видим здесь у нас уже 4 персонажа, которые из этого города. Вот таким образом нам удалось связать вот эти две таблицы. Таблицу городов с таблицами Покупатели, при помощи вот такой подтаблицы. Закроем теперь эту таблицу и, конечно же, после того, как мы щелкнули на соответствующем крестике закрытия таблицы, появилось такое предупреждение сохранения макета. Щелкнем на кнопке Да. И мы вернулись в обычный стандартный вид нашей базы данных. Рассмотрим теперь схему нашей базы данных. Для этого достаточно щелкнуть на этой кнопке Схема данных в нашей панели инструментов. Щелкнем. Появляется вот такое стандартное окно, которое, как мы видим, пока пустое. На нем нет ни одного визуального отображения таблицы. Правда, это можно исправить. Во-первых, мы просто-напросто можем щелкнуть на правую кнопку мыши, и в этом случае появляется вот такое всплывающее меню, в котором мы можем добавить таблицу, так сказать, в ручном режиме или же отобразить все связи, существующие в нашей базе данных. Если мы щелкнем на пункте Добавить таблицу, то появляется вот такое окно, в котором перечислены все таблицы из нашей базы данных, с возможностью ее добавления. Точно такое же действие можно сделать, щелкнув на кнопке, на нашей панели инструментов Добавить таблицу. В любом случае появляется вот такое окно. Например, можем добавить таблицу городов. Как мы видим, она появилась. Таблицу покупателей, сотрудников, стран, в общем, все наши таблицы появляются в этом случае на вот этом окошке. Закроем его. Как мы видим, одновременно с таблицами появилась и та связь, которую мы только что создавали. Связь между таблицами городов и таблицами покупатели. Попробуем теперь создать еще одну связь. А именно, связь между таблицей Стран и таблицей Покупатели. Ну, конечно же, связать эти две таблицы надо по коду в таблице стран и по коду страны в таблице Покупатели. Связать можно, перетащив какое-либо из полей из одной таблицы в другую. Или поле Код страны из таблицы Покупатели в таблицу Страны. Или же поле Код из таблицы Страны в Покупатели. Так мы и сделаем. Например, схватим вот это поле Код и потащим его в сторону таблицы Покупатели. И вот, когда его мы приблизили, конечно же, его лучше совместить с тем полем, с которым мы хотим установить взаимно однозначное соответствие между этими двумя таблицами. Хотя, в принципе, если даже мы промахнемся, то в дальнейшем можно это исправить. Отпустим сейчас кнопку мыши, и появляется вот такое стандартное окно для установления связи между двумя таблицами. Как мы видим, у нас сразу же автоматически появилось поле Код с одной стороны и поле Код страны с другой стороны, со стороны таблицы Покупатели. Мы можем согласиться с вот такой связкой или, щелкнув на вот этом ниспадающем меню, можем выбрать какоелибо другое поле из одной таблицы или же из другой. В принципе, мы достаточно точно позиционировали вот эти два поля друг с другом, и поэтому нам скорректировать эту информацию сейчас не нужно. Если бы мы выбрали как-нибудь неправильно, то мы могли бы сейчас выбрать правильную связку между этими двумя таблицами. А сейчас, щелкнем на кнопку Создать, для того чтобы в результате образовалась вот такая связка между двумя таблицами, которая является, как мы видим, типом связи один ко многим. Щелкнем на кнопке Создать. И в результате вот это соответствующая соединительная линия показывает нам, что эти две таблицы уже успешно связались друг с другом. Если мы рассмотрим вот эту связь, которую мы устанавливали ранее и щелкнем на ней дважды, то можно увидеть, что эта связь тоже является связью один ко многим.
Глава 5. Основы реляционных СУБД (общая часть).
131
Как мы видим, мы установили между этими тремя таблицами связку. Причем все связки являются один ко многим. Но наряду со связкой один ко многим, существует еще связка один к одному, при которой одной записи в одной таблице соответствует одна запись в другой таблице. В принципе, это более редко используемся связь, которая чаще всего используется. Если у нас в таблице достаточно много полей, и мы хотим ее просто-напросто разбить на две таблицы. В одной, более, так сказать, короткой могут сохраняться все те информации, по которым мы хотим проводить поиски в нашей базе данных, различного рода фильтрацию и индексацию, а во второй таблице, которая может быть достаточно большой и объемной, можно отложить всю остальную информацию. При этом она может быть достаточно большой по размеру и туда можно сбросить кучу дополнительной информации. При этом, связывая эти две таблицы друг с другом при помощи связки один к одному, мы получим полную информацию о каждой записи. А при этом мы сэкономим время работы с таблицей, поскольку фильтрация и разного рода работы, которые будет проводить программа будет проходить в первой таблице, более маленькой. Попробуем сейчас реализовать такую связку. Для этого разобьем вот эту таблицу Сотрудники на несколько таблиц. Прежде, чем это сделаем, сохраним этот макет. Щелкнем на кнопке Записи. Закроем эту схему данных и вернемся в наш стандартный вид программы. Теперь возьмем вот эту таблицу Сотрудники. Если мы щелкнем на ней дважды, то можно увидеть, что здесь достаточно много полей и разобьем ее на несколько таблицы, как мы сказали. Для этого проще всего просто-напросто ее скопировать, так сказать, внутри себя. Для этого щелкнем на правую кнопку мыши и выберем пункт Копировать. Далее опять правая кнопка мыши и пункт меню Вставить. Выберем имя для этой таблицы. Пусть это будет сейчас Сотрудники-1. Сейчас, в принципе, большого значения не имеет, какие мы будем выбирать имена, поскольку это достаточно условная таблица для учебных целей. Ну и скопируем туда и структуру и данные. Щелкнем на кнопке ОК. Появилась вот эта таблица Сотрудники-1. Опять вставим. Для этого щелкнем на правую кнопку мыши и выберем пункт Вставить. Всплывающее меню нам нужно было выбрать, встав на какое-либо пустое место на нашем окне базы данных. Снимем выделение со всех таблиц. Далее правая кнопка мыши и выберем пункт Вставить. Теперь выберем для нашей таблицы название Сотрудники-2. ОК. А теперь удалим лишние поля с соответствующих таблиц. Выберем сначала таблицу Сотрудники. Откроем ее в режиме конструктора. И оставим здесь только имя и фамилию, и код города, а все остальные пункты можно сейчас удалить. Для этого выделим те несколько полей, которые мы хотим удалить, нажав на кнопку Shift. Далее щелкнем на правую кнопку мыши, выберем пункт Удалить строки. Конечно же, нас компьютер предупреждает, что мы хотим удалить какие-то поля, в которых, конечно же, есть информация. Но у нас эта таблица скопирована несколько раз. Щелкнем на кнопку Да. Еще раз Да, поскольку компьютер удаляет и индексы, связанные с этими полями. В принципе, у нас осталось еще вот эти два поля. Опять все их выделим. Правая кнопка мыши. Удалить строки. И, как мы видим, у нас таблица уже стала гораздо меньше. Щелкнем на кнопке сохранения. Закроем. Откроем вторую таблицу, таблицу Сотрудники. Откроем ее тоже в режиме конструктора. На этот раз имя и фамилия, и код города нам не нужны в этой таблице. Выделим их. Правая кнопка мыши и удалить строки. Да. Опять Да. Согласимся с удалением индекса. В принципе надо при всех этих преобразованиях с таблицами. Вполне четко представлять, что вот этот код, который у нас есть в нашей таблице, в принципе, желательно оставить без изменения. Именно при помощи этого поля и будем мы связывать таблицы друг с другом. А теперь удалим вот эти несколько полей, связанных с датами и т.д. в конце нашей таблицы. Вот эти, например, 3. Опять правая кнопка мыши. Удалить строки. Да. Сохраним макет. Откроем таблицу Сотрудники-2 в режиме конструктора. Опять удалим имя, фамилию, город. И до отдела
132
TeachPro Microsoft Access 2003
оставим только поля, связанные с датами. Правая кнопка мыши и удалить строки. Да. Удалим и индексы тоже. И в результате, как мы видим, у нас таблица стала меньше. Сохраним. Вот, таким образом, мы разбили одну таблицу Сотрудники на 3 таблицы. А теперь попробуем связать эти таблицы друг с другом. Для этого вызовем опять макет нашей таблицы. Щелкнем на соответствующую кнопку. Вот он появился перед нами. Здесь у нас, как мы видим, уже вот эта таблица Сотрудники стала гораздо меньше по количеству своих полей. Добавим еще те таблицы, которые мы только что создали. Для этого щелкнем на правую кнопку мыши и выберем пункт Добавить таблицу. Добавим вот эту таблицу Сотрудники-1. И добавим таблицу Сотрудники-2. Закроем эту таблицу. Как мы видим, у нас вот эти новые таблицы абсолютно не связаны друг с другом, а сейчас попробуем это исправить. Конечно же, их надо связать по полю Код друг с другом. Для этого схватим, например, вот этот код из первой таблицы, перетащим его к коду ко второй таблице Сотрудники-2, и после того, как мы совместим эти два поля, отпустим мышку. Появилось вот это стандартное окно, в котором, как мы видим, у нас связаны друг с другом именно вот эти поля Код. И, как мы видим, тип отношения у нас определился один к одному. В принципе, это связано с тем, что вот это коле Код и в одной таблице и в другой является уникальным по счетчикам и в одной и в другой таблице. Именно поэтому, тип отношения определился один к одному. Щелкнем сейчас на кнопке Создать, и, и как мы видим, эти две таблицы успешно связались друг с другом. Точно также мы можем связать вот эти две таблицы Сотрудники и Сотрудники-1, совместив и перетащив в соответствующее поле. Опять тип отношения один к одному. Щелкнем на кнопке Создать и последнее, что мы можем сделать, это связать вот эти две таблицы Сотрудники-1 и Сотрудники-2. Опять-таки перетащим код из одной таблицы в другую. Тип отношения тоже один к одному. Щелкнем на кнопке Создать. И в результате мы получаем вот такой вид связки наших таблиц. Вот эти три таблицы Сотрудники, Сотрузники-1 и Сотрудники-2 оказались связаны друг с другом. Причем связанными они оказались при помощи совпадения поля Код, определяющего отношения один к одному. Сохраним теперь макет. Для этого щелкнем на кнопке Сохранить и попробуем теперь связать вот эту таблицу Сотрудники с таблицей городов. Конечно же, связать его нужно по коду с одной стороны и коду города с другой. Схватим и перетащим в соответствующее место это поле. Появляется вот это стандартное окно, в котором мы уже несколько раз работали. Тип отношения будет один ко многим. Все в порядке. Щелкнем на кнопке Создать, и в результате вот эта связка тоже у нас образовалась. Сохраним этот макет. Закроем этот макет схему данных и вернемся к обычному нашему стандартному виду. Теперь же откроем вот эту таблицу городов. И, как мы видим, у нас опять внутри этой таблицы есть подтаблицы. Если мы щелкнем на плюсе, то можно увидеть соответствующие записи из таблицы покупатели. Но, как мы помним, у нас эта таблица связана не только с таблицей Покупатели, но и с таблицей Сотрудников. Попробуем сейчас сделать так, чтобы подтаблица этой таблицы была не таблицей Покупатели, а таблицей Сотрудников. Для этого нам нужно выбрать пункт меню Формат, далее подтаблица, и здесь у нас есть несколько пунктов, и среди них это Удалить подтаблицу. Если мы на ней щелкнем, то увидим, у нас подтаблица исчезла с нашей таблицы. Вот эти плюсы так сказать испарились. Но теперь зато освободилось место для нашего маневра, для вставки другой таблицы в качестве другой таблицы. Для этого воспользуемся пунктом меню Вставка и далее пункт Подтаблица. И здесь у нас опять появляются все те таблицы, которые у нас есть в нашей базе данных. Ну и выберем на этот раз не таблицу Покупатели, а таблицу Сотрудников. Ну и, как мы видим, компьютер автоматически определил, какие поля мы хотим связать друг с другом. Конечно же, это код города и просто код. Щелкнем на кнопку ОК. Как мы видим, у нас образовались связи, что видно по вот этим плюсам.
Глава 5. Основы реляционных СУБД (общая часть).
133
Ну и, щелкнув на соответствующем плюсе, можно раскрыть соответствующий список и посмотреть, кто проживает в том или ином городе. Вот, как мы видим, вот таким образом у нас сконцентрировались у нас наши сотрудники вот в этих городах. В принципе не во всех городах у нас проживают сотрудники, что можно увидеть, открыв соответствующие поля. В принципе, оно и понятно, у нас городов просто-напросто в силу, так сказать, того, как мы заполняли нашу таблицу, городов гораздо больше, чем сотрудников.
5.8. Проблемы целостности данных Мы уже ознакомились с различного рода связями, которые могут возникать между таблицами и между полями в разных таблицах в базах данных. Рассмотрим теперь, какие возникают при этом вопросы по сохранению целостности базы данных. Т.е., что будет происходить при удалении или изменении каких-либо записей в одной таблицы, при котором эти записи каким-либо образом связаны с другой таблицей. Для этого рассмотрим нашу базу данных и его таблицы. Откроем сначала, например, таблицу городов. Для этого щелкнем дважды на этой строке. Вот, перед нами появилась вот эта таблица. А теперь посмотрим, какие возможности есть по взаимодействию этой таблицы с разного рода таблицами. Если мы приглядимся, то можно увидеть, что в этой таблице существует у каждой записи своя подтаблица, на что указывает вот этот плюс рядом с каждой записью. Если мы на ней щелкнем, то можно увидеть, в каких записях в таблицах Покупатели участвует этот город из таблицы городов. Мы уже ознакомились с тем, как нам надо устанавливать подтаблицу внутри конкретной таблицы. Рассмотрим теперь такой вопрос, а что же возникнет в том случае, если мы в качестве подтаблицы укажем саму исходную таблицу. Попробуем это сделать. Но перед этим, конечно же, удалим ту подтаблицу, которая связана с этой таблицей сейчас. Для этого щелкнем на пункте меню Формат. Далее подтаблица и удалить ее. Щелкнем. Вот теперь подтаблица здесь уже благополучно удалена. И теперь же выберем пункт Вставка, далее щелкнем на пункте подтаблица и в качестве таблицы выберем саму таблицу городов. Конечно же, связка у нас будет по коду в наших таблицах, вернее в одной и той же таблице городов, щелкнем на кнопке ОК. Конечно же, связь офису обнаружить не удалось. Он попробует создать эту связь. Посмотрим, как пройдет дальше наша попытка. Щелкнем сейчас на кнопку Да, но и в результате, как мы видим, компьютер благополучно установил нам подтаблицу для этой таблицы. Посмотрим, что в результате получилось. Вот откроем первый же плюс на этой записи, и как мы видим, как можно было и ожидать, при связи таблицы само собой, у каждой записи открылась эта же сама запись. Если мы щелкнем еще раз, то ее подтаблицей опять является тот же самый город. В принципе можно и понять, таким образом можно открывать до бесконечности эту таблицу, поскольку тут получается вот такая рекурсивная зависимость, при которой каждая запись замыкается, так сказать, сама на себя. В принципе, конечно же, это достаточно ненормальная ситуация, поэтому удалим вот эту подтаблицу и вернем все в исходное состояние. Для этого, конечно же, опять щелкнем на формат. Подтаблица, удалить. Но, как мы видим, мы удалили нашу подтаблицу, но результатом этого действия, удаление этой таблицы произошло не достаточно хорошо. Т.е. вот эти плюсы, тем не менее, остались. Если мы на ней щелкнем, то на этот раз появляется вот такое окно по вставке новой подтаблицы, а не раскрытия связи этой таблицы с какой-либо другой таблицей. Попробуем щелкнуть на соответствующую запись. И установить новую подтаблицу. В качестве подтаблицы выберем таблицу Покупатели, щелкнем на ОК. И на этот раз у нас в нашей таблице уже все более или менее нормально. Если мы будем открывать каждую запись, то появляется Покупатели, которая связана с соответствующим го-
134
TeachPro Microsoft Access 2003
родом. Сохраним эту таблицу, закроем ее и мы опять вернулись в наше стандартное окно программы. Откроем теперь вот эту таблицу городов еще раз. Откроем также таблицу Покупатели и установим их вот таким образом, чтобы мы могли видеть и одну и вторую таблицу рядом. А теперь же попробуем немножко поэкспериментировать с этими двумя таблицами. Как мы видим, для каждой из строчек в таблице Покупатели у нас существует определенный город, с которым он связан. Давайте, попробуем связать запись из вот этой таблицы. Например, вот эту запись с фамилией Мария Тамбова, и вместо города Рязань, выберем какой-либо город из тех, которые находятся чуть-чуть поближе, для того чтобы мы могли видеть реакцию при изменениях в наших таблицах. Например, вместо города Рязань, возьмем город Архангельск. Вот, как мы видим, у нас достаточно успешно получилось с изменением. А теперь попробуем что-либо изменить в этом городе. Например, вместо Архангельска напишем Архангельск-2. Щелкнем где-либо, чтобы зафиксировать это изменение. И если мы сейчас переключимся в нашу первую таблицу, то можно увидеть, что автоматически название в этой таблице в соответствующей ячейке тоже изменилось. И даже можно сказать больше, если мы сейчас дальше будем изменять это название, например, удалим какую-либо часть, то, как мы видим, автоматически, как только мы щелкнем на вот этой ячейке, в которой находится вот этот город он, после этого сразу же меняет свое название, т.е. при очередной следующей перерисовке. Попробуем теперь применить еще одну операцию, а именно, удалим этот город. Для этого выделим его и щелкнем на правую кнопку мыши. Выберем пункт Удалить запись. Как мы видим, программа предупреждает нас, что мы хотим удалить запись. Твердо ли мы уверены. Нажмем на кнопке Да. Ну и, как мы видим, у нас этого города нет. Но этот город пока сохранился у нас в этой записи. Правда, пока совершенно временно. Как только мы щелкнули на вот этой таблице, как мы видим, в соответствующей ячейке у нас пропала запись. Т.е. образовалась вот такая ячейке пустышка. Или же запись сирота, в которой не существует определенной ссылки, которая была на другую таблицу. В принципе, конечно же, это достаточно ненормальное положение, когда вот таким образом удаляя различного рода строчки, мы можем испортить целостность наших базы данных, что в принципе мы сейчас как раз и сделали. Сейчас нам никак не удается узнать, в каком городе живет человек с соответствующей записью в таблице Покупатели. Откроем теперь макет связи наших таблиц. Для этого перейдем в исходное окно нашей базы данных и щелкнем на пункте схеме данных. Вот эта схема появилась перед нами. В принципе можно заметить одну интересную особенность. Наряду с таблицей городов, появилась таблица Города-1, и они связаны между собой. Вот эти две таблицы города и города-1. Это отголоски той операции, которую мы только что делали. А именно связывали таблицу самой себя. Поэтому сейчас, конечно же, это у нас абсолютно лишняя таблица. Щелкнем на кнопке Delete и удалим ее с вот этой схемы. Одновременно у нас появилась и вот эта лишняя таблица Покупатели-1. Это все отголоски наших достаточно странных действий по связыванию таблицы самой собой. Щелкнем теперь тоже на кнопку Delete, убирая лишние таблицы с нашей схемы данных. А теперь займемся вот этой связкой между городами и покупателями. Выделим вот эту связь, которая существует между ними. Щелкнем на ней дважды, и появляется та связь, которая существует между ними. Связь между полем Код и полем Код города в этих таблицах. Ну и, как мы видим, мы можем поставить здесь флажок на пункте обеспечение целостности данных. Как мы видим, до этого здесь галочки не было. В результате чего компьютер не светился целостностью в наших базах данных. Посмотрим теперь, как будет влиять вот это изменение на наши таблицы. Щелкнем сейчас на кнопке ОК. Как мы видим, возникло окно с некой ошибкой. В принципе, дело в том, что эта таб-
Глава 5. Основы реляционных СУБД (общая часть).
135
лица уже используется другим процессом, как написано в этом окне. Щелкнем на кнопку ОК. Щелкнем на кнопку Отмена и посмотрим, в чем же дело. Дело в том, что те лишние таблицы, которые мы только что видели, они на самом деле у нас не исчезли, поскольку сохранились их связи с этими таблицами городов и покупатели. Поэтому щелкнем на кнопке Отобразить все связи. При этом возникают все удаленные нами только что лишние таблицы, и удалим связи тоже. Для этого выделим соответствующую связь. Щелкнем на кнопку Delete. ОК. Удалим теперь вот эту таблицу. На этот раз она уже корректно удалится. Сделаем то же самое из подтаблицы Покупатели. Выберем связь. Щелкнем на Delete. Да. И саму таблицу тоже удалим. Щелкнем на Delete. Вот теперь после всех этих действий запишем нашу схему, и на этот раз у нас получилась уже чистая схема, без всяких лишних таблиц. А теперь же опять попробуем заняться вот этой связкой. Выделим ее, далее щелкнем на пункте Обеспечить целостность данных и щелкнем на кнопке ОК. Как мы видим, появляется вот такая грозная надпись, что таблица Покупатели не может быть заблокирована, поскольку используется другим процессом. Щелкнем на ОК. Щелкнем на кнопке Отмена и закроем вот эти таблицы, которые у нас открыты на заднем фоне и которые нам явно мешают. И таблицу городов тоже закроем. А теперь щелкнем дважды на эту же запись. Поставим флажок на Обеспечение целостности данных и щелкнем на кнопку ОК. Ну и, как можно увидеть, программа нас сразу же предупредила, что целостность данных, в данном конкретном случае установить не удается, поскольку уже нарушены условия целостности. Щелкнем на кнопку ОК, щелкнем на кнопку Отмена и вспомним о той записи, которую мы только что изменяли. Поэтому щелкнем на таблице Покупатели. Вот в этой записи, в которой мы испортили город, так сказать, выберем какой-либо город, для того чтобы мы в дальнейшем могли спокойно изменять и устанавливать целостность. Щелкнем теперь на крестике. Закроем эту таблицу. Откроем схему. Щелкнем опять дважды на вот этой связи, поставим флажок на обеспечении целостности данных. Щелкнем на кнопку ОК. И на этот раз, как мы видим, установка целостности данных прошла успешно. Как мы видим, установилась связь один ко многим, которая связывает эти две таблицы. И в отличие от всех других связей, которые видны на этой схеме, на ней отображена цифра 1 и бесконечность. Как мы видим, связь немножко подругому выглядит, что как раз и связано с тем, что эта связь у нас с обеспечением целостности данных. Сохраним этот макет схему данных. Откроем соответствующую таблицу. Таблицу городов и Покупатели. Щелкнем. Вот у нас эта таблица городов. Откроем еще и таблицу Покупатели. И посмотрим, как они будут взаимодействовать сейчас в таком режиме, в режиме целостности. Рассмотрим опять вот эту запись, в которой у нас есть город Аркадак и попробуем что-либо изменить в соответствующей записи. Например, для начала изменим название. Например, удалим несколько букв. Как мы видим, в принципе эта операция прошла так же, как и происходила ранее, с обновлением соответствующего имени города в соответствующей записи. А теперь попробуем ее удалить целиком. Для этого выделим ее. Щелкнем на правую кнопку мыши и выберем пункт Удалить запись. Как мы видим, на этот раз у нас сработала наша защита, защита целостности данных. Как мы видим, появилось вот такое предупреждение, что удаление или изменение записи невозможно, поскольку в таблице Покупатели имеются связанные записи. Щелкнем на кнопке ОК и, как мы видим, у нас ничего не произошло. Удаление вот этой записи невозможно до тех пор, пока у нее есть связанные записи. Закроем теперь эти две таблицы. Откроем опять схему. Щелкнем дважды на вот этой связке и попробуем поставить флажок на следующей возможности. А именно, каскадное обновление связанных полей. Что будет происхо-
136
TeachPro Microsoft Access 2003
дить в этом случае. В принципе для этого достаточно щелкнуть на вот этом вопросе и посмотреть, что дает нам вот эта краткая подсказка. Как мы видим, для автоматического обновления соответствующих значений связанной таблицы, при изменении записи в главной таблице, нам как раз и нужно установить здесь флажок. А вот следующий пункт каскадное удаление связанных записей, дает нам возможность автоматически удалять связанные записи в связанной таблице, при удалении соответствующей записи в главной. Щелкнем сейчас на кнопке ОК. И посмотрим, как все это будет отображаться в наших таблицах. Закроем эту схему данных. Откроем таблицу городов опять. Откроем еще и нашу таблицу Покупатели. Сдвинем ее немного в сторону. И рассмотрим опять ту же самую запись, в которой сейчас у нас, как мы видим, осталось только 4 буквы от города, города Арка. В принципе такого города на самом деле, конечно же, уже не существует. Мы достаточно сильно поиздевались над ним. Что ж поделать, это у нас экспериментальная таблица. Попробуем изменить здесь название. Например, вставим цифру 2, и как мы видим, соответствующее, конечно же, изменение появилось у нас вот в этой таблице. Это все, как обычно. А теперь попробуем удалить эту запись. Для этого выделим ее. Щелкнем на правую кнопку мыши и щелкнем на пункте Удалить запись. И как мы видим, у нас на этот раз возникло другое окно, в котором нас предупреждают, что наряду с удалением этой записи, у нас удаляется и запись в соответствующей связанной таблице. Мы можем щелкнуть на кнопке Нет, возвращаясь к исходному состоянию обеих таблиц, при котором ничего пока не произошло. Но мы можем щелкнуть опять на правую кнопку мыши, щелкнуть на Удалить. И можем щелкнуть на кнопке Да, для того чтобы подтвердить это действие. Щелкнем. Как мы видим, наряду с удалением соответствующей записи в исходной таблице, таблице городов, исчезла и соответствующая запись, которая была связана с этой таблицей. Как мы видим, у нас во всех ячейках появилась вот такая запись Удалено. Что как раз и сигнализирует нам о соответствующей операции, которую программа проделала за нас. Закроем теперь эти две таблицы, и таблицу Покупатели и таблицу Городов. Конечно же, нам нужно сохранить весь макет и структуру. Щелкнем на кнопке Да, чтобы таблица городов у нас сохранилась в том виде, в котором она получилась после всех изменений. Ну и, если мы таблицу Покупатели откроем еще раз, то можно увидеть, что вот эта запись с грифом Удалено, у нас вообще исчезла с нашей таблицы. Т.е. при следующем открытии таблицы она, конечно же, у нас уже не фигурирует. Т.е. таким образом мы обеспечили целостность данных в нашей таблице в автоматическом режиме. При удалении какой-либо записи в одной таблице, эта запись используется в другой таблице, тоже были удалены автоматически. Закроем эту таблицу и вернемся в стандартный вид базы данных.
5.9. Реализация целостности в Access Рассмотрим теперь, как целостность данных реализована при конструировании и реализации запросов. Для этого рассмотрим опять нашу таблицу в режиме просмотра схемы данных. И, после того, как мы вывели его на наш экран, рассмотрим вот эту связку, связку городов и сотрудников. Между ними, как мы видим, есть связь. Если мы щелкнем на ней дважды, то можно увидеть, что связь у нас без обеспечения целостности данных. Тут флажка нет. И если мы щелкнем на кнопке объединения, то можно увидеть, что параметры объединения этих двух таблиц может быть трех разных типов. Рассмотрим каждый из них подробно на соответствующем примере. Ну, а пока щелкнем на кнопку ОК и закроем эту связь. Попробуем теперь сконструировать соответствующий запрос, с которым у нас будут фигурировать эти две таблицы. Для этого закроем схему данных и
Глава 5. Основы реляционных СУБД (общая часть).
137
откроем конструктор запросов. Для этого щелкнем на вот этой кнопке на нашей панели инструментов и выберем пункт Запрос. Вот появилось перед нами окно создания нового запроса, в котором выберем пункт Конструктор. Щелкнем на кнопке ОК. Теперь появилось вот такое стандартное окно конструктора запросов и в нем нам требуется выбрать те таблицы, с которыми мы хотим работать. Это, конечно же, таблица города. Щелкнем на кнопке Добавить. И таблица Сотрудники. Опять щелкнем на кнопке Добавить. Закроем это окно. Как мы видим, так же как мы и предполагали, эти две таблицы, таблицы городов и сотрудников связаны между собой соответствующей связью между полем Код и Код города. А чтобы посмотреть тип этой связи, щелкнем на ней дважды. И на этот раз появилось вот это окно, в котором как раз и перечислены вот эти три возможности по обеспечению целостности данных в режиме конструктора запросов и его реализации. Здесь, как мы видим, три пункта. И первый из них, на котором сейчас стоит галочка, это объединение только тех записей, в которых связанные поля обоих таблиц совпадают. Т.е. в запросе будут участвовать те записи, которые участвуют в обеих таблицах. Щелкнем на кнопке ОК и прежде, чем мы создадим и реализуем наш запрос, конечно же, нам нужно выбрать поля, которые будут отображаться в нашем запросе. Для этого щелкнем на вот этом ниспадающем списке и выберем города со звездочкой. В результате чего отображаться будут просто все поля из таблицы городов. А во второй колонке выберем пункт Сотрудники со звездочкой. В результате чего будут отображаться все поля таблицы Сотрудники. А теперь реализуем этот запрос. Щелкнем на правую кнопку мыши и перейдем в режим таблицы. И можно увидеть, что при этом получилось. У нас, из нашей таблицы городов и таблицы сотрудников осталось всего лишь три записи. Это те три записи, которые так сказать существуют и в одной таблице и в другой. Если мы сейчас откроем соответствующую таблицу, таблицу Сотрудников, то можно увидеть, что как раз вот эти три записи, они, конечно же, в нем присутствуют. Например, вот эта запись Федра Петрова, у него код города, как мы видим, достаточно странный, что, конечно же, наводит на размышление о том, что такого города в перечне городов в нашей базе данных в соответствующей таблице не существует. Именно поэтому при запросе на соответствующую выборку, эта запись была проигнорирована. Закроем теперь эту таблицу Сотрудников и на окне запроса щелкнем на правую кнопку мыши и перейдем опять в режим конструктора. Теперь же щелкнем на вот этой связи дважды и выберем второй пункт Объединение всех записей из нашей таблицы городов. И только тех записей таблицы Сотрудники, в которых связанные поля совпадают. Щелкнем на кнопке ОК. И можно увидеть, как из нашей обычной связи образовалась вот такая связь со стрелкой. Что означает, что у нас уже так сказать направленная связь. Реализуем теперь этот запрос. Для этого щелкнем на правую кнопку мыши и перейдем в режим Таблицы. И можно увидеть, что на этот раз у нас таблица выглядит немножко по-другому. Наряду с теми записями, в которых участвуют записи из обеих таблиц, появились и те записи, в которых участвуют только записи из таблицы городов. А на месте ячеек, в которых должны находиться данные из таблицы Сотрудники, здесь у нас пустое место. Т.е. это у нас получилась вся таблица городов, заполненная где это возможно, соответствующими данными из таблицы Сотрудников. Перейдем опять в режим конструктора, щелкнув на правую кнопку мыши, и попробуем опять поменять вот эту связь. Для этого щелкнем на ней дважды и перейдем на третий пункт, в котором у нас связь будет идти в другую сторону. Т.е. будут взяты все записи из таблицы Сотрудников, и только те записи из городов, в которых связанные поля совпадают. Щелкнем на кнопку ОК и можно увидеть, что соответствующая стрелка у нас теперь направлена в другую сторону. Посмотрим теперь, как все это будет выглядеть в режиме таблицы. Щелкнем на правую кнопку мыши и перейдем в этот режим. И можно увидеть, что на этот раз у
138
TeachPro Microsoft Access 2003
нас появилась вся таблица сотрудников, и в левой части, которая соответствует таблице городов, у нас заполнены только несколько полей. Там, где компьютер смог установить им однозначное соответствие между этими двумя таблицами. А в остальных местах, как мы видим, образовались пустоты. Щелкнем на правую кнопку мыши и перейдем в режим конструктора. И таким образом можно констатировать, что от того, какого вида связь установим между таблицами при создании запроса, зависит целостность данных в результирующей сводной таблице. Туда могут быть выведены, как записи, участвующие в обеих таблицах, так и в одной из них. Все зависит от типа связи.
Глава 6. Запросы.
139
Глава 6. Запросы 6.1. Запросы. Общее представление Рассмотрим теперь такую важную тему, как запросы. Что же такое запрос? Это в терминах программы набор записей. В принципе, таблица это тоже набор записей, но в отличие от простой таблицы, запрос это такой набор записей, который существует только во время работы самого запроса. А отдельно он не существует. Он лишь составляется в виде отчета на основе уже существующих таблиц. Запрос может храниться в виде алгоритмов выборки неких записей из наших таблиц и связывание их друг с другом. И лишь в процессе выполнения этого запроса компьютер заполнит нашу таблицу запросов с соответствующими записями по этому алгоритму. Сейчас у нас открыта вот эта база данных, в которой есть несколько таблиц, но ни одного запроса нет. Для того чтобы в этом убедиться, перейдем в режим запросов. И здесь, как мы видим, у нас только две строки. Это создание запроса в режиме конструктор и создание запроса с помощью мастера. Это стандартные строки, которые создаются автоматически, и которые помогают нам в конструировании запросов. Выберем сейчас пункт создание запроса в режиме конструктора и щелкнем на нем дважды, для создания нового запроса. Вот появилось такое стандартное окно запросов на выборку и в нем сразу же открылось окно добавления новой таблицы. Вот это диалоговое окно добавления новой таблицы показывает нам, что запрос может быть создан на основе таблицы, на основе запроса или же на основе таблиц и запросов. Поскольку запросов сейчас пока у нас в нашей базе нет, то ограничимся созданием нового запроса на основе существующих у нас таблиц, которые, как мы видим, у нас сейчас в нашей базе данных их 4. Возьмем какую-либо из таблиц. Например, возьмем таблицу Покупатели и щелкнем на кнопку Добавить. Ну, как мы видим, эта таблица сразу же появилась у нас на окне запросов. В принципе мы можем выбрать любую из других таблиц и тоже щелкнуть на кнопку Добавить, и они тоже появятся у нас на окне конструктора запросов. Сейчас пока больше таблиц использовать не будем. Щелкнем на кнопку Закрыть. И непосредственно обратимся к окну конструктора запросов. Как мы видим, в этой верхней половине бланка запроса у нас появилась вот эта таблица Покупатели и внутри нее все поля, которые существуют в этой таблице. Наверху еще звездочка. Это такое виртуальное поле, которое означает, что мы просто-напросто в нашем конструкторе запросов будет так сказать использовать все поля одновременно из этой таблицы. В нижней половине вот этого конструктора запроса у нас находится так называемый бланк запроса по образцу, в котором как раз и будет происходит конструирование основных параметров нашего запроса. Немного можем расширить окно нашего конструктора запросов. В этом бланке мы должны поставлять различного рода поля и критерий отбора и критерий сортировки и вывода на экран различного рода полей, в результате выполнения нашего запроса. А сейчас создадим какой-либо запрос на основе вот этой одной таблицы. На основе таблицы Покупатели. Надо сказать, для того чтобы создать хотя бы минимальный запрос, нам нужно указать хотя бы одно поле для выборки. А именно, что-либо заполнить вот в этом бланке запроса. Поскольку если мы в таком виде попробуем выполнить наш запрос, нас постигнет неудача. Напри-
140
TeachPro Microsoft Access 2003
мер, попробуем щелкнуть на правую кнопку мыши и перейти в режим таблицы. Т.е. в режим выполнения запросов. Если мы щелкнем, то, как мы видим, появляется предупреждение, что запрос должен иметь хотя бы одно поле для вывода. В принципе, оно достаточно очевидно. Если у нас нет вообще никакой информации для вывода, то запрос тоже выполнять никакого смысла нет. Компьютер рассчитал в принципе все достаточно логично. Щелкнем на кнопке ОК. И создадим хотя бы одно поле в нашем бланке, там, где компьютер предлагает нам это сделать. Это можно сделать несколькими путями. Мы можем просто-напросто взять какое-либо из полей в таблице Покупатели и перетащить вниз, в наш бланк. Например, вот таким образом. Если мы отпустим, то, как мы видим, автоматически появилось в нашей первой колонке и в первой ячейке название Код покупателя. Название первой колонки нашей таблицы Покупатели. И внизу название той таблицы, которая является так сказать родителем для этого поля. В принципе у нас уже вполне созрел тот минимум. Мы его составили, при помощи которого мы можем создать какой-либо результат нашего запроса. Попробуем это сделать. Для этого щелкнем на правую кнопку мыши и щелкнем на кнопку режим таблицы, и как мы видим, вот та колонка, колонка Код покупателя и все вот эти значения. Это и есть результат выполнения нашего запроса, запроса на выборку. В принципе, пока достаточно мало задержать, в принципе, больше ожидать от всего лишь одной колонки для вывода было сложно. Перейдем обратно в режим конструктора запросов. Опять можем щелкнуть на правую кнопку мыши и щелкнуть на кнопке Конструктор запросов. А можем воспользоваться вот этой кнопкой Вид на панели инструментов. Надо сказать, что кроме этих двух типов представления нашего запроса, а именно представления в режиме конструктора и представления в режиме таблицы, существует еще один вид представления нашего запроса, это представление в виде SQL. Для того чтобы посмотреть, как в этом режиме выглядит наш запрос, щелкнем на правую кнопку мыши и выберем первый пункт во всплывающем меню, режим SQL . Если мы щелкнем, то можно увидеть, как реально выглядит наш запрос именно в том виде, в котором компьютер сохраняет его для себя и выполняет после окончания работы конструктора запросов. Как мы видим, этот режим, это простонапросто текстовый файл, в котором в соответствующем закодированном виде с соответствующими правилами, описаны все наши действия по выборке для нашего запроса. Переключимся сейчас обратно на стандартный режим конструктора запросов. Для этого, например, щелкнем на правую кнопку мыши и выберем пункт Конструктор запросов и вот мы обратно в этом режиме. Попробуем теперь модернизировать наш запрос, поскольку всего одно поле в результирующем запросе, это, конечно же, слишком мало. Получается достаточно мало информации и результат выполнения нашего запроса мало вразумителен. Для этого введем еще одно поле в соответствующую колонку в нашей таблице запросов. Надо отметить, что так же как и в обычной таблице, в таблице запросов может содержаться до 255 колонок. В принципе, это достаточно большое число и, по крайней мере, сейчас их меньше. Для того чтобы создать здесь еще одну колонку, щелкнем на вот этом выпадающем списке и после того, как появился вот этот список всех полей в нашей таблице, выберем, например, поле Фамилию. Посмотрим теперь, как будет выглядеть наш запрос. Для этого щелкнем на вот этой кнопке Вид. И результат выполнения этого запроса мы можем видеть на нашем экране. В принципе, это уже, конечно же, более содержательная часть нашей выборки. Можем видеть и код покупателя и соот-
Глава 6. Запросы.
141
ветствующую фамилию, которая ему соответствует. Перейдем опять в режим конструктора запросов, щелкнув на соответствующую кнопку.
6.2. Конструктор запросов Обратим внимание еще на одну ячейку, которая есть у нас в этой таблице. А именно, ячейку вывода на экран. Как мы видим, здесь у нас в обеих колонках стоит галочка, что означает, что оба эти поля будут участвовать у нас в запросе. Вернее будут выводиться в результирующую таблицу. Если мы снимем флажок с какого-либо из полей, то соответствующее поле не будет выводиться. Оно будет формироваться в запросе, но выводиться на экран не будет. Т.е. какое-либо действия, связанные с этим поле, в принципе, могут происходить, если мы включим сортировку именно по вот этому полю, то она будет выполняться. Посмотрим, как это будет выглядеть в нашем окне. Для этого перейдем в режим вида таблицы и вот, как мы видим, вот эта таблица появилась перед нами. Опять здесь всего лишь одна колонка. Как мы видим, она у нас стоит по возрастанию 1,2,3,4 и т.д., что в принципе, соответствует стандартному виду записи в нашей таблице. Поскольку в первом поле является код Счетчик. Переключимся обратно в режим конструктора и посмотрим, что будет, если мы включим сейчас сортировку по возрастанию. Например, для вот этого поля. Опять перейдем в режим вида таблицы и, как мы видим, вот все эти цифры, соответствующие коду покупателя у нас заполнились в хаотичном беспорядке. В принципе можно догадаться, почему это происходить. Поскольку у нас компьютер просто-напросто отсортировал все по фамилии. Посмотрим, так ли это, перейдем в режим конструктора и включим, наконец, отображение фамилии в нашей результирующей таблице. Таблицы запроса. Теперь попробуем опять выполнить наш запрос и, как мы видим, сейчас уже более четко видно, что же произошло. А именно, у нас все наши записи в запросе рассортировались по фамилиям. Ну и в соответствии с этим, код покупателя, который соответствую каждой фамилии, расположился вот в таком беспорядке. Перейдем опять в режим конструктора. Если нам по каким-либо причинам какое-либо поле не нужно, мы его можем выделить, и, щелкнув на кнопке Delete очистить соответствующее поле. И в результате вот это поле участвовать в конструкторе запроса уже не будет. Ну и далее опять мы можем заполнить его каким-либо полем из любой таблицы, которая может присутствовать в конструкторе запросов. Ну, сейчас у нас всего лишь одна таблица и поэтому, конечно же, мы ею и его полями и ограничимся. Ну, никаких ограничений по тому, какое поле использовать, в принципе не существует. Можем, например, взять вот это поле Телефон и перетащить его в наш бланк конструктора запросов. Точно также можем перетащить и любое, причем надо сказать, что расположение вот этих полей, в нашей результирующей таблице, конечно же, никакого отношения к порядку расположения их в исходной таблице не имеет. Мы их можем расположить в любом удобном нам порядке. Вот, например, у нас в данном конкретном случае поле Телефон идет перед полем Именем. Хотя в исходной таблице как раз наоборот. Если мы сейчас щелкнем на кнопке перехода в режим таблицы, то можно увидеть, как все это будет здесь выглядеть. Как мы и ожидали, здесь у нас три поля. Код покупателя, телефон и имя. Перейдем опять в режим конструктора. Отметим, что поля в нашей таблице можем располагать в нашем запросе не только произвольным образом, но и можем их дублировать. Например, вот это поле Имя, которое мы только что выбрали, можем взять и перетащить еще раз. Вот сейчас у нас в нашей таблице два поля с именем.
142
TeachPro Microsoft Access 2003
Даже можем перетащить еще раз. В принципе, никакого ограничения тут не существует. Правда, целесообразность такого выполнения запроса достаточно сомнительно, но, тем не менее, возможность такого есть. Если мы сейчас выполним наш запрос, в принципе, можем перейти в режим таблицы, щелкнув на вот этой кнопке Вид, или даже можем щелкнуть на вот эту кнопку Запуск, запуская выполнение нашего запроса. В результате можно увидеть, что у нас получилось. Конечно же, наряду с полем Код покупателя и Телефон, у нас появилось поле Имя, которое, как мы видим, еще и дублировалось несколько раз. Надо сказать, что и хотя содержимое этих ячеек абсолютно одно и то же, тем не менее, название у этих полей разное. Первое название это Имя, в принципе вполне достаточно понятно. А вот эти два названия, они образовались достаточно произвольным образом. Сгенерированно из того условия, что название полей, конечно же, не могут повторяться. Это стандартное требование в базах данных. Перейдем опять в режим конструктора. И, конечно же, удалим вот эти два поля, которые, конечно же, никакой информационной насыщенности не несут. Для этого выделим их обоих, нажав на кнопке Shift, и щелкнув на соответствующем месте при помощи мыши. И далее щелкнем на кнопке Delete. В результате, получив вот такой нормальный вид нашего запроса. Если мы хотим в наш запрос поставить несколько полей из вот этой таблицы одновременно, мы их можем выбрать вот в этой исходной таблице. Немного расширим его для удобства. И перетащим несколько полей. Для этого можем, например, воспользоваться кнопкой Shift, нажав на которую мы можем перетащить несколько полей одновременно, между первым и последним щелчком мыши. Вот эти поля выделились, далее перетащим их в наше свободное поле бланка и, как мы видим, эти несколько полей у нас автоматически заполнились в нашем бланке запросов. Ну, конечно же, все это отобразится и в режиме таблицы, в результате выполнения запроса. Вот можно видеть это в соответствующем окне запроса на выборку. Вот эти 4 поля, которые мы только добавили, они отобразились в нашем окне. Ну и, конечно же, поскольку у нас несколько полей оказались повторяющимися, их имена заполнились вот такими аббревиатурами сгенерированными автоматически. Перейдем опять в режим конструктора и удалим записи из нашего бланка. Для этого выделим их все. Далее щелкнем на кнопку Delete и вот мы получили абсолютно пустой бланк. А теперь, если мы опять хотим заполнить его каким-либо значением, например, выделим на этот раз, нажав на кнопку Ctrl. В результате мы получаем возможность выделения поля, идущие подряд. Например, вот эти три поля. Перетащим их, и как мы видим, они тоже автоматически появились в нашем бланке. Надо отметить еще одно обстоятельство. А именно, если мы хотим чтобы в нашей таблице в результате появились все поля из исходной таблицы, для этого совсем необязательно перетаскивать их по одному вот в этот бланк. Например, удалим предварительно все эти поля, выделим их, щелкнем на кнопке Delete и перетащим вот эту звездочку, которая находится вот в этой таблице. И в результате здесь появилась надпись Покупатели точка звезда. Эта аббревиатура, как раз и означает, что в результирующей таблице мы хотим видеть все поля из вот этой исходной таблицы. В нашем конкретном случае таблицы покупателя. Если мы сейчас перейдем в режим таблицы, щелкнем на кнопке выполнения запроса, то можно увидеть, что у нас получилось. А именно, вот эта таблица, она один к одному повторяет исходную таблицу, поскольку здесь выведены все поля, которые в ней находились. Отметим еще одно обстоятельство, связанное с запросами. А именно, вот эти поля, которые у нас отобразились в запросе на выборку, мы можем совершенно спокойно редактировать, в отличие
Глава 6. Запросы.
143
от других программ, от выполнения запросов в них. Например, если мы изменим что-либо вот в этой записи, вместо имени Дмитрий, введем имя Петр, то, как мы видим, компьютер совершенно спокойно дал нам это сделать. Посмотрим теперь, как все это выглядит в исходной таблице. Для этого перейдем в исходную таблицу. Для этого вызовем вот это стандартный вид нашей базы данных и в нем, перейдя во вкладку Таблицы, вызовем таблицу, таблицу Покупатели. Щелкнем на ней дважды. Вот мы видим, что здесь у нас совершенно правильно, как мы и задумали, изменилась вот эта ячейка. Появилось имя Петр. Попробуем опять его переделать. Например, напишем здесь цифру 2. Сохраним и закроем эту таблицу. А если сейчас мы обратно перейдем в наш запрос, то можно увидеть, что это изменение автоматически отобразилось и в нашем запросе на выборку. Перейдем теперь опять в режим конструктора. И отметим одно обстоятельство, связанное с вот таким редактированием. Программа разрешает нам такое редактирование, но не во всех случаях. А именно, только в тех случаях, когда результирующая ячейка, полученная в результате выполнения запроса однозначно характеризует исходную таблицу. Если же такой однозначности нет, тогда редактировать соответствующую ячейку уже невозможно. Например, если у нас результирующей ячейкой является суммой каких-либо ячеек из исходной таблицы или получается в результате еще какого-либо преобразования, то в этом случае однозначного соответствия между результирующей ячейкой и его исходной частью уже не существует. Например, она может быть получена в результате суммы двух ячеек и тогда компьютеру будет просто-напросто непонятно, какую же из них мы должны изменить для получения нужного результата. До тех пор, все, что мы говорили в нашем конструкторе запросов относилось всего лишь к одной таблице, таблице покупатели, которая у нас здесь и находится. Надо сказать, что добавить таблицу в наш конструктор запросов можно в любой момент. Для этого можем щелкнуть на вот этот плюс. Появилось окно добавления таблицы или же можем щелкнуть на правую кнопку мыши и выбрать пункт Добавить таблицу. В любом случае, мы получаем вот это окно, в котором можем выбрать любую из таблиц, которая находится у нас в нашей базе данных. Попробуем поэкспериментировать. А именно, попробуем добавить ту же самую таблицу еще раз, таблицу покупатели. Выберем ее, щелкнем на кнопку Добавить. И закроем это окно. Как мы видим, у нас эта таблица появилась еще раз. Раскроем ее чуть-чуть и можно видеть, что у нее несколько изменилось название, а около названия таблицы появилась вот такая черточка и единица. Конечно же, это происходит именно для того, чтобы могли различить эти две таблицы друг с другом. Удалим теперь вот этот столбец, который разрешает нам вывести все поля из таблицы Покупатели. Для этого щелкнем на кнопку Delete. И теперь перетащим, например, вот этот код покупателя сюда. А из другой таблицы, из дополнительной таблицы 1 тоже перетащим код покупателя, но во вторую колонку. И теперь посмотрим, как будет выглядеть наш отчет по вот этому запросу. Для этого выполним его. Щелкнем на кнопку выполнения запроса. И в результате мы можем видеть вот такой странный вид нашего запроса. Как мы видим, если с левой стороны в первой колонке у нас достаточно стандартно возрастает код покупателя, то с правой стороны у нас написано просто-напросто одно число. Дело в том, что при выполнении нашего запроса, компьютер объединил обе таблицы, вернее одну и ту же таблицу с самим собой, в результате чего, получая вот такую таблицу, число записей в которых равно квадрату числа записей в каждой из исходных таблиц. В нашем случае, квадрату записи исходной одной таблицы. Каждая из записи в одной таблице соответствуют все записи из
144
TeachPro Microsoft Access 2003
другой таблицы. И т.д. Рассмотрим тот же самый случай на более простой таблице. Перейдем для этого в режим конструктора. И удалим обе таблицы. Для этого достаточно щелкнуть на кнопке Delete, выделив одну, а затем вторую таблицу. Вот сейчас мы имеет абсолютно чистый конструктор запросов. А теперь щелкнем на правую кнопку мыши и выделим пункт Добавить таблицу и добавим на этот раз таблицу сотрудников. Здесь у нас гораздо меньшее число записей. Щелкнем на кнопке Добавить. Опять добавим ту же самую таблицу. И попробуем завершить тот же самый трюк, а именно, выбрав одно и то же поле, и в одном и в другом случае. Теперь выполним этот запрос, и можно видеть, что у нас получилось. Как мы видим, из таблицы сотрудники-1 в одной и той же записи под номером 1 соответствуют поочередно все записи из поля сотрудники. Далее идет запись под номером 2 в таблице Сотрудники-1 и все поля из первой таблицы. Ну и т.д. В результате чего мы получаем общее количество записей 49. Хотя количество записей в одной таблице равняется 7, что достаточно легко посчитать вот в этом месте, например. Переключимся обратно в режим конструктора и отметим, что таким образом можно случайно поставить из нескольких таблиц соответствующие поля в нашу выборку Запрос. И если не поставим при этом никаких связей между таблицами, то получим в результирующей таблице число записей, равное произведению соответствующих записей в исходных таблицах. Что может быть достаточно большим числом. Т.е. допустив такую ошибку, мы можем достаточно долго прождать результат выполнения нашего запроса. Он может занять очень большое место на нашем диске и вообще замусорить нам компьютер. Поэтому при заполнения бланка запроса надо быть достаточно острожным, чтобы не допустить вот таких неправильных действий. Поэтому удалим вот эту таблицу. Щелкнем на кнопке Delete и возвратимся к стандартному уже достаточно правильному виду запроса, при котором вот таким странным образом не будут повторяться таблицы в запросе.
6.3. Заполнение условий отбора, урок 1 Продолжим работу с запросами и попробуем опять сконструировать различного рода запросы при помощи конструктора. Для этого перейдем во вкладку Запросы в нашем стандартном виде базы данных, и откроем создание запроса в режиме конструктора. Щелкнем дважды для этого на этой строке. Появляется опять вот это стандартное окно конструктора запросов, в котором, первое, что нам нужно сделать, это, конечно же, добавить какую-либо таблицу, на основе которой мы и будем строить наш запрос. Выберем, например, таблицу Покупатели, щелкнем на кнопку Добавить. И он, конечно же, автоматически добавился у нас в верхней части конструктора запросов. Закроем это диалоговое окно. Больше пока ничего добавлять не будем. А будем строить наш запрос на основе вот этой одной единственной таблицы. Немного расширим окно, которое у нас занимает наш конструктор запросов. И, как мы уже отмечали ранее, для того чтобы запустить наш запрос и чтобы он чтонибудь выполнил, нам нужно в нижней части этого конструктора запросов выбрать хотя бы одно поле, по которому и будет выполняться наш запрос. Иначе, наш компьютер выдаст ошибку. Поэтому, достаточно перетащить какое-либо поле из таблицы покупатели или же выбрать, щелкнув на вот этом ниспадающем списке. В том или ином случае, мы получаем вот такого рода заполненную колонку и далее, щелкнув на кнопке запуска нашего запроса, получим некий результат в виде вот такой результирующей таблицы.
Глава 6. Запросы.
145
Пока в принципе особого смысла во всех этих операциях вроде бы и нет. Если бы все предназначение этих запросов назначалось только в выборе определенных колонок и отображение их в результирующую таблицу, то не надо было и огород городить. Но при помощи запросов можно конструировать и гораздо более сложные конструкции, Перейдем в режим конструктора запроса, щелкнем на вот этой кнопке Вид. Попробуем что-либо добавить в наш конструктор запросов. Запрос отличается принципиально от таблицы именно тем, что в нашем запросе можно устанавливать различного рода критерий, по которому будут отбираться записи в таблице или совокупности таблиц. Все эти критерий мы должны вписать вот в эту нижнюю часть нашего бланка, в каждом из которых мы можем вставить какой-либо критерий. Если мы немного расширим это окно, то можно увидеть, что количество критериев ограниченное число. Здесь у нас 9 строчек, для того чтобы мы могли вводить различного рода конструкции и полей, в которых мы можем сочетать различного рода условий, тоже, как мы помним, 255. В принципе это достаточно много для того чтобы мы могли сконструировать достаточно сложное выражение. Но если нас это все равно не удовлетворяет, тем не менее, мы можем объединять в одной ячейке несколько условий отбора тоже. Ну, с этим мы познакомимся позже. Введем теперь какой-либо критерий. Какое-либо условие отбора. Например, нас интересуют все покупатели, имя которых является, например, словом Борис. Введем вот это имя в эту ячейку условия отбора. Переключимся на какую-либо ячейку в этом бланке и, как мы видим, это слово автоматически ставилось у нас в кавычках. Что еще раз подчеркивает, что это слово является текстовым выражением. Посмотрим сейчас, как будет выглядеть наш запрос. Для этого переключимся в вид таблицы. И можно увидеть всех тех персонажей, которые у нас имеют имя Борис. В принципе, как мы видим, их довольно много. И для того чтобы их отличить друг от друга выведем еще и фамилию этих покупателей, для того чтобы мы могли немного их отличить. Попробуем еще раз перейти в режим таблицы и можем видеть, какие фамилии есть у всех Борисов покупателей из нашей таблицы. Переключимся обратно. А теперь же отметим, что вот это условие отбора, которое мы сейчас задали, а именно точное совпадение имени с какой-либо аббревиатурой, является достаточно жестким условием. Что же делать, если мы точно не знаем, какие имя у нашего персонажа. Знаем только приблизительно его написание. Например, если мы колеблемся, зовут ли нашего покупателя то ли Алексей, то ли Александр, в этом случае мы можем вводить в наше условие отбора различного рода специальные символы, такие как звездочки, вопросительные знаки, которые имеют свойство заполнять собой недостающие символы. Например, в нашем конкретном случае напишем Алекс и дальше поставим знак звездочкой, предполагая, что окончание может быть любым. и Алексей и Александр. В качестве вот такого символа может использоваться знак звездочки и знак вопросительного знака. Отличие между ними в том, что звездочка означает любое количество любых символов, а вопросительный знак означает любой символ, но один единственный. Т.е. если бы мы вот в этом месте вместо звездочки написали вопросительный знак, вот таким образом, это бы означало, что мы хотим выбрать всех тех покупателей, у которых имя начинается на Алекс и дальше стоит еще одна буква. Любая, но одна. Т.е. например, именно Алексей и Александр уже под этот критерий не подходит. Поэтому, для того чтобы выбрать именно то, что нам нужно. поставим здесь звездочку. Переключимся на любую другую ячейку и можно увидеть, что в этой ячейке добавились еще какие-то новые символы. А именно, во-первых, понятно, что вот это наше буквосочетание компь-
146
TeachPro Microsoft Access 2003
ютер автоматически поставил в кавычки, выделяя, таким образом текстовую сущность его. Ну и впереди поставил слово Like, что в принципе по-английски означает "похожий". Т.е. теоретический компьютер ищет все записи, в которых имя нашего персонажа, нашего покупателя похоже, т.е. слово Like на слово, которое начинается на Алекс. Посмотрим, что в результате у нас получится. Для этого переключимся в режим таблицы, щелкнем на вот этой кнопке и можно увидеть, что мы как раз получили то. что хотели. А именно, мы получили всех Александров и всех Алексеев, вместе со своими фамилиями. И даже мы получили еще двух покупателей с именем Александра. Конечно же, все они у нас начинаются с Алекс. Переключимся обратно в конструктор. Попробуем теперь добавить в наше условие еще какой-либо пункт, а именно представим себе, что нас интересует не только Алексей и Александр, но и имена покупателей, которые являются именем Борис. Для этого достаточно написать в следующей строке это имя. Напишем Борис. Переключимся и на этот раз мы получили два условия. А именно, все те персонажи, которые у нас начинаются с Алекса и все те, у которых имя точно совпадает с именем Борис. Конечно же, во второй строке мы тоже могли вставить здесь, например, звездочку, вопросительный знак и т.д., для того чтобы по-другому установить вот этот критерий отбора. Но сейчас воспользуемся именно таким. Т.е. мы ищем всех персонажей, имя которых начинается на Алекс, или же имя которых точно совпадает с именем Борис. Как мы видим, различные строчки в наших условиях отбора связываются при помощи связки или. Т.е. оно удовлетворяет или первому, или второму условию. Перейдем в режим таблицы. Щелкнем на соответствующую строку, и как мы видим, у нас как раз и получилось то, что мы хотели. А именно мы получили именно Александр, именно Алексей, именно Борис и именно Александра, вместе со всеми своими фамилиями. И количество записей, конечно же, уже гораздо больше, чем было, когда у нас был всего лишь один критерий отбора. Переключимся обратно в режим конструктора. Отметим, что мы можем вставлять условия отбора не только в одну колонку, но и в другую колонку тоже. А именно, допустим, поставим какое-либо ограничение и на фамилию покупателя. Для этого в соответствующую ячейку, например, поставим в качестве критерия отбора все фамилии, которые начинаются на букву П. Поэтому напишем П и далее звездочка. Щелкнем где-либо и переключимся на другую ячейку. Ну, конечно же, впереди компьютер поставил так, а все что мы написали, он поставил в кавычки. Все это уже в принципе достаточно понятно. А теперь же посмотрим, как все это будет выглядеть. Для этого щелкнем на кнопку запуска нашего запроса. И можно увидеть, что у нас получилось. В принципе, мы немножко не очень правильно выбрали сочетание наших критериев и поэтому у нас просто-напросто получились все те персонажи покупателей, у которых имена начинаются на Алекс, т.е. Александр, Александра или Алексей, и фамилия начинается на букву П. А вот все те покупатели, у которых имя представляет собой имя Борис, у них могут быть любые фамилии. Как можно видеть из этой запросной таблицы. Переключимся обратно и можем исправить этот недостаток, и то же самое условие, начинающееся на букву П вставить и вот в эту ячейку. Для этого опять напишем букву П, опять звездочка и на этот раз, выполнив этот запрос, можно увидеть всех тех покупателей, которые являются Александром, Борисом и т.д., а фамилия у которых начинается на букву П. На этот раз мы получили уже то, что мы и хотели получить. Перейдем обратно в режим конструктора. Конечно же, констатируем тот факт, что те критерий, которые находятся на одной горизонтали в одной строке, они, как можно понять, объединяются при помощи
Глава 6. Запросы.
147
связки "и", а те, которые находятся на разных строчках, при помощи связки "или". Т.е. у нас в данном конкретном случае получаются все те записи, которые удовлетворяют вот этим двум ячейкам, которые находятся рядом в одной строке и связаны при помощи связки. И удовлетворяет вот этим двум строчкам, которые находятся ниже на второй строке и тоже связаны с буквой 'и' и далее компьютер объединяет эти два условия при помощи связки "или". Попробуем убрать вот эти критерии во второй строке и тогда, щелкнув на вот это выполнение запроса, можно увидеть всех тех покупателей, которые у нас являются Алексеем и Александрами и у которых фамилия начинается на букву П. А что же нам делать, если мы хотим выбрать все те персонажи, которые удовлетворяют или условию Алексею или условия начала на букву П. Для этого тогда нам надо их разнести в разные строчки, поэтому удалим вот эту запись из соответствующей ячейки. И введем ее строкой ниже. Напишем букву П, звездочка и щелкнем где-либо в наших ячейках. И теперь если мы выполним этот запрос и щелкнем на соответствующую кнопку, то можно увидеть всех тех покупателей, которые или начинаются на Александра или Алексей, или же у которых фамилия начинается на букву П. Вот, например, у нас покупатель с именем Вячеслав, который, конечно же, не является ни Александром, ни Алексеем. но у него фамилия начинается на букву П. Ну и наоборот, персонаж с именем Александр. у него фамилия начинается не на букву П, но тем не менее, попал в этот список. Переключимся обратно в режим конструктора. Под ним опять вот это условие Like в верхней ячейке. Удалим ее внизу. Напишем наверху букву П со звездочкой. что означает начало фамилии покупателя на букву П, и попробуем создать опять запрос, который выведет нам всех Алексеев или же Борисов, у которых фамилия начинается на букву П. Мы это уже делали, но сейчас попробуем сделать это немножко по-другому. А именно ввести этот критерий все в одну строку. Для этого немного расширим вот это поле, чтобы нам было куда писать наши конструкции и напишем таким образом. Введем здесь связку, при помощи которой будем связывать два условия отбора. В конструкторах отбора, если мы хотим в одной ячейке вписать несколько условий одновременно, мы их должны связать друг с другом соответствующей связкой, которым является или слово OR или слово AND, это английские слова, которые, конечно же, означают "или" или же "и". Свяжем сейчас в нашем конкретном случае при помощи связки OR "или" и далее таким образом внутри кавычек напишем опять слово Борис. Это опять-таки тот же самый критерий, которым мы руководствовались чуть ранее. Но на этот раз он у нас поместился в одну строчку. Если мы сейчас переключимся в режим выполнения нашего запроса, щелкнув на соответствующую кнопку. То мы опять получаем всех Александров и Борисов фамилия которых начинается на букву П. Конечно же вместе с Алексеями и Александрами. Переключимся опять в режим конструктора запросов. Отметим еще одно обстоятельство, что, конечно же, при работе с нашими запросами, конечной целью является получение некой таблицы, которую мы можем в дальнейшем рассмотреть и принять по ней какие-либо рекомендации или выводы. Но, конечно же, очень часто нам бывает необходимо сохранить нашу работу, для того чтобы мы могли в дальнейшем воспользоваться этим запросом, а не конструировать его снова. Да и к тому же мы можем на основе уже существующих запросов, в дальнейшем воспользоваться им, как таблицей, строить новые запросы. Поэтому щелкнем на кнопке Сохранить. Конечно же, компьютер предлагает нам сохранить ее под каким-либо именем. И в качестве имени автоматически он предлагает нам запрос 1. Это в принципе достаточно безразличное ко
148
TeachPro Microsoft Access 2003
всему имя. Лучше ввести какое-либо вразумительное имя. И надо иметь в виду еще одно обстоятельство, а именно, в дальнейшем при конструировании сложных запросов, мы можем опираться и на таблицы и на запросы. И в этом случае нам будет достаточно сложно отличить одних от других. И для этих целей, лучше, хотя бы для себя принять какой-либо критерий, по которому мы смогли бы отличить один от другого. Например, ввести какой-либо префикс перед именем запроса, по сравнению с именем таблицы. Например, написать букву Q, от слова - запрос. Напишем дальше какое-либо имя. Например, дальше напишем наш первый запрос и щелкнем на кнопке ОК. Дальше мы можем закрыть этот запрос и, как мы видим, запрос с соответствующим именем появился у нас в отделении запросов. Далее мы можем щелкнуть на нем дважды, и в этом случае он автоматически запускается в режиме таблицы, показывая нам все записи, которые получаются при выполнении соответствующего условия, которое записано в этом запросе. Если мы сейчас хотим как-либо скорректировать условия нашего запроса, то, конечно же, мы должны опять щелкнуть на кнопке перехода в режим конструктора, и в дальнейшем можем опять что-либо изменить в этом запросе. Надо отметить, что далеко не всегда, особенно на начальном этапе работы с программой мы можем достаточно легко конструировать вот такого рода запросы, и достаточно часто у нас возникают какие-либо вопросы, на которые хотелось бы получить квалифицированный ответ. Но именно в этом случае нам помогает возможности справки, которые предоставляет нам программа. Достаточно, находясь в конструкторе запроса в соответствующей ячейке, просто-напросто щелкнуть на кнопке F1, получив соответствующую помощь. Так мы сейчас и попробуем сделать. Щелкнем на кнопке F1. Появляется окно справки, и здесь введем тот критерий, по которому мы хотим получить справку. В нашем конкретном случае это условие отбора. Щелкнем на кнопку Enter. И мы получаем все те возможные варианты вопросов, на которые мы могли бы получить ответ. Выберем первый из них, условия отбора для наших записей. Щелкнем на нем и можем прочитать, что предлагает нам программа в качестве помощи по этому вопросу. Как нам заполнять условия отбора в соответствующих ячейках. Закроем теперь эти окна помощи, щелкнув на соответствующих крестиках. И вернемся обратно. Надо сказать, что мы можем помощь получить и так сказать в более простом варианте, в экспресс форме. Для этого достаточно нажать на кнопку Shift и далее на кнопку F1. В этом случае появляется вот такой вопросительный знак рядом с курсором, и далее мы можем подвести к любому интересующему нас объекту, в частности к условию отбора. Если мы щелкнем, то получим вот такую экспресс помощь в виде нескольких строчек. В принципе здесь тоже достаточно точно и четко можно прочитать, как нам можно создавать и пользоваться пунктом условия отбора. Щелкнем где-либо, чтобы снять эту подсказку. И можем дальше модернизировать наш запрос в конструкторе запросов.
6.4. Заполнение условий отбора, урок 2 Продолжим работу с конструктором запросов, который мы начинали ранее. А именно, попробуем модернизировать в дальнейшем вот этот запрос, который мы уже создавали. Для этого щелкнем на нем дважды, чтобы вывести его на наш экран. Вот он появился перед нами. Конечно же, появился он у нас в режиме таблицы и для того чтобы перейти в режим конструктора, щелкнем на соответствующую кнопку, и можем видеть, конечно же, тот критерий, при помощи которого и создавался этот запрос. Расширим вот это окно конструктора запросов, чтобы у нас было больше возможности для ввода различного рода условий. И теперь попробуем как-либо сконструировать запрос, чтобы мы могли поставить условия на какиелибо численные значения, которые у нас есть в каких-либо полях. Например, у нас есть численное значение Код покупателя. Во-первых, удалим все те условия, которые у нас уже тут были, выделим их. Удалим и из одной ячейки, из второй ячейки. И далее вставим новое поле, поле Код покупателя. Конечно же, мы его можем или перетащить или выбрать при помощи вот этого ниспадающего списка. Например, сейчас щелкнем на вот эту кнопку и выберем код покупателя. А теперь выберем для него условие отбора. Например, в каче-
Глава 6. Запросы.
149
стве условия отбора напишем просто-напросто больше чем 10. И, если мы сейчас выполним этот запрос, щелкнув на кнопке Запуск, выполнение запроса. Можно увидеть всех тех покупателей, код которых больше, чем 10. Ну, вот можно увидеть, что у нас они начинаются с 11, 12, 13 и т.д. Переключимся обратно в режим конструктора и изменим "больше" на "меньше". Выполним и этот запрос, и на этот раз можно увидеть, что у нас гораздо меньше записей, поскольку этому критерию, критерию код покупателя меньше 10, удовлетворяет всего лишь несколько записей, которые мы можем видеть перед собой. Переключимся опять в режим конструктора. Попробуем написать таким образом этот критерий. В одной строке напишем больше 10, а в следующей, меньше 10. Что мы при этом должны получить. А именно, все те записи, код которых больше 10, или меньше 10, т.е. грубо говоря, все записи, кроме конкретно равенства 10. Если мы сейчас переключим на режим выполнения этого запроса, то можно увидеть, что у нас есть и записи, код которых больше, чем 10, и в принципе, можно найти и те записи, код которых меньше, чем 10. А вот записи с кодом, который равняется точно 10, у нас не будет. Переключимся обратно в режим конструктора и напишем таким образом, а именно попробуем найти все те записи, которые удовлетворяют этим двум условиям одновременно. Для этого после больше 10, напишем End, это у нас связка. Конечно же, такого рода связки надо писать на английском языке. Русское слово или "или" не годится, и затем, вот это нижнее условие больше 10, напишем здесь в этой же ячейке. Нижнюю строку сотрем и попробуем выполнить этот запрос. Щелкнем на кнопке и, конечно же, как и можно было ожидать, мы получили просто-напросто пустую таблицу. Условию и больше 10, и меньше 10, одновременно ничего удовлетворять не можем. Перейдем обратно в режим конструктора и на этот раз делаем более вразумительные условия. А именно, возьмем всех тех покупателей, код которых больше 10, но меньше 20. Это уже более разумное условие. Если мы выполним этот запрос, то можно увидеть все те покупатели, которые удовлетворяют этим условиям. Переключимся обратно в режим конструктора. Посмотрим теперь, какие возможности у нас есть по условиям отбора других типов полей. Например, поле, которое имеет тип даты. В нашей таблице у нас есть одно поле Дата рождения, который имеет тип даты. Выберем его в качестве поля, по которому мы задаем условия для отбора. Для этого щелкнем на вот этом ниспадающем списке. Выберем вот этот пункт Дата рождения. Вот это условие больше 10, меньше 20, конечно же, нас уже сейчас не удовлетворяет. А напишем другое условие. Например, если мы хотим узнать всех тех покупателей, дата рождения которых, например, больше определенного числа, напишем таким образом. Знак больше. И далее нам нужно написать дату. Причем напишем ее обрамленную вот такими значками, в виде перекрещивающих линий. Далее введем ту дату, которая нам нужна. Например, 1.01.90 года. Дальше опять вот этот специальный символ. Переключимся в какую-либо другую ячейку. При этом компьютер привел в порядок нашу запись вот этой даты. Приводя ее к стандартному виду. И выполним вот этот запрос. Щелкнем на кнопку запуска и можно увидеть всех тех покупателей, которые в нашей экспериментальной таблице зарегистрированы с датой рождения больше 90 года. Как мы видим, у нас таких несколько персонажей. Переключимся обратно в режим конструктора и попробуем изменить этот критерий. А именно поставить здесь знак меньше. Т.е. все те, кто старше, кто родился до этой даты. Если мы выполним этот запрос, то можно увидеть, что таких персонажей тоже, конечно же, достаточно много. Перейдем опять в режим конструктора и попробуем так сказать объединить эти два условия.
150
TeachPro Microsoft Access 2003
А именно и больше определенной даты, и меньше определенной даты. Для этого мы можем воспользоваться ключевым словом. Но прежде расширим вот это поле, для того чтобы у нас целиком поместилось все наше условие. Далее напишем ключевое слово. Далее введем знак больше, и внутри вот этих наших специальных знаков, введем ту дату, которую мы хотим ввести в качестве первого из условий. Пусть это будет 01.01.85 года. Далее эти два условия надо объединить при помощи связки End, для того чтобы конструкция была правильная. Далее переключимся в какую-либо другую ячейку. Компьютер привел эту дату в порядок. Отметим еще одно обстоятельство. Мы тут знаки больше-меньше ввели зря. Это слово как раз и означает между вот этими двумя датами. Поэтому уберем эти знаки больше- меньше, превратив наш запрос вот в такую конструкцию. Дата между первой и вторым значениями. Теперь же выполним этот запрос, щелкнув на запуск этого запроса, и можно увидеть все те персонажи, которые родились у нас между этими двумя датами. Между 85 и 90 годами. В принципе можно увидеть, что дата рождения наших персонажей, конечно, не отличается достаточно большим разнообразием, но в принципе это сейчас не очень важно. Переключимся обратно в режим конструктора и вместо этого слова попробуем удалить это слово и сконструировать при помощи знаков больше и меньше. А именно, напишем больше, чем первое из значений, и меньше, чем вторая дата. В принципе, мы должны получить абсолютно то же самое. Посмотрим, так ли это. Переключимся в режим таблицы. И можно увидеть, что, как мы и ожидали, мы получили абсолютно тот же самый набор записи. Переключимся обратно в режим конструктора запросов и удалим вот это условие отбора. Отметим еще одно обстоятельство. Наряду с, так сказать, прямыми условиями отбора, при котором мы вводим какое-либо условие, которое мы хотим, чтобы выполнилось. Например, выведем всех покупателей, у которых фамилия начинается на букву "A", напишем это таким образом, А и далее звездочка. Если мы сейчас выполним этот запрос, то можно увидеть всех тех покупателей, у которых, как мы и можем видеть из этой таблицы, фамилия начинается на букву "A". Наряду с вот такими запросами, мы можем сконструировать наш запрос, написав впереди слово, т.е. отрицание этого условия. Попробуем теперь выполнить запрос вот в таком виде. Щелкнем на соответствующую кнопку и можно видеть всех тех покупателей, у которых фамилия не начинается на букву "A". В принципе, проглядев эту таблицу, можно убедиться, что так оно и есть. Переключимся обратно в режим конструктора запроса. Попробуем теперь по-другому сконструировать этот же запрос. А именно вывести всех тех покупателей, фамилия которых вообще не содержит букву "A" посередине фамилии. Для этого напишем в этом месте еще одну звездочку и большую букву "A" заменим на маленькую. А теперь же переключимся на какую-либо другую ячейку и выполним этот запрос. Щелкнем на соответствующей кнопке выполнения запроса и можно увидеть, что у нас все покупатели с буквой "A" вообще исчезли. А в фамилии нет ни одной буквы "A", что можно увидеть из этой таблицы. Переключимся обратно в режим конструктора и попробуем выполнить еще одно условие. А именно, вывести все те записи, которые содержат пустоты, например, в имени. Вот этот критерий можем убрать, он нам уже не нужен и напишем условие Да пустоты в имени. Для этого нам нужно написать просто-напросто ключевое слово 0. Конечно же, компьютер автоматически преобразовал это словосочетание, в из 0. И далее, щелкнув на кнопке выполнения запроса, можно увидеть, что в нашей таблице, оказывается, присутствуют покупатели, у которых не прописаны имена. Присутствуют только одни фа-
Глава 6. Запросы.
151
милии. Переключимся обратно в режим конструктора запросов. Конечно же, тот же самый критерий мы можем заменить на обратный, приписав впереди таким образом. Теперь же, выполнив вот этот запрос, получим все те покупатели, у которых обязательно заполнено поле имени, пустот в этих ячейках быть не должно. Переключимся обратно в режим конструктора запросов. А теперь попробуем сконструировать запрос таким образом, чтобы мы могли изменить то имя, которое появляется у каждого поля в нашем запросе. В принципе, при обычном запросе имя соответствующих колонок совпадает с именем соответствующего поля. Т.е. мы получаем вот эти же имена. Имя, фамилию и дата рождения. Так, как у нас и есть. Но, мы это можем и изменить. Для этого достаточно ввести, например, вместо имени, вот в нашем конкретном случае какую-либо другую аббревиатуру. Например, напишем на английском языке, далее двоеточие, переключимся в какую-либо другую ячейку и попробуем выполнить этот запрос. Как мы можем видеть, у нас в ячейке поле введено Name, далее двоеточие и далее старое имя этого поля. Т.е. после двоеточия идет именно то имя, которое у нас находится в соответствующем поле соответствующей таблицы. Выполним теперь, щелкнем на кнопке Запуск и можно увидеть, что у этой колонки изменилось имя. Вместо слова имя на русском языке, появилось слово Name. Перейдем обратно в режим конструктора. И отметим одно обстоятельство, что если у нас в названии соответствующего поля есть какие-либо пустоты или же какие-либо другие непонятные знаки, то лучше всего поставить его в квадратные скобки. Иначе мы можем получить неправильный результат. Например, вместо Дата рождения, введем слово Дата, далее двоеточие. И далее поставим дату рождения в квадратные скобки. Для того чтобы компьютер мог однозначно определить, где у нас находится новое имя, имя для постановки вместо старого значения и старое значение, так сказать родное имя данного поля. Компьютер, как мы видим, автоматически все понял и соответствующие квадратные скобки убрал, воспринял вот это имя Дата рождения в качестве имени для соответствующего поля. Щелкнем теперь на кнопке Запуска нашего запроса. И можно увидеть, что наши поля изменили свои имена. Вместо поля Дата рождения у нас теперь просто-напросто Дата. Переключимся обратно в режим конструктора. И после всех этих изменений, сохраним наш запрос, щелкнув на кнопке Сохранить. Конечно же, это необходимо сделать, если мы в дальнейшем хотим воспользоваться этим же запросом.
6.5. Создание вычисляемых полей Рассмотрим, какими вычислительными возможностями обладает программа при конструировании запросов. Для этого продолжим эксперимент вот этим запросом, который мы создавали ранее. Щелкнем на нем дважды, чтобы его вызвать. И вот перед нами появился результат работы нашего запроса. Это вот такая сводная таблица, в которой перечислены все покупатели из нашей основной таблицы в нашей базе данных. Посмотрим, как выглядит этот запрос в режиме конструктора. Для этого щелкнем на соответствующую кнопку на нашей панели инструментов. И вот перед нами конструктор запросов. Немного его расширим, чтобы нам было удобнее с ним работать и можно увидеть, что в нашем запросе мы, конечно же, вывели два поля. Это поле Имени и поле Фамилии из основной нашей таблицы, таблицы покупатели, которая находится в верхней части нашего конструктора запросов. Попробуем теперь сделать над какими-либо данными нашей таблицы, какие-либо самые простейшие арифметические выражения. Для этого
152
TeachPro Microsoft Access 2003
подойдет какое-либо поле, в котором у нас сохранены численные значения. В качестве такого поля подойдет, например, код покупателя. Выведем его в нашем запросе. Для этого щелкнем на вот этом ниспадающем меню и выберем код покупателя и сейчас, если мы выполним запрос, то это поле появится у нас в результирующей таблице. Посмотрим, так ли это. Щелкнем на кнопке выполнения и можно увидеть, что код покупателя добавился в качестве очередного столбца в нашей результирующей таблице. Перейдем опять в режим конструктора. А теперь же попробуем провести с ним какие-либо вычисления. Для этого введем это же поле еще раз в качестве следующей колонки. И теперь попробуем умножить его просто-напросто на 2. Первое, конечно же, что приходит в голову, это в конце написать умножить на 2. Знак умножения у нас в компьютере представляет собой знак звездочка. Поэтому напишем звездочка и далее 2. В принципе, такое выражение вполне могло бы сойти. Но тут есть один нюанс. Прежде, чем его рассмотреть, расширим эту колонку, для того чтобы мы могли видеть это выражение целиком и отметим одно обстоятельство. Если бы у нас код покупателя был выражением без пробелов, тогда мы могли бы прямо вот в таком виде выполнить наш запрос. А сейчас, если мы попробуем щелкнуть на какую-либо другую ячейку, то можно увидеть, что мы получаем ошибку синтаксиса. Щелкнем на кнопку ОК. И рассмотрим более внимательно на то, что выделил нам компьютер, и что у нас получилось. А именно, все дело в том, что у нас между словом код и словом покупатель есть пробел, на котором наш компьютер как раз и споткнулся, разбирая вот это выражение. Поэтому в таких случаях, когда невозможно компьютеру однозначно идентифицировать наше выражение имя соответствующего поля нужно поставить в квадратные скобки. Так мы сейчас и сделаем. Введем открывающую и закрывающую квадратную скобку, в которую и поставим имя нашего поля, с которым мы хотим провести какие-либо действия. Теперь, если мы перещелкнем, то, как мы видим, компьютер совершенно нормально воспринял. Можно посмотреть еще одно, а именно, как мы можем видеть, автоматически компьютер провел некоторые изменения в наших ячейках. Во-первых, исчезло имя таблицы покупатели, которое было вот в этой второй ячейке. А во-вторых, впереди нашей ячейки появилось вот такое слово выражение 1. А это именно то название ячейки, которое будет присвоено вот этой новой колонке. Понятно, что старое название Код покупателя уже не годится. Посмотрим, как выполнен этот запрос. Для этого щелкнем на соответствующую кнопку запуска и можно увидеть, что компьютер аккуратно выполнил умножение соответствующего кода покупателя на 2, в каждой из строчек. При этом наверху появилось в качестве названия этой колонки слово Выражение 1. Переключимся обратно в режим конструктора и теперь можно понять, что для того чтобы ввести какое-либо имя для нашей колонки, но более осмысленное, чем Выражение 1, надо здесь вместо него написать наше какое-либо слово. Например, напишем слово Умножение. И выполним вот таким образом наш запрос. Щелкнем на соответствующей кнопке Переход в режим таблицы. И можно увидеть, что на этот раз у нас получилось вполне нормально и хорошо. Переключимся обратно в режим конструктора и понятно, что вот таким образом мы можем производить любые вычисления над нашими полями. Можем, конечно же, использовать и более сложные конструкции. Например, добавим к нашему выражению еще 5. Выполним наш запрос. И вот можно видеть, что у нас получилось. Можно использовать тот же самый код покупателя, еще раз умножив его самого на себя. Например, скопируем его еще раз, чтобы не писать во второй раз. Далее вставим. Расширим это поле еще раз. Немного изменим ширину всех полей. И далее вот
Глава 6. Запросы.
153
в этом месте, между 2 и кодом покупателя тоже введем еще знак умножения. Тогда мы получаем вот такое выражение. Это является квадратом кода покупателя, умноженное на 2 и прибавить на 5. В принципе, достаточно замысловатая формула. Но она наглядно показывает возможности, которые есть по конструированию выражения. Теперь же выполним этот запрос. Нажмем на кнопке запуска. И можно увидеть, что представляет собой такое вычисление некой формулы над кодом покупателя. Переключимся обратно в режим конструктора. Удалим теперь это поле. Для этого выделим, щелкнем на кнопку удаления. И удалим предыдущую колонку код покупателя. Очистим его. Теперь расширим его и попробуем, как-либо сконструировать новое поле. Допустим, что мы хотим провести какие-либо действия не только над числовыми полями, но и над полями, которые представляют собой строковое выражение. Например, вот эти два поля Имя и Фамилия. Можем, например, объединить их друг с другом, для того чтобы вывести их вместе. Для этого напишем таким образом, перво-наперво напишем новое название для нашего поля. Например, пусть это будет достаточно стандартная аббревиатура F и O, фамилия, имя и отчество. В принципе, отчество мы писать не будем, но пусть так и будет. И далее нам нужно писать некое выражение, в качестве которого выберем для начала имя. Напишем так, Имя. В принципе, сейчас мы вот эту аббревиатуру Имя в квадратные скобки можем не забирать, поскольку здесь никаких пробелов и иных знаков и символов нет. Поэтому компьютер вполне может догадаться однозначно, что мы подразумевает. Далее знак объединения строковых выражений. Вот такой достаточно стандартный знак. Далее введем пробел между именем и фамилией. Пробел мы напишем в кавычках. Далее опять знак объединения. И затем слово Фамилия. Вот в таком виде мы уже вполне можем оставить это выражение. Переключимся на какую-либо другую ячейку, чтобы зафиксировать. Как мы видим, компьютер вполне благосклонно принял все наши усилия по написанию этого выражения, поставив имя и фамилию в квадратные скобки. Выполним теперь этот запрос. Щелкнем на кнопку выполнения запроса. И можно увидеть, что компьютер как раз и провел все необходимые действия. А именно, объединил имя с фамилией и поставил посерединке знак пробела. И наверху написал название нашего поля, как мы и задумывали. Переключимся опять в режим конструктора. И попробуем теперь сконструировать еще одно выражение, а именно выражение, которое даст нам возраст нашего сотрудника, который можем получить просто-напросто вычитанием года рождения от текущего года. Но как это сделать. Вопервых, удалим вот эти наши выражения. Далее напишем имя для нашего нового поля. Это пусть у нас будет возраст. Далее двоеточие. И теперь напишем таким образом, чтобы от простого к сложному, напишем год, когда родился наш персонаж. Для этого есть специальная функция. Далее скобки, внутри которых напишем нашу дату, дату рождения, вот это поле. Конечно же, его надо поставить в квадратные скобки и написать Дата рождения, так, как написано в соответствующем названии поля ячейки. Закрыть теперь надо квадратную скобку и закрыть круглую скобку тоже. Переключимся в другую ячейку. И если мы сейчас щелкнем на соответствующую кнопку выполнения нашего запроса, то можно увидеть в качестве возраста год рождения соответствующего покупателя. В принципе, это, конечно же, половина дела. Поэтому переключимся обратно в режим конструктора. Теперь нам нужно получить аналогичным образом текущий год и вычесть их друг из друга. В принципе, уже понятно, что нам нужно сделать. Нам надо написать год, еще раз. И далее, внутри скобок напишем текущую дату. Поэтому напишем Дата, далее скобки. А теперь закрываем скобку, которая относится к году и вычесть. Вот теперь мы от нашей текущей даты вычитаем год рождения и как раз и получим возраст нашего персонажа. Пе-
154
TeachPro Microsoft Access 2003
реключимся куда-либо. Щелкнем на кнопке запуска и можем увидеть, сколько лет каждому из наших покупателей. Как мы видим, компьютер достаточно аккуратно проделал все это в нашем запросе. Переключимся обратно в наш конструктор запросов. 333 Отметим еще одно обстоятельство, если во время работы с нашими выражениями нам по тем или иным причинам не удается поместиться вот в эту ячейку, просто-напросто по ограничениям, которые накладывают визуальную часть нашего экрана, то можно нажать на кнопку Shift и F2. И в этом случае появляется вот такое стандартное окно области ввода, в котором так сказать более спокойно можем писать наши выражения, поскольку у нас здесь место гораздо больше. Правда, в любом случае надо иметь в виду, что длина одной строки не может превышать 255 знаков. Это в принципе стандартное ограничение, которое есть во многих местах работы с компьютером. Это достаточно большое число, которое даст нам возможность писать практически любые выражения. А теперь закроем это окно и вернемся обратно к нашему стандартному виду конструктора запросов.
6.6. Построитель выражений Рассмотрим, какими возможностями обладает программа по конструированию запросов и формированию различного рода вычисляемых полей. Причем для этого, существует специальный конструктор выражения. Рассмотрим, как все это происходит. Для этого вызовем вот этот запрос, который у нас уже существует. Для этого щелкнем на нем дважды. Вот он появился у нас. Появился в режиме таблицы и в нем всего два поля Имя и Фамилия, которые взяты из нашей таблицы Покупатели. Теперь перейдем в режим конструктора. Для этого щелкнем на соответствующую кнопку и можем видеть, как выглядит наш запрос в этом режиме. Как мы и предполагали, здесь у нас заполнены две колонки, которые отвечают за отображение в нашей результирующей таблице имени и фамилии. А теперь же попробуем сконструировать еще одно поле, третье. Конечно же, мы его можем написать вручную, как мы это делали ранее, но сейчас попробуем это сделать при помощи конструктора выражения. Для того чтобы его вызвать, нам нужно щелкнуть на эту кнопку Построить. которая у нас находится на панели инструментов. Щелкнув на него, мы получаем вот такое стандартное окно, в котором в верхней части находится вот это стандартное поле, в котором, в принципе, можем даже несмотря на всю нижнюю часть, просто-напросто написать все то, что мы писали в соответствующей ячейке для создания какоголибо выражения. Конечно же, если мы будем писать вот так в одну строку, то особого смысла в использовании вот этого, мощного инструмента не будет. Теперь же, первое, что нам нужно написать, это, конечно же, имя для нашей новой колонки. Например, поставим опять цель, связать имя и фамилию для нашего персонажа. Поэтому, пусть имя для нашей колонки новой будет опять Ф.И.О. - фамилия, имя, отчество. Напишем, таким образом, Ф.И.О. и далее двоеточие. Конечно же, уйти от необходимости написать имя нашей новой колонки, нам никак не удастся. Какой бы построитель мощный не был, он за нас не сможет догадаться, какое имя мы хотим использоваться в качестве нашей колонки. В принципе, конечно, можно вообще ничего не писать, но в таком случае программа присвоит новой колонке какое-либо безразличное имя, которое обычно конструируется, как обычно бывает, в таких случаях, при помощи соответствующего слова и дальше соответствующего номера. В нашем случае это будет выражение 1,2,3 и т.д. И чтобы уйти от таких бессмысленных названий, мы и написали Фамилия, Имя, Отчество Ф.И.О. А теперь приступим именно к созданию нашего выражения. Для этого в нижней части на-
Глава 6. Запросы.
155
шего окна у нас есть несколько полей. В левой части у нас находятся, во-первых, все те возможности, которыми обладает программа. Здесь у нас перечислены все таблицы, запросы, формы, константы и т.д. Рассмотрим сначала , первое что у нас есть, это таблицы. Таблицы, которые существуют у нас в нашей базе данных. Для того чтобы посмотреть их подробнее, можем щелкнуть на вот этот плюс и в результате, щелкнув два раза, мы открываем все те таблицы, которые есть у нас в нашей базе данных. Как мы видим, у нас здесь 4 таблицы. Сейчас нас интересует таблица Покупатели, поэтому щелкнем на ней и здесь можно увидеть все те поля, которые в ней существуют. Нас сейчас интересует первое поле, это поле Имя. Щелкнем на нем дважды. И, как мы видим, это поле появилось в нашем окне, наверху. Причем оно появилось здесь несколько в более сложном виде, чем можно было бы ожидать. Во-первых, впереди появилось имя Выражение, которое нам в принципе, сейчас абсолютно не нужно, поэтому его лучше удалить. И далее у нас здесь есть имя нашей таблицы Покупатели и имя Его поле, непосредственно слово Имя. В принципе, можем как раз, и оставить так, как есть. Компьютер в принципе все достаточно верно нам вставил. А теперь, после имени Name нужно вставить знак пробела. А между пробелом и вот этим полем, нам нужно вставить знак связки сцепления строк, в качестве которого нам нужно использовать вот этот знак, знак связки. Мы можем ввести его с клавиатуры, а можем щелкнуть на соответствующие кнопки вот в этом ряду кнопок, в котором у нас перечислены разного рода арифметические выражения, знаки больше и меньше, и т.д., которые мы можем использовать, щелкнув на соответствующую нужную нам кнопку. Теперь введем знак пробела, который надо обязательно поставить внутрь скобок, поскольку пробел в нашем конкретном случае тоже представляет собой некое строковое выражение. Далее опять знак сцепления. Щелкнем на соответствующую кнопку. А теперь нам нужно ввести поле Фамилию. Для этого выберем, конечно же, вот эту строку. Щелкнем на ней дважды. Вот он появился перед нами. На этот раз, конечно же, впереди никакого выражения нет. В принципе, оно и понятно. Выражение нужно было лишь в самом начале, когда компьютер не знал, поставили или нет, мы какую-то аббревиатуру в качестве названия для нашей таблицы. В принципе, сейчас все у нас уже более или менее в порядке. Щелкнем на кнопку ОК. И это выражение ставилось в соответствующую ячейку. Если расширим, то можно увидеть целиком вот это выражение. Перещелкнем нашу ячейку. И теперь попробуем выполнить этот запрос. Для этого щелкнем на кнопку выполнения запроса, и конечно же, результат выполнения нашего запроса можем видеть вот в этой таблице. В принципе, все это у нас достаточно гладко и хорошо выполнилось. Имя и фамилия сцепились и появились в новой колонке. Переключимся обратно в режим конструктора и попробуем немножко усложнить это наше задание. Попробуем сделать так, чтобы в нашей ячейке появилось не просто имя и фамилия, а первая буква имени, далее точка и далее фамилия. Т.е. инициалы нашего персонажа. Для того чтобы это сделать переключимся обратно в режим конструктора, запросов которых легче всего строить такого рода выражения. Встанем на соответствующую ячейку, которую мы хотим редактировать. Далее щелкнем на кнопку Построить. Вот мы опять появились вот в этом знакомом нам окне, и здесь, как мы видим, все вот это выражение, над которым мы только что работали, оно опять тут появилось. Теперь нам нужно его модернизировать. Но, все, что нам сейчас нужно, это преобразовать вот эту часть нашего выражения от имени до всего лишь первой его буквы. Для этого нам нужно воспользоваться соответствующего стандартной функцией, которая здесь есть. А все функции у нас
156
TeachPro Microsoft Access 2003
сосредоточены вот в этой части, в папке Функции. Раскроем ее, для этого щелкнем на вот этом плюсе. И здесь, как мы видим, две папки, папка First и папка Встроенные функции. В папке First у нас были бы все те функции, которые находятся у нас внутри нашего конкретного нашего запроса. Но сейчас у нас таких нет. Посмотрим, какие встроенные функции есть у программы. Здесь, как мы видим, очень много функции, которые сгруппированы по соответствующим темам. Это функции, связанные с массивами, с базами данных, с датой и времени, финансовая, общая и т.д. И есть впереди папка Все, в которой перечислены все функции, которые видны в правом окне. Здесь, как мы видим, достаточно много, так сказать практический любой вкус. Ну сейчас нас интересуют текстовые функции, поэтому сдвинемся до конца ниже и вот можем их увидеть. Выведем их и здесь в наших текстовых функциях нам нужна одна функция, всего лишь функция - левая часть, которая выводит левую часть от какого-либо текстового выражения. В принципе, если мы работали, например, с такой офисной программой, как Exell, то такое выражение нам должно быть знакомо. Особенно, если мы работали с англоязычной его версией. В нем как раз тоже функция left выдает нам левую часть от строкового выражения. В русско-язычной версии эта функция немножко выглядит по-другому, просто-напросто написано русскими буквами. Сейчас у нас программа оперирует англо-язычной версией этих выражений, поэтому нам нужно воспользоваться именно таким видом выражения. А его общий вид можно видеть вот в этой краткой подсказке в нижней части этого окна. А теперь же щелкнем на нем дважды, чтобы его вывести в наш построитель выражения. В принципе, мы могли бы его набрать от руки. Но, щелкнем на нем дважды. Вот она у нас появилась перед нами, но в принципе, здесь вместе с самой функцией появилось довольно много, скажем так, мусора, который в принципе нам не нужен. Опять появилось это слово Выражение, и далее и буква N, которое означает количество нужных нам символов. Все это в принципе, сейчас нужно удалить совершенно спокойно. Вот таким образом выделим. Правда, нельзя забывать, что в дальнейшем нам понадобиться поставить вот эту закрывающую скобку, иначе компьютер нам выдаст ошибку. Удалим все это. Удалим вот это слово выражения тоже, которое нам компьютер оставляет все время, совершенно не по делу. И теперь, после имени нашего поля, которое состоит из имени таблицы Покупателя и самого слова Имя, вставим запятую, далее количество символов, которое нам нужно брать из нашего имени. Но в принципе понятно, что нам нужна всего лишь одна буква. Далее закройте скобку. Вот, в таком виде у нас уже вполне должно быть работоспособные выражения, но здесь не хватает еще одной малости, а именно точки между инициалом и фамилией, которую мы и поставим вот в эту ячейку, где у нас раньше был один пробел. Пробел тоже оставим. Его выбирать не будем, просто-напросто поставим точку. Т.е. у нас сейчас внутри наших кавычек два знака, точка и пробел. Поскольку в принципе, одну точку ставить не очень хорошо. Чисто визуально будет выглядеть не очень красиво. Щелкнем сейчас на кнопку ОК. Переключимся на какую-либо ячейку и можно увидеть, что программа выдала нам ошибку синтаксиса во введенном выражении. А именно пропущено операнд или оператор, или введен недопустимый знак. В принципе, щелкнем на кнопку ОК. Попробуем разобраться, в чем дело. Нам компьютер автоматически выдает то место, где мы допустили ошибку. Оно и понятно, если бы мы внимательно смотрели на синтаксис написания выражения, то можно было бы заметить, что между двумя параметрами, которые нужны для заполнения этой функции, надо ставить не запятую, а точку с запятой. А мы поставили запятую. Что в принципе является ошибкой.
Глава 6. Запросы.
157
Поэтому удалим вот эту запятую и поставим точку с запятой, как справедливо требует от нас программа. Теперь же переключимся в другую ячейку. На этот раз, как мы видим, компьютер все воспринял достаточно спокойно, без замечаний. Теперь же выполним соответствующий запрос, щелкнем на кнопке Запуск. И можно увидеть, что на этот раз у нас получилось достаточно гладко. Мы получили имя нашего покупателя, далее точку и далее его фамилию. Так, как мы и запрашивали, Переключимся обратно в режим конструктора, в стандартный режим, в котором надо модернизировать наш запрос.
6.7. Некоторые виды запросов 6.7.1. Запрос на выборку Рассмотрим дальнейшие модернизации нашего запроса, с которым мы уже работали. Прежде чем мы проведем эти операции, попробуем создать еще одну копию вот этого же запроса. Точную его копию. Для этого достаточно выделить его, щелкнуть на правую кнопку мыши. И выбрать пункт Копировать. А теперь этот запрос у нас скопировался в буфер обмена. Теперь встанем на какоенибудь пустое место в нашей базе данных. Щелкнем на кнопку мыши и выберем пункт Вставить. Конечно же, как мы видим, наш компьютер запросил нас имя для нашего запроса, поскольку то же самое имя, которое у него было уже не подходит. Два запроса с одним и тем же именем существовать не могут. Но введем, например, просто-напросто напишем Q2, второй наш запрос. Конечно же, в принципе в настоящей базе данных с настоящими данными лучше внести более осмысленные названия. А сейчас нас вполне устроит и такая аббревиатура. Щелкнем на кнопку ОК. И как мы видим, вот этот запрос Q2 тоже появился у нас на экране. Сейчас оба эти запроса, в принципе, делают абсолютно одно и тоже. Но для чего в принципе выгодно создавать такие копии запросов. Копии таблиц и копии любой работы, которую мы проделываем на компьютере. Дело в том, что время от времени, любой человек делает разного рода ошибки при работе с материалами. В частности, например, с запросами. Например, при дальнейших его преобразований, мы можем его так испортить, что уже не сможем выбраться так сказать наружу и наш запрос будет абсолютно не пригоден для дальнейших экспериментов и использования. И именно в этом случае, если у нас есть исходный оригинал этого запроса, то, конечно же, мы в любом случае сможем вернуться обратно и восстановить нашу работу. А теперь рассмотрим вот этот запрос. Вызовем его сразу же в режиме конструктора. Для этого достаточно щелкнуть на вот этой кнопке Конструктор. И вот этот конструктор, конструктор запросов появился перед нами. Как можно видеть, сейчас в данном конкретном случае у нас три поля в нашем запросе. Первое, оно дублирует поле Имя, второе- поле Фамилию, а третье поле, у нас является вычислительным полем, которое составляется на основе инициала и фамилии покупателя из соответствующей таблицы, таблицы Покупателя. А теперь вместо вот этого третьего поля, введем другое поле, в котором, допустим, введем в качестве вычисляемого поля, например, длину фамилии соответствующего персонажа. Для этого перейдем обратно в режим построителя выражения. Щелкнем на соответствующей кнопке, на нашей панели инструментов. Вот этот построитель появился перед нами. В принципе, мы можем стереть все символы, с которыми мы работали ранее. Всю строчку сотрем и введем сначала имя для нашего поля. Например, пусть это будет Х. Далее двоеточие, после которого нам нужно ввести теперь какое-либо выражение. Выражение это у нас будет стандартная функция, функция длины. Его мы выберем из
158
TeachPro Microsoft Access 2003
списка стандартных функций. Щелкнем на вот этом плюсе, чтобы он раскрылся целиком. И после того, как мы щелкнули дважды, появились вот эти два поля. В этой папке пока у нас ничего нет. А в папке Встроенные функции у нас, конечно же, очень много функции. И нам здесь нужны текстовые функции, функции обработки строковых выражений. И здесь, среди всех функции у нас есть функция, которая и вычисляет длину нашего текста. В левой нижней части этого окна можно видеть краткий синтаксис этого окна. Как мы видим, он достаточно прост. Просто-напросто пишется выражение и внутри скобок надо написать то поле, от которого мы хотим взять нашу длину. Щелкнем дважды, чтобы так сказать зафиксировать это выражение. Теперь уберем лишние части. Вот это слововыражение нам уже абсолютно не нужно, да и внутренняя часть вот этой функции тоже нам нужно заменить на соответствующее поле. Для этого выделим, щелкнем на Delete, удалим. А теперь найдем наше поле, которое нам нужно, поле Фамилии. Конечно же, его нам нужно взять из соответствующей таблицы, поэтому щелкнем дважды на таблицах. Появились вот эти все таблицы из нашей базы данных. Здесь нам нужна таблица Покупатели и в таблице Покупатели, вот эта фамилия. Щелкнем на ней дважды. И вот она у нас появилась в нашем построителе выражений. Как мы видим, здесь у нас есть указатель и на саму таблицу, таблицу Покупатели и на его поле, поле Фамилия. Щелкнем теперь на кнопку ОК. Как мы видим, это выражение появилось у нас в соответствующей ячейке в конструкторе запросов. Перещелкнем на какую-либо другую ячейку и теперь выполним этот запрос. Для этого щелкнем на вот этой кнопке запуска. И теперь можно увидеть, что у нас получилось. А именно, около каждого персонажа появилось соответствующее число, которое показывает, сколько букв в его фамилии. В принципе, можно, допустим, подсчитать и убедиться, что на самом деле все правильно. Компьютер нас точно не обманывает. Зафиксируем теперь все эти изменения. Щелкнем на кнопке записи и закроем этот запрос. Вот теперь у нас уже два запроса в нашей базе данных. В принципе, они уже отличаются друг от друга. Каждый из них выполняет свою функцию.
6.7.2. Запрос на выборку с групповыми операциями А теперь же создадим третий запрос. Создадим его опять при помощи конструктора. Для этого щелкнем на кнопке создания запросов в режиме конструктора. Щелкнем дважды. Вот появился перед нами вот этот конструктор запросов и первое, что от нас требуется, это выбрать те таблицы и те запросы, которые мы хотим использовать, как основу для наших запросов. На этот раз у нас уже есть и таблица, и запросы. Мы можем выбрать их из вот этого списка. Здесь у нас сконцентрированы таблицы. Можем выбрать запросы, которые у нас сконцентрированы в следующей вкладке. Можем выбрать и то, и другое, во вкладке таблиц и запросов, в которых у нас перечислены оба типа источников данных для нашего нового запроса. Выберем, например, в качестве источника этот запрос Q2, щелкнем на кнопку Добавить. А также возьмем таблицу Покупатели и тоже щелкнем на кнопку Добавить. Закроем теперь вот это окно добавления таблицы и создадим какой-либо запрос. Например, в качестве первых двух полей возьмем опять имя и фамилию. Возьмем его, например, из вот этого запроса Q2. Вот мы вставили имя, вставили фамилию, можем вставить еще и вот эту длину Х. В ней у нас была сконцентрирована длина соответствующей фамилии. И, если мы сейчас выполним наш запрос, щелкнув на кнопке выполнения запроса, то мы получим абсолютно те же самые поля, которые у нас были в запросе Q2, но теперь надо обратить внимание на одно обстоя-
Глава 6. Запросы.
159
тельство, а именно рассмотрим вот это число. Именно количество всех записей. Как мы видим, оно у нас достаточно большое. И в принципе, если приглядеться, то можно увидеть, что оно представляет собой просто-напросто, так сказать, квадрат числа записей в нашем исходном запросе, запросе Q2. Для того чтобы разобраться, в чем дело, перейдем обратно в режим конструктора запросов и отметим, что у нас, как мы видим, на нашем окне запросов, мы вставили две таблицы, таблицу запросов Q2 и обычную таблицу Покупатели. И количество записей появилось так сказать из того процесса, что выбралась каждая запись из вот этого запроса Q2, начала сочетаться с каждой записью из таблицы Покупатели. В результате появилось количество записей, равное произведениям этих двух количеств. Поэтому, для того чтобы вернуться так сказать обратно, если нам нужно простое количество записей в какой-либо из этих двух таблиц, поскольку здесь и в Q2, и в Покупатели количество записей пока одно и тоже, то мы можем или удалить какую-либо из этих таблиц или же вставить связь между ними. Но для того, чтобы вставить связь между ними, лучше всего было бы, конечно же, в запрос Q2 ввести еще и код покупателя, который бы однозначно определил бы вот этот запрос. Поэтому сохраним вот этот запрос. Компьютер у нас запросил имя для этого запроса. Введем для него Q3. Щелкнем на кнопке ОК. И закроем вот этот запрос. Щелкнем на вот этом крестике. Теперь обратимся к запросу Q2. Щелкнем на нем дважды. Перейдем в режим конструктора и добавим в качестве поля еще и код покупателя. Но достаточно перетащить его в любое поле в нашей таблице. Пусть, например, будет вот в этом месте. А теперь щелкнем на кнопку сохранения, перейдем обратно в режим обычного вида нашей базы данных. Закроем эту таблицу. Откроем запрос Q3. Перейдем в режим конструктора. И можно увидеть, что в нашем запросе Q2 автоматически появился код покупателя. В принципе, то изменение, которое мы сделали, автоматически здесь отразилось. Теперь же введем связь между этими двумя таблицами, Конечно же, нам нужно связь их по коду покупатели. Это самое естественное. Поэтому схватим вот этот код покупателя и перетащим его на соответствующее поле в таблице Покупатели. И, как мы видим, соответствующая связь была установлено между этими двумя таблицами. А если теперь мы выполним наш запрос, то, щелкнув на соответствующей кнопке, можно увидеть, что на этот раз уже количество запросов гораздо меньше 369, что соответствует общему количеству записей в соответствующей таблице. Перейдем теперь опять в режим конструктора и теперь, в качестве поля мы можем добавлять любые поля из таблицы Покупатели. И они однозначно будут связаны с нашим запросом Q2. Например, выберем поле Телефон и вставим его в соответствующее поле. Выполним наш запрос. И можно увидеть, что около каждого персонажа появился его телефон, его личный номер. Переключимся обратно в режим конструктора. Рассмотрим теперь такое понятие, как группировка. Для того чтобы использовать групповые операции в нашем запросе, нам нужно щелкнуть на вот эту кнопку Групповые операции, которая находится на панели инструментов. В принципе, эта кнопка нам достаточно может быть знакома, если мы работали, например, с такой офисной программой, как Exell, в которой она выполняет суммирование определенного количества ячеек. Щелкнем сейчас на эту кнопку и, как мы видим, у нас в соответствующем бланке конструктора запросов появились вот такие слова Группировка около каждого из полей. Если мы сейчас выполним в таком виде наш запрос, щелкнем на соответствующую кнопку выполнения запроса, то можно увидеть, что у нас получилось. В принципе, пока все то же самое. Наша таблица выглядит точно так же, как и была. Здесь 369 записей, как и было. Единственное
160
TeachPro Microsoft Access 2003
отличие у нас, вот эта таблица отсортировалась по первому из полей, полю Имя. Переключимся обратно в режим конструктора запросов. И теперь попробуем сгруппировать несколько ячеек в вашем итоговом запросе и сделаем так, чтобы в результате подсчитывалась каждый раз сумма вот этих длин фамилии, которую у нас считается вот в этой ячейке Х, и выводилась в соответствующем поле. Для этого щелкнем здесь на вот этом выпадающем списке и здесь, как мы видим, у нас есть несколько функции. И среди них выберем вот эту функцию - суммирование. Правда, если мы сейчас опять выполним нашу операцию, то пока никаких изменений нет. Ничего не сложилось. Если внимательно посмотреть на вот эти числа, то можно увидеть, что они такие же, как и были. Отображают длину соответствующей фамилии в соответствующей ячейке. Единственное отличие, это вот в этом поле. Вместо просто Х, появилось Sum Х. Что в принципе должно было бы означать суммирование по соответствующему полю. Но пока, как мы видим, суммирование отразилось просто в том, что у нас отображается то же самое значение, что и было. Переключимся обратно в режим конструктора и отметим, что, конечно же, для того чтобы мы могли сгруппировать одинаковые какие-либо значения в нашей таблице, нам нужно выбрать именно те поля, по которым мы хотим группировать. Например, попробуем группировать по именам. А именно, пусть у нас складываются все те поля, у которых одно и то же имя. Поэтому уберем группировку у поля фамилия, уберем группировку у поля телефон, и оставим группировку только у поля Имя. Теперь же выполним этот запрос. Щелкнем на вот этой кнопке запроса. Как мы видим, при попытке выполнить данный запрос, компьютер выдал нам ошибку, означающую, что поле Фамилия не является частью статистической функции или группы. Щелкнем теперь на кнопку ОК и просто-напросто удалим вот эти два поля, поле Фамилия и поле Телефон. Они нам сейчас только мешают. Выделим. Щелкнем на кнопке Delete. Выделим и вот эту колонку Телефон тоже и удалим его из нашего запроса. А теперь же выполним таким образом наш запрос, щелкнув на соответствующую кнопку. Можно увидеть, что в результате у нас получилось. А именно, сумма всех букв имя, которых у нас Александр, получилось у нас 66, сумма всех букв с именем Александра получилось 18, и т.д. В принципе, достаточно сложно понять, что в результате всего этого дела означает вот эти все цифры, но, тем не менее, сам факт, что все это работает, уже бесспорен. Переключимся обратно в режим конструктора и вместо суммы введем, например, среднее значение. Для этого выберем пункт, в качестве функции, эту функцию. А если мы сейчас выполним наш запрос, щелкнем на кнопке выполнения запроса, то можно увидеть среднюю, так сказать, длину фамилии каждого из наших персонажей. Вот у всех людей, у которых имя в нашей таблице начинается с Александра, средняя их длина фамилии равняется 6 буквам. А у персонажей, имя которых у нас Алексей, средняя длина фамилии составляет 6,9, что видно из вот этого числа. Ну, и т.д. Переключимся обратно в режим конструктора. И попробуем просто-напросто сейчас выполнить другую операцию, а именно операцию - посчитать количество имен при группировке. Для этого выберем эту функцию. Выполним этот запрос и можно увидеть количество записей соответствующих каждому имени. Как мы видим, Александров у нас 11 человек в нашей таблице. А вот Алексеев довольно много, 24. Имя Алена встречается всего один раз, ну и т.д. Переключимся обратно в режим конструктора. И введем в качестве поля еще одно поле, поле Фамилия. Для этого достаточно перетащить соответствующее поле. Пусть группировка будет по этому полю тоже, и посмотрим, есть ли у нас совпадений имен
Глава 6. Запросы.
161
и фамилий в нашей таблице. Для этого выполним вот этот запрос и щелкнем на соответствующей кнопке выполнения запроса. И как можно видеть, у нас совпадений нет. Как было 369 записей, так и 369 осталось в нашем группированном запросе. Сохраним вот этот запрос. Закроем его. И попробуем немного отредактировать исходную нашу таблицу, для того чтобы создать хотя бы одно совпадение и посмотреть, как работает наш запрос. Для этого перейдем в режим таблицы. Откроем Покупатели, щелкнем на нем дважды и создадим двух персонажей с одинаковыми именами и фамилией. Например, вот здесь у нас есть два имена Юлия и две фамилии, которые отличаются друг от друга. Скопируем, например, одну из фамилий, например, вот эту, Лейкина. Копировать, и вставим ее в соответствующем месте. Для этого правая кнопка мыши и далее Вставить. Вот теперь у нас два персонажа с одним и тем же именем и фамилией. Сохраним. Закроем. Перейдем обратно в запросы и выполним вот этот запрос Q3. Щелкнем на нем дважды. И, как мы видим, на этот раз все получилось. У нас записей 368, на один меньше, чем было. Это как раз связано с тем, что одна запись у нас так сказать сгруппировалась друг с другом. В нем у нас совпадений и имени и фамилии одновременно. Если мы перейдем в конец вот этого нашего запроса на выборку, то можно увидеть вот эту нашу сдвоенную запись. А именно, Юлия Лейкина у нас повторяется два раза. Перейдем обратно в режим конструктора. И попробуем теперь выполнить какую-либо операцию так сказать в глобальном масштабе. Т.е. чтобы сложились все записи в нашей таблице. Для этого удалим вот это поле Имя, по которой у нас была группировка. Выделим. Щелкнем на кнопку Delete и уберем вот это поле Фамилия. Щелкнем на кнопку Delete. Попробуем теперь выполнить запрос в таком виде, щелкнув на кнопке Запрос. И можно увидеть, что у нас получилось. Получилось у нас число 365, что соответствует числу непустых записей в поле Фамилия. Переключимся обратно в режим конструктора, ну и, конечно же, отметим, что фамилия у нас появилась в качестве исходного поля, в котором у нас подсчитываются количество всех записей именно потому, что у нас вот это поле Х связано с длиной записи в поле Фамилия. А теперь вычислим, например, такой показатель, как средняя длина фамилии всех наших покупателей. Для этого выберем этот пункт. Вот он у нас и щелкнем на кнопке выполнения этого запроса. И можно увидеть, что у нас получилось. Средняя длина фамилии у нас в нашей таблице покупатели равняется 7.2. Переключимся обратно в режим конструктора. И таким образом можно высчитывать довольно сложные выражения и разного рода глобальные параметры из нашей таблицы. Ну, например, можно подсчитать общее количество букв в нашей таблице. Для этого щелкнем на этом пункте и, выполнив вот этот запрос, можно увидеть, что общее количество букв, которое нам требуется для записи всех фамилии наших покупателей, равно 2643 Перейдем обратно в режим конструктора. Отметим еще несколько параметров. Например, можем взять функцию Мах, высчитывая максимальную длину наших покупателей. Как мы видим, она равна 17 буквам. Это у нас самая длинная фамилия нашего покупателя. Заменим теперь функцию суммирования на группировку обратно и выполним в таком виде наш запрос. Щелкнем на соответствующую кнопку и можно увидеть все те возможные количества букв, которые есть у нас в фамилиях наших покупателей. Как мы видим, это у нас пустое место в качестве фамилии, когда ничего не написано. Фамилии бывают из трех букв, 4,5,6,7 и т.д. И максимальная фамилия, как мы в принципе уже и видели, это фамилия, состоящая из 17 букв. Как мы видим, здесь не так уж много возможностей по количеству букв нашей фамилии. Перейдем обратно в режим конструктора. Выведем теперь поле Фамилию в нашу таблицу. Выведем его, например, из вот этой таблицы По-
162
TeachPro Microsoft Access 2003
купатели. Вот она появилась перед нами. И выберем не группировку, а некую функцию. Возьмем функцию - количество. И теперь, если мы щелкнем на выполнение на запуск, то можно увидеть, что у нас получилось. А именно, как мы видим, количество фамилии, состоящей из трех букв у нас 6, фамилии, состоящие из 4 букв у нас 18, самое большое количество у нас 7-буквенных фамилий 83 штуки. И в принципе, одна фамилия затесалась, состоящая из 17 букв. Перейдем теперь обратно в режим конструктора запроса. И вот, как мы видим, таким образом, группируя разного рода поля, мы можем получить различного рода статистические данные, связанные с нашими таблицами и запросами. Причем запросы могут быть так сказать вложенными, при котором один запрос ссылается на другой. Например, сохраним вот этот запрос. Закроем его и можно отметить, что мы в нашем запросе, запросе Q3 используем запрос Q2 наравне с исходной таблицей, таблицей Покупатели. Причем надо отметить, что любое изменение в исходной таблице Покупатели, любое изменение в запросе Q2, при выполнении запроса Q3 учитывается и выдается правильный результат.
6.7.3. Запрос на создание таблицы Запросы, которые мы создавали и выполняли ранее, это были запросы на выборку. Кроме такого вида запроса существуют и другие типы. Чтобы ознакомиться с ними, рассмотрим вот эти запросы, которые у нас уже есть. Например, щелкнем на вот этом запросе Q2, который мы создавали ранее. Щелкнем на нем дважды. Вот он появился перед нами и здесь, как мы видим, в нашем запросе несколько полей. Три из них Имя, Фамилия и код покупателя целиком отражают соответствующие поля в исходной таблице, в таблице Покупатели. А еще одно поле, поле Х, является вычисляемым полем, которое представляет собой количество символов в фамилии покупателя, которое автоматически рассчитывает программа для каждой ячейки, для каждого покупателя. А теперь переключимся в режим конструктора и можно видеть, как выглядит этот запрос в режиме конструктора. А теперь обратим внимание на вот эту кнопку, на кнопку Тип запроса, которая у нас есть на панели инструментов. Если мы щелкнем на вот этом треугольнике, для того чтобы появились все возможности, какие здесь есть. Как мы видим, наряду с вот этим простейшим типом запросов, запрос на выборку, есть еще несколько типов. Это такой как перекрестный запрос, еще несколько видов, которые отмечены восклицательным знаком. Это такие запросы, как создание таблицы, обновление, добавление и удаление. В принципе, из самой сути названия этих запросов можно догадаться, что вот эти 4 запроса с восклицательными знаками изменяют данные в нашей базе данных. В отличие, например, от нашего запроса, запроса на выборку, который создавал нам некий отчет по уже имеющимся таблицам в базе данных. Все остальные вот эти запросы, отмеченные восклицательным знаком, в той или иной степени меняют саму базу данных и ее таблицы. Самый безобидный из них, это запрос на создание таблицы, поскольку он уже существующие данные не трогает, а лишь создает новую структуру. Рассмотрим ее. Щелкнем на ней и в результате появляется вот такое стандартное окно, в котором от нас требуется выбрать имя для нашей базы данных, а также выбрать в текущей базе данных, мы хотим разместить эту таблицу или же в какой-либо другой базе данных. Если мы переключимся, тогда от нас потребуют введение еще и имени файлов, в котором находится наша база данных. Сейчас будем открывать таблицу в текущем месте, там, где мы работаем и зададим имя для нашей новой таблицы. Пусть это у нас будет просто-напросто Т1, таблица 1. Больше здесь ни-
Глава 6. Запросы.
163
чего заполнять не надо. Щелкнем на кнопку ОК. В результате, имя нашего запроса, как мы видим, изменилось. Вместо запроса на выборку, появился в верхней части конструктора, запрос на создание таблицы. Теперь же обратим внимание на две кнопки, которые у нас находятся на панели инструментов, вот эта кнопка Вид и кнопка с восклицательным знаком Запуск. В принципе, когда мы использовали запрос на выборку, обе эти кнопки выполняли абсолютно одну и ту же функцию, а именно, выдавали нам отчет по нашему запросу, создавая нам некую виртуальную таблицу, в которой мы могли видеть результат выполнения данного запроса. Обе эти кнопки действовали абсолютно одинаково. Но сейчас, при выполнении запроса на создание новой таблицы, эти две кнопки будут работать уже кардинально по-разному. Вот эта кнопка Вид переключает нас из режима конструктора, для создания нашего запроса в режим, при котором мы можем видеть, как может выглядеть данная таблица после выполнения запроса. А вот режим запуска уже непосредственно создает эту таблицу в нашей базе данных. Посмотрим, как все это будет выглядеть. Щелкнем сначала на вот эту кнопку Вид. И, как мы видим, происходит отображение вот этой таблицы. В принципе, эта таблица выглядит точно так же, как при обычном выполнении запроса на выборку. А если мы сдвинем вот это окно и переключимся в режим таблицы. Можно увидеть все те таблицы, которые у нас и были. Это таблица городов, покупатели, сотрудников и стран. Никакой новой таблицы пока не добавилось. Переключимся обратно на запрос и опять переключимся в режим конструктора. Ну, а теперь, конечно же, попробуем выполнить наш запрос. Причем на этот раз попробуем запустить его, щелкнув на вот эту кнопку Запуск. Щелкнем на ней. В результате появляется вот такое стандартное окно предупреждения, в котором нас предупреждают, что в новой таблице будет помещено определенное количество записи. Ну, 369, это уже знакомое число. Мы могли видеть его, если бы внимательно проанализировали нашу таблицу, которая только что была создана при помощи предварительного показа нашей таблицы в режиме выполнения запроса, когда мы переключались кнопкой Вид. А сейчас мы можем щелкнуть на кнопку Нет, не создавая эту таблицу, или же мы можем щелкнуть на кнопку Да, тогда наша новая таблица будет создана. И, как мы помним, она будет создана под именем Т1. Посмотрим. Щелкнем на кнопку Да. В результате создалась новая таблица. Для того чтобы это проверить, сдвинуть вот это окно. И на нашей базе данных можно видеть уже новую строку, строку Т1 в списке всех таблиц, которые у нас были. Теперь отметим одно новое обстоятельство. А именно то, что при каждом выполнении вот этого запроса, у нас будет создаваться вот эта таблица. Пока мы не изменим ее имя, она все время будет создаваться на одном и том же месте. А именно, используя вот это имя Т1. И при этом, конечно же, очевидным образом, будет затираться старая таблица Т1. Например, если мы сейчас щелкнем на вот этой таблице Т1, рассматривая ее внешний вид, то можно увидеть, как она выглядит. В принципе, здесь абсолютно те же самые поля. Имя, фамилия и код покупателя, и вычисляемое поле, в котором у нас помещено количество букв в нашей фамилии. Закроем его теперь. И как-либо изменим запрос на создание нашей таблицы. Например, просто-напросто уберем код покупателя с нашего запроса. Для этого выделим его, щелкнем на кнопке Delete. Вот он у нас исчез, и теперь выполним этот запрос еще раз. Причем под словом "Выполнить" имеется в виду именно Запуск вот этого запроса, поскольку, если мы опять воспользуемся этой кнопкой Вид, то тогда ничего меняться не будет. Попробуем щелкнуть на кнопке Вид. И хотя мы выполнили вроде бы вот этот запрос, мы можем видеть вот эту таблицу перед нами, в которой, как мы видим, уже поле Код покупателя нет, мы модернизировали. Но если мы переклю-
164
TeachPro Microsoft Access 2003
чимся и откроем вот эту таблицу Т1, то, как мы видим, код покупателя здесь есть. Т.е. таблица Т1 пока еще не обновилась. Закроем его и переключимся опять в режим конструктора запроса Q2. Щелкнем и теперь на этот раз уже выполним, вот этот запрос. Щелкнем на вот этой кнопке запуска. Опять появилось предупреждение. На этот раз предупреждение немножко другое, о том, что существующая таблица, таблица Т1 будет удалена перед выполнением запроса. В принципе, оно достаточно очевидно. Такое предупреждение не лишнее, поскольку существует вероятность затирания информации, в которой мы, может быть, храним какие-то нужные нам данные. Если мы сейчас щелкнем на кнопку Да, полностью уверенные в этих действиях, тогда, конечно, будет продолжено выполнение этого запроса. И следующее окно предупреждает, что в нашу новую таблицу будет помещено определенное количество записей и после нажатия кнопки Да, отмена изменения уже станет невозможной. Но мы согласны на все это. Щелкнем на Да, и в результате у нас и появилась новая таблица. И она модернизировалась. Посмотрим, так ли это. Откроем вот эту таблицу Т1 и, как можно видеть, у нас она выглядит уже немножко по-другому. А именно, поле Код покупателя, которое здесь у нас был, он исчез с этой таблицы. Закроем его. Переключимся в режим конструктора. Отметим еще одно обстоятельство. А именно, периодически, при выполнении такого рода запросов, особенно если они выполняются у нас в автоматическом режиме, например, при помощи разного рода макросов нам может потребоваться ситуация, при которой нам, вот такого рода всплывающее предупреждение, о том, что мы хотим затереть таблицу, или нет, хотим ли мы поместить определенное количество записей или нет, все эти вопросы, конечно же, в этом случае, у нас абсолютно лишние и будут лишь тормозить, и прерывать выполнение макроса в автоматическом режиме. Поэтому в этих случаях, конечно же, необходимо предусмотреть возможность отключения появления таких вопросов, таких всплывающих окон. И такая возможность, конечно есть. И с ней мы ознакомимся позднее. Как же нам поступить, если мы хотим изменить имя для нашей вновь создаваемой таблицы. В этом случае нам опять нужно выбрать вот эту кнопку Тип запроса. Щелкнуть опять на кнопке создания новой таблицы и изменить имя со старого, которое у нас здесь прописано имя Т1 на какое-либо другое. Сейчас введем, например, имя Т2. Щелкнем на кнопку ОК и сейчас выполнение нашего запроса опять-таки отметим, что надо выполнять именно запуск, а не предварительный показ. Щелкнем на вот этой кнопке. Опять появляется вот это стандартное окно, о том, что будет выполнено заполнение таблицы таким-то количеством записей. Причем надо отметить, что вопрос о том, что наш запрос будет затирать предыдущую таблицу, конечно же, естественным образом был пропущен, поскольку мы сейчас создаем таблицу с именем Т2. С таким именем у нас пока таблицы нет в нашей базе данных. Конечно же, если вместо Т2 мы бы написали какое-то имя, которое уже существует, тогда такой вопрос с предупреждением не возник. Сейчас щелкнем на кнопке Да и, если посмотрим в нашу базу данных на список таблиц, то можно увидеть здесь, наряду с таблицами Т1, еще и таблицу Т2. В данном конкретном случае они абсолютно идентичны, поскольку выполнены при помощи одного и того же запроса. Хотя в нашей базе данных, в соответствующем файле, оба они занимают определенное и разное место внутри него. И об этом надо помнить. Т.е. запрос на выборку, например, не создает новую таблицу и использует только то место в соответствующем файле, которое нужно, чтобы хранить заголовок своего запроса. А вот после выполнения запроса на создание новой таблицы, создается
Глава 6. Запросы.
165
новая таблица, которая целиком помещена в базу данных с возможностью его модернизации и использования, точно так же, как в любой другой таблице в этой базе данных. Мы можем, например, ее открыть, что-либо изменить. Причем изменить мы можем не только имя и фамилию. Например, вот это число Х, которое было у нас вычисляемым полем. Вот сейчас это число 6 соответствует у нас количеству букв в нашей фамилии. Но сейчас мы можем написать туда и любое число, поскольку это уже не вычисляемое поле, а поле, которое создано при помощи запроса. Теперь оно принадлежит обычному полю, полю таблиц и подвержена стандартному редактированию. Вот мы его изменили. Если мы сейчас щелкнем на кнопке Сохранить и закрыть, он у нас сохранился в соответствующей таблице совершенно стандартным образом.
6.7.4. Запрос на обновление Рассмотрим такой гипотетический случай, когда нам нужно поменять в наших таблицах. Причем поменять не значения в каких-либо отдельных ячейках, а каким-либо образом поменять значение в ячейках по всему какому-либо полю по определенному закону. Именно для таких случаях существует еще один вид запроса, а именно запрос на обновление, при помощи которого мы можем изменить все поля в наших таблицах. Например, откроем вот эту таблицу Т1, которую мы создавали при помощи выполнения запроса на создание новой таблицы. Щелкнем на ней дважды. Здесь, как мы видим, у нас три поля Имя, фамилия и Х, в котором у нас были выведено вычисляемое поле. А сейчас это в принципе совершенно обычная таблица и теперь попробуем как-либо обновить значение этих полей. Для таких случаев воспользуемся запросов на обновление. Для этого закроем эту таблицу. Щелкнем на вот этом крестике. И теперь, стоя на вот этой таблице, таблице Т1, которую мы хотим модернизировать. Щелкнем теперь на вот этой кнопке, кнопке Новый объект. Щелкнем на вот этом треугольнике, чтобы появились все возможности, которые здесь есть и среди них есть запрос. Если мы щелкнем, то появляется вот такое стандартное окно, в котором мы уже работали и в котором мы можем выбрать, какой тип запроса мы хотим создать. Создадим запрос с помощью конструктора. Щелкнем на кнопке ОК. И появляется вот это стандартное окно, в котором, как мы видим, у нас автоматически появилась вот эта таблица Т1. А теперь перетащим вот эти поля вниз, в бланк. Для этого достаточно вот таким образом схватить и перетащить эти названия полей. А теперь вот этот запрос, запрос на выборку, именно таким создался наш запрос по умолчанию, нам нужно его изменить на запрос на обновления. Для этого достаточно выбрать вот эту кнопку Тип запроса и выбрать именно то, что нам нужно. А именно, запрос на обновления. Щелкнем. Как мы видим, у нас изменился тип нашего запроса. И если присмотреться к бланку конструктора, можно увидеть, что изменились и его поля. Появилась новая строка, строка обновления наряду со старыми, а именно полем и именем таблицы и именного вот этого поля определяет то, что получится в результате выполнения нашего запроса. Например, попробуем значение поля Х умножить на 2. Для этого достаточно написать простонапросто Х, далее умножить и 2. Все достаточно просто. Правда, когда мы переключились в другую ячейку, то, что воспринял наш компьютер, в качестве значения на обновления, если приглядеться, нас совершенно не устраивает. А именно, все значения в таблице Х, он заменит на вот такую текстовую аббревиатуру Х умножить и 2, а не умножить соответствующее значение Х на 2. Нам необходимо предпринять какие-либо действия против этого. В принципе, это и понятно. Нам так сказать, нужно объяснить компьютеру, что Х это именно поле. Для этого, во-первых, убе-
166
TeachPro Microsoft Access 2003
рем кавычки, что мы сейчас сделаем, а во-вторых, поставим Х в квадратные скобки с обеих сторон. Это в принципе всегда очень полезно, особенно если у нас в имени поля имеются какие-либо пробелы. В этом случае мы вообще не сможем ничего сделать, если мы не вставим соответствующее имя поля в квадратные скобки. Теперь, если мы перещелкнем, то можно увидеть, что на этот раз компьютер все совершенно адекватно воспринял. Попробуем теперь выполнить наш запрос. Щелкнем на вот этой кнопке запуска. Появилось вот такое стандартное окно, в котором нам говорят, что будет обновлено 369 записей. И мы можем щелкнуть на кнопке Нет, чтобы не выполнять этот запрос и оставить все, как есть. Или же, как мы сейчас и сделаем, щелкнем на кнопке Да, чтобы его выполнить. Запрос выполнился. Переключимся в окно базы данных и откроем вот эту таблицу Т1. И можно увидеть, что у нас все числа, которые были в этом поле Х, умножились в 2 раза. В принципе, видно, что они все четные. А вот первая ячейка, в которой у нас было число 9, стало число 18, во второй было 8, стало 16. Ну и т.д. А теперь отметим еще одно обстоятельство. Закроем эту таблицу и отметим, что если мы этот запрос выполним еще раз, то это число Х увеличится в 2 раза еще раз. Попробуем щелкнуть на кнопке выполнения запроса. То же самое вопрос с подтверждением на обновление. Да и если мы сейчас откроем таблицу Т1, то можно увидеть. что все значения в поле Х увеличились еще в 2 раза. Ну и т.д. Каждое выполнение вот этого запроса будет увеличивать соответствующее значение во всех полях в 2 раза. Закроем, перейдем в режим конструктора. И теперь введем по-другому обновлению вот этого поля Х. Например, вместо умножения на 2. напишем деление на 2, чтобы у нас каждый раз это поле уменьшалось в 2 раза. Теперь еще обновим и поле Фамилия, которое у нас раньше все время оставалось без изменения. Например, сделаем так, чтобы перед нашей фамилией писался какой-либо префикс. В принципе, например, можно написать такую аббревиатуру, как мистер или миссис. Правда, отличить женщину от мужчины нам будет сейчас достаточно сложно, поэтому воспользуемся нейтральным обращением, обращением товарищ. Для этого напишем таким образом. Внутри кавычек напишем тот префикс, который мы хотим вставить. Это у нас то, далее точка. А теперь же знак сцепления строчек друг с другом, вот такой знак. И теперь имя поля, которое мы хотим использовать. Например, вот эту фамилию, которую тоже поставим в квадратные скобки, во избежание всякого рода осложнений с нашим компьютером, чтобы однозначно определял, где находится поле Имя. Напишем Фамилия. Закроем квадратные скобки. А теперь попробуем выполнить этот запрос. Для этого щелкнем на кнопку выполнения, на запуске. Появилось вот это стандартное окно, о том, что определенное количество записи будет обновлено. Щелкнем на кнопку Да, если мы зайдем в нашу базу данных и откроем эту таблицу Т1, можно увидеть, что у нас получилось. А именно, значение в поле Х уменьшилось в 2 раза, а вот перед каждой из фамилией появился вот такой префикс тов. Закроем эту таблицу. Посмотрим, что будет, если мы выполним этот запрос еще раз. Для этого щелкнем на кнопке выполнения запроса. Щелкнем на кнопке Да и сейчас, если мы откроем вот эту таблицу Т1, то можно увидеть результат выполнения этого запроса. В принципе поле Х уменьшилось в 2 раза, что достаточно понятно. А вот с фамилией произошло нечто достаточно грустное, а именно перед каждой фамилией у нас уже вот этот префикс написался в 2 раза. В принципе, оно и понятно. Два раза нажав на кнопке обновления, что соответствует добавления вот этого префикса мы получим его два раза перед соответствующей фамилией, что в принципе, оно хоть и понятно, но не правильно.
Глава 6. Запросы.
167
И именно поэтому с запросом на обновление надо быть особенно осторожным, поскольку оно затирает все наши старые данные и вместо них оставляет обновленные данные. В результате чего мы можем получить вот такие совершенно неожиданные и неадекватные значения. И далеко не всегда, после вот таких преобразований, мы можем восстановить исходную таблицу и возвратить все к исходному виду. В принципе, именно для таких случаев, прежде, чем мы выполним вот такого рода запрос, перед этим очень полезно копировать соответствующую таблицу, над которой мы хотим провести эту операцию, для того чтобы в случае чего могли восстановить ее исходный вид. Но сейчас в принципе, наша база экспериментальна и поэтому особой ценности данной, которые в ней прописаны не содержит. Поэтому мы можем экспериментировать достаточно смело. Попробуем теперь поэкспериментировать с нашими таблицами еще. Например, откроем вот этот запрос. Запрос на обновлении и вместо вот этого всего изменения поля Фамилии сделаем нечто другое. А именно, удалим вот эти все поля и напишем какое-либо одно значение. Например, напишем просто-напросто 0. В принципе, компьютер взял все это в кавычки, посмотрим, что у нас сейчас получится. Щелкнем на выполнение. Согласимся с изменениями и если мы сейчас заглянем вот в эту таблицу Т1, то можно увидеть, что вместо фамилии, которые были в соответствующем поле, у нас просто-напросто все ячейки этого поля заполнились нулями. Т.е. мы потеряли все данные, которые в этой колонке были. Именно поэтому, конечно же, при заполнении запроса и, особенно при его выполнении надо быть очень аккуратным. Поскольку, если мы случайным образом, просто-напросто ошиблись, чисто синтаксически, причем таким образом, что компьютер, тем не менее, воспринял все это достаточно правильно в каком-то приближении, то мы можем получить в соответствующем поле, например, вот такие все 0, как в этом конкретном случае. Посмотрим, что сейчас будет, если мы удалим вот эту таблицу Т1. Для этого щелкнем на кнопке Delete. Подтвердим удаление, перейдем в режим запроса и попробуем выполнить этот запрос, запрос на обновление. В принципе, он опирается на таблицу Т1. И если мы сейчас щелкнем на кнопке запуска, то можно увидеть вот такое предупреждение, а именно, что ядро базы данных не может найти соответствующую таблицу, таблицу Т1. В принципе, оно и понятно. Мы ее только что удалили. Щелкнем на кнопке ОК и закроем этот запрос. В принципе, мы его достаточно сильно испортили, и нам он уже сейчас не нужен. Щелкнем на кнопке Нет, сохранять его не будем. И попробуем теперь поэкспериментировать еще. А именно, изменить, обновляя записи в таблице ключевое поле на какое-либо другое значение. Причем посмотрим, что произойдет, если мы попробуем заменить его на не уникальное значение. Как мы знаем, ключевое поле оно должно быть уникальным по определению. Например, если рассмотрим таблицу Покупатели здесь у нас вот код Покупателя, он является ключевым полем и уникальным полем. А теперь же, во-первых, создадим копию этой таблицы, во избежание всякого рода неприятности. Для этого щелкнем на правую кнопку мыши и выберем пункт Копировать, далее Вставить. Нам нужно вставить и структуру, и данные, как сейчас есть. Эту таблицу назовем Т3, щелкнем на кнопку ОК. Вот эта таблица Т3 появилась перед нами. А сейчас попробуем выполнить с этой таблицы новый запрос, запрос на обновление. Для этого опять выполним вот этот запрос. Вот это окно появляется перед нами. Возьмем конструктор. ОК. Вот появился запрос, запрос на выборку, правда. Но мы сейчас это исправим. Щелкнем на этой кнопке тип запроса и вместо выборки, выберем обновление. А теперь выберем код покупателя. Далее перетащим, например, еще несколько полей. Например, имя и фамилию. Если мы сейчас выполним этот запрос, то мы получим в нашей исходной таблице, таблице Т3 всего лишь три поля- код покупателя, имя и фамилия. Правда, все записи они сохраняться и будут без изменения.
168
TeachPro Microsoft Access 2003
Это в принципе, все понятно, а сейчас посмотрим, что произойдет, если мы в качестве обновления напишем просто-напросто число 0. Что гарантирует повторение значения вот в этом поле. Теперь же попробуем выполнить, щелкнем на кнопке запуска. Ну и, как мы видим, компьютер выдал нам вот такое грозное предупреждение, то, что невозможно обновить поле Код покупателя, поскольку это поле не обновляемое. Щелкнем на кнопке ОК. И посмотрим, что же произойдет, если у нас код покупателя будет не полем типа Счетчик, а простым числовым полем. Правда, ключевым. Для этого перейдем в нашу таблицу. Откроем вот это поле Т3, откроем его в режиме конструктора. И вместо счетчика введем числовое значение. Сохраним. Закроем эту таблицу. Опять откроем запрос и попробуем выполнить этот запрос еще раз. Щелкнем на вот этом восклицательном знаке и на этот раз, как мы видим, в принципе, разрешил нам выполнение этого запроса. И даже показал. какое число записи будет при этом обновлено. Щелкнем на кнопке Да, но, правда, после этого, нам компьютер уже выдал вот такое грозное предупреждение о наличии ошибок в нашем запросе. Как мы видим, компьютер не смог обновить записи, поскольку нашел ошибки преобразования типа, нарушения уникальности ключа, ну и т.д. В принципе, достаточно глянуть на вот эту страшную надпись, чтобы у нас отпало желание продолжать выполнение этого процесса. Поэтому щелкнем на кнопке Нет. И вернемся к нашему запросу. И на этот раз попробуем просто-напросто взять и просто преобразовать код покупателя. Для этого его скопируем вниз, поместим, конечно же, его в квадратные скобки и попробуем провести с ним какие-либо действия. Например, умножить на 2 и вычесть 22. В принципе, вполне правомочные вроде бы как действия, щелкнем на кнопке запуска. Опять сколько записей у нас будет обновлено, Да. Как мы видим, у нас опять возникла приблизительно та же самая проблема, проблема с уникальностью ключа. Поэтому опять отменим, щелкнем на кнопке Нет. И воспользуемся еще одним способом. А именно, попробуем добавить 1. Щелкнем на кнопке запуска. Да. Ну и, как мы видим, у нас 364 записей с нарушением уникальности ключа. Щелкнем на кнопке Невыполнение этой операции. И попробуем поставить минус 1. Вроде бы плюс 1 от минуса 1 отличается не сильно. Щелкнем на кнопке запуска. А на этот раз, как мы видим, у нас компьютер воспринял все как надо. Т.е. +1 не воспринял, а -1 воспринял. В чем же дело. В чем одна операция отличается от другой. Откроем вот эту таблицу и рассмотрим ключ нашей загадки. Если мы щелкнем на ней дважды, то можно увидеть, что код покупателя у нас в нашей таблице расположен по возрастанию. 01 и т.д. И, когда мы написали здесь увеличение на 1, то выполняя подряд эти операции с нашими записями, вот, например, если мы изменим первую запись, увеличивая ее на 1, то мы сразу же наткнемся на следующую запись с этим же значением. Значением 1, которое еще не обновлено. И возникнет ошибка. А вот, уменьшая каждый раз на 1, мы с таким противоречием не столкнемся. Именно поэтому вот в таких арифметических операциях результат выполнения вот таких преобразований может быть не всегда тем, что мы ожидали. Например, вроде бы увеличение на 1 всех полей кода покупателя должно сохранить уникальность этого кода, но, тем не менее, выполнить эту операцию нам программа не дала. Выполнение этой операции наткнулось на преграду именно в процессе его выполнения. А вот уменьшение на 1, от этих недостатков у нас не пострадало. Закроем эту таблицу и вернемся в наш стандартный вид базы данных.
Глава 6. Запросы.
169
6.7.5. Запрос на добавление Рассмотрим теперь такой тип запроса, как запрос на добавление, при котором записи из одной таблицы могут перебираться в другую таблицу. Например, рассмотрим вот эту таблицу Сотрудники, которая у нас есть в нашей базе данных. И на основе этой таблицы составим несколько таблиц с разным количеством полей. И потом попробуем переслать данные из одной, вновь созданной таблицы, в другую. Для того чтобы создать новую таблицу на основе вот этой, выполним пункт новый объект, новый запрос из соответствующей панели инструментов. Щелкнем на вот эту кнопку. Появляется окно нового запроса. Выберем, конечно же, конструктор. Щелкнем на кнопке ОК. Вот эта таблица Сотрудники появилась у нас в конструкторе запросов. Перетащим несколько полей, которые нам нужны. Например, поле Имя и поле Фамилия. Далее изменим тип нашего запроса. Вместо запроса на выборку, выполним запрос на создание новой таблицы. Для этого щелкнем на пункте тип запроса. Тип запроса создание таблицы. Выберем имя для нашей таблицы. Пусть это у нас будет таблица Т2. Щелкнем на кнопке ОК. И введем еще одно поле. Например, поле Должность. И вот у нас три поля в нашей таблице. Для того чтобы создать теперь новую таблицу, щелкнем на кнопке Запуск. Как мы видим, у нас будет создана новая таблица с 7 записями. Щелкнем на кнопке Да. Теперь уберем вот это поле, поле Должность из нашей новой таблицы. Щелкнем для этого на кнопку Delete. И создадим новую таблицу таким образом. Но перед этим, конечно же, изменим имя нашей таблицы, в которой будет сохранен этот запрос. Для этого щелкнем на пункте тип запроса. Тип запроса у нас будет создание новой таблицы и вместо Т2 напишем Т3. Щелкнем на кнопке ОК. И теперь выполним этот запрос тоже. Щелкнем на кнопке запуска. Конечно же, число записей опять будет 7. Щелкнем на кнопке Да и далее закроем этот запрос. Сохранять нам его не нужно. Этот запрос нам не нужен, поэтому щелкнем на кнопке Нет. Он нам нужен был в текущем виде, для того чтобы просто-напросто создать вот эти две таблицы Т2 и Т3. Они у нас уже созданы. Для того чтобы посмотреть, что же в них записано, щелкнем дважды на одной таблице и на второй, и можно увидеть структуру и данные в обеих таблицах. Как мы видим, они абсолютно идентичны, за исключением того, что в таблице Т2 есть дополнительное поле, поле Должность по сравнению с таблицей Т3, в которой два поля, имя и фамилия. Закроем теперь эти две таблицы. Попробуем провести запрос, запрос на добавление. Создадим теперь запрос. Запрос на основе таблицы Т3. Для этого выделим ее. Далее щелкнем на кнопке создание нового объекта, нового запроса. Щелкнем. Конечно же, создадим его в режиме конструктора. ОК. И теперь вместо запроса на выборку, выберем запрос на добавление записи. Для этого нам нужно изменить тип запроса и выбрать вот это добавление с плюсом и восклицательным знаком. Плюс означает, конечно же, что мы записи добавляем, а восклицательный знак, что мы меняем данные в наших таблицах. Щелкнем на вот этом пункте. Теперь нам нужно выбрать имя для нашей таблицы. Мы можем, конечно же, его вписать вручную, а можем выбрать из вот этого выпадающего списка, если мы на нем щелкнем. Конечно же, сейчас это у нас должна быть таблица Т2, именно туда мы хотим добавить данные. Щелкнем теперь на кнопку ОК и выберем поля, которые мы хотим использовать, как основу для добавления записи. Конечно же, это у нас поле имя и поле Фамилия. Внизу у нас появляется еще одно поле, поле Добавление, в котором у нас отражаются те поля, в которых будут добавляться соответствующие данные. Попробуем сейчас выполнить вот в таком виде запрос. Сначала щелкнем на кнопке запуск, и, как мы видим, у нас в таблицу Т2 будет добавлено 7 записей. Щелкнем на
170
TeachPro Microsoft Access 2003
кнопке Да и посмотрим, что у нас получилось. Откроем таблицу Т2 и, как мы видим, у нас уже несколько по-другому выглядит эта таблица. Наряду со старыми данными, которые можно с нашей таблицы, это вот эти несколько записей, в начале которыми у нас заполнено поле Должность. И еще одна запись. Вот эта у нас старая запись, а начиная с этой ячейки и далее, это у нас новые записи. Здесь, как мы видим, имя и фамилия у нас повторяются, а должность уже исчезла. Оно и понятно. Поскольку вот в этой таблице Т3, из которой мы копировали данные, поле Должность не было, и соответствующим образом эти ячейки оказались пустыми. А вот все остальные поля аккуратно скопировались. Закроем теперь эту таблицу. И попробуем немножко изменить порядок добавления полей. Например, изменим порядок, вместо имени вставим фамилию, а вместо фамилии, имя. И посмотрим, как в этом случае будет выполняться наш запрос. В принципе, притворяя, можно сказать, что просто-напросто имя и фамилия поменяются местами при вставке новой записи. Посмотрим, как это будет выглядеть. Щелкнем на кнопке запуска. Конечно же, добавится 7 записей. Щелкнем на кнопке Да и посмотрим опять на таблицу Т2. В начале нашей записи все в принципе практически то же самое, а вот, начиная с вот этой записи, здесь у нас идет еще один новый блок записей, в которых, как мы видим, имя и фамилия поменялись местами. Если в начале у нас шло сперва имя, а в следующем поле фамилия, то здесь у нас наоборот. Сперва идет фамилия, потом имя. фамилия имя. И т.д. Закроем теперь эту таблицу и перейдем в режим конструктора. Попробуем теперь опять вставить данные в эту нашу таблицу, в таблицу Т2. Но на этот раз попробуем как-либо изменить наши данные таким образом, чтобы третье поле, которое у нас есть в таблице Т2, тоже было заполнено. Для этого выберем то третье поле, которое там есть. Его надо выбрать в ячейке добавления. Щелкнем на вот этом ниспадающем списке. И здесь, как мы видим, у нас есть поле Должность. Конечно же, в таблице Т3 такого поля нет, поэтому отсюда узнать данные об этом персонаже нам из таблицы Т3 никак не удастся. Поэтому пока просто напишем в первом поле, вот в этой ячейке, слово Неизвестно. Мы не знаем, что сюда надо вставить. И далее попробуем выполнить этот запрос. Щелкнем на кнопке выполнения запроса и, как мы видим, у нас компьютер вот это слово Неизвестно воспринял, как значение параметра, и требует от нас ввести соответствующее значение. Щелкнем на кнопку Отмена. Мы в принципе хотели нечто другое, поэтому вместо "Неизвестно", которое компьютер поставил в квадратные скобки, воспринимая это, как соответствующее поле, мы хотим его вставить как строковое выражение. Поэтому сотрем все остальное и поставим слово Неизвестно в кавычки. Далее перещелкнем и на этот раз, как мы видим, компьютер вот это слово Неизвестно не поставил в квадратные скобки, что в принципе является хорошей новостью. Т.е. компьютер воспринял все, как есть. А теперь же выполним этот запрос. Щелкнем на кнопке выполнения запроса, но прежде посмотрим, какие записи добавить наш компьютер при выполнении этого запроса. Для этого можно переключиться на кнопку Вид на соответствующую таблицу. И, как мы видим, вот эта таблица будет выглядеть вот таким образом. Т.е. здесь у нас три поля, поле Имя, поле Фамилия и далее вот это выражение 1, в котором у нас дополнительные данные, в котором просто-напросто одно слово Неизвестно повторяется несколько раз. Переключимся обратно в режим конструктора и на этот раз этот запрос просто выполним. Щелкнем на кнопке Запуск. Появляется вот такая надпись, что у нас будет добавлено 7 записей. Добавлено, если, как мы помним, будет в таблицу Т2. Щелкнем на кнопке Да и посмотрим вот эту таблицу Т2, над которой мы уже достаточно много поиздевались. Щелкнем на ней дважды. Ну вот, пока все те записи идут
Глава 6. Запросы.
171
в начале, которые уже были. Сдвинемся вниз и можно увидеть в конце этой таблицы вот эти новые записи, в которых, в качестве должности стоит одно слово Неизвестно. А имя и фамилия дополняется соответствующими значениями, как и раньше. Закроем эту таблицу, перейдем в режим конструктора. Попробуем теперь все-таки более содержательно заполнить вот это поле, поле Должность. Для этого добавим новую таблицу в наш запрос. Щелкнем на правую кнопку мыши и выберем пункт Добавить таблицу, в качестве которого выберем вот эту исходную таблицу Сотрудники. Щелкнем на кнопке Добавить. Закроем. И в качестве вот этого выражения, добавим на этот раз, например, какоелибо поле, поле Отдел. Поставим сюда. Вот эту колонку целиком уберем. Выделим. Щелкнем на кнопку Delete. И добавим ее в поле Должность. Попробуем теперь выполнить этот запрос таким образом. Посмотрим, к чему это приведет. Щелкнем на кнопку выполнения, и как мы видим, у нас будет добавлено 49 записей. В принципе, оно и понятно. У нас и в таблице Т3 и в таблице Сотрудники по 7 записей, а в результате того, что у нас никакой связи между этими двумя таблицами нет, то будет заполнено количество записей, равное произведению количества записей в каждой из таблиц. Поэтому, если мы сейчас щелкнем на кнопке Да, и посмотрим вот эту таблицу Т2, то в ее конце можно увидеть вот такое достаточно большое количество записей, в которой должность повторяется довольно много раз. А именно, в каждой должности у нас перечислены все персонажи из нашей таблицы. Закроем эту таблицу. И попробуем установить какую-либо связь между этими двумя таблицами. Конечно же, связь можно установить по имени, связывая имя и связывая еще, и фамилию друг с другом. В этом случае у нас уже будет более разумное сочетание между вот этими двумя таблицами. Сейчас же попробуем выполнить опять запрос. Щелкнем на кнопке Запуск. И как мы видим, у нас будет добавлено 9 записей. 9, потому что, несмотря на все наши старания, под одним и тем же именем и фамилией у нас есть несколько сотрудников. Именно поэтому количество записей у нас будет добавлено больше, чем количество записей в таблице Т3 или в таблице Сотрудники. Щелкнем на кнопку Да. И посмотрим на таблицу Т2, посмотрим, к чему все это привело. Конечно же, двигаться нам нужно в самый конец нашей таблицы и в нем вот эти 9 записей, начиная с вот этой ячейки и до конца. Это новые записи, которые добавились последним запросом. И как мы видим, здесь есть повторение. А именно Иван Иванов у нас и в должности, которая соответствует продажам и соответствует директорату. Поэтому количество записей у нас получилось больше, чем количество записей в исходной таблице. Закроем и вернемся в наш конструктор запроса. И, конечно же, отметим, что таким образом, при помощи запроса на добавление, мы можем добавлять в одну таблицу записи из другой таблицы, и даже из сочетания других таблиц.
6.7.6. Запрос на удаление Рассмотрим еще один тип запроса, запрос на удаление, который нужен нам, если в нашей таблице нам нужно удалить какое-то количество записей по определенному критерию. А если мы хотим кардинально приняться за это дело и удалить все записи из какой-либо таблицы, то для этого можно даже обойтись без запросов. Можно скопировать нашу таблицу, причем указать при этом, что мы хотим скопировать только ее структуру. Попробуем сейчас это сделать. Например, возьмем какой-либо из существующих таблиц, например, таблицу Покупатели, далее щелкнем на правую кнопку мыши и выберем пункт Копировать.
172
TeachPro Microsoft Access 2003
И после того, как мы его скопировали в буфер обмена, щелкнем на правую кнопку мыши и выберем пункт Вставить. После этого возникнет вот такое стандартное окошко, в котором нам предлагают выбрать имя для нашей таблицы. Пусть это будет таблица Покупатели-2. И теперь, как мы и предполагали, в том случае, если мы хотим, чтобы в этой таблице осталась только структуру из нашей исходной таблицы Покупатели, а все данные из нее не перешли, нам нужно выбрать вот этот первый пункт, в качестве параметра вставки только структуру. Щелкнем теперь на кнопку ОК И, как мы видим, у нас на нашей базе данных появилась вторая таблица Покупатели-2. Если мы сейчас посмотрим таблицу Покупатели, это у нас исходная таблица со всеми своими данными. А вот таблица Покупатели2, как мы видим, абсолютно точно повторяет нашу исходную таблицу, таблицу Покупатели по своим полям. Но в отличие от нее, не содержит ни одной записи. Закроем теперь эти обе таблицы и перейдем опять в нашу базу данных. И рассмотрим теперь тот случай, если мы хотим, так сказать, не так кардинально подойти к делу. А именно, если мы хотим из нашей какой-либо таблицы удалить только часть записей. Рассмотрим, например, вот эту таблицу Т2. Щелкнем на ней дважды. Как мы видим, здесь у нас три поля Имя, Фамилия и Должность. Эту таблицу мы заполняли ранее, используя запрос на добавление данных в таблицу. Здесь у нас достаточно много данных, которые расположены, в принципе, достаточно хаотичным образом, либо заполняли его, используя разные критерий в запросах. Отметим еще, что у нас есть достаточно много записей, в которых в поле Должность стоит пустое место. Вот эти ячейки абсолютно пустые. Ну и напрашивается, так сказать, очевидное условие для удаления наших записей, это удалить все записи, в которых в поле Должность является пустое место. Закроем эту таблицу и попробуем это проделать. Сделаем это при помощи запроса на удаление. Вызовем для этого запрос на удаление. Вызовем его при помощи вот этой кнопки вызова запроса, которая у нас находится на панели инструментов. Конечно же, воспользуемся конструктором. Это проще всего. Щелкнем на кнопку ОК. И вот появляется вот этот стандартный построитель запросов. Как мы видим, у нас автоматически вот эта таблица Т2 появилась в нем. Она появилась, поскольку мы вызвали это окно, находясь уже на таблице Т2. А в ином случае, мы могли бы простонапросто щелкнуть на правую кнопку и добавить любую таблицу из нашей исходной базы данных.Сейчас воспользуемся этой таблицей. Единственное, конечно же, нам нужно изменить тип запроса. Как мы видим, по умолчанию у нас появился запрос на выборку, а нам нужен запрос на удаление. Для того чтобы его изменить, щелкнем на вот этой кнопке Тип запроса и выберем запрос на удаление. Как мы видим, рядом с надписью удаление, стоит восклицательный знак, что означает, что этот запрос изменяет наши данные, и вот этот крестик показывает, так сказать, в виде пиктограммы, что будет делать этот запрос. Щелкнем. Как мы видим, благополучно изменили тип нашего запроса и одновременно с этим изменились поля в нижней части в бланке запроса. Как мы видим, наряду с полем и именем таблицы, у нас появилось поле удаление. Выберем поля для нашей таблицы. Например, выберем Все поля, и имя, и фамилию, и должность. Если мы сейчас воспользуемся вот этим запросом и выполним его, то у нас из нашей таблицы просто-напросто исчезнут все записи. Она станет пустой, поскольку вот в таком виде, когда мы не задали никакого условия на наш запрос, то, конечно же, в этом случае выберутся на удаление просто-напросто все записи нашей таблицы. Но мы хотим, в качестве условия выбрать для удаления те записи, в которых есть нулевые ячейки в поле Должность. Для этого, конечно же, в условиях отбора надо написать здесь просто-
Глава 6. Запросы.
173
напросто 0.. Как мы видим, компьютер наш 0 воспринял совершенно нормально и изменил его на из 0. Т.е. равняется 0 записи, пустой. Попробуем теперь выполнить этот запрос, но перед этим просмотрим, как будут выглядеть все те записи, которые будут удалены. Для этого можем воспользоваться вот этой кнопкой Вид, которая показывает нам предварительный показ работы запроса на удаление. Т.е. все те записи, которые будут удалены. Но, как мы видим, удалены будут все записи, в которых в поле Должность нет ни одного символа, т.е. пустые ячейки, вот, как мы видим, здесь они абсолютно пустые сверху донизу нашей таблицы. Закроем эту таблицу. Конечно же, закрывать этот запрос особого смысла нет, мы просто-напросто сейчас сделали достаточно неудачный ход. Нам нужно переключиться обратно в режим конструктора. Иначе мы потеряем всю нашу работу по созданию запроса. Поэтому щелкнем на кнопке Отмена. И переключимся в режим конструктора. А теперь выполним этот запрос. Для этого надо как раз щелкнуть на кнопку Запуск. Как мы видим, из нашей исходной таблицы, из таблицы Т2 будут удалены 23 записей. И конечно же, после нажатия кнопки Да, отмена изменений уже станет невозможной. Восстановить исходные данные уже нереально. Можем сейчас щелкнуть на кнопку Нет, в этом случае никаких действий предпринято не будет. Но сейчас щелкнем на кнопке Да. И если мы сейчас рассмотрим вот эту таблицу Т2, щелкнем на ней дважды, то можно увидеть, что у нас в поле Должность уже все поля заполнены. Заполнены разного рода данными. Во всяком случае, пустых мест здесь уже нет. Можем закрыть эту таблицу и перейти в режим конструктора запросов. Рассмотрим еще одного обстоятельство. Вот эти два поля, имя и фамилия, в принципе сейчас никакой нагрузки в нашем запросе не имеют. Без них этот запрос работал бы точно также, поскольку какой-то вразумительный критерий на наш запрос установили только в поле Должность. А поля Имя и фамилия, у нас присутствуют в предварительном показе, когда мы щелкаем на кнопке Вид. Вот здесь можно видеть имя и фамилию, наряду с полем Должность. В принципе, у нас сейчас, как мы видим, никаких записей нет, поскольку все пустые записи в поле Должность, мы уже удалили. Перейдем в режим конструктора и отметим, что если мы удалим вот эти два поля. Щелкнем на кнопке Delete. Перейдя в режим конструктора, можно увидеть только поле Должность. Но, в принципе, это не очень удачно, поскольку, например, в нашем случае, если мы предварительно показали бы наш запрос на удаление прежде, чем удалили все пустые записи, то мы получили бы все те 23 записей в виде пустых бланков. Т.е., какие бы записи удалились, было бы не очень понятно. Именно в таких случаях, конечно же, лучше иметь какую-то более наглядную информацию. И в этом случае, мы можем в нашей ячейке Поле вставить не какое-то определенное поле, а все поля из нашей таблицы. Для этого можем взять его таким образом. Т2 точка звезда. В этом случае, наряду с полем Должность, будут одновременно отображаться все остальные поля в нашей таблице. При этом, как мы видим, в поле удалении у нас в этой ячейке стоит слово "is", тогда как в обычных ячейках стоит слово "условие", что означает, что в этом случае мы можем установить какое-то условие на это поле. А в этих полях, мы никакое условие ставить не можем. Оно и понятно, поскольку здесь стоит звезда, то тут отображаются все поля из этой структуры. А на несколько полей одновременно, условия отбора не ставятся. Попробуем еще удалить какие-либо данные из нашей таблицы. Для этого возьмем какой-либо критерий, например, мы можем взять в поле Должность, например, слова, начинающиеся с какой-либо буквы или же имеющие определенную длину или какой-либо другой критерий.
174
TeachPro Microsoft Access 2003
Но, конечно же, предварительно нам нужно удалить вот это прошлое условие отбора. Удалим его и, например, введем такой критерий. А именно, удалим все поля из нашей таблицы, в которых в слове Должность, например, встречается буква "a". Для этого напишем таким образом, звезда, затем буква "a" и звезда. Т.е. любое количество букв и аббревиатура впереди, потом обязательно буква "a" и затем тоже любые буквы. Т.е. вот таким образом мы задали содержание буквы "a" вот в это условие отбора. Если мы перещелкнем, то, как мы видим, компьютер воспринял наше усилие и впереди поставил слово Like - похоже. Т.е. будут отбираться все те поля, которые похожи на вот эти критерии. А теперь же посмотрим, какие поля будут удалены. Для этого перейдем в режим предварительного просмотра. Щелкнем на кнопке Вид. И можно увидеть, что у нас на примете 54 записей, в которых в поле Должность есть буква "a". Но мы можем их рассмотреть, но, как мы видим, во всех этих записях буква "a", конечно же, встречается. Перейдем теперь в режим конструктора. И попробуем выполнить этот запрос. Для этого щелкнем на кнопку Запуск. Теперь, конечно же, в отличие от предварительного показа появилось вот это предупреждение. В предварительном показе, конечно же, никакого предупреждения нет, поскольку оно не меняет саму таблицу. А сейчас уже дело обстоит серьезно. Если мы щелкнем на кнопке Да, то отмена изменений уже будет невозможно. Тем не менее, щелкнем. И посмотрим, что у нас стало с вот этой таблицей Т2. Щелкнем здесь дважды и, как мы видим, здесь осталось довольно мало записей и все эти записи такие, которые в поле Должность не содержат ни одной буквы "a". Закроем эту таблицу и перейдем опять в режим конструктора, в котором, как мы видим, комбинируя разными способами полям в нашей исходной таблице при помощи запроса, мы можем удалить те или иные записи, пользуясь определенными критериями.
6.7.7. Перекрестный запрос Рассмотрим еще один тип запроса, так называемый, перекрестный запрос, который позволяет получить нам в наших таблицах достаточно исчерпывающую информацию о повторяющихся в ней записях, по какому-либо критерию или полю. Рассмотрим для этого, например, вот эту таблицу Щелкнем на ней дважды. Можно увидеть ее структуру. Это в принципе достаточно простая таблица, которая состоит всего лишь из трех полей. Это поле Имя, абсолютно текстовое поле, в котором у нас расположены имена персонажей. Далее поле Дата, в котором у нас расположены даты. В принципе, они отличаются у нас всего лишь месяцем друг от друга. И последняя колонка, это поле Сумма, в котором расположены определенные суммы в денежном эквиваленте. В принципе, интерпретировать эту таблицу можно по-разному. Например, можно себе представить, что это у нас покупки определенным персонажем в разное время на разные суммы. Но, как мы видим, персонажи у нас периодически повторяются. Например, у нас Андрей купил 1 января, и он купил еще и 1 марта. И т.д. В принципе, эта таблица может точно также представлять собой зарплату людей, которые здесь перечислены. Например, Петр 1 января получил зарплату в количестве 186 рублей, а 1 февраля, в количестве 120 рублей. Но и т.д. Интерпретация особого значения не имеет, главное, что сейчас попробуем по этой таблице составить перекрестный запрос. Закроем ее для этого. Щелкнем на вот этом крестике. А теперь же создадим новый запрос. Щелкнем на вот этой кнопке Новый запрос. Как мы видим, появилось это стандартное окошко. В нем мы раньше выбирали конструктор, создавая при помощи конструктора наши запросы. Но сейчас можем прямо выбрать перекрестный запрос. И, выбрав
Глава 6. Запросы.
175
эту строку, мы автоматически запустим мастер создания перекрестного запроса. Щелкнем сейчас сна кнопке ОК. И, вот появился наш мастер, который, первое, что от нас требует, это выбрать таблицу, по которой мы будем создавать наш перекрестный запрос. Здесь перечислены, как мы видим, все таблицы в нашей базе данных, но можем выбрать или таблицы, или запросы или и таблицы и запросы. В принципе, это достаточно стандартные категории. В нашем конкретном случае, нас вполне устраивает таблица, и выберем, конечно же, вот эту таблицу. Затем щелкнем на кнопку Далее, переходя к следующей странице нашего мастера, и здесь нам требуется выбрать одно из полей, которое будет использовано в качестве заголовка в строках, в нашей перекрестной таблице. Это именно то поле, по которому в левой части нашей таблицы будут заполняться уникальные записи из нашей таблицы. Т.е. неповторяющиеся данные. Ну, можно выбрать, как одно поле, так и несколько полей одновременно. Как мы видим, допускается выбор не более трех полей. Это можно себе представить, если у нас в качестве заголовков, например, нужно выбрать не только имя для отделения одного персонажа от другого, а например, имя и фамилию, что более точно разделит двух персонажей друг от друга. Сейчас пока оставим выбор имени. Щелкнем на вот этой кнопке. Как мы видим, у нас в левой части появилась вот такая краткая подсказка, что в качестве записей в наших строках будут перечислены Имя 1, имя 2, имя 3 и т.д. Щелкнем на кнопке Далее и сейчас от нас требуют выбор поля для использования в качестве заголовков столбцов. Причем надо отметить, что то поле, которое мы уже выбрали, в нашем конкретном случае, поле Имя, мы сейчас использовать в качестве заголовка не можем. Для начала, в качестве заголовка выберем дату. И щелкнем на кнопке Далее. Теперь, как мы видим, компьютер догадался, что дата, которую мы выбрали, это у нас поле типа Даты, поэтому мы можем выбрать интервал, с которым будем группировать столбцы данных типа Даты и времени, и подводить итоги. Как мы видим, итоги мы будем подводить каждый год, по кварталу, помесячно и т.д. Например, возьмем итоги за квартал. В принципе, у нас как раз и все наши данные укладываются в один квартал. Если мы выберем группировку за квартал, то у нас в этом случае, все наши данные так и сгруппируются в один столбец, поскольку, как мы помним, у нас все даты как раз и помещаются в один квартал определенного года. В нашем случае, 2005. А если мы хотим получить более существенный результат, то лучше группировать их помесячно. В этом случае мы получаем несколько столбцов, получая более подробный результат. Щелкнем сейчас на кнопке Далее. Далее нам необходимо выбрать, во-первых, хотим или нет выдать итоговое значение, для каждой строки. Оставим галочку здесь на Да, для того чтобы получить более общий, так сказать, результат. И в качестве поля, мы можем выбрать различного рода функции. Можем выбрать, как мы видим, сумму, можно выбрать просто число, которое будет определять количество значений, можем выбрать среднее значение и т.д. Здесь несколько вариантов, максимум, минимум и т.д. Оставим сейчас, например, сумму. Щелкнем на кнопке Далее и мы выходим на последнюю страницу нашего мастера, в которой мы можем просмотреть результаты запроса или же изменить его структуру. Сейчас щелкнем на кнопке Готово, согласившись с этими вариантами. Имя запроса тоже пусть будет вот такое стандартное. И вот в результате выполнения нашего запроса мы получаем вот такую таблицу, из которой мы можем получить довольно много информации. Но, прежде чем ее будем анализировать, уменьшим его в размере.
176
TeachPro Microsoft Access 2003
Сдвинем в сторону, а также одновременно с этой таблицей, выведем еще и ту таблицу, на основе которой и был получен этот запрос. Саму основную таблицу. Щелкнем на ней дважды. Вот мы его вывели и далее сравним исходную таблицу с тем, что у нас получилось. И можно увидеть, в чем разница между этими двумя таблицами. Но, как мы видим, у нас всего персонажей в нашей исходной таблице повторялось 6 уникальных имен, а далее простонапросто эти имена повторялись. И вот эти повторения у нас сгруппированы в этом перекрестном запросе. Как мы видим, Андрей у нас в январе всего делал покупки на 125 рублей, а в марке на 240. А всего в этой таблице он делал покупки на 365 рублей. Точно также можно проанализировать и остальных персонажей из нашей исходной таблицы. Как мы видим, у нас все персонажи сгруппированы по имени и кроме того, они у нас сгруппированы по месяцам. Попробуем теперь еще один раз провести перекрестный запрос, изменив столбцы, которые мы хотим вывести. Вместо даты выведем сумму. И посмотрим, что у нас получится. Для этого выберем опять создание запроса. Опять выберем, конечно же, перекрестный запрос. ОК. Таблицу ту же самую возьмем. Щелкнем на кнопку Далее. Выберем имя, в качестве уникальных имен строк. Перебросим его в правую часть. Щелкнем на кнопку Далее. Теперь выберем в качестве поля для группировки сумму. Щелкнем на кнопке Далее. И в качестве колонок можем выбрать поле Дата. В принципе у нас больше вариантов здесь и нет. И выберем число, чтобы получить число повторений этого поля. Щелкнем на кнопку Далее. Согласимся с именем вот этим, которое получилось прибавлением 1 к вот такому имени. И щелкнем на кнопку Готово, чтобы посмотреть результат. И вот можно увидеть, что у нас получилось в результате выполнения этого запроса. Опять расположим эти таблицы так, чтобы их видеть одновременно. И можно отметить, что у нас вот этот персонаж покупки делал два раза. Персонаж Ирина покупки делала тоже два раза. Причем один раз на 85 рублей, а один раз на 110 рублей. Ирина делала покупки два раза, и оба раз на 100 рублей. Причем, если посмотрим на первую из этих таблиц, то можно догадаться, что оба раза она делала покупки в феврале. Т.е. вот таким образом, можно анализировать нашу таблицу, группируя ее разными способами, при помощи перекрестного запроса. Закроем теперь эти перекрестные запросы. И вот эту таблицу исходную тоже. И вот мы вернулись к стандартному виду нашей базы данных Мы уже познакомились с перекрестными запросами и создавали их в нашей таблице. Если мы щелкнем на вкладке Запросы, то здесь у нас два перекрестных запроса, которые мы создали. Откроем их. Вот, один перекрестный запрос, который у нас получился группировкой наших данных по месяцам. А второй перекрестный запрос у нас получился группировкой по заплаченным суммам. Ну и исходная таблица, вот эта таблица, которая выглядит таким образом. Здесь у нас три поля - Имя, Дата и Сумма. И в принципе, расшифровка всех этих данных достаточно интересно представлена вот в этих перекрестных запросах. Ну, в принципе, аналогичную информацию, которую мы получили в перекрестных вот этих двух запросах, мы можем получить при помощи конструктора запросов. Попробуем это сделать. Для этого создадим новый запрос. Щелкнем на кнопке создания нового запроса. Откроем новый запрос в режиме конструктора. Щелкнем на кнопке ОК. Вот появилось это стандартное окно, и в нем, как мы видим, автоматически у нас компьютер вставил нам в качестве основы для нашего запроса вот этот старый запрос перекрестный.
Глава 6. Запросы.
177
В принципе, он нам сейчас не нужен, поэтому щелкнем на кнопке Delete, удалим и вставим новую таблицу. Добавить таблицу. В качестве таблицы возьмем вот эту таблицу. Щелкнем на кнопке Добавить. Закроем это окно. И теперь, первое, что сделаем, это обеспечим возможность группировки в нашем запросе. Для этого достаточно щелкнуть на вот этой кнопке группировки. В результате чего в нашей нижней части этой формы появилась строка Групповая операция. Ну и теперь вставим поле Имя и разрешим по ней группировку. А теперь вставим еще и два поля Дату и Сумму. Конечно же, группировать по ним мы не будем. А по дате, например, подсчитаем количество. Используем эту функцию. А по сумме возьмем функцию - суммирование. А теперь выполним этот запрос. Щелкнем на вот этом восклицательном знаке. И можно посмотреть, что у нас в результате получилось. В принципе, можем сравнить то, что получилось с вот этими двумя перекрестными запросами. И можно увидеть, конечно же, что они в большой степени совпадают друг с другом., т.е. если, например, рассмотрим персонаж Андрей, то, как мы видим, и в обычном запросе на выборку мы получаем 365 рублей, его суммарные покупки и ту же самую сумму можно получить из перекрестного запроса. Правда, в перекрестном запросе, наряду с итоговой суммой, можно получить и расшифровку и по месяцам этого значения. А в запросе по выборке такую информацию получить нельзя. И то же самое касается вот этого поля - Дата. Т.е. количество дат. Например, мы можем посмотреть, сколько раз покупал у нас какойлибо персонаж. Например, персонаж Ивана, как мы видим, покупал три раза. Что в принципе, опять-таки совпадает с числом, который у нас в итоговом значении в перекрестном запросе. Правда, здесь у нас эта сумма расшифровывается по покупкам, что можно увидеть в этой таблице. Как мы видим, этот персонаж покупал на 245 рублей один раз, и два раза по 250 рублей. Попробуем теперь создать из нашего перекрестного запроса, например, вот этого, новую таблицу, в которой бы сохранились вот эти все данные. Для этого щелкнем на кнопке создания нового запроса. Выберем в качестве типа создания запроса Конструктор. Щелкнем на кнопке ОК. И здесь у нас появился запрос на выборку. Ну и в качестве основы, конечно же, вот этот запрос перекрестный. А теперь же изменим тип запроса. Нам нужно создание новой таблицы. Щелкнем на вот этой кнопке на нашей панели инструментов и выберем создание таблицы. Ну, конечно же, нам нужно выбрать имя для нашей новой таблицы. Например, во-первых, возьмем имя Т1. Щелкнем на кнопке ОК. Ну и в качестве поля выберем первую же строку - перекрестное, в котором у нас и сконцентрированы все наши данные. Знак вопроса, перекрестный точка звезда. Звезда означает, что мы хотим просто-напросто все поля из этой таблицы. Теперь же выполним этот запрос. Щелкнем на вот этом восклицательном знаке. И как мы видим, в новую таблицу будет помещено 6 записей. Согласимся с этим. Щелкнем на кнопке Да, в результате чего будет выполнена эта операция. Посмотрим, к чему она привела. Перейдем на вкладку Таблицы. Здесь у нас появилась новая таблица Т1. Если мы щелкнем на ней дважды, то можно увидеть здесь ту таблицу, которую мы создавали, создавали на основе перекрестного запроса. Рассмотрим теперь перекрестный запрос, который мы создавали, перекрестный запрос вот этот первый из них. Щелкнем на нем дважды и отметим, что в принципе достаточно интересно, откуда появились вот эти имена- январь, февраль, март и т.д. В принципе, мы их не вводили в наш компьютер, при создании нашего запроса. Для того чтобы выяснить этот вопрос, перейдем в режим конструктора в этом запросе. Можно увидеть, во-первых, как выглядит этот запрос в режиме конструктора. Как мы видим, здесь у нас заполнены 4 поля. В первом из них задается группировка по имени. Затем
178
TeachPro Microsoft Access 2003
идет следующее поле, это форматирование по полю Даты. И далее идет суммирование по сумме и итоговое значение, тоже по этому же параметру. В строке Перекрестная таблица можно увидеть, что первое поле используется в качестве заголовок строк. Второе, в качестве заголовок столбцов. Причем, вот это форматирование даты, в принципе, означает, что берутся месяца от нашей даты. Это видно из вот этой аббревиатуры mmm, что означает короткое представление даты в месячном выражении. И в виде текста. Рассмотрим, как же выглядит этот запрос в виде SQL выражений. Для этого щелкнем на правую кнопку мыши и щелкнем на первой же строке в контекстном меню Режим SQL. И здесь можно увидеть, что в качестве названия как раз и используются вот эти аббревиатуры, которые набраны вот в этой строке - январь, февраль, март и т.д. Их сокращенные наименования. Попробуем, например, модернизировать этот запрос. Самое простое, это просто-напросто убрать все месяца с апреля по декабрь, поскольку они все равно не участвуют в нашем запросе. Для этого достаточно выделить вот эти лишние месяца. Щелкнуть на кнопке Delete. И оставить только первые три месяца январь, февраль и март. Попробуем выполнить запрос вот в таком режиме. Для этого щелкнем на кнопке выполнения запроса и можно увидеть, что на этот раз мы получаем гораздо более компактную таблицу, в которой, как мы видим, участвуют только те месяца, в которых и имеются у нас данные.
Глава 7. Формы.
179
Глава 7. Формы 7.1 Автоформы Начиная с этого занятия, мы познакомимся с формами и начнем с ними работать. Попробуем их создать самостоятельно и разберемся в чем преимущество и недостатки форм по сравнению с обычным табличным видом наших данных. Рассмотрим, например, одну из таблиц, которая у нас есть в нашей базе данных, например, вот эту таблицу Сотрудники. Щелкнем для этого на нем дважды. Вот открылась эта таблица перед нами и в принципе можно увидеть, что, поскольку в нашей таблице достаточно много полей, то целиком она, конечно же, не помещается у нас на экране. И для того чтобы добраться до отдельных ее полей, нам придется все время передвигаться вправо влево по нашей таблице. Вот, например, таким образом, мы добрались до конца нашей таблицы, до последних ее полей. В принципе, как мы видим, одно это достаточно неудобно. Правда, в нашей таблице мы, конечно же, имеем возможность несколько полей сделать неподвижными. Для этого их надо выделить. Далее правая кнопка мыши и, например, выполним пункт Закрепить столбцы. И вот, после этого, если мы будем передвигаться по нашей таблице, то первые столбцы, которые мы закрепили, они становятся неподвижными, и мы можем увидеть, к какой записи в нашей таблице, например, соответствует адрес города Свердловска. Вот в этом месте. Правда есть еще несколько неприятностей, которые нас будут преследовать, если мы будем придерживаться только вот такого вида для просмотра таблиц. Если мы хотим просмотреть, какой же рисунок соответствует той или иной записи, нам придется щелкнуть на ней дважды, вызвать соответствующую программу, которая связана с этим объектом, и лишь после этого увидеть, что же на ней нарисовано. Закроем эту программу Point. Если нам сейчас понадобится другой какой-либо рисунок, то мы опять должны все повторить сначала. Щелкнуть на ней дважды, и лишь дождавшись загрузки программы и в нем рисунка, можем увидеть, что на нем нарисовано. Если присмотреться, то можно увидеть, что кроме вот этих рисунков, в нашей таблице еще есть поле Документ, в котором у нас сосредоточены документы Microsoft Word. И для того чтобы их увидеть, придется щелкнуть на ней дважды, на соответствующей ячейке. На этот раз загружается Word и можно увидеть, какой текст соответствует ячейке в этой записи. Закроем это приложение. Вот мы опять вернулись в нашу таблицу. Отметим еще, что в нашей таблице могут присутствовать поля, в которых заполнены несколько строк одновременно. Например, вот в этом поле Адрес, на самом деле гораздо больше информации, чем то, что мы видим на нашем экране. Если мы расширим чуть-чуть эти поля, то можно увидеть, гораздо больше информации, которая сосредоточена в этой ячейке. Здесь, как мы видим, у нас в каждой из записи по 3-4 строки. И просмотр которых, конечно же, не добавляет нам удобства. И именно в связи с этими недостатками, так же, как и во многих других программах работы с базами данных, существует такой элемент просмотра данных, как формы. Первый, и самый простой способ просмотра нашей таблицы в виде формы, это задать ее в автоматическом режиме. Для этого выберем кнопку Новый объект, которая у нас находится на нашей панели инструментов, щелкнем на вот этом выпадающем списке. И здесь у нас наряду со многими другими объектами, есть такой объект, как Автоформа. Щелкнем на ней. И в таком виде появляется наша таблица. В ней, как мы видим, много полей. Они все соответствуют этой таблице, таблице Сотрудники. И всем ее полям. Как мы видим, они расположены у нас
180
TeachPro Microsoft Access 2003
один под другим, и в принципе можно увидеть здесь все поля, которые соответствуют нашей таблице Сотрудники. Конечно же, они у нас сейчас не поместились целиком в эту форму, и поэтому нам приходится воспользоваться вот этим скроллингом, чтобы добраться до нижних ее полей. Но зато, мы в нашей Автоформе можем видеть все поля и всю содержащуюся в ней информации, не выходя в другие приложения. В частности, например, можно увидеть, что находится на рисунке, который соответствует этой записи. И внутри этой же формы мы, конечно же, можем двигаться от записи к записи, при помощи соответствующих кнопок, которые расположены в нижней части этого окна. Например, щелкнем на кнопке Следующее, можем посмотреть, как выглядит следующее окно формы, соответствующее этой таблице. Мы можем, конечно же, продвигаться и дальше, добираясь до самых последних ее записей. А если мы щелкнем на кнопке Последняя запись, то сразу же попадаем на последнюю запись. Вот, например, можем увидеть здесь же и тот текст, который находился в текстовом документе. Правда, как мы видим, этот документ целиком не поместился внутри вот этого окна, которое автоматически создал для нас внутри Автоформы. И часть информации, которая вылезла за пределы этого окна, у нас невидима, и мы не можем понять, что же там написано. Несмотря на это, конечно же, Автоформа уже достаточно большой шаг вперед, по сравнению с обычной таблицей. Здесь мы можем окинуть взглядом одну запись нашей таблицы и увидеть все поля, которые ему соответствуют. Если нам понадобилось рассмотреть эту или иную ячейку в нашей таблице более подробно, то мы можем это, конечно же, сделать из нашей формы тоже. Например, если нам нужно отредактировать и что-либо изменить в нашем тексте, то мы можем просто-напросто щелкнуть на соответствующей ячейке дважды. Щелкнем. В результате появляется вот такое окно, в котором мы можем редактировать этот текст. Как мы видим, он представляет собой маленький фрагмент Microsoft Word, но уже внутри программы Microsoft Access. То же самое касается и других объектов OLE. Например, рисунков, которые могут содержаться в нашей записи. Если мы хотим что-либо отредактировать и рассмотреть его более подробно, то щелкнем опятьтаки дважды на вот этом рисунке. И в результате опять-таки появляется вот эта программа, которую в принципе мы все достаточно хорошо знаем, программа Point и все ее возможности. И теперь мы можем что-либо, например, нарисовать на этой форме. Например, залить ее каким-либо цветом. Например, вот таким голубым. Получая вот такой вид нашего рисунка. Если мы сейчас перещелкнем, то можем увидеть, как зафиксировалось наше изменение внутри нашей таблицы
7.2. Основные элементы Конструктора форм На предыдущем уроке мы уже познакомились с таким понятием, как форма и увидели, как при помощи формы можно просмотреть записи, которые находятся в какой-либо таблице. А также, какие преимущества имеет форма по сравнению с обычной таблицей. Все это мы посмотрели на примере автоформы, которые создались в автоматическом режиме. А сейчас попробуем создать форму уже самостоятельно, так сказать в режиме конструктора. Для этого перейдем во вкладку Формы. Как мы видим, у нас пока на нашей базе данных нет ни одной формы. В принципе, зато мы ее можем создать. Создать ее мы можем различными путями. Первый и самый простой, это воспользоваться вот этой кнопкой создание нового объекта, при помощи которой мы уже много раз создавали различного рода объекты на нашей базе данных.
Глава 7. Формы.
181
Ну и здесь же, конечно же, сейчас создание автоформы у нас не активна, поскольку у нас не выбрана ни одна таблица и ни один запрос. Поэтому автоформу сейчас мы создавать не можем. Зато мы можем создавать, так сказать, форму в режиме конструктора. Вот эта строчка. Щелкнем на ней, и в результате появляется вот такое окно создание новой формы. Здесь мы можем выбрать одну из многих возможностей по созданию новой формы. В том числе различного рода автоформы, связанной с нашими таблицами. А сейчас создадим нашу форму в режиме конструктора, так сказать, совершенно в ручном режиме. И первое, основное, что нам нужно сделать, это выбрать источник данных для нашей таблицы, в качестве которых может быть, как любая таблица в нашей базе данных, так и любой ее запрос. Если мы щелкнем на вот этом треугольнике, то появляется вот этот ниспадающий список, в котором, как мы видим, перечислены все таблицы и запросы. Выберем среди них вот эту таблицу Сотрудники. Щелкнем на ней и щелкнем на кнопке ОК. В результате чего появляется вот такая заготовка для нашей формы. Ну, пока она абсолютно пустая. А также появляется вот это окно, в котором перечислены все те поля, которые находятся у нас в таблице Сотрудники. Которые являются основным источником для нашей формы. Закроем это окно. Создадим форму, сейчас немножко по-другому. А именно воспользуемся вот этой кнопкой создание формы в режиме конструктора. То же самое можно сделать, щелкнув на вот этой кнопке, кнопке конструктора. В результате появляется точно такое же окно с абсолютно пустой формой и с панелью инструментов. А также с окном, в котором в принципе, должны быть поля нашей таблицы. Но, поскольку мы пока никакую таблицу не выбрали, то сейчас это окно абсолютно пустое. В принципе, формы бывают и несвязанные ни с какой таблицей или запросом. Например, такие формы, как главная кнопочная форма и т.д. В них нет связи, ни с какими данными, но зато они дают возможность, щелкнув на какуюлибо из кнопок или других элементов на ней, открыть какое-либо другое окно, в котором, конечно же, связь данными будет поддерживаться. Но надо сказать, что форма в принципе является в любой базе данных основы работы базами данных, поскольку они дают гораздо большую гибкость и удобство работы с таблицами, чем простая табличная форма, характерная для обычных режимов просмотра таблиц. В таких формах мы можем ставить любые кнопки, любые элементы управления, подсказки, объяснения и т.д., что, конечно же, дают гораздо больше удобства для конечного пользователя, так называемый дружественный интерфейс. Попробуем теперь связать с нашей формой какую-либо таблицу, для того чтобы это окно не было вот таким уныло пустым. Для этого вызовем при помощи кнопки Свойства нашей формы. И здесь, как мы видим, первой же строчкой является источник записи. Как мы видим, здесь пока ничего нет. Но, щелкнув на вот этом выпадающем списке, можно увидеть все те таблицы и запросы, которые у нас находятся в нашей базе данных. В принципе, можно воспользоваться и вот этой кнопкой, которая рядом находится, кнопки с тремя с тремя точками. А если мы на ней щелкнем, то можем перейти в режим конструирования запроса и конструировать запрос по нашему вкусу, который в дальнейшем будет являться основой источником данных для нашей формы. Сейчас воспользуемся уже готовой таблицей. Возьмем таблицу Сотрудники. Закроем это окно и, как мы видим, это окно над нашей таблицей уже заполнились соответствующими полями. Отметим две основные панели, которые мы будем использовать при конструировании формы. Это окно с полями таблицы, в котором перечислены все поля и окно с панелями инструментов, в котором перечислены все элементарные кирпичики, которые мы можем использовать при построении нашей формы.
182
TeachPro Microsoft Access 2003
И то и другое окно мы можем, конечно, передвигать и располагать в любом удобном месте на нашем окне. Можно их, конечно, и убрать с нашего экрана. Закрыть, щелкнув на соответствующих крестиках. Но, конечно же, они нам достаточно часто необходимы при работе. Поэтому, для того чтобы их вызвать обратно, мы можем воспользоваться кнопкой на нашей панели инструментов. Ну, в частности, вот эта кнопка Список полей. Если мы на ней щелкнем, то появляются эти поля таблицы опять на нашем экране. Ну и вот эта кнопка изменяет свой внешний вид, сигнализируя нам о том, что соответствующее окно таблицы, являющейся источниками данных для нашей формы, появилось на нашем экране. А если мы щелкнем на вот этой кнопке, которая находится рядом, кнопка панели элементов, то она тоже появляется у нас перед глазами. Обратим теперь внимание на саму форму. Как мы видим, сейчас она представляет собой просто-напросто вот такой прямоугольный участок, на котором пока нет ни одной надписи, и ни одного элемента управления. Нет, потому что, конечно же, мы на нем не располагали, а автоматикой мы не пользовались. Кроме этого, мы можем задать размер вот этой области, области формы. Для этого достаточно схватить ее за какой-либо край и можем его расширить или наоборот сузить, как в высоту, так и в ширину. Для контроля в верхней части нашего окна, окна построителя форм, находится вот такая шкала в см, которая дает нам размер нашей формы. Ну, и в левой части этого окна тоже видна соответствующая шкала, которая дает нам высоту нашей формы. Ну, кроме этого, конечно же, в принципе, если мы достаточно много будем сейчас работать с вот этой формой. имеет смысл расширить ее на все окно, для того чтобы нам было удобнее с ним работать. Вот таким образом мы можем окончательно задать, например, внешний вид нашей формы и ее размер. Надо сказать, что размер формы имеет достаточно важное значение. И надо всегда помнить о том, чтобы создать форму, так чтобы она при любом раскладе всегда помещалась целиком на нашем экране, поскольку в другом случае, пользователю придется пользоваться скроллингом для того чтобы добраться до отдельных полей, которые отображены на этой форме. А это достаточно неудобно, особенно если нужно пользоваться и кнопками для изменения номера записи в соответствующей базе данных, которая отображена на этой форме, то одновременно пользоваться и навигатором по записям. Еще и скроллингом, для того чтобы путешествовать по нашей форме. Это, конечно же, создает достаточно серьезные неудобства. Ориентироваться в принципе при этом лучше, конечно же, на разрешении 600х800, как достаточно распространенные сейчас в компьютерном мире. А если же создавать форму большего размера, ну, конечно же, в принципе у достаточно многих пользователей компьютеров сейчас компьютеры отображают 1024 и 1600 и т.д. пикселей по горизонтали, но в принципе достаточно много пользователей, у которых компьютер рассчитан с разрешением 600х800. Поэтому у них форма не будет помещаться целиком на экране. В принципе, сейчас мы записываем наши лекции как раз с разрешением 600х800 единиц, что тоже в принципе достаточно для отображения большого количества данных в нашей форме.
7.3. Действия в Конструкторе форм На этом уроке мы продолжим работу по созданию формы. Как мы видим, пока мы создали абсолютно пустую форму. На ней нет пока никаких элементов. А если мы попробуем посмотреть, как она будет работать. В принципе, мы это уже можем сделать. Щелкнем на вот эту соответствующую кнопку. И можем увидеть, что наша форма представляет пока абсолютно пустое место.
Глава 7. Формы.
183
Правда, в нижней части этого окна есть вот эти кнопки навигации, в котором мы можем щелкать и увидеть, на какой записи мы сейчас находимся. Правда, на нашей форме пока ничего нет, и она ничего не отображает. В принципе оно и понятно. Мы пока на форме ничего и не располагали. Перейдем обратно в режим конструктора и займемся конструированием нашей формы. Первое, что сделаем, это чуть-чуть его, например, расширим в длину и ширину. А теперь попробуем разместить здесь какие-либо поля из нашей таблицы. Конечно же, из таблицы Сотрудники. Для этого мы можем просто-напросто схватить какое-либо поля, которое мы хотим использовать и далее, нажав на кнопку мыши, и не отпуская, перетащить его на нашу форму. При этом мышка приобретает вот такой характерный вид. Как только мы его позиционируем, приблизительно в то место, где мы хотим его расположить, мы можем отпустить мышку и можно увидеть, как расположилось наше поле, и какой вид оно приняло. Кроме этого, мы уже сейчас можем его позиционировать более точно. Для этого достаточно схватить наши вот эти два элемента управления, само поле и его метку. Это можно сделать, когда мышка приобретает вот такой характерный вид руки, при приближении его к нашему элементу. И дальше перетащить его в то место, где мы хотим. Причем, как мы видим, мы сейчас отдельно можем перетащить и поле, и его метку. Но надо сказать, что вместе с полем одновременно появляется и его метка, которая представляет собой просто-напросто имя соответствующего поля в нашей таблице. В принципе это не всегда верно. Если бы мы в режиме конструктора таблицы задали подписи соответствующим полям, тогда именно они появились бы и в качестве меток. Правда, сейчас это не очень существенно, поскольку в любом случае мы можем задать любую подпись по нашему вкусу. А вот эти метки свободно можно передвигать и даже убирать с нашего экрана. Ну, а сейчас попробуем перетащить еще несколько полей из нашей таблицы. Ну, опятьтаки схватим соответствующее поле, перетащим и поместим его на нашу форму. Ну, а теперь уже у нас на нашей форме имеется какие-то элементы, и теперь можем посмотреть, как же будет работать эта форма уже в более содержательном виде, чем просто пустая форма. Для этого опять запустим ее в режиме работы, в режиме формы. Щелкнем на вот этой кнопке и можем увидеть , что представляет собой эта форма. А теперь, передвигаясь по записям можно увидеть имя и фамилию, связанную с соответствующей записью в нашей таблице. Вот, таким образом мы можем работать с нашей формой. Но, перейдем опять в режим конструктора и отметим, что если мы хотим разместить на нашей форме несколько полей из наших таблиц одновременно, мы должны перво-наперво эти поля выделить в этом списке, списке полей. Это можно сделать, выбрав, например, какое-либо поле, нажав на кнопку Shift и, выбрав следующее поле, то все поля между ними выделяются одновременно или можем выбрать поле, далее нажать на кнопку Ctrl и выбрать по одному все те поля, которые мы хотим разместить по отдельности. Выбрав, например, вот эти 5 полей, далее, нажав на кнопку мыши, где-либо на выделенной области, и будем перетаскивать все поля одновременно на нашу форму. Как мы видим, мышка при этом приобретает вот такой характерный вид нескольких полей одновременно. А теперь отпустим мышь, и вот эти поля автоматически отображаются у нас на экране, на нашей форме. Надо отметить, что мы можем перетащить из нашего списка в область данных нашей формы таблицы не только один раз, но несколько раз. Например, вот это поле Имя можем перетащить еще раз. Для этого опять-таки схватим, поместим ее на это место, и вот, как мы видим, поле Имя вместе со своей меткой поместилось еще раз. Правда, вот эта метка приобретает несколько другой вид, но это в принципе уже абсолютно неважно, поскольку название для него мы
184
TeachPro Microsoft Access 2003
можем подобрать и попозже. В принципе, точно также у нас одновременно на нашей форме появилось два поля с фамилией. Если приглядеться, то можно заметить еще одно обстоятельство. А именно, поля в нашей форме имеют различный размер. Например, вот это поле Адрес получило гораздо больше место, чем остальные поля в нашей форме. В принципе, можно понять прочему это так, поскольку, как мы помним, поле Адрес представляет собой поле типа - многострочное поле. И именно поэтому здесь ему дано больше места. В принципе, аналогично компьютер будет поступать при создании таких полей, как, например, внедренные поля и т.д. Т.е. компьютер может располагать различными наборами размеров для различных полей. В принципе, несмотря на то, как создано поле, мы можем изменять его размеры. Для этого достаточно схватить его, далее схватить за какой-либо из краев, за соответствующую точку управления и потянуть в ту или иную сторону, в высоту, в ширину и т.д. Или же можно схватить за вот такую диагональную управляющую точку и изменять оба параметра одновременно и высоту и ширину. И после того, как мы найдем подходящий нам размер, после этого соответствующее поле приобретает вот такой вид. Но, кроме этого, конечно же, любое поле можно перетащить. Для этого опять-таки, вот когда оно приобретает вот такую форму руки, вот этот курсор при наведении на соответствующее поле, мы можем перетащить его в любое необходимое нам место Кроме этого мы можем пользоваться и клавиатурой, для точного позиционирования и установления размеров в какой-либо ячейке. Например, если мы выбрали вот эту ячейку, ячейку с должностью. Далее нажимая на стрелку вправо, можно увидеть, как это поле вместе с соответствующей его меткой перемещается вправо или влево, в соответствии с нажатием нашей кнопки. Если мы сейчас нажмем на кнопку вверх, то, как мы видим, оно идет вверх. Сейчас нажали на кнопку вниз несколько раз, и вот таким образом позиционировали наше поле. Кроме этого, если мы сейчас нажмем на кнопку Shift, и таким образом будем нажимать на кнопку вправо, то, как мы видим, сейчас уже наше окно не передвигается по нашей форме, а просто-напросто изменяет свой размер, растягиваясь вот таким образом. Или же если мы нажмем на кнопку стрелка влево, то, как мы видим, оно уменьшается в размере. Если мы нажмем и не будем отпускать, то, как мы видим, оно автоматически уменьшается или увеличивается на несколько пунктов одновременно. Точно также мы можем уменьшать и увеличивать его размер по высоте. Отпустим сейчас кнопку Shift и вот согласимся в результате, например, с вот таким размером и позиционированием нашего поля. Отметим теперь, как можно выбрать несколько полей одновременно. Если мы хотим, например, выбрать несколько полей, расположенных вот так по вертикали одно под другим, то можем щелкнуть в соответствующем месте на верхней линейке. И в результате отмечаются все те поля, которые попадают на вот этой вертикали. Ну и далее мы можем провести с ними какие-либо операции, например, мы можем сдвигать вправо или влево те элементы, которые попали нам в поле действия этого выбора. Или же можно, например, щелкнув на кнопку Delete, в результате чего все метки, которые у нас были выделены, они исчезли с нашего экрана автоматическим образом. Точно также мы можем выделить и все те элементы, которые могут попасть в соответствующую горизонтальную линию. Для этого щелкнем, например, вот в этом месте на нашей вертикальной линейке и, как мы видим, выделилось это поле, поле Фамилия. А теперь, если мы будем нажимать, например, на кнопку
Глава 7. Формы.
185
Стрелка вправо или стрелка влево, то можем передвигать и изменять местоположение вот этого объекта. Выбрать мы можем не только вот такую одну линию, но и некоторый интервал. Допустим, нажмем на мышь вот в этом месте и, не отпуская, будем двигать ее вниз. В результате вот эта черная полоса отмечает тот интервал, внутри которого и будут выделяться наши элементы. Как мы видим, они выделились вот таким образом. Теперь мы можем проводить какие-либо операции одновременно со всеми элементами, которые попадаются внутри этой области. Опять-таки мы можем нажать на кнопку Стрелка вправо или стрелка влево, стрелка вверх и стрелка вниз, передвигая вот эти элементы в соответствующем направлении. Если мы нажмем на Shift, то мы будем их расширять. Если на стрелку влево, уменьшать размер и т.д. То же самое по вертикальным направлениям. Т.е. мы можем вот таким образом работать одновременно со всеми выделенными объектами. Выделять объекты можно еще и при помощи соответствующего прямоугольника выбора. Для этого нажжем на нашу мышь где-либо на пустом месте нашей формы и далее потянем ее по диагонали. В результате чего будет рисоваться вот такой соответствующий прямоугольник и все элементы, которые попадут внутрь него, будут выделены. Вот, например, таким образом, отпустим, и как мы видим, все элементы, которые попали внутрь этого прямоугольника выбора, а также все элементы, который этот прямоугольник выбора коснулся, оказались выделенными. Опять-таки мы можем проводить с ними какие-либо операции. Можем щелкнуть на кнопке Delete. И в результате удалить их всех с нашего экрана. Конечно же, в принципе, мы при конструировании формы, точно так же как и в любых других окнах, можем воспользоваться кнопкой Undo. При помощи этой кнопки можем отменить действие последней операции. Сейчас мы восстановили все те элементы, которые мы только что удалили, нажав на кнопку Delete.
7.4. Изменение размера и выравнивание объектов формы Продолжим работу с формами. Как мы видим, мы уже создали в конструкторе вот такую нашу простейшую форму, на которой в достаточном большом беспорядке разбросали различного рода поля из нашей таблицы Сотрудники. В принципе эта форма уже вполне рабочая. Запустим ее. Мы можем увидеть, как она работает. Так и сделаем. Щелкнем на соответствующую кнопку Вид на нашей панели инструментов, и можно увидеть все те данные, которые соответствуют первой записи в нашей таблице. Мы можем передвигаться по нашей записи и одновременно видеть, как изменяются содержимые вот этих полей на нашей форме. Правда, внешний вид этой формы оставлять, конечно же, желать лучшего. У нас они разбросаны в беспорядке и, конечно же, абсолютно не выровнены ни по вертикали, ни по горизонтали. Размер различных полей имеют совершенно хаотичные значения, что, конечно же, тоже не добавляет удобства для пользователя. Переключимся в режим конструктора. И посмотрим, как можно изменять и настраивать вид нашей формы. Но, конечно же, мы можем схватить каждую из форм и, например, выравнивать вручную, передвигая мышкой. Но достаточно сложно позиционировать их точно один под другим. Например, поскольку мышкой это делать достаточно сложно. В принципе нам может помочь в точном позиционировании еще и клавиатура, поскольку в этом случае мы имеем возможность передвигать
186
TeachPro Microsoft Access 2003
ровно на одну точку вправо и влево соответствующий объект при помощи стрелок вправо и влево, а также передвигать вверх и вниз. Но, все равно, конечно же, было бы неплохо, если бы могли позиционировать их, так сказать, в более автоматическом режиме. Для этого существуют специальные методы. Например, если мы выделим несколько объектов одновременно вот таким образом, далее щелкнем на правую кнопку мыши, то появляется контекстное меню, в котором у нас есть пункт Выровнять. И далее есть несколько возможностей, которые предоставляют возможность выравнивать выделенные объекты один относительно другого. При этом, около каждого из пунктов нарисована соответствующая пиктограмма, которая в принципе достаточно хорошо отображает те или другие возможности соответствующего пункта меню. Например, выровнять по левому краю означает то, что все элементы попадающие, а сейчас выделенные фрагментом, будут выровнены по самому левому из этих элементов. Если мы сейчас щелкнем, то можно увидеть, как все это будет выглядеть. Как мы видим, левый край у них всех выровнялся. Щелкнем на кнопку отмены, отменим. Далее щелкнем на правую кнопку мыши и выровняем по правому краю. Вот сейчас, как мы видим, все выровнялись по правому краю, по правому из элементов. Опять щелкнем на кнопку отмены. Правая кнопка мыши и выронить. Далее у нас есть возможность выровнять по верхнему или по нижнему краю. Правда, сейчас в данном конкретном случае, если мы воспользуемся этим режимом, то мы рискуем наложить объекты друг на друга. Если мы сейчас щелкнем, например, выровнять по нижнему краю, то, как мы видим, у нас элементы вот таким образом наложились. В принципе, это тоже иногда бывает необходимо в каких-то случаях, особенно, если у нас различные элементы при работе с нашей формой должны появляться и исчезать, и замещать друг друга. Но это достаточно экзотический случай. А так, в принципе, конечно же, лучше располагать их визуально выровненными друг от друга, но с различными положениями на нашей форме. Щелкнем на кнопке Отменить. Далее щелкнем на правую кнопку мыши. И последняя возможность, которую у нас есть здесь, это выровнять по узлам сетки. Если мы щелкнем, то понятно, что она делает. Она выравнивает по соответствующим узлам ячейки в нашей форме. Очень часто при работе с формами, нам необходимо выровнять элементы не только относительно друг друга по расположению, но и по размерам. Но и для этого существуют различные возможности. Например, выделим вот эти несколько элементов, далее щелкнем на правую кнопку мыши. И наряду с пунктом Выровнять, у нас есть пункт Размер, который опять-таки выравнивает элементы по различному критерию. В частности можно выровнять по размеру данных, если мы щелкнем, то соответствующим образом компьютер подберет выравнивание, опираясь на соответствующее поле и его тип. А если щелкнем на правую кнопку мыши и выберем пункт Размер. И далее, например, по узлам сетки, тогда будут соответствующие поля выровнены по ближайшим сеткам на нашей форме. Щелкнем на правую кнопку мыши и теперь попробуем выровнять размер по самому высокому из элементов на нашем выделенном фрагменте. Ну и в результате можно увидеть, как будут выглядеть наши элементы после вот такого выравнивания. Как мы видим, по высоте они все стали одинаковыми. Щелкнем на кнопке отмены. А теперь щелкнем на правую кнопку мыши и выровняем размер по самому низкому из них, ну и, конечно же, они опять стали одинаковыми эти элементы, но уже, поскольку они выровнялись по самому маленькому из них. Щелкнем на правую кнопку мыши и выровняем теперь размер по самому широкому из них. В результате приобретают наши элементы вот такой вид. Щелкнем на кнопку отмены и попробуем последнюю возможность, это выровнять по самому узкому, в результате чего вот такой вид
Глава 7. Формы.
187
приобретает наше окно. А теперь сделаем еще одно усилие, правая кнопка мыши и выровняем по левому краю. В результате чего получаем вот такое расположение наших полей, один строго под другим, с одинаковыми размерами вот этих ячеек.
7.5. Изменение интервала объектов формы Если мы сейчас приглядимся к вот этим выделенным полям, которые расположены на нашей форме, то можно, конечно же, констатировать, что определенные успехи у нас уже есть. Этот участок нашей формы выглядит уже гораздо лучше, но, конечно же, тем не менее, эти поля расположены один под другим на разных расстояниях друг от друга. Что в принципе создает определенный видимый глазу хаос на нашей форме. Конечно же, было бы неплохо задать таким образом, чтобы вот эти все расстояния были одинаковы. Для этого тоже существуют специальные методы. Для этого воспользуемся пунктами формата и здесь далее у нас есть две возможности. Интервал по горизонтали и по вертикали. Сейчас нас интересует интервал по вертикали и здесь у нас есть возможность сделать равным, увеличить или уменьшить. Выберем сначала первый пункт сделать равным. Если мы щелкнем, то, как мы видим, вот эти окна чуть-чуть изменили свое месторасположение таким образом, что они равномерно распределились между самым верхним и самым нижним выделенным объектом на нашей форме. То же самое мы можем сделать и по горизонтали. Например, взяв вот эти несколько полей, затем, если мы их выделим, щелкнем на пункте меню Формат и далее Интервал по горизонтали. Щелкнем на кнопке Сделать равным. И в этом случае, как мы видим, они равномерно расположились по горизонтальному направлению. Вот таким образом. Правда, они, конечно же, сейчас абсолютно разбалансированы по вертикали. Кроме этого, у нас есть возможность изменить вот этот размер между объектами. Например, выделим опять-таки вот эти объекты. Далее щелкнем на пункте меню Формат. Например, интервал по вертикали и щелкнем на кнопку Увеличить. В этом случае, как мы видим, эти все объекты увеличивают интервал между собой. Как мы видим, вот таким образом выравнивая и располагая их относительно друг друга, мы смогли добиться достаточного удобного расположения вот этих окон на нашей форме. Если мы сейчас перейдем в режим работы формы, щелкнув на соответствующие кнопки, то можно увидеть, что вот эти 4 поля, конечно же, на этот раз расположены гораздо лучше, чем все остальные поля на этой форме. Они расположены строго один под другим, они по размерам совпадают абсолютно идеальным образом и расположены на одинаковом расстоянии один под другим. Перейдем опять в режим конструктора. И отметим одно обстоятельство, а именно то, что любой объект на нашей форме можно копировать. Например, выделим вот этот объект, далее щелкнем на правую кнопку мыши и выберем пункт Копировать. Теперь опять на правую кнопку мыши и выдерем пункт Вставить. И, как мы видим, вот это выделенное поле вместе со своей меткой, вставилось на нашу форму еще раз. Теперь мы можем его передвинуть, позиционировав в любое удобное нам место, и, как мы видим, мы создали две копии этого объекта. В нашем конкретном случае поле Должность. Копировать, конечно же, можно не только одно поле, но и несколько полей одновременно. Например, выделим вот эти два объекта, далее щелкнем на правую кнопку мыши и выберем пункт Копировать. Теперь щелкнем на правую кнопку мыши и выберем пункт Вставить. И, как мы видим, эти поля у нас вставились тоже нашу форму. Причем, поскольку мы не сняли выделение с наших вот этих
188
TeachPro Microsoft Access 2003
форм двух полей, то они вставились под ними, во-первых, а во-вторых, они не заменили выделенные объекты так, как это происходит в других программах. Конечно же, поскольку эти элементы у нас в буфере обмена опять сохранились, мы можем опять щелкнуть на правую кнопку мыши и выбрать пункт Вставить, они опять еще один раз вставились на нашу форму. Вот таким образом, например, позиционируем его в другом месте нашей формы. Ну и, конечно же, после того, как мы достаточно много работали с нашей формой, встает естественный вопрос о том, что неплохо было бы его сохранить в нашей базе данных. Для этого достаточно щелкнуть на кнопку сохранения. Появляется, конечно же, необходимое окно, окно, в котором нам предлагают выбрать имя для нашей формы. Ну, конечно же, если мы никакое имя не выбрали, то предлагается вот такая автоматически сгенерированная надпись Форма -1. В принципе, мы можем изменить ее на более содержательное имя. Но, в принципе, надо отметить одно обстоятельство, что, конечно же, для удобства работы с базами данных неплохо было бы перед любым названием нашего элемента в базе данных иметь какой-либо префикс, который бы нам вкратце указывал бы, что это за элемент. В частности, для запросов это может быть какая-либо буква соответствующая запросу, а для форм это может быть, например, буква Ф, Форма. Поэтому напишем, например, вот таким образом. Пусть первая буква "Ф" у нас так и будет, и далее выберем имя нашей таблицы. И напишем просто-напросто Сотрудники. Ну и щелкнем на кнопку ОК. Теперь можем закрыть эту форму и в результате можем увидеть, что вот эта новая форма у нас появилась в нашей базе данных, и мы ее здесь сохранили.
7.6. Области формы. Ввод меток Рассмотрим, как на форме можно создавать различные элементы и их редактировать. Ну, вызовем перво-наперво список полей, которые связаны с нашей формой, и которая, как мы видим, пока абсолютно пуста. Для этого щелкнем на вот этой кнопке на панели инструментов. Появляется вот это стандартное окно, в котором перечислены все поля этой таблицы. Но, перетащим те поля, которые мы хотим разместить на нашу форму. Вот, например, имя, фамилию, должность. Как мы видим, эти поля сразу же появились на нашей форме, и мы можем их свободно выбирать и перемещать внутри формы. Выбирать мы их можем еще и при помощи вот этого окна на панели инструментов. Если мы щелкнем здесь, то здесь можно увидеть те объекты, которые расположены у нас на форме. И среди них, конечно же, вот эти поля. Вот это, например, имя. Далее можем выбрать фамилию, и т.д. В принципе, как мы видим, название полей у вот этих объектов, совпадает с теми названиями, которые видны вот в этом списке объектов. Но на самом деле, это далеко не всегда так. Например, если мы возьмем еще одно поле Фамилия и вставим на нашу форму, то у него уже имя будет поле 21, некоторая аббревиатура. которую подбирается автоматически. Конечно же, это связано с тем, что одна фамилия в нашем списке объектов уже присутствует. В принципе, вот это название, которое появляется в соответствующем окне, можно изменить. Для этого можно вызвать свойство соответствующего объекта. Для этого, например, щелкнем на правую кнопку мыши, выберем пункт Свойства. И вот в этом месте, вместо имени, мы можем написать любое имя по нашему вкусу. Например, напишем просто-напросто ФФФ. И теперь именно вот эта аббревиатура и появляется в соответствующем имени нашего объекта. В списке объектов также есть несколько аббревиатур с надписями. Это соответствующая надписи, которая есть у нас на форме, которая появилась вместе с одноименными полями. Вот их мы
Глава 7. Формы.
189
тоже можем вызвать, для различных манипуляции с ними. Но вот, например, мы выбрали надпись, на которой написано должность. Например, мы после того, как ее выделили, можем щелкнуть на Delete и удалить с нашего экрана. Можно проделать еще какие-либо операции с ним. Кроме этого, у нас есть еще область данных. Если мы щелкнем на ней, то выделяется вот эта целиком область данных, которая является так сказать основной областью для нашей формы. На самом деле, кроме этой областью в форме есть еще и другие области. Для того чтобы их рассмотреть, достаточно перетянуть, например, в режим обычной работы нашей формы. Для этого щелкнем на кнопке Сохранить. Перейдем при помощи кнопки Вид на обычный вид. И можно увидеть, что в нашей форме наряду с областью данных есть, например, вот такая область, область выделения. Если мы на ней щелкнем, то выделяется вся запись в нашей форме. Она соответствует возможности выделения одной записи, одной строки в обычном режиме таблицы. Перейдем обратно в режим конструктора. Рассмотрим, какие еще зоны есть у формы. Для того, чтобы на нашем экране появились или исчезли какие-либо зоны в любой части нашей программы, конечно же, нам нужно обратиться к пункту меню Вид. И здесь, как мы видим, в нашей форме, у нас, во-первых, включен режим конструктора, что в принципе достаточно естественно, и мы можем видеть, так сказать, визуально. Ну и кроме этого, мы можем видеть, что у нас включена линейка и включена сетка для отображения в окне конструктора. Ну, мы в принципе можем отключить ту или иную возможность. И кроме этого, мы можем отобразить еще такие элементы, как заголовок и примечание формы, также колонтитулы. Мы вызовем, например, заголовки и примечания. Для этого щелкнем на вот этом пункте и можем видеть, что наверху нашей формы появился такой элемент заголовок формы, под который тоже отводится определенное место на ней. А в нижней части можно увидеть место для примечания. Мы можем располагать любые элементы и в этой области. Например, перетащим здесь еще раз такое поле, как Имя. И как мы видим, оно у нас появилось в области заголовка. Точно также можно перетащить и это поле в область примечаний и сейчас, если мы перейдем в режим просмотра нашей формы, то можно увидеть, что на нашей форме в верхней ее части, и в нижней части появились соответствующие поля. Конечно же, их взаиморасположением и элементами, которые на нем расположены, мы можем обращаться точно так же, как и с областью данных. Например, можем уменьшить область, которая отводится под область заголовка, или ее увеличить, передвигая вот такую разделительную полосу между соответствующими частями формы. Кроме этого мы можем вывести еще и колонтитулы, если мы на ней щелкнем. Эта та область, которая достаточно часто возникает при распечатке каких-либо объектов или же документов на принтере. Разместим, например, какой-либо элемент в месте верхнего колонтитула. Например, выберем вот это поле, поле Отдел. Если мы сейчас перейдем в режим Вид в отображении нашей формы, то, как мы видим, этой области, области колонтитула на нашей форме нет. Дело в том, что она отображается только при распечатке на принтере. Посмотрим, так ли это. Для этого вызовем предварительный просмотр нашей формы, в режиме распечатки. Щелкнем на этой кнопке. И можем видеть, как будет выглядеть наша страница. И как мы видим, здесь уже есть и вот эта область, область колонтитула, которая не существовала в режиме обычней работы с нашей формы. Закроем теперь это предварительный просмотр. Щелкнем на кнопку Закрыть. И мы вернулись обратно к внешнему виду нашей формы, к обычному ее виду. Теперь перейдем в режим конструктора. Теперь уберем все те дополнительные места, которые мы создавали на нашей форме. Для этого щелкнем на пункте меню Вид и снимем флаг с заголовка и примечания. Как мы видим, автоматически появилось вот такое предупреждение о том, что мы при удалении этих зон потеряем все те элементы, которые на нем были расположены. Щелкнем на кнопке Да, в
190
TeachPro Microsoft Access 2003
результате чего эти зоны исчезли с нашей формы. Сделаем то же самое и с колонтитулами. Опять появилась та же самая надпись, Да. И теперь мы опять возвратились к стандартному виду нашей формы. Каждый элемент, который у нас расположен на форме, мы можем форматировать по нашему вкусу. Например, выберем вот это поле Имя и зададим ему какой-либо другой шрифт. Для этого щелкнем на вот этом ниспадающем списке и выберем, например, какой-либо из шрифтов. Например, вот этот. И в этом случае мы видим написание этого текста несколько изменилось. Мы можем увеличить или уменьшить и размер, который отводится под этот шрифт. Можем взять еще большее значение ее. Только при этом, как мы видим, у нас надпись исчезла и потерялась ее часть, скрылась из виду. В принципе мы можем увеличить размер, который отводится под это поле, для того чтобы оно целиком помещалось. Чуть-чуть его сдвинем и кроме этого, можем изменять еще и такие параметры, как, например, цвет шрифта, а можем выбрать, например, вот такой красный, можно выбрать цвет заливки. Ну, как мы видим, у нас достаточно богатая возможность по изменению наших полей. Ну, можем, например, еще придать ему толщину границы. Например, сделать его таким жирным. Можем ему придать различного типа оформление. Например, задать тень для нашего объекта и те же самые элементы оформления возможно, конечно же, не только для поля, для ввода, ну и для метки, и для любых элементов. Зададим, например, тоже тень для этого элемента. Зададим заливку вот такую зеленую. Правда, надо отметить одно обстоятельство, что работа с базами данных это не то место, которое требует достаточно большого расцвечивания наших форм и элементов, поскольку при работе с базами данных основным является его содержание и то, как пользователю будет удобно и легко работать с содержащимися в ней данными, а не то, насколько красиво и оригинально с применением максимальных возможностей по реализации эффектов, будут выглядеть наши формы с базами данных. Все-таки пользователь приходит для работы с базами данных именно для работы, а не для развлечения. Для этого он может найти другие возможности.
7.7. Области формы Форматирование полей и меток Наряду с полем для ввода, которое существует для отображения различных данных из наших таблиц и их изменения, существует еще такой элемент, как метка, при помощи которой просто отображается некая надпись на нашем теле формы. Мы могли заметить, при создании полей в нашей форме, одновременно появляется и метка, в которой написано название этого поля. И при передвижении этих объектов по нашей форме, они передвигаются вместе со своей меткой. Но, в принципе, такого рода метки можно удалить, выделив ее отдельно и щелкнув на кнопке Delete. И кроме этого, метку можно ввести так сказать независимую от своих каких-либо полей. Для этого нам нужно вызвать на наш экран палитру элементов. Ее можно вызвать, щелкнув на вот эту кнопку, кнопу панели элементов на нашей панели инструментов. Щелкнем. И вот появилась вот эта панель. И здесь у нас есть такой элемент, как надпись, в которой отображается вот такой пиктограммой две буквы "A". Щелкнем на ней и затем можем в любом месте на нашей области формы, после того, как курсор нашей мыши приобретает вот такой характерный вид, щелкнуть и здесь появляется вот это место для ввода, в котором мы можем написать наш
Глава 7. Формы.
191
текст. Напишем, например, таким образом. Это текстовая метка. Как мы видим, у нас весь текст пишется подряд, в одной строке по мете ввода нашим символов. Если мы сейчас щелкнем гделибо в другом месте нашей формы, то эта метка зафиксируется и приобретает обычный вид, как и любая другая метка на нашем поле. Как мы видим, у этой метки появился вот такой зеленый треугольник. Если мы на нем щелкнем, то появляется восклицательный знак, который указывает нам, что эта надпись не связана ни с каким элементов управления. В принципе, оно так и есть, поскольку мы ее создавали так сказать обособленно. Рассмотрим теперь, какие возможности есть у нас по управлению этим объектов. Во-первых, при вводе новой метки, мы могли не просто щелкнуть на соответствующем экране, но указать, так сказать, целиком, сколько места мы хотим отобразить под нашу метку. Для этого опять щелкнем на пункте Надпись. И отметим соответствующий прямоугольник, внутри которого мы хотим, чтобы была расположена наша надпись. Как мы видим, она целиком появилась на нашем экране, и затем можем опять написать ту же самую надпись. Это текстовая метка. И теперь можно увидеть, что вот этот текст разместился несколько по-другому, чем тот текст, который мы вводили. А именно, он разделился на две строки. Что связано с тем, что этот текст, конечно же, не поместился по ширине в отведенном ему прямоугольнике. Когда мы щелкнули и вводили текст посимвольно, программа автоматический подбирала размер вот этого выделенного прямоугольника так, чтобы наш текст целиком влезал в одну строку. А если мы сами задали этот размер, то, конечно, в этом случае этот текст целиком не поместился на одной строке. В принципе, размер, который отводится для нашего текста на нашей форме, мы можем изменять. Для этого достаточно двигать вправо или влево соответствующие маркеры. То же самое можно сделать и с вот этой меткой. И она точно так же, как и метка, которая находится наверху изменяет свой внешний вид, приобретает вот такую многострочность. А если мы будем дальше уменьшать его размер по горизонтали, то, как мы видим, в этом случае компьютер уже не смог расположить соответствующее слово целиком на одной строке, и разбил его тоже на два. Если компьютер может, то, конечно же, он будет переноситься по словам, а если у него это тоже не получается, то тогда разбивает как получается. И в результате, вот это слово Текстовое, разбилось у нас две половинки. В нашем тексте мы можем изменять различного рода форматирование. Например, увеличим размер, который отводится под наш шрифт. Как мы видим, шрифт стал больше. Надо отметить одно обстоятельство, а именно мы можем редактировать вот этот текст и задавать его шрифт только целиком. Если мы выделим определенную только какую-то часть, в этом случае у нас возможность по изменению шрифта исчезает. Т.е. тут мы не имеем таких возможностей по редактированию. Правда, поскольку мы абсолютно не ограничены в количестве таких текстовых меток, то мы можем задать несколько слов с различным форматированием, с различным размером шрифта и размещать их в любом месте нашей формы. Так что в принципе это небольшая проблема, задание надписи с различными шрифтами. Кроме этого мы можем пользоваться и с теми же обычными возможностями по редактированию, которые нам знакомы из других приложений офиса. Например, можем задать цвет заливки, можем задать цвет текста, можем выровнять по центру. Можем выровнять по правому краю, по левому. Ну вот такие стандартные возможности. Кроме этого можем задать жирный шрифт, наклонный, подчеркнутый и т.д. Можем задать границу различной толщины. Можем задать цвет этой границы. Можем задать для нашего текста, например, тень. Или же сделать его выделенным или иным образом. Можем сделать, например, приподнятым, утопленным. Например, вот таким образом и т.д.
192
TeachPro Microsoft Access 2003
Рассмотрим теперь, например, вот эту метку. Попробуем ее расширить. И как мы видим, у нас текст расположился вот таким образом в одну строку, поскольку эту возможность дает нам ширина поля, которую мы ввели. А как нам сделать так, чтобы этот текст, несмотря на то, что ширина позволяет, все равно размещался бы в несколько строк. Для этого нам нужно ввести переводы строк в соответствующих местах нашего текста. Для этого, например, встанем вот в это место между словами Это и Текстовая, и щелкнем на кнопке Enter, нажав на кнопку Shift перед этим. И как мы видим, у нас строка разделилась на две части. Встанем опять на следующее место между словами Текстовая и мета, нажмем на кнопку Shift и, не отпуская, щелкнем на кнопку Enter. И, как мы видим, у нас текст занял теперь три строки. Удалим первый пробел вот таким образом и, например, выровняем по центру вот эту метку. Для этого щелкнем на соответствующую кнопку. И теперь у нас, как мы видим, текст расположился вот таким образом. Теперь, даже если мы будем увеличивать как угодно, этот текст в любом варианте будет располагаться на трех строках. Правда, здесь есть одно "НО". Если мы будем уменьшать, то после какого-то уменьшения, у нас текст все равно будет разбиваться, поскольку, например, вот это слово текстовое не помещается на одной строке целиком. Конечно же, вот таким образом многострочный текст мы можем вводить и в процессе ввода текстовой информации, а не только после того, как мы его целиком создали, вводить переносы строк. Например, введем новую текстовую метку вот в этом месте нашего экрана. И введем опять ту же самую надпись. Далее нажмем на кнопку Shift и, не отпуская, Enter. Вот мы перешли на следующую строку. Далее Текстовая. Далее опять Shift и Enter, и затем Метка. Если мы сейчас щелкнем на кнопку Enter, то, как мы видим, без нажатой кнопки Shift, мы просто-напросто зафиксировали данную надпись, выйдя из режима редактирования. Теперь же, если мы хотим, например, придать ему точно такой же внешний вид, как у какой-либо другой метки на нашей форме, для этого можно воспользоваться вот такой возможностью, как Формат по образцу. Выделим для этого, например, вот этот элемент. Щелкнем на вот этой кнопке, кнопке похожей на веник, форматирование по образцу. И далее, после того, как курсор приобретает вот такой характерный вид, достаточно подвести его к нашей элементу, как мы видим, когда мы его подводим к тому элементу, который можем принять это форматирование, веник приобретает такой разрешающий вид. Щелкнем. И, как мы видим, этот элемент приобретает точно такой же формат и внешний вид, как и образец. Точно также форматирование по образцу можно перенести, например, и на обычное поле, а не только метку. Вот такой вид приобретает в этом случае соответствующее поле. Чуть-чуть расширим и в таком виде зафиксируем нашу форму.
7.8. Ввод свободных, вычисляемых полей и рамок объектов Рассмотрим теперь, как на нашей форме, на которой мы уже расположили довольно много элементов, расположить еще элементы, которые уже будут непосредственным образом по какой-либо формуле зависеть от элементов данных из таблиц. Надо сказать, что в самих таблицах, в принципе, хранить какиелибо данные, которые зависят от других его элементов, смысла особого нет. Это будет просто-напросто тормозить нашу таблицу, и увеличивать его объем. Что, конечно же, создает определенные неудобства. А вот такие элементы, как формы, это как раз то место, в котором и нужно использовать вычисляемые поля. Но перед этим чуть-чуть освободим
Глава 7. Формы.
193
нашу форму от элементов. Для этого, например, выделим вот таким прямоугольником выделения вот эти элементы. Щелкнем на кнопку Delete. И как мы видим, мы получили абсолютно чистую область нашей формы. Сейчас, как мы видим, на нем ничего нет. Перетащим какое-либо поле с нашего списка полей. Вот, например, вот этот код разместили мы на нашей форме, и теперь введем еще какое-либо вычисляемое поле. Но для этого достаточно выбрать пункт Поле, на нашей панели инструментов. И далее разместить его на нашей форме. Например, вот в этом месте. Как мы видим, у него появилась надпись Свободное, что означает, что пока оно не связано ни с каким полем. И ни с какой формулой. А рядом появилась еще метка, в которую мы можем ввести какойлибо текст, и которая в принципе привязана к данному полю. Номер 33 соответствует порядковому номеру, вводимого и создаваемого нами объекта. А теперь же, если перейдем в режим просмотра нашей формы в обычном режиме, то можно увидеть, что если у нас в первом поле код отображается код соответствующего элемента, то второе поле у нас абсолютно пустое. Как бы мы не передвигались по нашим записям, вот это число, которое отображает код, соответствующим образом меняется, а вот это поле, оно абсолютно пустое. В принципе, оно и понятно, оно ни с чем не связано. Перейдем обратно в режим конструктора. Теперь щелкнем на вот этом месте в поле. Как мы видим, оно пока абсолютно пустое и введем такое выражение. Введем знак равенства, с которого должно начинаться любое вычисляемое поле. Далее напишем слово Код. И далее, умноженное, например, на 2. Щелкнем на кнопку Enter. Как мы видим, компьютер слово Код поместил в соответствующие квадратные скобки, что означает, что он достаточно верно воспринял это выражение. Перейдем теперь в режим формы и, как мы видим, у нас уже наша форма работает. Вычисляемое поле показывает в два раза большее значение, чем сам код. Если мы будем передвигаться, то, как мы видим, соответствующим образом изменяя номер записи, мы отображаем код и выражение, которое равняется удвоенному значению в поле Код. Перейдем опять в режим конструктора и отметим еще одно обстоятельство. Попробуем вызвать свойство для данного поля. Для этого щелкнем на правую кнопку мыши, когда мы на ней находимся. Щелкнем на пункте Свойства. Как мы видим, здесь у нас появляются достаточно много возможностей, связанных с этим полем. Во-первых, мы можем изменить метку, которая связана с ним. Например, вместо поля 33, написать слово Формула. Теперь это поле мы можем искать в списке объектов под вот этим именем, под именем Формула. В принципе, мы можем изменить те данные, которые отображаются в этом поле. Во-первых, мы можем простонапросто точно выбрать какое-либо поле, чтобы оно непосредственно его отображало. Например, выбрать поле Фамилия. В этом случае это поле, конечно же, не будет вычисляемым полем, а будет обычным полем, которое отображает соответствующую ячейку в таблице. Вернемся теперь обратно к формуле, в которой можем записать, например, опять как код умножить, например, напишем на этот раз умноженное на 3, и конечно же, все это отображается в соответствующей ячейке. Кроме этого, мы можем задать формат для нашего поля, в качестве которого можем выбрать какой-либо из предопределенных форматов. Как это будет выглядеть, можно видеть, смещаясь, при помощи вот этого скроллинга. Ну, выберем, например, такой формат, как фиксированный и зададим число десятичных знаков после запятой, например, две цифры. Можем ввести значение по умолчанию, которое будет отображаться, если значения нет в таблице, и т.д. Закроем теперь эти свойства. Конечно же, они автоматически фиксируются. И теперь посмотрим, как все это будет выглядеть в режиме формы. Щелкнем на вот этой кнопке и можно видеть, как отображается это вычисляемое поле. Сейчас, как мы видим, оно отображается с соответствующей точкой в качестве разделителя и с двумя цифрами после запятой. Перейдем теперь опять в режим конструктора и отметим еще одно обстоятельство. Что, в принципе, вот в таком виде, достаточно неудобно вводить достаточно длинные выражения. Они не помещаются внутри вот этой ячейки. И тут возможность вызова непосредственным образом окна для ввода при помощи шрифта F2. Из этой ячейки у нас, к сожалению, отсутствует. Поэтому, мы можем щелкнуть на правую кнопку мыши. Вызвать свойства, а уже из вот этого окошка мы можем щелкнуть на кнопку Шрифт и F2. И появляется вот такая область ввода, в которой, конечно же, у нас гораздо больше места. Закроем это
194
TeachPro Microsoft Access 2003
окошко и отметим, что мы можем вызвать еще и построитель выражения. Для этого нужно щелкнуть на вот эти три кнопки и вызвать вот эту стандартную возможность. Только единственное надо отметить, что любое выражение, если оно должно быть вычисляемым, должно начинаться со знака равенства. В принципе, точно также построитель выражения можно вызвать и непосредственно встав на ячейку и нажав на вот эту кнопку Построить. В этом случае появляется вот такой построитель. Нам нужно, конечно же, выражение. Щелкнем на кнопку ОК. И далее можем сконструировать любое выражение, начинающееся со знака равенства. Например, возьмем из нашей же таблицы сотрудников список полей. Например, возьмем такое поле, как Имя. Щелкнем на нем дважды. Затем свяжем его при помощи связки с пробелом, который поместим в кавычки. Далее опять связка. И далее Фамилия. Щелкнем дважды. Теперь, когда выражение готово, мы можем выделить его, скопировать в буфер обмена, щелкнув на кнопке Ctrl+C и затем закрыть этот построитель выражения. И вставим это выражение вот в эту ячейку. Для этого выделим его внутреннюю часть и нажмем на кнопку Ctrl+V. Вот это выражение у нас здесь целиком поместилось. А теперь посмотрим, как все это будет выглядеть в режиме формы. Но перед этим, расширим это поле, поскольку Имя+Фамилия, это уже более длинное выражение и щелкнем на вот этой кнопке. И вот, можно видеть, как будет выглядеть наша форма и вот это вычисляемое поле. Как мы видим, оно автоматически отображает имя и фамилию соответствующего сотрудника. Правда, как мы видим, что интересно, что выравнивание у него получилось по правому краю. В принципе, это просто-напросто связано с тем, как мы создавало это поле. В начале оно у нас было числовым и поэтому выравнивалось по правому краю. В принципе, мы можем это исправить, задав соответствующее выравнивание при помощи вот этой кнопки выравнивания. И теперь, перейдя в режим формы, можем видеть, что отображение данных в этом поле, конечно же, более стандартное. Перейдем опять в режим конструктора и попробуем скопировать вот это вычисляемое поле. Для этого достаточно щелкнуть на правую кнопку мыши и выбрать пункт Копировать. Далее правая кнопка мыши и Вставить. И, как мы видим, вот это поле появилось в соответствующем месте нашей формы. Можем его передвинуть на любое удобное нам место и, конечно же, оно повторяет в точности все то же самое, что было у нас в оригинале. А если мы еще раз щелкнем на правую кнопку мыши и выберем пункт Вставить, появляется еще одно поле такого же типа. Можем его тоже сдвинуть в любое удобное нам место. Щелкнем опять на правую кнопку мыши, выберем пункт Вставить, и т.д. Таким образом, можно вставлять любое количество вычисляемых полей. Например, можем отредактировать вот это поле. Вместо пробела использовать знак подчеркивания. И если мы перейдем в режим формы, то можем видеть, как будут выглядеть наши несколько вычисляемые поля на нашей форме. Но надо отметить одно обстоятельство, что создание большого количества вычисляемых полей может серьезно замедлить и затормозить работу нашего компьютера, поскольку, конечно же, любые вычисления требуют определенного количества времени. Правда, в нашем конкретном случае у нас выражение достаточно простое, связано с одной единственной записью, и поэтому, конечно же, это будет выполняться достаточно быстро. Если вычисляемое поле содержит достаточно сложные выражения, связанные с обработкой большого количества вычисляемых полей одновременно, каждое из которых использует такие возможности, как, например, суммирование данных по таблице, то в этом случае торможение работы нашего компьютера, даже при полной загрузке процессора, нам в принципе, гарантирована. Удалим теперь несколько полей с нашей формы.
Глава 7. Формы.
195
Для этого достаточно опять-таки выделить вот таким образом несколько полей одновременно, прямоугольником выделения. И далее щелкнуть на кнопку Delete. И, как мы видим, у нас осталось всего лишь несколько полей. Если мы провести какую-либо операцию с несколькими полями одновременно, то, конечно же, мы опять-таки можем их выделить и задать, например, какой-либо другой размер шрифта, наклонный и т.д. Можем задать заливку, цвет шрифта. Но, как мы видим, мы одновременно действуем на несколько полей одновременно. А теперь попробуем отобразить на нашей форме такое поле, как рисунок, который у нас есть в нашей таблице. Перво-наперво попробуем использовать для этого точно такое поле. Возьмем вот эту возможность из панели инструментов, поместим его на нашей форме. Далее правая кнопка мыши и выберем свойство и в качестве источника данных, возьмем поле Фото. Закроем теперь свойство. Перейдем в режим отображения нашей формы. И можно увидеть, что вместо рисунка, мы на нашем вот этом поле видим что-то непонятное, что, конечно же, совсем не похожи на те рисунки, которые должны были быть в этом месте. Перейдем в режим конструктора и, конечно же, отметим, что для того чтобы отобразить фотографии, нам нужно не поле для ввода, а совершенно другое поле, которое, и приспособлено, именно для этих целей. Поэтому уберем это поле. Щелкнем на кнопку Delete и выберем для нее вот эту присоединенную рамку объекта. Поместим ее на нашей форме. Далее правая кнопка мыши, Свойства и в качестве источника данных, конечно же, используем вот это поле Фото. Закроем. И посмотрим, как все это будет выглядеть в режиме формы. Щелкнем на соответствующую кнопку и, как мы видим, мы как раз получили то, что надо. Наше поле отображает соответствующий рисунок. Если будем передвигаться по нашим записям, то можем видеть соответствующий вид наших рисунков. Перейдем обратно в режим конструктора и отметим, что это поле мы можем копировать точно так же как и любое другое. Для этого опять-таки правая кнопка мыши. Копировать. И вставить. Вот поместим его на свободное место, и после этого оно приобретает все те же самые права, как и любое другое поле на нашей форме. Для того чтобы это проверить, перейдем в режим Вид и можно увидеть, что вот эти поля отображают одну и ту же фотографию. Перейдем опять в режим конструктора, в котором и происходят все основные процессы редактирования над нашей формой.
7.9. Ссылки на элементы формы Режимы формы. Свойства формы Продолжим работу с формами, которую мы начали ранее, на других уроках. Рассмотрим опять, и будем модернизировать ту форму, которую мы ранее создавали, для которой составляеттаблица Сотрудники. Щелкнем на ней дважды, чтобы вывести ее на наш экран. И можем видеть, как она выглядит в обычном режиме, в режиме работы с формами. А теперь перейдем в режим конструктора. для того чтобы мы могли вносить в него какие-либо изменения. Для этого, конечно же, нужно щелкнуть на кнопке Вид. И вот можем видеть уже нашу форму в режиме редактирования. Редактирование, так сказать, его основы в конструкторе. Щелкнем на этой кнопке, чтобы расширить его на все окно. А теперь удалим одно из двух окон, в которое мы выводили рисунок. Для этого достаточно его выделить. Щелкнуть на кнопке Delete. И вот теперь у нас освободи часть нашего места на нашей форме для наших экспериментов. Рассмотрим вот это поле, в котором мы выводили данные имени и фамилии наших сотрудников. Как мы видим, мы назвали это поле формулой, а теперь попробуем ввести еще одно поле, которое будет вычисляться на основе вот этого поля, поля Формулы. Для этого создадим новое поле. Создадим его, щелкнув на вот этой кнопке на панели инструментов для создания нового поля.Создадим его, например, вот в этом месте. Как мы видим, оно появилось так сказать с меткой свободной. Здесь пока еще ничего нет. Щелкнем на нем и введем теперь таким образом. Имя поля, на которое мы хотим сделать ссылку, это вот эта формула. Перед этим напишем знак равенства. Далее формула. Щелкнем на кнопке Enter.
196
TeachPro Microsoft Access 2003
И как мы видим, вот это слово Формула поместилось в квадратные скобки, что означает, что компьютер правильно воспринял нашу мысль. Формула, конечно же, имя соответствующего поля. Перейдем теперь в режим вид нашей формы и можем видеть, что на вот этом поле, которое мы только что ввели, отобразилась точно такая же информация, как и в поле, которое находится чуть выше.И, конечно же, это верно и при навигации по нашим записям. Как только мы меняем номер записи, то имя и фамилия, которое появляется в соответствующем вычисляемом поле, дублируется вот в этом поле тоже. Перейдем опять в режим конструктора. Попробуем теперь модернизировать вот эту формулу, вот это вычисляемое поле. Для этого щелкнем на правую кнопку мыши и выберем пункт Свойство. И воспользуемся редактором выражений. Для этого щелкнем на вот эти три точки. Появляется вот такое стандартное окно, Построитель выражений. Теперь уберем все, что мы ранее писали. Напишем знак равенства. Затем воспользуемся функциями. Функции нам нужны, конечно же, встроенные. Воспользуемся текстовыми функциями, которые находятся в самом конце списка. И здесь воспользуемся такой функцией, как, например, длина строки. Щелкнем на ней дважды и затем нам нужно внутри него написать какое-либо выражение. В качестве выражения воспользуемся вычисляемым полем, в котором у нас складывается имя и фамилия наших сотрудников. Для этого щелкнем на вот этом списке объектов нашей формы и здесь найдем вот это поле Формула. Щелкнем на ней дважды. Вот, как мы видим, это поле Формула появилось. Правда, все наше выражение сейчас достаточно большом беспорядке. Чуть-чуть приведем ее так сказать в нормальный вид, удаляя ненужные знаки. И вставим еще скобку, которой здесь не хватает, и щелкнем на кнопке ОК. Вот, в таком виде мы попробуем воспользоваться этой формулой. Закроем его и перейдем в обычный режим отображения нашей формы. И, как мы видим, вот в этой аббревиатуре, Мария Святого, вместе со своими проблемами, которые внутри находятся, все это занимает, как мы видим, 14 символов. Ну и т.д. Если мы будем передвигаться по нашим записям, то можно увидеть количество символов вот в этих соответствующих выражениях. Перейдем обратно в режим конструктора. 222 И попробуем ввести еще одно поле. Для этого щелкнем на вот этой панели инструментов. Разместим поле в любом свободном месте. В принципе у него еще появилась метка, которая заняла совершенно неподобающее место. Соответствующую метку можно просто-напросто удалить, Delete. Удалим и вот эту метку тоже. А теперь свободному полю, например, зададим какое-либо имя. Для этого щелкнем на правую кнопку мыши. Выберем пункт Свойства. Перейдем на другие его свойства и вместо поля 61. напишем букву К, коэффициент. Закроем. И, как мы видим, вот эта буква К у нас появилась в соответствующем списке объектов. А теперь вернемся обратно к предыдущей формуле и здесь усовершенствуем его, написав такую вещь. Длина строки формулы умноженное на вот это наше новое поле К. Как мы видим, компьютер, когда мы щелкнули, воспринял это К, как поле, поставив его в квадратные скобки. Посмотрим теперь, как это все будет выглядеть. перейдем в режим отображения нашей формы. Как мы видим, пока это поле абсолютно свободно, здесь ничего нет. Но оно и понятно, поскольку оно вычисляется на основе длины соответствующей строки умноженное на вот этот коэффициент. Тут пока еще ничего нет. Если мы здесь введем, например, 1, то получим опять-таки длину нашей строки. Если напишем число 2, получим удвоенную длину строки и т.д. Достаточно ввести тут какое-либо число, чтобы сразу же автоматически получить его произведение на длину строки. Можем написать и какое-либо, например, дробное выражение, 3 целое и 6 десятых. Получив опять-таки его произведение на длину строки. Если мы будем передвигаться по нашим записям, то
Глава 7. Формы.
197
можем получить вот это вычисляемое выражение, полученное при помощи соответствующего преобразования из вот этих двух полей. Из вот этого текстового поля и соответствующего коэффициента. Возвратимся опять в режим конструктора. И отметим, что в принципе, вот таким образом, пользуясь свободными полями, сконструировать любое вычисляемое выражение. Например, можно сконструировать простейший калькулятор, который будет задавать. например, сумму двух полей или произведение и т.д. Кроме двух видов нашей формы, с которым мы работали ранее, обычная форма так сказать в режиме работы с ней и в режиме конструктора, существует еще несколько видов. Если мы щелкнем на вот этом ниспадающем меню, то можно увидеть, что есть еще режим таблицы, режим сводной таблицы и сводной диаграммы. Рассмотрим вот этот режим, режим таблицы. Если мы на ней переключимся, то можем видеть все те поля, которые у нас расположены на нашей форме. И их соответствующие значения, которые объединены у нас в виде вот такой таблицы. В принципе, конечно, в режиме формы работать с соответствующими полями гораздо удобнее, поскольку они расположены в определенном порядке, заданном нами из каких-то достаточно продуманных соображений. Ну, в принципе, из вот такого вида таблицы тоже можно получить достаточно много информации и иногда может быть удобно работа с ним. Правда, надо сказать, что в этом режиме мы не сможем рассмотреть рисунки, если только щелкнуть на ней дважды. И вызвав, например, соответствующий редактор Point или что-либо другое. И точно также мы не сможем посмотреть многострочные данные. Поэтому, конечно же, этот режим имеет и свои достаточно большие недостатки. Перейдем опять в режим конструктора, в котором, конечно же, удобнее всего производить всю настройку нашей формы. Рассмотрим теперь, какими же свойствами обладает сама вот эта форма, а не только отдельные ее поля. Ну и одной из самых главных свойств, является его название, которое отображается в верхней части соответствующего окна. Вот, если мы свернем, то вот это название Сотрудники, форма которой здесь появилась, она, конечно же, тоже может модернизироваться. Для этого щелкнем на вот этой кнопке, которая находится в левом верхнем углу этого окна и появляется вот такие свойства, которые являются основными свойствами нашей формы. Найдем сейчас такое свойство, как Подпись и введем здесь какое-либо название. Например, напишем таким образом. Наша форма. И это и будет той надписью, которая будет появляться в верхней части нашего окна. Перейдем в режим обычного вида нашей формы и можем видеть, что вот это название появилось в этой верхней части нашего окна. Появилась надпись Наша форма. Перейдем опять в режим конструктора. И можем вызвать опять свойство нашей формы. И просмотреть, какие из свойств мы хотим сохранить или убрать с нашей формы. Например, можем изменить появление прокрутки, оставив все прокрутки и горизонтальную и вертикальную, или оставить только горизонтальную, или только вертикальную. Можем, например, убрать область выделения. Для этого изменим слово Да на слово Нет. Ну и т.д. Здесь довольно много различного рода свойств. Закроем это окошко. Перейдем в режим формы и как мы видим, у нас уже в нашей форме исчезла вот эта область выделения. И наша форма приобрела вот такой, так сказать, оконный вид.
198
TeachPro Microsoft Access 2003
7.10. Связанные формы Главная и подчиненная ленточные формы Рассмотрим теперь, как нам создать форму, в которой мы могли бы отобразить две таблицы, которые каким-либо образом связаны друг с другом. Как мы помним, например, мы могли связать таблицу городов и таблицу Покупатели друг с другом, поскольку каждый покупатель живет в каком-либо городе. Сначала попробуем связать эти две таблицы друг с другом. Откроем эту таблицу городов. Щелкнем на ней дважды. Вот все города у нас перечислены в этой таблице и рядом, с каждым из этих городов приписан соответствующий код. Свяжем теперь эту таблицу с таблицами Покупатели так, чтобы они стали подтаблицей. Для этого щелкнем на пункте меню Вставка, далее подтаблица. И вот появляется меню вставки подтаблицы. И здесь, конечно же, первое, что нам надо выбрать, таблицу. В качестве таблицы, конечно же, возьмем таблицу Покупатели и далее нам нужно выбрать Подчиненные и основные поля, благодаря которым и будут связаны эти две таблицы. Связываться они, конечно, будут по коду города одной таблицы и по полю Код в таблице городов. Поскольку в таблице Покупатели, как раз и есть поле Код города, в котором и записано соответствующее число. Число, которое характеризует код города. Щелкнем теперь на кнопку ОК. И вот, как мы видим, рядом с каждой записью в нашей таблице появился вот такой плюс, что означает, что у этой таблицы появилась подтаблица. Если мы щелкнем на ней, то можно увидеть того покупателя, который проживает у нас в этом городе. Вот таким образом можем просмотреть, в каком городе, сколько покупателей у нас есть. Например, в городе Барнауле у нас, как мы видим, довольно много покупателей. Теперь же попробуем создать форму, содержащую эти две таблицы. Первое, что, конечно, можем сделать, это создать авто форму. Для этого щелкнем на кнопке создание нового объекта в нашей панели инструментов и здесь среди всех возможностей, нам, конечно же, сейчас нужна Автоформа. Щелкнем. И вот, как мы видим, появилась Авто форма, в которой пока расположена только одна таблица, таблица городов в виде двух полей. Мы можем, конечно же, передвигаться по записям этой формы. Ну, пока в принципе все достаточно просто. Закроем ее. Сохранять мы, конечно, не будем, щелкнув на кнопку Нет. И вернемся в нашу таблицу городов. А теперь, для того чтобы наша Автоформа была содержательнее, запишем ее, щелкнем на кнопке сохранения и теперь попробуем вызвать авто форму еще раз, щелкнув на вот этой кнопке создание нового объекта. Далее Авто форма и на этот раз можно увидеть, что наша Автоформа имеет уже гораздо другой вид. Наряду с информацией, которая характеризует соответствующий город, а именно его название, его код, в нижней части этого окна появляются все те покупатели, которые живут вот в этом городе. Мы можем изменять города, которые мы хотим просмотреть и каждый раз мы можем видеть, какие из наших покупателей живут именно вот в этом городе. Компьютер, как мы видим, автоматически фильтрует для нас эту информацию. Конечно же, вот это окошко, в котором расположена таблица Покупатели, обладает всеми теми же возможностями, как и обычная форма. Она на самом деле является такой подчиненной формой. В нем мы опять-таки можем передвигаться по этим записям. Правда, их не так уж много. Можем передвигаться вправо, влево по полям этой таблицы. В общем, пользоваться всеми возможностями, которыми обладает большая одиночная форма. Правда, у этой автоформы есть один минус. А именно то, что компьютер нам его создал в автоматическом режиме, и здесь, повлиять на чтолибо мы уже, конечно, не можем. Он создал так, как он хотел. Конечно же, теоретически можно
Глава 7. Формы.
199
перейти в режим конструктора и далее модернизировать этот вариант формы для связывания двух таблиц, но попробуем сейчас создать вот такую двухтабличную форму, так сказать, с нуля в ручном режиме. Ну, перед этим закроем эту форму. В принципе, макет и структуру этого объекта можно не сохранять, его достаточно восстановить, создав просто-напросто авто форму, поэтому щелкнем на кнопку Нет и вот мы вернулись обратно в нашу таблицу городов. Закроем теперь эту таблицу городов и вот мы уже попали в наш стандартный вид нашей базы данных.
7.11. Создание главной и подчиненной ленточной формы Создадим теперь форму, которая бы отражала две формы одновременно в ручном режиме. Перейдем для этого на вкладку Формы и щелкнем на кнопке Создать. Ну и первый вопрос, который нам, конечно же, требуется выяснить, это каким образом мы будем создавать нашу форму. Создадим ее при помощи конструктора, так сказать вручную. Никакими мастерами или авто формами сейчас пользоваться не будем. Ну и в качестве источника выберем нашу таблицу городов. Для этого щелкнем на вот этом ниспадающем списке и выберем вот эту таблицу, таблицу Города. Щелкнем и нажмем на кнопку ОК. В результате появляется вот такая стандартная форма, которая у нас пока абсолютно пустая и мы можем перетащить поля из нашей таблицы городов на эту форму. Ну, перетащим поле Город. Вот он появился перед нами. В принципе, можно было бы перетащить и поле Код, но он достаточно неинформативен и в принципе, в нашем случае вполне можно обойтись без него. Посмотрим теперь, как все это будет выглядеть. Перейдем на обычную форму отображения формы. Щелкнем на кнопке Вид и вот можно увидеть, как сейчас будет выглядеть наша форма. В принципе, все достаточно просто и стандартно. У нас всего лишь одно поле, поле, в котором отображается город. Мы можем двигаться по нашим записям, каждый раз получая отображение соответствующего города. Перейдем теперь в режим конструктора опять. И теперь нам нужно, в нашей форме еще предусмотреть место, в котором мы бы отображали вторую таблицу, таблицу Покупатели, которые живут в соответствующем городе. Для этого создадим эту вторую форму тоже в ручном режиме. Но перед этим вот эту форму, которую мы только что создали, хотя она достаточно примитивна, тем не менее, сохраним. Для этого щелкнем на кнопке сохранения. Далее нам нужно выбрать имя для нашей формы. Но пусть эта форма называется Города. Щелкнем на кнопку ОК и закроем эту форму. Вот появилась наша форма перед нами. В принципе, для того чтобы придерживаться единообразия, конечно же, лучше было бы имя города переименовать на Ф города, т.е. форма городов. Для того чтобы мы могли достаточно четко представлять себе по названию тип данного объекта. Поэтому напишем таким образом. И после этого, создадим теперь вторую форму. Для этого щелкнем опять на кнопке Создать. Ну, конечно же, воспользуемся конструктором, и выберем в качестве источника данных на этот раз таблицу Покупатели. Щелкнем на кнопке ОК. И вот эта таблица появилась перед нами. Правда, опять-таки пока это абсолютно пустая форма, в которой абсолютно ничего нет. Если мы сейчас щелкнем на кнопке Вид, то мы видим абсолютно пустое поле. Куда бы мы не передвигались, пока ничего здесь не отображается. Перейдем опять в режим конструктора. Поместим теперь на эту форму несколько полей. Ну, например, имя, фамилию. Метки, которые находятся с соответствующими полями уберем. Для
200
TeachPro Microsoft Access 2003
этого выделим. Щелкнем на кнопке Delete и в случае имени и в случае фамилии. А теперь же, если мы щелкнем на кнопке Вид, то можно увидеть, как будет выглядеть эта форма. Она состоит из двух вот таких полей. В принципе, пока это все еще далеко не то, что нам нужно. Переключимся опять в режим конструктора и изменим свойство этой формы. Т.е. то, каким образом она будет отображаться. Для этого щелкнем на вот этой кнопке, при помощи которой можно вызвать свойство. После того, как мы щелкнули дважды в этом месте, появились свойства этой формы. И здесь переключимся на вкладку макета. Здесь мы можем видеть такое свойство, как режим по умолчанию. Здесь у нас стоит форма, но в данном конкретном случае нам нужна ленточная форма. Посмотрим теперь, что нам это даст. Закроем и отобразим эту форму. Для этого щелкнем на кнопке Вид и можно увидеть, как на этот раз по-другому отображается наша форма. Здесь, как мы видим, у нас отображаются все записи нашей формы один под другим. Приблизительно так же, как в таблице, правда, при этом каждая запись отображается не в виде ячеек таблиц, а в виде вот такой формы. Но мы можем передвигаться по записям и видеть, как все это происходит. Переключимся опять в режим конструктора, для того чтобы мы могли изменить вид вот этой формы. Как мы видим, здесь достаточно много вот таким пустых мест. Что, конечно же, вызывает определенные неудобства. Переключимся. И выровняем данные, которые здесь отображены. Ну, сократим место, которое отводится под имя или фамилию. Уменьшим общий размер этой формы, вот до такого состояния и теперь, если мы переключимся в режим Вид, можно увидеть, как будет выглядеть наша таблица. Но на этот раз, конечно же, она выглядит симпатичнее. Единственное, конечно же, было бы неплохо, если бы наверху вот этой формы отображалось бы название соответствующих колонок. Попробуем это сделать. Перейдем опять в режим конструктора формы. Щелкнем на кнопке Вид, и зададим заголовок и примечание формы. Щелкнем. Вот появились эти два места, но примечание нам сейчас не нужно. Мы его можем так сказать занулить, задав его ширину, равную практически 0, и в качестве заголовка, зададим имя и фамилию. Для этого возьмем вот такую надпись. Переместим ее в верхнюю часть нашего конструктора, там, где у нас идет заголовок, напишем имя. Далее перетащим еще одну надпись. Это у нас будет фамилия. Но, в принципе, конечно же, было бы неплохо, если мы сейчас чуть-чуть выровняем и имя, и фамилию. Сделаем так, чтобы они были расположены по середине. Ну и уменьшим место, отводимое под заголовком. Посмотрим, как все это выглядит. Щелкнем на кнопке Вид и можно увидеть, что на этот раз все, конечно же, выглядит более понятно. У каждой колонки есть свое название. Переключимся опять в режим конструктора и сохраним эту форму, которая будет у нас использоваться в дальнейшем при конструировании нашей исходной формы с двумя таблицами. Для этого щелкнем на кнопку сохранения. Нам теперь нужно выбрать имя для нашей формы. Но, пусть аббревиатура здесь присутствует, Ф и далее эта форма называется Покупатели. Щелкнем на кнопке ОК. Закроем эту форму. И вот у нас есть теперь все необходимое для конструирования нашей двухтабличной формы. Единственное, исправим здесь грамматическую ошибку, которая у нас закралась. Вставим недостающую букву. А теперь откроем вот эту форму, форму Города. Щелкнем на ней. И далее на кнопке Конструктор. Вот он появился перед нами. Раскроем эту форму на весь экран. Щелкнем дважды. И раздвинем нашу форму, резервируя здесь гораздо больше места. Сдвинем вот эту панель и изменим вот это поле городов. Потянем все это чуть повыше. Можем еще изменить какие-либо форматирующие элементы. Например, зададим размер побольше. Например, 14 единиц.
Глава 7. Формы.
201
Ну, при этом, конечно же, нам будет необходимо увеличить размер этого поля. То же самое сделаем и в надписи. Вместо 8, возьмем 14 единиц и увеличим размер этой метки. А теперь, нам необходимо подумать о второй таблице, которую мы хотим разместить вот в этой нижней части нашего окна. Для этого воспользуемся вот этой кнопкой, которая находится на панели инструментов, подчиненная форма отчета. Щелкнем на ней. И нарисуем ее в удобном нами месте. Например, вот в этой части экрана. Как мы видим, пока здесь ничего нет, лишь белый прямоугольник. Если мы сейчас щелкнем на кнопке Вид, то пока кроме вот этого города больше ничего существенного не отображается на этой форме. Вот этот белый прямоугольник, пока абсолютно пуст, даже если мы передвигаемся по нашим записям. Перейдем опять в режим конструктора.
7.12. Способы связывания форм Уберем теперь вот эту метку. Она нам абсолютно не нужна. Щелкнем на кнопке Delete. А теперь вызовем свойство этого объекта, на котором сейчас у нас написано Свободный. Для этого щелкнем на правую кнопку мыши и Свойства. Далее перейдем на вкладку Данные и щелкнем на вот этом выпадающем списке. И выберем, конечно же, сейчас форму Покупатели. Щелкнем, а теперь нам необходимо связать эти два объекта, а именно таблицу городов и таблицу покупатели. В принципе, за нас сейчас это сделал компьютер в автоматическом режиме. Конечно же, он установил связь между этими двумя таблицами, так что, взяв код города одной таблицы, таблицы Покупатели и просто код в таблице городов. В принципе, все. конечно же, достаточно правильно. Ничего здесь менять не будем. Закроем теперь эти свойства. И посмотрим, как сейчас выглядит наша таблица. Для этого щелкнем на кнопке Вид. Ну и, конечно же, на этот раз все уже в принципе, достаточно информативно. Если мы передвигаемся по нашим записям, отображая различные города, то можно увидеть, какие покупатели у нас живут в соответствующих городах. Перейдем опять в режим конструктора. Отметим еще одно обстоятельство. А именно то, что вставить вот эту подчиненную форму на нашу основную форму, можно было бы и по-другому. Попробуем по-другому. Для этого уберем сначала вот эту форму, которую мы только что создавали. Для этого щелкнем на кнопку Delete. Уменьшим в размере вот эту форму городов. Сдвинем его в сторону и возьмем, и перейдем на основное наше окно, окно базы данных. И вот эту форму Покупатели, просто-напросто, воспользовавшись возможностями перетаскивания, которые поддерживает программа, просто перетащить в форму Покупатели, на нашу форму. Для этого нажмем на левую кнопку мыши, находясь на форме Покупатели и потащим его в сторону нашей формы. Ну, как мы видим, как только мы приблизились к нашей форме около нашей мышки появился плюс, что означает, что в принципе как раз и произойдем то, что мы хотели, добавление одной формы на другую. Отпустим сейчас мышь и можно видеть, что у нас получилось. А именно то, что мы хотели. Щелкнем дважды, чтобы расширить вот это окно и придадим нашей форме именно то расположение, которое нам нужно. Для этого уберем сначала вот эту метку. Она нам не нужна. Выделим. Щелкнем на кнопке Delete. И сдвинем вот это окно. Например, приблизительно вот в этом месте. Расширим его. Ну и, если мы сейчас перейдем на вид отображения нашей формы на нормальный вид, щелкнув на кнопке Вид, то можно увидеть опять-таки то же самое, что мы и имели ранее. А именно, в принципе, правильное отображение нашей формы. Здесь у нас в каждом городе можно увидеть, какие у нас есть покупатели.
202
TeachPro Microsoft Access 2003
Ну, теперь попробуем чуть-чуть модернизировать нашу форму. А именно можно понять, что вот эта область выделения каждой из записей. Ну, в принципе сейчас абсолютно не нужна, поскольку в каждом из городов не так уж много покупателей, поэтому и да кнопки перехода нам тоже в принципе не нужны. Без них вполне можно обойтись при навигации по нашим записям. Кроме этого ширина вот этой таблицы тоже слегка завышена. Ну, в общем, попробуем все это изменить. Для этого перейдем на вид конструктора нашей таблицы. Ну, конечно же, перво-наперво уменьшим его размер. Выделим его, далее потянем за соответствующий маркер, вызовем теперь свойство вот этой формы. Для этого щелкнем дважды на левом верхнем углу соответствующей формы на вот этой кнопке. Появились свойства этой подчиненной формы, перейдем на вкладку макета. Уберем область выделения, как мы сказали, сейчас нам не нужна, изменим Да на Нет. Уберем кнопки перехода. Нет. Закроем. И уменьшим размер нашей основной формы. Она в принципе сейчас очень велика. Допустим, в таком виде. Все это сделаем. Щелкнем теперь на кнопке Вид. И можно увидеть вид нашей формы. Мы можем переходить и видеть, как выглядит наша форма. И покупатели, которые живут в соответствующем городе. Перейдем опять в режим конструктора. Введем в нашу форму еще и заголовок для вот этой подтаблицы. Для этого введем соответствующую надпись вот наверху. Напишем здесь, например, просто Покупатели. Ну и зададим для него точно такой же шрифт и форматирование, как и для метки, которая находится чуть выше. Для этого выделим ее, щелкнем на вот этой кнопке Формат по образцу. И далее на нашей метке. Чуть-чуть его раздвинем по вертикали. И оставим вот в таком виде. Попробуем теперь сделать еще одну модификации нашей подчиненной формы. А именно, запретим его редактирование, поскольку, конечно же, вот в этой подчиненной таблице редактировать список покупатели, конечно же, не очень разумно. Щелкнем для этого на соответствующей кнопке, чтобы вызвать список свойств данной подчиненной формы. И здесь во вкладке Данные, на которой мы сейчас находимся, вместо разрешить изменение Да, поставим Нет. Поставим Нет на разрешение удаления и на разрешение добавления. Закроем и посмотрим, как все это теперь выглядит. Щелкнем на кнопке Вид и теперь можно увидеть, что исчезла возможность добавления новой строки. Мы не можем еще и редактировать. И появился и заголовок для вот этой таблицы. Перейдем опять в режим конструктора. Щелкнем на кнопке сохранения этой формы. И закроем ее. Щелкнем на соответствующем крестике, свернем главное окно нашей базы данных. Создадим теперь еще одну форму, состоящую из двух таблиц. При этом на этот раз попробуем сделать так, чтобы вторая подчиненная таблица выглядела так сказать в виде стандартной таблицы. Для этого создадим копию вот этой формы города. Щелкнем на правую кнопку мыши и выберем пункт Копировать. Далее встанем на пустом месте. Правая кнопка мыши и Вставить. Наберем имя для этой таблицы. Пусть это будет города-2. Щелкнем на кнопке ОК. Вызовем его в режиме конструктора. Щелкнем на соответствующую кнопку. Пока она выглядит точно так же как форма Города. Она, конечно же, является его абсолютной точной копией. Теперь же выберем вот этот вставленный объект, вторую форму. Щелкнем на правую кнопку мыши. Выберем пункт Свойства и в качестве объекта источника выберем не форму Покупатели, а таблицу Покупатели. Для этого найдем его в соответствующем выпадающем списке. Вот он. Щелкнем. Ну, конечно же, связь подчиненных и основных полей оставим ту же саму. Код городов и код. Закроем это свойство и посмотрим, как сейчас выглядит наша форма. Щелкнем для этого на кнопке Вид и как мы видим, мы для нашей подчиненной формы получили вид таблицы, стандартный его вид. Перейдем опять в режим конструктора. Попробуем еще и за-
Глава 7. Формы.
203
претить редактирование таблицы Покупатели в этой форме. Для этого щелкнем на правую кнопку мыши и выберем свойства и выберем пункт Блокировка. Щелкнем дважды на вот этом свойстве, для того чтобы она изменила свое содержание. Вместо Нет стала Да. Закроем, перейдем в режим отображения нашей формы и теперь, если мы даже попытаемся что-либо вставить на любую из записей, ничего у нас не получается, т.е. режим блокировки в этой форме действует исправно. Перейдем в режим конструктора. В принципе, здесь уже ничего менять не будем. Щелкнем на кнопке Сохранить, и закроем эту форму. Рассмотрим теперь опять вот эту исходную форму, форму городов, которую мы создавали ранее. И попробуем ее видоизменить таким образом, чтобы мы могли видеть не только всю подчиненную таблицу на нашем экране, но и всю таблицу городов тоже. Ну, опять-таки создадим копию этой формы. Для этого щелкнем на правую кнопку мыши и выберем пункт Копировать, далее щелкнем на правую кнопку и выберем пункт Вставить. Выберем имя. Пусть это будет Города -3. ОК. Откроем ее в режиме конструктора. Раскроем его на все окно. Обратимся теперь к свойствам нашей основной формы. Для этого щелкнем на левом верхнем ее углу, где находится вот эта кнопка. Щелкнем здесь дважды. Появилось свойство данной формы. Перейдем на вкладку Макет. И в качестве режима по умолчанию, выберем пункт Ленточная форма. Ну и, как мы видим, простое преобразование в эту ленточную форму нам не удалось. Поскольку у нашей формы есть форма с подчиненной формой, элементы или присоединенной диаграммой, не преобразовывается в ленточную. Щелкнем на кнопку ОК. И попробуем чуть-чуть изменить что-либо в нашей форме. Ну, конечно же, что мы можем изменить. Мы можем просто-напросто эту форму убрать с области данной нашей формы. Совсем убирать было бы неразумно, поэтому просто-напросто его перенесем в другой раздел нашей формы. Для этого щелкнем на кнопке Вид, и добавим заголовки и примечания в наши формы. Заголовок сейчас нам не нужен. А вот в область примечание, перетащим нашу таблицу. Схватим ее. И вот таким образом перетащим. Как мы видим, она совершенно благополучно приземлилась на новом для себе месте. Сократим теперь размер исходной формы. Перетащим и вот это название Покупатели тоже вниз в область примечания. Изменим местоположение вот этой нижней таблицы. Уменьшим вот эту форму, место, которое отводится для примечания. Уменьшим и размер области данных вот до такого вида. Метка Город нам сейчас уже тоже не нужен. Щелкнем на кнопке Delete, чтобы ее удалить. А вот это поле Город растянем, чтобы оно так сказать заняло больше места. Например, вот такой. Посмотрим, как все это будет выглядеть. Щелкнем на кнопке Вид. В принципе, то что мы получили, не совсем похоже на то, что должны были получить. А именно, мы не получили список всех наших городов. В принципе, оно и понятно. Мы не преобразовали вот эту нашу исходную таблицу к виду Ленточный. Поэтому перейдем опять в режим конструктора. Щелкнем дважды на свойствах этой формы и вместо режима по умолчанию одиночная форма, выберем ленточную. Закроем. На этот раз, как мы видим, компьютер благосклонно воспринял наше изменение, и перейдем теперь на вид нашей формы. Щелкнем на соответствующую кнопку и, как мы видим, на этот раз у нас получилось все достаточно гладко. Теперь, если мы будем менять номер нашей записи, в соответствии с тем, как мы выбираем нашу запись Соответствующий город, меняется и в нижней части нашего экрана список фамилии покупателей, которые живут в этом городе. Мы можем, воспользовавшись ползунком перейти и в города, которые находятся в середине списка, даже в ее самом конце, и увидеть тех покупателей, которые живут, например, в СанктПетербурге. Как мы видим, здесь довольно много покупателей, имена и фамилии которых выводятся у нас вот в этом окне. В принципе, можно было бы и расширить соответствующую область данных и вывести не только имя и фамилию, но и другие данные, которые хранятся в соответствующей записи в таблице Покупатели. Ну, сейчас остановимся на том, что есть. И сохраним макет этой формы. Щелкнем на кнопке сохранения и закроем. Щелкнем на вот этом крестике. Свернем это окно, чтобы вернуться к стандартному виду нашей базы данных.
204
TeachPro Microsoft Access 2003
Глава 8. Элементы управления и макросы 8.1. Ссылки на элементы управления в формах из других объектов Access Рассмотрим теперь, какие еще элементы управления можно использовать на формах и как их использовать. Для этого откроем вот эту форму, которую мы создавали ранее, форму Города. Откроем ее в режиме конструктора. Щелкнем для этого на эту кнопку. Раскроем эту форму на весь экран. Для этого щелкнем на соответствующую кнопку Развернуть и чуть-чуть изменим местоположение наших объектов на ней. Перво-наперво, расширим саму форму и переставим вот эту таблицу Покупатели в правую часть этого окна. Выделим для этого вот эти два объекта и перетащим их вот таким образом вправо. Поле Города же перетащим так, чтобы они были расположены в левой части нашей формы. Если мы сейчас переключимся в отображении нашей формы в нормальном режиме работы с ним, щелкнув на кнопке Вид, то можно увидеть, что наша форма приобретает вот такой внешний вид. Слева, название города, а справа, все покупатели, которые живут в этом городе. Переключимся опять в режим конструктора. Отметим, что мы уже довольно много работали с надписями, с метками на наших формах. Также довольно много работали и с полем для ввода. Попробуем теперь вот это поле для ввода использовать в качестве параметра для каких-либо действий. Например, в качестве параметра при работе какого-либо запроса. Ну, перво-наперво выделим поле для ввода. Введем его в нашу формулу, например, вот в это место. Как мы видим, перед полем для ввода ввелась метка, которую, в принципе, сейчас можем удалить. Выделим ее, щелкнем на кнопку Delete, и вот теперь у нас осталось одно поле, на котором пока написано Свободное, поскольку оно ни с чем не связано. Теперь же сконструируем нужный нам запрос. Для этого, перво-наперво, сохраним эту Фому, щелкнем на значке сохранения, ну и параллельно заполним название нашего поля, поле 5. Теперь же свернем это окно, перейдем в наше главное окно базы данных и перейдем на вкладку Запросы. Щелкнем на кнопке Создать новый запрос. Воспользуемся, конечно же, просто-напросто конструктором, ОК. Выберем таблицу, таблицу возьмем таблицу городов, с которой мы работали и при создании нашей формы. Щелкнем на кнопке Добавить. И закроем это окно. Теперь выберем поля, которые нам понадобятся. Это, конечно же, код и поле Город. Если мы сейчас выполним наш запрос, щелкнем на кнопке Вид, то мы просто-напросто получим все города из нашей таблицы. Пока здесь ничего необычного нет, перейдем опять в режим конструктора. Вставим теперь условия отбора. И для того чтобы не гадать самим, какое же выражение здесь нам необходимо вставить, воспользуемся мастером постройки выражений. Щелкнем на вот этой кнопке, которая находится на панели инструментов. Вот появилось стандартное окно построителя выражения, и здесь найдем нужное нам поле, которое, как мы знаем, находится в формах, поэтому раскроем этот список форм. Щелкнем дважды. Раскроем список загруженных форм. Здесь у нас, конечно же, всего лишь одна форма, форма города. Она у нас и является загруженной и открытой в данный конкретный момент. И здесь вот это поле, поле 5. Мы можем, в принципе, здесь взять любой из различного рода свойства, которые характеризуют поле 5. В том числе и цвет, толщину линии. В общем, любой параметр. Нас же, сейчас, конечно же, конкретно интересует значение, поскольку выбирать название города, например, по цвету в каком-либо поле или толщине линии, конечно же, особого смысла не будет.
Глава 8. Элементы управления и макросы.
205
Щелкнем дважды. И вот появилось такое выражение города и поле 5, в котором перечислены все те объекты, в котором находится наше поле 5. Это формы, далее сама форма города и далее конкретно поле 5. Название нашего поля. Щелкнем на кнопке ОК. И вот это название появилось в условиях отбора. Щелкнем теперь на кнопке Вид, и как мы видим, в данном конкретном случае у нас пока ничего нет. Ни одного города с таким кодом нам компьютер не выбрал. В принципе, оно и понятно, поскольку у нас в соответствующей форме пока никакого выражения и нет. Переключимся опять в режим конструктора и вызовем вот эту форму, форму городов. Далее переключимся на вид, и введем вот в это поле какое-либо значение. Например, напишем 25. Теперь же вызовем вот этот соответствующий запрос и попробуем на этот раз его выполнить. Щелкнем на кнопке Вид. Можно видеть, что у нас опять ничего не получилось, переключимся в режим конструктора, и на нашу форму, чтобы понять, что же мы сделали здесь не так. Дело в том, что мы здесь набрали 25, но не зафиксировали это число. Для этого достаточно просто-напросто перейти из этого поля для ввода, хотя бы в это, в какое-либо другое. Т.е. чтобы он потерял фокус ввода, соответственно зафиксировавшись в компьютере. Теперь же перейдем на запрос и его выполним. И как мы видим, появился город с кодом 25. Перейдем опять на нашу форму. Выберем какой-либо другой номер, но, например, 57. Опять зафиксируем, и выполним запрос. Для этого перейдем опять в режим конструктора и опять перейдем в режим таблицы. И вот мы нашли город с кодом 57. Т.е. вот таким образом у нас получилось связать поле для ввода с запросом. Перейдем теперь в режим конструктора и вместо вот этой свободной формы, используем форму, которая была бы связана с вот этой основной таблицей, таблицей городов. Уберем вот это свободное поле. Щелкнем на кнопке Delete, поскольку она выделена. И, воспользовавшись списком полей в таблице Города, вытащим из нее поле Код. Перетащим его на нашу форму. Вот она появилась перед нами. Разместим его вот в этом месте. А теперь, запомнив, что у этого объекта название Код, переключимся в наш запрос. Перейдем опять в режим конструктора. Уберем вот это условие отбора. Перейдем опять в построитель выражения, щелкнув на вот эту кнопку, и найдем наше поле. Конечно же, для этого нам нужно открыть формы. Далее загруженные формы, далее форму городов и здесь у нас есть поле Код. Щелкнем на нем дважды на значении, и щелкнем на кнопку ОК. Посмотрим теперь, что у нас получилось. Перейдем в режим выполнения нашего запроса. Опять-таки пока у нас здесь ничего нет, поскольку мы не выполнили и не запустили нашу форму на расчет. Щелкнем на кнопку Вид. Как мы видим, сейчас у нас открыт первый город, город Абакан, у которого код 1. Посмотрим, как все это будет выполняться в запросе. Щелкнем на кнопку выполнения запроса и, как мы видим, вот этот город Абакан появился и в нашем запросе. Если мы сейчас изменим номер нашей отображаемой записи, например, возьмем город с кодом 12. Как мы видим, он является городом Брестом, и выполним этот запрос. Для этого перейдем в наш конструктор запроса, и опять в отображение нашего запроса в табличной форме. Ну и, как мы видим, он опятьтаки послушно отобразил то, что надо. А именно, город Брест с кодом 12. Т.е. вот таким образом мы связали уже не только свободное поле, но и поле связанное с определенным полем в таблице и с соответствующим запросом, запрос выполняется по параметру. Закроем теперь этот запрос. Он нам уже не нужен, поэтому сохранять его не будем. Щелкнем на кнопке Нет.
206
TeachPro Microsoft Access 2003
8.2. Форматирование поля со списком Ссылки на нужную колонку списка Рассмотрим теперь такой элемент управления, как поле со списком или комб инированный список. Эти три термина достаточно часто используют при работе с этим элементом. Но перейдем в режим конструктора в этой форме. Для этого щелкнем на соответствующей кнопке Вид. Раскроем эту форму на все окно. Уберем вот эти лишние объекты. Для этого выделим их, щелкнем на кнопке Delete и теперь разместим на нашей форме соответствующий, поле со списком. Его можно взять из нашей панели инструментов. Вот в этом месте, поле со списком. Щелкнем на нем. И разместим его, например, вот в этом месте нашего экрана. Как всегда у нас появился и сам объект и связанная с ним метка. Метку выделим, щелкнув на кнопку Delete, и удалим, для того чтобы она нам в данный конкретный момент не мозолила глаза. И, конечно же, как мы видим, вот это поле со списком сейчас абсолютно свободно, и ни с каким другим элементом или таблицей не связано. Поэтому, если мы сейчас выполним нашу форму, запустим ее, то, как мы видим, этот элемент абсолютно пуст. Перейдем теперь обратно в конструктор. Попробуем заполнить вот этот выпадающий список соответствующими какими-либо данными. В принципе, выпадающий список достаточно распространенный элемент, с которым мы часто сталкиваемся при работе с Windows. Например, мы им пользуемся, когда нам нужно выбрать какой-либо шрифт, когда нам нужно выбрать какой-либо объект, размер шрифта и т.д. Это достаточно широко распространенный элемент. А теперь выберем свойство этого объекта. Для этого щелкнем на правую кнопку мыши и выберем пункт Свойство. Откроем вкладку Данные и самое главное, конечно же, что нужно выбрать, это источник данных для нашего объекта. Щелкнем для этого на этом ниспадающем списке. И здесь, как мы видим, в данном конкретном случае, у нас две возможности, это город или же код. Если мы сейчас выберем, например, в качестве данных город. Закроем это поле со списком и запустим нашу форму, то можно увидеть, что название города повторяется вот в этом объекте. Правда, он так сказать, в качестве поля для списка нам сейчас не годится. Здесь у нас отображается только название. Вот, если мы будем двигаться по нашему списку городов, соответствующий город все время отображается у нас, но никакого выпадающего списка мы при этом не получаем. Поэтому переключимся обратно в режим конструктора. Щелкнем на правую кнопку мыши. Выберем опять свойство этого объекта, уберем данные. Это свойство так сказать оставим пустым, а вот в качестве источника строк воспользуемся таблицей городов. Для этого щелкнем на выпадающем списке и найдем вот эту таблицу. Щелкнем. Далее, если мы закроем эти свойства, перейдем в режим Вид, то можно увидеть, если мы щелкнем на выпадающем списке, весь список городов, которые есть у нас в нашей таблице. Мы можем выбрать любой из этих городов. Можем путешествовать по вот этому списку. Правда, как мы видим, никакого влияния на другие элементы на нашей формы не оказываем. Перейдем опять в режим конструктора. Вызовем теперь свойство этого элемента. Щелкнем на правую кнопку мыши и выберем пункт Свойство. Перейдем на макет и рассмотрим еще одно свойство. именно, число столбцов. Здесь, как мы видим, стоит 1. А если мы сейчас поставим 2 здесь, тогда будут отображаться оба поля, которые есть в нашей таблице городов. Посмотрим, так ли это. Закроем это свойство. Перейдем в режим Вид. Но перед этим, чуть-чуть расширим вот этот объект, поскольку должны сейчас в нем отображать две колонки одновременно, и щелкнем на этой кнопке. Как мы видим, наша форма запустилась. Если мы сейчас щелкнем
Глава 8. Элементы управления и макросы.
207
на этом выпадающем списке, то рядом с каждым городом можно видеть его код. Вот в таком табличном виде. Можем выбрать. Но и, как мы видим, в соответствующем месте нашего объекта наверху, пишется имя города. А в выпадающем списке у нас отображается и город, и его код. В нашем объекте мы можем заполнять название наших городов и вручную, вводя соответствующие буквы. Например, введем букву "Б". Сразу появляется название Брест. Если мы введем, например, букву "Я", то появляется Ярославль. Т.е. по первой букве, компьютер автоматически пытается подобрать нам соответствующий город. Например, наберем букву "A", появляется Осина. А если же мы будем вводим не одну, а несколько букв. Например, "Б" появляется Брест. Потом введем букву E, появляется :, простонапросто компьютер подбирает первый же город, у которого совпадают первые соответствующие набранные нами буквы. сли мы сейчас щелкнем на выпадающем списке, то можно увидеть вот эти два города, который у нас есть, оба начинаются на две буквы "Б" и "E". Если мы, например, введем третью букву "P", то, как мы видим, компьютер автоматически подобрал нам город Берс. Ну и, конечно же, этими тремя буквами у нас всего лишь один город. Если мы дальше будем вводим какие-либо другие буквы, то компьютер уже никак не может отреагировать и дополнить наши падуги соответствующими буквами до какого-либо названия города. Переключимся теперь опять в режим конструктора.И попробуем ввести на наше поле еще одно поле, в котором будем отображать тот выбор, который мы сделаем вот в этом объекте. Для этого создадим на нашей форме новое поле, щелкнув на вот этой кнопке, зафиксируем его. Например, вот в этом месте нашей формы. Метку опять удалим, опять щелкнем на кнопку Delete. Воспользуемся именем, которое у нас есть в нашем полем. Как мы видим, он называется достаточно длинно, поле со списком. В принципе можем это название тоже поменять. Для этого, допустим, щелкнем на правую кнопку мыши, Свойства. Далее переключимся на другие и вместо поле со списком, напишем Список. Далее закроем эти свойства и теперь напишем вот в этом нашем свободном поле таким образом. Равняется и далее Список. Щелкнем на кнопке Enter. Как мы видим, компьютер поместил наше название в квадратные скобки, что означает, что он абсолютно правильно воспринял всю нашу информацию. Теперь же перейдем в режим отображения формы. Щелкнем на кнопке Вид. Ну, пока здесь отображается вот этот беспорядочный набор букв, который мы набирали в прошлый раз. Но если мы выберем любой какой-либо город, этот город автоматически отображается в нашем поле. Причем отображается именно его название. Переключимся теперь обратно в режим конструктора. И отметим, что, то, каким образом будет отображаться в этом полем соответствующий наш выбор, зависит от того, что отображается в нашем объекте, какие здесь отображаются колонки. Как мы помним, в нем отображались две колонки. Колонка город и колонка кода. Ну и в качестве отображения для нашего поля, он выбрал, конечно же, первую из этих колонок, колонку город. А что же нам делать, если мы хотим отображать еще и другую колонку. А именно, колонку Код. Для этого нам уже надо поступить немножко похитрее. Разместим, например, еще одно поле вот в этом месте. Как всегда удалим метку. Для этого выделим, щелкнем на кнопке Delete. А теперь напишем таким образом. Равняется, далее опять список. А если мы сейчас щелкнем на кнопке Enter, мы получим просто-напросто повторение предыдущего нашего эксперимента. Нам сейчас нужна другая колонка, поэтому щелкнем и напишем далее точка, далее квадратные скобки, внутри которых напишем колонка, т.е. по-английски. И далее, внутри скобок ту колонку, которую мы хотим вывести. Мы сейчас хотим вывести колонку под номером 1. Колонка город будет иметь
208
TeachPro Microsoft Access 2003
номер 0. Подсчет ведется с нуля. Переключимся в какой-либо другой объект. Как мы видим, компьютер вполне нормально воспринял все наши изменения. Перейдем в режим Вид и, как мы видим, компьютер уже отображает рядом с именем города, его код. Если мы изменим выбор, то, как мы видим, автоматически изменяется и соответствующий код. Но, в принципе, вот, например, выберем город Воронеж. У него, как мы видим, код 24, что и отображается в соответствующих полях нашей формы. Перейдем в режим конструктора. Сохраним эту форму. Щелкнув на кнопку сохранения. И теперь нам осталось сделать так, чтобы по выбору нашего объекта, мы могли бы зафиксировать изменения и в наших других полях. В таблице, которая является основой для этой формы и в соответствующих полях. Вот в этом поле и город и таблицы Покупатели, которая связана с этим городом. Для этого нам уже понадобятся те возможности по управлению различного рода событиями и макросы, которые имеются в программе. А пока закроем эту форму. Щелкнем на вот этом крестике. Свернем ее. И мы вернулись в стандартный вид базы данных Microsoft Access.
8.3. Общие сведения о макросах Порядок выполнения и именования Итак, разберемся с простейшими средствами автоматизации, действий, которые называются макросами. С макросами мы довольно часто сталкивались в даже таких достаточно простых программах, как Word и Excel, в которых можно записать некую последовательность действий, оформить его в виде макроса и в дальнейшем использовать их многократно. Также можно их отредактировать и даже самим записать на языке Basic. Также с макросами связано и такое явление, как макро вирусы, которые, конечно же, являются в принципе, отрицательными, в последствии. использовании макросов. А сейчас займемся тем, как создаются и используются макросы в программе. Надо сказать, что макросы имеют несколько иной вид, чем в других программах Офис. Они не записываются в виде отдельного лофтинга, а являются заполненной последовательностью определенных команд. Посмотрим, как все это будет происходить. Для этого переключимся на вкладку Макросы. Как мы видим, у нас пока ни одного макроса нет. Оно в принципе и понятно. Мы еще ничего не создавали в этом направлении. А для того чтобы создать новый макрос, конечно же, щелкнем на кнопке Создать. Щелкнем. И появляется вот такое стандартное окно, в котором мы можем вводить сам макрос и его последовательность действий. Все, что от нас требуется теперь в этом конструкторе макросов, это выбрать макрокоманду, которая будет выполняться на нашем компьютере. Выбрать мы можем при помощи вот этого выпадающего списка. Если мы на нем щелкнем, то можно увидеть, какие здесь у нас есть возможности. Здесь достаточно много различного рода типовых команд. Но, допустим, нам хочется, чтобы этот макрос открывал нам какую-либо форму во время своего выполнения. Для этого можем найти соответствующую команду, команду Открыть форму. Вот она. Щелкнем на ней. Ну и, как мы видим, в нижней части этого окошка появилось несколько полей, которые определяют параметры данной команды. Но, первый из них, это, конечно же, имя формы. Т.е. здесь нам нужно выбрать именно конкретно эту форму, которую мы и будем открывать при помощи этой макро команды. Для этого щелкнем на этом выпадающем списке, и появляются все формы, которые у нас есть в нашей базе данных. Откроем первую же из них, это формы города.
Глава 8. Элементы управления и макросы.
209
В принципе, после вот этих нескольких действий, у нас уже макрос готов и мы можем его выполнить. Но перед этим сохраним его. Щелкнем на кнопке сохранения. Появляется при этом стандартное окно, в котором нам предлагают выбрать имя для нашего макроса. Ну, конечно же, в принципе, при реальной работе с базами данных сохранять вот такое имя Макрос 1, которое автоматически генерирует для нас особого смысла нет. Лучше, конечно же, создавать более выразительные имена. Мы сейчас можем согласиться. Щелкнем на кнопке ОК. И теперь, если мы щелкнем на кнопке Запуск, то мы получаем действие нашего макроса. Конечно же, оно заключается в том, что открывается вот эта форма. Форма города. Закроем эту форму. Закроем и макрос тоже. И отметим, что выполнить вот этот макрос мы можем еще и прямо из соответствующей вкладки нашей базы данных. Достаточно щелкнуть на вот этом макросе, макрос 1, дважды. И выполняются все действия, которые в нем записаны. Конечно же, действия заключается в открытии соответствующей формы. Закроем и откроем эту форму в режиме конструктора. Щелкнем для этого на кнопке Конструктор и вот мы опять попали в соответствующее окно, в котором мы можем слегка изменить наш макрос и все действия, которые при нем должны выполняться. Представим теперь, что мы хотим выполнить в одном макросе два последовательных действия. Например, после открытия нашей формы, откроем еще и какое-либо другое окно. Например, какую-либо таблицу. Для этого у нас есть еще так сказать много строчек в этом конструкторе макросов. При этом надо отметить, что мы в принципе, совсем не обязаны строчки заполнять последовательно. Например, заполним третью строчку, пропустив одну строчку между макрокомандами. Для этого опять щелкнем на ниспадающем меню и выберем другую команду Открыть. А именно, открыть таблицу. Щелкнем. Ну и затем, конечно же, нам нужно выбрать имя таблицы, которую мы хотим открыть. Допустим, мы хотим выбрать для открытия таблицу Покупатели. Теперь, если мы запустим нашу макрокоманду, но перед этим, конечно же, желательно его сохранить, закроем этот макрос и попробуем его выполнить. На этот раз не будем на нем щелкнуть дважды, а можем щелкнуть на кнопке Запуск. Щелкнем. Как мы видим, у нас открылась вот эта наша форма и поверх нее открылась еще и таблица, таблица Покупатели. И в принципе, так же как и в случае с обычным открытием этой таблицы, мы можем производить здесь любые действия. Что-то изменять, что-то сдвигать и так далее. Например, мы можем удалить часть имени, щелкнув на кнопке Delete. Можем ввести опять какие-либо новые буквы. Например, введем Александр. И вот, таким образом, мы изменили первую запись в нашей таблице. Закроем теперь и таблицу, и форму. Откроем вот этот макрос в режиме конструктора. И отметим, что мы можем изменить ряд свойств нашей команды в макросе. Как мы видим, у нас в свойствах макроса, конкретно его команды, есть режим данных. Здесь у нас, как мы видим, сейчас стоит изменение. Но если мы щелкнем на ниспадающем меню, то можно увидеть, какие здесь есть возможности. Мы можем разрешить только добавления, можем разрешить любое изменение или открыть его только для чтения. Если мы сейчас остановимся на только для чтения, и попробуем выполнить макрос вот в таком виде, сперва, конечно же, сохраним, закроем. Щелкнем дважды на вот этом макросе, то на этот раз, мы в нашей таблице можем только пролистать и рассматривать его данные. А вот менять чтолибо мы не можем. Вот, моя попытка ввести какие-либо буквы или щелкнуть на кнопке отмена, или Delete, ни к чему не приводит. У нас вот эта таблица открыта только в режиме просмотра, только для чтения. Закроем таблицу. Закроем и форму тоже, которая у нас открылась одновременно с таблицей и откроем этот макрос опять в режиме конструктора.
210
TeachPro Microsoft Access 2003
Рассмотрим теперь, какие поля в наших макросах существуют в нашем конструкторе. Вопервых, это, конечно же, сама макро команда. И кроме этого, это такое поле, как примечание, в которое мы можем вводить любое текстовое значение, которое будет кратко описывать действия нашей макро команды. Но кроме этого есть еще два поля, которые могут быть связаны с нашими командами. Для того чтобы они появились в нашем конструкторе, надо щелкнуть на вот этих двух кнопках. Именно макросов и условия. если мы щелкнем на этих двух возможностях, то появляются вот эти два поля, которые изначально были скрыты от нас. В столбце условия мы должны при желании вставить заданное условное выражение, для выполнения соответствующей команды. А в качестве имен макросов, можно выбрать любые имена. Причем надо отметить, что задание имени для соответствующей таблицы задает выполнение последовательности макро команд от текущего имени до следующего. Т.е. так сказать, самой макро командой, которая будут выполняться, будут считаться только та часть макроса, которая заключена между двумя именами. Например, зададим имя вот этой макрокоманды Открыть форму. Допустим, зададим ему просто-напросто в качестве имени просто цифру 1. А вот в строке Открыть таблицу, напишем цифру 2. И в этом случае у нас вот этот макрос, макрос 1 распадается на 2 макроса. А именно, первый макрос под именем 1, и которая выполняет открытие формы, и второй макрос под именем 2, будет выполнять открытие таблицы. А запуски макроса будет выполняться первый из них. Открыть форму. Как только компьютер дойдем до следующего имени, он остановится и дальнейшее выполнение прекратит. Посмотрим. Щелкнем на кнопке сохранить. Закроем этот макрос и попробуем его выполнить. Щелкнем на кнопке запуска и как мы видим, открылась только форма. А вот сама таблица не открылась. Как мы и ожидали. Закроем форму. Откроем в режиме конструктора и попробуем теперь вставить еще одну строчку, которая будет выполняться при запуске нашего макроса. Для этого у нас есть вот тут пустое место. Для этого щелкнем на вот этом ниспадающем меню и можем использовать любую из команд, которая у нас есть. Допустим, выполним открытие опять какой-нибудь таблицы. Щелкнем. В качестве таблицы на этот раз возьмем, например, таблицу сотрудников. И сохраним этот макрос. Если мы сейчас щелкнем на кнопке запуска, ну не будем закрывать наш макрос, а прямо запустим его отсюда. Вот, как мы видим, выполнились первые две строки нашего макроса. А именно, открылась вот эта форма, которая сейчас видна на заднем плане, а затем открылась таблица. Причем открылась таблица Сотрудников. Закроем. Закроем и форму городов. И попробуем сейчас немножко по-другому сделать. А именно, чтобы после выполнения макроса под именем 1, далее выполнялся макрос под именем 2. Для этого вот в этом ниспадающем списке вместо команды открыть таблицу, выполним команду Запуск макроса. Вот он появился перед нами. Ну и далее нам нужно выбрать имя нашего макроса. И в качестве него мы можем взять все те возможности, которые сейчас существуют у нас в нашей базе данных. Как мы видим, мы можем запустить сам макрос 1. Мы можем запустить часть макроса 1 с именем 1, или же часть макроса 1 с именем 2. Но сейчас интересует нас как раз вот эта последняя возможность, часть макроса 1 с именем 2. Затем мы можем задать число повторов и условия для повторения наших макросов. Пока все это заполнять не будем. Щелкнем на кнопке сохранения и попробуем выполнить этот макрос. Щелкнем. И как мы видим, у нас как раз получилось то, что мы хотели. А именно, открылась форма 2 и поверх нее открылась таблица, и на этот раз таблица Покупатели. Так, как мы и ожидали. Закроем теперь эти два окна. И мы вернулись к нашему конструктору макросов. Отметим, что в нашем конструкторе макросов мы можем пользоваться абсолютно теми же возможностями, которые у нас есть при работе с любой таблицей. А именно, мы
Глава 8. Элементы управления и макросы.
211
можем добавлять какие-либо строки. Для этого достаточно выделить и щелкнуть на кнопке Добавить строки. Вот в этом месте появилась новая строка. Можем еще раз щелкнуть на кнопке Добавить строки. И в этом случае добавляется очередная строка в нашем макросе. Ну и кроме этого, мы можем любую из строк просто-напросто удалить, щелкнув на кнопке удаления. Можем удалить и несколько строк одновременно. Вот, например, выделим эти, и щелкнуть на кнопке удаления. Можем щелкнуть на кнопке отмены последнего действия. Ну, все эти абсолютно понятные операции, которые в принципе, нам достаточно хорошо знакомы из других областей работы с программой. Сохраним теперь все наши изменения и закроем этот макрос. И отметим еще одно обстоятельство, а именно, как же нам сделать так, чтобы при запуске нашей базы данных, сразу же начиналось выполнение какого-либо макроса. Т.е. чтобы какие-то определенные действия происходили в нашей базе данных сразу же при его активизации. Для этого наш макрос нужно переименовать на стандартное имя. В принципе, это имя достаточно хорошо должно быть знакомо тем, кто разбирался с тем, как стартует обычно операционная система Windows. Но имеется в виду Windows 95-98 годов. Переименуем. Для этого щелкнем на нем. И далее напишем таким образом. А теперь закроем эту базу данных. Попробуем его запустить сначала. Для этого щелкнем на кнопке Файл. И здесь у нас есть список последних, открытых нами баз данных, с которыми мы работали. Ну и запустим первую из них, с которой мы только что работали, и в котором установили макрос. Щелкнем. Как мы видим, у нас запустилась наша база данных. Включилась вот эта форма, которая у нас была в нашем макросе, но при этом возникла ошибка. А именно, нашему приложению : не удалось найти макрос 1. В принципе, щелкнем на кнопке ОК, и можем просмотреть, в каком месте нашего макроса произошла ошибка. А именно, она произошла в макросе и в команде Запуск макроса, в которой, одним из условием на выполнении был аргумент запуск макроса с именем макроса 1, 2. В принципе, оно и понятно. В данном конкретном случае что произошло. Дело в том, что мы макрос 1 переименовали, что надо было учесть в наших аргументах. Ну, мы так и сделаем. Щелкнем на кнопке Прервать. Закроем вот эту форму. Откроем вот этот макрос в режиме конструктора и изменим аргумент у запуска макроса. Вместо имени макроса, макрос 1, 2, что в принципе является устаревшим для нас, выполним вот этот точка i. 2. Теперь же сохраним этот макрос и попробуем провести все наши действия заново. А именно, закроем нашу базу данных. Щелкнем на пункте меню Файл. Далее запустим нашу базу данных И, как можно видим, на этот раз все произошло именно по нашему сценарию. Открылась наша база данных, открылась форма и затем открылась таблица. Т.е. наш макрос стартовал, успешно выполняя все отведенные в нем действия. Закроем теперь вот эту таблицу. Закроем и нашу форму. И переименуем нашу таблицу опять. Переименуем его, например, в "Мой макрос". Откроем его в режиме конструктора и теперь для целости нашего макроса, нам опять надо изменить имя, которое мы выполнили, как аргумент для запуска нашего макроса. Возьмем, конечно же, "Мой макрос-2". Щелкнем на кнопке сохранения и закроем конструктор макроса. После этого, вот этот " Мой макрос" готов для использования в нашей базе данных. Он открывает нашу форму и открывает соответствующую таблицу, которая в нем прописана. Закроем и вернемся в стандартный вид нашей базы данных.
212
TeachPro Microsoft Access 2003
8.4. Вызов макроса элементом управления Поле со списком Свяжем теперь выполнение определенных макросов на формах с выпадающим списком, чтобы соответствующие макросы выполнялись при выборе определенной строки в выпадающем списке в Рассмотрим теперь вот этот макрос, который мы создали ранее и попробуем дальнейшие его модернизации. Для этого откроем его в режиме конструктора. Щелкнем на вот этой кнопке Конструктор. Вот можно увидеть, что представляет собой наш макрос, и какие действия будут выполняться при действии этого макроса. Как мы видим, наш макрос состоит из трех действий. Это действие первое, Открыть новую форму. Действие второе, это запуск второго макроса, а именно макроса с именем вот этой двойки. И затем следующая команда, это Открыть таблицу. Теперь же удалим вот эти две строки. Они нам уже не нужны. Для этого выделим их. Далее щелкнем на кнопке удаления. Вот, как мы видим, у нас в нашем макросе осталась всего одна команда Открыть форму, которую мы сейчас заменим на другую команду к элементу управления. Вот эта команда. Щелкнем на нем, чтобы его зафиксировать и можно увидеть, что делает эта команда. А именно, она перемещает фокус ввода на указанное поле элемент управления в нашей форме. Или же в текущей таблице. И далее, у этой команды есть всего лишь один аргумент Имя элемента. Но, к сожалению, мы его не можем задать при помощи построителя выражения. А придется вводить здесь имя элемента управления, который мы хотим, чтобы получил фокус, так сказать, вручную. Для этого, если мы, конечно, не помним его наизусть, нам придется перейти в нашу базу данных, открыть ту форму или таблицу, внутри которых будет действовать наш макрос. В нашем конкретном случае, это форма Города. Щелкнем на кнопке Конструктор, чтобы его открыть в этом режиме. А в качестве элемента управления, на который мы хотим поставить фокус в нашем конкретном случае, нам нужен вот этот элемент поле для ввода Город. Ну и, как можно видеть, у этого объекта имя тоже является аббревиатурой Город. Перейдем обратно в наш макрос и напишем здесь, таким образом, Город. Теперь же, после того, как вот этот элемент Город получит фокус для ввода, мы можем выполнить следующую операцию, а именно нам нужно найти теперь в соответствующей таблице, которая у нас связана с формой городов, но это, конечно же, таблица городов. Ту запись, которая соответствует городу из выпадающего списка. Откроем, например, вот эту форму городов, чтобы восстановить всю картину. Запустим ее. Щелкнем на кнопке выполнения нашей формы. Щелкнем на кнопке Вид. И восстановим эту картину, которую мы хотим, чтобы была на нашей форме. А именно мы хотим, чтобы при открытии нашего выпадающего списка и выбора какого-нибудь города, например, города Благовещенска, вот этот город сразу же автоматически при закрытии этого выпадающего списка был найден в основном нашем поле, поле городов, которое связано с таблицей. Ну и соответствующим образом отобразились бы все покупатели, которые находятся в этом городе. Перейдем опять в режим конструктора. Установим теперь команду, которая нам нужна в качестве второй команды для нашего макроса. Щелкнем на выпадающем списке и найдем команду Найти запись. Она должна быть в нашем списке. Вот она. Щелкнем. Ну и теперь нам нужно задать аргументы для этой команды. Ну и, конечно же, первая из них, это образец поиска. В качестве образца поиска нам нужно выбрать то значение, которое у нас будет вот в этом выпадающем списке.
Глава 8. Элементы управления и макросы.
213
Имя вот этого поля можно найти в соответствующей ячейке. Это у нас, конечно же, простонапросто список. Ну и в этом списке, как мы помним, у нас было несколько колонок. Правда, в нашем конкретном случае, та колонка, которая нам нужна, она является нулевой, т.е. колонкой по умолчанию. А именно само название города. Поэтому название колонки в принципе можно не указывать, а написать просто, как вот в этом месте. Равняется и далее в квадратных скобках имя Список. Так и напишем. Знак равенства, как метод сравнения. Затем квадратные скобки. И список. Вот, в принципе, в таком виде можно использовать этот элемент. Но можно написать и, явно указывая ту колонку, которую мы хотим использовать для сравнения. Но это нужно, конечно же, в том случае, если мы не хотим использовать именно нулевую колонку. Для общности сейчас так и напишем. Точка. Далее опять квадратные скобки, внутри которых напишем, и далее внутри круглых скобок напишем ту колонку, которая нам нужна. Но в нашем конкретном случае это колонка под номером 0. Далее нам нужно согласиться или изменить остальные аргументы. Это совпадения поля целиком или же сначала поля, или же любой части поля. Согласимся сейчас с совпадением на Целиком поле, чтобы мы однозначно позиционировали наши города. Далее учитывать или нет регистр при выборе, область поиска, с учетом формата или нет, и т.д. Можно в принципе в данном конкретном случае, все остальные поля оставить по умолчанию. Сохраним наш макрос. Щелкнем на кнопке сохранения и перейдем на нашу форму. Теперь же нам нужно определиться, в каких случаях будет выполняться наша макро команда. Конечно же, она должна выполняться после того, как мы выберем соответствующую запись вот в этом выпадающем списке. Для этого нам нужно использовать такое явление, как событие, которое наступает при выборе строки из этого выпадающего списка. Для этого мы можем щелкнуть на правую кнопку мыши и выбрать два элемента из всплывающего меню. Это обработка событий. Если мы на нем щелкнем, то попадем в построитель выражения или макрос, в котором мы можем с 0 начать построение соответствующих элементов. Но мы можем поступить и по-другому. Щелкнуть опять на правую кнопку мыши и выбрать пункт Свойства. Далее, переключившись на событие, связанное с этим элементом, выбрать то, что мы хотим именно в этом поле. Здесь, как мы видим, у нас довольно много событий. Это такие, как выполнение какойлибо команды до обновления, после обновления, после внесения изменения, обмена, изменение и т.д. Но в нашем конкретном случае нам нужна вот эта вторая строка. Т.е. мы хотим выполнить нашу макрокоманду после обновления данного поля. Щелкнем теперь на выпадающем списке и здесь, как мы видим, у нас появляются те макросы, которые в данном конкретном случае есть у нас в нашей базе данных. Как мы видим, здесь у нас два макроса. Это мой макрос и мой макрос точка 1. В принципе, они сейчас выполняют абсолютно одно и то же, поскольку наименование Один, у нас стоит на первой строке моего макроса. Поэтому, что мы из этих двух выберем, это, конечно, все равно. Или же, если мы выберем первый пункт процедура, то в этом случае нам понадобится построить наш макрос вручную заново. Сейчас выберем вот этот Мой макрос. Щелкнем. И можем закрыть вот это свойства нашего поля со списком. Посмотрим теперь, как будет работать наша форма. Для этого щелкнем на кнопке Вид, чтобы запустить его в режиме обычной работы. Но, как мы видим, пока у нас все в принципе, вроде, более или менее, нормально. Теперь попробуем выбрать какой-либо город. Например, Берце. И, как мы видим, автоматически появляется город и в соответствующем поле для ввода, и появляются все те покупатели, которые связаны с этим городом, в нем проживают. Например, возьмем город Власюки, в котором, как мы видим, проживает Остап Бендер. Ну, вот, таким образом, мы можем выбирать любые из городов и просматривать всех покупателей, кото-
214
TeachPro Microsoft Access 2003
рые живут в этом городе. И все это происходит автоматически. при изменении города в выпадающем списке. Отметим еще одно обстоятельство. А именно, что мы при помощи вот этого выпадающего списка, можем выбрать любой город, и соответствующим образом будут устанавливаться все остальные поля в этой форме. А если мы будем передвигаться при помощи вот этих кнопок передвижения по записи, как мы видим, будут меняться город и покупатели в этом городе в нашей форме. А вот этот выпадающий список не меняется, т.е. у нас управление происходит только в одну сторону. Т.е. выпадающий список управляет покупателями и таблицей городов, а вот обратное, в данном конкретном случае не верно. Ну и это в принципе может вызвать еще и вот такую коллизию. Если мы сейчас закроем вот эту форму, перейдем, например, в режим конструктора. Потом откроем его опять, то, как мы видим, название города в этом выпадающем списке и в списке городов, отличаются друг от друга. Мы можем, например, избавиться от этого, сделав так, чтобы наш макрос выполнялся и при запуске нашей формы. Попробуем это сделать. Для этого перейдем в конструктор нашей формы. Далее щелкнем дважды на вот этой кнопке, которая находится в левом верхнем углу нашего конструктора Форма, для того чтобы выбрать свойство данной формы и здесь найдем такое событие на вкладке Событие, как событие открытия. Щелкнем на вот этом выпадающем списке. И опять выберем Мой макрос. закроем и попробуем опять его выполнить. Щелкнем на кнопке Вид и, как мы видим, на этот раз, как только мы запустили нашу форму, наш макрос сразу же выполнился и мы получили в нашем выпадающем списке и в нашем поле городов один и тот же город. И соответственно покупатели из этого города. Вот, как мы видим, таким образом мы смогли управлять нашей формой при помощи выпадающего списка и, связанным с ним, макросом. Закроем теперь эту форму. Щелкнем на кнопке сохранения. Сохраним этот макрос тоже и его тоже закроем. И вот мы вернулись обратно в наш стандартный вид нашей базы данных Microsoft Access.
8.5. Вызов макроса кнопкой Условия в макросах. Вывод сообщений Рассмотрим теперь такой популярный элемент управления, который достаточно часто используется на формах, это обычная кнопка, при помощи которой запускается различного рода действия в соответствующих программах. Попробуем это произвести. Для этого рассмотрим вот эту форму, опять форму городов. Щелкнем на ней и выберем конструктор. Вот он появился перед нами. Вот эти два лишних поля. Они нам сейчас не нужны. Выберем их. Щелкнем на кнопке Delete, чтобы убрать их с нашего экрана. А место них введем здесь новое поле, которое будет являться у нас образцом для поиска города из нашей таблицы городов. Для того чтобы ввести поле для ввода, воспользуемся соответствующей кнопкой из панели инструментов. Вот это поле. Щелкнем. Далее нарисуем его на нашей форме, например, вот в этом месте. Ну, конечно же, автоматически появилось соответствующее название для этого поля, соответствующая метка. Мы можем ее удалить или же использовать ее в качестве метки. А сейчас так и сделаем. Перетащим и изменим немножко взаиморасположение этих двух полей. В метке напишем таким образом. Образец для поиска. Немножко подравняем вот, допустим, таким образом. И введем еще и соответствующую кнопку на нашей форме. Кнопку можем опять-таки взять из нашей панели инструментов вот в этом месте. Нарисуем его на нашей форме, и автоматически сразу же появляется вот такое окно, которое запускает соответствующий мастер, для того чтобы мы могли выбрать тип кнопки и все возможные предопределенные действия, которые мы можем связать с ней.
Глава 8. Элементы управления и макросы.
215
Это такие переходы по записям, далее первая запись, последняя запись и т.д. Эти кнопки в принципе по своим действиям повторяют все те возможности, которые у нас обычно появляются в нижней части нашей формы или разного рода таблиц. Их преимуществом является то, что мы можем нарисовать, например, большие красивые кнопки с различного рода надписями и большими рисунками. Вот эти маленькие кнопки в нижней части убрать с нашей формы. И таким образом подругому оформить наш экран. Сейчас, в принципе, всеми этими возможностями пользоваться не будем. Щелкнем на кнопке отмена и вернемся к нашей форме. Теперь же изменим название наших полей. Как мы видим, вот это поле для ввода имеет название поле 14. Конечно же, это название является неудачным полем, поэтому введем какое-либо другое. Для этого здесь щелкнем на правую кнопку мыши. Выберем пункт Свойство и затем выберем вкладку Другие. И здесь находится имя нашего поля. Вместо поля 14, напишем Образец. Закроем. Как мы видим, мы успешно переименовали это поле, и то же самое сделаем с вот этой кнопкой. Ну, в принципе, здесь название на этой кнопке мы можем изменить прямо на нашей форме. Вместо кнопки, можем, например, написать Поиск. Вот, в таком виде мы вполне можем оформить нашу форму. Попробуем ее запустить сейчас. Щелкнем на кнопке Вид. Как мы видим, при запуске нашей формы появилась вот такая грозная надпись, означающая, что у нас значение аргумента Образец не заполнено. Поэтому соответствующий макрос выполняться не может. Щелкнем на кнопке ОК. Прервем выполнение этого макроса и отметим, что, конечно же, все это связано с вот этим выпадающим списком, в котором мы не смогли учесть одно обстоятельство. А именно, что при запуске нашего приложения, поскольку это поле является абсолютно пустым, то, как раз компьютер и натыкается на ошибку. Попробуем это исправить. Для этого вызовем свойство вот этого выпадающего списка. Выберем его. Правая кнопка мыши и свойства. Перейдем теперь на вкладку Данные и введем здесь значение по умолчанию, какой-либо город, который у нас точно есть в нашей базе данных. Например, возьмем такой город, как Москва. Перещелкнем. Далее закроем эти свойства. Сохраним нашу форму. Щелкнем на кнопке сохранения. Закроем его. Попробуем его открыть еще раз. Щелкнем на кнопке конструктора и далее перейдем на обычный режим нашей формы. Щелкнем на кнопке Вид. Как мы видим, у нас форма наша запустилась. Запустилась она, как мы видим, вполне успешно на этот раз. И как мы видим, город, который возник у нас в соответствующих полях по умолчанию, это город Москва. Ну и все покупатели в правой части этой формы, это те покупатели, которые живут в городе Москве. Здесь, как мы видим, их достаточно много. Москва город большой. Ну и в левой части нашего окна появилось новое поле Образец для поиска, в которое мы можем вводить какие-либо буквы и щелкнуть на кнопке Поиск. Правда, пока нажатие на эту кнопку никакой реакции не дает. Дело в том, что, конечно же, мы пока не связали с нажатием на эту кнопку никакого макроса. Попробуем исправить этот недостаток. Поэтому перейдем в режим конструктора. И здесь, первое, что нам нужно сделать, это, конечно же, создать соответствующий макрос, который будет выполняться при нажатии на эту кнопку. Поэтому перейдем на обычное окно базы данных. Откроем далее макрос и рассмотрим вот этот единственный макрос, который пока сейчас у нас есть. Щелкнем на кнопке конструктора, и теперь новый макрос создадим так сказать, как подкоманды внутри вот этого макроса Мой макрос. Конечно же, можно было бы создать его и отдельной цепочкой действия. Но в принципе, можно создавать и внутри вот этого макроса. Попробуем сейчас именно так и сделать. Для этого скопируем вот эти две строчки. Выделим их. Далее правая кнопка мыши, копировать. Далее встанем сюда. Правая кнопка мыши и вставить.
216
TeachPro Microsoft Access 2003
И вот, как мы видим, появились вот эти новые наши команды. Вернее они дублировались. Зададим имя макроса. Теперь это будет, например, цифра 2. Конечно же, в принципе можно вводить в дальнейшем и более разумные имена. Но сейчас пусть будет вот таким образом, 1 и 2. Затем зададим сами команды, которые должны выполняться при этом макросе. Ну, первое, это конечно же, переход к элементу управления город. Здесь у нас все нормально. И затем найти запись и на этот раз образец для поиска у нас будет немножко другой. Не список и соответствующий ему колонку, а поле. Перейдем в нашу форму городов и здесь мы можем посмотреть, как называется наше поле. Это имя Образец. Его мы и должны написать в соответствующем месте, в качестве аргумента. Перейдем в макросы и далее напишем здесь вместо списка образец. Равняется образец. Перещелкнем. Как мы видим, у нас компьютер вполне благосклонно воспринял это имя и далее, вместо совпадения поля целиком, конечно же, это слишком жестокое условие. Выберем другое условие. А именно, совпадение с любой частью поля. И в этом случае будет искаться любой город, который содержит хотя бы где-нибудь ту аббревиатуру, которую мы введем. Ну, конечно же, можно было бы воспользоваться и, например, с начала поля. В этом случае, если мы ввели бы какую-либо букву, то искались бы все города, которые начинались бы с нее, и далее с соответствующей аббревиатуры. Сейчас остановимся на любой части поля. Далее учет регистров. Учитывать не будем большие и маленькие буквы. Область поиска по всей таблице. Ну и все остальные аргументы тоже оставим без изменения. Сохраним этот макрос, щелкнув на кнопке сохранения. Закроем его теперь и далее нам надо его связать с соответствующей кнопкой. Для этого выберем вот эту кнопку. Щелкнем на правую кнопку мыши, далее свойства, и здесь выберем вкладку События, в качестве которого, конечно же, выберем, просто-напросто, нажатие кнопки. Щелкнем на вот этом выпадающем списке и выберем, конечно же, мой макрос точка 2. Так сказать, вторую часть нашего макроса. Закроем это свойство и попробуем запустить нашу форму. Для этого щелкнем на кнопке Вид. Вот появилась наша форма Наше поле со списком, конечно же, работает вполне нормально, выполняя все наши действия. А теперь попробуем выполнить поиск по образцу для поиска. Например, введем какую-либо аббревиатуру, вот такую. Щелкнем на кнопку Поиск и, как мы видим, мы сразу же нашли тот город, в котором есть вот это буквосочетание. В нашем конкретном случае, это город Брест. Можем ввести какой-либо другой, например, напишем просто-напросто Нет, щелкнем на кнопку Поиск и нашли город Воронеж, в котором есть эти две буквы. Если же мы введем какое-либо буквосочетание, которого нет, и щелкнем на кнопку Поиск, то, как мы видим, в этом случае просто-напросто ничего не происходит. Компьютер остается там, где был. Он не находит такого места. Если же мы вообще уберем здесь все и оставим вот такое пустое место и щелкнем на кнопке Поиск, то появляется опять-таки то же самое предупреждение, с которым мы сталкивались недавно. А именно, отсутствие какой-либо записи в соответствующем поле. В результате чего вызывается вот такое окно. В принципе, это не очень хорошо. Лучше бы в этом месте появлялось окно, которое было бы предопределено нами. Сейчас попробуем так и сделать. Щелкнем на кнопке ОК. Прервем выполнение нашей макрокоманды. И закроем нашу форму. Конечно же, макет мы хотим сохранить. Щелкнем на кнопке Да. Откроем наш макрос. Щелкнем на конструкторе и теперь попробуем сделать так, чтобы вот это действие Найти запись выполнялось только в том случае, если соответствующее поле у нас было бы не пустым. Поэтому в колонке Условия, так и напишем. Образец, далее is not нуль, не является пустым. Вот, как только мы щелкнули, компьютер вполне нормально воспринял все наши усилия. Чуть-чуть расширим эту колонку, чтобы мы могли целиком видеть это поле и сохраним наш мак-
Глава 8. Элементы управления и макросы.
217
рос. Щелкнем на кнопке записи. Далее, теперь попробуем открыть нашу форму. Щелкнем на кнопку формы городов дважды, и теперь, если мы щелкнем на кнопке Поиск, то, как мы видим, если у нас здесь ничего не введено, то в этом случае, соответствующая надпись не появляется. Правда, при нажатии вот этой кнопки, фокус ввода перескакивает к вот этому полю, в котором сейчас находится город Москва. В принципе, это тоже не очень хорошо. Ну и, конечно же, хоть какая-то надпись появиться в этом случае должна. Попробуем сейчас выполнить эту нашу задумку. Закроем эту форму. Перейдем обратно в наш макрос и вот это условие Образец из НОТ нуль, скопируем и вставим строкой выше, для того чтобы она выполнялась уже на этапе перехода к элементу управления. А вот в нижней части, конечно, уже можно было оставить и таким образом, но можно написать и три точки. Что будет означать повторение предыдущего условия. Это, конечно же, облегчает нам запись и конструирование нашего макроса. Ну, а далее скопируем вот это условие еще раз, щелкнем на кнопке Ctrl+V. И уберем здесь аббревиатуру not. В этом случае получается условие Образец из нуля, т.е. в случае нулевого значения в поле Образец выполним какую-либо команду. Ну, конечно же, это должно быть появление какого-либо сообщения. Для этого щелкнем на ниспадающем списке и найдем команду Сообщение. Вот она появилась перед нами. Щелкнем. И появились его аргументы, в которых первое, конечно же, что нам необходимо задать, это текст самого сообщения. Напишем здесь так. Сообщение будет выглядеть так. Следует заполнить строку поиска, точка. Далее нужен или нет сигнал. Пусть будет, Да. Далее тип нашего сообщения. Тип сообщения у нас может быть, так сказать, критический, предупреждающий и т.д. Возьмем предупреждающий, со знаком вопроса. Ну и далее нам нужен заголовок для нашего сообщения. В качестве заголовка возьмем Заполнить строку поиска. Для того чтобы не писать это, заново скопируем отсюда, выделим, правая кнопка мыши, копировать, встанем здесь, правая кнопка мыши и вставить. Единственное, изменим первую букву Z с маленькой на большую. И теперь сохраним этот макрос. Щелкнем на кнопке сохранения. Закроем его. Мы уже все в нем сделали, что хотели. Щелкнем на форме городов дважды. Вот он появился перед нами, и если мы сейчас щелкнем на кнопке Поиск, то, как мы видим, появляется наше сообщение Следует заполнить строку поиска, вполне адекватный текст. Закроем. Щелкнем на ОК. Ну и, если мы введем соответствующую какую-либо аббревиатуру, например, напишем Пермь, щелкнем на кнопке Поиск, то сразу же находим соответствующий город. А если мы воспользуемся ниспадающим списком, то тоже находим покупателя из этого города. Т.е. у нас действуют обе возможности поиска. И выборку города по выпадающему списку, и поиск его при помощи какойлибо его части. Закроем эту форму и вернемся в стандартный вид нашей базы данных.
8.6. Переключатели и группы переключателей Рассмотрим такой элемент управления, как переключатель, который достаточно часто встречается на различных окнах в Windows. Рассмотрим для примера форму Города, которую мы создавали ранее. Откроем ее в режиме конструктора. Щелкнем на соответствующую кнопку Конструктор. Вот он, появился перед нами. Чуть-чуть освободим место в нижней части этой формы. Для этого выделим вот эти несколько элементов и сдвинем их чуть выше. Вот теперь у нас в левой нижней части этого окна освободилось место, в котором и расположим новые элементы. Расположим вот этот переключатель.
218
TeachPro Microsoft Access 2003
Щелкнем для этого на нем и разместим его на нашем экране. Например, вот в этом месте. Возьмем еще один переключатель. Расположим чуть пониже и еще один третий переключатель. Ну вот, как мы видим, у нас на экране появилось три новых переключателя. Посмотрим теперь, как они действуют. Для этого щелкнем на кнопке Вид, чтобы переключиться в режим работы формы. Как мы видим, у нас все три переключателя появились на нашей форме. Мы можем щелкнуть и освободить каждый из этих переключателей. Причем, как мы видим, они действуют независимо друг от друга. Каждый из них может быть, как отмечен, так и с него может быть снято выделение, вот эта черная точка. Попробуем теперь в нашу форму ввести какое-либо поле, в котором бы отражался результат действия переключателя на нашей форме. Ну, какой-либо из этих трех. Для этого переключимся обратно в режим конструктора. Поместим ниже еще одно поле. Вот, например, такое. Нарисуем. И далее уберем метку с него. Для этого выделим его. Щелкнем на кнопку Delete. Вот осталось одно чистое поле без метки. А теперь выделим поле. Щелкнем на правую кнопку мыши и выберем его свойства. Перейдем теперь на вкладку Данные и вот в этом месте свойства напишем такую функцию, равняется, и далее эта функция является аналогом функции IF, и позволяет в зависимости от своего значения первого аргумента, получить различного рода значения, записанные во втором и третьем аргументах. Для того чтобы нам легче было вводить, можем воспользоваться, например, построителем выражения. Для этого щелкнем на вот эту точку, но перед этим, конечно же, нам нужно было освободить вот это поле. Щелкнем на трех точках. Далее знак равенства. Теперь найдем нашу функцию. Ее найдем, конечно же, в функциях. Щелкнем на нем дважды, чтобы получить все встроенные функции и здесь есть у нас функция. Вот она. Щелкнем на ней дважды и можем видеть, как должен выглядеть этот синтаксис. В начале должно быть некое выражение, в качестве которого используем один из переключателей. Например, переключатель 17, как мы помним. Так и напишем, переключатель. Ну и дальше, нам нужно написать два выражения, которые будут попеременно появляться в случае, если в этом переключателе 17 стоит галочка или нет стоит. Например, напишем просто-напросто 1 и 0. Щелкнем на кнопке ОК. Закроем это свойство и запустим все это в режиме работы формы. Для этого щелкнем на кнопке Вид, и если мы сейчас включим включатель и выключатель вот этот переключатель 17, в зависимости от этого, в поле для ввода, вот в этом месте появляется 0 или 1. Но все, что мы делаем в других переключателях, никак не отражается на вот этом поле. Только переключатель 17. Переключимся обратно в режим конструктора. Вызовем опять свойство этого поля. Откроем его в режиме построителя выражений и, например, вместо 1 и 0, можем написать просто-напросто Да или Нет. Правда, их надо поставить в кавычки "Да" и вместо 0 напишем в кавычках "Нет". Щелкнем на кнопке ОК. Закроем свойства. И откроем нашу форму в обычном режиме, в режиме его работы. Щелкнем на кнопку Вид. А теперь же, если мы будем ставить или нет флажок, в зависимости от этого, как мы видим, появляется слово Да или слово Нет. Перейдем теперь обратно в режим конструктора. Рассмотрим теперь такой вопрос. В принципе, на самом деле, у переключателя несколько другая функция, чем просто быть выделенным или нет, в независимости друг от друга. На самом деле переключатель является переключателем в зависимой фиксации. Т.е. несколько переключателей обычно объединяются в группы, при которых можно выбрать одно из них. Точка ставится лишь на выбранном переключателе из нескольких в одной группе. Как же это сделать? Ну, для этого сперва уберем все те переключатели, которые мы только что создали. Для этого выделим и щелкнем на кнопку Delete, а затем поставим вот такую рамку группы переключателей. Щелкнем. Нарисуем его на вот этом месте, где мы хотим поставить наши переключатели. Появился сразу же мастер созда-
Глава 8. Элементы управления и макросы.
219
ния новых переключателей. Но мы сейчас пользоваться мастером не будем, а создадим все в ручном режиме. Поэтому щелкнем на кнопку Отмена и далее разместим на них переключатели уже вручную. Для этого выберем вот эту одиночную кнопку Переключатель, расположим ее вот в этом месте. Затем поместим еще один переключатель. Как мы видим, наша группа сразу же приобретает вот такой черный цвет, что говорит о том, что она готова принять новый переключатель. И поместим еще один переключатель. Как мы видим, вот эти три переключателя, они объединились в одну группу. Единственное, что нам сейчас нужно сделать, это исправить текст в свойствах этого поля для ввода, поскольку у нас переключателя 17 уже нет, а есть другие переключатели. Поэтому щелкнем на правую кнопку мыши. Откроем свойства и во вкладке Данные, вот в этом месте, где у нас стоит переключатель 17, напишем переключатель 29. Закроем и попробуем запустить эту форму. Для этого щелкнем на кнопке Вид. И если мы сейчас поставим здесь флажок, то, как мы видим, здесь стоит Да. Но больше мы как бы здесь не щелкали, ничего не меняется. А вот если мы щелкнем в другом месте, как мы видим, автоматически переключатель меняет свой выбор и выбирается только один из этих трех переключателей. Правда, как мы видим, какой бы мы переключатель не выбрали, отображение этого выбора в поле для ввода, которое у нас находится ниже, все время здесь отображается у нас одно слово Да. Слово Нет не появляется. Дело в том, что, если мы сейчас хотим отобразить наш выбор, то нам нужно выбрать не один из переключателей, а прямо группу 27 в нашем конкретном случае. Поэтому переключимся в режим конструктора. И изменим наше свойство. Отметим вот эту группу. Как мы видим, эта группа имеет название Группа 27, так мы и учтем. Откроем теперь поле для ввода. Щелкнем на пункте Свойства. Возьмем построитель выражения, поскольку здесь лучше виден текст, который мы должны ввести и вместо переключателя 29, напишем группа 27. И далее, например, напишем равняется 1. Теперь щелкнем на кнопке ОК. Закроим эти свойства и запустим эту форму. Для этого щелкнем на кнопке Вид. Теперь же, если мы будем переключаться, то можно видеть, что происходит. При выборе первого из переключателей, здесь появляется слово "Да", а при выборе любого другого, слово "Да" меняется на слово "Нет". Т.е. этот индикатор выбран или нет вот этот переключатель, первый из них, самый верхний. Переключаемся обратно в режим конструктора и в принципе, мы можем в качестве индикатора выбрать даже не слово "Да" или "Нет", а просто-напросто значение, какой переключатель у нас выбран, первый, второй или третий. Для этого можем убрать это выражение вообще, оставив только группу 27. Название соответствующего объекта. Щелкнем на кнопку ОК. Закроем это поле, перейдем в режим формы и можно увидеть, что в зависимости от того, где мы ставим точку, в нижнем поле появляется 1,2 или 3, в зависимости от нашего выбора. Перейдем обратно в режим конструктора. Рассмотрим теперь, как можно на практике применять вот эти созданные нами переключатели, поскольку пока они у нас играют роль игрушки. Представим себе, что в зависимости от того, какой из переключателей мы выберем, мы при поиске города в нашем списке городов, будем двигаться или вверх по нашему списку или вниз, или в обоих направлениях. Поэтому напишем здесь вместо группы 27, направление поиска. Группу 27 уберем. Далее напишем Направление поиска. Далее напишем вверх. Далее следующее направление поиска у нас будет вниз. И последнее направление поиска будет просто-напросто везде. Поле, которое у нас находится в нижней части, оно нам уже не нужно. Поэтому щелкнем на кнопку Delete.
220
TeachPro Microsoft Access 2003
Далее выделим вот эту рамку Группы переключателей и изменим ее имя. Для этого щелкнем на правую кнопку мыши, выберем свойства. И затем, выбрав вкладку Другие, вместо ничего незначащего имени группы 27, наберем, например, слово Направление. Закроем. И теперь у нас уже практически все готово, для того чтобы мы его могли использовать. По крайней мере, так сказать, внешний антураж у нас уже есть. Если мы сейчас щелкнем на кнопке Вид, то можно увидеть, что все у нас выглядит так, как и должно быть. У нас есть переключатель вверх - вниз и везде, и все это объединено в группу Направление поиска. Правда, никакого влияния на всю нашу остальную форму, эти переключатели пока не имеют. Поэтому перейдем в режим конструктора. Есть еще одна маленькая проблема, которую в принципе неплохо было бы решить, до того, как мы займемся нашими макросами и связью с нашими переключателями. А именно, что же значение по умолчанию будет у наших переключателей при запуске нашей формы. Поскольку, если мы сейчас закроем нашу форму, предварительно, конечно же, щелкнем на кнопке сохранения. Запустим ее сейчас опять, щелкнув дважды, то, как мы видим, при запуске нашей формы ни один из этих переключателей не выделен. Они все имеют вот такой полу выделенный статус. Это, конечно же, неправильно. Поэтому щелкнем на кнопке Вид,. Переключаясь опять в режим конструктора. Далее выделим опять нашу группу переключателей. Правая кнопка мыши, свойства, и затем во вкладке Данные, там, где у нас есть свойства значения по умолчанию, напишем простонапросто 1, для того чтобы при открытии нашей формы как раз был выделен первый из переключателей. Что означает, что по умолчанию поиск будет идти вверх по нашему списку. Конечно же, мы можем поставить и любую другую цифру из вот этих трех возможностей. Например, можем поставить цифру 2. Тогда будет идти поиск по умолчанию вниз, или же цифру 3, тогда будет выделен по умолчанию поиск везде. Например, поставим 3. Остановимся на этом. Закроем. Сохраним нашу форму. Закроем ее. И если мы сейчас щелкнем дважды, то, как мы видим, по умолчанию, при открытии формы, переключатель стоит на поиске везде. Закроем теперь эту форму и уже нам нужно обратить внимание на макрос, который у нас связан с этой формой. Переключимся в режим макросов. Откроем этот макрос в режиме конструктора. Вот он. И. как мы помним, при поиске, когда мы нажимаем на кнопку Поиск, активизируется вот этот макрос, макрос 2 и выполняются соответствующие команды. Перво-наперво проверяется, не нулевое ли соответствующее поле для ввода. Не пустое ли. И если оно пустое, то выводится некое сообщение о том, что следует заполнить строку. А в другом случае выполняется поиск по соответствующему направлению. Теперь же настало время переделать этот макрос под наши нужды. Переставим теперь вот эти два условия вместе со своими командами, и is not, и is not null. Пусть вначале проверяется нулевое или нет сообщение, и выводится соответствующий текст. Поэтому вот эти две строки скопируем. Выделим. Правая кнопка мыши и Копировать. И вставим их ниже, вот в это место, например, оставив еще одну строку пустой. Далее правая кнопка мыши и вставить. Двойку напишем вот в этом месте, там, где у нас сообщение. Вот эту двойку удалим и вот эти две строки тоже выделим, и щелкнем на кнопку Delete. Теперь единственное, что нам нужно сделать, если у нас сообщение появилось, то далее напишем три точки и в этом случае нам нужно остановить выполнение нашего макроса. Для этого нам нужна команда Остановить макрос. Вот. Здесь у нас есть две команды - Остановить все макросы, или же остановить только наш текущий макрос. Нам нужен именно в данном конкретном случае вот этот, остановить макрос. Далее вот эту проверку из НОТ-0 уже делать совсем необязательно, поэтому удалим эту проверку. Вот эти три точки, конеч-
Глава 8. Элементы управления и макросы.
221
но же, уже тоже лишние. А вот для того, чтобы найти запись, нам нужно выбрать направление записи, для которой, как мы помним, у нас есть переключатель Направление. Поэтому напишем таким образом - Направление, затем Равняется и 1. И если у нас направление равно 1, тогда у нас направление поиска должно быть вверх, как мы помним. Поэтому введем здесь в качестве аргумента Область поиска. Вместо "Все", направление вверх. А теперь же скопируем вот эту строку. Для этого выделим ее. Правая кнопка мыши и Копировать. Далее вставим ее, для этого строка ниже. Выберем пункт Вставить. Далее вставим еще один раз. Выберем. И изменим условия на равняется, 2. А ниже, на равняется, 3. Если у нас направление равно 2, то, как мы помним, область поиска должна быть уже на этот раз не вверх, а вниз. А в третьем случае, направление равняется 3, область поиска должна быть во все стороны. Сохраним теперь это все, щелкнем на кнопке записи. Закроем. И посмотрим, что у нас получилось. Для этого откроем нашу форму, форму города и щелкнем на ней дважды. Если мы сейчас щелкнем на кнопке Поиск, то, конечно же, появляется вот эта предупреждающая надпись, что следует заполнить строку поиска. Понятно, она у нас сейчас пустая. Щелкнем на кнопку ОК. Введем какую-либо букву. Например, букву П. Щелкнем на кнопке Поиск. И находим первый же город, в котором есть город "П" где-либо. Вот, как мы видим, в этом месте. Правда, если мы сейчас щелкнем на кнопку Поиск еще раз, то сколько бы мы не нажимали, мы так и застреваем на вот этом городе. Дальше поиск у нас не идет. Причем, в принципе, мы можем переключаться в любом направлении поиска, вверх-вниз, все равно поиск застревает на этом городе. В чем же дело? Для того чтобы это понять закроем эту форму и откроем наш макрос, вот он Щелкнем на кнопке конструктор макросов. Откроем вот эту команду Найти запись и отметим вот этот аргумент, последний, первое вхождение. Как мы видим, если у нас будет здесь стоять Да, тогда поиск будет осуществляться с первой записи. А для того чтобы поиск начинался, начиная с текущей записи, нам нужно выбрать значение Нет. Так мы сейчас и сделаем. Поменяем, то же самое сделаем во всех остальных случаях поиска записи. Поменяем первое вхождение с Да на Нет. Запишем этот макрос. Закроем его. Откроем нашу форму, форму городов. Щелкнем на ней дважды и опять напишем букву П, и попробуем поискать город с этой буквой. Щелкнем на кнопку Поиск, и как мы видим, вот первый же город, который находится рядом с текущей записью, мы нашли в нашем списке. Если мы сейчас щелкнем на кнопке Поиск дальше, вот находим следующий город и т.д. Как мы видим, мы передвигаемся по нашим записям все дальше и дальше. Если мы сейчас переключимся на поиск вверх, то следующие города опять будут идти те, которые мы уже видели. И поскольку направление поиска у нас сменилось на противоположное. А если мы сейчас щелкнем на Вниз, то теперь поиск будет идти вниз по нашему списку. Т.е. вот таким образом, переключаясь в этой группе переключателей, мы можем задавать направление поиска для нашей формы. Закроем теперь эту форму и вернемся в обычный вид базы данных.
8.7. Флажки и выключатели Рассмотрим теперь такой элемент управления, который достаточно часто встречается на различного рода формах и окнах, как флажки. Для этого рассмотрим вот эту форму города. Щелкнем на кнопке Конструктор. И попробуем по-другому организовать поиск в нашей форме. Как мы видим, сейчас оно у нас организовано при помощи вот этой группы переключателей, при помощи которого мы можем задать направление поиска вверх, вниз или везде. А вместо этого можем вос-
222
TeachPro Microsoft Access 2003
пользоваться флажками. Для этого удалим все то, что мы уже сделали. Выделим вот эту группу переключателей. Щелкнем на кнопку Delete. И, как мы видим, у нас все это исчезло с нашего экрана. А теперь поставим здесь два флажка. Вот этот один, например, вот в этом месте. Напишем здесь вниз, в качестве имени. Для этого щелкнем на нем дважды. Появляются его свойства. Выберем пункт Другие, и вместо имени Флажок 35, напишем просто-напросто Вниз. Далее зададим значение по умолчанию. Перейдем на вкладку Данные. В качестве значения по умолчанию пусть будет цифра 1. Закроем эти свойства. Изменим теперь к нему метку. Выделим ее отдельно. И напишем здесь тоже Вниз, чтобы метка соответствовала самому переключателю. Поставим теперь еще один переключатель. Сделаем здесь то же самое, только единственно, надпись изменим, вызвав свойства, вместо вниз, конечно же, на этот раз нам нужно Вверх. Зададим значение по умолчанию здесь тоже. Напишем опять 1. Закроем. Изменим метку. Вместо Флажок 37, напишем Вверх. И вот эти оба переключателя у нас готовы к работе. Но, единственное, их надо использовать в нашем макросе. Поэтому щелкнем на кнопке Сохранить. А теперь, если мы запустим эту форму, щелкнем на кнопку Вид, то можно увидеть, что на нашей форме, у нас вместо группы переключателей, появилось два флажка. Флажок вниз и флажок вверх. Мы можем снять или поставить флажок. Как мы видим, при появлении нашей формы эти оба флажка имеют статус выделенного. Галочки здесь стоят. Если мы закроем форму и откроем ее заново, как мы видим, галочки будут стоять при появлении нашей формы, в первый раз на нашем экране. Правда, если мы сейчас щелкнем на кнопке Поиск, если в пустом поле появляется предупреждение, что следует заполнить строку поиска. А если мы здесь напишем какую-нибудь букву, то, конечно же, появляется ошибка. Поскольку объекты направления у нас нет. Мы его стерли с нашей формы. Щелкнем на кнопке ОК. Закроем нашу форму и обратимся к нашему макросу. Переключимся на вкладку макросы. Щелкнем на кнопке Конструктор, чтобы вызвать наш макрос и теперь нам надо переделать под наши новые нужды. Под наши флажки. Первое, что нам нужно сделать до тех пор, пока мы не начнем поиск, это проверить, стоит ли галочка хотя бы на одном из наших флажков. Поэтому вставим здесь новые строки. Еще одну новую строку. И в этих двух строках проведем проверку этого события. Чуть-чуть раздвинем вот это поле и напишем таким образом. В качестве условия, будет Вверх, равняется Ложь, End. Одновременно с этим, если Вниз, то уже равняется Ложь и в этом случае у нас должно появляться опять сообщение. Выберем соответствующую макрокоманду, команду сообщения. Далее, в качестве сообщения напишем Выберите направление. В качестве типа выберем предупреждающее, с вопросительным знаком. Ну и в качестве заголовка, напишем Направление. Далее, если, конечно же, вот это у нас так и есть, т.е. ничего не выбрано, в этом случае мы останавливаем опять макрос. Выберем соответствующую команду Остановить макрос. И далее скопируем теперь вот это условие еще несколько раз. Для этого щелкнем на кнопке Ctrl+C и далее вставим еще несколько раз Ctrl+V, Ctrl+V и Ctrl+V. А теперь нам нужно разобраться, в какую сторону у нас будет идти поиск по нашим записям. Для того чтобы у нас поиск происходил вверх, т.к. записано в условии для вот этой команды Найти запись. У нас должна быть истина в флажке Вверх. Далее, в следующей макро команде найти запись у нас область поиска Вниз, поэтому истинная должна быть вниз. Ну и в крайней последней макрокоманде Найти запись, у нас поиск идет по обоим направления. Поэтому вверх и вниз должна быть в этом случае истиной. Т.е. флажки тут стоять. Теперь вставим еще три точки около макрокоманды Остановить макрос. Она, конечно же, должна выполняться одновременно с появлением вот этого сообщения о том, что ни один флажок
Глава 8. Элементы управления и макросы.
223
не выбран. Ну и нам еще нужно вот эту команду к элементу управления сдвинуть чуть ниже. Для этого, вставив здесь новую строку. Скопируем ее. Выделим. Правая кнопка мыши и копировать. Вставим. Правая кнопка мыши и вставить. Далее удалим лишние строки, которые нам уже не нужны. И вот, в таком виде у нас уже макрос в принципе готов для использования. Щелкнем на кнопке сохранения. Закроем этот макрос. Откроем нашу форму, форму городов. И посмотрим, как она работает. Щелкнем на кнопке Поиск. Как мы видим, появилась вот такая надпись Следует заполнить строку поиска. В принципе, оно и понятно. Так оно и должно быть. Введем, например, букву П. Щелкнем на кнопке и, как видим, компьютер сразу же нашел нам город, в котором есть буква П. Если мы щелкнем опять, то мы видим следующую запись, в которой есть эта буква и т.д. Мы можем снять флажок и, например, искать теперь Вниз. Мы можем поставить флажок на Вверх и сменить направление поиска. Или же, если мы снимем флажок с обоих направлений, и щелкнем на кнопку Поиск, то, конечно же, появляется вот такая надпись, что нам нужно направление поиска, иначе поиск становится бессмысленным. Ну вот, таким образом, как мы видим, мы смогли вместо переключателей использовать флажки и тоже организовать задание направление поиска на нашей форме. Закроем теперь эту форму и откроем ее в режиме конструктора. Для этого щелкнем на соответствующую кнопку и рассмотрим еще одну кнопку, которую можно использовать в качестве флажков. А именно, вот такой выключатель, у которого на самом деле есть три состояния. Рассмотрим, как это происходит. Для этого разместим ее на нашей форме. Например, вот в этом месте. Как мы видим, она имеет обычный вид кнопки. Если мы сейчас запустим нашу форму, щелкнув на эту кнопку. Далее, нажимая на эту кнопку, она, как мы видим, поочередно становится приподнятой и нажатой, застревая в этих двух позициях, в отличие от обычной кнопки, которая, как только мы отпускаем мышь, возвращается в свое исходное состояние. Переключимся в режим конструктора. И на нашей форме введем поле, которое будет отображать состояние этой кнопки. Для этого нарисуем здесь поле чуть ниже, далее запомним название этого объекта. Это у нас выключатель. Выключатель 39. В принципе ничего сейчас менять не будем. Название особого значения не имеет. Перейдем в свойства вот этого поля. Щелкнем на правую кнопку мыши. Выберем свойства, и напишем в качестве данных равняется и выключатель 39. Название соответствующего объекта. А теперь закроем. Перейдем в режим работы формы. Щелкнем на кнопке Вид и, нажимая и отпуская эту кнопку, можно видеть, как в соответствующем поле меняется его значение с 0 на -1. Перейдем обратно в режим конструктора и отметим, что эта кнопка может иметь, как мы сказали ранее, три состояния. Для этого щелкнем на правую кнопку мыши, чтобы разрешить использовать в таком качестве. Щелкнем на кнопке Свойства. Ну и здесь есть такое свойство, как тройное состояние, которое сейчас, как мы видим, стоит на Нет. Но, вместо Нет поставим Да, чтобы получить возможность использовать эту кнопку в таком виде. Закроем свойства. Запустим нашу форму. Щелкнем на кнопку Вид. Ну и, как мы видим, сейчас вот эта кнопка приподнята. Если мы нажмем, то она приобретает вот такой нейтральный вид и его значение становится пустым. А если мы сейчас нажмем, то его значение меняется на -1, а кнопка становится вот такой утопленной. И нажатие еще раз возвращает нас к исходному, приподнятому, обычному состоянию и значению. Но еще раз нажатие приобретает вот такой безразличный вид, и значение исчезает с нашего поля. Нажатие еще раз меняется на 1. Как мы видим, вот таким образом эта кнопка имеет три состояния. Закроем нашу форму. Сохраним наше изменение структуры. Щелкнем на кнопке Да. И вернемся в обычный вид нашей базы данных.
224
TeachPro Microsoft Access 2003
8.8. Сохраненные фильтры. Фильтры Вызов их макросами. Фильтр как параметр макроса На примере нашей базы данных рассмотрим применение такого распространенного приема, как применение фильтров на таблицах и формах. Рассмотрим сначала вкратце, что такое фильтр. Для этого рассмотрим какую-либо таблицу, которая у нас есть в нашей базе данных. Например, таблицу Покупатели. Для этого щелкнем дважды на этой таблице, и вот он открылся у нас в обычном режиме, режиме редактирования таблицы. И теперь можем воспользоваться какимлибо фильтром. Например, выделим какуюлибо ячейку в этой таблице и воспользуемся кнопкой фильтр по выделенному. Если мы сейчас щелкнем, то появляется та часть таблицы, в которой в поле Имя стоит именно данное конкретное имя, совпадающее с тем, на котором мы стояли. А именно, в данном конкретном случае, это имя Юлия. Все Юлии из нашей таблицы оказались выделенными. Но, конечно же, мы можем и снять наш фильтр, щелкнув на вот этой кнопке Удалить фильтр. Можем взять какоелибо другое имя. Например, рассмотрим имя Елена и щелкнем на кнопке фильтр по выделенному, и получаем всех Елен из списка наших покупателей. Снимем фильтр. И рассмотрим на этот раз фильтр по какому-либо другому параметру. Например, фильтр по городу. Возьмем вот этот город Свердловск, щелкнем на применение фильтра по выделенному, и получаем всех покупателей из этого города, из города Свердловска. Снимем теперь опять фильтр и вернемся к обычному виду нашей таблицы. Мы можем и по-другому применить фильтр. Например, встанем на городе, щелкнем на правую кнопку мыши и выберем вот такой фильтр, как Исключить выделенное. Если мы сейчас щелкнем, то получаем всех покупателей, которые не живут в России, в том городе, который мы выделили в нашей ячейке. Опять отменим фильтр. Можем в качестве фильтра, например, применить, выделяя все записи в нашей таблице, в которой нет номера телефона. Для этого щелкнем на правую кнопку мыши и выберем фильтр по выделенному. И вот получим все такого рода записи Кроме этого, мы можем щелкнуть на кнопку Изменить фильтр и получить возможность редактировать наш фильтр. При этом мы получаем список всех полей в нашей таблице и в каждой из них мы можем задавать различного рода выражения. Например, равенство по какому-либо из используемых в таблице значений по каждому из полей. Так же, как мы видим, можем воспользоваться выражением is null, или, наоборот, из Нот нуль, выделяя или наоборот, удаляя пустые значения. Кроме этого, вот таким образом созданный фильтр, мы можем в дальнейшем сохранить в качестве запроса в нашей таблице и в дальнейшем использовать его для наших нужд. Закроем сейчас этот фильтр. Щелкнем на вот этом крестике и вернемся в обычный вид нашей таблицы, отключив фильтрацию. Закроем теперь эту нашу таблицу. Но ничего из всех наших изменений сохранять не будем. Щелкнем на кнопке Нет. Перейдем на формы, которые у нас есть в нашей базе данных. И откроем вот эту форму, форму городов. Щелкнем на ней дважды, чтобы увидеть текущий вид нашей формы в режиме ее работы. Как мы видим, сейчас у нас есть выпадающий список, при помощи которого мы можем выбрать различного рода города. При этом сразу же появляется Покупатели. Мы можем вводить какуюлибо аббревиатуру и искать город по ним, например, букву П. И вот мы получили город, в котором есть буква П. Можем щелкнуть на поиск дальше и получать каждый раз город, удовлетворяющий соответствующему условию. А теперь же откроем эту форму в режиме конструктора. Щелкнем на соответствующую кнопку. Далее удалим вот эти элементы. Они нам сейчас уже не нужны. Выделим их. Щелкнем на кнопке Delete. И сейчас попробуем сделать так, чтобы мы по ка-
Глава 8. Элементы управления и макросы.
225
кому-либо критерию могли бы выбрать все записи, им удовлетворяющие. Например, можем ввести какую-либо аббревиатуру и получить просто-напросто отфильтрованную таблицу, содержащую только все те поля, город которых содержит именно эту аббревиатуру. Для начала создадим, так сказать, таблицу, которая бы отфильтровала по полному имени города. Для этого, воспользовавшись этим выпадающий список. Т.е. чтобы из нашей таблицы вводились только те записи, которые совпадают с именем именно конкретного этого города. Причем надо вспомнить, что вот этот выпадающий список, имеет. конечно же, численное значение, поэтому нам нужно совпадение именно по коду. Но, чтобы все это сделать, сейчас нам нужно сформировать новый запрос, поэтому закроем нашу форму. Перед этим, конечно же, его сохраним. Закроем и откроем запросы. Создадим новый запрос, щелкнем на кнопке Создать. Ну, конечно же, воспользуемся конструктором. Щелкнем на кнопке ОК. Далее нам нужна таблица городов. Щелкнем на кнопке Добавить и закроем вот это окно добавления новых таблиц для нашего запроса. Теперь нам в нашей таблице нужно поле Город. Перетащим его в нижнюю часть конструктора запросов. Вот это поле появилось в соответствующей ячейке. Но и дальше, нам нужно задать условие отбора, которое зададим при помощи построителя выражения. Щелкнем для этого на эту кнопку. Далее откроем все формы, которые у нас есть в нашей базе данных. Щелкнем на кнопке Все формы и здесь у нас есть форма Города. Далее здесь у нас есть объект Список наш выпадающий список, в котором нас, конечно же, интересует его значение. Поэтому щелкнем на нем дважды. Вот он появился перед нами. Щелкнем теперь на кнопке ОК, чтобы зафиксировать наше изменение. Мы можем попытаться сейчас сразу же выполнить этот запрос, щелкнуть на кнопке выполнения запроса. Правда, компьютер от нас сразу же потребует ввести значение параметра, который он может подставить вместо условия отбора, поскольку формы городов у нас не открыта в данном конкретном случае, и поэтому это значение компьютеру взять неоткуда. В принципе, мы можем ввести какой-либо город самим. Например, напишем Брест, щелкнем на кнопке ОК. И получаем вот этот наш город. Как мы видим, в нашей таблице оказалось два города Брест с разным кодом, с кодом 1 и с кодом 2. Откроем опять в режиме конструктора наш запрос. Откроем нашу форму, форму городов. И попробуем вот в таком виде опять выполнить наш запрос. Если мы сейчас щелкнем на кнопке выполнения запроса, то, конечно же, получаем тот город, который у нас открыт на нашей форме городов. Если мы здесь выберем какой-либо другой город и выполним наш запрос еще раз, то этот город мы как раз и получим в качестве результата выполнения нашего запроса. Перейдем опять на конструктор запросов. Теперь попробуем использовать этот запрос в нашей форме, в наших макросах. Для этого сохраним его, щелкнем на кнопке сохранения. Назовем этот запрос, например, фильтр, щелкнем на кнопке ОК. Закроем его. Закроем и эту форму городов. И откроем макросы, которые у нас есть на нашей базе данных. Вот этот макрос, Мой макрос, щелкнем на кнопке конструктор и создадим новые строки. Старые конструкции при этом трогать не будем. Они пусть остаются у нас в макросов. Зададим новое имя для нашего макроса. Пусть это будет число 3. Затем зададим макро команду. Макро команда у нас будет условие отбора при помощи фильтра. Поэтому будет Применить фильтр. Вот эта команда. Здесь у нас в качестве аргумента мы должны задать имя фильтра или же условия отбора, который можно непосредственно написать вот в этом поле. Сейчас у нас, поскольку фильтр у нас есть, мы его и напишем в качестве имени. Его имя, конечно же, просто-напросто Фильтр. Мы его только что задавали. Сохраним этот макрос. Щелкнем на кнопке сохранения. Закроем его. Откроем теперь нашу форму, форму горо-
226
TeachPro Microsoft Access 2003
дов. Откроем его в режиме конструктора. Откроем теперь свойство вот этого поля, поля выпадающий список. Щелкнем на правую кнопку мыши и откроем его свойства. И здесь в событиях, после обновления, будет не вызов команды Мой макрос, так сказать, его начальных операторов, а вызов Мой макрос 3, его третей функции. Закроем. Запустим теперь нашу форму. Для этого сохраним предварительно. Щелкнем на кнопке Вид. Вот он появился перед нами. Теперь попробуем выбрать какой-либо город. И, как мы видим, у нас выбралась из нашей таблицы только одна запись. Что видно из вот этого числа. У нас всего лишь одна запись из одной возможности. Точно также будет, если мы выберем другой любой город. Т.е. фильтр исправно действует. Правда, такого рода фильтр не особенно содержателен. Лучше было бы, если мы могли задать какую-либо аббревиатуру и выбрать все города его содержащие. Сейчас, как раз попробуем так и сделать. Поэтому откроем эту форму в режиме конструктора опять. Щелкнем на правую кнопку мыши на нашем выпадающий список, свойства, и зададим опять тот же самый макрос, который выполнялся ранее. А именно, начальный макрос для выполнения с этим выпадающий список. Закроем его. Перейдем сейчас опять в нашу базу данных. Откроем запросы. Откроем наш запрос Фильтр. Откроем его в режиме конструктора. Щелкнем на этой кнопке. И теперь, вместо условия отбора, которое у нас было ранее, напишем несколько другое выражение, гораздо более хитрое. Для этого воспользуемся конструктором, щелкнем на кнопке Построить и напишем таким образом. Впереди напишем Оператор похожести. Далее в кавычках напишем звезда. Затем знак сцепления. И в конце опять знак сцепления и звездочка, что означает любое выражение до и после вот этой аббревиатуры. Но и в качестве основного параметра, из которого мы будем брать наше значение, возьмем не поле Список выпадающий список, а поле Образец. Его можно найти в списке Формы, во всех формах в списке городов. Вот это поле Образец. Здесь сейчас напишем это вручную. Щелкнем на кнопке ОК. И попробуем теперь применить этот фильтр. Сохраним его. Щелкнем на кнопке сохранения. Закроем. Теперь нам нужно его применить при нажатии на вот эту кнопку Поиск, поэтому щелкнем на правую кнопку мыши. Далее свойства. При нажатии кнопки должен, конечно же, вызвать не Мой макрос-2, а Мой макрос -3, третья его функция. Закроем. Теперь сохраним эту форму. И попробуем ее запустить в обычном режиме. Щелкнем на кнопке Вид. Теперь же, введем какой-либо образец для поиска. Например, возьмем одну букву П, щелкнем на кнопке Поиск, и как мы видим, наш фильтр исправно действует. Мы получили все города, в которых есть буква П. Как мы видим, таких городов 22. Мы можем по ним передвигаться взад и вперед. И как мы видим, во всех городах есть где-либо буква П. Так мы и выбрали. Можем выбрать какую-либо другую букву. Например, буква Р и щелкнем на кнопке Поиск. Как мы видим, таких городов у нас 85, в которых есть буква Р. Например, такой город, как Ярославль, Брест, Барнаул и т.д. Во всех этих городах есть буква Р. Например, если зададим МО, поиск, то, как мы видим, городов, в которых есть вот это буквосочетание МО, у нас 10 штук. Мы опять-таки можем просмотреть их все. Теперь же обратим внимание, что на нашей форме остались вот эти два флажка Вниз и Вверх, которые, конечно же, уже являются остатком былых наших действий. Их, конечно же, нужно удалить, и кроме этого, неплохо было бы на нашей форме вставить еще одну кнопку, при помощи которой мы могли бы вывести все записи из нашей таблицы. Т.е. снять режим работы с фильтра. Поэтому переключимся обратно в режим конструктора. Выделим вот эти два флажка при помощи прямоугольного выделения. Щелкнем на кнопке Delete. Они у нас исчезли с нашей фор-
Глава 8. Элементы управления и макросы.
227
мы. Введем теперь новую кнопку. Эта кнопка пусть будет чуть-чуть побольше. Например, такая. Действие мы сейчас выбирать из вот этого мастера не будем. Щелкнем на кнопке Отмена. Название кнопка 44, нас, конечно же, сейчас абсолютно не устраивает. Напишем простонапросто Отмена фильтра. Теперь нам нужно связать с ним определенное действие, которое, конечно же, предварительно нужно создать. Поэтому переключимся в режим макросов. Откроем этот макрос в режиме конструктора. Создадим его новую функцию. Назовем его с номером 4. В качестве макро команды воспользуемся командой Показать все записи. Вот эта макро команда. У нее, как мы видим, никаких аргументов нет. Сохраним теперь этот макрос. Щелкнем на кнопке сохранения. Закроем его. Перейдем обратно на конструктор нашей формы. И эту команду нам нужно применить при нажатии на вот эту кнопку Отмена фильтра. Надо с ним связать. Для этого щелкнем на правую кнопку мыши. Выберем свойства. Далее в событиях нажатия кнопки, вызовем наш макрос. Это у нас Мой макрос с номером 4. Закроем это свойство. Запустим теперь эту форму. Щелкнем на кнопке Вид. Если у нас сейчас стоит какой-либо фильтр, то он и будет отображаться, и будут видны те города, на которых действует этот фильтр. А если мы сейчас щелкнем на кнопке Отмена фильтра, то появляются все возможные записи, которые у нас есть в нашей таблице. А нажатие на кнопке Поиск восстанавливает опять работу с фильтрами. Можем выбрать, например, опять какой-либо другой фильтр. Например, возьмем букву Л, щелкнем на кнопке Поиск. Получаем 73 записей, удовлетворяющие этому критерию. А, нажав, на кнопку Отмена фильтра, то получим все 182 записи, которые есть у нас в нашей таблице без применения фильтра. Закроем теперь эту форму, форму городов. Сохраним, конечно же, макет. Щелкнем на кнопке Да. И попробуем изменить немножко нашу макрокоманду. А именно, сделать так, чтобы фильтрация происходила не по запросу, а непосредственно в макрокоманде. Для этого откроем макросы. Откроем его в режиме конструктора. Сдвинемся вниз к последним нашим командам. И здесь, там, где у нас команда Применить фильтр, воспользуемся не фильтром, который у нас есть в виде запроса, а условием отбора. Вот эту запись фильтра удалим и нам нужно записать в следующей строчке условия отбора. Для того чтобы особенно не гадать, откроем наш запрос, который мы только что создавали. Вот этот запрос Фильтр. Щелкнем на кнопке Конструктора. И затем рассмотрим его в режиме SQL. Для этого щелкнем на правую кнопку мыши. Щелкнем на кнопке SQL и вот можно увидеть, как будет выглядеть этот запрос в этом режиме. Скопируем теперь вот эту внутреннюю часть, которая находится внутри команды. Для этого выделим вот таким образом. Щелкнем на правую кнопку мыши. Копировать. Закроем теперь этот фильтр. Он нам не нужен. Перейдем обратно в наш макрос и вставим все это выражение в условие отбора. Для этого щелкнем на правую кнопку мыши и выберем Вставить. И теперь все у нас должно работать точно так же, как работала раньше с соответствующим запросом, который в принципе, нам уже не нужен и его теоретически можно было бы удалить с нашей базы данных. Сохраним сначала эти макросы. Закроем их. перейдем на наши формы. Откроем форму городов. И попробуем ввести какую-либо букву. Например, введем букву П, щелкнем на кнопке Поиск, и получим 22 города из нашего списка, в которых есть буква П. А если введем еще и букву А, например, и щелкнем на кнопке Поиск, то мы получаем 2 города, в которых есть аббревиатура П и А вместе. Это город Воропаева и город Семипалатинск. Но, а отмена фильтра возвращает нас к полному списку наших городов. Т.е. все работает опять по старому, но без помощи запросов, а при помощи фильтра, который находится внутри макро команды.
228
TeachPro Microsoft Access 2003
8.9. Использование гиперссылок на формах Мы уже сталкивались с гиперссылками, которые являлись гиперссылками типов полей. Но, кроме этого, гиперссылки можно использовать и на формах. Для этого, создадим, например, новую форму. Щелкнем на кнопку Создать. Появляется стандартное окно Новые формы, в котором выберем и создание новой формы при помощи конструктора. Никаких больше других вариантов использовать не будем. Но и источник данных нам сейчас тоже не нужен. Щелкнем на кнопке ОК. Появляется вот такое стандартное окно с абсолютной пока формой, и разместим на этой форме какую-либо текстовую информацию, которая и будет нашей гиперссылкой. Для этого выведем панель инструментов. Для этого щелкнем на вот эту кнопку, для появления этой панели. Вот она появилась перед нами. И выберем пункт Надпись, щелкнем. Разместим ее, например, вот в этом месте и напишем какой-либо текст. Например, напишем просто-напросто Ссылка. Ну и теперь попробуем сделать так, чтобы при нажатии на эту ссылку, происходил переход по какомулибо гипертекстовому адресу. Для этого выделим эту ссылку, щелкнем на правую кнопку мыши и далее, нам нужно выбрать свойство этого объекта. В принципе, в нас есть пункт Гиперссылка, при помощи которого можно было бы задать гиперссылку для этого объекта. Но сейчас, как мы видим, он не активен. Поэтому выберем пункт Свойство. В нем, если мы перейдем на вкладку Макет, есть два пункта. Это адрес гиперссылки и дополнительный адрес, в котором нам и нужно записать информацию о нашей гиперссылке. Первое из этих полей Адрес гиперссылки, является непосредственным адресом того документа, на который мы хотим перейти. А дополнительный адрес представляет собой точное место внутри этого документа, на который мы хотим попасть при его открытии. Конечно же, и то и другое поле мы можем заполнить и вручную, но гораздо проще воспользоваться возможностью непосредственного поиска этой страницы. Для этого щелкнем на вот эту кнопку в виде трех точек. В результате чего появляется вот такое стандартное окно Добавление гиперссылки, в котором нам предлагается выбрать, во-первых, какой документ мы хотим открыть. Но, как мы видим, по умолчанию, мы попали в папку Мои документы и здесь, например, возьмем такой документ, как Термины программы, который представляет собой обычный вордовский документ. Также изменим, например, текст нашей гиперссылки. Напишем, например, Эта ссылка. Далее, введем подсказку, которая будет появляться при наведении мышки на нашу гиперссылку. Пусть это будет текст Моя гиперссылка. ОК. Щелкнем опять на кнопке ОК и закроем свойство этого объекта, после которого, как мы видим, эта надпись на нашей форме, превратилась в гиперссылку. Что видно, во-первых, по характерному подчеркиванию, а также при наведении мыши эта гиперссылка должна превращаться в руку. Попробуем запустить ее. Для этого щелкнем на кнопку Вид. Вот, появилась наша форма уже в режиме работы. Как мы видим, как только мы подошли мышкой к нашей гиперссылке, появилась подсказка, что эта моя гиперссылка, а также указатель мыши превратился вот в такую руку. Если мы сейчас щелкнем, то появляется, во-первых, вот такое окно предупреждение, говорящее нам о том, что гиперссылки теоретически могут представлять собой угрозу для компьютера и хранящихся на нем данных. Но это предупреждение появляется вследствие опасности заражения вирусами, в случае открытия документов из ненадежных источников. Сейчас мы вполне уверены в наших документах, поэтому щелкнем на кнопке Да. И в результате перед нами появляется стандартный документ Word, в котором можно увидеть и просмотреть все его содержание. Кроме этого, мы можем сделать так, чтобы при нажатии на нашу ссылку мы попали уже непосредственно на какой-либо из текстов в
Глава 8. Элементы управления и макросы.
229
этом документе. Например, если мы хотим, чтобы мы сразу попали на эту букву "Б" в нашем документе Термины программы, выделим вот этот текст. Далее пункт меню Вставка и выберем пункт Закладка. Щелкнем. Далее нам нужно выбрать имя для нашей закладки. Пусть это будет опять-таки буква "Б". Щелкнем на кнопке Добавить, и закроем этот документ, предварительно нажав на кнопке сохранения записи. Закроем теперь. Нажмем на этот крестик.. А теперь перейдем в режим конструктора этой формы и попробуем видоизменить эту ссылку. Для этого щелкнем на правую кнопку мыши и на этот раз, как мы видим, у нас пункт Гиперссылка уже активизирован. И мы можем изменить гиперссылку через этот пункт меню. Или же выбрать пункт Свойства и в пункте Адрес гиперссылки и дополнительный адрес, ввести соответствующие изменения. Щелкнем сейчас на правую кнопку мыши и выберем пункт Гиперссылка. И далее изменить гиперссылку. Но, как мы видим, перед нами опять тот же файл Термины программы и далее щелкнем на кнопку Закладка, чтобы непосредственно мы могли попасть на наше конкретное место. Но, правда, здесь имеется некая проблема, связанная с тем, что программа не поддерживает непосредственную вставку закладки в нашей гиперссылке. Поэтому щелкнем на кнопку ОК и введем адрес уже непосредственно нашей закладки вручную. Для этого после названия нашего файла, вставим вот такой знак, в виде решетки и далее имя нашей закладки. В нашем конкретном случае это буква "Б". Щелкнем теперь на кнопку ОК. Запустим нашу форму. Щелкнем на кнопке Вид и попробуем перейти по нашей гиперссылке. Для этого щелкнем. Появляется уже знакомое нам окно с предупреждением. Щелкнем на кнопке Да. И, как мы видим, наш документ термины программы открылся именно на той букве, именно в том месте, где мы и установили нашу закладку. Т.е. все получилось именно так, как мы и задумывали. Закроем теперь этот документ и вот мы попали опять на нашу форму. Перейдем опять в режим конструктора. Изменим теперь эту гиперссылку еще раз. Для этого щелкнем на правую кнопку мыши, далее выберем пункт Гиперссылку и изменить гиперссылку. И на этот раз вместо другого документа, выберем какой-либо объект в базе данных. Щелкнем на вот эту кнопку. Здесь у нас появляются Все объекты, которые у нас есть в нашей базе данных. И в нем мы можем выбрать какое-либо место, куда мы хотим перейти. Например, мы хотим открыть какую-либо таблицу. В этом случае откроем список таблиц. И ту конкретную таблицу, которую мы хотим открыть по этой гиперссылке. Например, откроем таблицу Покупатели. Щелкнем теперь на кнопке ОК. И теперь, запустив нашу форму, и далее, щелкнув на нашу гиперссылку, мы сразу же попадаем на соответствующую таблицу. Закроем ее. Перейдем в режим конструктора. Щелкнем на правую кнопку мыши. Откроем свойства этого объекта, и можно увидеть, что наша информация о таблице, в которую мы хотим попасть, в таблицу Покупатели, появилась в дополнительном адресе. А вот сам адрес гиперссылки, как мы видим, сейчас у нас пустой. Дело в том, что в нашем конкретном случае, наша ссылка ссылается на таблицу внутри нашей же базы данных, текущей. Поэтому, как раз это место и пустое. А если бы мы ссылались на такую-либо таблицу в другой базе данных, тогда здесь был бы адрес именно той базы данных, в которой и находилась бы конкретная эта таблица. Закроем теперь эти свойства и вернемся в стандартный конструктор наших форм. Изменим гиперссылку таким образом, чтобы при нажатии на нее открывалась и запускалась бы какая-либо программа. Для этого щелкнем опять на правую кнопку мыши. Выберем пункт Гиперссылка и изменить гиперссылку. Теперь нас, конечно же, не устраивает ссылка на таблицу в нашей базе данных. Выберем пункт Файл из нашего компьютера.
230
TeachPro Microsoft Access 2003
Найдем, например, такой файл, как калькулятор. Это стандартная программа, которая есть в стандартной поставке. Откроем соответствующую папку, в которой находится эта программа. Для этого перейдем на диск С. Далее директория и внутри нее найдем папку и в нем нашу программу. Вот она появилась перед нами. Щелкнем теперь на кнопке ОК, для того чтобы ее зафиксировать. Но перед этим, изменим текст нашей гиперссылки и напишем здесь просто-напросто Калькулятор. Щелкнем на кнопку ОК. Запустим теперь нашу форму. Щелкнем на кнопке Вид. Вот появилась наша форма и в нем надпись калькулятор. Щелкнем на ней. Опять появилось предупреждение о том, что гиперссылки могут представлять собой угрозу. Но мы в этой программе калькулятора, конечно же, мы абсолютно уверены, поэтому щелкнем на кнопке Да. После того, как преодолим еще одно препятствие в виде еще одного подтверждения, что этот файл не содержит никаких вирусов. Щелкнем на кнопке ОК. И после этого проявляется вот этот наш стандартный калькулятор. В котором можем предпринять какие-либо нужные нам действия, затем щелкнем на крестике, закрыв, и вернемся в нашу базу данных. Отметим еще одно обстоятельство, что все эти предупреждения, конечно же, связано с системой безопасности, которая установлена на нашем компьютере. При ужесточении или ослабления этой системы безопасности, мы будет получать большего предупреждения или наоборот, предупреждения не будет вообще, если мы установить достаточно низкий уровень безопасности. Но, конечно же, снимать такого рода вопросы все-таки не рекомендуется. А поскольку, особенно если мы скачиваем какие-либо файлы, особенно исполняемые из Интернета, и достаточно много работаем с ними, то вероятность попадания нежелательных действий в каких-либо из этих файлов, тем не менее, сохраняется. Поэтому, лучше, чтобы такого рода предупреждения все-таки периодически появлялись, пока мы не вполне уверены в этих источниках, файлов.
Глава 9. Отчеты.
231
Глава 9. Отчеты 9.1. Печать таблиц и форм Сохранение формы как отчета На этом уроке мы изучим, как печатать таблицы и формы, а так же, как сохранить формы в виде отчетов. Следующие рассматриваемые нами объекты - Отчеты. Отчетом называется, фактически, всё, что печатается из базы данных. Что касается конкретно Access, то, в отличие от других систем, Access позволяет печатать любой объект. Например, если у нас имеется таблица, в данном случае это таблица Клиенты, то мы можем открыть ее для предварительного просмотра и установить нужные Параметры страницы. Мы увидим таблицу в том виде, в котором она представлена на экране. Кроме того, будут автоматически добавлены кое-какие колонтитулы, а именно, Номер страницы, Название таблицы (в данном случае - это Клиенты и Дата). Вернемся к режиму таблицы. Допустим, что мы хотим зафиксировать столбцы: Код клиента и Название. Делается это следующим образом. Формат/Закрепить столбцы. Теперь, вызовем на предварительный просмотр еще раз. Вот - закрепленные нами столбцы. Как вы видите, столбцы здесь присутствуют на всех страницах. Именно поэтому, порядок печати у нас сейчас, так называемый, Z-образный. То есть, первый горизонтальный ряд листов, сколько бы их не было, потом второй и т. д. По умолчанию, нам предлагается строчка заголовков с именем полей или, соответственно, с подписями. Вот она. Закроем. Не будем сохранять изменения. То же самое касается и печати запросов. Например, у нас имеется запрос - qFirst. Вызовем его на предварительный просмотр. Здесь все выполняется абсолютно таким же образом, как и в случае с таблицами. Кроме того, печатать можно и форму. Сначала сделаем автоформу на основе нашей таблицы SPRUL и посмотрим в первичном просмотре. Вот наша таблица, наша форма. Установим нужные нам параметры страницы... Вызовем на предварительный просмотр. Формы размещаются на одном листе, насколько могут поместиться. Там, где место на листе кончается, форма обрезается, и часть ее переносится на следующую страницу. Если нам нужно, чтобы, например, печаталось по одной форме на каждом листе, то, разумеется, мы можем в режиме конструктора формы использовать инструмент Разрыв страницы. Сначала вызовем эту форму в режиме конструктора. Вот - этот элемент. Мы увидим, что печататься будет по одной форме на каждой странице. Печать формы - это достаточно редко используемый способ. Дело в том, что, как вы видите, форма по умолчанию серая. Это, во-первых, уменьшает интенсивность излучения монитора, в отличие от формы белого цвета. Во-вторых, просто легче воспринимается глазом. При печатании формы мы можем задать нумерацию страниц и все остальное. Для этого служить такая область формы, как колонтитул. Вот, Верхний колонтитул, Нижний колонтитул, где мы можем размещать информацию, которую хотим видеть на каждой странице при печати. Обращение с колонтитулами и способы размещения там полезной информации, мы разберем на примере отчетов. А, если это необходимо, то это можно использовать и в формах. Закроем пока форму и не будем сохранять ее макет. Создадим заново такую же автоформу и сохраним. Сохраним ее под предложенным именем. Вот, возникла наша форма. Мы можем превратить ее в отчет. Для этого нажимаем на правую кнопку мыши, выбираем команду Сохранить как... и сохраняем, как Отчет. Имя объекта будет - Копия SPRUL, а вид - Отчет. Перейдем к отчетам. В разделе отчеты присутствует только что созданный нами отчет с названием Копия SPRUL. Откроем.
232
TeachPro Microsoft Access 2003
Здесь мы увидим, разумеется, ту же картину, которую видели при печатании формы. В данном случае отсутствуют какие-то нюансы. Но, в отличие от прежнего случая, это теперь не форма, а Отчет. Мы можем вызвать его в режиме конструктора. Здесь ничего нового нет. Как вы видите, здесь точно так же имеются Список полей источника данных, Панель элементов и т. д. Те же линейки, так же отображается зона Область данных. Но отчет от формы, тем не менее, чем то отличается. На следующем уроке мы с вами разберемся с конструктором отчетов.
9.2. Конструктор отчетов. Зоны отчета На этом уроке мы начинаем наше знакомство с конструктором отчетов. Для постоянного сохранения параметров страницы для новых печатных объектов необходимо открыть меню Сервис/Параметры/Общие. Вот здесь задаются соответствующие параметры. Закроем это окно. Как вы знаете, приблизительно то же самое можно сделать и с помощью команды Файл/Параметры страницы. Давайте, напишем здесь 20, 20, 20 и 20. Дело в том, что Access, почему-то, очень часто запоминает это в пункте меню Сервис/Параметры уже как 20 сантиметров, а не 20 миллиметров. Поэтому не стоит удивляться тому, что иногда границы печатного поля не сохраняются, тем более, что это очень часто происходит при копировании отчетов. Закроем. Давайте теперь, попробуем создать отчет не с помощью копирования, как мы это сделали на предыдущем уроке, а, практически, с нуля. Давайте, сначала удалим наш отчет. Правая кнопка \ Удалить. Подтверждаем. Левой кнопкой мыши нажимаем на Создать. Конструктор у нас уже выбран. Здесь мы должны выбрать источник данных. Как и форма, отчет может не иметь источника данных. Если у него нет источника, то есть, не существует никакого соответствующего счетчика записи, то такой отчет может быть отпечатан, но, как правило, в единственном экземпляре, поскольку Access не имеет никаких средств для указания того, сколько же одинаковых листов должно быть напечатано в данной ситуации. Например, это может быть самый обыкновенный документ, бланк или письмо. Выберем в качестве источника нашу таблицу РЕ. Нажимаем на кнопку ОК. Как видите, запускается конструктор, появляется Панель элементов, поля нашего источника данных. А наш отчет представляет собой пустой лист бумаги. Но, несмотря на это, мы уже можем посмотреть, как выглядит наш отчет. Разумеется, что это - пустые листы бумаги. Опять вызовем в режиме конструктора. Давайте, еще раз посмотрим, какие у нас имеются параметры для нашей страницы. Меню Файл/Параметры страницы. Как видите, Левая - 20 миллиметров, правая - то же. Вот здесь - Левая и Правая. Это означает, что мы можем увеличить ширину нашего отчета, где-то, до 16 сантиметров и даже немножко больше (разумеется, если мы планируем печатать наш отчет на листе формата А4). Давайте, поместим на нашем отчете, поле FAM, что соответствует фамилии. Метку удалим, переместим наше поле сюда. Делается это с помощью левой кнопки мыши. Я поместил в Область данных. Помещаем так же поле IM. Удалим метку. И - поле ОТ. Посмотрим, как все у нас выглядит. У нас - слишком мало записей на одной странице. Выясним, почему. Опять вызовем в режиме конструктора. Дело в том, что Область данных у нас имеет довольно большую высоту по сравнению с той высотой, которая нам нужна. Поэтому мы можем немного обжать, передвинуть все три поля налево и еще раз обжать. Посмотрим, как все выглядит сейчас. Думаю, что уже не плохо. Чтобы понять, что представляют собой данные на отчете, мы можем воспользоваться метками. Это - уже знакомый нам эле-
Глава 9. Отчеты.
233
мент... Фамилия, Имя и, наконец, Отчество. Обожмем немножко... Давайте, выровняем все три метки, например, по нижнему краю. Для этого выбираем все три метки с помощью мыши и клавиши SHIFT. Нажимаем на правую кнопку мыши, команда Выровнять По нижнему краю. Посмотрим на результат теперь. Вот - Фамилия, Имя, Отчество. Мы знаем, что это у нас - метки, но, чтобы было все намного понятнее, мы можем разместить вот здесь линию. Сделаем это. Опять вызовем в режиме конструктора... Вот такую линию. Берем соответствующий элемент с Панели инструментов. Посмотрим теперь. Вот. Вернёмся в режим конструктора. Мы можем добавить так же заголовок отчета. Делается это следующим образом. Выбираем пункт меню Вид, команда Заголовок/Примечание отчета. Вы видите Заголовок отчета и Примечание отчета. Нижний колонтитул нам пока не нужен, обожмем до нуля. В область Заголовок отчета поместим еще одну надпись. Например, Список товарищей. Поскольку это является Заголовком отчета, то увеличим шрифт, например, до 16 пунктов. Поместим его в центр и посмотрим на результат. Список товарищей, Фамилия, Имя, Отчество. Посмотрим на следующую страницу. Как видите, надписи Список товарищей здесь нет. Так и должно быть, потому что Список товарищей находится в области Заголовка отчета. Если мы хотим, чтобы наш отчет имел в качестве первого листа что-то вроде титульного, то мы можем воспользоваться элементом Раздел страницы на Панели управления. Увеличим высоту Заголовка отчета и поместим этот элемент, например, сюда. Посмотрим на результат. Как видите, на первой странице имеется только одна надпись Список товарищей. Здесь все выглядит как-то не очень красиво. Мы можем, к примеру, увеличить шрифт и переместить нашу надпись. Начиная со второй страницы, уже располагаются данные. Опять вызовем режим конструктора. Давайте, удалим этот элемент Разрыв страницы с помощью клавиши Delete. Обожмем опять Заголовок отчета, переместим все эти элементы выше и снова посмотрим на результат. По-прежнему у нас имеется Список товарищей, а дальше идут данные. Вернёмся в режим конструктора. Пока что наш отчет выглядит довольно скучно, но он может иметь так же и табличный вид, о чём мы поговорим на следующем уроке.
9.3. Отчет табличного вида. Смена источника записей Нумерация записей и итоговые функции На этом уроке мы продолжим наше знакомство с конструктором отчетов. Достаточно часто отчет должен представлять собой таблицу. К сожалению, создание разрозненных отчетов достаточно тяжелая операция для Access. В подобных ситуациях мы можем поступить следующим образом. Давайте, выберем с Панели элементов Прямоугольник и поместим его, например, вот сюда. Как видите, наш прямоугольник является не прозрачным, поэтому наших полей не видно. Изменим соответствующее свойство прямоугольника. Правая кнопка мыши, команда Свойства, Макет, Тип фона и Прозрачный. Закроем. Вы видите, что теперь все нормально. Давайте, поместим, например, вот сюда еще и маленькую линию (рисуем) и посмотрим на результат. Все понятно. Вызовем в режиме конструктора. Такую же линию можно поставить и сюда, если у нас много разделов и тому подобное. Но мы пока ограничимся одной линией. Понятно, что мы захотим получить такой же вид и для Верхнего колонтитула. Чтобы удалить эту линию, нажимаем на клавишу Delete. Копируем наш прямоугольник, из контекстного меню выбираем команду Копировать. Нажимаем на правую кнопку
234
TeachPro Microsoft Access 2003
мыши, но уже в области Верхнего колонтитула и - Вставить. Давайте, скопируем и эту линию таким же образом. Контекстное меню и Копировать. Контекстное меню мыши и Вставить. Переместим куда-нибудь вот сюда. Выровняем два прямоугольника. Правая кнопка мыши \ Выровнять. Давайте, выровняем По левому краю. То же самое и для этих линий, для метки этого поля и для этих двух элементов. Посмотрим, что получилось. Как вы видите, здесь имеются пустые пространства. Давайте, решим и эту проблему. Опять вызовем режим конструктора. Присутствие этих пустых пространств обусловлено тем, что высота области данных превосходит высоту нашего прямоугольника. Давайте, переместим наш прямоугольник вверх вместе со всеми элементами и ещё обожмём Область данных. Посмотрим на результат. Как видите, имеем неплохое подобие таблицы. Вообщето, рисование таких подробных табличных документов, еще раз повторяю, это самая тяжелая операция в Access. Гораздо легче это делать в пакете Works, где отчет строится, как электронная таблица, то есть, из ячеек, вокруг некоторых из них просто проводятся "разграфки". На следующем уроке мы познакомимся со сменой источников данных. На этом уроке мы узнаем, как изменить источник данных для отчетов, а также познакомимся с нумерацией записей. Для начала заметим, что в источнике данных для нашего отчета имеется поле TABNO. Это - числовое поле. Давайте, поместим это поле, например, здесь. Удалим метку, а потом посмотрим, как всё у нас работает. Вот, вы видите, что здесь все отображается вполне нормально, даже если мы имеем дело с пятизначными числами. Вызовем опять в режиме конструктора. Давайте, обожмем это поле, например, вот до такого размера и снова перейдём в режим просмотра. Как видите, после того, как начинаются четырехзначные числа, всё становится не вполне понятным. Дело в том, что в таких случаях числа отображаются в экспоненциальном виде, и эта проблема возникает не только в данной версии Access, но и во всех предыдущих. Поэтому нам ничего не остается, как следить за отображением числовых величин в режиме просмотра. Поскольку, если мы попробуем отпечатать наш отчет на принтере, то мы увидим именно такой результат, а не тот, который мы хотели. Вернемся к режиму конструктора. Это поле удалим. Что касается источника данных, то мы можем поступить следующим образом. Как и в случае с формами, мы имеем вот такой квадратик, с помощью которого можно выбрать весь отчет. Если мы нажмем на правую кнопку мыши и выберем Свойства, то увидим Свойства именно Отчета. Вот это диалоговое окно свойств Отчета. В качестве Источника записей на вкладке Данные, мы видим РЕ, то есть, источником данных для нашего отчета является таблица РЕ. Мы можем выбрать, например, таблицу SPRUL. Как вы видите, здесь сразу же отображаются все поля таблицы SPRUL, и среди них нет таких полей, как FAM, IM и ОТ, то есть, тех, которые присутствуют в нашем отчете. Если мы попробуем посмотреть отчет в такой ситуации, то Access будет понимать эти поля, как параметры, поскольку, повторяю еще раз, поля с такими именами в источнике данных отсутствуют. Поэтому опять выберем РЕ и закроем это диалоговое окно. Мы можем так же ввести нумерацию наших записей, используя для этого самое обыкновенное поле. Например, вот такое. Давайте, сначала увеличим ширину нашего прямоугольника. Поместим это поле, например, вот сюда. Удалим метку. Переместим вверх. Это выполняется с помощью стрелок, а для более тонкого перемещения, нажимаем на клавишу Ctrl и опять пользуемся теми стрелками. Поскольку это поле является у нас абсолютно свободным, то мы можем написать сюда различные выражения. Например, напишем - Равен Единица и посмотрим, что у нас получилось. Как вы видите, повсюду у нас идут единицы.
Глава 9. Отчеты.
235
Вернемся к конструктору. Чтобы наше поле действительно отображало нумерацию, поступим следующим образом. Контекстное меню, команда Свойства. Как видите, на вкладке Данные у нас имеется возможность выбора типа Суммы с накоплением. В данный момент мы имеем Отсутствует. Мы можем выбрать Для группы, Для всего. В данном случае нам всё равно, что выбрать, потому что у нас нет групп. Ну, давайте, выберем Для всего. Теперь посмотрим, что получилось. Как видите, у нас идет нормальная нумерация всех записей. Вернёмся к конструктору. У нас имеется также область Примечание отчёта, в которую мы пока ничего не поместили. Данная область может использоваться для подписи, для некоторых итоговых результатов и т. д. Мы будем использовать эту область именно для некоторых итоговых результатов. Для представления некоторых итогов мы будем использовать область Примечание отчета. Разместим здесь вот такое поле, нажмём на правую кнопку мыши, команда Копировать. Правая кнопка - Вставить. Ещё раз - правая кнопка и Вставить...Я разместил эти три поля для того, чтобы отображать минимальный, максимальный, а так же средний возраст лиц, которые присутствуют в нашем отчёте. Это поле является свободным, поэтому мы можем написать здесь любое выражение. Напишем следующее... Это - функция Access NOW, которая возвращает текущую дату... MAX - это функция Access, которая возвращает максимальное значение данного поля, а именно, поля - DROD. Такое поле у нас присутствует и содержит даты рождения наших товарищей. Здесь мы пишем следующее - NOW, уже MIN, то есть, минимальное значение того же поля. А так же - AVERAGE, то есть, среднее значение. Давайте, посмотрим, что у нас получилось. Разумеется, мы должны перейти к последней странице. Здесь - не всё очень-то понятно, поэтому мы должны как-то улучшить представление наших итогов. Перейдем в режим конструктора. Давайте, сначала напишем, что мы хотим здесь увидеть. Здесь напишем Минимальный, здесь - Максимальный, а здесь - Средний... Поместим ещё одну метку с надписью Возраст. Ещё мы можем воспользоваться функцией Access YEAR, которая превращает значения в года. Посмотрим на результат. Как видите, Минимальный возраст 8 лет, Максимальный - 90, а Средний - 48. Закроем, перейдём в режим конструктора. Давайте, сохраним наш отчёт. На следующем уроке мы познакомимся с сортировкой и группировкой в отчёта.
9.4. Сортировка и группировка отчета Тема нашего сегодняшнего урока - это сортировки и группировка отчета. Сожмем Заголовок отчета до нуля и посмотрим, что получилось. Как вы видите, все страницы у нас выглядят одинаково. В нашем источнике данных имеется поле CITY. Это поле содержит информацию о городе, в котором живут вот эти товарищи, фамилии, имена и отчества которых уже имеются в нашем отчете. Добавим и это поле в Область данных. Для этого сначала сожмем уже существующие поля, добавим новое поле CITY. Удалим метку. Тонкое перемещение здесь производится с помощью клавиш CTRL и соответствующей стрелки налево, направо, вверх или вниз. Вот таким образом. Посмотрим, что у нас получилось уже сейчас. Например, Абрамова Наталья Викторовна живет в Московской области, Аверочкина Марина Ефимовна - в городе Москва и т. д. Снова закроем. Вполне естественно, что мы хотим, чтобы записи в нашем отчете появлялись в более упорядоченном виде. В частности, мы хотим, чтобы жители одного города следовали друг за другом. Для этого нам может пригодиться такая возможность Access, как Сортировка и группировка. Выбираем меню Вид и находим эту команду. Вот команда Сортировка и группировка. Соответствующая кнопка присутствует и на панели инструментов. Вот она. Перед нами открывается диалоговое окно, где нам предлагается вы-
236
TeachPro Microsoft Access 2003
брать Поле или выражение. Выберем поле CITY. Вот оно. Здесь написано, что Порядок сортировки будет выполняться По возрастанию. Мы можем выбрать По убыванию, но, давайте, оставим так, как есть. Заголовок группы. Выберем Да, чтобы каждая группа имела свой заголовок. Вот, вы видите, Заголовок группы. Закроем это диалоговое окно и посмотрим, что у нас получилось. Сначала идут те товарищи, у которых место жительство отсутствует в нашем списке, а дальше уже всё следует в алфавитном порядке. В этом не трудно убедиться. Область Заголовок группы CITY у нас пуста. Было бы логично поместить сюда информацию о том городе, жители которого следуют за этим заголовком, то есть, ту информацию, которую содержит вот это поле. Копируем. Правая кнопка мыши, команда Копировать. Переходим вот сюда и опять правая кнопка мыши и Вставить. Поскольку это Заголовок, то имеет смысл немного увеличить Шрифт. Посмотрим на результат. Здесь попрежнему пусто, здесь тоже, а дальше понятно: сначала - город, потом - всё остальное. Нажимаем на кнопку Закрыть. Кроме того, мы можем ещё и отсортировать наши записи и внутри группы. Для этого, опять-таки, вызовем команду Сортировка и группировка, но на этот раз уже - с помощью вот этой кнопки на панели инструментов. Выбираем сортировку, например, По фамилии. Порядок сортировки - По возрастанию. Заголовок группы нам не нужен, поэтому здесь ничего не изменяем. Закроем это диалоговое окно и посмотрим, что получилось. Здесь записей не очень много, поэтому всё выглядит как-то не очень наглядно. Но получилось ли всё так, как мы хотели. Перейдём на другую страницу. Ну, понятно, что здесь записи идут именно в алфавитном порядке. Пока закроем. Группировка может производиться и по другим критериям. Например, мы можем группировать внутри группы сначала мужчин, потом женщин или наоборот. Для этого сделаем следующее. Ну, понятно, что мы должны использовать при этом поле Отчество. Если отчество заканчивается буквой А, то мы тут имеем женщину, а если буквой Ч, то это - мужчина. Здесь все предельно ясно. Итак, снова откроем диалоговое окно Сортировка и группировка и выберем вот эту строку. Нажмем на клавишу Insert и здесь добавим вот такое выражение: right, то есть, берется символ справа. Из поля ОТ. В количестве Один. Здесь предлагается По возрастанию, но мы можем выбрать и По убыванию. Посмотрим, что у нас получилось. Сначала - женщины, потом - мужчины. Посмотрим на более крупную таблицу, хотя и так видно. Наталья, Михаил, Анатолий и т. д. Закроем. Как я уже отметил, в том же диалоговом окне (вот здесь) мы можем также выбрать Порядок сортировки По убыванию. Иначе говоря, если в предыдущем случае мы сначала имели имена женщин, то теперь уже будем иметь имена мужчин. Убедимся в этом. Александр, а только потом уже - Вера и Наталья. Закроем. Опять откроем это диалоговое окно. Мы можем очень просто изменить порядок группирования. Для этого просто перетащим это поле вверх. Таким образом, сначала группировка будет идти по полу (а именно, сначала - мужчины) и только потом - по городу. То есть, сначала мы увидим всех мужчин, потом - всех женщин. Убедимся в этом. Здесь идут мужчины, а потом - женщины. Еще раз посмотрим на наш отчет. Как мы видим, нумерация записи у нас идет, как бы, в "сквозную". То есть, в новых группах нумерация идет По-очереди и номер следует за номером, который присутствует в предыдущей группе. Было бы вполне логичным, если бы нумерация шла только внутри группы. Для этого изменим соответствующие Свойства данного поля. Выберем Для группы, поскольку сейчас уже это имеет значение. Откроем. Вы видите, что нумерация уже идет по группам. Закроем. Снова откроем диалоговое окно Сортировка и группировка. Восстановим предыдущий порядок. Мы можем просто удалить некоторые параметры сортировки. Для этого, если соответствующий параметр уже выбран, мы попросту нажимаем на клавишу
Глава 9. Отчеты.
237
Delete. Вы видите предупреждение о том, что если данное поле или выражение, которое мы собираемся удалить, имеет связанный раздел, а именно, заголовок или примечание, которое содержит элементы управления, то они будут удалены вместе с этим разделом. Это для нас не является проблемой, поэтому мы нажимаем на кнопку Да. Что касается других параметров сортировки, то здесь мы можем выбрать, например, По первым знакам. Таким образом, сортировка будет выполняться только в алфавитном порядке по первому знаку, а - не по всему выражению так, если бы здесь было выбрано По полному значению. Как вы помните, у нас здесь имеются поля, которые ответственны за предоставление некоторых данных, а именно, максимального, минимального и среднего возраста лиц, которые присутствуют в наших записях. Мы можем вывести такую же информацию, но уже для группы, а не для всего отчета. Для этого мы должны поместить те же поля в соответствующий раздел - Примечание группы CITY,потому что мы хотим узнать данные для жителей одного города. Для этого снова откроем диалоговое окно Сортировка и группировка и для поля CITY выберем Примечание группы. И - Да. Примечание группы сразу же появилось. Выберем все три поля, из контекстного меню выберем команду Копировать и - Вставить, например, вот сюда. Перетащим в соответствующее место. Для всей группы (если эта информация, конечно, не нужна) мы можем просто удалить эту информацию, то есть, вот эти три поля. Посмотрим, что получилось... Как видите, данные предоставляются после каждой группы, Если в отчете в данной группе присутствует только одна запись, то понятно, что все эти выражения возвращают одинаковые значения. Закроем. Мы уже несколько раз пользовались элементом управления Раздел страницы. Воспользуемся им еще раз. Если мы хотим, чтобы наши группы размещались на отдельных страницах, то в Примечании группы добавим именно такой элемент. Давайте, посмотрим на результат. Все предельно понятно. На следующем уроке мы познакомимся с нумерацией страниц.
9.5. Нумерация страниц. Развернутые надписи Итак, нам предстоит познакомиться с нумерацией страниц. Поскольку наш отчет многостраничный, разумеется, в нем должна присутствовать нумерация страниц. Но сначала, давайте, поменяем внешний вид нашего отчета, а именно, переместим вот эти метки, имеющиеся у нас тут. С помощью левой кнопки мыши и клавиши Shift выберем все присутствующие здесь объекты и просто переместим их вот сюда. Выровняем по левому краю... Для нумерации у нас имеется специальный пункт в меню Вставка/Номера страниц. Например, выберем Верхний колонтитул, а здесь так и оставим, Выравнивание По центру. Нажимаем на кнопку ОК. Посмотрим, как всё это выглядит в режиме просмотра. Страница первая, вторая, третья, четвертая и т. д. Закроем. Давайте, внимательно рассмотрим, что у нас было добавлено. Это - обычное поле с соответствующим выражением. Это означает, что будет напечатано слово Страница, а потом - вот это выражение Page, которое и возвращает значение номера данной страницы. Если же наш отчет имеет титульный лист, то вполне разумно, чтобы первая страница (то есть, титульный лист) тоже была бы пронумерована. Для этого сделаем следующее. Сначала удалим это поле. Снова выбираем меню Вставка \ Номера страниц и сбрасываем вот этот флажок, то есть, не будем Отображать номер на первой странице. Сначала убедимся в том, что все тут - в норме. Вот, здесь - не имеется, а здесь - уже есть. Закроем. Рассмотрим выражение - if Page больше чем единица (это означает, что, если страница - не первая, а - вторая, третья и т. д.). Если теперь мы хотим, чтобы нумерация начиналась не с номера 2, а - с номера 1,то есть, мы, фактически, одновре-
238
TeachPro Microsoft Access 2003
менно хотим, чтобы нумерация начиналась со второй физической страницы, то в этом случае мы просто вычитаем из выражения Page - единицу. Посмотрим на результат. Страница первая, вторая, третья и т. д. Теперь рассмотрим другие варианты. Снова удалим. Меню Вставка/Номера страниц. Выберем другой Формат, Страница N из M. Опять же выберем Верхний колонтитул, но уже - Выравнивание Снаружи. Давайте, снова установим этот флажок, хотя это и не имеет большого значения для того, что мы хотим продемонстрировать. Нажимаем на кнопку ОК. У нас появилось вот это первое поле вот с таким выражением. А - вот и второе. Давайте сначала посмотрим, что теперь представляет собой наш отчет, и только потом рассмотрим то, что здесь добавлено. Страница первая из пятидесяти, вторая из пятидесяти, - третья. Как вы заметили, выравнивание идет именно так, как мы хотели, а именно, Снаружи. Чем это обусловлено? Рассмотрим, что мы здесь имеем. Здесь написано if Page Mod 2 равен нулю. Это означает, что, если данная страница, то есть, Page, является четной (поскольку Mod 2 возвращает остаток при делении), то, остаток будет ноль. Разумеется, если мы имеем четное число, то остаток и будет - ноль. Далее мы видим Page, а это - общее количество страниц в данном отчете. Посмотрим, что мы здесь имеем. Не трудно заметить, что различие заключается только в том, что здесь уже написано - Page Mod 2 равен уже единице. Это означает, что Page уже является нечетным. Таким образом, в каждом случае у нас номер страницы печатается или в этом поле, или - в этом, как мы это уже увидели в режиме просмотра. Пока закроем. Удалим оба поля. Ну, и, разумеется, если мы хотим, вообще, оформить документ с разворотными страницами, то мы можем провести линию под номерами страниц. Проведём, к примеру, вот такую линию. Посмотрим. Здесь у нас - пока что только линия. Думаю, что ясно, что после того, как здесь будут помещены соответствующие поля, они будут отображаться прямо над линией. Пока удалим эту линию. На этом уроке мы также узнаем, как можно развернуть надписи, а точнее, как создавать развернутые надписи. Во время создания отчетов очень часто может возникать ситуация, в которой нам придется использовать очень большое количество меток, хотя здесь у нас их - только три. И, соответственно, нам придется установить эти метки в вертикальное положение, то есть, развернуть их на 90 градусов. Хотя здесь такой проблемы и нет, но, всё же, давайте, попробуем продемонстрировать сказанное. Например, для этого поля, поскольку оно отображает номер записи в данной группе, поставим метку, в которой и будет написано Номер в группе. Берем метку и помещаем её вот здесь... Теперь увеличим высоту этого прямоугольника, а значит, сначала - и высоту области Заголовок группы. Все вместе отмечаем и перетаскиваем. Затем сделаем следующее... Мы просто поменяем свойства данной метки. Свойства. Вкладка Другие. По вертикали отмечаем Да. Здесь всё не очень хорошо видно. Давайте, немного увеличим. Как видите, места здесь, довольно-таки, мало для такой длинной строки, так что нам придется еще увеличить Область данных. Выполняем те же самые операции. У нас получилась вот такая картина. Как видите, надпись у нас получилась, как бы, с "завалом" направо. Другого выбора в Access XP у нас попросту и не имеется, как, впрочем, и в предыдущих версиях Access. Но в таких случаях мы можем пользоваться другими приложениями Microsoft Office, например, приложением Microsoft Excel, где есть более удобные возможности создания различных меток. Для этого поступим следующим образом. Сначала удалим это. Запустим программу Microsoft Excel и напишем здесь тот же текст... Увеличим ширину ячейки. Вот так. Контекстное меню, выбираем из свойства ячейки, команду Формат ячеек. Затем - Выравнивание на 90 градусов. ОК. В данном случае Завал может быть и Налево и Направо, и, конечно, По центру. Таким образом, у нас здесь имеется большой выбор. Ничего не
Глава 9. Отчеты.
239
будем изменять. Копируем ячейку. Снова открываем наш отчет. Наверняка вы уже знаете, что в приложениях, входящих в состав Office XP, появился новый элемент интерфейса, а именно, Область задач. Здесь имеется несколько страниц, в том числе и этот Буфер обмена. Посмотрим. Как вы видите, у нас есть несколько элементов в буфере обмена, в частности и наш текст Номер в группе. После того, как мы выбрали этот текст, давайте, вставим его из буфера обмена в область Заголовок группы CITY.А - вот и наша метка. Размер можем изменить, хотя в любом случае проблему с размерами нужно решать до копирования. Например, поставим вот сюда. Видите, у нас текст может потеряться, поэтому нам придется увеличить немножко высоту прямоугольника. Выполняем те же самые действия... Посмотрим, что у нас получилось. Было бы лучше, конечно, если бы граница нашей метки не появлялась. Для этого делаем следующее. Выбираем из контекстного меню команду Свойства, затем - вкладку Макет. Здесь мы видим Тип границы. По умолчанию здесь выбрано Сплошная. Мы можем выбрать Отсутствует. После этого можем Выровнять эти два элемента По правому краю. Теперь посмотрим. Здесь нам все понятно, мы получили именно то, что и хотели. Закроем. Давайте, теперь рассмотрим, что представляет собой этот объект. На вкладке Данные мы видим, Класс OLE и Microsoft Excel. Это попросту означает, что данная ячейка была создана приложением Microsoft Excel. То же самое можно сделать и в Microsoft Word. Действия, которые мы предприняли в отчете, будут абсолютно такими же. Продолжим рассмотрение некоторых вопросов, связанных с отчетами. Сейчас наш отчет имеет табличный вид. В отличие от других баз данных, таких, как, например, Paradox, в Access нет других видов отчета, например, Отчет свободной формы или Отчет табличной формы. То есть, мы работаем с одними и теми же средствами, независимо от того, какого вида отчет нам необходим. Очень часто отчет должен иметь вид письма и, как правило, в этой ситуации он отображает данные одной записи. Но сейчас наш отчет отображает данные множества записей, хотя имеет группировку. Очень часто нам бывает необходимо, например, отправлять письма, извещения и разную индивидуальную информацию. В этом случае бывает желательно, чтобы отчет имел вид письма. А как это организовать, мы рассмотрим на следующем урок.
9.6. Отчет в виде письма. Адресные этикетки На этом уроке мы ознакомимся с тем, как представить отчет в виде письма. Представим себе такую ситуацию, когда нам нужно поздравить с днем города некоторых лиц из нашей таблицы, являющихся москвичами. Вообще-то, у меня уже есть такой отчет - это qLetter. Откроем его в режиме конструктора. Поскольку мы хотим поздравить только москвичей, то есть, эти письма будут отправлены только москвичам, то вполне логично, что в качестве источника данных для нашего отчета, мы выбрали специальный Запрос. Вот он - qMoscow. Этот запрос выводит на просмотр только те записи, в которых в качестве города отмечена Москва. Вот, в результате выполнения нашего запроса, мы видим только тех людей, которые являются москвичами. Посмотрим, что мы имеем. Здесь вы видите реквизиты нашей фирмы, а это - метки к соответствующим текстам. Здесь нам все понятно. А дальше мы видим следующее. Вот - выражение. Я думаю, что вы уже догадались, потому что уже знакомы с такими выражениями. Это - запись из полей FAM, IM и OT. Они разделены пробелами, вот они. Далее - CITY. В данном случае, здесь будет написано Москва. И - STR, то есть, адрес. Посмотрим, действительно ли это так. Вот, мы видим. Закроем пока. Дальше следует вот такое поле. Как вы помните, нам уже приходилось проверять, присутствует ли в данной записи мужчина или женщина. Здесь мы поступили аналогичным образом: если последним символом отчества (то есть, берем справа из От "единственный" символ) является Ч, тогда будем писать Уважаемый. А, если последний символ - не Ч, тогда - Уважаемая. А дальше - Имя и, как видите, Отчество. Дальше расположены метки, с которыми мы уже не раз сталкивались, а в самом конце - Директор и - место для подписи. Посмотрим ещё раз, как всё это у нас выглядит. Ну, а если мы не хотим переводить бумагу, то поступаем следующим образом. Удалим элемент Разрыв страницы (нажимаем на клавишу Delete). Поместим эту метку в Область данных. Немножко ниже. Давайте, теперь посмотрим на результаты наших действий...
240
TeachPro Microsoft Access 2003
Закроем пока. Ну, разумеется, в этой области мы могли бы поставить и более красиво оформленный текст, но, к сожалению, в Access средства для оформления текста не очень развиты. Для этого нам необходимо воспользоваться или программой Microsoft Word или Microsoft Excel. К решению этой проблемы мы вернемся позднее. Так как наш отчет представляет собой письмо, то понятно, что мы собираемся отправить его по данному адресу. Здесь, вы видите адрес. Вообще-то, мы можем также напечатать и адресные этикетки, в которых содержится именно вот эта информация в различных видах. А, как это делается, мы сейчас рассмотрим. На этом уроке мы познакомимся с созданием адресных этикеток. Наверняка вы знаете, что все офисные программы имеют возможность печати непосредственно на конвертах. Кроме того, если конверт имеет прозрачную оболочку, то мы просто письмо складываем втрое и делаем так, чтобы вот эта адресная часть находилась напротив этого окошечка. Если же конверт не имеет такого окошка, то мы должны изготавливать адресные ярлычки и адресные этикетки. Я думаю, что вы знаете, что, например, программа Word может делать это автоматически. Для того чтобы сделать это в Access, применяется Многостолбцовый отчет. Наверное, вы уже помните, что на предыдущем уроке я говорил, что для создания таких этикеток нам вполне хватит информации, которая содержится в этих трех полях. Мы можем отметить эти поля и удалить все остальное.В итоге у нас получится, примерно, такой отчет, как QLabels (у меня уже имеется такой отчет). Вызовем его в режиме конструктора. Вот - эти три поля. Как видите, у нас присутствует только Область данных. Все остальное имеет высоту ноль, поскольку необходимости в этом у нас сейчас нет. И еще добавлен прямоугольник для удобства резки. Рассмотрим, как это выглядит в режиме просмотра. Вот. Как вы видите, справа бумага - абсолютно пустая, и. чтобы зря не тратить бумагу, мы попробуем разместить остальные этикетки не на следующем листе, а сначала вот здесь и, только при необходимости, - на следующем листе. Для этого выполняем следующие операции. Меню Файл \ Параметры страницы. Так как документом у нас является отчет, то здесь имеется вкладка Столбцы. Отметим Число столбцов, равное двум. Как видите, мы можем выбрать или Сверху вниз (то есть, И-образный), или Слева направо (то есть, как говорится, Z-образный). Как видите, мы получили именно то, что хотели. Давайте, подсчитаем количество этикеток. Один, два, три, четыре, пять, шесть, семь, восемь, девять. То есть, в сумме - 18 этикеток. Мы можем также изменить и ориентацию бумаги. Ориентация тоже является параметром страницы, поэтому - понятно, что мы будем пользоваться тем же пунктом меню. Вкладка Страница. Выберем опцию Альбомная. У нас - та же проблема с пустотой бумаги. Но, думаю, что эта проблема тоже разрешима. Для этого мы поступим следующим образом. Снова Файл/Параметры страницы, Столбцы. Число столбцов укажем равным не двум, а трем. Подсчитаем теперь. Раз, два, три, четыре, пять, шесть... Тоже - 18 этикеток. Это означает, что мы можем попросту выбрать ту ориентацию, которую и предпочитаем, поскольку с экономией бумаги у нас всё равно ничего не вышло: в обоих случаях помещается по 18 этикеток. Закроем. Сохраним внесенные изменения. Этот конструктор тоже закроем. На следующем уроке мы познакомимся с отбором режима вывода данных для отчета из форм.
Глава 9. Отчеты.
241
9.7. Отбор режима вывода данных для отчета из формы На этом уроке мы познакомимся с отбором режима вывода данных для отчета из формы. Откроем наш отчет qLetter. Понятно, что, если мы сейчас попробуем напечатать наш отчет, то распечатаются абсолютно все страницы. То есть, как видите, их очень много, а именно, 493. Понятно, что очень часто такая трата средств нам не нужна, и в подобных случаях очень часто возникает необходимость напечатать только одно письмо. У меня имеется вот такая форма qTabno. Откроем её пока в режиме конструктора. Здесь вы видите уже нам знакомые поля FAM, IM, OT, а также поле TABNO и вот это поле с выражениями, с которыми вы уже знакомы. Источником данных для этой формы является запрос qTabno и поле TABNO, которое является, не только полем этого запроса, но и полем таблицы РЕ, которой мы не раз уже пользовались. Я добавил здесь это поле лишь потому, что информация, которая содержится в нём, является уникальной для всех записей, то есть, ни разу не повторяется. Рассмотрим, что представляет собой этот запрос. Закроем конструктор. Запросы. qTabno. Открываем в режиме конструктора. Вообще-то, я получил этот запрос следующим образом. Я просто скопировал запрос qMoscow, после чего добавил вот это поле, о котором я уже говорил (поле TABNO). Закроем. Опять откроем Форму в режиме конструктора. Понятно, что эта форма будет отображать только тех лиц, для которых в поле CITY написано Москва. Убедимся в этом. Это именно те записи. Это поле будет содержать записи только о москвичах, что обусловлено вот этим запросом. Поместим сюда кнопочку. Перед нами открывается диалоговое окно мастера. Мы будем работать с отчетом и, вполне естественно, что выберем вот эту строку. А, именно, будем просматривать отчет и укажем Просмотр отчета. Разумеется, отчетом будет qLetter. Далее. Нам здесь предлагаются различные рисунки, например, Лупа, Отчет MS Access. Давайте, оставим Просмотр документа. Далее. Имя кнопки не будем указывать и нажмём на кнопку Готово. Посмотрим, как будет работать наша форма. Сначала сохраним и откроем. Например, нажимаем на кнопку. Но, как вы видите, опять будут печататься абсолютно все страницы. Закроем. Откроем в режиме конструктора. Удалим кнопку и попробуем решить эту проблему исключительно теми же средствами, с которыми мы уже не раз сталкивались и с которыми мы уже хорошо знакомы. Для этого выполняем следующие операции. Закроем. Не будем ничего сохранять. Запросы. Было бы логично, чтобы в просмотр выводилась только та запись, которую мы хотим. Поскольку источником данных для отчета qLetter у нас является запрос qMoscow, то изменим этот запрос соответствующим образом. А, именно, войдём в режим конструктора и добавим еще один критерий. Нам нужно, чтобы поле TABNO таблицы РЕ содержало следующее. Мы можем написать и от руки, но воспользуемся соответствующим мастером. Перед нами открывается окно Построитель выражений. Мы хотим, чтобы TABNO, поскольку это - уникальная информация, совпадала с соответствующей информацией нашей формы. А именно, Forms, Все формы, qTabnо (наша форма) и TABNO. Вот. Двойной щелчок - все готово. ОК. Если мы сейчас попробуем запустить наш запрос, то откроется окно, потому что данный параметр не известен. Отмена. Сохраним. ОК. Закроем пока. Когда мы запускаем запрос, то нам не всегда удаётся вспомнить, какой номер мы хотели увидеть, поэтому поступаем следующим образом. Открываем нашу форму. Возьмём, к примеру, первую запись. Здесь написано 128. Это и есть та уникальная информация, по которому будет идти отбор той записи, которую мы хотим увидеть в режиме просмотра. Минимизируем. Запросы.
242
TeachPro Microsoft Access 2003
Как вы видите, получилось именно так, как мы и хотели, а именно, мы видим только одну запись. Закроем. Форму тоже закроем. Вызовем форму в режиме конструктора. Удалим эту кнопку и поставим другую, которая будет обрабатываться с помощью макросов. С макросами мы уже знакомы. Поэтому, давайте, сначала подготовим соответствующий макрос. Макросы. Создать. Макрокоманда. Выбираем - Открыть отчет. Имя отчета - qLetter. Режим выберем не Печать, а Просмотр. В предыдущих версиях Access присутствовали только четыре поля, но в Access 2002 добавлено и пятое, в котором мы можем выбрать Режим окна - Окно диалога, Значок, Невидимое. Мы выберем - Обычное. Сохраним запрос под именем macLet. ОК. Как видите, мы здесь тоже могли бы фильтровать или добавить Условие отбора, но за эти действия отвечает соответствующий запрос. Закроем и добавим кнопку. Например, здесь напишем Печать. Контекстное меню, Свойства. События. Нажатие кнопки, разумеется. Особого выбора у нас здесь и нет. У нас есть единственный макрос, его и выберем. Закроем это диалоговое окно. Посмотрим, как всё это работает. Сначала - Сохраним... Как видите, вторая страница - пуста, и мы видим то, что и хотели, а, именно, единственное письмо. Как и в других случаях, в данном случае Алешина Лариса Александровна. И, вот: получательница - Алешина Лариса Александровна. Все получилось именно так, как мы и хотели. Вообще-то, было бы логичнее написать на этой кнопке не Печать, а только Просмотр, а для печати на принтере создать соответствующий макрос. Ну, мы пока закроем это диалоговое окно. Как я уже и говорил, было бы логичнее, если бы вот эта кнопка называлась не Печать, а, например, Просмотр. Разумеется, мы можем повесить новую кнопку и создать для нее новый макрос, который будет именно печатать. Но более естественным и, как бы, прикладным в этой ситуации, является некоторый ComboBox. С нужным нам выводом либо на экран, либо на печать. И, вообще, кнопочки печати, скажем так, являются не совсем безвредными. Дело в том, что случайное нажатие на такую кнопку в ситуации, когда печатаемые данные будут очень большими, неизбежно вызовут проблемы. Некоторое время будет готовиться файл к печати, который, возможно, займет очень большое место на нашем диске. Будет установлена очередь печати или, тем более, если это сетевая печать, вообще возникнет перегрузка в сети из-за ваших действий. Поэтому кнопки печати не совсем правильно вешать на экран столь явным образом, как это обычно делает программа Windows. Поэтому более правильным вариантом является ComboBox с возможностями выбора Печать и Просмотр. Причем вариант Просмотр должен быть вариантом по умолчанию и соответственная кнопочка, вот эта, будет иметь надпись не Печать, а, например, Пошел. Попробуем именно так и сделать. Давайте, сначала поместим ComboBox, например, вот сюда. Вот этот элемент с Панели элементов, наверняка, уже вам знаком. Давайте, изменим некоторые его свойства. Правая кнопка мыши, Свойства, вкладка Данные. В качестве Типа Источника строк выберем Список значений. Источник строк сформулируем вот таким образом: единица, точка с запятой, Просмотр, точка с запятой, двойка, точка с запятой, Печать. Сохраним. Перейдем на вкладку Макет. Число столбцов - два. Ширина столбцов - ноль, или, допустим, четыре. Опять перейдем на вкладку Данные. В качестве Значения по умолчанию выберем единицу. Сохраним и снова посмотрим, что у нас получилось. Как вы видите, наш ComboBox имеет в качестве значения по умолчанию Просмотр. Мы можем выбрать также и Печать. Нажмем на нашу кнопку Печать и посмотрим, что получится. Обратите внимание на то, что здесь мы выбрали именно Печать. Но, несмотря на это, кнопка у нас работает так, как и раньше.
Глава 9. Отчеты.
243
Закроем. Ну, так и должно было быть, поскольку, для того, чтобы решить эту проблему, мы должны изменить некоторым образом свойства нашей кнопки, а вернее, не свойства кнопки, а свойства тех действий, которые происходят во время нажатия на эту кнопку. Как вы помните, при нажатии этой кнопки вызывается макрос macLet. Убедимся в этом. Вызовем форму в режиме конструктора. Правая кнопка мыши, Свойства. События. Вот - Нажатие кнопки и macLet. Закроем это окно. Пусть Панель элементов располагается в привычном для нас положении. И, как я уже и говорил, мы должны изменить некоторые свойства нашего макроса. Свернем это окно и перейдем к макросам. Вот какая накладка у нас получилась: мы забыли дать имя нашему ComboBox -у. Снова откроем Свойства. Для работы с макросами это нам просто необходимо. Назовем наш ComboBox, например, cbowhattoprint. Закроем. Сохраним. Перейдем к нашим макросам. Вызовем наш макрос в режиме конструктора. Откроем столбец Условий с помощью вот этой кнопки на панели инструментов. Напишем вот такое условие: cbowhattoprint равен единице и cbowhattoprint равен двум. В качестве Макрокоманды выберем, разумеется, Открыть отчет, но, уже не в Режиме Просмотра, а именно, в Режиме Печати. Имя отчета - конечно же, qLetter. И наш новый макрос, точнее макрос с измененными свойствами уже готов. Закроем, конечно же. Сохраним изменения. Перейдем к нашим формам. Вызовем в режиме конструктора. А теперь посмотрим, что у нас получилось. Сохраним сначала. Вот, что у нас получилось. Итак, нажмем на кнопку Печать. Вот. Выберем Печать. И снова нажмем на кнопку Печать. Вызовем в режиме конструктора. Для красоты переместим кнопку вот сюда и напишем здесь не Печать, а - Пошел. Снова посмотрим на то, что у нас получилось. Пошел. Все нормально. Печать. То же самое. Закроем. Как вы понимаете, эту мысль можно развивать и дальше. Если нам нужно по одной и той же форме выбирать разные документы, например, письмо, справка, разрешение, пропуск и тому подобное, то, соответственно, остается только поместить соответствующие ComboBox-ы для выбора нужного нам отчета и обрабатывать уже условие, какой отчет мы выбрали и, в каком режиме хотим его печатать. На следующем уроке мы познакомимся с различными параметрами печати отчетов.
9.8. Параметры печати отчетов Снимки отчетов На этом уроке мы познакомимся с различными параметрами печати отчетов. Что касается других параметров печати отчетов, то, разумеется, мы их можем найти в диалоговом окне Печать. Файл/Печать. Это диалоговое окно почти не отличается от других диалоговых окон Windows программ. Здесь мы видим Имя принтера. Можем выбрать и другой принтер из имеющихся. Но у меня тут - только один принтер. Печатать можем - Всё, либо Страницы c - по. Можем выбрать Число копий, а так же - Разобрать по копиям, то есть, будут печататься несколько копий друг за другом, или не Разобрать, тогда будут печататься сначала все первые страницы, потом все вторые, потом все третьи и т. д. Отменим пока эту печать. Кроме того, Access имеет свой специфический вариант печати. Снова откроем меню Файл/Параметры страницы и здесь - Печатать только данные. Если установим этот флажок и нажмем на кнопку ОК, то можем посмотреть, как выглядит наш отчет РЕ в режиме конструктора. Хотя, давайте, посмотрим и вспомним, как здесь обстоят дела. Как видите, кроме полей, которые соответствуют данным, у нас имеются и различные метки, имеются и прямоугольники, имеется и линия. Посмотрим, как всё это выглядит в режиме просмотра. Как видите, у нас печатаются только данные. Закроем. Такая печать целесообразна, если мы собираемся печатать уже по готовому бланку. Но, к великому сожалению, когда мы строим этот отчет и, допустим, хотим прицелиться нашими полями по определенным местам бланка, это может произойти не совсем удачно. Дело в том, что, хотя у нас в макете и имеется возможность задать координаты соответствующих объектов до тысячной доли сантиметров (а именно, вот так, до тысячной доли сантиметров), но, к сожалению, эти размеры могут быть весьма далеки от реальности. То есть, если вы замерите свой бланк при помощи линейки, сделаете все необходимые
244
TeachPro Microsoft Access 2003
вычисления по поводу полей и необходимых координат расположения ваших полей на листе, то результат печати, к сожалению, будет абсолютно отличаться от ожидаемого вами результата. То есть, смещение может быть равно сантиметру и даже больше. Поэтому, как правило, вам ничего другого не останется, как конкретно под вашу модель принтера произвести все необходимые замеры, пробные распечатки, и уж потом попытаться попасть по бланку. Отключим этот флажок. Файл/Параметры страницы, убираем флажок - Печатать только данные, ОК. Как и в любой печатающей программе (Файл/Печать), у нас имеется возможность Печать в файл. В этом случае, после нажатия кнопки ОК мы должны выбрать имя файла. Нажмем на ОК. Расширение предлагается prn. Например, назовем этот файл pe_print и сохраним его на диске D в каталоге Сергей. Нажмем ОК. Сейчас производится загрузка в файл. Теперь, посмотрим, что представляет собой данный файл. Закроем. Откроем двойным щелчком Мой компьютер, диск - D, папка - Сергей, как вы помните, и - вот наш файл. Чтобы просмотреть свойства этого файла, нажимаем на правую кнопку мыши, Свойства. Вот, размер файла - 901 килобайт. По идее, этот файл будет представлять собой особый графический файл печати, который может быть отослан на принтер обычными средствами операционной системы. То есть, например, копированием на порт LPT1 и на устройство принтера. Это раньше применялось очень часто. Как правило, если вы дома готовите вашу базу данных и хотите отпечатать отчеты, но дома у вас нет столь мощного принтера, тогда вы можете спокойно создать такой файл печати. И, если этот файл помещается на обычную дискету, то, его затем можно распечатать в другом месте, пустив на принтер обычным копированием или, допустим, из какой-либо оболочки типа Norton Commander. И, файл должен быть отпечатан в лучшем виде, если модель вашего принтера соответствует той модели, для которой создавался файл печати. Но, к большому сожалению, мой личный опыт показал, что попытки печати отчетов, таким образом, на лазерные принтеры семейства Hewlett Packard - более чем печальны. То есть, результат печати может не то, чтобы быть не похожим на оригинал, а вообще, являться абсолютно непонятным. Поэтому, к сожалению, этот вариант отпадает, по крайней мере, в отношении большинства, скажем так, принтеров семейства Hewlett Packard Laserjet. Это означает, что этот файл мы можем попросту - Удалить, он нам не понадобиться. Но эта проблема, тем не менее, достаточно острая, поскольку, что касается, конкретно, базы данных, то они могут достигать очень больших размеров. В результате речь может идти уже не о том, что они не помещаются на обычную дискету, а о том, что они не помещаются, к примеру, даже на Zip-дискету. Они могут занимать несколько сотен мегабайт места на диске. Кроме того, об этом я уже говорил, размер базы данных Access, вообще, очень велик и очень быстро увеличивается. Поэтому, что касается конкретно печати отчетов, то пользователи Access, начиная с версии 2000, получили, действительно, очень ценный подарок. Таковым является средство Снимки отчетов. Посмотрим на возможности экспорта. Правая кнопка мыши и - Экспорт. Как видите, в качестве Типа файла нам предлагается несколько вариантов. Из них выберем Снимок, то есть, формат snp. Вы можете заметить, что здесь у нас уже имеется один такой файл, но чтобы не было потом путаницы, я создам новую папку. Назовем папку Export, а Имя файла - РЕ. Так как у нас установлен флажок Автозагрузка, то после создания соответствующего файла будет запущена соответствующая программа, и мы сможем просмотреть этот отчет. Нажимаем на Экспорт. Для просмотра Снимка отчетов, а возможность эта появилась, начиная с Access 2000, в комплект Office входит специальная программа Snapshot Viewer, то есть, Просмотр снимков. Вот окно приложения Просмотр снимков. Ну, и, собственно говоря, после экспорта она и будет запущена.
Глава 9. Отчеты.
245
Вот она. Как вы помните, в качестве параметра печати у нас были отмечены только данные, поэтому здесь мы видим именно только данные, а не прямоугольники, метки и т. д. Что же касается самого отчета, то мы его видим в том виде, в котором он и должен быть. Кроме того, программа Просмотра снимков позволяет печатать отчеты. Выполняется это так же, как и во всех Windows программах: Файл \ Печать. И - перед нами уже знакомое нам диалоговое окно Печати. Отменим пока печать. Сам формат snp, то есть, Снимок отчета, является достаточно компактным, поэтому легко может перемещаться даже на дискетах, тем более в виде архивов. Закроем пока Просмотр снимков. Убедимся, действительно ли готовые файлы снимков можно легко перевозить? Как вы помните, я сохранил наш файл в папке Мои документы... Export. Вот - наш файл. Чтобы узнать его размер, воспользуемся пунктом меню Свойства. Правая кнопка мыши, Свойства. Видите, почти 90 килобайт. Что, как я уже говорил, вполне приемлемый размер. Закроем. Откроем нашу базу данных. Вообще-то, программа Просмотра снимков у меня уже установлена, но замечу, что при стандартной инсталляции Офиса она не устанавливается. То есть, если она вам действительно необходима, то ее надо устанавливать. Программа при полной инсталляции офиса находится в группе средства Microsoft Office. Пуск / Программы/ Средства Microsoft Office/Просмотр снимков Microsoft Access. Мы можем запустить эту программу и отсюда. Щелчок левой кнопки мыши и открываем. Как обычно, из меню Файл/Открыть открываем нужный нам файл, например, тот файл, который мы только что создали. Вы видите, что это, действительно, - та возможность, которой в предыдущих версиях до Access 2000 очень остро не хватало. Если вы хотели напечатать ваши отчеты в большом количестве, то должны были либо перемещать базу, либо оттащить ее на компьютере, либо заниматься всякими не очень удобными вещами. Что касается самой программы Просмотра, то ее стандартное расположение такое - Мой компьютер \ диск C \ Program Files\ Common Files\ Microsoft Shared. Здесь вы можете видеть папку Snapshot Viewer. А - вот и исполняемый файл Snapview.exe. Вообще-то, эта программа является абсолютно независимой от всего пакета Офиса в том смысле, что вы можете просто скопировать вот этот каталог, переместить на другой компьютер и все будет работать абсолютно нормально. Давайте, посмотрим, какой размер имеет наш каталог. Правая кнопка, Свойства. И - всего 260 килобайт, то есть, он, довольно-таки, маленький. ОК. Закроем. Закроем и Просмотр снимков. Кроме формата Snapshot, мы можем экспортировать наши отчеты и в другие форматы, но об этом поговорим на следующем урок.
9.9. Экспорт отчетов в различные форматы На этом уроке мы познакомимся с экспортом отчетов в различные форматы. Давайте, сначала вернем нашему отчету прежний вид, а именно, выполним следующие действия. Пункт меню Файл \ Параметры страницы,и мы не хотим, чтобы печатались только данные. ОК. Опять правая кнопка, Экспорт. На этот раз в качестве формата выберем RTF. Имя файла - РЕ. Как вы знаете это формат - Rich Text Format, который абсолютно адекватно передает внешний вид документа. Он поддерживается редактором МB, но, к сожалению, этот формат не хранит внутренние связи документа. То есть, к примеру, если речь идет о документе Word, то при сохранении в формате RTF документ утратит все внутренние связи, такие как сноски, ссылки, номера страниц и т. д. Хотя внешний вид документа и будет сохранен. А вот номера страниц, например, станут самым обычным текстом. Пусть наш отчет будет сохранен именно в формате RTF. Установим флажок Автозагрузка. Это
246
TeachPro Microsoft Access 2003
означает, что после создания отчета запустится та программа, которая у нас связана с форматом RTF. Как правило, это - Microsoft Word. И отчет будет открыт. Посмотрим, что получится после такой операции. Нажимаем на кнопку Экспорт. Сейчас производится загрузка нашего документ. Как видите, отчет полностью утратил все линии, которые в нём имелись. Они не были переданы. Но, зато были переданы метки - Фамилия, Имя, Отчество и Имя города. Разумеется, что номера страниц стали самым обыкновенным текстом, а вовсе не колонтитулом, поскольку формат RTF, повторяю, вовсе не хранит внутренние связи документов. Что же касается столбцов данных, то они теперь разделены табуляцией. Поэтому, в принципе, средствами Word не трудно преобразовать эти данные в таблицу. Попробуем это выполнить на примере вот этих трёх строк. Как видите, я выделяю их левой кнопкой (закроем пока Помощника) и нажимаю на панели инструментов кнопку - Добавить в таблицу. Мы получили самую обыкновенную таблицу, как видите. Еще раз повторю, что такой текст довольно легко преобразовать в таблицу и можно постараться попасть по бланку. То есть, вы можете попытаться вывести в отчет формат RTF. Весь текст будет выведен, а другие объекты - нет. Если вы уверены, то можете попытаться попасть по готовому типографскому бланку при печати такого документа из программы Word. Закроем эту программу. Не будем сохранять изменения в документе. Нет. Продолжим наше знакомство с возможностями экспорта. Снова - правая кнопка, Экспорт. Выберем теперь следующий тип файла - Microsoft Excel, а именно, 97-2002. Это, как бы, самые новые форматы Microsoft Excel. Опять отметим Автозагрузку. Разумеется, что программой, предназначенной для открытия данного файла, является Microsoft Excel. Нажмем на Экспорт. Вы можете убедиться в том, что группировка у нас сохранилась. То есть, мы можем скрывать, раскрывать каждый уровень группировки, чтобы посмотреть, какие данные включены в этот файл и т. д. Но это уже относится к собственным средствам Excel. Поэтому, если вы знакомы с программой Excel, то эта ситуация вам знакома. Если же - нет, то рассматривать данные возможности Excel по группировке мы здесь, к сожалению, не сможем. Закроем программу Excel. Следующий формат экспорта, снова выбираем команду Экспорти в качестве следующего формата выберем Текстовые файлы. Автозагрузку мы не отмечаем, позже я объясню, почему. Нажимаем на Экспорт. Как видите, нам предлагается выбрать Кодировку. Раньше Access автоматически сохранял текстовые файлы в кодировке MS-DOS, что было не очень удобным, поскольку средствами обычных текстовых редакторов не возможно было прочесть сохраненный текст. Сейчас мы можем выбрать кодировку Windows, что сейчас по умолчанию, и выбрано, и нажать на кнопку ОК. Давайте, найдем только что созданный файл. Как вы помните, я экспортировал файлы в каталог Мои документы. Export и Открыть. Вот - все экспортируемые нами файлы, а вот и - pe.txt. Откроем. Как видите, здесь присутствует иконка обыкновенного текстового редактора Notepad. Но, если размер файла превысит 65 килобайт, то открыть его с помощью Notepad нам не удастся, и Windows откроет этот документ с помощью WordPad. Нажмем на - Открыть. Вот, именно о возможности такой ошибки я вас и предупреждал. Как видите, этот файл не удается открыть с помощью Блокнота, поскольку он слишком велик. Что я и говорил. Windows спрашивает: "Хотите использовать WordPad для обработки этого файла?". Мы, конечно же, хотим и поэтому нажимаем на кнопку - Да. Развернем окно на весь экран. Ну, вы убедились, что всё, довольно-таки, удачно, и можно вполне разобраться, что к чему. Еще раз повторяю, что в предыдущих версиях Access мы могли (закроем это пока) экспортировать текстовые документы, то есть, документы с форматом txt, только в кодировке MS-DOS. Закроем это окно. Откроем нашу базу данных. Снова - правая кнопка и Экспорт. Вы видите, что у
Глава 9. Отчеты.
247
нас тут ещё имеются такие форматы, как Документ XML и Документы HTML. С этими форматами мы ознакомимся на следующем урок. Давайте, продолжим наше знакомство с экспортом отчетов в различные форматы. Для разнообразия я приготовил еще один отчет c названием rptКлиенты. Для начала посмотрим в конструкторе, что представляет собой этот отчет. Щелчок мышью по кнопке Конструктор. Как видите, источником данных для этого отчета является наша таблица Клиенты. Всего тут имеется несколько полей, метки. Я специально поставил здесь цветные линии, цветные метки, здесь - тоже и здесь цветные поля. Ну, а почему, я объясню попозже. Давайте, посмотрим в режиме просмотра. Здесь, конечно же, все понятно. На каждой странице - по Должности, поскольку у нас имеется группировка по Должности и т. д. Закроем это окно. Закроем и конструктор. Снова откроем окно Экспорт. Для этого, как и прежде, нажимаем правую кнопку мыши и - Экспорт. В качестве Типа файла выберем Документы HTML. Как и прежде, давайте, выберем папку Export. Создадим новую папку - htm. А в качестве имени файла зададим index. Автозагрузка не отмечена, как видите. Нажимаем на кнопку Экспорт. Мы должны выбрать Параметры вывода в формате HTML. Шаблона у меня нет, а Кодировка для сохранения файла - По умолчанию нас вполне устраивает, потому что это позволит разобраться с русским текстом. ОК. Давайте, посмотрим, что у нас получилось. Снова откроем папку Мои документы, затем - папку Export. Откроем только что созданную нами папку htm. Разумеется, все это я делаю двойным щелчком левой кнопки. Развернем это окно. Как видите, у нас было создано несколько страниц, вот - они. Это было выполнено следующим образом. Имя файла index.html у нас получила первая страница, а дальше - тот же index, затем - Страница, Номер страницы и т. д. Давайте, откроем наш файл index.html. Как видите, у нас тут линий уже нет, зато цветные метки сохранили свой цвет. А еще добавлены вот такие ссылки: Первая, Предыдущая, Следующая, Последняя. Это страница является - Первой, поэтому, давайте, перейдем к - Следующей. Левой кнопкой нажимаем на ссылку. Можно перейти к Последней, вернуться к - Первой и так далее. Пока закроем этот браузер. Операционной системой у нас является Windows и поэтому все работает нормально. Но, если мы установим наши файлы на сервере, где в основном работает операционная система Unix, то с файлами, имеющими русские названия, могут возникнуть некоторые проблемы. Поэтому сначала мы должны внести некоторые изменения. А, именно, сначала изменим, имена всех файлов, кроме первого, конечно, потому что в имени первого файла ничего русского нет. Начнем, например, вот с этого. Нажимаем на правую кнопку, выбираем - Переименовать, и удаляем слово Страница, а все остальное в имени файла оставляем без изменений. То же самое и здесь и т. д. Мы должны внести также некоторые изменения в самих файлах. Это - файлы формата HTML, поэтому мы можем открыть их с помощью обыкновенного Блокнота. Давайте откроем данный файл. Развернем окно на весь экран. Поскольку гиперссылки у нас были расположены в самом конце, а изменения предстоит внести именно в гиперссылках, то, и перейдем к концу файла. Вы видите, что и здесь отмечены имена файлов, в которых присутствуют русские слова. Здесь также удалим слово Страница. То же самое - и здесь. Закроем и сохраним изменения. Вернемся к нашей базе данных. Вообще-то, только что созданные нами файлы мы можем скачать на какой-нибудь сервер, и тогда они будут доступны не только нам, но и любому человеку по всему миру, который имеет доступ к Интернету. Но, к сожалению, у меня сейчас нет подключения к Интернету, и я не могу продемонстрировать, как это можно сделать. Кроме того, у нас еще имеется и другой формат, в который можем экспортировать наш отчет. Снова правая кнопка мыши, Экспорт, а именно, Документы XML. Да-
248
TeachPro Microsoft Access 2003
вайте, создадим ещё одну папку в папке Export. Вот - Мои документы, Export. Новая папка. Назовем эту папку xml. В качестве Имени файла введем, например, снова index. Нажимаем Экспорт. Мы должны выбрать Сведения для экспорта. Данные XML нас вполне устраивают. Нажмём ОК. Свернем это окно. Перед тем, как открыть только что созданные нами файлы, я хочу отметить, что такая возможность появилась только, начиная с версии Access 2002. Предыдущие версии Access такой возможности не имели, потому что XML, само собой, является, как бы, новым форматом представления данных в Интернете и довольно успешно заменяет более старые форматы HTML. Здесь мы выполняем те же самые операции. Открываем папку Мои документы. Правая кнопка и - Открыть. Открываем папку Export таким же способом. Вот - наша папка xml. Откроем файл index.htm. Как видите, здесь представлены не только цветные метки, но и линии. В отличие от формата HTML, все наши данные здесь следуют друг за другом, то есть, они не были помещены на различных страницах. Закроем этот браузер. Эти файлы тоже можно подобным образом скачать на какой-нибудь сервер и сделать тем самым информацию, содержащуюся в них, доступной всему человечеству. Давайте, закроем это окно. Вернемся к нашей базе данных. Собственно говоря, это все, что я хотел рассказать вам об отчетах. На следующем уроке мы начнем наше знакомство с другими объектами Acces.
Глава 10. Страницы доступа к данным.
249
Глава 10. Страницы доступа к данным 10.1. Страницы доступа к данным Автостраница. Особенности конструктора страниц Итак, на этом уроке мы начинаем наше знакомство со страницами доступа к данным. Начиная с Access 2000, появился новый вид объекта, Страницы доступа к данным или сокращённо, DATA, DATA Access Page, то есть он также переводится как Страницы доступа к данным. Для того чтобы пользователь, при необходимости, переходил к использованию этих объектов, фирма Microsoft намеренно ослабила поддержку стандартных средств публикации данных в Интернете, которые были очень развиты в Access 97. Я не думаю, что для отдельно взятого пользователя, озабоченного решением совершенно конкретных, вероятнее всего, бухгалтерских или тому подобных проблем, Страницы доступа к данным являются весьма актуальными. Но, тем не менее, объект есть и какое-то представление о нём мы должны иметь. Страницы доступа к данным это внутренняя технология Microsoft и поэтому, пока что они не являются средством работы в Интернет, хотя могут публиковаться в Интернет и могут просматриваться браузерами, начиная с Internet Explorer5. Страница, это объект и по построению, и по размещению принципиально отличный от того, что мы до сих пор сделали. Убедимся в этом. Нажмём кнопку, Создать, разумеется, левой кнопкой мышки. Выберем, Автостраница, в столбец. В качестве источника данных мы выберем вот это, таблица PEcom, нажимаем, Ok. И вот у нас появилась вот такая страничка. Здесь мы имеем несколько меток, поля, а также несколько кнопок. Эти поля соответствуют полям источника данных, то есть, в нашем случае, это таблица PEcom. Имеются соответствующие метки и кнопки навигации, то есть, следующая запись, предыдущая запись, последняя запись, первая запись. А здесь мы видим вот такую надпись, PEcom 1 из 557. Это означает, что в данный момент в этой области мы видим первую запись из имеющихся 557. Здесь у нас имеются и несколько других кнопок. Мы с ними познакомимся по очереди. Если мы хотим произвести сортировку, например, по отчеству, то делаем следующее. Активизируем данное поле, то есть, курсор находится, именно, там и нажимаем на эту кнопку, Сортировка по возрастанию. Как видите, сейчас первым является другая запись. Если мы опять выберем это же поле и нажмём кнопку, Сортировка по убыванию, то предыдущая запись уже станет последней. Убедимся в этом, перейдём к последней записи. Вот. Мы можем также произвести фильтр по выбранному. Например, мы хотим просмотреть всех Андреев, выделяем имя Андрей и нажимаем вот на эту кнопку, Фильтр по выделенному. Сейчас мы видим первого из них. Дальше идут только Андреи и последняя запись тоже самое. Чтобы вернуться к предыдущему представлению данных нажимаем на, Кнопку фильтра. Давайте сохраним нашу страницу. Нам предлагается имя PEcom.htm, мы так и оставим, нажимаем, Сохранить. Посмотрим, что у нас получилось. Открываем, Мой компьютер, диск D. Вот, только что созданный нами файл. Давайте попробуем открыть страничку, но уже не в Access. Правая кнопка, Открыть. Как видите открывается она с помощью браузера Microsoft Internet Explorer и здесь, всё также, нормально работает. Закроем пока браузер и это окно тоже.Вернёмся в Microsoft Access вызовем эту страничку и перейдём в режим, Конструктор.Этот Конструктор имеет несколько особенностей, по сравнению с другими конструкторами, с которыми мы работали в Access 2002.
250
TeachPro Microsoft Access 2003
Сегодня мы начинаем наше знакомство с Конструктором страниц доступа к данным. По приёмам работы этот конструктор резко отличается от конструктора формы и отчётов, которые, как вы помните, были достаточно похожи и имели совершенно идентичный набор инструментов. Вот панель сейчас перед нами. Кроме знакомых нам, например, Надпись, Поле, Переключатель и других элементов есть также новые, Бегущая строка, Развернуть/свернуть, Свободная таблица Office и так далее. Наша страничка пока не именована, поэтому мы видим бледную надпись, Название страницы. После щелчка левой кнопкой мыши, здесь появляется мигающий курсор и мы можем дать любое имя, например, Сотрудники. Давайте в таком виде сохраним нашу страничку и посмотрим, вот уже надпись, Сотрудники. Вызовем страничку опять в режиме, Конструктора. При пометке элементы здесь тоже несколько отличаются. Появляются вот эти, немножко крупные, белые квадратики и вот эта рука. Возможна тонкая регулировка размеров с помощью клавиш, Shift и стрелок. Возможно также тонкое перемещение элемента с помощью клавиш, CTRL и стрелок. А если мы хотим переместить элемент с помощью мышки, то перемещение происходит, соответственно, в невидимой координатной сетке. Если мы удалим, например, уже выбранное нами поле, он, разумеется, удалится вместе с меткой. Восстановить его мы можем из списка полей. Он у нас отсутствует, но это не проблема. Для этого входим в пункт меню, Вид, Список полей. Мы хотим вернуть поле, TABNO. Берём это поле и вот так перемещаем. А дальше нам предстоит отрегулировать размер и, разумеется, местоположение. Например, так. Здесь невозможно использование вычисляемых полей таким образом, как мы делали это раньше. И если мы хотим использовать некоторые выражения, то это нам не удастся. Давайте попробуем поместить поле, например, вот здесь. Напишем, уже знакомое нам, выражение, NOW. Сохраним нашу страничку и выведем на просмотр. Как видите, здесь, NOW пишется как простой текст. Опять вызовем режим, Конструктора, Удалим. Если подобные выражения необходимы при создании нашей странички, то источником данных странички должен быть соответствующий запрос, где уже необходимые данные выражаются формулой. Пока закроем список полей, а на следующем уроке продолжим наше знакомство с конструктором страницы доступа к данным.
10.2. Параметры группировки На этом уроке мы продолжим наше знакомство с конструктором страниц доступа к данным. Давайте ещё раз посмотрим, как выглядит наша страничка на самом деле. Надеюсь, вы со мной согласитесь, что если у нас есть, например, не больше 550 записей, то не очень удобно смотреть их по одному. Давайте, опять вызовем режим, Конструктора. Для решения этой проблемы мы попробуем сделать следующее, щёлкаем правой кнопкой на, Заголовке, открывается меню. Выбираем, Свойства уровня группы. В данный момент у нас только одна группа. Вот, в его свойствах есть пункт, DataPageSize, то есть, размер страницы данных. Давайте выберем пять и посмотрим, что у нас получается. Вызовем в режиме, Просмотра. Как видите у нас уже не одна запись, а целых пять. И здесь, с первого по пятое из 557. Сейчас будет с шестого по десятое, потом будет, разумеется, с одиннадцатого по 15 и так далее. Вызовем опять режим, Конструктора. Это диалоговое окно пока закроем, щелчок левой кнопкой мыши. Чтобы улучшить внешний вид нашей страницы, с учётом того, что информация у нас будет печататься, как бы порциями, делаем следующее. Давайте сначала, вообще, уберём несколько полей и оставим, Фамилия, Имя, Отчество и ещё, TABNO, а также... Пожалуй, только эти поля. Всё остальное пока удаляем. Как обычно, отмечаем
Глава 10. Страницы доступа к данным.
251
левой кнопкой, после чего нажимаем клавишу, Delete. Левая кнопка, Delete.А эти поля поместим следующим образом. Перемещение производится или с помощью мышки, или с помощью клавиатуры, как я и говорил. Это пока не окончательный вид, но посмотрим, что у нас получилось. Как вы видите у нас очень много одинаковых меток, TABNO, FAM, IM и OT. Вызовем опять режим, Конструктора и чтобы тоже решить эту проблему давайте сделаем следующее. Левой кнопкой нажимаем вот на эту стрелочку в области, Заголовок. Открывается меню. Это же меню, можно открыть другим способом: правая кнопка мыши, видите, тоже самое. Выбираем, Подпись. У нас добавляется новая область, Подписи, после чего поместим соответствующие метки, именно, там. Как видите эта метка связана с полем. Давайте выровняем все метки по нижнему краю, соответственно, снизим до заголовка. Поскольку это метки, то мы можем увеличить шрифт, например, до 12, а также поместим здесь вот такую линию. Работа с элементами из Панели элементов производится также, как и в случае с формами и отчетами, то есть, нажимаем левую кнопку и попросту рисуем. Сейчас мы увеличим длину. Давайте изменим также цвет. Как и цвет текста, это делается с помощью вот этой кнопки на панели инструментов. Это, по моему, не очень хороший цвет, давайте выберем вот этот, синий. В качестве цвета меток тоже выберем этот цвет. Как вы заметили, элементы здесь можно выбрать только по одному, в отличии, от Конструкторов форм и отчётов. Давайте сохраним и посмотрим, что у нас получилось. Как видите, всё, вполне, нормально. Увеличим, вот, первые пять, следующие пять, следующие пять. По моему так более понятно. Пока закроем. Как вы помните, наша, только что созданная, страничка, вернее, не только что, а на прошлом уроке, сделана с помощью соответствующего мастера. Поскольку нам предстоит сделать страницу с нуля, давайте эту страницу удалим. Выбираем левой кнопкой, после чего нажимаем клавишу, DELETE. Microsoft Access предупреждает, что файл будет удалён, а также спрашивает, Удалить ссылку и файлы или только ссылку, или Отменить. Давайте уберём и ссылку, и файлы. Для этого нажимаем на кнопку, Удалить ссылку и файлы. Выдаётся ещё одно предупреждение со следующим текстом: Вы действительно хотите отправить объекты в корзину? Причём объектов 10 штук. Подтверждаем, Да. На следующем уроке мы займёмся, именно, тем, что начнём создавать страницу с нуля.
10.3. Многоуровневая группировка данных Давайте продолжим наше знакомство с конструктором страниц, а также с некоторыми элементами. Создадим страницу, как мы говорили на предыдущем уроке, практически с нуля. Нажимаем кнопку, Создать, оставляем выбранным, Конструктор, а в качестве источника данных выбираем ту же таблицу, PEcom. Нажимаем, OK. Открывается наша страница в режиме конструктора, Список полей, а также, Панель элементов.Вот эта область у нас пока что не является областью заголовка, но когда мы перетаскиваем, например, вот это поле, FAM, Да, то Access сразу же понимает, что данная область является, именно, областью заголовка. Сразу же здесь появляются, Кнопки Перехода. Удалим метку, немножко передвинем. Давайте добавим также поля, IM и OT, создадим таблицу наподобие того, что мы имели на предыдущем уроке. Как вы заметили, появляется синий прямоугольник. Давайте немножко сожмём. Не получается, поскольку сейчас он имеет тот размер, который необходим для кнопок перехода. Первой кнопкой открываем меню, которое открывается с помощью этой стрелки. Добавляем новую область, а, именно, Подпись. Вот, Подписи
252
TeachPro Microsoft Access 2003
PEcom. Уменьшим область заголовка, ещё немножко, а сюда поместим несколько меток. В данном случае, этот элемент называется не метка, а Надпись. Например, Фамилия. Давайте поступим так, будем, Копировать. Правой кнопкой открываем меню и, Вставить. Тоже самое ещё раз. После чего изменим надпись: Имя и Отчество. После ввода текста просто щёлкаем где-то, например, вот здесь, главное, что вне области данного элемента. Поскольку здесь имеем метки, увеличим шрифт, сделаем 12. Выберем жирный шрифт. Пусть пока наша страница не будет иметь названия. Сохраним нашу страницу, для этого нажимаем, Пробел. Если, вы помните, у нас здесь есть каталог, Сергей, пусть там и сохранится. А в качестве имени выберем, Pecom, и посмотрим, что у нас получилось. Вы видите, у нас получилось, довольно-таки прилично, но как вы помните, мы могли бы сделать так, чтобы на экран выводилась не одна запись, а сразу несколько. Снова вызовем режим конструктора. Для этого, как вы помните, мы делали следующее: щелчок правой кнопкой мыши на заголовке, Свойства уровня группы и, в качестве значения поля, DataPageSize, выберем, например, пять. Закроем, снова сохраним и посмотрим. Как видите, всё, вполне, нормально. Опять вызовем режим конструктора. Логично, что в данном случае, нам может пригодиться и фильтрация. Лучше всего, фильтрацию проводить с помощью какого либо ComboBox. У нас на, Панели элементов, есть такой элемент, вот, Раскрывающийся список, то есть, ComboBox. Поместим этот список в область, Подписи. Поскольку у нас включён мастер, то после того, как я отпущу левую кнопку, мастер начнёт свою работу. Вот видите, мы будем вводить, фиксированный набор значений, Далее. Предположим, что мы проведём фильтрацию по имени и поэтому здесь введём два имя, например, Андрей и Владимир. Готово. Удалим метку. Выровняем, Сохраним и посмотрим, что у нас получилось. Вызовем, Конструктор. Также на этом уроке мы познакомимся с фильтрацией и с группировкой данных. Как вы помните, мы хотели произвести фильтрацию наших товарищей по имени. Например, вывести всех с именем, Андрей или Владимир. Щелчком правой кнопки мыши открываем меню, Заголовка, Свойства уровня группы. Здесь имеем вот эти поля. Здесь поле, GroupFilterControl, то есть, имя того элемента, с помощью которого будет идти фильтрация. Наш ComboBox имеет имя или, в данном случае оно называется ID, а не имя, но это не важно, А фильтрация будет идти, разумеется, по полю, IM. Закроем окно. Сохраним и посмотрим. Как видите, если мы выбрали Владимир, то у нас 19 Владимиров, а если выбираем Андрей, у нас 13 Андреев. Опять вызовем в режиме конструктора. Это поле мы можем удалить. В подобных случаях более естественным будет, если данные будут выводиться в группированном виде по городу, где проживают данные лица. Давайте сначала поместим в область заголовка поле, CITY. У нас есть на панели инструментов вот такая кнопка, Повысить уровень. Когда нажимаем на эту кнопку, то автоматически добавляются ещё несколько областей, а, именно: Заголовок PEcom - CITY : метку сразу же снимем, ну ладно оставим, не будем удалять, а также новые, Кнопки перехода. Давайте снова, Сохраним и посмотрим, что у нас получилось. Как видите, у нас группировка идёт по городам. Здесь трое - из города Апрелевка, из города Дачная - единственный товарищ, из города Долгопрудный целых пятеро и так далее. Вызовем режим конструктора. Как видите, всё очень легко и просто. Ну, попросту для дизайна изменим размер шрифта этой метки. Нет, это слишком, пусть будет 12, шрифт жирный, курсив. Увеличим высоту. В качестве фона выберем - серый. В качестве цвета шрифта - синий. И вместо слова "Группа из" напишем "Город". Подобные изменения мы можем ввести и для других меток, для других областей, но это не очень важно,поскольку никакого действенного эффекта не имеет. Сохраним на-
Глава 10. Страницы доступа к данным.
253
шу страницу, посмотрим, что у нас получилось. Вот. Всё предельно ясно и понятно. На следующем уроке мы познакомимся с многоуровневой группировкой данных.
10.4. Перегруппировка данных. Итоговые поля групп На этом уроке мы познакомимся с перегруппировкой данных, а также с итоговыми полями групп. Давайте, более пристально, посмотрим на возможности группировки. Сейчас у нас поле CITY, вот оно, введено в, Заголовок PEcom - CITY и, соответственно, наши записи группируются по ней. Но понятно, что группировка может идти и по другим критериям, например, по именам и результат будет отличаться только по смыслу, а внешний вид и принцип работы будут такими же. Давайте выделим наше поле и нажмём вот на эту кнопку, Понизить уровень. Тоже самое можно сделать и по другому. А именно, правая кнопка мыши, и здесь тоже есть такая кнопка, Понизить уровень. Эта метка нам не нужна, но, пока, не будем её удалять. Как помните, вот здесь у нас находится поле, IM, и давайте сгруппируем по имени. Для этого нажмём вот эту кнопку, Повысить уровень. Здесь перемещаем немножко поля и посмотрим, что у нас получилось. Как видите, группировка идёт уже по именам. Абдусалам, единственный товарищ с таким именем и поэтому здесь мы видим первый из одного. А здесь сразу трое и мы видим всех троих. Вернёмся в режим конструктора. Разумеется, если бы мы хотели использовать группировку по отчеству, что тоже, вполне, возможно, поскольку в группе людей есть с одинаковыми отчествами, то мы должны, Понизить уровень поля, IM, вот таким образом. И, соответственно, Повысить уровень поля, OT. Вот этого поля. Как видите, группировка в страницах производится достаточно эффективным и наглядным образом. Чтобы воспроизвести тоже самое, средствами форм, надо было бы встраивать в формы отчёты, которые позволяют иметь группировку. Но, сами видите, в страницах это делается несколько проще. Попробуем тоже самое, сделать уже при помощи, Мастера. Закроем нашу страничку. Не будем сохранять внесённые изменения, нажимаем кнопку, Нет. Чтобы начать работу Мастера, делаем следующее, нажимаем кнопку, Создать, выбираем, Мастер страниц, а в качестве источника данных уже - таблицу, PEcom, OK. В качестве полей давайте выберем, TABNO, FAM, IM, OT, а также CITY. STR - не надо. Далее. Мастер предлагает нам выбрать уровни группировки. Давайте выберем уровень, CITY. Как видите, можно сделать это или двойным щелчком (отменим это), или с помощью вот этой кнопки. Далее. Сортировка пока нам не нужна, поэтому опять, Далее и, Готово. Как видите, всё у нас получилось, именно, так, как и в нашей предыдущей странице, в уже знакомом нам варианте. Поэтому давайте посмотрим, как выглядит всё это в режиме, Просмотра. Здесь, в качестве размера страницы данных, у нас единица и поэтому наши данные на экран выходят по одному. Вернёмся в режим конструктора. Давайте вспомним, как надо увеличить порции данных, которые одновременно выводятся на экран. Правая кнопка, свойства уровня группы, как вы помните, DataPageSize, выберем пять и посмотрим. Видите, уже сразу пять городов, дольше следующие пять и так далее. Опять вернёмся к конструктору. Эту страницу пока закроем, сохранять не будем и вернёмся к нашей странице. Вызовем в режиме конструктора. Диалоговое окно свойств нам, пока, не нужно. Здесь мы можем добавить примечание, которое, в таких случаях с отчётами, называется нижний колонтитул. Правой кнопкой нажимаем на, Заголовке PEcom - CITY или, что одно и тоже, вот на эту стрелочку, но уже левой кнопкой мыши. Так, Нижний колонтитул. Посмотрим, что у нас получилось. Как видите, свободное место после каждого элемента группировки. Опять вызовем в режиме конст-
254
TeachPro Microsoft Access 2003
руктора. Вот эта область, Примечание, может использоваться для разных целей, но мы попробуем поместить здесь информацию о количестве наших товарищей, которые, при группировке по городам, находятся в данной группе. Поместим здесь самое обыкновенное поле и переместим его, например, вот сюда. Метку удалим. Для нашего поля вызываем диалоговое окно свойства, а именно, правая кнопка, Свойства элемента. Переходим на вкладку, Данные и, в качестве ControlSource, то есть, источника данных, выбираем поле, TABNO, поскольку, как вы помните, это поле является уникальным для каждой записи. А в качестве TotalType, то есть, итогового значения, dscCount, то есть, сумма. Сохраним и посмотрим, что у нас получилось. Как видите, здесь мы видим число три. Это означает, что эта группа содержит три записи. Убедимся в этом. Откроем, вот, раз, два, три. Эта группа - семь, вот с первого по пятое и с шестого по седьмое. Опять вызовем нашу страничку в режиме конструктора, закроем это диалоговое окно. Вообще то, мы можем использовать многоуровневую группировку. Продемонстрируем это. Предположим, что кроме группировки по городу нам нужна ещё и группировка по имени. Нажимаем правую кнопку мыши, Повысить уровень. Эту метку, мы пока что оставим и посмотрим, что получается. Как видите, появился новый заголовок, Заголовок PEcom - IM и, соответствующие, кнопки перехода, Кнопки перехода PEcom IM. Как видите у нас в городе Апрелевка один Александр, одна Вера и одна Наталья. Перейдём к, более, большим городам, найдём город Москва и посмотрим, как обстоят дела здесь. Например, Москва и имя Алла. Как видите, у нас целых пять имен Алла, которые проживают в городе Москва. Вернёмся в режим конструктора. Отменим эту группировку, а именно, нажимаем правую кнопку мыши и, Понизить уровень. Переместим, сделаем, как было раньше. Всё. Снова посмотрим. И вы видите, что группировка у нас, как раньше, идёт только по городам. Вернёмся в режим конструктора. Разумеется, при наличии художественного вкуса, нет предела совершенству. Совершенствовать внешний вид странички можно достаточно долго, тем более, возможностей для этого вполне хватает. Давайте продемонстрируем это на маленьком примере, например, изменим, цвет зоны заголовка, предположим, на серый, и посмотрим, что у нас получилось. Вот. Опять вернёмся в режим конструктора. Как вы видите, трудоёмкость создания таких страниц достаточно маленькая, особенно, по сравнению, например, с формой со встроенным отчётом. И тот факт, что соответствующие данные, можно просматривать стандартным браузером, тоже несколько облегчает жизнь, хотя, к сожалению, эта возможность реализовывается только в локальной сети, обустроенной средствами Microsoft. Хотя, в далеко идущих планах Microsoft, учитывая влияние этой фирмы, распространить технологию страниц доступа к данным на весь интернет. На следующем уроке мы познакомимся с добавлением связанных поле.
10.5. Добавление связанных полей На сегодняшнем уроке мы узнаем, как добавлять поля из другой таблицы. До сих пор мы устанавливали в нашей страничке поля только из одной таблицы. На самом деле мы можем использовать не только поля этой таблицы, но и поля связанных таблиц, а также несвязанных, если мы сможем установить связь. Давайте откроем нашу страничку в режиме конструктора. Вот наш список полей. Как видите, здесь, кроме, нашей таблицы есть несколько других, в том числе и таблица, IND. Таблица, IND содержит два поля: NO и INDEX. Поле, NO соответствует TABNO нашей таблицы PEcom, поэтому мы можем установить связь между двумя таблицами, именно, с помощью
Глава 10. Страницы доступа к данным.
255
этих полей. Поле INDEX содержит почтовый индекс данного товарища, которому соответствует, TABNO или NO, таблицы IND. Как вы помните, TABNO является уникальным для всех записей. Давайте добавим поле, IND в нашу таблицу. Для этого мы можем или перетаскивать (видите, появляется синий прямоугольник), или же воспользоваться вот этой кнопкой, которая впервые появилась в Access 2002, Добавить на страницу. Нажимаем. Здесь предлагается выбрать макет для данного раздела. Мы добавляем только это поле, поэтому тип макета, В столбец, нас вполне устраивает. Нажимаем, OK и вот открывается окно, Мастера отношений, где мы должны сказать Access, как хотим установить связь. Как я уже говорил, в таблице IND нас интересует поле, NO, поскольку есть соответствующее поле в таблице PEcom. Они называются по-разному, но это не имеет значения. Здесь мы можем выбрать также тип этого соединения, Многим записям в IND соответствует одна запись в PEcom или, Одной записи в IND соответствует много записей в PEcom. Ни один из вариантов не характеризует нашу ситуацию и поэтому в обоих случаях, так или этак, результат для нас будет одинаковым. Как видите, при изменении выбора наши поля становятся пустыми, поэтому выберем снова интересующие нас поля, нажимаем OK. Вот добавленное поле. Метку удаляем, немножко переместим это поле и посмотрим результат. Как видите, отображается почтовый индекс. Например, в Москве есть товарищи. Они имеют одинаковый индекс. Здесь и здесь. Мы можем убедиться в этом, так как мы знаем, что на страничке имеем кнопку, Фильтр по выделенному, нажмём эту кнопку. Как видите, целых 47 товарищей с одинаковым почтовым индексом. Вернёмся в режим конструктора. В принципе, мы могли бы попробовать поместить в нашей страничке и поля из других таблиц, но, например, в случае с таблицей, SIGNS у нас, как видите, нет общих полей с нашей основной таблицей PEcom. Давайте, пока закроем, Панель элементов, список полей. Если они нам будут нужны, то мы можем снова открыть их. Развернем пункт меню, Вид, Список полей, Панель элементов, или с помощью соответствующих кнопок на панели инструментов. В частности, во время группировки, да и, вообще, в страницах доступа к данным, некоторые из этих кнопок нам просто не нужны. Например, сохранение, то есть, изменение сохранения данных, вообще, предполагает огромное количество условий и мы, предположим, хотим, чтобы этой кнопки у нас не было. В отличие, от предыдущих версий Access сделать это намного проще. Просто здесь щелчок правой кнопкой мыши, это можно сделать и во всей этой области: правая кнопка, пункт, Кнопки переходов и например, Сохранить. Эта кнопка отмечена, щелчок по ней левой кнопкой мыши и, как видите, данной кнопки у нас уже нет. Здесь нет вот этой кнопки. Посмотрим на результат. Как вы видите, в отличие от этой панели, здесь нет этой кнопки. Вернёмся в режим конструктора, сохраним нашу страницу, свернём - Microsoft Access. Вот наша страничка. Попробуем открыть её уже с помощью нашего, стандартного браузера. В данном случае, у меня стандартным браузером является Internet Explorer. Щелчок правой кнопки мыши, Открыть. Как видите, всё отображается, именно так, как и в режиме просмотра Microsoft Access. Эти данные имеют живую связь с вашей базой. То есть, в любой момент, те данные, которые пользователь видит через свой браузер, будут соответствовать данным, которые в это время, находятся в соответствующей базе. К сожалению, поместить в Интернет эту страничку нам уже, таким образом, как мы делали это с результатами нашего отчёта, уже не удастся, поскольку страничка должна иметь живую связь с исходной базой данных и это, пока, обеспечивается при работе в сетях Microsoft. Поэтому, соответствующие странички пока являются частью, так называемого, Интранета, то есть, сетевых технологий локальных сетей, но с применением Интернета.
256
TeachPro Microsoft Access 2003
Давайте закроем наш браузер, это окно тоже закроем, вернёмся к конструктору и создадим новую страничку, для того, чтобы разобраться с очень интересным механизмом сводных таблиц, Office. Закроем. Давайте отложим это до следующего урока.
10.6. Создание сводной таблицы Панель инструментов сводной таблицы Как я и обещал, на этом уроке мы будем работать со сводными таблицами. Нажимаем кнопку, Создать и в режиме, Конструктора, в качестве источника данных, выберем ту же таблицу, PEcom. Нажимаем, OK и теперь будем перетаскивать не отдельные поля, а сразу целую таблицу. Как видите, свою работу начинает, Мастер макета и нам предлагается выбрать, что мы, именно, хотим сделать. Здесь мы можем выбрать, В столбец, Ленточный вариант, в том числе и Сводная таблица, нажимаем, OK и вот наши данные, но представленные уже в табличном виде. Перетащим, например, вот сюда, растянем, ещё. Здесь тоже растянем. Пока мы имеем стандартную картину самой обыкновенной таблички, за исключением того, что у нас, около имён полей появились кнопочки вызова списков. Вот они. Если вы работали в Excel с автофильтром, то вы видели ту же самую картину и, разумеется, смысл этой картинки тот же, чтобы мы могли вставлять какие-либо фильтры. Пока, посмотрим в том виде, которая сейчас на экране. Вызовем в режиме просмотра, нажмём, например, левой кнопкой мыши вот сюда. Как видите, у нас выделены все фамилии. Сейчас не выбрана ни одна, выделим, предположим, Абрамова и нажимаем, OK. У нас только одна Абрамова, а соответствующая кнопка стала синей. Снова щелчок левой кнопкой и отмечаем, Все, OK. Ту же самую операцию мы можем сделать с любой из таблиц. Давайте то же самое проделаем и с, Городом. Открываем, всё удалим и выберем, Москва. Как видите, в списке у нас только москвичи. С этой таблицей мы можем свободно работать, можем даже переместить столбцы, выделять, копировать в буфер, разумеется, правой кнопкой вызывая контекстное меню, можем выделять строки, специально для этого здесь у нас есть небольшой такой столбец. Давайте пока вернёмся в режим конструктора и вызовем контекстное меню. Щелчок правой кнопкой и, в конце этого списка мы видим, Команды и параметры. Открывается, ещё незнакомое нам диалоговое окно, которое имеет несколько вкладок. Первая вкладка Формат. Здесь мы можем изменить формат наших столбцов. Выберем, например, TABNO, и пусть данные в этом столбце будут отображаться жирным шрифтом. Нажимаем, Жирный. Давайте перейдём на вкладку, Настройка. Здесь, в области, Отображать, мы можем выбрать, Панель инструментов. Как видите, сразу же появляется соответствующая панель. Посмотрим, что у нас получилось. Вот наша панель. Здесь есть кнопка, Автофильтр, но пока трогать её не будем. Есть также кнопка, Автовычисления. Как вы помните, в столбце, TABNO, числовые значения. Давайте выберем вот эти три и нажмём кнопку, Автовычисления. Нам предлагается суммировать, узнать количество значений, минимум, максимум, среднее, стандартные отклонения, даже дисперсию и так далее. Давайте посчитаем сумму. Спустимся вниз. И вот здесь мы видим сумму для всего столбца. Клавишей DELETE, мы можем удалить эту строку, если она нам больше не нужна. Давайте снова перейдём к началу нашей таблицы. Тоже самое, мы можем сделать и с другим столбцом, например, столбцом, DROD, где содержатся даты рождения. Выберем столбец, Сумма, Минимум. По-
Глава 10. Страницы доступа к данным.
257
смотрим на результат. Мы выбрали минимум, значит это дата рождения присутствующего здесь, самого старшего, нашего товарища. Как видите, здесь всё осуществляется достаточно просто и наглядно. Сводная таблица имеет и другие интересные свойства. Давайте продолжим наше знакомство со сводными таблицами. Откроем нашу табличку в режиме просмотра. Здесь, на панели инструментов, есть также кнопки, Сортировка по возрастанию и Сортировка по убыванию. С подобными кнопками вы, конечно же, уже знакомы, поэтому мы их не будем рассматривать. Давайте, как и в предыдущих случаях во время отчётов, например, попробуем группировать наши записи, допустим, по городам. Для этого делаем следующее, выбираем весь столбец, именно тот столбец, по данным которого мы собираемся произвести группировку, нажимаем правую кнопку мыши и, в открывшемся меню, нам предлагается, Перейти в область строк, Перейти в область столбцов, Перейти в область фильтра. Нажимаем, Перейти в область строк. Как мы видим, получили, именно, группировку. Здесь есть кнопки показать и скрыть детали. Кнопка минус скрывает, а кнопка плюс показывает. Это, именно то, что мы хотели получить. Чтобы вернуться к прежнему виду нашей таблицы, делаем следующее: левым щелчком мыши выбираем столбец, нажимаем правую кнопку и опять переходим в область деталей. Но, как видите, наш столбец был добавлен в самом конце, а не в том месте, где стоял раньше. То же самое, разумеется, мы можем сделать и по именам: левый щелчок, правый, Перейти в область, давайте опять, строк, потому что в случае со столбцами дело обстоит, именно, также, но такой вид нам более привычен. Тоже самое. Правая кнопка, Перейти в область деталей. Разумеется, мы можем произвести группировку по нескольким столбцам. Давайте скомбинируем группировку по городу и по имени. Давайте, сначала по городу, а потом и по имени. Как видите, группировка идёт у нас сначала по городам. Здесь, кнопки плюс и минус, как в случае с отчётами. И здесь такие же кнопки, плюс и минус, чтобы показать и скрыть детали. Поочерёдно вернём наши столбцы в область деталей. Когда мы выбираем какой-нибудь столбец, давайте выберем столбец имён, и нажимаем правую кнопку, нам здесь также предлагают - Перейти в область фильтра. Щелчок левой кнопкой мыши и смотрим, что у нас получилось. Это и есть область фильтра. С помощью левого щелчка на этой кнопочке со стрелочкой, открывается такое же меню, как и в случае с этими кнопками и дела здесь обстоят, практически, также. Например, хотим, чтобы выводились все Аллы, нажимаем, OK. Вот Алла, и здесь все Аллы. Выделяем, Все, OK, и подобным же образом, то есть, правый щелчок и, Перейти в область деталей, нашу таблицу переводим в прежнее состояние. Давайте сохраним нашу таблицу. Как вы помните, я сохранял наши странички в папке Сергей, а в качестве имени, например, Svod, Сохранить. Как видите, работа со сводными таблицами довольно таки удобная и если вы знакомы с работой сводных таблиц в приложении Microsoft Excel, то вы сможете легко разобраться и в данной ситуации.
10.7. Области и промежуточные итоги Имена полей сводной таблицы На этом уроке мы продолжим наше знакомство со сводными таблицами, а также поговорим о промежуточных итогах и узнаем, как переименовывать поля сводной таблицы уже в режиме просмотра. Давайте откроем нашу страничку в режиме просмотра. Существует даже, по-моему, более простой метод группировки, в отличие от того, который мы применяли на прошлом уроке. Для этого в любом месте нажимаем правую кнопку мыши, выбираем пункт, Команды и параметры. На вкладке, Настройка, в отделе, Отображать, мы имеем также возможность отображения, Области.
258
TeachPro Microsoft Access 2003
Как видите, здесь добавились некоторые области. Это окно пока закроем. Как вы помните, на прошлом уроке, чтобы провести группировку, например, по имени, мы выбирали данный столбец, нажимали правую кнопку, а затем, в зависимости от того, какую группировку мы хотели делать, нажимали на, Перейти в область столбцов или строк. Но, сейчас у нас есть более простой вариант. Давайте посмотрим, что здесь написано: перетащите сюда поля строк. Значит, просто берём данный столбец, разумеется, если мы хотим группировку по имени, и перемещаем в соответствующую область. Как видите, у нас получается абсолютно такой же результат, как и в предыдущем уроке. Чтобы вернуть таблице прежний вид, мы должны просто перетащить данный столбец в то место, где столбец находился раньше. Таким же образом можно перетащить любую таблицу вот сюда. Здесь тоже написано, Перетащите сюда поля столбцов. Это тоже знакомая нам картина и прежний вид таблицы возвращается тем же способом. Давайте поместим вот сюда. У нас имеется и вот такая область, Перетащите сюда поля фильтра. Давайте будем фильтровать по городам. Для этого делаем следующее: выделяем столбец, и опять держа левую кнопку мыши, перемещаем вот сюда. Как видите, во всех трёх случаях появляется синий прямоугольник. Вот, нажимаем на эту стрелочку, сейчас у нас выбраны все города. Отменим выбор и, например, выберем город Калининград. Нажимаем, OK и у нас идёт сортировка по городу Калининград. Как вы помните, на прошлом уроке мы не стали смотреть результат работы этой кнопки, Автофильтр и оставили её в покое. Но вот пришло время нашего знакомства и с этой кнопкой. Давайте сначала выберем, Все, нажмём, OK. Если нажимаем на эту кнопку, то фильтрация меняется, то есть, если мы выберем какой-нибудь город, нажмём, OK, эта кнопка автоматически включается. Если щёлкнуть ещё раз по ней левой кнопкой, то наша фильтрация как бы отменяется, и мы видим уже все города. Мы уже привыкли к именам наших полей, TABNO, FAM, IM и так далее. Если кто-то открыл нашу страничку в своём браузере, то у него могут возникнуть некоторые вопросы относительно этих имён и поэтому здесь предусмотрена возможность замены этих имён, именно, в браузере, то есть во время текущего сеанса. Для этого делаем следующее. Щелчком левой кнопки выделяем столбец соответствующего поля, нажимаем правую кнопку, опять открываем диалоговое окно, Команды и параметры. Здесь, как видите, есть вкладка, Заголовки. Например, мы отметили, Заголовок FAM, столбец фамилий и здесь видим текущую надпись этого заголовка, FAM, вот. Давайте напишем что-нибудь другое, например, Фамилия. Пока закроем это диалоговое окно. И мы здесь уже видим не FAM, а Фамилия. Отменим возможность нашей фильтрации и проведём группировку по городам. Как вы помните, мы уже пользовались вот этой кнопкой, Автовычисления, воспользуемся им ещё раз. Щелчком левой кнопки выбираем, DROD, то есть, даты рождения, из соответствующего меню кнопки Автовычисления выберем, например, Максимум. Как видите, в конце каждой группы, вот здесь, появляются соответствующие итоги. Нам понятна надпись, Максимум DROD, поскольку мы выбрали максимум и столбец DROD, то есть, максимальное значение этого поля. Это дата рождения самого младшего представителя данной группы. Давайте опять вызовем нашу страничку в режиме конструктора. Вообще, как и в случае, когда мы работали со страничкой со сводными таблицами, здесь мы тоже можем добавлять поля из другой таблицы. Как вы помните, на прошлом уроке мы добавили поле INDEX из таблицы IND. Попробуем сделать тоже самое и здесь. Щелкаем левой кнопкой и перетаскиваем, предположим, вот сюда. Сразу же открывается, уже знакомое нам окно, Мастер отношений и по тем же мотивам мы выбираем в таблице IND поле NO, то есть, номер, а в таблице PEcom поле TABNO.
Глава 10. Страницы доступа к данным.
259
OK, то есть мы сообщили Access каким образом хотим связать эти две таблицы. Вызовем в режиме просмотра. У нас отображаются индексы. Всё, вполне, понятно. Вообще, страницы доступа к данным в Access 2002 имеют ещё и другие интересные свойства, интересные возможности, в частности, диаграммы, но с ними мы познакомимся на следующем урок.
10.8. Диаграммы и сводные таблицы На этом уроке мы познакомимся с очень интересным компонентом страниц доступа к данным, а именно, с диаграммами. Давайте поступим следующим образом. Сузим нашу таблицу, разумеется, это делается с помощью левой кнопки, и растянем наш несвязанный раздел. По-моему, хватит. На, Панели элементов есть элемент, Диаграмма Office. Поместим этот элемент вот здесь. Как видите, я не отпускаю левую клавишу мыши. Так, происходит как бы рисование. Со всеми другими подобными элементами поступают также. Растянем вот так, нажимаем правую кнопку и, в открывшемся меню, выбираем, Список полей. Поскольку этот список мы вызываем в первый раз, то нам предлагается выбрать источник данных для нашей диаграммы. Выберем третий вариант, а именно, источником данных будет, Сводная таблица, Сводная таблица ноль. Именно, с таким внутренним индексом выступает эта наша таблица. Это окно пока закроем и сразу же перейдём в режим просмотра. Наша диаграмма пока что пуста, а мы переходим к нашей сводной таблице. Давайте в нашей таблице проведём группировку, например, по именам. Нажимаем левую кнопку, потом правую и, Перейти в область строк. Здесь всё, вполне, понятно. Мы это уже не раз делали, причём, разными вариантами. И здесь сразу же, автоматически появляется вот такая куча надписей. Чтобы можно было разобраться в них, с помощью стрелки вот на этой кнопке, которая появляется здесь тоже автоматически, мы можем выбирать нужные нам имена. Давайте выберем не, все, а несколько популярных имён. Например, Александр, Алексей, Алла, Анна, Андрей и ещё Владимир. Вот, OK. Сейчас мы видим только эти шесть имён, но эта область, по-прежнему пуста, поскольку мы должны также указать данные, по которому будет строиться диаграмма. В качестве данных, давайте выберем количество наших товарищей с такими именами. Для этого выбираем любой столбец и нажимаем на кнопку, Автовычисление. Здесь нам предлагается только один вариант, остальные мы не можем применять, а именно, Количество значений. Как видите, вот в этом списке, появившемся здесь, как бы, по инициативе нашей диаграммы и предназначенной для работы, именно, с диаграммой, сразу же появляется новое поле, Итоги, и в качестве итога, Количество значений "FAM", так как мы выбрали столбец "FAM". Левой кнопкой перетащим вот сюда. Как видите, здесь есть надпись, Перетащите сюда поля данных. И вот, наша диаграмма уже начинает выдавать нам нужную информацию о количестве имен: Александр, Алексей, Алла, Анна, Андрей и Владимир. Вы видите, что здесь есть ещё области с надписями, Перетащите сюда поля фильтра и ещё, Перетащите сюда поля рядов. Давайте, в качестве фильтра, выберем город и посмотрим, в каком городе, сколько людей с такими именами. Разумеется, имена мы тоже можем менять. Для демонстрации, давайте, добавим ещё Василия. Сразу же добавляется. Вот Василий. Когда мы работаем с диаграммой, автоматически появляется этот список. Нет списка, вот список. Как я уже говорил, давайте поместим вот сюда города, то есть, поле CITY. Это делается, как обычно, левой кнопкой, но результат абсолютно такой же, как и до фильтрации, потому что у нас здесь отмечены, Все города. Давайте отменим и посмотрим на результат только по Москве. Отмечаем, Москва, OK. Разумеется, можно фильтровать по нескольким городам, OK. Здесь мы видим результат по нескольким городам объединённым, но можно ра-
260
TeachPro Microsoft Access 2003
ботать и по-другому. Для этого перетащим наш элемент вот сюда и, как видите, у нас результат изменился, а именно, для каждого города данные выдаются отдельно разными цветами. Александры, Алексеи, Андреи, Аллы, Анны, Василии и Владимиры проживают во всех городах. Для наглядности, давайте выберем ещё большее количество городов. Результат уже другой. Для большей наглядности добавим ещё несколько имён: Виктор, Виктория, Вероника, Вера, Валерия, Валерий, Альбина, Анатолий. И вот, мы видим уже другую картину. Я вот это поле перетащил отсюда. Можно проводить фильтрацию и по другим критериям, например, по фамилиям. Отменим всё, отметим, Александрова, поскольку это довольно популярная фамилия, нажмём, OK. Как видите, людей, вот с этими, выделенными именами, в этих выделенных городах и с такой фамилией у нас просто нет, и поэтому на диаграмме ничего не отображается. Вы видите, что работать с диаграммой довольно таки удобно и очень легко во всём разобраться. Давайте сохраним нашу страницу.
Глава 11. Основы программирования на VBA
261
Глава 11. Основы программирования на Visual Basic for Application 11.1. Виды модулей. Преобразование макротаблицы в модуль С этого занятия мы начинаем изучение самой большой и важной темы по работе в Access - это программирование на языке Visual Basic for Applications и, соответственно, такого объекта, как модуль. Модуль - это контейнер для кода программы, которую написали вы или, возможно, не сами написали, а импортировали из какого-либо внешнего источника или получили путём конвертирования написанной вами макротаблицы в модуль. Ну, как бы там ни было, модуль - это то, что хранит текст вашей программы. Подобным же образом это происходит и в Word, и в Excel. И Word, и Excel имеют Модули для хранения макропрограмм тоже на языке Visual Basic for Applications. Но единственное и принципиальное отличие Access заключается в том, что в Access вы не можете записать Модуль.Давайте, перейдём к Модулям. Щелчок мыши - и, как видите, Модуля у нас пока что нет, но зато у нас есть Макрос. Перейдём к Макросам. Вот. Мы можем сохранить этот Макрос как модуль щелчок правой кнопкой, открывается меню - Сохранить как и - как Модуль. Нажимаем OK. Нам предлагается выбор добавить ли программу обработки ошибок (добавить) и примечание Макросов (тоже добавить), хотя в нашем Макросе примечаний попросту нет. Щелчок мышью (Преобразовать). Как видите, сразу же запускается редактор Microsoft Visual Basic и выдаётся сообщение о том, что преобразование закончено. Нажимаем OK. Вот здесь в окне Project-first (first - это имя нашей базой данных) мы видим вот такой - Модуль Преобразованный макрос macLet. Но, вообще-то, у нас здесь имеются и другие окна, в частности, Properties, то есть свойства. Закроем это окно. Имеется также и окно Immediate. Пока закроем и это окно. Как я вам говорил, это и есть наш преобразованный Макрос. Давайте, откроем его. Это, конечно, можно сделать и просто двойным щелчком. Вот это и есть наш Модуль. Даже, не зная каких-либо ключевых слов Visual Basic, здесь мы можем очень легко найти знакомые нам термины, в частности, cboWhatToPrint. Как вы помните, это - название нашего combobox. А это (qLetter) - один из наших отчётов, а именно, отчёт в виде письма. Вообще-то, редактор Visual Basic является отдельным предложением, поэтому мы можем переключаться между Microsoft Access и Visual Basic клавишами Alt+F11, что является стандартом для всех программ семейства Office. Попробуем Alt+F11, и опять - Alt+F11. Давайте, пока закроем редактор и опять перейдём к Модулям. Как видите, у нас уже один Модуль имеется, это - преобразованный макрос macLet. У нас имеется Модуль вот с таким названием. Мы сейчас получили, так называемый, стандартный модуль. Иначе говоря, те Модули, которые вы видите на вкладке Модули, называются стандартными и обычно служат для объявления глобальных переменных, глобальных процедур и функций и тому подобное, которые должны быть видимы, как говорится, из любых других объектов нашей базы данных, то есть, должны быть глобальными. Кроме стандартных Модулей в Access имеются ещё три типа Модулей Модули форм, Модули отчётов и Модули классов. Давайте перейдём к формам. У нас уже имеется форма. Давайте откроем её, чтобы вспомнить. Закроем её, но пусть эта форма пока остаётся, а мы создадим - новую. Нажмём на кнопку - Создать. Тут уже выбран Конструктор. Ну, давайте на этот раз в качестве ис-
262
TeachPro Microsoft Access 2003
точника данных ничего не выберем, и наша форма пока не будет иметь источника данных. Нажимаем OK. Ну, как и следовало ожидать, это - пустая форма и она пока не имеет Модулей. Чтобы убедится в этом, давайте сделаем следующее. Из свойств формы, то есть с помощью вот этой кнопки выберем всё, хотя здесь уже было выбрано всё. Вызовем контекстное меню и выберем в нём команду Свойства. Теперь перейдём на вкладку - Всё и слегка прокрутим вниз. Вы видите, что в поле Наличие модуля выбрано - Нет. Здесь можно выбрать и Да. В этом случае наша форма будет иметь модуль, правда, абсолютно пустой, но это нам пока ни к чему. Мы снова выберем - Нет. Вы видите, что сразу же появляется вот такое сообщение о том, что все модули будут удалены. Наш модуль пустой, и я уже говорил, что он нам не понадобится. Поэтому подтверждаем - Да. Другим способом создания модуля является использование вот этой кнопки Программа. Если мы просто нажмём здесь мышью, то сразу же запустится редактор, в котором, мы можем уже вводить текст соответствующего модуля. Кроме того, мы здесь видим вот такую строку Form_ Форма1. Форма1, пока что, является названием нашей формы. Как вы помните, эту форму мы пока не сохраняли, поэтому и предлагается вот такое имя по умолчанию. Закроем пока окно этого редактора. Вы видите, что для нашей формы поле Наличие модуля уже содержит - Да. Давайте, снова выберем - Нет. Появляется то же сообщение. Отвечаем - Да. И теперь, давайте, рассмотрим ещё один способ создания модуля, а именно, путём обработки некоторых событий, связанных с каким-либо элементом. На нашей панели элементов включена вот эта кнопка, которой обусловлена работа Мастеров. Но мы отключим эту кнопку мы не нуждаемся в помощи Мастеров. Поместим на нашей форме вот такую обыкновенную кнопку. Щелчок мышью - и здесь мы, попросту, рисуем, как и всегда, вот так, например. Как видите, вот это наше диалоговое окно свойств уже является окном свойств - для этой кнопки. Если же мы закроем его (или, если оно уже было закрыто до того), то потом уже сможем открыть это окно, как и обычно, следующим образом. Воспользуемся контекстным меню, выберем Свойства и в появившемся окне перейдём на вкладку События. Если теперь мы выберем какое-либо событие, например Нажатие кнопки (как бы, самое понятное из них), то у нас активизируется вот эта кнопка - Построить. Нажимаем мышью - и нам предлагают выбор что именно мы хотим построить. Выберем Программы и нажмём ОК. Опять-таки запускается редактор Visual Basic, но здесь уже область не абсолютно пустая, а содержит вот такие вот строки. Это обусловлено тем, что мы пожелали обработать Нажатие кнопки. Это была Кнопка0 (именно с таким индексом выступает наша кнопка) и Click, то есть, щелчок (нажатие кнопки). Снова закроем редактор и перейдём к нашей форме на вкладку - Всё. Вы видите, что наша форма опять имеет модуль. Ну, подобным образом можно создать модуль и для отчётов. Но для отчётов, как правило, модули нужны значительно реже. Сейчас нам не нужен модуль этой формы. Наше первоначальное знакомство с программированием будет происходить в стандартном модуле, который всегда легко и просто можно достать. Поэтому в поле Наличие модуля выберем Нет. Открылось хорошо нам знакомое диалоговое окно. Ответим - Да. Давайте, переименуем нашу кнопку в Старт. В качестве имени для нашей кнопки выберем вот такое название - cmd, так принято называть кнопки, то есть, названия почти всегда начинаются вот с этих трёх букв, ну, и, например, - Start. Сохраним нашу форму под названием, допустим, frmStr. ОК. Разумеется, пользователю модульное программирование может показаться более сложным по сравнению с написанием макротаблиц, так как здесь интерфейс - английский. Чтобы убедиться в этом, мы опять перейдём к нашему редактору Visual Basic (Alt+F11). Вот, вы видите, что здесь весь текст - английский, в отличие от макросов, где мы могли выбирать русские названия соответствующих действий Access.
Глава 11. Основы программирования на VBA
263
Но, тем не менее, согласно компетентным источникам, Microsoft, вот-вот, устранит такое средство, как макропрограммирование в базах Access. Макропрограммирование было введено как удобное средство для начинающих пользователей, а также для администраторов баз данных, которым было недосуг изучать ещё один язык программирования специально для работы с Access. Посредством макропрограммирования на самом деле решалось большинство насущных задач баз данных, особенно в тех случаях, когда пользователи сами для себя создавали соответствующие программы. Макропрограммирование всегда имело и до сих пор имеет ряд существенных недостатков, а именно, крайне слабые возможности для обработки ошибок, слабые возможности по установке диалога с пользователем и так далее. И, вообще, Microsoft уже давно намекает, что уже пора отказаться от устаревших настольных баз данных, то есть, от форматов, подобных dBase, Paradox и так далее. Давайте, перейдём обратно к Microsoft Access с помощью комбинации клавиш Alt+F11. Перейдём к нашим модулям. Пусть этот модуль пока остаётся, а мы нажмём на кнопку - Создать. Открывается окно редактора, но со всем тем, что мы сейчас видим на экране, мы ознакомимся на следующем урок.
11.2. Окно редактора Visual Basic for Application Подокна. Текст. Комментарии На этом уроке мы с вами начинаем знакомство с окном редактора Microsoft Visual Basic. Перед нами - окно, которое называется Project Explorer. Оно используется для перехода между различными нашими объектами. Мы, разумеется, можем его закрыть, если считаем это нужным. Мы можем и открыть его снова, выбрав пункт меню View (Просмотр), а затем - Project Explorer. Можно, конечно, и воспользоваться просто комбинацией клавиш Ctrl+R. Как видите, объекты тут представлены в виде дерева,и в папке Модули мы имеем, например, модуль с именем Модуль 1. Это - наш текущий модуль, который мы сами создали. Ещё здесь имеется модуль - Преобразованный макрос macLet (вот такое название модуля). При первом запуске редактора Visual Basic у нас тут имелись и другие окна, например, окно Immediate. Попробуем его открыть снова. Выбираем пункт меню View, а в нём - команду Immediate Window. Это - окно немедленных вычислений, которое, я думаю, является весьма полезным. Это окно позволяет производить вычисления значений различных переменных и выражений, а также позволяет работать даже просто в режиме калькулятора, если вам это нужно. Сейчас мы просто закроем это окно, поскольку не собираемся переходить между различными объектами. Можем закрыть и окно Project Explorer. Вы видите здесь единственную строку текста - Option Compare Database. Это - инструкция, устанавливающая порядок сравнения текстовых строк, и в данном случае означающая, что для сравнения текстовых строк используется параметр базы данных. Эта строка в данной ситуации нам не особо нужна, но она и не помешает. Над окном модуля находится список выбора объектов (у нас сейчас, как видите, в модуле нет ни одного объекта) и список выбора процедур (здесь имеется только одна строка Declarations). И данная строка, собственно говоря, к этой области и принадлежит. Поэтому, если мы выбираем Declarations, курсор становится в соответствующее место первой строки. Вот - наш курсор. Что же касается, собственно, окна модуля, то в нём работает самый обыкновенный текстовый редактор, в котором, можно себя вести достаточно привычным образом. То есть, работа с текстом, в принципе, производится так же, как и, например, в редакторе Word, за исключением некоторых
264
TeachPro Microsoft Access 2003
принципиальных отличий. Например, если я напишу здесь Это текстовая строка и нажму на клавишу Enter, то после попытки завершить строку сразу же появится вот такое диалоговое окно. В данной ситуации, поскольку это никоим образом не является строкой программы, поэтому редактор Visual Basic, разумеется, обнаруживает ошибки компиляции и ожидает конец выражения. Нажмём ОК. И, чтобы больше не было таких вопросов, объявим нашу текстовую строку комментарием. Для этого снабдим её знаком апостроф вот таким образом. Всё, что начинается знаком апострофа, является комментарием и может содержать абсолютно произвольный текст, корректность, которого редактор и не проверяет. Впрочем, если мы, вызовем сейчас окно Project Explorer, и перейдём в другой наш модуль, давайте, сделаем это с помощью комбинации клавиш Ctrl+R, и - вот наш модуль, то мы увидим такие строки зелёного цвета, начинающиеся с апострофа. Например, вот эта строка. Эти строки тоже - комментарии. Разумеется, все эти зелёные строки являются комментариями. Они необходимы, если вы пишите много программ. Хотя, работая в Access, не так уж много приходится писать комментариев. Но, чем подробнее комментирована ваша программа, тем лучше для вас и, особенно, для других. Что же касается других цветов, то, как вы видите (вот здесь, здесь и здесь), ключевые слова Visual Basic for Applications, выделяет, синим цветом, а остальной текст пока идёт чёрным цветом. Плюс ко всему, в модуле возможно ещё и наличие некоторых других цветов, которых в этом модуле сейчас пока нет. Вернёмся в наш Модуль 1 и закроем окно Project Explorer. Разумеется, с текстовой строкой вы можете поступать, как и привыкли. Например, если мы выделим эту строку с помощью клавиш Shift+стрелка Вправо, то затем сможем скопировать её в Буфер обмена (это можно сделать и с помощью комбинации клавиш Ctrl+Ins). Теперь перейдём на следующую строку с помощью Shift+стрелка Вниз и вставим сюда содержимое Буфера обмена (это можно сделать и с помощью комбинации клавиш Shift+Ins). Это можно сделать сколько угодно раз. Здесь можно также и удалить строку с помощью клавиш Ctrl+Y. Для этого перейдём на строку выше. Допустим, мы хотим удалить вот эту строку. Нажимаем Ctrl+Y. То же самое проделаем и с другой строкой. Если вы хорошо знаете Word, то, наверняка, знаете, что там эта клавишная комбинация соответствует Отмене Отмены. И, соответственно, нажатие клавиши - Tab, в отличие от Word, не приводит к вводу знака табуляции в текст, а приводит к вводу четырёх пробелов. Поскольку, текст программы, принято формировать с различным отступом для того, чтобы легче было обнаружить начало и конец циклов, начало и конец процедур и так далее. Давайте, удалим и эти строки Ctrl+Y, Вверх, и ещё раз - Ctrl+Y. Теперь введём вот такой текст Sub First. Нажмём на клавишу Enter. Как видите, редактор добавил вот такую строку. Дело в том, что, как только мы нажали Enter, редактор Visual Basic определил, что ключевое слово Sub обозначает подпрограмму. А First в данном случае является именем этой подпрограммы. А после этого, чтобы мы не упустили этого, и было добавлено выражение End Sub, что означает конец подпрограммы. Между Sub и End Sub, мы будем располагать, так называемое, тело процедуры или тело подпрограммы, которое будет содержать нужные нам инструкции. Пока у нас подпрограмма ровно никаких действий не выполняет, хотя вполне может быть и запущена. Запускать мы будем или с помощью команды RunRun SubUserForm, или с помощью вот этой кнопки, что то же самое. Как видите, никаких действий не происходит. Ну, чтобы долго не возиться, воспользуемся готовым текстом программы, точнее, одной строкой. Для этого снова откроем окно Project Explorer с помощью клавиш Ctrl+R. Выберем Преобразованный макрос. Вот здесь имеется вот такая строка, которая, как бы, и отвечает за вывод нашего письма в режиме просмотра.
Глава 11. Основы программирования на VBA
265
Выделяем эту строку (разумеется, кроме стрелок можно использовать и клавишу End). Копируем (Ctrl+Ins). Переходим снова к нашему модулю, закрываем это окно и ставим вот сюда. Переходим к началу, нажимаем - Tab для отступа (попросту для красоты). И - наша программа уже готова, а, точнее, только подпрограмма (ну, мы не должны забывать о том, что это только начало нашего знакомства с Visual Basic). Поскольку соответствующий отчёт имеет источником данных запрос вот - этот отчёт, вы должны помнить, что он представляет собой, я говорил вам о нём и на предыдущем уроке. Итак, отчёт имеет источником данных запрос, а параметром для запроса, вернее, критерием для запроса является состояние формы, поэтому при попытке выполнить эту программу у нас возникнут вопросы по поводу ввода параметров. Мы можем выполнить подпрограмму прямо отсюда соответствующей командой пункта меню Run. Выбираем эту команду RunRun SubUserForm. Как видите, мы должны определить критерий для нашего запроса. Напишем здесь 8, поскольку я помню, что у нас есть товарищ именно с таким номером, то есть, с таким значением поля Tabno, и нажмём кнопку ОК. Давайте, перейдём к Access с помощью клавиш Alt+F11. Как видите, соответствующий отчёт у нас уже открыт. Вернёмся к нашему редактору. Как вы и убедились, наша подпрограмма выполнила свою функцию. А теперь удалим эту строку с помощью клавиш Ctrl+Y, освободим место между концом и началом нашей подпрограммы для того, чтобы вписать между ними что-либо. Вообще-то, мы хотели на первых порах позаниматься с той формой без источника данных, которую мы только что создали, а точнее, не только что, а на предыдущем уроке, которая называется frmStr. Допустим, мы бы хотели, чтобы при нажатии кнопки на нашей форме в соответствующем текстовом поле, которое мы тоже собираемся там поставить, появилось бы слово, допустим, Привет. Мы это сделаем на следующем урок.
11.3. Процедура. Имена процедур обработки событий На этом уроке мы начинаем наше знакомство с процедурами. Давайте, опять вернёмся к Access с помощью клавиш Alt+F11. Перейдём к формам и вызовем нашу форму frmStr в режиме конструктора. Кнопка Старт, пока не связанно ни с какими макросами или модулями. Мы поступим следующим образом. Нажимаем правую кнопку, открывается контекстное меню, выбираем команду Обработка Событий. Начинает свою работу Построитель, выбираем Программы и нажимаем кнопку OK. Если кнопке раньше никакие макросы не были назначены, то сразу создаётся новый модуль этой формы, в силу того, что форма раньше не имела модуля. Нам предлагается заготовка для процедуры Обработка события Click. Вот эта процедура, то есть, нажатие кнопки. Каждый элемент управления имеет некоторое событие по умолчанию, для которого сразу создаётся заготовка, как только вы задали Обработка событий. Типы событий рознятся у разных элементов управления. С некоторыми видами событий мы, разумеется, познакомимся. Сейчас мы бы хотели, чтобы наша кнопка при нажатии выполнила бы ту процедуру, которая у нас находится в Модуле 1, то есть, вызвала бы некоторый отчет на предварительный просмотр. Это очень просто. Давайте, сначала перейдём к Модулю 1. Вот процедура с именем First. Вернёмся обратно. Нажимаем клавишу Tab, попросту для подступа, и пишем... Снова вернёмся к Access, чтобы проверять, как работает наша кнопка (нажимаем Alt+F11). Вызываем форму в режиме просмотра и нажимаем Старт. Как видите, возникла ошибка. Причиной этой ошибки является то, что название нашей процедуры First совпадает с именем нашего проекта, в данном случае, с именем
266
TeachPro Microsoft Access 2003
базы данных. До сих пор с этой проблемой мы не сталкивались, но решить эту проблему можно только одним способом. Нужно просто дать другое название нашей процедуре. Вернёмся в Модуль 1 (сначала нажимаем OK). И - переименуем, например, в Fr. Удаляем при этом ненужные буквы. Пусть наша процедура будет называться Fr. Вернёмся к модулю формы. Поскольку ошибка находилось в этой процедуре, поэтому редактор жёлтым цветом автоматически выделяет имя (заголовок процедуры). Чтобы удалить это жёлтое выделение, нам придётся нажать на эту кнопку мышью и написать здесь просто Fr. Попробуем теперь нажать на кнопку. Снова переходим в Access, открываем форму и нажимаем Старт. Ну, поскольку мы должны вести номер, как вы помните, Tabno, для нашего соответствующего отчёта, точнее, для запроса, который является источником данных для нашего отчёта. Выделим здесь, например, 128 и нажмём OK. Ы видите, что всё здесь нормально. А вот и наш отчёт. Свернём и вернёмся Visual Basic (опять - Alt+F11). Как видите, вызов процедуры находящейся либо в этом модуле, либо в другом, производится по имени, но при этом у нас имеется некоторое ассиметричное отношение между этими модулями. Наша процедура обработка событий сейчас находится в модуле формы (вот в этом модуле). Модули формы, как вы видите, помечаются значком формы в окне Project Explorer. При этом данная процедура обработки события вызывает подпрограмму по имени из стандартного модуля (вот из этого модуля), который пока называется Модуль 1. Все процедуры, размещённые в стандартных модулях по умолчанию, считаются выделенными из всех других модулей, и поэтому могут быть вызваны. Если бы ситуация была бы обратной, и мы бы пытались вызвать из Модуля 1 процедуру, находящуюся в модуле формы, то было бы выведено сообщение о том, что процедура не может быть выполнена, в силу того, что не найдена или не определена. Иными словами, процедуры стандартных модулей стандартно видимы отовсюду. Процедуры модулей классов, модулей форм и модулей отчётов видимы только на уровне этого модуля. Поскольку в развитом приложении Access объявляется очень много процедур, то для наглядности можно использовать слово call, то есть, вызвать. Добавим вот здесь слово - call и, разумеется, отделим пробелом, поскольку это - разные слова, и посмотрим, как работает наша кнопка теперь. Опять-таки, воспользуемся клавишами Alt+F11 и снова - 128. Всё выглядит так же, то есть, всё работает нормально. Теперь вернёмся к Visual Basic. Ну, вообще-то, если мы посмотрим на процедуру Fr Модуля 1, то состоит она только из одной строки и, как бы, в прикладном смысле особого смысла она, практически, не имеет. Поэтому мы можем попросту выделить эту единственную строку в этой подпрограмме (в этой процедуре) с помощью клавиш Shift+End и скопировать в буфер обмена с помощью клавиш Ctrl+Insert, да и удалить. Вернёмся к Form_frmStr, выделим эту строку на этот раз с помощью мыши и вставим из буфера вот такую строку. И понятно, что при нажатии кнопки произойдёт именно то, что и раньше, поскольку будет выполняться вот эта команда DoCommand Open Report, то есть, открыть отчёт (вот этот отчёт qLetter). Ну, и дальше идут соответствующие параметры, о которых мы пока подробно не будем говорить. А на следующем уроке мы продолжим наше знакомство с процедурам.
Глава 11. Основы программирования на VBA
267
11.4. Условие If. Блок If... then... Else На этом уроке мы продолжим наше знакомство с процедурами, а в конце познакомимся ещё и с процедурами If. Давайте, сначала вернёмся к Access, с помощью клавиш Alt+F11 и добавим вот в эту форму текстовую строку, выбрав соответствующий элемент с Панели элементов. Метку удалим и дадим элементу название. Для этого воспользуемся контекстным меню, выберем команду Свойства и в поле Имя введём название fldText. Окно закроем и вернёмся к нашему редактору. Здесь в списке объектов мы видим нашу кнопку, поскольку cmdStart - это название нашей кнопки, fldText - это имя нашего поля, саму форму, а также Область Данных. Но сейчас мы обрабатываем событие Click, но в списке событий имеется также и двойной щелчок, нажатие клавиши Enter, Exit, получение фокуса и так далее. Ну, допустим, мы хотим обрабатывать событие double click, то есть, двойной щелчок. Для этого следует попросту выбрать соответствующую строку из нашего списка. И - сразу же будет добавлена соответствующая процедура вот с таким названием. Как видите, в названиях процедур различие состоит только в этих трёх буквах Dbl. Попробуем эти буквы написать вот здесь. Ну, это пока удалим. И - Dbl. Мы хотим проверить, будет ли в данном случае наша процедура обрабатывать двойной щелчок на кнопке. Вернёмся в Access, вызовём форму в режиме просмотра и проверим, что произойдёт в случае двойного щелчка. Как видите, сразу же появляется сообщение о том, что выражение нажатия кнопки, введённое в поле свойств события, вызывает ошибку. Но, вообще-то, этого и следовало ожидать. Вернёмся к Visual Basic. Поскольку простое переименование ни в коем случае не приведёт к обрабатыванию новых событий. Поэтому удалим эти три буквы. Ну, вообще-то, мы поместили поле в нашу форму для того, чтобы кое-что туда поместить. Допустим, мы хотим туда поместить слово Привет. Давайте, превратим эту строку в комментарий, для чего вставим сюда апостроф. Теперь перейдём в конец строки с помощи клавиши End. А после нажатия клавиши Enter новая строка получат такой же отступ, как и предыдущие. И напишем вот такой оператор. Вернёмся к Access и посмотрим, как теперь работает наша кнопка. Сколько бы раз мы не нажимали на кнопку, каждый раз в строке (вот в этом поле), появляется слово Привет. Давайте, напишем что-нибудь другое. Опять нажмём. Вообще, удалим. Нажмём. То есть, кнопка работает нормально. При каждом нажатии в поле появляется слово Привет. Давайте, снова вернёмся к нашему редактору Visual Basic и попробуем следующее. Если мы уже имеем в поле слово Привет, то пусть это слово будет заменено словом - До свидания. То есть, как вы понимаете, здесь мы уже имеем дело с условием. Давайте, перейдём к нашему модулю Преобразованный макрос macLet. Поскольку там уже имеется подобное условие, то посмотрим, что оно представляет собой. Двойной щелчок и Home (чтобы перейти к началу строки). Вот оператор условия If, потом - какое-то условие, затем - Then, а в конце - End If. То есть, если выполняется вот это условие между словами If и Then, то могут выполниться несколько операторов, которые помещены между ключевыми словами Then и End If. Давайте, вернёмся к нашему модулю, перейдём к началу строки и напишем следующее If, Then, End If, затем снова нажмём на клавишу Tab, чтобы наш текст был более понятным. Мы написали следующее если выполняется это условие, то есть, если мы уже имеем слово Привет, то напишем, (хотя мы можем писать как строчными, так и прописными буквами, но, давайте, будем писать так, как привыкли). Теперь, давайте, попробуем нажать на кнопку Старт. Нажимаем Alt+F11 и видим, что здесь уже написано слово Привет, поскольку в предыдущий, раз мы уже нажимали кнопку Старт, что и приводило к
268
TeachPro Microsoft Access 2003
появлению этого слова. Давайте, нажмём ещё раз. Как видите, здесь мы уже имеем - До свидания. Опять нажимаем на кнопку Старт - ничего не происходит. Вернёмся к нашему редактору. Ну, поскольку, значение в fldText уже - До свидания, то после нажатия клавиши, поскольку вот этот оператор уже, как бы, возвращает отрицательное значение, то есть, fldText не равен Привет, то ничего и не происходит. Но эта проблема разрешима. Можно добиться того, чтобы слова Привет и - До свидания, как бы, чередовали друг друга. На этом уроке мы также ознакомимся с более развитым вариантом условий If с конструкцией If Then Else. Итак, пока наша подпрограмма анализирует текст поля fldText, и, если содержимым этого поля является текстовая строка Привет, тогда помещает в нём текстовую строку До свидания, в противном случае наша подпрограмма ничего не выполняет. Если вы помните, я говорил о том, что можно добиться и того, чтобы в случае, если там уже написано - До свидания, туда помещалась бы строка Привет и - наоборот. То есть, слова Привет и До свидания сменяли бы друг друга при каждом нажатии кнопки. Это можно реализовать разными способами, но самым простым и эффективным способом является следующий способ, можно просто добавить в условие If, которое сейчас формируется парой If Then End If, другое ключевое слово Else. Это условие по смыслу означает, примерно, следующее Иначе сделать то-то. Делается это следующим образом. Нажмём клавишу Enter, затем - Backspace и напишем слово Else. Теперь нажмём клавишу Tab для отступа и подумаем, что следует делать в том случае, если у нас там имеется слово, отличное от - Привет, допустим, До свидания или что-нибудь другое. Давайте, тогда поместим в поле fldText слово Привет. Для этого скопируем в буфер обмена вот такое выражение (такой оператор). Нажмем Ctrl+Insert, затем - Shift+Insert. Теперь посмотрим, как сейчас работает наша кнопка. Перейдём к Access и откроем форму. Как видите, здесь у нас пока это поле пустует, потому что мы ещё ни разу не нажимали вот эту кнопку. Давайте же, нажмём на неё. Привет, До свидания, Привет, До свидания и так, сколько угодно раз.Возвращаемся к редактору Visual Basic. Теперь сделаем следующее. Удалим, к примеру, вот такую букву - букву Т и посмотрим, как работает наша кнопка в этом случае. Как видите, обратного превращения слова никак не происходит. Дело в том, что в данном случае Access воспринял вот этот идентификатор не как имя элемента управления, которым он изначально и являлся (конечно, вместе с буквой Т), а как простую переменную. Поэтому без всякой задней мысли и присвоил этой переменной значение - До свидания. Эта переменная продолжает сейчас существовать в памяти и, строго говоря, ошибкой в программе это не считается. Хотя, как вы понимаете, наша форма перестала адекватно работать. Подобные ошибки встречаются достаточно часто. Кроме всего прочего такие ошибки могут возникнуть и просто в случае переименования элемента управления, если был упущен тот факт, что они уже были упомянуты в программе. Возможно, мы забыли, что какой-либо элемент управления упоминается в программе, и просто для удобоваримости его имени изменили это имя. Чтобы такую ошибку легче было обнаружить, всё-таки следует в модулях использовать ещё одну инструкцию. В начале в разделе Объявления, а именно, вот здесь, нажмём Enter и напишем вот такие слова Option Explicit. Эта опция запрещает использование необъявленных переменных. Если вы когда-либо создавали, например, модули в Excel, то, наверняка, знаете, что обычно соответствующая инструкция по умолчанию ставится в начале модуля. А, как работает опция в нашем случае, мы узнаем на следующем занятии.
Глава 11. Основы программирования на VBA
269
11.5. Инструкция Option Explicit Теперь посмотрим, как будет работать наша подпрограмма при наличии вот этой строки. Вернёмся в Access, откроем нашу форму и нажмём кнопку Старт. Как видите, сразу же выдаётся сообщение об ошибке Variable not defined, то есть, переменная не найдена. Соответственно, вот здесь Access сейчас выделил то место, где упоминается неизвестная ему переменная, и прервал выполнение программы. В данной ситуации это - один из способов обнаружения ошибки в программе. Закроем это диалоговое окно, вернём букву - Т. Чтобы вернуться к нормальной работе, нажмём вот эту кнопку. Вы видите, что жёлтое выделение сейчас исчезло. Вернёмся к нашей форме. Нажимаем. Вы можете убедиться, что всё теперь работает нормально. Возвращаемся к редактору Visual Basic. Вообще-то, чтобы требование объявления переменных модуля выполнялось всегда, в редакторе Visual Basic следует выбрать пункт меню Tools, затем - команду Options и на вкладке Editor установить флажок Require Wariable Declaration, который и означает требование объявления переменных. В этом случае в каждом новом модуле соответствующая строка будет проставлена автоматически. Мы пока не работаем с переменными, а просто используем исключительно ссылки на элементы управления. Поэтому, если мы не будем ошибаться при вводе имени элемента управления, то проблем у нас не будет. Ещё вот такое небольшое замечание, если Access узнаёт имя элемента управления, то он автоматически исправляет его на оригинальное имя. Например, если я напишу сейчас вот здесь fldText вот таким образом (Fldtext) и выйду из строки, то редактор Visual Basic автоматически изменит это название - на оригинальное. В принципе, для выполнения программы почти нет разницы между строчными и прописными буквами, но, повторяю, что лучше всего давать своим элементам подобные имена, то есть, сначала задавать пару букв, которые ассоциируются с типом элемента. Например, если это - поле (по-английски field), то лучше задавать fld, а если это - кнопка, по которой вы даёте какую-то команду, то - comand. Ну, делается это для того, чтобы ваша программа была понятной, особенно для других. Поскольку мы сейчас запретили использование необъявленных переменных, то, соответственно, например, если мы забудем поставить кавычки вокруг текстовых констант (удалим, к примеру, вот эту кавычку), которые мы намерены использовать в программе, то она тоже будет считаться переменной, и тоже появится сообщение об ошибке при попытке выполнить эту программу. Проверим это на примере. Вот - подпрограмма не может быть выполнена. Вернём кавычку на место и нажмём на эту кнопку. Поскольку ошибки могут возникать самыми разными способами, то для программы, особенно той, которая создаётся для другого пользователя, принято добавлять процедуру обработки ошибок. Это принято делать для всякой подпрограммы, которая вообще пишется, разумеется, кроме самых коротких, где ошибок практически не должно быть. Поэтому, если мы сейчас перейдем к нашему преобразованному макросу вот - папка Модули, а вот - Преобразованный макрос. Открывается он, как мы уже говорили, двойным щелчком мыши. Как вы помните, в момент преобразования мы задали Добавить программу обработки ошибок. Поэтому мы увидим вот такой оператор буквально во второй строчке соответствующей функции On Error GoTo macLet_Err. То есть, в случае ошибки нужно перейти к метке вот с таким именем. А соответствующая метка находится вот здесь. Это может быть любая ошибка во время выполнения процедуры, например, Необъявленная переменная, Не существует элемента, Несовпадение типов и т. д. Ошибки, как я уже говорил, могут быть самыми разными. И при любой ошибке производится переход вот к этой метке (о метках у нас состоится отдельный разговор, но это - попозже), а затем
270
TeachPro Microsoft Access 2003
уже выводится сообщение об ошибке, и выполнение программы продолжается, уже начиная вот с этой метки. А это - сообщение. После этого работа начинается с этой метки. И становится понятным, что при таком исходе наша функция попросту заканчивает свою работу. Давайте, опять вернёмся вот к этому модулю. Как видите, функция If - Then - Else - End If (вот - If, Then, Else, End If) обрабатывает 2 варианта один и - другой. Ну, соответственно, логика построения функции If примерно такова, как, например, функции Iif, которую мы использовали в Построителе выражений или функции - Если в электронных таблицах (то есть, условия что, если Да, и - что, если Нет). Разумеется, вариантов может быть и больше. При большем количестве вариантов мы будем использовать другой оператор, а именно, оператор перебора Select Case. Но об этом мы поговорим на следующем урок.
11.6. Блок Select Case На этом уроке мы ознакомимся с блоком Select Case. Для этого создадим новую форму в нашей базе данных Microsoft Access. Щелкнем на кнопке Создать. Конечно же, появляется вот такое стандартное окно по созданию новой формы, и здесь воспользуемся конструктором. Выбирать источник данных мы не будем. Щелкнем на кнопку ОК. И вот, появилась новая пустая форма, на которой введем несколько элементов. Это поле для ввода, в которое мы будем вводить какие-либо цифры.В зависимости от их значения, пусть в поле для ввода, которое мы введем в правой части для формы, выводится та же самая цифра, но уже прописью. Удалим теперь все те метки, которые появились рядом с окнами. В принципе, они сейчас нам только загромождают экран. Выделим их, щелкнем на кнопке Delete и на одной метке и на второй.А также введем управляющую кнопку, при нажатии на которую и будет происходить конвертация из цифры, введенной вот в это окошко, в ее значение прописью. Для этого нарисуем вот здесь вот такую кнопку. Автоматически появилось вот такое окошко, в котором нам предлагают выбрать, какое действие будет происходить при нажатии на этой кнопке. Это переходы по записям, обработка записи, работа с формой, ну и т.д. Те возможности, которые нам предлагает сейчас это окошко, мы задействовать не будем, они нам не нужны, и поэтому щелкнем на кнопке Отмена. Вот теперь наша форма приобретает тот внешний вид, который нас устраивает для решения нашей задачи. Зададим теперь имена для вот этих полей. Для этого выберем его свойства и в качестве имени зададим, например, просто переменную Х1. Закроем эти свойства. Откроем свойства второго поля с помощью правой кнопки мыши. Запишем здесь просто-напросто Х2. Закроем. В принципе, наша форма уже полностью готова. Мы можем ее запустить, щелкнув на кнопке Вид и вводить любые цифры или буквы, правда, при нажатии на вот эту кнопку никаких действий не произойдет. Переключимся обратно в режим конструктора. Теперь же нам нужно создать обработчик для нажатие вот на этой кнопке. Для этого выделим ее. Щелкнем на правую кнопку мыши. Выберем ее свойства и здесь во вкладке События, выберем пункт Нажатие кнопки, с которой мы и хотим связать соответствующие действия. У нас, конечно же, есть соответствующие макросы, которые мы создавали ранее, но сейчас они нам не нужны. Нам сейчас нужно написать программу непосредственно на языке Бейсик. Поэтому щелкнем на вот этих трех точках и выберем пункт Программы. Далее щелкнем на кнопке ОК. И мы автоматически переходим в редактор Microsoft Visual Basic и попадаем внутрь процедуры нажатия на кнопку. Здесь мы видим название нашей кнопки и затем то действие, при котором будет происходить выполнении наших операторов. Это нажатие на эту кнопку - Click. Теперь напишем оператор
Глава 11. Основы программирования на VBA
271
Case. Для этого введем отступ табуляции. Далее Select Case И далее то поле, на основе которого мы и хотим провести все наши действия. А это поле Х1. Далее щелкнем на кнопку Enter. Как мы видим, компьютер наши операторы Select и Case воспринял правильно, превратив их в слова, начинающиеся с большой буквы. Ну и далее, нам нужно непосредственно задать, что будет происходить при различных случаях перемены Х1. Напишем следующим образом: case 1, т.е. если перемены Х1 принимает значение 1, в этом случае двоеточие, и Х2 пусть принимает значение "один". Далее Enter и end case, закрывая этот оператор. Как мы видим, при попытке перейти на другую строчку компьютер выдал нам ошибку. Щелкнем на кнопке ОК и, конечно же, простонапросто нарушился синтаксис написания этого блока. Вместо end case нам нужно написать end select А теперь, переход на новую строчку, как мы видим, компьютер воспринял правильно. Чуть-чуть сместим при помощи табуляции эту строчку с случаем case 1. Ну и далее размножим эти строчки, написав еще и обработку для случаев, когда переменная Х1 принимает и другие значения, 2,3,4 и т.д. Для этого выделим эту строчку. Далее Ctrl+C, копировав в буфер обмена, далее Ctrl+V вставить. Вставим несколько раз и переделаем соответствующие цифры. Вместо 1 на 2, 3, 4 и т.д. Также, конечно же, нам нужно переделать соответствующие их значения на 2, 3, 4 , и т.д. В случае с 3, будет 3. Далее 4, 5. И вот, таким образом, мы заполнили весь наш оператор соответствующими строчками. Добавим еще одно значение. Для этого опять скопируем - Ctrl+С и Ctrl+V, которое будет характеризоваться при 0, для общности, чтобы так сказать пройтись по всем цифрам. Напишем 0. И теперь попробуем представить себе, как будет работать наша форма с вот этим обработчиком. Для этого перейдем в Microsoft Access, щелкнув на соответствующую кнопку. И далее запустим эту форму в режиме работы. Свойства этой кнопки нам теперь уже не нужны. Закроем это окно. Щелкнем на кнопке Вид. Напишем здесь какую-либо цифру. Например, цифру 2, и щелкнем на кнопке. Как мы видим, в соответствии с нашими установками, рядом с цифрой 2 появилось ее значение прописью - слово 2. Если мы напишем какую-либо другую цифру, например, 7, нажатие превращает ее в соответствующее текстовое значение. Ну и т.д. Но если мы здесь напишем какое-либо число, которое не представляет собой цифру от 0 до 9, то нажатие на нашу кнопку не выдает никакого значения, поскольку этого компьютер не понимает, вернее, конечно же, наша подпрограмма. Попробуем это изменить. Перейдем опять в режим конструктора. Далее перейдем на нашу программу. Для этого щелкнем на вот этой кнопке Программа, чтобы перейти в Visual Basic и напишем то значение, которое будет принимать это поле, поле Х2, в случае, если в поле Х1 нет ни одной из этих цифр. Для этого можно, например, написать следующим образом. В самом начале написать Х2 - равняется и то значение, которое мы хотим ему присвоить по умолчанию. К примеру, напишем "это не цифра". Попробуем теперь запустить опять нашу форму. Для этого перейдем в Microsoft Access и щелкнем на кнопке Вид. Если мы сейчас в нашем случае опять нажмем на нашу кнопку, то, конечно же, появляется вполне корректная запись, что 12 это не цифра. А вот если мы напишем 1, то эта цифра 1. 2 - цифра 2, а если мы введем какую-либо другую аббревиатуру, то это не цифра. Как мы видим, наша кнопка работает вполне корректно. При помощи блока Select Case, обрабатываются различные варианты в случае введения их вот в это поле, и в зависимости от этого вводятся различные значения в другое поле
272
TeachPro Microsoft Access 2003
11.7. Написание функций Познакомимся теперь с такими понятиями, как функции и как их используют их в Microsoft Access и Visual Basic. Для этого откроем вот эту Форму 1, в которой мы работали ранее. Щелкнем для этого на ней и далее на кнопке Конструктор. Вот появилась перед нами вот эта форма. Как мы помним, она преобразовывала веденное число в левой колонке при нажатии на вот эту кнопку в его значение прописью, в случае, если мы вводили в это поле цифру. Во всех остальных случаях она выдавала нам предупреждение о том, что это не цифра. Попробуем теперь для выполнения этой же задачи воспользоваться функциями. Для этого откроем сначала Visual Basic. Щелкнем на вот этой кнопке Программа. И вот мы сразу попали в то место нашей программы, в котором написан Обработчик на нажатие кнопки Кнопка 4 Click. Раздвинем чуть-чуть это окно, чтобы у нас было больше места. И с новой строчки напишем описание нашей новой функции. Для этого напишем ключевое слово function. Далее наберем имя нашей функции. Пусть это будет, например, Prop. И далее в скобках тот аргумент, который мы хотим передать нашей функции. Пусть это будет то число Num, которое мы хотим преобразовать в текстовый вид. Далее щелкнем на кнопке Enter. Как мы видим, наш компьютер автоматически предпринял некоторые действия при нажатии на эту кнопку, а именно: преобразовал ключевое слово Function к стандартному виду, написав первую его букву с большой буквы, и изменил его цвет, т.е. воспринял его уже как ключевое слово. А также приписал нам автоматически закрытие этой функции End Function. Все то, что мы напишем между определением функции и его концом, будет выполняться при обращении к нему. Ну, конечно же, эту функцию мы можем написать заново, но проще, конечно же, скопировать уже готовый кусок текста, который мы использовали ранее. Для этого выделим вот эти строчки при помощи мыши, проведя по соответствующим строкам, далее щелкнем на правую кнопку мыши, Сору. Теперь перейдем в нужное нам место. Правая кнопка мыши и Paste - вставка текста. Щелкнем на кнопке Delete, чтобы удалить лишнюю строчку. А теперь учтем несколько нюансов, первый из которых - это то, что переменная Х1 у нас сейчас не существует. Вместо нее нам нужно использовать вот этот аргумент Num. Поэтому так и напишем. Х1 уберем, щелкнув на кнопке Delete, и напишем переменную Num. Далее вместо Х2 нам нужно присваивать значение возвращаемой переменной, которой является вот эта переменная Prop.Опять-таки мы, конечно же, можем вручную поменять Х2 на "Prop". Правда, для этого потребуется выполнение 10 операций. Но можно поступить несколько иначе, воспользовавшись автозаменой. Для этого выделим вот этот кусочек текста, в котором мы хотим выполнить наши действия, далее выполним команду Edit, Replace. Конечно же, функцию Replace мы хотим применить к выделенному фрагменту - Selected Text. И мы хотим заменить переменную Х2 на переменную "Prop". Далее щелкнем на кнопке Replace All. Как мы видим, компьютер нашел 11 таких мест для замены. Щелкнем на кнопке ОК, и в результате мы получим окончательный вид нашей функции. Окошко Replace нам уже не нужно. Закроем его. Снимем выделение, щелкнув где-либо в нашем окошке функции, и перейдем теперь обратно в Access. Щелкнем на соответствующей кнопке. Теперь же обратим внимание на вот это поле, которое находится в правой части нашей формы, и здесь введем некое значение и используем заданную нами только что функцию. Для этого сделаем следующую запись: равняется, далее "Prop" - наша функция - и в скобках в качестве аргумента передадим значение левого поля для ввода, которым является Х1. Закроем скобки. Попробуем теперь запустить эту форму. Щелкнем на кнопке Вид. Как мы видим, автоматически появляется надпись "Это не цифра".
Глава 11. Основы программирования на VBA
273
Конечно же, мы еще ничего не успели ввести в это окошко. Введем цифру 2, щелкнем на кнопке Enter. И как мы видим, цифра 2 впишется вот таким образом. Если допишем 4 и щелкнем на кнопку Enter, то 24 - это уже не цифра. Уберем нашу запись и напишем, например, цифру 6. Enter. Как мы видим, автоматически получаем правильное значение. Таким образом нам удалось уже непосредственным образом преобразовать цифровое значение в его текст прописью при помощи функции. Правда при этом мы сделали функциональность вот этой кнопки, бесполезной. Да и в принципе она и работать теперь не будет. Если мы сейчас нажмем на вот эту кнопку, то получаем сообщение об ошибке Run-time Error - невозможно присвоить значение объекту. Дело в том, присваивание теперь этому объекту происходит непосредственным образом при помощи знака равенства. Поэтому щелкнем на кнопке End, чтобы прекратить выполнение этой подпрограммы. Перейдем в конструктор формы, и эту кнопку можем вообще удалить. Она теперь нам не нужна. Щелкнем на кнопке Delete, перейдем в режим программы и уберем обработчик - Кнопка 4_Click. Для этого выделим все это, щелкнем на кнопке Delete, и оставим только функцию Property. Мы можем перейти обратно в Access, запустить нашу форму и спокойно, вводя соответствующие цифры, получать текстовые значения.
11.8. Префиксы Public и Private На этом уроке продолжим знакомиться с функциями и с такими понятиями, как определение Private и Public, с помощью которых можно изменять область видимости наших функций. Для того чтобы познакомиться с этим поближе, создадим новую форму. Для этого щелкнем на кнопке Создать. Конечно же, воспользуемся просто-напросто конструктором. Никакой автоматики нам сейчас не нужно, источника данных тоже. Поэтому прямо щелкнем на кнопке ОК. В результате появилась вот такая пустая форма, на которой разместим поле для ввода и далее, щелкнув на этом поле, попробуем преобразовать какую-либо цифру в ее текстовое значение, воспользовавшись функцией, которую мы создавали ранее. Как мы помним, эта функция описана в этой форме, в форме 1, в ее модуле. Перейдем на форму 2 и, воспользовавшись этой функцией, введем следующую запись: равняется, далее функция "Prop", которая у нас преобразовывает цифру в ее текстовое выражение, и далее в скобках напишем просто-напросто цифру 3. Не будем использовать другие элементы управления с каких-либо форм и усложнять себе жизнь. Удалим также и вот эту метку. Для этого выделим, щелкнем на кнопке Delete. А теперь же попробуем запустить эту форму в режиме работы, для того чтобы оценить, получилось у нас что-либо или нет. Щелкнем на кнопке Вид. И как мы видим, на этот раз преобразование цифры в его текстовое значение у нас не получилось, хотя имя функции мы и написали правильно. Дело в том, что функция у нас находится вот в этой форме, Форме 1, а использовать мы ее хотим в форме 2. И именно поэтому возникает конфликт. Рассмотрим это подробнее. Переключимся для этого в режим конструктора и откроем Visual Basic. Щелкнем на кнопке Программа. Автоматически переходим на блок Visual Basic, связанный с Формой 2. А вот сама функция, функция "Prop", у нас описана в форме 1, как вы видите. И именно поэтому функции, которые описаны вот в этой форме, не видны из Формы 2. Эту функцию можно использовать только внутри формы 1. Для того чтобы выйти из этого затруднительного положения, можно было бы скопировать вот эту функцию целиком в форму 2 и в этом случае программа выполнится правильно.
274
TeachPro Microsoft Access 2003
Попробуем это сделать. Выделим. Правая кнопка мыши, Сору. Далее вставим здесь. Правая кнопка мыши и Paste. А теперь перейдем в Access. Запустим нашу форму. И, как мы видим, все на этот раз получилось правильно. Цифра 3 записана прописью. Правда, это не совсем правильный путь. Дело в том, что копировать функцию каждый раз в новый модуль - абсолютно бессмысленно. Это просто-напросто увеличивает наш код достаточно непродуктивным образом. Перейдем опять в режим конструктора, далее в режим программы. Уберем вот эту функцию отсюда. Выделим. Щелкнем на кнопке Delete. И теперь попробуем разместить эту функцию в другом модуле. А именно, в отдельно стоящем модуле нашего блока. Для этого щелкнем здесь на правую кнопку мыши. Выберем пункт Insert и команду Module - создать новый модуль - и определим нашу функцию именно в этом, отдельно стоящем модуле. Для этого выделим вот эту функцию. Щелкнем на правую кнопку мыши, Сору. Далее вставим ее сюда - правая кнопка мыши и Paste. А теперь перейдем в Access. Далее Вид. И, как мы видим, на этот раз опять наша программа сработала правильно. Для того чтобы полностью убедиться в этом, перейдем опять в режим конструктора, в режим программы. А теперь перейдем в модуль от формы 1, вот в этот, и удалим здесь вот эту функцию, функцию "Prop".Для этого выделим ее, щелкнем на кнопке Delete. Вот она у нас исчезла. Теперь перейдем обратно в Access и запустим на этот раз не форму 2, а форму 1. Выделим, щелкнем на этой форме дважды, и, как мы видим, она сразу же запустилась и начала корректно работать. Если мы сейчас напишем цифру, например, 4, и нажмем на клавишу Enter, получаем его значение прописью. Если напишем, например, 8, получаем его текстовое представление. Т.е. все правильно, несмотря на то, что мы эту функцию, функцию преобразования из цифры в пропись, удалили из этого модуля. Закроем теперь эту форму. При этом возникает вопрос о сохранении формы. Щелкнем на кнопке Да. Согласимся с этим именем. ОК. То же самое для формы 2. И откроем опять нашу программу. Перейдем опять в модуль 1 и перед функцией Function напишем ключевое слово Private. Попробуем посмотреть, как это ключевое слово будет сейчас влиять на выполнение этой функции. Для этого опять перейдем в режим Microsoft Access. Далее запустим эту форму. Ну и, как мы видим, на этот раз форма опять потеряла эту функцию, и применить ее не может. Перейдем обратно в режим конструктора. Откроем программу и отметим, что вот это слово Private делает возможным применение функции уже только лишь внутри этого модуля. А во всех остальных местах нашей базы данных применение этой функции уже будет неоправданно и невозможно. В принципе, использование ключевого слова Private дает возможность сэкономить, конечно, во-первых, память от лишнего кода, который не используется в данном конкретном случае в других модулях, а также скрывать все ненужные в других модулях процедуры и функции от ненужного использования. Рассмотрим теперь, а что же произойдем, если у нас есть две функции с одним и тем же именем. Например, уберем, во-первых, вот эту приставку Private, для того чтобы эту функцию можно было видеть из других модулей. Далее скопируем эту функцию целиком. Выделим. Правая кнопка мыши и Сору. Теперь перейдем, например, опять в форму 2. Щелкнем на правую кнопку мыши и Paste - вставим. И теперь, по идее, вот в этой форме 2 может быть использована и функция "Prop", которая находится внутри этого модуля и функция "проп", которая находится внутри стандартного модуля, модуля 1. Но, поскольку у них одно и то же имя, конечно же, это вызывает определенное беспокойство. Но на самом деле это все гораздо проще. Используется только та функция, которая находится внутри этой формы. Она имеет приоритет. Для того чтобы это проверить, попробуем провести маленький эксперимент. Как мы помним, в этой форме мы используем преобразование цифры 3 в соответствующее текстовое значение и попробуем написать вместе со словом 3 еще пробел и цифру 3 цифрой. А теперь же перейдем в Access, запустим вот эту форму. И, как мы видим, выполнилась та функция, которая находится внутри модуля формы, а не та, которая находится внутри отдельно стоящего модуля. Перейдем опять в режим конструктора и далее откроем программу. Удалим теперь эту функцию из формы 2. Она нам не нужна. Выделим и щелкнем на кнопке Delete. Перейдем опять в модуль 1 и отметим, что мы функцию "Prop" можем объявить как Public, написав впереди это ключевое
Глава 11. Основы программирования на VBA
275
слово. И в этом случае она будет видна и из других модулей. Хотя в принципе, слово Public итак подразумевается в этом общем модуле, т.е. написание вот этого ключевого слова в принципе, в данном конкретном случае обязательным не является. Но, тем не менее, посмотрим что при этом получится. Перейдем в Microsoft Access Запустим нашу форму и, как мы видим, мы опять получаем нормальное значение цифры 3 в ее текстовом виде.
11.9. Использование функций в запросах и формах На этом уроке мы познакомимся с использованием функций в наших формах и отчетах. Напишем для этого пару полезных функций, которые сможем использовать, например, при анализе таблиц. Для этого откроем программу, которая у нас связана с нашей базой данных. Щелкнем на кнопку Программа, выделив, например, какую-либо форму, чтобы активизировать вот эту кнопку. Далее перед нами появился редактор Microsoft Visual Basic, и здесь все те модули, которые у нас есть в нашей базе данных. Ну и основной наш модуль - модуль 1, который не привязан ни к какой форме и в котором мы можем писать любые функции и использовать их затем в любых местах нашей базы данных. Пока здесь, как мы видим, у нас использована только одна функция "Prop", пропись, которая преобразовывает, как мы помним, соответствующую цифру в ее текстовый вариант. Напишем теперь другую функцию, которая будет из фамилии, имени и отчества конструировать новый текст, содержащий инициалы имени и отчества и далее фамилию. Начнем написание новой функции. Щелкнем на кнопке Enter, чтобы начать с новой строчки, и далее напишем следующим образом. Function - это у нас, конечно же, функция. Далее имя этой функции. Пусть это будет Fio - фамилия, имя, отчество, далее скобки, внутри которых мы должны написать, какие аргументы мы хотим использовать в данной функции. Это, конечно же, будут аргументы такие же - фамилия, имя и отчества. Поэтому напишем f, далее i и далее o - фамилия, имя и отчество. Закроем скобки и нажмем на клавишу Enter. Как мы видим, у нас первая из этих функции отделилась от второй вот такой горизонтальной линией, при помощи которой Microsoft Visual Basic разделяет отдельные функции друг от друга для лучшей визуализации. Ну и в конце, как мы видим, компьютер приписал нам автоматически закрытие этой функции End Function. И теперь, при выполнении вот этой функции, будет выполняться Все операторы между заголовком функции и его концом - End Function. Сделаем теперь следующую запись. Во-первых, введем отступ при помощи знака табуляции, далее Fio, наш выходной параметр, равняется и далее будем собирать нужную нам строку. В начале у нас должна быть одна буква от имени, первая буква. Cконструируем при помощи функции left.Далее скобка и далее полное имя, которое, как мы помним, у нас сохранено в переменной i, имя. Поэтому напишем i, далее запятая и далее количество букв, которые мы хотим так сказать вытащить из нашего имени. Количество букв, конечно же, должно быть равно 1. Закроем скобку. Вот теперь в таком виде мы получим первую букву имени. Теперь напишем плюс. Далее, после первой буквы имени нам нужно написать точку, как это обычно принято. Для этого точку поместим внутри кавычек. Кавычки, точка, кавычки. Затем опять знак плюс. Надо отметить, что вместо знака сцепления, который мы использовали при конструировании макросов, мы сейчас используем знак плюс, так как обычно это принято в программировании для соединения нескольких выражений. Затем нам нужно выудить первую букву из отчества. Для этого опять применим функцию left, скобка. Затем пе-
276
TeachPro Microsoft Access 2003
ременная О - отчество, запятая, количество букв из отчества конечно же 1. Закроем скобку. Плюс. А теперь после отчества нам нужно поставить опять точку, которую поместим внутри кавычки. Ну и после точки вставим еще один пробел и лишь затем закроем кавычки, для того чтобы имя и отчества мы немножко отделили от фамилии. Затем плюс и далее нам нужно в нашем тексте вставить фамилию. Фамилию нужно вставить уже целиком. Поэтому напишем просто плюс f. Вот в таком виде мы из фамилии, имени и отчества получим текстовую строку, состоящую из инициалов и фамилии. Попробуем теперь применить эту функцию у нас в базе данных. Вернемся теперь обратно в нашу базу данных Access. Щелкнем на соответствующую кнопку и создадим теперь новый запрос. Для этого перейдем на вкладку Запросы. Щелкнем на кнопку Создать. Конечно же, создадим при помощи конструктора. Щелкнем на кнопке ОК. В качестве основы для нашего запроса используем таблицу Покупатели. Щелкнем на кнопку Добавить и закроем это окошко. Ну и далее добавим соответствующие поля, которые мы хотим отобразить в запросе. Отобразим имя. Для этого перетащим в соответствующую область этого окна, далее перетащим отчество в следующий столбик. И перетащим фамилию. Вот в таком виде у нас в нашей таблице будет отображаться имя, отчество и фамилия. Если мы сейчас запустим наш запрос, щелкнем на кнопке Вид, то можно увидеть, что собой представляет это таблица вот в таком виде, при выполнении этого запроса. А теперь же нашей целью является создание еще одной колонки, в которой мы будем конструировать из имени, отчества и фамилии просто-напросто инициалы имени и отчества и далее фамилию. Для этого у нас уже подготовлена некая функция в нашей программе. Переключимся опять в режим конструктора. Перейдем на следующее поле и далее напишем следующим образом. Равняется, далее имя нашей функции. Это у нас будет fio, скобки, и внутри скобок мы должны указать непосредственно фамилию, имя и отчество, соответствующие поля. Но названия этих полей у нас так и есть - фамилия, далее точка с запятой. Далее следующий параметр Имя, точка с запятой. И следующий параметр, отчество. Закроем скобки. Перещелкнем это выражение. И попробуем выполнить его. Посмотрим, что у нас получается. Для этого щелкнем на кнопке Вид. Ну и, как мы видим, у нас получается достаточно правильное выражение. Мы получаем в 4 столбце инициалы и далее фамилию нашего покупателя. Перейдем опять в наш конструктор запросов. Сохраним этот запрос. Щелкнем на кнопке сохранения. Пусть у него будет это стандартное имя. Сейчас особо редактировать его не будем. Щелкнем на кнопке ОК. Закроем его. И перейдем в наш редактор Visual Basic. Для этого, например, перейдем на нашу форму. Сразу же активизируется соответствующая панель инструментов, и щелкнем на кнопке перехода к программе. Вот мы опять попали в наш редактор Visual Basic. И теперь обратим опять внимание на ту функцию, которую мы только что написали, которая преобразует фамилию, имя, отчество в инициалы имени, отчества и далее в фамилию. Отметим одно обстоятельство. Далеко не всегда, в документах используется именно такой порядок расположения различных частей фамилии, имени и отчества. Очень часто используют немножко по-другому. А именно, сначала пишут фамилию, а затем инициалы имени и отчества. Ну, конечно, в принципе мы могли бы написать еще одну функцию, которую могли бы назвать, например, немножко по-другому. Например, Fio 2. Но можно использовать эту же функцию, немножко ее модернизировав, введя еще один параметр. Напишем здесь - запятая и далее, в качестве параметра, введем, переменную Х, и далее введем теперь оператор условия IF. Далее Х сравним с единицей. Если Х равен 1, then - тогда пусть выполняется вот этот оператор, оператор присваивания по старому варианту. Чуть-чуть его сдвинем при помощи табуляции. Далее Enter. Введем теперь оператор else - то, что у нас будет происходить в другом случае. Скопируем, чтобы не писать заново все это выражение. Для этого выделим его. Щелкнем на правую кнопку мыши, Сору. Далее встанем вот в этом месте. Правая кнопка мыши, Paste. Далее напишем оператор закрытия условного выражения - End IF. И наконец нам остается только преобразовать немножко вот это выражение. А в случае, если Х не равен 1, наша функция Ф.И.О. должна принять несколько другой вид. А именно, в начале должна идти фамилия, поэтому напишем f. Далее плюс, далее кавычки, внутри которых поставим
Глава 11. Основы программирования на VBA
277
пробел, и затем плюс после кавычек. Ну и в конце фамилия нам уже не нужна. Уберем ее точно так же, как и лишний пробел внутри кавычек. Здесь достаточно одной точки. Перейдем теперь опять в Microsoft Access, щелкнем на соответствующую кнопку. Откроем наш запрос в режиме конструктора. Вот запрос 3, который мы только что создавали. Щелкнем на кнопке Конструктор. Конечно же, нам это выражение надо немножко изменить. Введем соответствующий параметр. Для этого сделаем запись: точка с запятой и далее цифру 1, чтобы получить его первый вариант. Если мы сейчас щелкнем на кнопке Вид, то получим то же самое, что получали ранее. А именно инициалы, и далее фамилию в четвертом столбце. Переключимся обратно в режим конструктора. Далее скопируем вот это выражение fio и далее все выражение. Для этого выделим его. Щелкнем на правую кнопку мыши.Выберем команду Копировать, затем перейдем в следующий столбец. С помощью правой кнопки мыши и выберем команду вставить. И вместо параметра 1 напишем другой параметр. В принципе, сейчас абсолютно все равно, что мы здесь напишем. Главное, чтобы это не было 1. Напишем, например, 2. Как мы видим, этому полю автоматически присвоилось имя Выражение 2. А сейчас название этих колонок мы менять не будем. Пусть будет, как нам предлагает автоматически Microsoft Access.Щелкнем на кнопке Вид и можно увидеть, как на этот раз выглядит таблица нашего запроса. Наряду с именем, отчеством и фамилией, у нас две колонки, в первой из которых сначала инициалы и далее фамилия, а во второй колонке у нас обратный порядок - сначала идет фамилия и далее инициалы соответствующего покупателя. Закроем теперь этот запрос. Щелкнем на кнопке сохранения перед этим. Щелкнем теперь на вот этом крестике и попробуем сконструировать новую форму, в которой мы могли бы использовать ту функцию, которую мы только что создали. Для этого щелкнем на вкладке Формы. Далее создать. Воспользуемся конструктором Форма. В качестве источника данных выберем таблицу Покупатели. Далее щелкнем на кнопке ОК. Разместим на нашей форме для начала имя, отчество и фамилию, точно так же, как мы делали в запросе. Перетащим имя. Далее отчество и далее фамилию. Чуть-чуть растянем вот эту форму, чтобы было место, где мы могли бы вставлять еще элементы. Введем теперь поле для ввода. Щелкнем на соответствующие кнопке в панели инструментов. Нарисуем его, например, вот в этом месте. Уберем его название, оно сейчас нам не нужно. Выделим вот эту метку и щелкнем на кнопке Delete. И затем вставим переключатель, при помощи которого мы можем выбирать, какой вид мы хотим отображать в этом поле - вид, в котором инициалы идут до фамилии, или после. Для этого вставим группу Переключатели. Зададим подпись для первого переключателя. Это у нас будет И.О. имя, отчество. Далее фамилия. Ну а в следующем варианте у нас будет наоборот - фамилия и далее инициалы, И.О. Щелкнем теперь на кнопке Готово. Как мы видим, у нас эта группа переключателей появилась на нашем экране. Метку можем удалить, выделив и щелкнув на кнопке Delete, если она нам не нужна. Зададим значение по умолчанию для этого переключателя. Для этого выделим его, щелкнем на правой кнопка мыши - свойства. Далее переключимся на вкладку Данные и в качестве значения по умолчанию напишем число 1. Закроем теперь эти свойства и посмотрим, что у нас получилось. Щелкнем на кнопке Вид. Как мы видим, у нас переключатель стоит на И.О. и фамилия. Правда, вот в этом поле для ввода пока ничего не отображается. Отображается только имя, отчество и фамилия в соответствующих полях. Мы можем передвигаться по нашим записям и получать на экране имя, отчество и фамилию соответствующего покупателя. Правда, этот переключатель и поле для ввода, вот это пустое, пока не работают и никакой информации для нас нет выводят. Переключимся обратно на режим конструктора. Изменим теперь имя для вот этой группы переключателей. Для этого выделим его. Правая кнопка мыши, свойства. Переключимся на вкладку Другие и вместо имени Группа 5 напишем, например, Вид. Закроем. А теперь напишем соответствующее выражение в поле для ввода. Для этого щелкнем на нем. Далее напишем знак равенства, при помощи которого мы обычно вводим использование соответствующих функции. Далее Ф.И.О., имя нашей функции, скобка. А теперь нам нужно указать имя, отчество и фамилию. Так и напишем. Первой, конечно же, у нас должна идти фамилия. Далее точка с запятой. Далее имя.
278
TeachPro Microsoft Access 2003
Точка с запятой. Следующий параметр - Отчество. Точка с запятой. И последний параметр Вид. Закроем скобку. А теперь посмотрим, как все это будет выглядеть уже в режиме работы данной формы. Для этого щелкнем на кнопке Вид. И как мы видим, мы сразу же получаем наряду с именем, отчеством и фамилией, то текстовое выражение, которое мы хотели. А именно, мы получили фамилиюданного покупателя вместе с его инициалами. Мы можем передвигаться по записям, получая соответствующий вид наших персонажей.Ну и, как мы видим, в зависимости от того, как мы поставим вот этот переключатель, мы получаем разный вид пре6дставления в этом поле для ввода. Мы можем видеть как впереди инициалы, так и сзади. Т.е. вся наша задумка вполне исправно работает. Сохраним. Пусть эта форма так и называется, форма 3. Щелкнем на кнопке ОК. Закроем ее и вернемся к стандартному виду нашей базы данных.
11.10. Использование функций в других приложениях Рассмотрим опять, как применяются функции в Microsoft Access, а так же, как применяются функции в других приложениях офиса. Откроем вот эту форму, в которой мы уже создавали и использовали функцию. Для этого щелкнем на кнопке Конструктор. Вот эта форма появилась перед нами. Как мы помним, она из трех полей, имени, отчества и фамилии, и соответствующей таблицей Покупатели, составляла нам одну строчку, в которой разными способами комбинировала эти данные, в зависимости от вот этого переключателя. Попробуем сейчас сделать так, чтобы в этом переключателе у нас было больше возможности. Для этого, во-первых, немного расширим его. Вот таким образом. Сдвинем, чтобы вот эти элементы не налезали друг на друга. Для этого схватим вот таким образом и потащим наш элемент. Ну, а теперь, перетащив первые два переключателя чуть выше, добавим еще два переключателя. Для этого щелкнем на соответствующей кнопке на панели инструментов. Нарисуем переключатель здесь. Это у нас будет третья возможность. И последний переключатель поставим чуть ниже. А теперь нам нужно набрать текст для этих переключателей. Выделим вот этот переключатель, переключатель 12 и введем следующий текст. Пусть в этом случае у нас выводится фамилия, далее имя и отчество без сокращения. Как мы видим, все у нас не поместилось, поэтому чуть-чуть расширим и переключатель, и соответствующую форму. Вот, таким образом. Далее отредактируем последний переключатель. Здесь у нас будет имя, отчество и фамилия, стандартный вид такого рода данных. Чуть-чуть попробуем выровнять эти переключатели. Выделим сперва вот эти точки от переключателей. Допустим, вот таким прямоугольником выделения. Вот они выделились, далее с помощью меню Формат и команды Выровнять выровняем по левому краю. Вот эти точки у нас выровнялись. Теперь опять же с помощью меню формат выполним команду Интервал по вертикали и Сделать равным, чтобы все это выглядело красивее. Ну и теперь нам осталось выровнять только текст в этих переключателях. Для этого выделим вот эти текстовые метки. Далее опять же меню Формат и команда Выровнять. И опять выровняем по левому краю.
Глава 11. Основы программирования на VBA
279
Ну, вот, после всех этих операции, наш переключатель уже будет выглядеть гораздо лучше. Ну, а теперь настал черед изменить нашу функцию. Для этого переключимся в режим Visual Basic. Щелкнем на кнопке Программа. Вот, она появилась перед нами. Переключимся на модуль 1, где у нас находится наша функция, которую мы использовали - функция Фамилия, имя, отчество. Здесь, вместо вот такого переключателя, что будет происходить при Х равном 1, и во остальных случаях, воспользуемся оператором Select Case. Напишем теперь следующим образом. Удалим вот эту строчку. И далее Select Case. Далее наша переменная Х. Теперь внизу нам нужно сделать следующую запись: Case 1, в случае 1 у нас будет старый вариант Фамилия, имя, отчество. Далее будет вариант 2, который тоже пусть выглядит так же, как и было. Далее, при помощи кнопки End доберемся до конца и щелкнем на Enter, чтобы ввести новую строчку. Далее напишем Case - 3, в случае 3. В этом случае скопируем выражение из предыдущей строчки. Нажмем на кнопку Shift и кнопку End на нашей клавиатуре, для того чтобы выделился весь текст до конца строчки. Далее правая кнопка мыши и Сору. Перейдем на следующую строчку. Правая кнопка мыши и Paste. Теперь нам нужно чуть-чуть модернизировать эту строчку. Напишем ее без использования оператора left. Нам теперь нужно целиком имя и отчество от наших персонажей, а не только первые их буквы. Ну и, конечно, вместо точек нам нужно использовать пробелы. Ну, последний пробел уже, конечно же, не нужен. А теперь же, щелкнем на кнопке Enter и введем case else, т.е., что должно происходить в случае, если Х не удовлетворяет первым трем условиям, т.е. не равен 1, не равен 2 и не равен 3. Введем двоеточие. Далее скопируем опять предыдущую строчку. Встанем на ее начало. Далее Shift и кнопка End, далее правая кнопка мыши и Сору. Вставим сюда. Правая кнопка мыши и Paste. А теперь же переставим фамилию, имя, отчество. В начале должно быть у нас имя, далее отчество и в конце фамилия. Ну и вместо End IF оператора, нам нужно вставить оператор End Select. Вот, в таком виде, уде эта функция выглядит несколько по-другому. Переключимся теперь на Access, щелкнем на соответствующую кнопку - View Microsoft Access. И далее, во-первых, расширим вот это поле, поскольку мы хотим здесь отображать имя, отчество и фамилию уже полностью, поэтому нам, конечно, потребуется больше места, для такого текста. И затем щелкнем на кнопке Вид, чтобы запустить нашу форму, и, как мы видим, у нас появился первый результат. Это инициалы и затем фамилия. Мы можем переключиться на второй вариант, получив инициалы в конце этого выражения. А следующий вариант - это у нас полностью фамилия, имя, отчество нашего покупателя. Ну и последний вариант тоже работает исправно, показывая имя, отчество и фамилию так, как у нас и задумано. Можем переключиться на следующие записи, и все время наша форма исправно выдает нам нужные данные о наших покупателях. Переключимся теперь обратно в конструктор нашей формы и в нашу программу, щелкнув на соответствующей кнопке. Перейдем опять на модуль 1 и попробуем теперь эту функцию использовать в каком-либо другом приложении Microsoft Office. Например, Microsoft Excel. Для этого выделим вот эту функцию целиком. Далее скопируем ее в буфер обмена. Для этого щелкнем на правой кнопка мыши. Выберем команду Сору. Теперь запустим, к примеру, приложение Excel. Вот, перед нами появился лист Microsoft Excel. Далее щелкнем на пункте меню Сервис. Далее команда макросы и щелкнем на команде Редактор Visual Basic. Вот мы попали в соответствующий редактор. Теперь добавим новый модуль. И в нем добавим нашу функцию. Для этого щелкнем на правой кнопке мыши и выполним команду Paste. И вот функцию мы теперь можем использовать внутри этого приложения. Для этого переключимся обратно на Excel. Щелкнем на вот эту кнопку View. Ну и заполним вот эту таблицу соответствующими данными. Для этого переключимся сперва обратно на программу Microsoft Access. Вот она появилась перед нами. Переключимся на Таблицы. И откроем таблицу Покупатели.
280
TeachPro Microsoft Access 2003
Теперь выделим несколько из записей в нем. Для этого выделим вот эту ячейку. Далее нажмем на кнопку Shift и вот таким образом выделим некое количество записей, состоящей из имени, отчества и фамилии. Далее с помощью правой кнопки мыши выполним команду Копировать. Теперь переключимся на Excel. Начнем, например, со второй позиции. Щелкнем на правую кнопку мыши и выберем команду Вставить. Вот, как мы видим, у нас вставились данные. Правда, неплохо было бы изменить размер наших ячеек. Чуть-чуть расширим, таким образом, соответствующие поля. Сделаем поменьше и высоту наших ячеек. Зададим ее более или менее стандартной, вот в таком виде. А теперь используем нашу функцию. Для этого, щелкнем здесь дважды. Напишем равно, далее фамилия, имя, отчество - Fio - имя нашей функции. Далее скобки, внутри которых нам, конечно же, надо указать фамилию, имя, отчество в том же порядке, в котором мы использовали ее в нашей функции. Сперва фамилия. Щелкнем на соответствующую ячейку. Далее точка с запятой. Следующая ячейка у нас имя. Опять точка с запятой. Следующая ячейка у нас отчество. Точка с запятой. И далее укажем в качестве параметра какую-либо ячейку, в которой у нас будет храниться этот параметр, вид выводного текста. Допустим, его будем хранить вот в этой ячейке В1. Поэтому щелкнем на соответствующей ячейке. Закроем скобку. Далее в ячейке В1 вставим знаки доллара перед буквой В и перед 1, для того чтобы компьютер воспринимал эту ячейку, как абсолютный адрес и не менял при копировании. Щелкнем на кнопку Enter. И как мы видим, в этой ячейке у нас появилась соответствующая текстовая аббревиатура, состоящая из имени, отчества и фамилии. Мы можем расширить использование этой функции. Для этого схватимся за правый нижний край и потянем книзу, получая соответствующие выходные данные для каждой из записей. А теперь в ячейку В1 введем число, например, 1. Если мы перещелкнем, то, как мы видим, сразу же мы видим другой вариант представления имени, отчества и фамилии. Если напишем число 2, Enter, вид нашего текста также изменится. В случае 3 получаем фамилию, имя, отчество. Ну и в случае любого другого числа, получаем имя, отчество и фамилию. Т.е. вот в таком виде можно использовать функцию и в любом другом приложении офиса, не только в Access, но, например, как мы использовали в Microsoft Excel. Закроем теперь его и вернемся обратно в Access. Щелкнем на крестике, но сохранять изменения не будем. Щелкнем на кнопке Нет. Это у нас было для примера. И вот мы обратно попали в программу Microsoft Access. закроем нашу таблицу. И вот мы видим нашу исходную базу данных.
11.11. Функция MsgBox На этом уроке познакомимся с функцией Message Box. А также разберемся, как можно программу, созданную при помощи макрокоманд преобразовать в программу Visual Basic. Вообще, это достаточно эффективная возможность, особенно на начальном этапе знакомства с программированием Microsoft Access. Создадим какую-либо макрокоманду в соответствующем редакторе, а затем преобразовать его в Visual Basic и в дальнейшем модернизировать его там. Для этого создадим новый макрос. Переключимся на макросы. Далее щелкнем на кнопку Создать. Вот, появилось окно построителя макросов. Здесь создадим новую макрокоманду. Новая макрокоманда у нас будет называться Сообщение. Вот, она. Щелкнем. Далее появились ее аргументы. Заполним каким-либо текстом сообщение и заголовок.
Глава 11. Основы программирования на VBA
281
Ну, пусть это будет просто-напросто цифра 1. Здесь особенно напрягать фантазию не будем и оставим возможность присутствия предупреждающего сигнала. И нам нужно задать еще и тип этого сообщения. Здесь, как мы видим, у нас несколько возможностей. И выберем первую из них, а именно, отсутствует, т.е. без типа сообщения. Создадим вторую макрокоманду, в качестве которой опять выберем сообщение. Вот оно. Ну, пусть текст сообщения будет 2, заголовок тоже цифра 2, ну и вместо отсутствующего типа выберем критическое сообщение. Следующий тип сообщения, который мы можем выбрать, - это сообщение будет у нас с номером 3. И его тип пусть будет предупреждающий с вопросительным знаком. Далее еще одно сообщение, у которого текст будет 4, как и заголовок. Ну и в качестве типа будет предупреждающий с восклицательным знаком. И создадим последнее, пятое сообщение в макрокоманде. Его текст будет 5, и заголовок тоже цифра 5. Ну и здесь в качестве типа выберем последний информационный тип данного сообщения. Вот мы сформировали все 5 типов сообщения, которые возможны в макрокомандах в Microsoft Access.На самом деле сообщений и их возможности гораздо больше и гораздо шире в Microsoft Access, но их мы можем применять уже в Visual Basic, а вот в макрокомандах их существует только 5 видов. Посмотрим теперь, что у нас получилось в наших сообщениях от первого до последнего. Для этого запустим этот макрос. Щелкнем на кнопке Запуск. Как мы видим, Microsoft Access предупреждает, чтобы мы сохранили этот макрос. Но, щелкнем на кнопке Да. Согласимся с именем Макрос 1, щелкнем на кнопке ОК. Ну и, как мы видим, появилось первое из этих сообщений - сообщение с текстом 1 и с заголовком 1. Как мы видим, здесь никаких картинок, которые бы идентифицировали данное сообщение, нет. Щелкнем на кнопке ОК, и появилось второе сообщение с текстом 2 и, как мы видим, оно является у нас вот таким критическим. Сообщение 3 у нас с вот таким вопросительным знаком. Сообщение 4 с восклицательным знаком, и последний, пятый тип сообщение - это вот такой информационный тип. Если мы щелкнем на ОК, то выполнение макрокоманды на этом заканчивается. Закроем теперь этот построитель макросов. Щелкнем на вот этом крестике, и вот у нас тот макрос, который мы только что создали, сохранился под именем Макрос 1. Щелкнем теперь на правую кнопку мыши, чтобы вызвать контекстное меню, и выберем пункт Сохранить как. Щелкнем, и вот появляется вот такое стандартное окошко сохранения макросов, и здесь мы можем выбрать, как мы хотим сохранить данный макрос - как макрос или же у нас другая еще возможность - это сохранить его в модуле. Но сейчас как раз нас интересует вот эта старая возможность, а именно: преобразование данного макроса в программу Visual Basic, которая будет записана в соответствующем модуле. Щелкнем теперь на кнопке ОК. Примечание к макросам оставим, а вот программу обработки ошибок исключим сейчас при преобразовании. Щелкнем на соответствующую кнопку Преобразовать. И вот появляется сообщение о том, что преобразование закончено и все получилось достаточно успешно. Щелкнем на кнопке ОК. Перейдем в наш модуль преобразованных макросов. Вот этот. Щелкнем на нем дважды,и здесь можно увидеть тот макрос уже в виде Microsoft Visual Basic, который мы только что преобразовали. Здесь, как мы видим, несколько строчек, которые делятся по две строчки, каждая из которых начинается с оператора Beep - это такой звуковой сигнал. А дальше идет Message Box, наше сообщение, в котором, как мы видим, у нас текст отображается, как 1,2,3,4 и 5, ну и дальше идет тип данного сообщения, который мы хотим использовать. Как мы видим, мы его используем, как только ОК. Или же критическое сообщение, вопросительное, восклицательное или же информационное, что видно из соответствующих аббревиатур внутри этих операторов.
282
TeachPro Microsoft Access 2003
11.12. Функция MsgBox. Точки останова Посмотрим теперь, как будет выглядеть выполнение нашей программы в виде Microsoft Visual Basic. Для этого запустим ее. Это можно сделать при помощи вот этой кнопки Run или же при помощи пунктира в меню и далее соответствующего подпункта Run Sub/UserForm. Или же можем просто-напросто, находясь в любом месте, щелкнуть на кнопке F5. Так мы сейчас и сделаем, в результате чего появляется вот такое стандартное окошко, в котором, как мы видим, написано 1. Щелкнем на кнопке OK. Появляется 2, 3, 4 и 5. Щелкнем на кнопке ОК и мы возвращаемся обратно в редактор Microsoft Visual Basic. В принципе, мы получили абсолютно то же самое, что и получали при помощи редактора макросов. Если мы хотим, чтобы какие-то из команд в этой подпрограмме не выполнялись, для этого мы можем на соответствующих строчках поставить знак апострофа. Например, поставим на первой строчке, перейдем на вторую и также поставим и на второй строчке. Как мы видим, эти две строчки стали зеленного цвета, что сигнализирует нам о том, что они сейчас выполняться не будут. Если мы сейчас щелкнем на кнопке Run, то, как мы видим, выполнение этой программы началось прямо со второго сообщения. Ну, щелкнем несколько раз на кнопке ОК и вернемся в Microsoft Visual Basic. Отметим еще одно обстоятельство, что в любом месте нашей программы мы можем ставить так называемые точки остановок, для того чтобы компьютер прерывал выполнение нашей программы и вернул нас в Microsoft Visual Basic. Это нужно бывает очень часто при разного рода откладках нашей программы, когда мы хотим остановить нашу программу и посмотреть значение переменных в какой-либо конкретный момент в программе. Вставим, например, точку останова вот в этой строчке. Для этого щелкнем на этой полосе, которая находится слева от текста нашей программы. Как мы видим, здесь появилась вот такая темно-красная точка, которая символизирует то, что в этом месте у нас есть точка останова, и в результате выполнение программы прервется именно в этом месте. Попробуем сделать это. Щелкнем, например, на кнопке Run. Как мы видим, появилось сообщение с текстом 2. Если мы сейчас щелкнем на кнопке ОК, то вместо того, чтобы появилось сообщение с номером 3, как мы видим, компьютер прервал выполнение нашей программы, остановившись на вот этой строчке. Но, правда, сейчас мы значение каких-либо переменных оценить никак не можем, поскольку никаких переменных пока у нас нет. Но зато мы можем продолжить выполнение нашей программы. Щелкнем на кнопке Continue. Появляется, как мы видим, сообщение с номером 3, ОК, 4, 5 и далее конец выполнения макроса. А теперь введем какую-либо переменную. Например, попробуем получить значение соответствующей переменной, как нажатие какой-либо клавиши в Message Box, какой-либо кнопки. Введем, например, переменную Х, далее равняется, и все аргументы нашего Message Box поставим в скобки. И далее, как только мы поставили открывающую скобку, появилась подсказка, которая показывает синтаксис написания этой команды. Как мы видим, в начале идет текст сообщения. Далее мы должны написать, какие кнопки здесь должны присутствовать по умолчанию. Появится только кнопка ОК, далее титульная строчка, Help file и т.д. Сейчас поставим здесь закрывающую скобку. Поставим еще ту же самую переменную Х, например, после 4.
Глава 11. Основы программирования на VBA
283
Напишем Х равно Message Box в четвертом сообщении. Откроем скобку и закроем ее здесь. Далее поставим прерывание и вот в этом месте после 4 сообщения. Щелкнем. Ну и попробуем выполнить этот макрос. Щелкнем на кнопке Run. Появилось, как мы видим, второе сообщение. ОК. Ну и здесь уже мы можем посмотреть, чему равна переменная Х. Если мы подведем мышь, то, как мы видим, сейчас Х равно 1. Далее продолжим выполнение нашей программы. Щелкнем на кнопке Continue, ОК. Появилось 4 сообщение. Ну и, как мы видим, Х опять равно 1. В принципе, другой возможности у нас нет, поскольку у нас все время появляется всего лишь одна кнопка ОК. Попробуем теперь чуть-чуть разнообразить нашу переменную Х, чтобы мы получали разные значения. Ну, например, вот здесь напишем Х+1 и выполним вот в таком виде. Щелкнем на кнопке Run, сообщение 2, ОК. Ну и Х принимает старое значение 1. Далее продолжим выполнение. Сообщение 3, 4. А теперь, если мы посмотрим на переменную Х, то, как мы могли догадаться, Х теперь равен 2. Т.е. от первого прерывания до второго значение Х изменилось соответствующим образом. Оно увеличилось на 1, xто в принципе и следовало ожидать. Вот таким образом мы можем при помощи прерывания узнать значения переменных и вообще состояние нашей программы в любой момент времени выполнения.
11.13. Окно Immediate. Аргументы Значения функции MsgBox На этом уроке познакомимся с окном Immediate, а также со значениями функции Message Box. Откроем окно Immediate. Для этого щелкнем на пункте меню View и выполним команду Immediate Window. Вот появляется это окошко. И далее, выполнение макроса с соответствующими прерываниями, которые мы здесь поставили, приведет к отображению значению переменных в окне Immediate. Попробуем это сделать. Щелкнем на кнопке Run. Появляется наше второе сообщение. ОК. А теперь получим значение переменной Х, которое, как мы видим, равняется 1. Это значение появляется, как только мы подносим курсор к соответствующей переменной, но вместо этого мы можем написать здесь немножко по-другому. А именно: напишем вопросительный знак, далее та переменная, которая нас интересует. В нашем случае это Х и нажмем на Enter. Как мы видим, мы получили то значение, которое мы видели, а именно, 1. Попробуем продолжить выполнение нашей процедуры. Щелкнем на кнопке Continue. Получаем сообщение 3, ОК, сообщение 4, ОК. Ну и теперь мы остановились уже в другом месте нашей программы. Получим теперь значение этой переменной. Для этого встанем на соответствующем месте около вопросительного знака Х. Щелкнем на кнопке Enter. Как мы видим, мы получили новое значение, значение 2 этой переменной Х, что в принципе, хорошо согласуется с тем, что мы получали ранее. Вот, если подносим к переменной Х, оно, конечно же, равно 2. В принципе, мы можем подвести и в этом месте к переменной Х. Оно в любом случае равно сейчас 2. Теперь, после того, как мы получили значение всех переменных и оценили их возможности вот в этой точки останова, мы можем продолжить выполнение нашего макроса, щелкнув на кнопке Continue, на вот этом треугольнике. Или же мы можем остановить выполнение при помощи меню Run и команды Reset. Сейчас мы так и сделаем. И как мы видим, мы вышли из процесса выполнения нашего макроса.
284
TeachPro Microsoft Access 2003
Теперь же чуть-чуть разнообразим наше сообщение Message Box, которым мы пользовались. А именно, попробуем сделать так, чтобы в этом сообщении была не одна кнопка ОК, а несколько. Для этого воспользуемся системой помощи, которая есть в Microsoft Visual Basic. Для этого достаточно выделить ту функцию помощи, которую мы хотим получить, в нашем случае это Message, и щелкнуть на клавише F1. В результате появляется вот такая справка Microsoft Visual Basic, причем справка о нашем операторе Message Box. В принципе, краткий ее синтаксис совпадает с тем, что мы оценили ранее при вводе скобок в наших Message Box. А что касается каждого из используемых в нем аргументов, то они подробно описаны в нижней части этого окна Help. В данном случае нас больше всего интересует аргумент buttons, который определяет, какие кнопки и в каком количестве будут появляться в этом Message Box. Сдвинемся вниз в нашем окне Help и можно увидеть, какое значение можем мы присваивать этой переменной buttons. Как мы видим, оно может принимать значение не только, которое характеризует одну кнопку, например, vbOKOnly, но, например, в этом Message Box могут присутствовать две кнопки - ОК и Cancel. Или даже целых три - vbAbortRetryIgnore. Или же случай YesNoCancel. Как мы видим, здесь довольно много различных возможностей, используя и комбинируя которые получаем достаточно много типовых сообщений. Например, используем в данном конкретном случае вот этот трехкнопочный вид YesNoCancel. Для этого щелкнем на правой кнопке мыши и скопируем, чтобы не набирать его заново. Закроем эту систему помощи, щелкнем на соответствующем крестике и замены тип наших кнопок. Для этого выделим это слово. Щелкнем на кнопке Delete, далее правая кнопка мыши и Paste, вставим. Теперь вот эти нижние строчки нам не нужны. Их мы можем удалить. Для этого выделим их. Далее щелкнем на кнопке Delete. Введем опять точку останова после Message Box. Она у нас сейчас удалилась вместе с удаленными строчками. Вставим ее перед концом функции, End Function. Для этого щелкнем на соответствующей строчке. И теперь попробуем выполнить наш макрос вот в таком виде. Щелкнем на кнопке Run. Появляется, как мы видим, наше сообщение, в котором есть три кнопки - Да, Нет и Отмена. Если мы сейчас щелкнем на кнопке Да, то значение нашей функции, как мы видим, равняется 6. Закончим выполнение, щелкнув на Continue. Опять запустим. На этот раз щелкнем на кнопке Нет. И, как мы видим, сейчас переменная Х принимает значение 7. Если мы сейчас выполним еще раз этот макрос, щелкнем теперь на кнопке Отмена, то, как мы видим, в этом случае переменная Х принимает значение 2. Это в принципе те значения 6, 7 и 2, которые соответствуют соответствующим переменным Yes, No и Cancel. Их мы можем получить тоже из той же системы помощи. Выделим Message Box. Щелкнем на кнопке F1. Сдвинемся в самый низ этой системы помощи и здесь можно увидеть, какие значения принимают константы, связанные с Yes, No и т.д. Но, как мы видим vbYes у нас соответствует значению 6, No соответствует 7, а Cancel соответствует цифре 2, так, как мы получили при экспериментах в нашем макросе.
11.14. Значения функции MsgBox Функция InputBox В принципе, значение этой переменной Х мы опять-таки можем получить в окне Immediate. Удалим все старые строчки. Введем вопросительный знак, Х, Enter. В результате получаем значение 2. В принципе окно Immediate можно использовать и как простейший калькулятор, выполняя любые нужные нам действия. К примеру, 4 х 5, Enter. Мы получили ошибку синтаксического типа. Дело в том, что мы забыли поставить вопросительный знак перед выражением, в результате чего Microsoft Visual Basic не смог выполнить нашу операцию. Щелкнем на кнопке ОК. Поставим здесь вопросительный знак. Далее Enter и получаем, конечно же, нужное нам значение. 4х5 равняется 20. Здесь можно использовать и значение переменных. Например, напишем вопросительный знак, далее Х и умножить на
Глава 11. Основы программирования на VBA
285
2. Enter. Конечно же, получаем 4, поскольку Х равнялось 2, и 2х2, конечно же, равняется 4. Теперь же посмотрим, как вывести вот эту переменную Х в явном виде во время выполнения наших программ, без всяких прерываний. Для этого уберем вот это прерывание. Щелкнем на нем и, во-первых, остановим выполнение нашей программы, щелкнув на кнопке Continue и закончив эту функцию. А теперь напишем еще один Message Box, в котором выведем значение переменной Х. Ну, проще всего его скопировать вот отсюда. Для этого выделим его. Правая кнопка мыши и Сору. Далее вставим строчкой ниже, правая кнопка и Paste. Выровняем, чтобы более или менее красиво все это выглядело, один под другим. Ну и затем уберем все эти аргументы, они нам не нужны и введем только одно строковое выражение, которое будет отображаться следующим образом. Вы нажали, далее кнопку, далее плюс, и затем нам нужно преобразовать вот это значение Х, которое в данном конкретном случае является целочисленным значением, в его строковое выражение. Для этого воспользуемся специальной функцией str. Далее скобки и, как мы видим, из этой подсказки, нам нужно ввести число, которое и будет преобразовано к виду строчки. Число - это у нас переменная Х. Закроем скобки и теперь выполним этот макрос. Щелкнем на кнопке Run.Как мы видим, появилось вот такое окошко с знакомыми нам кнопками Да, Нет, Отмена. Щелкнем на кнопке Да, и появляется надпись "Вы нажали на кнопку 6". ОК. Попробуем еще раз выполнить. щелкнем сейчас на кнопке Нет. Появилась надпись "Вы нажали на кнопку 7". И последняя возможность: нажимая на кнопку Cancel, мы получаем значение Х, как 2. ОК. В принципе мы можем по-другому анализировать значение переменной Х, а именно, воспользовавшись конструкцией IF, или же конструкцией Select Case. Значение IF лучше, если у нас переменная Х принимает всего лишь два значения. Select Case лучше использовать, если переменная Х может принимать более двух значений. Например, в нашем конкретном случае она может принимать три значения Yes, No, Cancel. Поэтому воспользуемся Select Case. Напишем следующим образом. Select, далее Case, далее переменная Х. Enter. А теперь нам нужно его проанализировать. Напишем следующим образом. Case. Далее мы можем написать значение Х-ов, которые мы хотим анализировать. Как мы помним, они были 6, 7 и 2. Но достаточно сложно ориентироваться по таким числам. Гораздо лучше, если мы будем использовать специальные константы, которые подготовил для нас Microsoft.Константы vbYes - это и есть возможности, при которых мы получаем нажатие кнопки Yes. В этом конкретном случае выведем вот это сообщение. Для этого выделим его, далее правая кнопка мыши, Сору. Вставим сюда, правая кнопка мыши и Paste. напишем, что вы нажали на кнопку Yes. Далее Enter. Теперь же скопируем эту строчку, выделим ее. Далее правая кнопка мыши, Сору. Вставим здесь. Правая кнопка мыши и Paste. Опять правая кнопка мыши и Paste. Теперь вместо vbYes напишем vbNo. И в этом случае укажем, что вы нажали на кнопку No. И последняя возможность, vbCancel соответствует нажатию кнопки Cancel. Теперь все, что нам остается, это закрыть Select Case. Для этого напишем End Select. Ну и теперь, в принципе, у нас оператор Select уже будет работать корректно. Теперь вот эта строчка нам не нужна. Ее закомментируем, поставив апостроф. Она стала зеленой, что означает, что строчка закомментирована. А теперь выполним этот макрос. Для этого щелкнем на кнопке Run. Появилось вот такое сообщение. Нажмем на первую кнопку Да. Появилась надпись, что мы нажали на кнопку Yes, это одно и то же. Выполним еще раз. Щелкнем на кнопке Нет, это No.
286
TeachPro Microsoft Access 2003
И последнее - нажатие на отмену. Это, конечно же, кнопка Cancel. Вот таким образом мы можем анализировать, что мы нажали вот в этом Message Box при его появлении. Таким образом, мы можем управлять ходом выполнения нашей программы при помощи вот таких запросов. Иногда нам недостаточно такой однозначный вопрос - Да, Нет и даже Да, Нет и Отмена, при выполнении нашей программы. Иногда нам необходимо ввести какой-либо вопрос, в результате чего мы хотим получить от пользователя какую-либо информацию, которую он должен ввести непосредственным образом. Для этого существует специальный оператор InputBox. Попробуем его применить. Введем его вот в этом месте. InputBox, далее скобка. Появилась сразу же подсказка, которая показывает, какие аргументы мы должны указать в InputBox. Первый из них - текстовое значение, которое должно появляться в виде надписи в этом InputBox. Например, просто-напросто "Введите текст". Закроем кавычки. Затем мы можем ввести и остальные параметры, такие, как текст в заголовке, значение по умолчанию, позиция по Х и У, и т.д. Например, введем следующим образом: запятая, введем в качестве заголовка просто слово Текст. Кавычки закроем. Запятая. Теперь введем значение по умолчанию. В кавычках введем, например, значение 12345. Закроем скобку. Enter. Ну и, как мы видим, у нас закралась синтаксическая ошибка. Мы забыли про равенство. Конечно же, наш InputBox должен возвращать какое-то значение в какую-либо переменную. Поэтому щелкнем на кнопке ОК. И напишем, например, переменную У равняется. Вот теперь, когда мы перещелкнули эту строчку, компьютер воспринял наше усилие уже правильно. Теперь выведем значение У при помощи Message Box. Введем следующим образом: MsgBox, далее текст "Вы ввели".Далее введем знак плюс и то значение, которое мы только что ввели. Это, конечно же, переменная У. А теперь попробуем запустить нашу подпрограмму, щелкнув на кнопке Run. Появился первонаперво наш вопрос с тремя кнопками - Да, Нет и Отмена. Щелкнем на кнопке Да. Это соответствует нажатию на кнопке Yes. OK. И появляется текст "Введите текст". Здесь, как мы видим, текст по умолчанию уже есть. Это введенное нами значение 12345. Если мы сейчас щелкнем на ОК, то это значение и будет использоваться в дальнейшем. Но мы можем с этим не согласиться и написать какую-либо другую аббревиатуру. Например, напишем abcd. Если же щелкнуть на кнопке ОК, то получим сообщение о вводе соответствующей аббревиатуры. Щелкнем на кнопке ОК. И в результате мы завершаем выполнение нашего макроса.
11.15. Рекурсивный вызов процедуры. Цикл For..Next На этом уроке рассмотрим, что такое рекурсивные процедуры, как их применять в наших программах. А также познакомимся с простейшим из циклов, циклом For Next. Для этого перейдем в окно Visual Basic, щелкнем на пункте меню Сервис, далее пункт Макрос и вызовем Редактор Visual Basic.В принципе, все то же самое можно было вызвать при помощи горячей клавиши Alt+F11. Сейчас щелкнем. Появилось, как мы видим, окно Visual Basic, переключимся на модуль 1, например, в котором мы можем вводить и редактировать нужные нам функции. Как мы видим, здесь у нас уже есть несколько функции. Мы можем, конечно же, их модифицировать, удалять, и т. д. Но сейчас мы это делать не будем, а вставим здесь новую функцию. Окно Immediate сейчас нам не нужно. Закроем его, чтобы освободить, так сказать, жизненное пространство. Сдвинемся вниз
Глава 11. Основы программирования на VBA
287
нашего модуля и здесь откроем новую функцию. Назовем ее Function. Выберем для нее какоелибо имя. Например, My Procedure - моя процедура. Далее открывающие и закрывающие скобки, поскольку параметры сейчас передавать этой процедуре не будем. Щелкнем на кнопке Enter. Как мы видим, автоматически сразу же наша функция отделилась от предыдущей соответствующей горизонтальной линией. А в конце компьютер автоматически добавил закрытие нашей функции, оператор End Function. Теперь все, что нам надо сделать, - это написать то, что должно выполняться при обращении к этой функции. Например, попробуем запросить от пользователя какие-либо данные. Для этого воспользуемся оператором InputBox. Напишем следующим образом: переменная Х, далее равняется.InputBox, далее скобки, внутри которых, как мы видим, сразу же появилась вот такая подсказка.Далее введем текст, который должен появиться в этом окне. Например, "Введите число". Закроем кавычки, закроем скобку. И если перещелкнем, то эта функция уже полностью готова к работе. Попробуем ее выполнить. Щелкнем на кнопке Run. И как мы видим, появилось вот это окошко с надписью "Введите число из поля для ввода", в котором мы можем написать в принципе какую-либо аббревиатуру. Сейчас все равно, что мы введем, число или нет, в любом случае, щелкнув на кнопке ОК, мы возвращаемся обратно в наш редактор Visual Basic. Теперь попробуем организовать некий цикл так, чтобы от нас требовалось ввести число, например, больше 5, а во всех остальных случаях, вот это соответствующее окно с вопросом появлялось бы снова и снова до тех пор, пока мы не введем число большее 5. Это можно организовать, конечно, при помощи функции IF с переходом или же при помощи организации цикла. Но мы можем поступить и по-другому. Можно организовать рекурсивный вызов процедуры самой себя до тех пор, пока не будет выполнено нужное нам условие. Щелкнем на кнопке Enter. Вот эту строчку с Х Input чуть-чуть сдвинем вправо при помощи табуляции, чтобы текст нашей программы было легче читать, и затем напишем оператор IF. Далее введем Х меньше или равно 5. Это условие, которое нас не устраивает. В этом случае Than, нажмем на Enter. А теперь надо написать то, что должно выполняться в этом случае. А именно, вызовем нашу процедуру опять - MyProcedure и нажмем на Enter. Далее напишем закрытие этого оператора IF - End IF. И теперь попробуем выполнить эту функцию. Для этого щелкнем на кнопку Run. Как мы видим, от нас требуется ввести какое-либо число. Если мы сейчас введем число меньше 5, например, введем на 2, щелкнем на ОК, то опять возвращаемся в предыдущее окошко. Если мы введем какое-либо число, которое будет больше 5, к примеру, напишем 33, щелкнем на ОК, то в этом случае выполнение нашей процедуры заканчивается. То же самое было бы, если бы мы ввели не число. Щелкнем, например, на кнопке Run и введем какое-либо значение, которое числом не является. Если мы сейчас щелкнем на кнопке ОК, то процедура прекращает свою работу, поскольку введенное нами выражение не удовлетворяет условию Х меньше 5. Попробуем теперь разобраться, как же работают циклические операторы. Для этого напишем какой-либо оператор цикла, оператор For. Сдвинемся чуть-чуть ниже в нашем модуле. Далее уберем вызов рекурсии. Для этого выделим вот эти строчки и щелкнем на кнопке Delete. Сейчас нам это уже не нужно. А затем организуем цикл For. Для этого введм запись - for, далее нам нужно выбрать переменную цикла. Пусть это будет i. Далее равняется: от одного, т.е. первого значения, до to - последнее значение цикла. Пусть будет от 1 до Х, который мы ввели строчкой ранее. Нажмем на кнопку Enter. Затем введем то, что должно выполняться во время работы этого цикла. К примеру, введем MsgBox. Выведем некую информацию, и в качестве информации выведем вот такой текст "Выполнять". Далее закроем кавычки, далее плюс и введем функцию STR от i. Т.е. здесь строгое представление вот этой переменной i. Продолжим, введем плюс и внутри кавычек напишем просто-напросто "Раз". Далее Enter. Ну и теперь закроем оператор цикла при помощи оператора Next i., т.е. следующее значение i.
288
TeachPro Microsoft Access 2003
Введем еще одну табуляцию на строчке, на которой находится MsgBox, и теперь попробуем выполнить нашу процедуру. Для этого щелкнем на кнопке Run. Появилось знакомое нам окошко с требованием ввести число. Введем какое-либо число, например, 4, щелкнем на кнопке ОК. Как мы видим, появился первый MsgBox - Выполнять 1 раз, щелкнем. Затем появляется второй раз, третий и четвертый раз. Все, на этом выполнение цикла закончилось. Рассмотрим теперь, как можно во время выполнения такого цикла прервать его и выйти из цикла. Для этого существует специальный оператор, оператор Exit For. Для выполнения цикла, конечно же, нам нужен какой-либо повод. Для этого введем оператор IF, и вместо MsgBox с одной кнопкой ОК, введем MsgBox с двумя кнопками ОК и Cancel. По результатам нажатия мы и решим, следует ли нам выводить сообщение дальше, или же прекратить наш цикл. После MsgBox введем скобку и далее после запятой, нужно выбрать, какой тип MsgBox нам нужен. Выберем ОК с Cancel. Вот этот выбор. Щелкнем на нем. Далее закроем скобку, равняется. И далее нам нужно выбрать, чему должно равняться значение, которое нам возвращает MsgBox, с чем мы сравниваем. В данном случае мы хотим сравнить с Cancel. Щелкнем дважды. И вот оператор IF у нас уже полностью готов. Щелкнем на кнопке Enter. Конечно же, появилось предупреждение об ошибке. Дело в том, что мы забыли ввести значение then. Об этом программа нам сейчас сообщает, отмечая неправильную строчку красным цветом. Щелкнем на кнопке ОК. Введем пробел и далее оператор then, которого от нас так добивался наш компьютер.Теперь щелкнем на кнопке Enter и далее нам нужно указать, что будет происходить при возвращении MsgBox к Cancel. А именно, exit for - выход из данного цикла. Далее Enter. Теперь нам нужно закрыть вот этот оператор IF. Поэтому напишем End IF. Далее введем вот здесь знак табуляции, и после этого эта процедура уже полностью готова. Уберем лишние пустые строчки, которые здесь образовались. Выделим и щелкнем на кнопке Delete и теперь попробуем запустить эту процедуру. Щелкнем на кнопке Run. Появилась надпись "Введите число". Введем, к примеру, число 6, ОК. Появилась надпись "Выполнять 1 раз". ОК. "2 раза", "3 раза". А вот если сейчас щелкнем на кнопке Отмена, то мы прекращаем выполнение цикла и также заканчиваем выполнение соответствующей процедуры. Как можно заметить, при выполнении этого цикла наша переменная i принимает значение от 1, это первое значение, и затем последовательно, все цифры - до Х. Т.е. после 1, идет 2, 3, 4, 5 и т.д. до последнего значения Х, что мы могли контролировать при помощи вот этой строчки "Выполнять определенное количество раз". Но дело в том, что этот цикл может выполняться не только в таком порядке, при возрастании от первого значения до последнего, но и в обратном порядке. Мы можем написать здесь Х, далее концом цикла у нас будет 1, и в конце надо ввести в данном случае Step и минус 1. Т.е. это тот шаг, на который будет изменяться наша переменная и в процессе выполнения нашего цикла. Запустим теперь. Щелкнем на кнопке Run. Введем в качестве числа, например, 10. ОК. Ну и, как мы видим, мы начинаем выполнять этот цикл, на этот раз с числа 10. Нажмем на кнопке ОК. Следующим числом, как мы увидим, является 9, ОК. 8, 7 и т.д. Если мы щелкнем на "Отмена", то, конечно же, мы прекращаем выполнение нашего цикла. Надо отметить еще одно обстоятельство - случай, если мы щелкнем на кнопке Run и введем какое-либо число, которое выходит за пределы интервала от Х до 1, который мы задавали в операторе for.Например, введем минус 10 и нажмем на кнопку ОК. Как мы видим, наш цикл вообще не выполнился ни один раз. Значение, которое мы ввели в качестве Х, оказалось меньше, чем 1. Поэтому такой цикл выпнить было невозможно.
11.16. Циклы Do While и Do Until Познакомимся теперь с другими видами циклов, такими как Do While и Do Until.Цикл, который сейчас у нас написан вот в этой подпрограмме, как мы видим - это цикл For. Этому циклу необходимо задавать границы, в которых и будет изменяться переменная цикла, в нашем случае i. Но далеко не всегда мы можем в цикле указать границы оператора цикла.
Глава 11. Основы программирования на VBA
289
К примеру, мы хотим, чтобы цикл просто-напросто выполнялся до выполнения определенного значения, а не просто, например, 10 раз. Чтобы таким образом написать наш цикл, закомментируем имеющиеся здесь операторы цикла. Для этого достаточно написать впереди апостроф и в начале этого оператора, в операторе For и в операторе If. А теперь запишем цикл немножко подругому. Оператор Do, далее While, т.е. сделать, пока будет выполняться определенные условия. А в качестве условия напишем, например, Х больше или равно 1. И пока это верно, будем опять выводить вот этот MsgBox, но на этот раз выводить будем, конечно же, не i, а значение Х. Теперь переменной цикла, как таковой, в этом цикле, цикле Do While, не существует. А теперь нам нужно закрыть наш цикл. Для этого в конце, после всех строчек, которые у нас должны повторяться внутри этого цикла, напишем опертор Loop, который и будет концом нашего цикла. Если мы в таком виде запустим нашу процедуру, то, если, конечно, мы не нажмем на кнопку Cancel в MsgBox, то она будет выполняться просто-напросто бесконечное количество раз, поскольку если условие Х больше и равно 1 выполняется в самом начале, то оно будет выполняться всегда. Ну и для того, чтобы учесть этот случай, введем оператор Х равняется Х-1. Т.е. во время очередного шага нашего цикла Х будем уменьшать на 1, вычитая его таким образом.Конечно же, 1 - это совсем необязательное число. Мы можем Х уменьшать и на любое другое число, например, в 2, 3, и даже 3 с половиной и т.д. Да и вообще тут может в принципе находиться любая функция или выражение, гораздо более сложное, чем просто вычитание или добавление 1. Например, при решении какого-либо уравнения это может быть достижение корнем этого уравнения определенной точности для исходной функции. В нашем случае пусть будет вот такое условие - Х больше или равно 1. А теперь запустим эту процедуру. Но, перед этим, конечно же, нам нужно исправить оператор Exit. Вместо Exit For, который у нас исправно работал для цикла For, нам сейчас надо ввести Exit Do, поскольку цикл у нас несколько другой - Do While.А теперь щелкнем на кнопке Run. Введем какое-либо число. Например, 9. ОК. Как мы видим, появилась надпись "Выполнять 9 раз, 8 раз", ну и т.д. А щелкнув на кнопке "Отмена", мы опять прекращаем выполнение нашей процедуры. Вместо цикла Do While, который выполняется до тех пор, пока верно соответствующее условие, мы можем написать цикл, который будет выполняться в обратном порядке - прекращение какоголибо условия. В этом случае вместо While нам нужно написать оператор Do Until. Вместо больше или равно 1, напишем просто-напросто равно 0. В этом случае цикл будет выполняться до тех пор, пока не выполнится условие - Х=0. Щелкнем на кнопке Run. Введем в качестве числа, например, 4. ОК. Появилась первая надпись "Выполнить 4 раза," ОК, 3 раза, 2 раза, 1 раз. На "Отмену" сейчас нажимать не будем. Пройдем до конца. ОК. И, как мы видим, при следующем значении 0 мы сразу же вышли из нашего цикла и соответственно из нашей процедуры. Что интересно, оператор Until можно написать не только в начале нашего цикла, но и в конце. Например, удалим вот этот текст. Выделим его и щелкнем на кнопке Delete. Запишем после оператора Loop Until и Х равняется 0. Пусть выполняется, пока Х не достигнет значения 0. Щелкнем на кнопке Run, введем опять какое-либо число, например, 3, ОК. Выполним 3 раза, 2 раза, 1 раз, ну и 0, конечно, уже не появляется, мы выходим из нашего цикла. Разница между этими двумя типами оператора цикла, при котором Until стоит в начале цикла или в конце, заключается в том, что в этом случае, хотя бы один раз этот цикл будет выполняться всегда, поскольку проверка условия находится в конце цикла.
290
TeachPro Microsoft Access 2003
А вот, если проверка Until находится в начале цикла, то, конечно же, если соответствующие условия не выполняются, то все операторы внутри цикла тоже выполняться не будут. Щелкнем, например, на кнопке Run. Если вместо числа Х мы введем минус 4 и щелкнем на кнопке ОК, то, как мы видим, хотя бы один раз эта операция выполнилась. Минус 4 - это, конечно же, не 0, но тем не менее, соответствующая надпись появилась. А, щелкнув на кнопке ОК, мы получаем число -5, далее -6, -7 и т.д., т.е. мы сейчас попали в непрерывный цикл. Сейчас, сколько бы мы не нажимали на кнопе ОК, до 0 мы никогда не доберемся, поэтому теоретический этот цикл выполняться будет бесконечное число раз. Конечно же, если мы не нажмем на кнопке Отмена. В этом случае, мы при помощи вот этого оператора Exit Do выходим из нашего цикла. А если мы запустим нашу процедуру, введем на этот раз число 1 и нажмем на ОК, то, как мы видим, хотя бы один раз эта процедура выполнилась. Если мы сейчас щелкнем на кнопке ОК, то увидим, что выполнилось условие Х=0, и прекратилось выполнение нашей процедуры.
11.17. Метки и переходы на метку Рассмотрим теперь такой оператор, как оператор GoTo, который был достаточно широко распространен на начальном этапе развития программирования. Но сейчас применение оператора GoTo обычно считается неоправданным и используется только в самых крайних случаях. В принципе, он практически всегда может быть заменен соответствующими операторами IF и Do, если их применять достаточно аккуратно. Исключением являются только проблемы, связанные с обработками ошибок, в которых нам как раз, и придется применять оператор GoTo по необходимости. А сейчас попробуем чуть-чуть модернизировать процедурe, которую мы создавали и которая выполняет некий цикл от оператора Do до Until. Как мы видим, у нас сейчас используется оператор Exit Do, для того чтобы отследить нажатие кнопки Cancel. В этом случае при нажатии на кнопку Cancel мы сразу же выходим на конец нашего цикла, в котором сейчас напишем еще один MsgBox. Введем в кавычках, например, просто-напросто "конец цикла". Если мы сейчас запустим нашу процедуру, щелкнем на кнопке Run, появляется надпись "Введите число". Например, введем 5. ОК. Далее выполняеть 5 раз, 4 раза, 3 раза. А если мы сейчас щелкнем на кнопке отмена, то появляется соответствующая надпись "Конец цикла". ОК. Но как нам быть, если мы хотим при возникновении вот этого MsgBox или в любом другом случае попасть не в конец цикла, а вообще выйти из процедуры. Для этого нам нужно написать не Exit Do, т.е. выйти из цикла Do, а Exit Function - выйти из нашей функции вообще. Выполним теперь таким образом. Щелкнем на кнопке Run. Введем, например, опять число 5. ОК. Появляется надпись "Выполнить 5 раза, 4 раз, 3 раз". А если мы сейчас щелкнем на кнопке "Отмена", то, как мы видим, выполнение нашей процедуры заканчивается. Мы даже не увидели вот эту надпись "Конец цикла", поскольку при нажатии на кнопку Cancel при помощи вот этой функции мы сразу же попали на End Function, т.е. на конец нашей функции. Она у нас прекратилась выполняться. Мы можем сделать то же самое, используя оператор GoTo. Вместо Exit Function напишем GoTo - безусловный переход, и далее нам нужно воспользоваться какой-нибудь меткой.
Глава 11. Основы программирования на VBA
291
Например, воспользуемся меткой out. Правда, ее не существует, и если мы ее сейчас вот в таком виде используем, то, конечно же, получим ошибку. Поэтому напишем эту метку где-либо, куда мы хотим перейти согласно оператору GoTo. Например, в конце функции введем out. Далее двоеточие, чтобы зафиксировать, что это метка. Перещелкнем. Как мы видим, метка out сразу же перешла к левому краю нашего текста. Метки всегда пишутся с начала строки. А теперь попробуем выполнить нашу процедуру. Щелкнем на кнопке Run. Появляется окно "Введите число". Введем 5. ОК. Выполнить 5 раз, 4 раз, 3 раз. Щелкнем на кнопке Отмена. Вот мы перешли на out и т.е. на конец нашей функции, используя оператор безусловного перехода GoTo.
11.18. Обработка ошибок Достаточно часто при выполнении программ мы сталкиваемся с такими понятиями, как какие-либо ошибки. Например, в поле для ввода могут быть видны совершенно не те значения, которые были ожидаемы при написании программы, или же могут происходить какие-либо арифметические неполадки. Например, деление на 0, корень из -1, и т.д. Могут быть ссылки на какие-либо несуществующие объекты, формы, запросы. В общем, ошибок может быть разнообразное количество. Хорошо написанный код должен справляться с этими ошибками, выдавая достаточно осмысленные предупреждения и обрабатывая эти ошибки по мере их возникновения. Например, если мы сейчас щелкнем на кнопке Run и вместо числа в поле для ввода ничего писать не будем. Щелкнем на кнопке ОК.Как видим, появляется вот такая ошибка Смещение типов Type mismatch. Здесь у нас появляется на выбор возможность нажатия на кнопку End, в этом случае мы прекратим выполнение нашей процедуры. Или же можем щелкнуть на кнопке Debug, и в этом случае выполнение нашей процедуры прекращается на том операторе, который и вызвал соответствующую ошибку. В нашем случае ошибка возникла из-за оператора Str, который пытается преобразовать некое число Х в его строковое представление. Но, поскольку Х мы вообще не ввели, то его преобразовывать из числа в строковое значение программа, конечно же, не смогла, и выдала нам сообщение об ошибке. Остановим выполнение нашей процедуры, щелкнув на кнопке Reset, и теперь попробуем выполнить обработку ошибки. Для этого напишем следующим образом. Щелкнем здесь на кнопке Enter. Далее введем оператор On Error и GoTo. Т.е. в случае ошибки мы перейдем к метке out. Cейчас запустим нашу процедуру и ничего здесь вводить не будем. Щелкнем на кнопке ОК и, как мы видим, никаких ошибок на этот раз Microsoft Access нам не выдал, а сразу же перешел на конец нашей функции, т.е. на вот эту метку out. В принципе, после выполнения обработки вот этой ошибки и после метки out мы можем записать и выдавать сообщение об ошибке. Для этого напишем, например, соответствующий MsgBox и в качестве MsgBox выведем текст ошибки. Для этого введем error и далее вот такой значок, значок доллара. Введем здесь отступ и попробуем запустить в таком виде нашу процедуру. Щелкнем на кнопке Run.
292
TeachPro Microsoft Access 2003
Опять число вводить не будем. Щелкнем на кнопке ОК. Как мы видим, сообщение об ошибке Type mismatch - смещение типов, выдалось в соответствующем диалоговом окне MsgBox. Щелкнем на кнопке ОК, и мы выходим в редактор Visual Basic, закончив соответствующую процедуру. Но существует еще одна неприятность в нашей процедуре. Если мы никакой ошибки допускать не будем и вот в таком виде будем выполнять нашу процедуру, то в ее конце после выполнения всего цикла мы опять попадем на вот этот MsgBox с Error. А это, конечно же, вызовет уже определенную неправильность в поведении нашей программы. Например, щелкнем на кнопке Run. Напишем здесь 2. ОК. Выполнить 2 раз, 1 раз, конец цикла. И далее появляется MsgBox, который пытается выдать нам сообщение об ошибке, которой на самом деле не существует, поэтому появляется вот такое абсолютно лишнее окно. Щелкнем на ОК. И для того, чтобы это не происходило, введем здесь конец функции, т.е. End Function. В этом случае после сообщения "Конец цикла" мы просто-напросто выйдем из процедуры. И аналогичным образом, вместо GoTo out напишем End Function, как обработку нажатия на кнопку Cancel. Вот в таком виде наша программа попадает в место, где выводится ошибка MsgBox с error, только в одном случае - если у нас произойдет переход по оператору On Error. Т.е. в случае, если произойдет какая-либо ошибка внутри нашей процедуры. В качестве сообщения будем вводить не только весь текст нашей ошибки, но и его численное представление. Для этого достаточно написать просто-напросто функцию Err. Если мы сейчас запустим наше приложение, то, как мы видим, при выполнении нашей процедуры сразу же возникла ошибка. Ошибкой является Block IF Without End If. Дело в том, что мы допустили синтаксическую ошибку. Вместо End Function у нас должно быть Exit Function. Так и напишем. То же самое и вот в этом месте. Теперь же прекратим выполнение этой процедуры. Запустим ее заново. Введем на этот раз вместо числа какую-либо другую аббревиатуру - текстовую. Если мы сейчас щелкнем на кнопке ОК, то попадаем в кодовое значение нашей ошибки. Это, конечно же, ошибка 13. Как мы помним, это была ошибка смещение типов. Щелкнем на кнопке ОК, и мы выходим из процедуры. Конечно же, пользоваться функцией Err мы можем для того, чтобы анализировать нашу ошибку и выполнять какие-либо определенные действия в зависимости от кода ошибки. Cейчас в качестве MsgBox, конечно же, лучше вводить его полное название - Error со знаком доллара, что выдает нам текстовое значение этой ошибки..
Глава 12. Специальные средства Access VBA
293
Глава 12. Специальные средства Access VBA (Visual Basic for Application) 12.1. Обычные переменные Типы и способы объявления Итак, на этом уроке мы поговорим об обычных типах переменных. Узнаем об их типах и способах их применения. До этого в наших функциях и процедурах мы не интересовались объявлениями переменных. Мы просто использовали их по мере необходимости. К примеру, вот здесь мы без всякого объявления использовали переменную Х, представляющую собой некую переменную, в которой мы в начале можем получить некое строковое значение из Input Box. А затем, после преобразования, она представляет собой целочисленное значение, которое мы можем использовать для оператора цикла. А переменная i, которую мы использовали в этой закомментированной строке, у нас была оператором цикла, т.е. представляла собой целочисленное значение. Но, несмотря на то, что переменную достаточно часто, особенно в языке Basic можно использовать без объявления, тем не менее объявление типов переменных имеет достаточно большое значение и достаточно часто применяется, когда нам необходимо явным образом указать на тип той или иной переменной. К примеру, создадим новый модуль для объявления наших переменных. Для этого щелкнем на пункте меню Insert, далее Module и введм следующую запись. Для объявления какой-либо переменной нам нужно написать ключевое слово dim. Далее имя той переменной, которую мы хотим объявить. Например, объявим переменную alpha, записав ее вот таким образом. Далее нам нужно написать ключевое слово as и далее выбрать непосредственно тот тип, который мы хотим присвоить нашей переменной alpha. Как видим, у нас автоматически появилось вот такое окошко, в котором перечислены все типы переменных, которые мы можем использовать в Visual Basic. В принципе, этот список достаточно большой, поскольку в него включены не только обычные простые типы переменных, но и так называемые объектные. Если простые типы переменных хранят внутри себя только какое-либо определенное значение какого-либо типа, например, целого, строкового и т.д., то объектные типы хранят информацию о каком-либо объекте со всеми своими свойствами и возможностями. Но сейчас переменную альфа попробуем объявить, как целую. Для этого наберем букву i, далее n, подразумевая, что мы хотим написать integer. Конечно же, у нас сразу появились все те типы, которые начинаются на in. Здесь есть и тип integer. Щелкнем на нем дважды. После этого объявление переменной у нас успешно завершилось. Щелкнем на кнопке Enter, и программа, конечно же, все ключевые слова преобразовал к своему стандартному виду, начинающемуся с большой буквы, а вот эта строчка приобрела свой окончательный вид. Переменная alpha у нас жестко объявлена, как переменная типа integer - целого типа, и поскольку она объявлена в соответствующем модуле из группы модулей, то ее область видимости представляет собой все пространство программы нашей базы данных.
294
TeachPro Microsoft Access 2003
Это означает, что мы можем использовать переменную альфа в любой форме, в любом запросе и т.д. Кроме типа Integer простыми типами данных являются типы Boolean, который может принимать два значения True и False, тип Byte, который представляет собой целое число от 0 до 255. Далее, конечно же, Integer Long, который представляет собой целочисленные значения. Тип Currency и Single, и далее Double - это уже тип данных с плавающей запятой, действительное число. Date - это тип данных, который хранит информацию о дате. Вот, например, объявление такого типа будет означать, что у нас alpha будет представлять собой дату. Можем написать переменную типа String. В этом случае alpha будет представлять собой строковую переменную. Ну и последняя из возможностей - это Variant. При объявлении этого типа наша переменная alpha будет представлять собой некий произвольный тип, который будет интерпретироваться в Visual Basic в зависимости от ситуации и от конкретной операции, которую мы проводим над этой переменной. При этом по мере возможности будет происходить преобразование одного типа данных в другой. Т.е., например, в начале вот этой alpha может быть присвоено строковое значение. Например, мы можем написать: alpha - равняется и далее в кавычках какое-либо число. А далее мы можем эту переменную alpha использовать, как целочисленное значение. Тогда это значение будет преобразовано к целочисленному значению и далее использовано достаточно правильно. Но, тем не менее, использование такого типа переменных, как Variant, может привести к определенным ошибкам при преобразовании одного типа в другой. К примеру, присвоим alpha какое-либо строковое значение, которое не является числом, а затем попробуем провести какую-либо арифметическую операцию - прибавить единицу, вычесть, и т.д. В этом случае возникнет ошибка несовпадения типа данных. Поэтому, конечно же, при написании программ предпочтение надо все-таки отдавать обычным типам данных и использовать типы данных Variant достаточно осторожно. Определим опять, например, вот эту переменную alpha, как дату. Напишем Date, далее введем еще одну переменную с явным его объявлением. Введем следующую запмсь. Dim, далее напишем, например, beta, далее ключевое слово As. И пусть beta у нас будет типом Boolean. Вот этот тип появился в поле нашего зрения. Щелкнем на нем дважды. Далее Enter. И теперь попробуем написать какую-либо функцию, в которой будем использовать эти переменные. Введем ключевое слово Sub - подпрограмма. Пусть эта подпрограмма называется myvars. Далее скобки, Enter. Конечно же, программа распознала подпрограмму, поставила нам конец подпрограммы End Sub, и отделила чертой эту подпрограмму от других. Далее введем так: переменная альфа - равняется, и попробуем ввести какое-либо значение даты. Для этого нам нужно воспользоваться решетками, внутри которых можем ввести какую-либо дату. Например, введем 1, далее 1, например, 2005 года. Если мы перещелкнем, то, как видите, компьютер воспринял нашу дату вполне корректно и привел эту строку к своему стандартному виду. Кроме даты, мы можем в переменной типа Даты еще ввести информацию о времени. Например, следующим образом. После даты введем 15, двоеточие 25, т.е. 15 часов 25 минут. Ну и, как мы видим, компьютер автоматически преобразовал наше имя к стандартному виду. 3 часа 25 минут 00 секунд PM. Теперь же попробуем ввести какое-либо значение для нашей второй переменной: beta равняется. И как мы видим, здесь у нас всего две возможности True или False. Программа достаточно четко подсказывает, какие возможности у нас есть в этих переменных. Например, выберем False. Попробуем теперь выполнить эту процедуру и посмотреть, как будут изменяться значения переменных. Введем остановки в нашей переменной. Например, введем остановку до выполнения первого из операторов. Для этого в соответствующем месте поставим красную точку, что будет означать точку остановки. Остановим еще и в месте End Sub и теперь попробуем запустить нашу процедуру. Щелкнем на кнопке Run. Как мы видим, программа остановилась на первом из наших операторов. Если подойдем к переменной alpha, то увидим, что пока она имеет значение только по умолчанию - ну-
Глава 12. Специальные средства Access VBA
295
левое - 0:00. И переменная beta тоже принимает некое значение по умолчанию. Это значение False. Если мы сейчас продолжим выполнение программы, то, подойдя, например, к переменной alpha, можно увидеть, что на этот раз она приняла то значение - 1 января 2005 года, которое мы задали этой процедуре. А значение beta, как было, так и осталось False. Выйдем теперь из выполнения нашей процедуры, щелкнув на кнопке Reset и снимем обе точки останова, щелкнув в соответствующих местах окна.
12.2. Пользовательские типы и массивы На этом уроке мы поговорим о пользовательских типах и массивах. Типы переменных, которые мы использовали до этого, были простыми типами и представляли собой одно значение какого-либо типа. К примеру, вот эта переменная alpha представляла собой дату, которой мы могли присваивать какую-либо любую дату, но только одну. В переменной alpha мы не можем хранить одновременно 1 января 2005 года и, например, 6 февраля 2003 года. Хранить можно только одну дату. То же самое относительно переменной beta. Она у нас представляла собой тип Boolean, и соответственно этому типу мы можем присвоить либо значение True, либо False, но только одно из них. В отличие от таких переменных, есть и переменные пользовательского типа, которые могут представлять собой объединение нескольких переменных. Рассмотрим это на примере. Пусть нам нужно объявить переменную, в которой мы хотим хранить некую информацию о каком-либо персонаже. К примеру, это такая информация, как отдельно имя, фамилия, дата рождения и, например, его высота. Сначала надо создать соответствующий тип. Для этого введем следующую запись: type определение нового типа. Далее введем имя. Например, пусть это будет MyRec. Enter. Теперь нужно ввести поля, которые будут у этого типа переменных. Введем знак табуляции, чтобы чуть-чуть ввести отступ для полей. Ну и введем такие поля, как имя, фамилия, дата рождения и, например, рост. В переменных этого типа мы будем хранить информацию об определенных персонажах. Поэтому напишем следующим образом. Фамилия - fam, далее As, ну и фамилия, конечно же, у нас должна быть типа String. Как только мы набрали первую букву S, появился вот этот тип данных String, щелкнем на нем дважды. Далее Enter. Следующее поле у нас будет Имя. Пусть это будет nam (name). Далее As. Это также должен быть тип String, Enter. Следующее поле будет иметь тип даты, поэтому это будет тип Date. Это у нас дата рождения dat, As, выберем тип Date и нажмем на клавишу Enter. И последнее поле, которое мы предназначим в этом типе переменных, - это будет высота - h, As. Высоту будем мерить в целых числах. Например, в сантиметрах. Поэтому выберем для этой переменной тип Integer, Enter. Теперь нам нужно закрыть определение этого типа. Закрывать будем при помощи стандартного оператора End Type. Определение типа у нас закончено вот в этих нескольких строчках, и мы можем переменные такого типа использовать во всех программах Microsoft Access, которая присутствует в нашей базе
296
TeachPro Microsoft Access 2003
данных - в формах, в запросах, и т.д. В частности, используем вот в этой процедуре myvars, которую мы писали ранее. Введем здесь следующую запись: определение новой переменной - Dim. Далее введем название для этой переменной. Пусть это будет MyRec1.Далее запишем As и определение типа, который мы хотим использовать. Введем my и, как мы видим, сразу появился наш тип MyRec, который мы только что определили. Тип MyRec появился в списке всех типов переменных, которые присутствуют и могут быть использованы нами в Microsoft Visual Basic. Щелкнем на клавише Enter. Далее попробуем присвоить какие-либо значения полям вот этой переменной MyRec1. Для этого напишем MyRec1 и точка. Появился список полей, которые есть у этой переменной. Выберем, к примеру, name, щелкнем дважды. Далее введем знак равенства и внутри кавычек запишем, например, имя Иван. Нажмем на Enter. Далее опять переменная MyRec1, точка. Выберем поле h - щелкнем на нем дважды. Далее знак равенства. И пусть высота этого человека равняется 175 см. Попробуем теперь определить значение переменных после выполнения этой процедуры. Для этого введем точку останова перед закрытием этой процедуры и выведем окно Immediate Window, для того чтобы мы могли непосредственно видеть результаты. Для этого щелкнем на пункте меню View и выполним команду Immediate Window, а теперь запустим выполнение этой процедуры. Для этого поставим курсор внутри процедуры, чтобы программе было понятно, какую именно процедуру мы хотим выполнить. Щелкнем на кнопке Run. Ну и, конечно же, мы остановились перед оператором End Sub. Если мы сейчас подойдем к вот этой переменной h, то, как мы видим, h от переменной MyRec1 равняется 175 см. Имя - Иван. В общем, все правильно. То же самое можем вывести в соответствующем окне. Если введем вопросительный знак, а далее MyRec1, точка, nam и щелкнем на кнопке Enter, то, как видим, мы получили значение Иван. Теперь введем вопросительный знак, MyRec1, точка h, то, как мы видим, высота равна 175 единицам. Если же введем вопросительный знак, далее MyRec1, точка и выберем переменную dat, то, как мы видим, дата равняется у нас пока нулевому значению, поскольку мы никакого значения этой переменной не присваивали. Попробуем исправить этот недостаток. Выполним отмену данной процедуры, щелкнув на соответствующую кнопку Reset. Введем здесь Enter, далее MyRec1 точка. Далее выберем переменную dat, щелкнем дважды, равняется, и присвоим ей значение переменной alpha. Для этого запишем здесь alpha и попробуем выполнить эту процедуру еще раз. Щелкнем на кнопке Run, и мы остановились в соответствующем месте. Попробуем теперь вывести значениеэтой переменной. Для этого встанем на соответствующей строчке в конце нее. Щелкнем на клавише Enter и, как мы видим, программа уже абсолютно правильно выдала нам, что значение даты в переменной MyREc1 равняется 1 января 2005 года. Выйдем теперь из этой процедуры, щелкнув на кнопке Reset и снимем вот эту точку останова.
12.3. Пользовательские типы и массивы Команда Debug.Print А теперь попробуем использовать массивы в нашей базе данных и в наших программах. Для этого создадим новый модуль. В пункте основного меню выполним команду Module и внутри этого нового модуля введем определение какого-либо массива. Для этого напишем опять ключевое слово Dim, далее имя для нашего массива. Пусть это будет просто-напросто ar. Далее, внутри скобок нам нужно определить размер массива. Пусть это будет, например, 10, далее as. Появляется опять список всех типов, который мы можем использовать для нашего массива. Выберем тип as Integer - целочисленный тип. Щелкнем дважды. После этого у нас уже полностью готов массив из 10 элементов целочисленного типа. Введем теперь какую-либо процедуру, внутри которой используем этот массив. Для этого напишем ключевое слово sub. Далее название для нашей процедуры. Пусть это будет MyAr. Скобки. Enter. End Sub конечно же, программа ввела автоматически. Далее введем цикл
Глава 12. Специальные средства Access VBA
297
for, переменная цикла i, равняется 0 to 9 - от 0 до 9. Дело в том, что обычно массивы начинаются с нулевого индекса. Далее щелкнем на кнопке Enter и поставим знак табуляции. После этого переменной ar, а именно ее конкретному значению i, присвоим значение i x i, т.е. i. в квадрате. Нажмем на клавишу Enter и затем введем Next i. Попробуем теперь выполнить эту процедуру. Поставим точку останова перед End Sub, для того чтобы мы могли оценить значение всех этих переменных. Выполним сейчас. Щелкнем на кнопке Run. Конечно же, мы остановились на точке останова. Далее введем интересующее нас значение переменной ar, к примеру, от 2. Enter. Как вы можете видеть, появилось сообщение об ошибке. Дело в том, что мы забыли ввести здесь вопросительный знак. Поставим его и щелкнем теперь на кнопке Enter. В результате получаем, что значение ar от 2 в нашем случае равняется 4. Конечно же, два в квадрате равно 4. Если мы поставим вопросительный знак, далее ar и в скобках, например, 8, нажмем на клавише Enter, то получим - 8 в квадрате, конечно же, равно 64. В принципе, мы могли использовать значение не только от 0 до 9, но и от 0 до 10, поскольку максимальное значение у нас в массиве как раз равно 10. Если мы сейчас введем здесь от 0 до 10, остановим нашу процедуру и запустим ее заново, то, как мы видим, программа вполне нормально выполнила эту процедуру, и мы можем даже запросить значение переменной ar в случае 10. Нажмем на клавишу Enter. Конечно же, 10 в квадрате равняется 100. А вот если мы вместо 10 напишем 11, остановим нашу процедуру и выполним еще раз, то, в данном случае мы получаем сообщение об ошибке - out of range. Это означает, что мы попробовали вызвать значение массива, которое выходит за пределы заданных нами размеров массива. Щелкнем на кнопке End, и мы прекращаем выполнение данной процедуры. Введем здесь опять 10, чтобы, конечно же, все было правильно. Отметим, что в качестве массивов мы можем использовать не только вот такие простые типы переменных, такие, как Integer, Boolean, String и т.д., но и разного рода пользовательские типы. Например, воспользуемся типом MyRec, который мы создавали ранее. Мы можем его использовать и в другом модуле. Любая информация, определенная вот в таком виде в модуле, не внутри какого-либо блока или процедуры, может быть использована и в других модулях, формах, запросах и т.д. Поэтому введем здесь вместо As Integer просто пробел и далее MyRec, вот он появился перед нами. Щелкнем дважды. Правда, если мы сейчас попробуем выполнить процедуру вот в таком виде, то, конечно же, получим сообщение об ошибке. Щелкнем на кнопке Run. И вот появляется сообщение об ошибке в связи с тем, что мы нашей переменной ar не можем присвоить целочисленное значение. Это у нас сооветствующая запись. Но, правда, остановив данную процедуру, мы можем нажать здесь на точке и присвоить, к примеру, вот этому виду переменной h соответствующее значение. Если мы сейчас щелкнем на кнопке Run, то, как видим, программа абсолютно нормально восприняла наши усилия, выполнив эту процедуру до конца. Щелкнем на кнопке Reset и попробуем задать какое-либо имя для одного из персонажей. Например, введем следующую запись. Ar, далее скобки, и например, число 5. Поставим точку и выберем из аписка name, щелкнем на нем дважды. Поставим знак равенства и внутри кавычек введем какое-либо имя. Например, Петя.
298
TeachPro Microsoft Access 2003
Выполним эту процедуру еще раз. Щелкнем на кнопке Run. В окне Immediate введем вопросительный знак, далее ar, далее какой-либо элемент этого массива. Например, 7. Поставим точку и выведем переменную h - высота. Как мы видим, все правильно. 7 в квадрате равняется 49. Еще раз введем вопросительный знак, ar и возьмем, к примеру, ту же самую 7. Поставим точку и попробуем вывести имя Name. Нажмем на клавишу Enter и, как мы видим, никакого значения мы не получили. Произошло это потому, что мы не присваивали никакого имени седьмому элементу. Теперь наберем вопросительный знак, далее ar и возьмем элемент массива пятый, которому мы присвоили соответствующее значение. Закроем скобку, точка. Опять выберем поле Name и нажмем на клавишу Enter. Как видим, у этого элемента массива как раз есть соответствующее значение. Остановим теперь выполнение этой процедуры, щелкнув на кнопке Reset, и снимем точку останова, щелкнув на соответствующем месте в левом части окна. Мы можем узнать значение переменных внутри функции, остановив ее работу какой-либо точкой останова, и вывести значение соответствующей переменной, воспользовавшись окном Immediate. Но, в принципе, можно поступить и по-другому, а именно: вывести значения переменных в процессе работы функции, не останавливая ее точкой останова. Для этого надо воспользоваться специальной функцией Debug.Print. Попробуем, например, вывести вот эту переменную массива - высоту - ar и точка h. Для этого щелкнем здесь на кнопке Enter, чтобы освободить новую строчку и напишем следующим образом. Debug - точка - Print. Далее, после пробела, введем имя переменной, которое мы хотим распечатать в данном месте. Пусть это будет, например, эта же переменная ar, элемент массива i, далее ставим точку и выбираем высоту h. Щелкнем дважды и теперь попробуем выполнить эту процедуру. Для этого щелкнем на кнопке Run и, как можно видеть в окне Immediate, мы получили значение соответствующих переменных массива. Вот здесь видны последние 4 значения. Можем подняться выше и увидеть все его элементы. Для того чтобы четко видеть значения массива вместе с его номером, можем вывести, наряду со значением переменной, еще его индекс в массиве. Для этого введем после функции Debug.Print элемент i, и поставим запятую перед следующей переменной. Теперь попробуем запустить функцию. Щелкнем на кнопке Run. Мы получили номер индекса и рядом его квадрат так, как мы и присваивали значение нашей подпрограмме. Трем соответствует 9, пяти - 25, шести - 36 и т.д. Таким образом, воспользовавшись оператором Debug.Print, мы можем в процессе работы подпрограммы узнать значение соответствующих переменных в окне Immediate.
12.4. Динамические массивы На этом уроке поговорим о динамических массивах. т.е. таких массивах, размерность которых заранее не известна и определяется в процессе работы программы. До сих пор все массивы, которые мы определяли, уже на этапе создания определения имели вполне определенную размерность. Но далеко не всегда это можно себе позволить. Например, попробуем создать функцию, которая бы анализировала какую-либо строковую переменную. Наша функция будет разбивать переменную на соответствующие, содержащие в ней буквы и записывать их в какой-либо массив. Для этого сначала создадим определение функции. Введем function, далее имя этой функции. Пусть это будет ReWord.
Глава 12. Специальные средства Access VBA
299
Далее в скобках нам нужно указать параметр, который мы будем передавать этой функции. Пусть это будет переменная w. Закроем скобку и нажмем на Enter. Как видим, программа распознала эту функция, добавив End Function и выделив ключевые слова синим цветом. А теперь введем знак табуляции, чтобы, как всегда, внести стройность в написание операторов, и далее определим те переменные, которые мы сейчас будем использовать в этой функции. Первым делом, определим массив. Массив определяется при помощи оператора Dim. Далее массив wArr. Это будет массив, в которой мы будем хранить каждую букву из текста w. Количество букв в этом массиве нам заранее не известно, поскольку длина текста нам тоже не известна. Она может быть достаточно произвольной. Конечно, мы могли бы задать в качестве массива достаточно большое число, предполагая, что уж больше этого числа текст точно не будет, но это достаточно непроизводительная трата ресурсов. Какое бы большое число мы не задали, с точностью гарантировать, что переменная w не будет содержать больше знаков, мы никак не можем. Поэтому зададим вот такой массив переменной длины, не задавая и не писав внутри вот этих скобок его размерность заранее. А теперь зададим отдельный элемент этого массива, как строчки, As, String. Далее запятая и определим другие переменные, которые мы сейчас хотим использовать. Допустим, это lw, в которой мы будем хранить длину нашей строки. Она будет иметь целый вид - Integer. Введем запятую. Далее введем еще переменную i, которую будем использовать, как счетчик массива. Она у нас будет, конечно же, As Integer - целочисленной. Далее щелкнем на клавише Enter и вычислим длину нашего текста - lw. Знак равенства. Длина текста вычисляется при помощи стандартной функции len, далее скобка, внутри которой вставим переменную w текстового типа, и щелкнем на клавишу Enter. Как мы видим, программа расставила весь наш текст так, как принято в стандартной форме - с пробелами между операторами. Далее мы уже можем определить размерность нашего массива wArr. Запишем следующим образом. Оператор ReDim - переопределение массива, пробел, массив wArr, далее скобки. Здесь нам нужно указать настоящую размерность массива. Укажем lw минус 1. В принципе, этого количества нам должно быть достаточно. Нажмем на клавише Enter. А теперь запишем цикл. Цикл пишется, как for. Далее переменная цикла i, равняется от 0 до lw - длина нашей строки минус 1. Нажмем на Enter. Введем здесь же Next i. Опять Enter. Введем еще знак табуляции и запишем здесь все то, что должно происходить внутри цикла. Внутри цикла, конечно же, должно происходить присваивание нашей переменной wArr при его итом элементе соответствующего значения. Соответствующим значением будет итая буква, которую мы получим, как результат выполнения функции Mid, которая как раз извлекает часть подстроки из строки. В качестве строки мы используем переменную w, запятая. Далее нам нужно указать номер элемента, начиная с которого мы хотим вытащить подстроку. Это у нас будет i+1, введем запятую и далее количество символов. Это количество будет равно 1, поскольку мы хотим вытаскивать итый символ, один единственный. Далее закроем скобку, нажмем на Enter. И теперь выведем все наши данные в окно Immediate, значение вот этого массива.
300
TeachPro Microsoft Access 2003
Для этого запишем функцию Debug - точка - Print, пробел, далее наш массив wArr, и, конечно же, итый элемент этого массива. Теперь попробуем выполнить эту функцию. Непосредственно нажать на кнопку Run нам не удастся, поскольку эта функция таким образом не запускается. Мы можем воспользоваться окном Immediate. Для этого напишем вопросительный знак, далее вот эту нашу функцию ReWord. Далее в скобках внутри кавычек напишем какой-либо текст. Например, введем слово function. Щелкнем на клавише Enter. И можно увидеть, что мы как раз получили разбивку текста function на отдельные буквы, которые выписаны подряд сверху вниз. В принципе, мы можем немножко модернизировать эту же функцию, например, выписав все эти буквы в обратном порядке. Для этого достаточно чуть-чуть изменить использование оператора Mid. Вместо i+1 в том месте, где выбираем нужный нам символ, напишем lw-i, т.е. начать с конца нашего текста. Попробуем сейчас выполнить ту же самую функцию. Для этого поставим вопросительный знак в окне Immediate. Далее введем ReWord, скобки, внутри которых в кавычках введем какой-либо текст. Например, напишем просто 1, 2, 3, 4, 5. Щелкнем на кнопку Enter и, конечно же, мы получили разбивку этого текстового значения в обратном порядке - 5, 4, 3, 2, 1.
12.5. Создание массива функцией Array Рассмотрим на этом уроке такой оператор, как Array, при помощи которого можно задать массив непосредственным образом. Попробуем это сделать. Для этого напишем новую подпрограмму, введем ключевое слово Subroutine - подпрограмма. Далее введем имя для нее. Пусть будет MakeArrow - создание массива. Поставим скобки. Нажмем на клавишу Enter. Как мы видим, компьютер одновременно создал End Subroutine. Поставим знак табуляции и теперь напишем следующим образом. Создадим новую переменную. Dim - ее определение. Затем пусть эта переменная у нас называется, например, ar. Далее As и выберем тип переменной Variant. Выберем этот тип, для того чтобы мы не были ограничены в выборе переменной. Под типом Variant, как мы помним, может подразумеваться любой тип переменной. Нажмем на клавишу Enter и затем введем следующую запись: наша переменная ar, знак равенства.Далее функция Array, скобка и далее, как мы видим, как нам подсказывает программа, мы можем ввести массив разнородных данных. Как мы видим, здесь у нас данные определяются, как Variant. Пусть первое значение будет 1, далее запятая, далее введем дробное значение - 1,25. Поставим запятую, затем введем какую-либо дату. Как мы помним, она пишется при помощи вот таких решеток, внутри которых напишем 1/1/1980 года. Далее запятая. Введем еще и какуюлибо строковую переменную. Например, String. Опять поставим запятую и введем еще целое число 25. Закроем скобку и нажмем на Enter. Далее попробуем в процессе работы этой подпрограммы вывести его значение. Для этого напишем цикл for, далее переменная цикла i, равняется от 0 to и далее следует ввести максимальный размер нашего массива. Как мы видим, здесь он равен 4. Enter. Далее напишем Next i, для того чтобыне забыть впоследствии, нажмем на Enter. Введем знак табуляции и теперь восрользуемся функцией Debug.Print. Щелкнем дважды на варианте Print и выведем значение соответствующего массива, массива ar.
Глава 12. Специальные средства Access VBA
301
Сделаем соответствующую запись в скобках. Теперь попробуем все это запустить и выполнить. Щелкнем на кнопке Run и можно увидеть, как последовательно распечатались значения элементов нашего массива. В принципе, впереди мы можем еще приписать номер i, для того чтобы было понятнее. Попробуем выполнить еще раз. Ну и на этот раз мы получили вполне конкретное отображение нашего массива со всеми его элементами, включая целые числа, дробные, дату, строчку и т.д. Причем весь этот массив мы задали непосредственным образом при помощи функции Array. А вот эту переменную ar мы определили ранее, как Variant. В принципе, определение As Variant на самом деле избыточное, мы вот это определение могли бы сократить и до одного оператора Dimension. Если мы сейчас щелкнем на кнопке Run, то получаем все то же самое, поскольку программа предполагает тип Variant по умолчанию, если в качестве определения типа переменной ничего не задано.
12.6. Основные объектные типы Просмотрщик объектов На этом уроке мы познакомимся с так называемыми объектными переменными. Раньше мы использовали переменные не объектного типа, а простого. Простые - такие переменные как Integer, String, Boolean и т.д. Здесь же, в модуле Vars объявим несколько типов переменных, которые будут переменными объектного типа. Вообще-то, объект - это некая сущность, у которой есть некоторые свойства и к которым могут быть применены разного рода методы, описанные в этом типе. В Access существуют три различных объектных типа. Это такие, как объектные типы данных Acces из библиотеки Access11. Выпишем некоторые из них следующим образом. Во-первых, определение переменных. Для этого воспользуемся ключевым словом Dim. Далее имя переменной. К примеру, возьмем для простоты просто Х1. Далее ключевое слово As, пробел и далее различного рода типы, которые мы хотим использовать для этой переменной. Например, возьмем As Form. Нажмем на клавишу Enter, и вот у нас переменная Х1 представляет собой переменную типа формы. Это как раз и является объектным типом Access. Далее напишем опять Dim, введем переменную Х2, As. Объектным типом является и такой тип, как Report. Щелкнем на клавише Enter. Далее опять Dim - определение переменной. Пусть это будет Х3, As. И, например, тип переменных Control. Переменные типа Control мы можем подразделить и конкретно на какие-то элементы управления. Например, введем следующую запись. Dim. Далее Х4, As. И далее, например, тип CheckBox. Кроме CheckBox, конечно, мы можем использовать и любые другие элементы управления, такие, как Label, Button и т.д. Это все переменные объектного типа из стандартной библиотеки Access.Кроме этого, существуют еще объектные типы данных из библиотеки DAO - Data Access Objects - объекты доступа к данным. Это такие объекты, как, например, Dim и возьмем Х5. далее As и возьмем такой тип, как, например, TableDef - таблица. Или, к примеру, Dim. Далее Х6, As. И, например, тип данных Recordset.
302
TeachPro Microsoft Access 2003
Тип данных TableDef служит для представления таблиц, структуры, индексов и т.д., а Recordset служит для представления таблицы или набора записей запроса. Для того чтобы использовать объектный тип из библиотеки DAO, нам нужно в пункте меню Tools щелкнуть на пункте References и здесь убедиться, что у нас стоит флажок на пункте Microsoft DAO 3.6 Object Library.В ином случае мы не сможем использовать такого типа объекты. Кроме этого, в последних выпусках Microsoft Access появилась новая библиотека, библиотека Microsoft ActiveX, которая позволяет использовать объекты ADO - ActiveX Data Objects. Как мы видим, эта библиотека у нас тоже включена. Щелкнем сейчас на кнопке Cancel. И напишем несколько объектов этого типа, типа DAO. Это такие как, например, переменная Х6, As и возьмем такой тип, как Connections. Этот тип аналогичен типу данных Database в DAO. В принципе, любая переменная может быть описана, как просто Object. Введем, например, Х8, далее As и Object - это ключевое слово для определения любого типа объекта. Он является родительским для любых других объектов и типа Access, и DAO, и ADO. Мы опять написали DAO вместо ADO Здесь, конечно же, должно было быть написано вот таким образом. Это у нас переменная типа ActiveX Data Objects. Как мы видим, количество объектных типов переменных достаточно велико и в них достаточно сложно разбираться. Именно поэтому в Microsoft Visual Basic существует специальная подсказка, путеводитель по такому типу данных. Эта подсказка позволяет нам определить, какие типы данных сейчас доступны и какие у них есть свойства и методы. Откроем просмотрщик объектов. Для этого открываем пункт меню View и выполняем команду Object Browser. Вот он появился перед нами. Здесь с левой стороны перечислены все объекты, а с правой стороны их методы и свойства. Наверху мы можем выделять, какие библиотеки мы хотим использовать. Здесь есть библиотеки Access, ADO, DAO, т.е. все то, что мы только что рассматривали. Для примера, посмотрим, какие методы и свойства есть у объектов типа Form. В результате мы получаем все варианты использования слова form в наших объектных типах. Как мы видим, членов свойств и методов, в которых использованы слова Форм достаточно много. Они использованы в разного рода классах и библиотеках. Их можно просматривать и остановиться на нужном нам типе. Раскроем сейчас результаты поиска и рассмотрим, например, просто класс Form. Здесь, как мы видим, у него есть достаточно много свойств. Это, например, свойство Activate. Оно представляет собой event, т.е. в некотором роде события, на которые откликается. Следующий член, например, это Active Control, который представляет собой Property и который имеет тип read-only, что означает, что мы можем только посмотреть значения этой переменной, но никак не присвоить ей какое-либо значение. Это необходимо из-за сущности данного свойства. Далее идет несколько членов с приставкой "after" - AfterInsert, AfterRender, AfterUpdate. В основном, это, конечно же, event, т.е. различного рода события. Можно двигаться вниз и посмотреть, какие у него есть методы и свойства. Например, такие как события Click, Close, свойства Caption, название данной формы, и т.д. Мы, кроме этого, можем посмотреть и те свойства и те типы, которые мы уже используем в нашей базе данных. Для этого щелкнем на вот этом выпадающем списке и найдем нашу базу данных first. Если мы щелкнем, то можем увидеть все те формы и модули, которые есть в нашей базе данных. Это такие как Форма 1, форма2, модули и т.д. Ну и здесь же перечисленны глобальные переменные. Например, если мы откроем форму 1 и форму 2 и 3, то можно увидеть их свойства. Можно увидеть, какие типы мы используем в наших модулях.
Глава 12. Специальные средства Access VBA
303
Как мы видим, в модуле 1 у нас использованы 3 различного типа переменных. Еще три в модуле 2, в модуле Vars мы определили 8 различного рода переменных от Х1 до Х8. Можем посмотреть, что представляет собой каждый из этих переменных, выделяя ее. В нижней части этого экрана можно увидеть, например, что Х5 представляет собой переменную типа TableDef, а Х7 - переменную типа Connection.
12.7. Объявление объекта DAO.Recordset Просмотр полей На этом уроке познакомимся с объектом DAO Recordset. В отличие от Access, в средствах программирования Visual Basic, мы можем работать с разными источниками данных. Эти источники данных включают не только не только открытую текущую базу данных, но и разные файлы Microsoft Access. Т.е. мы имеем возможность работать с файлами любых расширений, например, mdb. Давайте, продемонстрируем это. Для этого закроем текущую базу данных, с которой мы работали ранее. Щелкнем на вот этом крестике и создадим новую базу данных. Для этого щелкнем на кнопке Создать. В правой части нашего окошка появляется область задач. Здесь выберем пункт Новая база данных. Конечно же, сразу появляется вот такое стандартное окошко, в котором от нас требуют ввести имя для нашего нового файла. Как мы видим, компьютер по умолчанию подобрал нам имя db3. Мы можем согласиться или выбрать какое-либо нужное нам имя. Согласимся с тем именем, которое предлагает нам компьютер и щелкнем на кнопке Создать. В результате, как мы видим, компьютер создал нам новую базу данных. Пока эта база данных абсолютно пустая. В ней нет ни одной таблицы, ни одного запроса, ни одной формы. Теперь же, поскольку мы хотим экспериментировать с редактором Visual Basic, запустим его. Для этого, конечно же, мы можем щелкнуть на пункте меню Сервис. В пункте Макрос можно выбрать команду редактор Visual Basic или же можно просто щелкнуть на комбинации клавиш Alt+F11. Появляется редактор Visual Basic, в котором мы можем писать наши программы. Для этого прежде всего нам нужно создать новый модуль. В пункте основного меню Insert выберем команду Module. Вот он появился перед нами с названием Module1. Сейчас мы можем здесь писать нужные нам функции и подпрограммы. Убедимся, что нужные нам библиотеки включены. Для этого щелкнем на пункте меню Tools и откроем окно References. Как мы видим, все нужные нам библиотеки сейчас активизированы - И библиотека Microsoft Access 11 Object Library, и DAO Object Library, и Microsoft ActiveX Object Library. Это означает, что любые объектные типы сейчас доступны в наших программах. Щелкнем сейчас на кнопке ОК и приступим к написанию процедур. Попробуем теперь объявить новый объект типа DAO Recordset. И для того, чтобы яснее себе представить, как все это будет работать, создадим новую процедуру. Для этого напишем, конечно же, ключевое слово Sub, далее имя нашей процедуры. Пусть, например, это будет просто-напросто TryDao. Далее введем скобки. Enter. Как мы видим, у нас процедура уже полностью создалась вместе с ее закрытием при помощи оператора End Sub, автоматически введенным программой Microsoft Visual Basic.
304
TeachPro Microsoft Access 2003
Щелкнем на табуляции, чтобы чуть-чуть отступить и далее напишем определение новой объектной переменной. Введем оператор Dim, Далее имя новой переменной, пусть это будет, например, rstDAO (RecorsdsetDAO). Теперь введем ключевое слово As и выберем нужный нам объектный тип. Для этого введем сначала DAO, точка. Появляются все те возможности, которые есть у этой библиотеки. Здесь нам нужно выбрать тип Recordset. Как только мы наберем первые несколько букв, появится нужный нам тип. Щелкнем на нем дважды. Далее щелкнем на кнопке Enter. Присвоим теперь вот этой переменной rstDAO какое-либо значение. Как мы помним, для этого нужно воспользоваться не только знаком равенства, но и воспользоваться ключевым словом Set. Введем переменную rstDAO и знак равенства. Теперь же, откроем базу данных. Для этого напишем функцию OpenDatabase, далее скобка. Появляется подсказка, которая нам говорит, что здесь необходимо ввести по крайней мере один параметр. Это, конечно же, имя, которое представляет собой строковое выражение - полное имя и путь к соответствующему mdb файлу, который мы хотим открыть при помощи данного оператора. Сейчас откроем нашу старую базу данных first, которая так же, как и база данных db3, которую мы только что создали, находится в папке Мои документы. Полный путь мы сейчас можем не указывать, а написать в кавычках просто-напросто first mdb. Так и напишем. Теперь закроем скобку, точка. И далее откроем какую-либо таблицу из этой базы данных. Для этого воспользуемся оператором Open Recordset. Как только мы набрали букву "O", сразу же появился нужный нам оператор. Щелкнем на нем дважды. Далее введем скобки, внутри которых нам опять-таки нужно указать строковое выражение, которое представляет собой имя. Это, конечно же, имя таблицы из базы данных, которую мы хотим открыть. Пусть это будет таблица Сотрудники, которая присутствует в этой базе данных. Закроем скобку и нажмем на клавишу Enter. После этой операции переменная rstDAO уже полностью инициализирована и представляет собой первую запись в таблице Сотрудники внутри базы данных first.mdb. Попробуем теперь убедиться в этом. Для этого просто-напросто распечатаем какое-либо поле из этой записи. Для этого напишем, конечно же, функцию Debug.Print. Щелкнем на соответствующем операторе Print. Далее введем rstDAO - наша переменная. Далее скобки и внутри скобок нам нужно указать поле, значение которого мы и хотим распечатать. Возьмем, к примеру, поле Фамилия, которое присутствует в таблице Сотрудники. Закроем скобки и после этого мы можем запустить базу данных и увидеть, что представляет собой распечатка вот этой переменной, ее поле. При этом не надо забывать, что мы сейчас пытаемся узнать какую-то информацию из базы данных, которая не открыта в данный момент, информация находится в другой базе данных, находящейся у нас на жестком диске. Щелкнем на кнопке Run, и программа выдала нам фамилию, которая представляет собой первую запись в поле Фамилия таблицы Сотрудники. Попробуем узнать фамилию в следующей записи. Для этого сдвинем нашу запись на 1.Воспользуемся специальным оператором rstDAO - имя нашей объектной переменной. Далее точка и в появившейся подсказке выберем оператор MoveNext. Здесь, как мы видим, у нас есть и просто Move, MoveFirst, Last и т.д., все это операторы, которые позволяют сдвигать текущее положение записи в нашей базе данных. В нашем конкретном случае это касается базы данных mdb и его таблицы Сотрудники. Выберем MoveNext. Далее Enter. И опять попробуем распечатать ту же самую информацию, а именно фамилию. Чтобы не мудрствовать, выделим эту функцию. Далее с помощью правой кнопки мыши выполним команду Сору. Вставим сюда. Правая кнопка мыши и Paste. Теперь же выполним опять, но перед этим очистим окно Immediate, выделим здесь текст и щелкнем на кнопке Delete. Теперь встанем внутри нашей процедуры Sub и щелкнем на кнопке Run. И вот мы видим первые две фамилии из таблицы. Это фамилия Святова и фамилия Иванова, которые, конечно же, присутствуют в таблице Сотрудники. Теперь же попробуем вывести все фамилии из таблицы Сотрудники, все ее персонажи.
Глава 12. Специальные средства Access VBA
305
Для этого сейчас поступим несколько по-другому. Удалим вторую функцию Debug.Print, выделим ее и щелкнем на кнопке Delete. Она нам сейчас не нужна. А сейчас попробуем провести некий цикл по всем сотрудникам. Щелкнем здесь на кнопке Enter. Далее введем оператор цикла. Оператор цикла - это, конечно же, Do. Напишем его. Далее Until. Пусть этот цикл выполняется до тех пор, пока наша переменная rstDAO не достигнет своего последнего значения, которое определяется параметром EOF - End Of File. Конечно же, если мы проводим цикл, то нам нужно написать и закрытие оператора цикла при помощи соответствующего оператора Loop. Вот эти два следующих оператора - Print и MoveNext - сдвинем знаком табуляции для лучшего визуального вида нашей программы. А теперь внутри каждого элемента шага цикла будет происходить следующее: будет распечатываться соответствующая фамилия, которая находится внутри записи и далее будет происходить переход к следующей записи при помощи оператора MoveNext. И происходить это будет до тех пор, пока мы не достигнем конца файла и не сработает конец цикла при помощи оператора rstDAO.EOF. Попробуем сейчас все это выполнить. Перед этим очистим окно Immediate. Выделим вот эти две строчки и щелкнем на клавише Delete. Теперь встанем внутри нашей подпрограммы, щелкнем на кнопке Run и можно увидеть все те персонажи, которые являются сотрудниками в базе данных first.mdb. Как же нам поступить, если мы хотим получить более полную информацию о всех сотрудниках, а именно не только фамилию, но какие-либо другие данные. Например, еще и имя. Cделать это достаточно просто. Мы можем ввести, например, новую переменную, которую определим лучше всего за пределами нашего цикла. Пусть это будет переменная st строкового типа, поэтому введем тип As String. Щелкнем дважды на соответствующем выборе. Далее определим нашу переменную st, как имя. Для этого введем нашу объектную переменную rst.DAO. Далее введем соответствующее поле. Это будет поле "Имя". Точка после rst нам не нужна. Объектная переменная rstDAO таким образом пишется слитно. Далее знак плюс. Введем знак пробела в кавычках, для того чтобы отделить имя от фамилии. Опять плюс и затем напишем rstDAO, скобка, и затем поле Фамилия. Конечно же, ввести его следует в кавычках, закроем скобки после слова фамилия. Теперь при помощи оператора Debug.Print нам надо распечатать именно вот эту переменную st.Удалим все то, что распечатывалось ранее и напишем просто st. А теперь же попробуем выполнить подпрограмму. Но перед этим опять очистим окно Immediate. Выделим все данные и щелкнем на кнопке Delete. Встанем внутри нашей подпрограммы и щелкнем на кнопке Run. Как видите, мы получили полный список всех сотрудников вместе с именем и фамилией. При этом мы воспользовались объектной переменной rstDAO, которая является объектной переменной типа DAORecordset.
12.8. Редактирование записей в DAO.Recordset Объявление БД С помощью языка Microsoft Visual Basic мы можем в нашей базе данных Access не только просматривать записи, но и редактировать их. На этом уроке мы именно об этом и поговорим. Но перед этим перейдем в Microsoft Access. Мы можем щелкнуть на Alt+F11 или щелкнуть на вот этой кнопке Вид. Щелкнем, и вот открылась стандартная база данных, в которой, как мы видим, нет ни одной таблицы. Для того, чтобы наш урок был более предметным, создадим здесь таблицу. Проще всего его импортировать из какой-либо другой базы данных. Щелкнем на правую кнопку мыши. Выполним команду Импорт. Появляется окно со списком папок на нашем жестком диске и всех файлов Microsoft Access, которые находятся в нашем конкретном случае в папке Мои документы. Выберем базу данных first, щелкнем на ней дважды. Появляется вот это стандартное окошко, в котором можно выбрать, что мы хотим импортировать из этой базы данных - таблицы, запросы, формы и
306
TeachPro Microsoft Access 2003
т.д. Сейчас мы хотим импортировать таблицы и выберем, например, таблицу Сотрудники. Щелкнем на кнопке ОК. В результате появляется вот эта таблица Сотрудники, которая является точной копией таблицы из базы данных first. Щелкнем на названии таблицы дважды и можно увидеть, из каких записей и полей состоит эта таблица. Закроем ее. Перейдем теперь в редактор Microsoft Visual Basic. Для этого щелкнем на кнопке Alt+F11. Вот мы попали в нашу подпрограмму, которую мы редактировали ранее. Для того чтобы сейчас выполнить ее, нам внутри нашей базы данных совсем необязательно писать оператор Open Database. Мы можем, конечно, им воспользоваться и написать здесь имя нашей базы данных. В нашем случае это db3, вот таким образом внутри кавычек. Щелкнем теперь на кнопке Run, но перед этим очистим окно Immediate, выделив все и щелкнув на кнопке Delete. Теперь же выполним вот эту подпрограмму, встанем внутри нее, щелкнем на кнопке Run. В результате нам Microsoft Visual Basic выдает вот такую ошибку. Эту базу данных невозможно использовать, поскольку файл уже используется. Это понятно, поскольку база данных - это как раз та база данных, внутри которой мы находимся. Как же теперь выйти из сложившейся ситуации, если мы хотим провести какие-либо операции внутри этой базы данных? Щелкнем для начала на кнопке End, чтобы выйти из подпрограммы. Теперь вместо Open Database с именем текущей базы данных мы можем написать здесь ключевое слово CurrectDB - текущая база данных. Именно вот это ключевое слово нам и позволяет работать с нашей текущей базой данных. Попробуем сейчас выполнить нашу процедуру. Щелкнем на кнопке Run, и как мы видим, на этот раз все прошло совершенно гладко, и фамилии всех наших сотрудников появились в окне Immediate. При этом на этот раз действие выполнилось в текущей базе данных. А сейчас внутри нашего цикла, как мы видим, мы проходим по всей записи нашей таблицы, таблицы Сотрудники. Попробуем изменить данные в соответствующих, нужных нам полях. Для этого нам нужно воспользоваться специальным приемом. Нам следует получить разрешение на редактирование. Для этого чуть-чуть изменим все то, что находится внутри вот этого цикла. Сделаем следующую запись. Щелкнем здесь на клавише Enter. Далее поставим знак табуляции, теперь наша объектная переменная rstDAO, точка. И далее нам нужно воспользоваться оператором Edit. Вот мы набрали несколько букв, и появился соответствующий оператор. Щелкнем на нем дважды. А теперь мы можем изменить информацию в какое-либо поле этой таблицы. Для этого введем следующую запись. rstDAO, далее скобка. Внутри скобок нам нужно написать то поле, которое мы хотим отредактировать. К примеру, запишем внутри кавычек "Дата рождения", такое поле у нас имеется внутри этой таблицы. Закроем скобки. А теперь введем знак равенства и в качестве даты рождения можем выбрать любую нужную нам дату. Для начала поступим следующим образом. Введем решетки, внутри которого напишем, например, первое, первое 1980 года. И для того чтобы в дальнейшем мы могли видеть, что у нас получилось, в окне Immediate выведем информацию о дате рождения. Для этого выделим вот это поле "Дата Рождения" в нашем объекте rstDAO. С помощью правой кнопки мыши выполним команду Сору.
Глава 12. Специальные средства Access VBA
307
Скопируем и вставим в конце нашей переменной st. Для этого напишем здесь плюс. Далее в кавычках пробел, далее плюс, и далее вот этот скопированная нами в буфер обмена информация о дате рождения. Нажмем на правой кнопке мыши и выполним команду Paste. А теперь вернемся в начало нашей подпрограммы, запустим ее и посмотрим, что у нас получилось.
12.9. Редактирование записей в DAO.Recordset Щелкнем на кнопке Run, но перед этим очистим окно Immediate. Для этого нажмем на комбинации клавиш Ctrl+A, чтобы выделить в нем все данные. Далее щелкнем на клавише Delete, встанем внутри подпрограммы и щелкнем на кнопке Run. Как мы видим, в результате выполнения нашей программы у нас возникла ошибка. Посмотрим, в чем она заключается. Щелкнем на кнопке Debug. В результате мы попадаем на ту строчку, которая вызвала ошибку. Если приглядеться, то можно увидеть, в чем заключается ошибка. В суммировании, для того чтобы получить строковую переменную, мы использовали вот это поле "Дата Рождения" переменной rstDAO. При этом мы забыли преобразовать его к строковому виду. В результате как раз и возникла аварийная ситуация. Щелкнем на кнопке Reset, чтобы остановить выполнение нашей программы, и преобразуем это поле к строковому выражению. Для этого напишем здесь впереди аббревиатуру - оператор str - String. Далее скобка. Перейдем в конец строки при помощи клавиши End на нашей клавиатуре. Закроем скобку. Далее перейдем в начало строчки нашей подпрограммы и попробуем выполнить ее опять. Щелкнем на кнопке Run и, как мы видим, на этот раз все прошло вполне благополучно. Появились все наши сотрудники. Правда, дата рождения у них у всех теперь одна и та же - 1 января 80 года. Но это и неудивительно, поскольку мы именно так и задали в нашей подпрограмме. Сейчас можно перейти в Microsoft Access при помощи соответствующей кнопки. Если щелкнем на кнопке Сотрудники, то можно увидеть, что, несмотря на все наши усилия изменить дату рождения сотрудников, здесь это не отразилось. Судя по всему, где-то была допущена ошибка. Давайте, закроем таблицу. Перейдем в базу данных при помощи клавиш Alt+F11, и отметим одну допущенную нами ошибку. Открыв для редактирования соответствующую запись объекта rstDAO при помощи оператора Edit, мы забыли зафиксировать наши изменения. Именно поэтому при переходе к следующей записи при помощи оператора Move Next, у нас все изменения они просто-напросто потерялись. Поэтому, прежде чем выполнить операцию Move Next, нам необходимо ввести еще один оператор вот в этом месте. Щелкнем на клавише Enter. Далее введем переменную rstDAO, поставим точку. И далее выберем оператор Update. Вот этот оператор, щелкнем на нем дважды. После этого, как раз и происходит, так сказать, утверждение всех изменений в текущей записи. Запустим процедуру еще раз. Предварительно очистим окно Immediate. Встанем здесь, щелкнем на комбинации клавиш Ctrl+A и на клавише Delete. Теперь запустим эту подпрограмму, находясь внутри нее. Щелкнем на кнопке Run. В принципе, вроде бы все нормально. Перейдем обратно в Microsoft Access и откроем таблицу Сотрудники.
308
TeachPro Microsoft Access 2003
На этот раз, как мы видим, у нас все получилось, как и надо. Дата рождения у всех персонажей абсолютно идентичны, как будто все они являются близнецами - это 1 января 1980 года. Попробуем ввести теперь некий элемент случайности для наших персонажей. Для этого переключимся обратно в нашу базу данных. Закроем таблицу и нажмем на комбинацию клавиш Alt+F11. Теперь переключимся в Microsoft Visual Basic и теперь запишем дату рождения немножко по-другому. А именно, воспользуемся генератором случайных чисел rnd. К дате 1 января 1980 года прибавим случайное число. Для этого введем здесь еще плюс, далее генератор случайный чисел rnd. Введем скобки. Этот генератор меняется от 0 до 1, поэтому умножим его на какое-либо число, достаточно большое, например, на 10000 и преобразуем к целому значению. Для этого впереди напишем оператор int - Integer, поставим запись в скобки. А теперь выполним эту процедуру еще раз, предварительно, конечно же, очистив окно Immediate. Щелкнем на комбинации клавиш Ctrl+A и далее на клавише Delete. Встанем внутри нашей процедуры. Нажмем на кнопке Run. И, как мы видим, на этот раз у нас дата рождения наших сотрудников варьируется в широких пределах при помощи генератора случайных чисел. Можно переключится в Microsoft Access, открыть таблицу сотрудников и увидеть, что соответственно нашей записи они разделились в достаточно широком диапазоне дат. Правда, оказывается, что директором нашего предприятия является Иванов, которому всего несколько лет от роду, но, тем не менее, такое, наверное, тоже иногда бывает, хотя, скорее всего, достаточно редко. Закроем нашу таблицу Сотрудники и перейдем обратно в Microsoft Visual Basic, нажав на комбинацию клавиш Alt+F11. Рассмотрим теперь, как в объектах DAORecordset мы можем использовать элементы SQL запросов. Для этого обратим внимание, как мы вызываем соответствующую таблицу в операторе OpenRecordset. Как мы видим, мы просто-напросто внутри кавычек записали название нашей таблицы. Но мы можем поступить несколько по-другому. Напишем теперь следующим образом: оператор Select, каким обычно начинаются SQL запросы. Далее выберем все поля данной таблицы. Для этого просто-напросто введем звездочку. Далее from и далее имя таблицы у нас уже есть. Сейчас закомментируем те строчки, в которых мы проводили редактирование нашей базы данных. Введем здесь знак комментария. Эти три строчки нам сейчас не нужны. Ппопробуем выполнить эту процедуру, но предварительно очистим окно Immediate. Для этого в этом окне нажмем не комбинации клавиш Ctrl+A и на кнопке Delete. Теперь встанем внутрь нашей процедуры и щелкнем на кнопке Run. Можно увидеть, что мы получили все то же самое, что и раньше, а именно: имя, фамилию и дату рождения всех наших сотрудников. Мы можем и дальше модернизировать нашу процедуру. Например, если нам не нужны все поля таблицы Сотрудники, мы можем вписать прямо имена тех полей, которые нам нужны. Это, конечно же, имя, запятая и фамилия. А теперь очистим окно Immediate с помощью кнопки Delete. Запустим опять нашу процедуру, щелкнем на кнопке Run. В результате мы получаем сообщение об ошибке, элемент не обнаружен в данном семействе. Щелкнем на кнопке Debug и, посмотрев на ту строчку, которая вызвала ошибку, можем понять, в чем она заключается. Конечно же, поля Имя и Фамилия мы определили в нашем запросе, а вот поле Дата Рождения мы забыли здесь указать. Поэтому программа его не нашла и выдала нам ошибку. Остановим выполнение процедуры и вставим здесь это недостающего поля. Поставим запятую и поле - Дата рождения сотрудников. Отметим, что, в принципе, большие и маленькие буквы мы можем использовать по собственному желанию. Компьютер их воспринимает одинаковым образом. То же самое мы не можем сказать о языке С, где большие и маленькие буквы имеют разный смысл и идентификатор, написанный с разным регистром, будет определять разные переменные. А в случае Microsoft Visual Basic большие и маленькие буквы абсолютно идентичны в операторах.
Глава 12. Специальные средства Access VBA
309
Теперь же запустим нашу процедуру. Щелкнем на кнопке Run.На этот раз, как мы видим, у нас все прошло нормально. Мы получили имена, фамилии и даты рождения всех наших сотрудников в том виде, в котором это все представлено у нас в таблице. Попробуем теперь воспользоваться тем, что мы выполнили операцию Select и выбрали именно три поля из нашей базы данных - Имя, Фамилия и Дата Рождения. Именно в такой последовательности это все и отображается у нас в записи. Поэтому вместо имени, фамилии и даты рождения, можно прямо указать номер поля. Например, вот поле номер 0. Вместо фамилии у нас будет номер поля 1, а дата рождения будет представлять собой поле номер 2, поскольку нумерация у нас идет от нуля. Щелкнем теперь на кнопке Run. Предварительно очистив окно Immediate, встанем внутри нашей процедуры и щелкнем на кнопке Run. Мы опять получаем правильный результат - имя, фамилию и дату рождения наших персонажей, хотя мы теперь получили поля при помощи индексов, а не при помощи указания названия полей. Теперь же попробуем, модернизировав нашу процедуру, вывести не всех сотрудников, а, к примеру, только молодых, а именно тех, дата рождения которых больше определенной даты. Для этого нам нужно модернизировать оператор Select. Перейдем в его конец и напишем здесь следующим образом. Введем некое условие. Для этого напишем ключевое слово where - где - и далее то условие, которому должна удовлетворять наша запись. Пусть условие будет следующим. Возьмем "Дата рождения", и пусть дата рождения будет больше, чем 1 января 1991 года. Для этого введем решетки, внутри которых напишем 1/1/1991. А теперь попробуем выполнить нашу процедуру. Опять предварительно очистим окно Immediate. Для этого встанем сюда, выполним Ctrl+A выделить все. Щелкнем на клавише Delete. Перейдем внутрь нашей процедуры и щелкнем на кнопке Run. Как мы видим, мы получили информацию о всех тех сотрудников, которые родились после 1 января 1991 года - их 4 человека. Таким образом, воспользовавшись объектной переменной типа DAO.REcordset, мы можем выполнить достаточно тонкие операции по работе с записями в таблицах как текущей базы данных, как сейчас, так и любой базы данных, существующей на жестком диске. Мы смогли, как непосредственно вызвать таблицу и что-либо проделать с записями, так и, воспользовавшись операторами SQL, при помощи Select и далее о запросе по соответствующему синтаксису SQL, получить нужные нам записи и вывести информацию о них. Конечно же, если мы хотим использовать более сложные и тонкие операторы Select из SQL запросов, то можно их сформировать в виде запросов внутри Microsoft Access. Далее следует просмотреть соответствующую текстовую запись в запросе и перенести ее в нашу процедуру, а затем уже ее здесь модернизировать и доработать. Это достаточно распространенная технология. Сейчас мы оператор Select написали прямо здесь, поскольку от нас многое не требовалось. Мы просто-напросто выбрали несколько записей и поставили некое условие для даты рождения. Это достаточно простое условие - "Больше некоторой даты". Для этого нам понадобилось лишь написать короткую строчку оператора Select.
310
TeachPro Microsoft Access 2003
Глава 13. Специальные средства Access Visual Basic for Application (продолжение) 13.1. Объект ADODB.Recordset На этом уроке мы поговорим о новой технологии доступа к базам данных, технологии ADO, о работе с компонентами ADODB.Recordset. Но, прежде, чем мы рассмотрим это все на примерах, сохраним наш модуль под другим именем. Как вы помните, в этом модуле мы ознакомились с технологией работы с базами данных DAO и поэтому переименуем наш модуль 1 в модуль DAO. Для этого достаточно изменить в свойствах - Properties - соответствующие наименования. Вместо 1 напишем здесь DAO. А теперь введем новый модуль. Щелкнем на меню Insert и выполним команду Module, вот появился он перед нами. Изменим его имя и вместо модуля 1 напишем модуль ADO. Щелкнем где-либо и теперь можем приступить уже непосредственно к работе с объектами ADO. Создадим теперь новые переменные. Для этого, конечно же, воспользуемся ключевым оператором Dim по определению новой переменной. Далее создадим новую переменную, которую назовем cnnADO. Под cnn имеется в виду connection, поскольку первый из этих объектов у нас будет отвечать за connection - за связь с базами данных. Теперь, конечно же, напишем ключевое слово As, далее пробел. Теперь нам необходимо еще указать ключевое слово New, выберем его, щелкнем дважды. Далее опять пробел и теперь используем оюъект ADODB. Поэтому введем adodb, вот она появилась перед нами. Щелкнем на ней дважды. Теперь поставим точку. И вот теперь уже появились конкретные необходимые нам типы объектных переменных. Ну и первое, что нам нужно, - это выбрать Connection. Щелкнем здесь дважды, и уже теперь у нас есть полностью готовый объект для связи с базами данных по технологии ADO. Щелкнем сейчас на клавише Enter и создадим вторую переменную. Для этого опять введем Dim. Теперь у нас будет переменная rstDAO. Далее опять ключевое слово As, New, пробел, опять ADODB, вот она появилась перед нами. Щелкнем на ней дважды. Поставим точку и на этот раз выберем Recordset. Вот мы набрали первые буквы и Recordset выделился. Щелкнем на нем дважды. Нажмем на Enter. И вот у нас уже обе необходимые нам объектные переменные готовы. Одна переменная отвечает за связь, а вторая - непосредственно за работу с записями. А теперь, для того чтобы мы могли на практике использовать эти объектные переменные, создадим новую процедуру Subroutine. Для этого введем оператор Sub, далее пробел, назовем нашу процедуру, например, TryADO. Далее, конечно же, скобки. Enter. И вот новая процедура полностью создана вместе с оператором End Sub, который программа добавила нам автоматически. Поставим знак табуляции, чтобы чуть-чуть внести стройность в написании нашей программы. А теперь напишем переменную cnnADO и первое, что нам нужно, - это выбрать провайдера, так сказать, некого посредника, который поможет нам при связи с базами данных. Поставим здесь точку, далее введем тип провайдер. Вот мы набрали pr - первые 2 буквы - и сразу же появилось нужное
Глава 13. Специальные средства Access VBA (продолжение)
311
нам свойство. Щелкнем дважды. Далее знак равенства и в кавычках напишем название Microsoft.Jet.OLEDB.4.0. В качестве провайдера может выступать не только провайдер с вот таким именем, но и многие другие провайдеры. Но сейчас этот провайдер нас вполне устраивает. Поэтому щелкнем на клавише Enter. А теперь напишем опять нашу переменную cnnADO, точка. И теперь воспользуемся методом Open. Вот он появился перед нами. Щелкнем здесь дважды. И сейчас нам нужно указать ту базу данных, которую мы хотим открыть для работы с этим методом. Откроем, базу данных, которую мы хорошо знаем - базу данных first. C этой базой данных мы довольно много работали, поэтому так и напишем: first.db. Поскольку она у нас находится в папке Мои документы, точно так же как текущая наша база данных DB3, поэтому путь к этому файлу указывать необязательно. Хотя в общем случае, конечно же, необходимо было бы написать полный путь для гарантированного доступа. Сейчас оставим так, как есть. Щелкнем на клавише Enter. Теперь воспользуемся второй из объектных переменных, которую мы создали, а именно Recordset.ADO. Конечно же можно заметить, что мы ошиблись ранее, когда набирали название этой переменной. Нам следовало набрать rstADO, а не rstDAO, поскольку мы сейчас работаем именно с данными типами объектов. Исправим эту ошибку, далее точка и воспользуемся его свойством ACtiveConnection. Вот оно появилось, щелкнем на нем дважды. Введем знак равенства и в качестве активного соединения ACtiveConnection, конечно же, воспользуемся вот этим соединением cnnADO. Так и напишем - cnnADO и нажмем на Enter. Ну и после того, как мы уже успешно соединились, можно открыть какую-либо таблицу из нашей базы данных first. Для этого введем Recordset - rstADO, точка. Выберем тип Open. Вот он появился перед нами, щелкнем дважды, и теперь нам нужно открыть какую-либо таблицу. Перед нами появилась подсказка, в которой необходимо указать хотя бы один параметр, в качестве которого выступает имя таблицы. В кавычках введем название нашей таблицы Сотрудники. Далее нажмем на Enter. Ну и теперь уже, после всех наших трудов, мы можем вывести что-либо на печать на экране. Для этого введем Debug.Print. Щелкнем дважды на соответствующем методе и выведем на печать из нашей записи rstADO какое-либо поле. Поставим точку. Далее, например, выберем тип Fields, щелкнем на нем дважды и выведем какое-либо поле. Нам необходимо указать индекс, номер нашего поля. Например, напишем цифру 3, выводя третье по счету поле. А теперь щелкнем на клавише Enter. И последняя операция, это закрытие нашего соединения - cnnADO точка Close. Вот он появилось перед нами. Щелкнем дважды. И теперь после всех наших мучений можем запустить эту процедуру и посмотреть, что она выдаст нам в результате своей работы. Щелкнем на кнопке Run. В результате работы нашей программы, как мы видим, она выдала нам сообщение об ошибке. Произошло это из-за того, что мы написали здесь db, вместо vdb, поэтому щелкнем на кнопку End и вставим недостающую букву "m". Далее щелкнем опять на кнопке Run и, как мы видим, мы получили то, что было написано в третьем поле нашей таблицы Сотрудники. Если мы, к примеру, вместо третьего поля напишем второе и, очистив окно Immediate, запустим нашу процедуру, для этого надо на нее встать, щелкнув на кнопке Run, мы получим фамилию первого из сотрудников, который находится у нас в соответствующей таблице. Попробуем теперь вывести список фамилий всех сотрудников в нашей таблице Сотрудники. Для этого, конечно же, необходимо воспользоваться соответствующим оператором цикла. Сделаем здесь следующую запись. Перед Print щелкнем на кнопке Enter. Далее напишем Do Until, далее rstADO и точка. Воспользуемся его свойством EOF - конец списка. Щелкнем дважды, теперь перещелкнем. Оператор Do у нас уже зарегистрировался. Далее сместим Debug.Print при помощи табуляции.
312
TeachPro Microsoft Access 2003
Нажмем теперь на клавише Enter и напишем сдвиг к следующей записи в нашей таблице, иначе наш цикл зациклится и будет выполняться бесконечно. Введем переменную rstADO, точка и далее MoveNext - перейти к следующей записи. Щелкнем дважды. Enter. И введем закрытие цикла при помощи оператора Loop. Выполним теперь эту процедуру. Очистим сперва окно Immediate. Встанем внутри процедуры и щелкнем на кнопке Run и можно увидеть список фамилий всех наших сотрудников, который исправно выдал нам Visual Basic.
13.2. Блок With. End With Редактирование записей в ADODB.Recordset На этом уроке познакомимся с блоком With и End With, а также попробуем редактировать записи в наших таблицах при помощи технологии ADO. Если мы сейчас обратим внимание на код, который мы записали в нашей процедуре, то можно увидеть, что здесь довольно много повторяющихся кусочков текста. Вот, например, эта переменная cnn повторяется довольно много раз, точно так же, как и переменная rstADO. Для того чтобы мы могли чуть-чуть сократить количество текста в наших программах, особенно, если у нас какие-либо из аббревиатур имеют достаточно большую длину, есть специальная возможность, а именно - блок With. Щелкнем, например, вот здесь на клавише Enter и напишем следующим образом. With. Далее нам нужно указать ту аббревиатуру, которую мы хотим использовать в качестве повторяющихся кусочков текста. Это у нас аббревиатура cnnADO. Далее перейдем на следующую строчку и в конце, после вот этих двух строчек, введем блок End With. А теперь вот эти две строчки сдвинем при помощи знаков табуляции. И одновременно с этим мы можем вполне спокойно удалить вот это название объекта. Выделим и удалим его. Выделим и в нижней строке, щелкнув на нем дважды и нажав на клавишу Delete. И теперь вот в таком виде можем воспользоваться нашей процедурой. Программа автоматически понимает, что в местах, где у нас стоит точка, ему нужно добавить целиком название вот этого объекта cnnADO. В принципе, даже при наборе текста в нашей программе, все это работало бы точно так же, как бы если мы написали вот этот объект. К примеру, нажмем на клавишу Enter и нажмем на точку, и сразу же появляются все те свойства, которые были у вот этого объекта cnnADO. Например, возьмем метод Open. Вот, как мы видим, он появился перед нами. Если мы щелкнем дважды и выберем его, дальше мы могли бы задать открытие какой-либо базы данных. Сейчас выделим и щелкнем на кнопке Delete, чтобы убрать вот эту лишнюю строчку, она нам сейчас не нужна, и напишем новый оператор With. На этот раз воспользуемся вторым объектом - rstADO. Уберем его из наших последующих строчек. Щелкнем на клавише Enter после оператора цикла и напишем здесь закрытие оператора With End With. А теперь вот эти несколько строчек сдвинем. Для того чтобы не сдвигать по одному, мы можем выделить целый блок, состоящий из нескольких строчек, щелкнуть сейчас на кнопке табуляции, и вот этот весь кусок текста сдвинулся вправо на соответствующую величину табуляции.
Глава 13. Специальные средства Access VBA (продолжение)
313
Сейчас вот эту переменную rstADO можно удалить. Выделим ее и нажмем на клавишу Delete. Щелкнем дважды и в этом месте и опять нажмем на Delete. И то же самое перед оператором MoveNext, уберем и здесь название объектов. Уберем и из оператора Debug.Print. Теперь наша процедура, благодаря оператору With, выглядит несколько другим образом. Попробуем теперь выполнить все это. Но перед этим очистим окно Immediate. Нажмем на комбинацию клавиш Ctrl+A, чтобы выделить весь текст, и затем на клавише Delete. Перейдем внутрь нашей процедуры. Щелкнем на кнопке Run. Ну и, как мы видим, мы получили тот же самый результат, а именно список всех сотрудников в окне Immediate. А теперь же попробуем отредактировать что-либо, т.е. что-либо изменить в наших записях в таблице Сотрудники. Попробуем, например, поменять местами два поля, поле второе и третье, в которых хранится информация об имени и должности сотрудника. Выведем на печать оба этих поля, для того чтобы мы могли видеть, что из этого получится. Для этого выделим вот это поле Fields. Далее щелкнем на правую кнопку мыши и выполним команду Сору. Здесь вставим запятую. С помощью правой кнопки мыши выполним команду Paste. Вместо 2 напишем здесь 3. А теперь очистим окно Immediate с помощью клавиши Delete. Щелкнем теперь на кнопке Run и можно увидеть, что у нас получилось. А именно, мы вывели в окне Immediate фамилию соответствующего сотрудника вместе с его должностью. Очистим теперь это окно. Перейдем на нашу процедуру и поменяем местами вот эти два поля. Для этого напишем следующим образом. Щелкнем здесь на клавише Enter. Далее знак табуляции. Сохраним сперва содержание этих двух полей в соответствующих переменных. Например, пусть F2 равняется точка Fields, щелкнем дважды на соответствующем операторе, далее 2. Enter. Пусть F3 равняется точка Fields, щелкнем дважды, скобка, далее 3. А теперь щелкнем на клавише Enter и присвоим значения в обратном порядке. Запишем следующим образром: точка, Fields, скобка. Fields под номером 2 равняется на этот раз F3. Нажмем на Enter. Точка, Fields, скобка и цифра 3 равняется F2. Вот таким образом мы перекрестно поменяли содержание этих двух полей. Этого, конечно же, недостаточно для работоспособности нашей процедуры. Если мы сейчас выполним процедуру вот в таком виде, то это будет неправильно, поскольку нам нужно выполнить еще несколько шагов, для того чтобы эти поля на самом деле поменялись местами. Во-первых, нам нужно провести Update нашей записи. Для этого напишем точка и выберем метод Update, вот он. Щелкнем на нем дважды. Ну и нам еще надо открыть соответствующую запись для редактирования. Откроем таблицу Сотрудники для редактирования. Для этого нажмем на клавишу Enter. Далее точка, далее LockType, т.е. тип доступа. Щелкнем дважды. Поставим знак равенства и здесь, как мы видим, у нас есть несколько возможностей. Это, к примеру ReadOnly - только для чтения - и т.д. А сейчас нам нужно выбрать LockOptimistic, для того чтобы мы получили полный доступ к нашей таблице. Щелкнем теперь где-либо и попробуем запустить нашу процедуру. Нажмем на кнопке Run. Как мы видим, несмотря на все наши старания, тем не менее, Visual Basic обнаружил здесь ошибку операция не допускается, если объект уже открыт. Щелкнем на кнопке Debug и можем увидеть, что у нас произошло, а именно: открыть нашу базу данных в режиме редактирования надо было до оператора Open. В противном случае возникает ошибка. Остановим выполнение нашей процедуры и поменяем строчки местами. Для этого выделим вот эту строчку. С помощью правой кнопки мыши выполним команду Сору. Далее удалим ее, щелкнув на кнопке Delete. Встанем чуть повыше. И при помощи правой кнопки мыши выполним команду Paste. Чуть-чуть подравняем эти строчки. Ну и теперь можем попробовать опять выполнить процедуру, щелкнув на кнопке Run.
314
TeachPro Microsoft Access 2003
Как мы видим, эти два поля поменялись местами вполне благополучно. Сначала программа вывела название должности нашего сотрудника и затем его фамилию. Правда, если мы выполним эту процедуру еще раз, предварительно очистив окно Immediate и щелкнув опять на кнопке Run, то, как мы видим, мы вернулись к обычному состоянию наших полей. В поле 2 сперва идет фамилия, а в поле 3 мы видим название должности нашего сотрудника.
13.3. Recordset как источник данных для формы На этом уроке мы поговорим о Recordset, как об источнике данных для формы. Попробуем при помощи методов, которые есть у формы, подключиться к базе данных, которая не является текущей и к какой-либо ее таблице, отображая ее данные в форме. Конечно, создание новой формы и отображение на ней каких-либо данных для нас уже не является сложным вопросом. Мы уже это проделывали. Попробуем теперь на нашей форме отобразить информацию из другой таблицы, которая не находится в нашей текущей базе данных. Для этого перво-наперво создадим новую форму. Щелкнем на пункте Создание формы в режиме конструктора. И вот, перед нами появилась новая форма. Как мы видим, она абсолютно пустая. Разместим на ней два поля, поля для ввода, например, вот в этом месте и второе поле для ввода - чуть пониже. Сейчас их местоположением и выравниванием особенно заниматься не будем. Уберем только вот эти две метки, которые здесь появились автоматически, чтобы они нам не мешали. Нажмем на клавишу Delete и на одной метке и на второй, оставляя только поля для ввода. Изменим теперь имена этих двух полей. Как мы видим, автоматически программа присвоила одному полю название поле 0 и второму поле 2. Это для нас сейчас достаточно неудобные названия, поэтому щелкнем на правую кнопку мыши. Далее выберем свойства. Затем откроем вкладку Все. Здесь есть свойство Имя, в котором, вместо поля 0 напишем, например, текстовое поле, в котором будем отображать фамилию. Поэтому так и напишем - txtFam. Закроем это окошко. Откроем свойства второго поля при помощи правой кнопки мыши. Имя у него, как мы помним, поле 2. Вместо этого напишем txtIm - текст и имя. Закроем. А теперь же создадим новый модуль - модуль, который будет обслуживать нашу форму. Для этого мы можем, конечно, воспользоваться пунктами меню или же можем щелкнуть на вот эту кнопку, которая находится в левом верхнем углу нашего окна. Щелкнем на правой кнопке мыши, появляется контекстное меню, в котором нам нужна команда Обработка событий. Щелкнем на ней и, как мы видим, мы благополучно создали новый модуль, модуль Form - форма 1, в которую мы и должны записать те процедуры и функции, которые будут работать конкретно для этой формы. Одновременно с этим, у нас прописалась и соответствующая процедура, которая будет работать при загрузке нашей форме, при начальной ее инициализации. Это видно, хотя бы из ее названия Form Load. Теперь же попробуем соединить нашу форму с базой данных, которая находится на нашем жестком диске, с другой, а не с текущей. Для этого перво-наперво создадим новую объектную переменную типа DAO.Recordset. Для этого щелкнем на знаке табуляции, введем отступ, далее Dim - определение новой переменной. Далее имя переменной. Пусть это будет, например, rstMy - Recordset My.
Глава 13. Специальные средства Access VBA (продолжение)
315
Введем As. Появляется список всех объектных типов и здесь запишем DAO. Вот он появился перед нами, щелкнем на нем дважды. Далее введем точку и Recordset. Вот мы ввели несколько букв и появился нужный нам тип. Щелкнем на нем дважды. Нажмем на клавишу Enter. Теперь попробуем проинициализировать эту объектную переменную, этот Rdcordset. Для этого введем ключевое слово Set, далее наша переменная rstMy, далее знак равенства, знак присваивания, и откроем новую базу данных - Open Database. Введем скобку и внутри нее, как видно из нашей подсказки, мы должны ввести текстовый параметр, которому следует прописать имя открываемой базы данных. Поскольку это текстовое поле, введем кавычки, а внутри них, конечно же, мы можем указать полное имя к нужной нам базе данных. В данном случае, учитывая, что база данных, которую мы хотим открыть, так же как и наша текущая база данных db3, находится в одном и том же каталоге, в частности, в каталоге Мои документы, мы можем указать просто имя открываемого файла без указания пути к нему. Откроем, конечно же, базу данных first.mdb. Далее закроем скобку и поставим точку. Теперь нам нужно эту базу данных открыть. Поэтому введем open recordset. Вот эта процедура, которая нам нужна. Щелкнем на ней дважды. Далее скобка. И теперь нам нужно указать таблицу, которую мы хотим открыть. Этот параметр нам следует вписать в кавычки, конечно же. Закроем скобки. И внутри кавычек введем запрос Select. Далее звездочка, что означает, что мы хотим выбрать все поля этой таблицы. Далее запишем From, и сейчас нам нужно указать непосредственно имя таблицы, которую мы хотим открыть. Напишем Сотрудники. Это является нужной нам таблицей в базе данных first.mdb. Далее закроем кавычки и скобки. Это в принципе, уже сделано. Щелкнем на клавише Enter. Теперь нам необходимо связать объектную переменную rstMy, т.е. мой рекордсет, первонаперво, с нашей формой. Для этого напишем Set, оператор присваивания, далее идентификатор me - это аббревиатура для указания на текущую форму. Далее точка. Появляется поле с именами полей и здесь нам нужен Recordset. Вот он появился перед нами. Щелкнем на нем дважды. Далее знак равенства, и, конечно же, в качестве Recordset нам нужно указать тот Recordset, который мы только что создали, а именно: rstMy. Далее нажмем на клавишу Enter. И теперь нам нужно указать соответствующие поля таблицы Сотрудники нашим двум полями, которые мы только что открывали. Для этого напишем опять ключевое слово me, далее txtFam, вот это поле. Щелкнем на нем дважды. Далее введем точку и ControlSource, затем напишем знак равенства и нам нужно указать это поле, поле для ввода. Для этого запишем в кавычках просто-напросто Фамилия. Нажмем на Enter. И аналогично строчку введем для другой переменной - txtIm. Проще всего сейчас выделить вот эту строчку, чтобы не писать ее заново. C помощью правой кнопки мыши выполнить команду Сору и далее ее вставить на пустое место под этой строкой. Для этого с помощью правой кнопки мыши выполним команду Paste. Выровняем чуть-чуть, уберем здесь лишнюю строчку. Ну и, вместо txtFam нам нужно выбрать txtIm - имя. Далее в качестве строчки для ControlSource введем имя. А теперь попробуем запустить нашу процедуру и посмотреть, как она работает. Для этого нам нужно как раз запустить форму, а уж эта процедура в режиме автоматики - в режиме формы, автоматически выполнится сама. Перейдем в Microsoft Access. Закроем вот эту форму, щелкнув на соответствующем крестике. Cохраним все наши изменения. Пусть имя формы будет Форма 1. Согласимся с тем, что нам предложила программа по умолчанию. А теперь посмотрим, как будет выполняться эта форма 1. Щелкнем на кнопке Открыть.
316
TeachPro Microsoft Access 2003
Как мы видим, наша форма открылась, и она заполнена соответствующими полями, которые, конечно же, взяты из другой базы данных, которая находится на жестком диске, но не совпадает с открытой в данный момент базой данных. Сотрудником у нас, как мы можем видеть, является Святова по имени Мария. Мы можем передвигаться по нашим записям и получать все новые и новые фамилии и имена персонажей. Запишем теперь изменения в базе данных. Щелкнем на кнопке сохранения Save и закроем нашу форму.
13.4. Идентификатор Me Обработка события Current На этом уроке мы продолжим разговор об идентификаторе me, а также проведем обработку еще одного события, которое наступает при передвижении по записям нашей таблицы. Попробуем, например, присвоить заголовку нашей формы содержание поля какойлибо записи из таблицы. Щелкнем здесь на Enter и запишем следующим образом. Идентификатор me. Затем точка, и далее возьмем его свойство Caption. Вот оно появилось перед нами. Щелкнем два раза Caption - это как раз то свойство, которое аккумулирует в себе заголовок данной формы. Поставим знак равенства и далее мы можем написать и присвоить любое строковое выражение, в частности возьмем Объектную переменную rstMy.Далее скобка и его поле с фамилией. Поэтому напишем внутри кавычек "фамилия" и закроем скобку. Посмотрим теперь, как все это будет работать. Для этого перейдем обратно в Microsoft Access. Щелкнем на соответствующую кнопку. Вот перед нами появилась наша база данных, в которой мы работаем. Откроем эту форму. Щелкнем на ней дважды. Как мы видим, она появилась перед нами, и наряду с именем и фамилией, которве отображаются в полях внутри формы, у нас фамилия отобразилась еще и в заголовке. Правда, если мы будем передвигаться по нашим записям, фамилия и имя наших сотрудников меняются в полях для ввода, а вот в заголовке эта надпись не изменилась. Здесь как была первая из фамилий, так она и отображается. Рассмотрим сейчас, в чем же дело. Закроем эту форму, откроем Visual Basic, щелкнув на комбинации клавиш Alt+F11. Вот он появился перед нами, и обратим внимание на то, внутри какого события мы написали присваивание заголовку соответствующего выражения. Событием является Form Load, т.е. оно выполняется только при загрузке нашей формы, при ее открытии. Теперь все понятно. Т.е. при загрузке мы присвоили первую из фамилий заголовку окна нашей формы, и на этом все закончилось. При движении по записям эта процедура не вызывается, т.е., для того чтобы выполнить нашу задумку, а именно отображать заголовки текущего поля, нам нужно сделать обработку соответствующего события, которое наступает при изменении записи, при движении по нашей таблице. Поэтому переключимся обратно в Microsoft Access, откроем нашу форму в режиме конструктора. Вызовем ее свойства, щелкнув на правую кнопку мыши вот в этой точке. Щелкнем на команде Свойства. И далее переключимся на вкладку События, в которой есть у нас событие "Текущая запись". Она нам как раз и нужна. Щелкнем на вот этой кнопке с тремя точками. Появляется построитель, в котором нам, конечно же, сейчас нужно выбрать пункт Программы. Щелкнем на ОК.
Глава 13. Специальные средства Access VBA (продолжение)
317
Мы сразу же попадаем в Visual Basic, в котором, как мы видим, программа нам автоматически открыла новую процедуру, процедуру Form_Current, т.е. обработку того события, которое будет происходить при изменении текущей записи. Теперь же нам вот эту строчку, с присваиванием нашему заголовку формы соответствующего значения нужно перетащить в Form Current, т.е. она должна выполняться вот в этом месте. Выделим ее. Просто-напросто схватим и перетащим наверх. Вот таким образом. Отпустим и, как мы видим, мы вполне успешно перетащили эту строчку из одного места в другое. Правда, если мы сейчас попробуем выполнить процедуру, запустив нашу форму, то получим ошибку. В принципе, это понятно. Дело в том, что вот эта переменная rstMy описана внутри процедуры Form_Load, вот в этом месте. И соответственно в процедурной форме Form_Current она не видна. Поэтому, для того чтобы мы могли использовать это и в одной и в другой процедуре, выделим и перетащим ее в начало, вот таким образом. Немного выровняем наши процедуры. Удалим лишние пустые строчки и теперь попробуем запустить это выражение. Для этого перейдем обратно в Microsoft Access, щелкнем на соответствующей кнопке. Здесь, как мы видим, у нас открыта форма. Закроем ее свойства, они нам сейчас не нужны. Переключимся в режим работы, щелкнув на кнопке Вид. Вот форма появилась перед нами. Как мы видим, эта фамилия - первая из записей - опять на своем месте. Щелкнем сейчас на переходы по записям, и, как видите, фамилия нашего сотрудника появляется не только в полях для ввода внутри формы, но и в заголовке, причем все это происходит синхронно с передвижением по нашим записям. Вот мы попали на первую запись, теперь, допустим, на 4-ю, и т.д. В любом случае мы получаем, что в заголовке отображается текущая фамилия нашего сотрудника. Закроем эту форму. Появился вопрос, сохранить или нет структуру объекта. Щелкнем на кнопку Да и перейдем обратно в Visual Basic. Щелкнем на Alt+F11 и отметим еще одно обстоятельство. Точно так же как и с любыми объектными переменными, мы можем вот эту аббревиатуру - идентификатор me - поместить внутри оператора with. Т.е. можем написать следующим образом. Щелкнем здесь на Enter. Далее введем With. Далее введем идентификатор me. Здесь введем End With. И после этого вот этот идентификатор me у нас уже лишний. Вместо него можно воспользоваться точкой. Вот таким образом. Введем еще и знаки табуляции, чтобы программа была более читабельной. И сейчас, если мы переключимся в Microsoft Access и запустим нашу форму - выделим и щелкнем на кнопке Вид, то она будет работать так же, как и раньше. Здесь отображается имя и фамилия в соответствующих полях, а также фамилия отображается в заголовке нашей формы. Перейдем опять в Visual Basic, щелкнув на Alt+F11. Учтем теперь еще одно обстоятельство. При работе вот этой процедуры Form_Current может возникнуть ситуация, при которой на самом деле вот эта процедура вызвалась, но, тем не менее, сама форма еще не загружена, т.е. не выполнилась процедура Form_Load. Для того чтобы избежать этого в нашей программе, предусмотрим специальную переменную типа Boolean. Для этого введеи Dim, далее пусть эта переменная называется IsREady - готово или нет. Далее As, и она, конечно же, должна быть типа Boolean. Вот он перед нами. Щелкнем на нем дважды. Ну и далее при загрузке нашей формы присвоим значение True. Введем IsReady равняется true. И теперь нам остается только вот в этом месте проверить, готовы ли мы отобразить наш заголовок или еще не готовы. Для этого введем следующую запись.IF IsReady Then. Ну и закроем наш IF с помощью оператора End If. Сдвинем знаком табуляции эту строчку. После этого, мы можем считать, что у нас уже полностью готова процедура обработки события движения по нашим записям. Мы даже застрахованы от разного рода неожиданностей и ошибок в процессе выполнения программы, таких как невозможность присвоить заглавие нашей форме.
318
TeachPro Microsoft Access 2003
13.5. Проходы по набору записей собственными элементами управления На этом уроке мы посмотрим, как можно двигаться по записям в нашей таблице при помощи наших собственных кнопок, а не кнопок, которые предоставляет нам Microsoft Access. Перейдем в Microsoft Access, щелкнув на соответствующей кнопке. Откроем вот эту нашу форму, щелкнем на ней дважды. И как мы видим, пока что мы можем передвигаться по записям при помощи вот этих кнопок, которые находятся в нижней части нашей формы. Это стандартный набор кнопок, при помощи которых мы можем двигаться по записям вперед и назад. Теперь же откроем эту форму в режиме конструктора, щелкнем на кнопке Вид, и вместо этих кнопок попробуем создать свои кнопки. Немного расширим окно формы. Вызовем его свойства. Щелкнем на правую кнопку мыши, Свойства. Далее переключимся на вкладку Макет, режим, по умолчанию установим не "Одиночная", а "Ленточная" форма. От кнопок перехода мы сейчас откажемся. Изменим Да на Нет, поскольку мы сейчас сами будем строить кнопки для перехода по записям. Закроем теперь эту форму. А теперь же отобразим область заголовка и примечания, для этого щелкнем на пункте меню Вид. Далее выполним команду заголовок/примечание формы. Вот они появились перед нами. Чутьчуть раздвинем еще раз окно нашей формы. Примечание нам не нужно. Сдвинем его до 0. В области данных расположим поля немоного иначе. Разместим их горизонтально относительно друг друга, вот таким образом. Ну и чуть-чуть изменим нашу форму. Уменьшим размер, который мы отводим для области данных для одной записи. Уменьшим еще также и заголовок формы, вот такого расстояния нам вполне хватит. Затем введем здесь какуюлибо кнопку для навигации по нашим записям. Для этого достаточно щелкнуть на панели управления на кнопке и нарисовать ее в нашем окне. Например, нарисуем ее вот в этом месте. Теперь обратимся к свойствам этой кнопки. Щелкнем на правую кнопку мыши и выберем свойства. Для начала разместим на этой кнопке рисунок, который соответствовал бы его содержанию. Щелкнем на вот этих трех точках. Появляется список всех рисунков, которые есть у нас в Microsoft Access, и здесь найдем кнопку, кнопку перехода. Это будет кнопка перехода к следующей записи. Здесь, как мы видим, у нас есть три возможности: следующая запись 1, следующая запись 2 и следующая запись 3. В принципе, можем выбрать любую из них по нашему вкусу. Пусть, например, будет следующая запись 3. Щелкнем на кнопку ОК. Далее изменим имя для данной кнопки. Вместо ничего незначащей надписи Кнопка 4, напишем cmdNext - переход к следующей записи. А теперь нам нужно выбрать событие для этой кнопки. Для этого переключимся на События и, конечно же, нам нужно событие "нажать на кнопку". Щелкнем. Появился автоматический построитель и здесь нам нужна выбрать пункт Программы. Щелкнем на ОК. Мы сразу же перешли в Microsoft Visual Basic, в котором, как мы видим, программа автоматически создала для нас оператор Next_Click.
Глава 13. Специальные средства Access VBA (продолжение)
319
Теперь нам необходимо обработать это событие, т.е. записать, что должно происходить при этом. Щелкнем на табуляции и далее напишем нашу переменную rstMy, которая управляет всеми записями в нашей таблице. Далее точка и затем выберем команду MoveNext. Вот эта команда. Щелкнем на ней дважды. Теперь запустим нашу форму. Щелкнем на кнопке View Microsoft Office Access, для того чтобы переключиться в Access. Cвойства кнопки нам не нужны. Закроем окно со свойствами. Перейдем в работу нашей формы. Для этого щелкнем на кнопке Вид. Вот перед нами появилась наша форма. Мы можем передвигаться по ней при помощи вот этой кнопки от начала и до конца. Если мы сейчас щелкнем еще раз, то, как мы видим, возникает ошибка, текущая запись отсутствует. Это понятно - добравшись до последней записи, представить себе куда дальше пойдем компьютер, Access затрудняется. Поэтому щелкнем на кнопке End. Откроем нашу форму в режиме конструктора и перейдем в Visual Basic. Для этого щелкнем на Alt+F11, и теперь в обработке события Next_Click еще и вставим проверку условия, не находимся ли мы в конце нашей таблицы. Для этого щелкнем на клавише Enter. Далее знак табуляции. Введеи переменную rstMy. Конечно же, перед этим нам нужно вставить IF - это означает, что мы проверяем условие. rstMy, точка, далее end of file - EOF. Щелкнем дважды и, если мы не находимся на конце этой записи, т.е. перед переменной напишем not, в таком случае - then - будет выполняться следующая строчка. MoveNext. Далее Enter. Далее введем End IF. И среднюю строчку сдвинем при помощи знака табуляции. А теперь же запустим Microsoft Access, перейдем в него, щелкнув на соответствующей кнопке. Откроем нашу форму в режиме вида. Щелкнув на кнопке Next, мы, как видите, добрались до последней записи. А дальше, сколько бы на нее не нажимали, мы будем находиться на месте, не передвигаясь по записям. А теперь откроем нашу форму и попробуем добавить еще все остальные необходимые кнопки для навигации по нашим записям. Создадим кнопку перехода к последней записи, к первой записи и к предыдущей записи. Для того чтобы хотя бы чуть-чуть облегчить дело, попробуем скопировать вот эту кнопку. Для этого выделим ее. С помощью правой кнопки мыши выполним команду копировать. Далее вставим. Правая кнопка мыши, Вставить. Опять правая кнопка. Опять вставить. И опять правая кнопка и вставить. Теперь разместим эти кнопки в соответствующих местах, вот таким образом. А теперь нам нужно изменить все, что касается этих кнопок. Сначала переделаем кнопку перехода к предыдущей записи. Для этого щелкнем на правую кнопку мыши и выберем его свойства. Откроем вкладку макет, далее рисунок. Щелкнем на трех точках. Выберем предыдущую запись. Как мы видим, здесь у нас два типа перехода к предыдущей записи. Выберем опять-таки рисунок с синей стрелкой. Щелкнем на кнопке ОК. А теперь изменим ее имя. Вместо кнопки 6 напишем cmdPrev - Previous. Откроем вкладку Событие. И нам нужно событие Нажатие кнопки. Щелкнем на трех точках. Выберем Программы. ОК. Ну и далее можем скопировать вот эти три строчки. Выделим их. Правая кнопка мыши и Сору. Вставим сюда в обработку оператора Prev_Click. Правая кнопка мыши, Paste. Уберем пустую строчку. Ну и далее переделаем эти строчки. Во-первых, проверять нам сейчас нужно не EOF, а другое событие. Для этого EOF уберем, точку тоже. Щелкнем. И выберем проверку на BOF - Begin of File. Вот он появился перед нами и вместо MoveNext нам нужен переход на MovePrevious. Щелкнем дважды. С этой обработкой покончено. Перейдем обратно в Microsoft Access. А теперь займемся переходом к первой записи. Откроем опять-таки макет. Изменим рисунок.
320
TeachPro Microsoft Access 2003
Щелкнем на трех точках. Выберем пункт Первая запись. Как мы видим, их у нас две - опятьтаки черная и синяя. Продолжим традицию и выберем синий цвет. Щелкнем на кнопку ОК. Изменим название для данной кнопки.Вместо кнопки 5 напишем cmdFirst, как никак это переход к первой записи. Далее откроем Событие. Событие, конечно же -это нажатие кнопки, щелкнем на вот этих трех точках. Выберем программу. ОК. Ну и теперь проверять здесь что-либо не нужно, а нужно прямо переходить к первой записи. Введем знак табуляции, далее наша переменная rstMy, точка. И далее MoveFirst. Щелкнем дважды. Перейдем опять в Microsoft Access. Ну и последняя кнопка, которую нам нужно обработать - это переход к последней записи. Вот появились его свойства. Переключимся опять на макет. Щелкнем на рисунке. Щелкнем на трех точках и выберем вариант Последняя запись. Как мы видим, их опять две - черная и синяя. Выберем синюю. ОК. Далее переключимся на вкладку Все. Изменим опять-таки имя кнопки. Выберем cmdLast, вот такое имя. Далее перейдем в События. Щелкнем на Нажатие кнопки. Откроем три точки. Программы. ОК. Здесь введем знак табуляции. Проверять опять-таки нам ничего не нужно. Поэтому прямо пишем rstMy. Поставим точку, и, конечно же, нам нужен вариант MoveLast - переход к последней записи. Щелкнем дважды, и после этого у нас уже полностью готовы все обработки наших кнопок. Перейдем теперь в Microsoft Access. Закроем свойства кнопок, теперь они нам не нужны и запустим нашу форму. Как видите, у нас есть все 4 необходимые кнопки - кнопка перехода к следующей записи, кнопка перехода к предыдущей записи, кнопка перехода к последней и к первой записям. Наша форма уже вполне адекватно работает, послушно откликаясь при нажатии на любой из этих 4 кнопок.
13.6. Создание собственных счетчиков записей На этом уроке мы займемся созданием собственных счетчиков записи. Как помните, мы создали в базе данных специальную форму, на которой сделали кнопки для перехода и навигации по записям. Откроем эту форму в режиме конструктора. Щелкнем на соответствующую кнопку. И вот мы видим сейчас текущее состояние этой формы. Как видите, здесь у нас сейчас есть 4 кнопки для навигации по записям - кнопки впередназад, последняя и первая запись. А теперь чуть-чуть отредактируем нашу форму, изменим размер кнопок. Для того чтобы они все выглядели одинаково, выделим их все. Нажмем на клавишу Shift и одновременно щелкнем на всех 4 кнопках. Далее правая кнопка мыши. Свойства. Далее вкладка Макет и изменим ширину и высоту наших кнопок. Например, ширина кнопки пусть будет ровно 1 см, а вот высота пусть будет в два раза меньше - 0.5. Вот таким образом. Закроем окно свойств. Теперь чуть-чуть изменим взаиморасположение этих кнопок. Сдвинем их друг относительно друга. Например, таким образом. И кроме этого, расположим еще в нашей форме поле, в котором разместим счетчик записи. Для того чтобы построить поле для ввода, надо щелкнуть на соответствующей кнопке, на панели инструментов, затем разместим его, например, пока вот в этом месте. Уберем метку. Она нам сейчас не нужна. Выделим и щелкнем на клавише Delete. Изменим размер, с помощью правой кнопки мыши откроем свойства.Ширину, как помните, мы хотели сделать равной 1см. Высоту равной 0,5. Закроем свойства. А теперь опять расположим все это на форме. Сдвинем вверх.
Глава 13. Специальные средства Access VBA (продолжение)
321
Сдвинем теперь кнопку в сторону. И вот результат - то, что у нас получилось с элементами управления. Чуть-чуть уменьшим еще и место, которое мы отвели под заголовок формы. Вот до такого размера. Далее введем имя для нашего поля. Для этого выделим его. Правая кнопка мыши и Свойства. Далее выберем вкладку Все, и здесь изменим имя. Вместо поле 8, напишем, например, txtCurNumb - Current Number - текущее значение. Закроем теперь эти свойства. И перейдем в редактор Visual Basic. Для этого, как всегда, щелкнем на комбинации клавиш Alt+F11. Вот мы перешли в соответствующий модуль формы 1. Сдвинемся чуть ниже, поскольку нам нужна обработка события Form_Current и здесь напишем следующим образом. Наряду с присвоением заголовка форме в поле Фамилия, еще и введем в наше новое текстовое поле номер записи. Для этого напишем таким образом: me, точка, далее txtCurNumber, вот он уже перед нами. Щелкнем на нем дважды. Введем знак равенства, далее наша переменная rstMy, в которой сейчас сконцентрированы все свойства наших записей. Далее точка. И здесь нам нужен вариант AbsolutePosition - первое же из полей. Оно, конечно же, сразу появилось перед нами. Даже не надо набирать ни одной буквы. Щелкнем на нем дважды. В принципе, единственное, что нам нужно сделать - это прибавить единицу, поскольку AbsolutePosition меняется от 0 и далее. Мы обычно привыкли видеть записи, которые нумеруются от одного и далее. Перейдем теперь в Access, щелкнем на соответствующую кнопку и запустим эту форму. Щелкнем на кнопке Вид. Вот формы появилась перед нами. И если мы будем двигаться по нашим записям, то, как мы видим, в соответствующем окошке как раз и виден номер записи. Мы можем двигаться и вверх, и вниз, и к первой записи, и к последней, и во время всех этих операций мы видим номер записи. Правда, надо сказать, что это действует так сказать только в одну сторону, А именно, двигаясь по нашим записям, мы можем видеть номер записи. А вот, если мы сейчас введем номер записи, например, 3 и щелкнем на клавишу Enter, то на третью запись мы не переходим. Вот, например, ввели 4, можем ввести, например, 2. Т.е. взаимно однозначного соответствия между номером записи и положением в нашей таблице нет. Но это понятно, обработку вот этого события, которое наступает после ввода значения в это поле, мы еще не вводили. Попробуем исправить этот недостаток. Для этого опять переключимся в режим конструктора. Откроем теперь при помощи правой кнопки мыши свойства этого поля. Для этого встанем на него. Правая кнопка мыши, далее свойства. Затем переключимся на вкладку События. И здесь нам нужно выбрать событие после обновления. Вот это, второе. Далее щелкнем на выпадающем списке. Выберем процедуру. И щелкнем на вот этих трех точках, и мы сразу же попадаем в Visual Basic, в котором, как мы видим, Microsoft Access уже заготовил для нас вот эту процедуру, обработку сообщения AfterUpdate. А теперь же здесь напишем таким образом. Во-первых, знак табуляции, далее rstMy, наша объектная переменная. Далее точка. AbsolutePosition. Вот он перед нами. Это свойство нам и нужно. Щелкнем на нем дважды. Далее знак равенства, и присвоим ему значения me, точка и далее txtCurNumber. Щелкнем дважды. Единственное надо опять-таки учесть, так же, как мы делали вот в этой строчке, разницу между этими двумя показателями. А именно, эта разница составляет +1. Правда, если вот в этой строчке она была +1, то здесь нам соответственно нужно написать -1. Поскольку Position меняется от 0, а Current Number - текущее число, у нас отображается от 1 и выше. Посмотрим теперь, как все это работает. Переключимся в Microsoft Access. Свойства теперь здесь нам уже не нужны. Включим режим Вид. И можно увидеть, что, если мы опять передвигаемся по нашим записям, пока все нормально, а если мы введем какое-либо число, например, 4, щелкнем на Enter, сразу попадаем на четвертую запись. Введем 1, попадаем на первую запись. А если мы введем, например, большое число, 123, то, конечно же, возникает ошибка - ошибочный аргумент.
322
TeachPro Microsoft Access 2003
Ну, оно и понятно. 123-ей записи у нас нет. Перейти туда мы соответственно не можем. Щелкнем на кнопку End, чтобы закрыть выполнение этой ошибочной процедуры. Конечно же, для того чтобы исключить ошибки такого рода, мы теоретически должны были бы проверить, находится ли это число в диапазоне от 1 до номера последней записи, поскольку мы ввести можем и какое-нибудь по-другому ошибочное число. Например, отрицательное число или буквы и т.д. Переключимся в режим конструктора и перейдем в Visual Basic при помощи комбинации клавиш Alt+F11. Для того чтобы мы могли проверить корректность вот этого числа, конечно же, нам его надо сравнить, находится ли оно в соответствующем диапазоне. Поэтому напишем таким образом: IF, далее напишем me, далее txtCurNumber. Если это число будет меньше единицы, то в этом случае then Me txtCurNumber присвоим значение 1. Конечно же, надо проверить и в другую сторону. IF, Me, txtCurNumber. Если это число больше, чем rstMy, точка, далее RecordCount, т.е. общее количество записей. Then, опять-таки присвоим нашему счетчику номер последней записи. Проще всего это выделить. Правая кнопка мыши и Сору. Далее вставим сюда. Правая кнопка мыши и Paste. И, вместо знака больше, напишем знак равенства. Знак присваивания. Посмотрим, как все это теперь работает, переключимся в Microsoft Access, запустим. Попробуем ввести отрицательное число. Например, минус 7. Щелкнем на кнопку. Enter. Как мы видим, мы попадаем на первую запись. Если мы, например, напишем 0, Enter, то все равно - на первую запись. Здесь все правильно. Конечно же, если мы войдем в 5 запись, то мы попадаем на 5. А теперь попробуем провести еще и вторую проверку, а именно: ввести большое число. Щелкнем на клавише Enter, и все правильно. Попадаем на последнюю запись в нашей таблице. В принципе, единственная проверка, которую мы не использовали - это если мы введем какуюлибо аббревиатуру, не число, и щелкнем на Enter. В этом случае все равно, как мы видим, программа достаточно логично рассуждает, переходя к последней записи. В принципе, все относительно нормально. Теперь же, как помните, когда у нас были стандартные кнопки навигации по нашим таблицам в формах, то у нас обычно с правой стороны вот этой линейки находилась еще и надпись, которая показывала общее количество записей. Так мы сейчас поступим. Переключимся в режим конструктора и введем здесь еще одно поле. На этот раз это у нас будет просто-напросто надпись. Возьмем ее в панели инструментов и поместим вот в этом месте. Введем здесь какой-либо текст, например, напишем "из", что подразумевает, что это, допустим, третья запись из общего количества. Щелкнем здесь где-либо и введем еще и имя для этой надписи. Выделим. Правая кнопка мыши, Свойства, вкладка Все. И вместо надписи 13, напишем lbl и далее TotalCount - общее количество. Закроем теперь. Далее переключимся в редактор Visual Basic как всегда с помощью Alt+F11. Все это должно происходить, конечно же, при обработке события Current, поэтому здесь введем Enter, далее Мe, точка, далее ibiTotalCount, вот эта переменная. Щелкнем на ней дважды. И внутри этой метки нам нужно поместить соответствующие данные. Поэтому введем знак равенства. И, конечно же, нам нужно вот это число REcordCount, которое является полем от переменной rstMy. Поэтому напишем rstMy, точка и далее RecordCount. Щелкнем дважды и вот в принципе все. Запустим наше приложение. Щелкнем на кнопку перехода в Microsoft Access, далее Вид нашей формы. Ну и, как мы видим, у нас возникла ошибка. Операция не поддерживается для объектов этого типа. Щелкнем на кнопке Debug, чтобы определить, где у нас произошла ошибка. И она как раз возникла в той строчке, которую мы только что ввели. В принципе, вполне можно догадаться, в чем дело. Дело в том, что вот эта переменная TotalCount является меткой, RecordCount вообще является числом, т.е. мы абсолютно напутали с переменными.
Глава 13. Специальные средства Access VBA (продолжение)
323
Поэтому у TotalCount нам нужно, конечно же, свойство Caption, поэтому напишем здесь точка и далее Caption - заголовок. Вот он появился перед нами. Щелкнем на нем дважды. А вот RecordCount нам надо преобразовать к строковому значению. Поэтому напишем впереди соответствующую функцию str - String. Далее скобка, и внутри скобки нам как раз и нужно число. Число у нас уже есть. Поэтому закроем скобки. И вот теперь у нас уже все должно быть более или менее нормально. Остановим выполнение этой процедуры. Переключимся обратно в Microsoft Access и далее попробуем запустить нашу форму. Войдем в режим конструктора, опять запустим и, как мы видим, на этот раз уже все нормально. Это у нас первая запись из 7. Далее переключимся, вот это 4-я из 7, и т.д. А вот 7 у нас уже видна вполне отчетливо. Единственное, неплохо было бы здесь, чтобы у нас было видно еще и надпись "из 7". Перейдем в режим конструктора. Далее щелкнем на Alt+F11 и вот это слово "из" напишем впереди. Для этого поставим кавычки, плюс, и внутри кавычек напишем "из" и знак пробела. Один пробел все-таки нужен. Переключимся теперь обратно в Access, запустим нашу форму и, как мы видим, сейчас уже все совершенно гладко. Переключимся в режим конструктора. Единственное, что еще можно сделать, - это выровнять вот эти два поля по центру и изменить шрифт. Для этого выделим, например, вот это поле, выровняем по центру текст на нем, изменим шрифт, вместо 8 сделаем покрупнее, к примеру, 12. То же самое сделаем и с этой меткой, выповняем по центру. Далее пусть будет, например, шрифт 12. Если сейчас переключимся в нашу форму, то можно увидеть, что у нас получилось. Мы теперь имеем на нашей таблице счетчик записей, который показывает и текущий номер записи, и их общее количество.
13.7. Добавление и удаление записей Попробуем теперь в наших таблицах удалять и добавлять записи при помощи кнопок, которые мы разместим на нашей форме. Вот, в частности у нас есть уже форма, и она отображает некую таблицу, таблицу Сотрудников. Добавим еще пару кнопок, при помощи которых и будем проводить выбранные нами действия. Переключимся для этого в режим конструктора. Щелкнем на кнопке Вид. Далее раздвинем нашу форму. Например, до такого размера и введем новые кнопки. Нам нужны две кнопки. Одна будет - Добавление, а вторая будет кнопка Удаление. Нарисуем ее на экране. Разместим на этих кнопках надписи. Выделим сперва первую из них. Правая кнопка и далее Свойства. Переключимся на рисунок. Щелкнем на трех точках. Вот, появился список имеющихся рисунков, и здесь выберем, конечно же, пункт Новая запись. Как мы видим, их опять-таки две. Выберем синюю для поддержания общего стиля. Щелкнем на кнопку ОК. Далее введем имя для этой кнопки. Пусть это у нас будет cmdAdd - добавить. Закроем. А теперь следующая кнопка. Правая кнопка мыши, Свойства. Откроем рисунок для нее, щелкнем на трех точках. Это у нас будет кнопка удаления. Вот у нас есть две кнопки по удалению. Можем выбрать любую из них. Выберем, например, вот эту. Щелкнем на кнопке ОК. Далее введем имя для этой кнопки, пока мы находимся в свойствах. Это у нас будет cmdDelete. Далее перейдем на вкладку Макет и введем ширину и высоту для этой кнопки. Ширина пусть будет так же, как у нас была в остальных кнопках, 1см., а высота - 0,5. Закроем. А теперь свойства этой кнопки. То же самое, изменим высоту и ширину. Ширина пусть будет 1см, а высота 0,5. Закроем.
324
TeachPro Microsoft Access 2003
Теперь немного выровняем кнопки. Вот, например, таким образом. А теперь же нам нужно ввести обработку этим кнопкам. Для этого выделим. Далее правая кнопка мыши, Свойства, акладка События, Нажатие кнопки. Щелкнем. Конечно же, нам нужен пункт Программы. ОК. Ну и, при нажатии должна происходить добавка новой записи. Введем знак табуляции и далее наша объектная переменная rstMy, которая управляет всеми записями, далее точка и затем AddNew. Вот эта процедура, щелкнем на ней дважды. Далее перейдем обратно в Access, закроем свойства этой кнопки и откроем свойства следующей кнопки - кнопки Delete. Правая кнопка мыши, Свойства, далее Событие, которое нам нужно. Это, конечно же, нажатие кнопки. Щелкнем на трех точках, Программы, ОК. Введем здесь знак табуляции, rstMy точка и, конечно же, здесь у нас должно быть выполнение Delete. Щелкнем дважды. Посмотрим теперь, как все это работает. Переключимся Microsoft Access, закроем свойства кнопки и запустим это все в режиме формы. Щелкнем на кнопке Вид. Вот появилась наша таблица, вернее ее отображение на форме. Ну, конечно же, как всегда, мы можем двигаться по ее записям. А вот теперь попробуем добавить новую запись. Щелкнем на вот этой кнопке Добавления. Как мы видим, у нас сразу же вышла ошибка. Посмотрим в чем дело. Щелкнем на кнопке Debug. Ну и можно увидеть, что у нас произошло. В процессе добавления мы попробовали выполнить запрещенную операцию, а именно: присвоить заголовку нашей формы поле фамилия из текущей записи. Но текущая запись пока не определена, поскольку мы еще ничего не ввели. Для того чтобы выйти из этой ситуации, остановим программу и закомментируем эту строчку. Запустим теперь еще раз. Переключимся на Access. Далее переключим нашу форму в режим конструктора и обратно в режим формы. Опять попробуем ввести новую запись. И, как мы видим, на этот раз, мы сразу же попали в поле, где мы можем вводить новую запись. Попробуем это сделать. К примеру, введем вот такие ничего не значащие буквы. И далее, переключившись, можем увидеть, что у нас появилась вот такая новая запись. Можем добавить еще. Например, сейчас пусть это будет буква "b" на этот раз. Можем добавить еще одну новую запись. Например, таким образом. Т.е. добавление новой записи в принципе вполне успешно работает. Теперь попробуем удалить записи. Конечно же, удалять лучше записи, которые мы только что ввели, совершенно ничего не значащиеся. Щелкнем на вот этой кнопке удаления. Запись успешно удалилась. Можем удалить еще какую-либо запись, например, вот эту "b". Опять нормально. Но если мы сейчас щелкнем еще раз на удаление записи, то, как мы видим, возникла ошибка - "Текущая запись отсутствует". Щелкнем на кнопке Debug и, конечно же, попадаем на команду Удаление записи. Дело в том, что после удаления записи текущая запись нашей таблицы автоматически не позиционируется. Т.е. если у нас текущая запись была какой-то на нашей таблице, то после удаления этой записи уже не существует, и поэтому вот эта текущая запись приобретает неопределенное значение. И попытка удалить ее еще раз приводит к ошибке. Поэтому после вот этой операции удаления, нам нужно вручную еще раз устанавливать нашу запись на следующую. Остановим сейчас эту запись. Щелкнем на клавишу Enter.
Глава 13. Специальные средства Access VBA (продолжение)
325
Далее напишем таким образом: rstMy, точка и далее выполним нашу команду MoveNext, вот эту. Щелкнем дважды, и после этого у нас уже все будет выглядеть гораздо лучше. Попробуем это проверить. Вернемся в Access, далее перещелкнем нашу форму. Вот она в режиме конструктора. Опять запустим. Добавим новую строчку. Пусть это будет "a". Далее добавим еще одну строчку. Ну и т.д. А теперь попробуем удалить. Щелкнем на кнопку удаления, опять на удаление и еще раз. Как мы видим, все нормально, до тех пор пока мы не попадаем на последнюю запись, которой у нас реально не существует. В этом случае, конечно же, возникает ошибка. Щелкнем на кнопке End и вернемся в Visual Basic. Щелкнем на Alt+F11. И еще одно обстоятельство, а именно: при добавлении и удалении новых записей у нас может сбиваться счетчик записей. Поэтому вот эту процедуру FormCurrent установим еще заодно и во время каждого нажатия на нашей кнопке - и удаление, и вставку новой записи. Поэтому проще всего выделить и скопировать. Правая кнопка мыши, Сору. Сдвинемся теперь наверх к месту, где у нас происходит добавка новой записи. Щелкнем здесь на Enter. Далее правая кнопка мыши и Paste. Скобки здесь не нужны. Точно также вставим теперь и после операции Delete. Щелкнем здесь на Enter и опять правая кнопка мыши и Paste. Удаляем опять вот эти скобки. Ну и попробуем теперь посмотреть, как это все работает. Перейдем в Access, щелкнем на кнопке Вид. Вот мы запустили форму. Вставим новую запись. Пусть это будет, например, просто 1. Вставим еще одну запись, 2. Вставим 3. Как мы видим, мы все время правильно показываем количество наших записей. А теперь, если мы щелкнем на кнопке удаления, вот сейчас у нас 9 записей, 8 записей. Если мы сейчас встанем здесь - 7 записей, т.е. количество записей в нашей таблице правильно отслеживаются одновременно с добавлением и удалением при помощи вот этих двух новых кнопок.
13.8. Работа с закладками Обработка ошибок при работе с записями Рассмотрим, как в наших формах можно пользоваться закладками, т.е. возможностью помечать какие-либо из записей особым образом, чтобы затем одним движением, одним нажатием на какую-либо кнопку можно было вернуться к ним. Для этого создадим на нашей форме две новые кнопки. Расширим чуть-чуть нашу форму. Затем вставим здесь кнопку. Вот таким образом нарисуем ее где-либо. Появляется вот это стандартное окошко. Здесь ничего делать не будем. Щелкнем на кнопку Отмена. Разместим на ней рисунок. Для этого щелкнем на правую кнопку мыши, откроем Свойства. Далее вкладка Макет. И затем щелкнем на пункте Рисунок, на вот этих 3 точках. Появляется список всех рисунков, которые у нас находятся в Microsoft Access.Здесь выберем какой-либо из понравившихся нам рисунков, который подходит под нашу текущую ситуацию. Например, возьмем вот этот карандаш. Щелкнем на кнопке ОК. И изменим имя для нашей кнопки. Вместо кнопки 16 пусть это будет cmd, поскольку это командная кнопка и далее Mark - закладка.
326
TeachPro Microsoft Access 2003
И вот, при нажатии по вот этой кнопке мы будем запоминать текущую позицию для нашей таблицы. Создадим теперь еще одну кнопку. Проще всего ее скопировать. Для этого правая кнопка мыши, копировать. Затем вставим. Правая кнопка мыши, Вставить. Сдвинем ее. А теперь разместим и на ней соответствующий рисунок. С помощью правой кнопки мыши откроем свойства. Далее рисунок. Щелкнем на вот этих трех точках и выберем какой-либо из рисунков. Например, вот такой, с карандашом и стрелкой. Щелкнем на ОК. Затем изменим имя для данной кнопки. Пусть это будет cmdGotoMark - переход. Закроем свойства. Теперь чуть-чуть выровняем. Создадим теперь обработчик для этих двух кнопок. Щелкнем на правую кнопку мыши и выберем пункт Свойства. Далее Событие, в качестве которого выберем нажатие на кнопку. Щелкнем на трех точках, Программы, ОК. И мы сразу же попадаем на созданную при помощи Microsoft Access процедуру Click, нажатие на вот эту кнопку cmdMark. Здесь нам нужно запомнить положение нашей записи в таблице. Для этого, конечно же, необходимо создать некую переменную, в которой будем сохранять это значение. Сдвинемся вверх и в начале нашего блока создадим новую переменную. Конечно же, ее надо создать при помощи Dim. Далее пусть эта переменная, например, называется bmark. Затем As и после пробела определим ее просто-напросто, как Variant. Щелкнем дважды. Вот теперь эта новая переменная уже готова к использованию. Сдвинемся ниже. И в нашей процедуре Mark_Click щелкнем на знаке табуляции и напишем следующим образом. bmark равняется, далее наш объект, связанный с записями, которым мы все время пользуемся, rstMy, точка. И выберем для него свойство Bookmark. Вот, как только мы набрали несколько букв, появилось это свойство. Щелкнем на нем дважды, и после того, как мы перещелкнем, эта процедура уже полностью готова к использованию - при нажатии на соответствующую кнопку текущее положение будет заполнено вот в этой переменной bmark. А теперь у нас есть необходимость в обратном действии, а именно: при нажатии на рядом стоящую другую кнопку вернуться к этой записи. Для этого перейдем обратно в Access, далее откроем свойство вот этой второй кнопки. Щелкнем на ней дважды, например, чтобы не вызывать его при помощи правой кнопки мыши. Получили свойства, и в качестве события нам опять-таки надо использовать нажатие на кнопку. Щелкнем на этих трех точках. Программа. ОК. Ну и в появившейся процедуре, связанной с нажатием на эту кнопку, напишем такую строчку: опять rstMy - наша переменная. Далее точка, Bookmark. Вот он появился перед нами. Щелкнем на нем дважды и на этот раз используем обратное присваивание. А именно Bookmark присвоим значение bmark. Вот, после этого у нас уже должно все получиться. Посмотрим, так ли это. Для этого перейдем в Microsoft Access. Закроем окно со свойствами. Сейчас они нам не нужны. И запустим нашу форму. Щелкнем на вот этой кнопке. Появилась наша форма со всеми ее сотрудниками. Мы можем переходить по ней и теперь попробуем запомнить, например, вот этого сотрудника - Иван Иванов. Для этого нажмем на вот эту кнопку Карандаш и теперь можем перейти к любой другой записи. Если же мы сейчас нажмем на кнопку перехода, то, как мы видим, мы сразу же попадаем на запомненное положение. Вот мы перейдем в другое место. Опять сюда. Если мы сейчас еще раз будем нажимать, то, конечно же, ничего не происходит, поскольку мы уже стоим на выбранной в качестве закладки записи. Можем запомнить и любую другую. Вот, например, Елена Голубь, запомнили. А теперь перейдем на другую запись. И обратно возвращаемся к выбранной вновь записи. Как видите, все работает вполне успешно. Введем теперь новую запись. Например, вот такую и попробуем ее запомнить в качестве закладки. Вот мы ее запомнили. Перешли к другой записи. Возвращение. Как мы видим, все работает нормально. А теперь самое интересное - что же произойдет, если мы эту запись удалим.
Глава 13. Специальные средства Access VBA (продолжение)
327
Щелкнем на кнопке удаления. Как мы видим, вот эта запись, которую только что ввели, благополучно удалилась. Теперь же, при попытке перейти к удаленной записи, как помним, мы ее запомнили при помощи вот этого карандаша, возникнет ошибка. Щелкнем. Как мы видим, запись удалена. В принципе, все вполне логично. Если щелкнем на кнопке Debug, то можно видеть, какая именно строчка вызвала эту ошибку. В принципе, оно и достаточно очевидно и понятно. Но надо, конечно же, с этим бороться, а именно: написать какой-либо обработчик соответствующей ошибки. Сейчас так и сделаем. Остановим выполнение нашей процедуры и напишем следующим обрав случае возникновения зом. Щелкнем на кнопке Enter. Знак табуляции и далее on error ошибки. Далее goto - перейти, например, к out, к вот такой метке, которую определим чуть ниже. Напишем out, двоеточие, далее вставим MsgBox и в качестве сообщения, напишем, что эта запись удалена. Помеченная запись удалена. В принципе, вполне адекватное сообщение. Попробуем сейчас выполнить нашу процедуру и форму. Щелкнем на кнопке перехода в Microsoft Access, далее перейдем к нашей форме, перейдем опять к конструктору и запустим ее заново. Введем новую фамилию для нового сотрудника, для того чтобы не удалять старые. Пусть будет, например, таким образом. В принципе, что мы будем вводить, особого значения не имеет. Запомним ее в качестве закладки, далее удалим, щелкнув на кнопке удаления. И теперь при переходе к ней возникает вполне адекватное сообщение - "Помеченная запись удалена".Щелкнем на ОК и мы возвращаемся к редактированию и работе с нашей формой. Правда, возникла еще одна коллизия. Если мы пометим какую-либо из записей и попробуем далее опять перейти к ней при помощи вот этой кнопки, то мы, хотя и переходим к этой записи, но появляется вот эта абсолютно лишняя запись - Помеченная запись удалена. Это, конечно же, неправильно, поэтому перейдем обратно в Visual Basic, щелкнем на Alt+F11, и обратимся к только что введенной и отредактированной нами процедуре. Конечно же, здесь у нас закралась ошибка. После того, как мы установим нашу запись в правильное положение, следует заканчивать процедуру, иначе мы перейдем дальше к следующей строчке, в которой как раз будет выведен абсолютно ненужный в данном конкретном случае MsgBox. Поэтому щелкнем здесь на клавишу Enter, далее введем Exit Sub. А теперь попробуем запустить эту форму. Перейдем в Microsoft Access. Щелкнем на кнопке Вид. Вот мы запустили нашу форму. Выделим, например, эту запись. Запомним ее при помощи кнопки с карандашом и перейдем к ней обратно. Как видите, все работает вполне успешно. Если мы теперь удалим какую-либо запись, предварительно ее запомнив, щелкнем на кнопке удаления, то переход к ней вызывает стандартное теперь уже сообщение - "Помеченная запись удалена".
13.9. Метод Requery Функции по подмножеству в полях формы На этом уроке мы познакомимся с методом Requery, а также с функциями по подмножеству в полях форм. Часто может возникнуть ситуация, когда мы работаем с той же базой данных с помощью наших форм. Например, как в нашем случае с применением Visual Basic. Ну и в то же время эта же таблица может быть открыта и другими приложениями, в частности тем же Microsoft Access. В этом случае могут возникнуть некоторые проблемы при совместном доступе одной и той же базы данных. Именно для этих целей используется метод Requery, позволяющий оперативно перезапрашивать базу данных и обновлять информацию. Попробуем, например, и создадим на нашей форме, с которой мы работали, какой-либо ComboBox, в котором для начала отобразим некую информацию из существующей в нашей базе данных какой-либо таблицы.
328
TeachPro Microsoft Access 2003
Например, вот эта таблица Покупатели. Откроем ее. Здесь, как мы видим, довольно много полей, среди которых, например, такое поле, как Город. Создадим в нашей форме ComboBox, в котором будет отображаться список всех городов, из которых у нас есть покупатели. Перво-наперво здесь разместим ComboBox и для этого щелкнем на соответствующей кнопке Поле со списком. Разместим его вот в этом месте, например. Здесь щелкнем на кнопке Отмена. Немного увеличим место для заголовка нашей формы. Вот эту метку удалим. Она нам не нужна. Щелкнем на кнопку Delete. Сдвинем немного поле. А теперь, щелкнув на правую кнопку мыши, вызовем Свойства этого объекта. Ну и первое, что нам необходимо сделать, - это, конечно же, заполнить этот элемент управления данными. Для этого в строчке Источник данных напишем соответствующее выражение. Напишем SQL запрос Select. А теперь выберем то поле, которое мы хотим отобразить. Это у нас будет поле Город. Далее ключевое слово from, и затем надо указать ту таблицу, из которой мы хотим выбрать данное поле. Это у нас таблица Покупатели. Закроем, и посмотрим сейчас, как это у нас все будет работать.Запустим нашу форму. В принципе, пока наш ComboBox, как видите, абсолютно незаполненный. Но если мы сейчас щелкнем на вот этом треугольнике, то можно увидеть список всех городов, в которых у нас есть покупатели. Правда, надо отметить, что довольно много городов повторяются по два раза. И даже по много раз, в зависимости от того, сколько покупателей есть в каждом из этих городов. Конечно же, это излишне, поэтому исправим эту ситуацию. Для этого перейдем обратно в режим конструктора. Щелкнем здесь на правую кнопку мыши. Выберем пункт Свойства и подправим наш SQL запрос. В нашем выражении Select вставим еще специальное слово distinct. Это будет означать, что мы хотим выбрать из нашей таблицы только по одному уникальному значению. Посмотрим, как сейчас все это работает. Запустим опять нашу форму. Откроем. Как можно увидеть, перебирая поля, каждый город у нас сейчас присутствует всего лишь один раз. Т.е. все сейчас на самом деле уже в этом отношении нормально. Переключимся обратно в режим конструктора формы. А теперь же, рядом с этим ComboBox разместим еще одно поле для ввода, в котором будем отображать количество покупателей из выбранного вот в этом ComboBox города. Но, прежде, чем мы это сделаем, выберем имя для нашего ComboBox, поскольку со стандартными названиями поля со списком с соответствующим номером - это, конечно же, достаточно неудобно. Расширим, чтобы у нас соответствующий город целиком помещался в этом поле, далее Свойства. Давайте, переключимся на вкладку Все, и выберем новое имя. Вместо поля со списком, выберем, например, имя cboCities - города. Зароем теперь эти свойства. Нарисуем новое поле для ввода вот в этом месте. Для этого, конечно же, выберем соответствующие элементы управления, нарисуем его вот здесь. Метку удалим. Выделим ее и щелкнем на Delete. Далее правая кнопка мыши на этом объекте. Свойства. Поле Данные. Щелкнем на вот этих трех точках, и появляется Построитель выражений. Здесь у нас есть довольно много возможностей. Но нас сейчас интересуют встроенные функции, которые у нас находятся в группе Функции.
Глава 13. Специальные средства Access VBA (продолжение)
329
Щелкнем здесь дважды, появляются вот эти встроенные функции, и здесь есть функция, которая нам нужна, функция по подмножеству, а именно DCount, которая и подсчитывает количество элементов. Вот эта функция. Щелкнем на ней дважды. Вот появляется ее стандартный вид, в котором нам нужно заменить соответствующее выражение на нужные нам. Вместо expression, введем в кавычках имя какого-либо поля, которое у нас есть в таблице. Пусть, например, это будет Фамилия. Далее в качестве domain нам нужно ввести имя таблицы. Это у нас будет таблица Покупатели. В качестве критерия в кавычках напишем следующее выражение: город. Конечно же, такое поле у нас есть в таблице Покупатели. Равняется. Ну и равняется значению поля в ComboBox. А это поле у нас cboCities. Щелкнем теперь на кнопке ОК. Закроем Свойства и посмотрим, что у нас получилось. Для этого переключимся в режим Вид, и попробуем выбрать какой-либо город. Правда, какой город бы мы не выбирали, как мы видим, значение этого поля у нас все время равно 0. Т.е. мы где-то все-таки что-то недоучли. Дело в том, что после каждого выбора соответствующего города, нам необходимо дать команду нашей форме, чтобы она пересчитала вот это значение выражения. А сейчас мы этого не делаем. Поэтому, чтобы исправить эту ошибку, переключимся обратно в режим конструктора формы. Выберем теперь вот этот ComboBox. Правая кнопка мыши, Свойства. И теперь нам нужно событие После обновления. Переключимся. Щелкнем на вот этих трех строчках. Конечно же, нам нужен пункт Программы. ОК. И вот мы попадаем в Visual Basic и соответствующим образом компьютер создал нам процедуру AfterUpdate, внутри которой нам нужно написать наш код. Введем отступ при помощи знака табуляции и далее нам необходимо обновить соответствующее поле для ввода. В принципе, чтобы это сделать нам, конечно же, необходимо будет вставлять и использовать имя этого текстового поля. И поскольку мы, в принципе, его не задавали, переключимся в Microsoft Access. Вот эти Свойства закроем, откроем Свойства вот этого поля для ввода. Правая кнопка мыши. Свойства. Вкладка Все. Перейдем к пункту Имя и вместо Поле 22, которое здесь написано, напишем, например, txtCount, поскольку оно, конечно же, отображает какое-то количественное значение. Закроем теперь эти Свойства. Переключимся в Visual Basic с помощью Alt+F11. Здесь напишем, во-первых, наш объект Me, далее точка, и здесь на форме мы можем сослаться на соответствующий элемент управления. Это, конечно же, текст txtCount. Как только мы набрали txt, появилось поле для ввода, его имя. Щелкнем на ней дважды. Далее точка и далее воспользуемся методом Requery. Вот, мы набрали первые несколько букв и появилась вот эта процедура. Щелкнем на ней дважды, и в принципе у нас уже все готово. Что же теперь делает метод Requery? Он обновляет вот это поле txtCount в нашем конкретном случае после AfterUpdate события, которое наступает после того, как мы что-либо изменили в нашем ComboBox. В принципе, метод Requery может применяться не только к отдельным элементам управления, но, например, ко всей форме, чтобы обновить в этом случае все, что на ней находится. Но сейчас нам такая глобальная процедура не нужна, нам нужно обновить только вот это текстовое поле. Посмотрим сейчас, как все это будет работать. Переключимся в Microsoft Access. Запустим форму и посмотрим, что будет происходить при выборе соответствующих городов. И вот каждый раз мы можем видеть, сколько покупателей у нас есть в соответствующем городе. Все работает нормально. Вот, в частности, из Выборга у нас 2 покупателя, из Галича - 1, ну и т.д.
330
TeachPro Microsoft Access 2003
13.10. Обмен между набором записей и массивом. Метод GetRows На этом уроке мы рассмотрим, как происходит обмен между набором записей и массивом. Для того чтобы это посмотреть на практике, создадим сперва еще одну таблицу. Как мы видим, у нас есть две таблицы в нашей базе данных. Наряду с таблицей Сотрудники, создадим ее копию, которая будет пустой, но будет содержать всю соответствующую структуру. Если мы щелкнем дважды, то можем увидеть, что представляет собой таблица Сотрудников. Щелкнем на правую кнопку мыши и выберем пункт Копировать, и далее правая кнопка и выберем пункт Вставить. Можем выбрать переключатель Только Структура и выбрать имя для нашей таблицы. Пусть это будет название, к примеру, Сотрудники2. Не будем особенно ломать голову. Щелкнем на ОК, и эта таблица будет содержать те же самые поля, но сейчас она абсолютно пустая. Закроем ее. Перейдем в форму и откроем теперь и создадим новую форму. Для этого щелкнем на кнопку Создать. Выберем конструктор. ОК. Разместим теперь на этой форме несколько элементов. Немного ее расширим, разместим, во-первых, кнопку наверху нашей формы. Здесь щелкнем на кнопку Отмена и выберем надпись на нее. Пусть эта кнопка называется Обмен. И при нажатии на эту кнопку будет как раз происходить обмен информацией. Теперь выберем два подчиненные формы. Щелкнем на соответствующем элементе на панели инструментов. Нарисуем в левой части нашей формы. Появляется мастер подчиненных форм. Создавать при помощи этого мастера мы сейчас ничего не будем. Щелкнем на кнопку Отмена. Уберем вот эту метеку. Для этого выделим. Щелкнем на кнопку Delete, затем свойства этого элемента управления. Далее правая кнопка мыши, Свойства и в качестве объекта-источника в соответствующем месте, щелкнув на выпадающий список, выберем таблицу Сотрудники. Закроем. Создадим точно такое же поле с правой стороны. Выберем подчиненную форму отчета. Нарисуем ее. Вот таким образом. Здесь опять щелкнем на кнопке Отмена. Мастер подчиненных форм нам не нужен. Метку удалим, выделим, щелкнем на кнопку Delete. Далее выделим этот элемент управления. Правая кнопка мыши и Свойства. Объект-источник, в качестве которого выберем вторую таблицу Сотрудники. Закроем. И посмотрим. что сейчас происходит с этой формой. Переключимся в режим Вид. Можно увидеть, что, конечно же, с левой стороны у нас отображаются сотрудники и эта таблица у нас полностью заполнена, а с правой стороны точно такая же таблица, но она полностью пуста. Нет никаких данных ни в одном из полей этой правой части нашей формы - вот в этой таблице, таблице Сотрудники2, в отличие от первой из этих таблиц. Переключимся теперь в режим конструктора, поскольку пока вот эта кнопка, которая находится у нас наверху, абсолютно не действует. Она пока лишь здесь только для украшения. Переключимся, щелкнем на кнопке Вид. Создадим теперь обработчик нажатия на вот эту кнопку. Для этого щелкнем на правую кнопку мыши. Свойства. Далее Событие. Событие, конечно же, нажатие на эту кнопку. Щелкнем на вот этих трех точках. Выберем Программы. ОК. И мы сразу же попадаем на обработку события нажатия на вот эту кнопку - Click. Здесь теперь первое, что нам нужно сделать - это задать несколько объектных переменных типа DAO Recordset.Для этого напишем, конечно же, Dim - определение новой переменной, далее rst1, rst2 и просто rst.
Глава 13. Специальные средства Access VBA (продолжение)
331
Нам понадобится три переменные. Далее As, DAO точка recordset. Вот мы набрали первые несколько букв. Появилось соответствующее название, щелкнув дважды, и после этого у нас уже вот эти три объектные переменные полностью готовы к использованию. Введем теперь еще две переменные целого типа и i и j. Для этого напишем, конечно же, опять Dim, i запятая j. Далее As Integer. Вот появилось это слово. Теперь Enter. А теперь определим вот эту объектную переменную rst. Для этого напишем set, далее rst равняется. Далее CurrentDb - текущая база данных. Точка. И выберем метод OpenRecordset. Вот он появился перед нами, далее скобка и откроем внутри нее таблицу сотрудников. Напишем кавычки, закроем скобки, а внутри кавычек напишем Сотрудники. Это и есть нужная нам таблица. Далее щелкнем на клавишу Enter и теперь выясним, является ли эта таблица пустой или нет. Для этого напишем, конечно же, ключевое слово IF. Далее rst. RecordCount. Вот, появилось количество записей и если это количество записей больше 0, тогда then. И теперь нам нужно определить таблицу-источник и таблицу-получатель данных. Если у нас rst не является пустой, т.е. количество записей здесь больше 0, тогда в качестве источника данных возьмем как раз эту таблицу. Поэтому напишем таким образом: rst1 равняется rst. Enter. А вот в качестве таблицы приемника Set rst2 напишем равняется CurrentDb, точка. Опять OpenRecordset. Вот он появился перед нами и напишем на этот раз таблицу внутри скобок и внутри кавычек - Сотрудники2. Это у нас и будет таблица приемник. Щелкнем теперь на Enter, закроем IF при помощи Else. и теперь закроем еще и End IF. А теперь еще здесь надо написать, что будет происходить в случае, если у нас вот эта таблица rst - таблица сотрудников пустая. Для этого, чтобы много не писать, скопируем вот эти две строчки. Выделим. Правая кнопка мыши и Сору. Встанем сюда. Правая кнопка мыши и Paste. Теперь все это подравняем и напишем на этот раз наоборот. rst2 у нас будет пустой таблицей, таблицей-приемником, а rst1 на этот раз - Сотрудники-2 - у нас будет таблицей-источником. Т.е. после выполнения вот этого IF, у нас в любом случае rst1 будет таблицей-источником, а rst2 - таблицей-приемником. rst2 при этом в любом случае у нас будет пустой таблицей, а rst1 - эта таблица, в которой находятся какие-то записи. А теперь же заполним информацию из таблицы-источника вот этого rst1 в какой-либо массив. Для этого напишем сперва ключевое слово With, чтобы далее не писать rst1 все время, далее rst1, Enter. Далее напишем End With, чтобы потом не забыть. Enter. Знак табуляции. А теперь внутри этого блока напишем, во-первых, сохранение таблицы в массиве. Для этого введем новый массив, который назовем recarr. Далее равняется. Введем точку. Как мы видим, несмотря на то, что мы ввели точку, свойства и методы вот этой объектной переменной rst1 у нас не появились. Это связано с тем, как мы определим наши объектные переменные. В принципе, лучше было бы их определить по отдельности, а не так, как мы сейчас это сделали. Поэтому перейдем к вот этой строчке. Конечно же, возникла ошибка. Пока нажмем на ОК. На это обращать внимание не будем. И немного изменим определение вот этих переменных. Вот это все удалим. Далее выделим. Далее правая кнопка мыши и Сору. Enter. Правая кнопка мыши, Paste. Опять правая кнопка и Paste. И вместо rst1 напишем 2 и rst. Вот теперь у нас все три переменные объектного типа определены по отдельности. А теперь исправим здесь вот эту строчку. Введем точку. Опять появились свойства нашего объекта rst1 и здесь нам нужно свойство GetRows. Вот мы набрали первые несколько букв. Появился соответствующий оператор. Щелкнем на нем дважды. Далее откроем скобку и теперь нам нужно определить количество записей. Поэтому напишем так: точка, далее REcordCount. Вот появилась соответствующая команда. Щелкнем на ней дважды, закроем скобку. Вот, после этого этот массив у нас будет полностью заполнен. Щелкнем теперь на Enter. И теперь наша задача вот эту таблицу rst1 абсолютно очистить, так чтобы она стала пустой.
332
TeachPro Microsoft Access 2003
Для этого напишем таким образом. Во-первых, сдвинемся на первую позицию, если случайно мы на ней не находимся. Для этого точка. MoveFirst. Вот нужная нам команда. Enter. А теперь откроем цикл for i равняется от 0 to, точка RecordCount минус 1. Далее Enter. Опять-таки, чтобы не забыть, напишем Next i - закрытие цикла. Теперь Enter. Введем знак табуляции и далее удалим текущую запись. Точка. Delete. Enter. Далее точка и MoveNext - переход к следующей записи. Щелкнем дважды, и вот после этого у нас уже полностью готово удаление всех записей из нашей таблицы rst1. Если мы сейчас в таком виде запустим форму и попробуем нажать на вот эту кнопку, выполнив ее событие Click, то, конечно же, мы придем к плачевному результату. А именно, у нас просто-напросто вот эта таблица rst1 абсолютно очистится, и мы получим две пустые таблицы. Чтобы этого не произошло, теперь нам нужно вторую таблицу, таблицу приемника, которой сейчас является rst2, заполнить значениями из вот этого массива recarr, в которой мы сохранили всю информацию. Поэтому напишем таким образом. With. На этот раз rst2, Enter. Далее опять End With. Enter. И внутри этого блока напишем новый цикл for. Возьмем цвет на этот раз переменную j. Знак равенства, от 0 to. Переменную j будем менять до размерности, которая задается при помощи массива recarr, а размерность можно определить при помощи функции Ubound. Далее скобка. Далее наш массив recarr. Далее запятая и напишем цифру 2, что будет означать размерность по второму направлению. Как мы в принципе можем догадаться, наш массив recarr является двумерным массивов. Щелкнем теперь на Enter. Далее точка. AddNew - добавить новый элемент в таблицу rst2 - И теперь вот эту новую таблицу надо заполнить соответствующими значениями. Поэтому напишем таким образом. Во-первых, введем знак табуляции. Далее Enter. Теперь напишем новый цикл for.i равняется 0, далее опять to, опять UBound - размерность массива. На этот раз опять возьмем, конечно же, массив recarr. Но на этот раз возьмем его размерность по первому направлению. Здесь запишем 1, далее Enter. Знак табуляции. Точка. Далее Fields - соответствующее поле. Щелкнем дважды и этому полю с индексом i присвоим значение, которое мы сохранили в массиве recarr. И возьмем его i-тый запятая и j-тый элемент. Enter. Далее нам надо закрыть массив i. Next i., Enter. И теперь нам нужно провести Update. Точка Update. Вот этот оператор. Щелкнем на нем дважды. Enter. Закроем цикл j. Для этого напишем Next j. И вот после этого процедура заполнения данными вот этой таблицы rst2 уже полностью завершилась. Теперь единственное, что нам необходимо сделать, - это обновить данные в нашей таблице, которая у нас находится на формах. Поэтому напишем следующим образом. Enter. Для того чтобы обновить данные в соответствующих таблицах, нам, конечно же, необходимы их имена. Но, поскольку мы их сейчас пока еще не задавали, перейдем в Microsoft Access. Откроем свойства этого объекта. Правая кнопка мыши и Свойства. Далее переключимся на вкладку Все и назовем этот объект, например, table1. Закроем. Вторую таблицу тоже назовем как-либо. Правая кнопка мыши и Свойства. Пусть это будет table2 - вторая таблица. Закроем. Перейдем обратно в Visual Basic. Для этого щелкнем на Alt+F11, и теперь напишем таким образом. Наша форма, к которой мы можем обратиться при помощи аббревиатуры Me, далее точка. Далее таблица table1. Вот она появилась перед нами. Щелкнем на ней дважды, далее точка. А теперь нам нужно выполнить операцию Requery. Вот она появилась перед нами. Щелкнем на ней дважды и после этого таблица 1 у нас уже будет полностью обновлена. Теперь же щелкнем на Enter. Запишем Me, точка. Table2 точка и опять свойство Requery - обновление. Вот теперь уже процедура полностью готова к использованию. Посмотрим, как она работает. Для этого переключимся в Microsoft Access, запустим нашу форму. Щелкнем на соответствующей кнопке Вид. В принципе, пока мы видим исходный вид нашей формы. Щелкнем теперь на кнопке Обмен.
Глава 13. Специальные средства Access VBA (продолжение)
333
Как видите, все данные из вот этой первой таблицы перескочили во вторую. А сама первая таблица стала абсолютно пустой. Все так и должно было быть. Щелкнем теперь на кнопке Обмен, и как мы видим, мы вернулись обратно. Все данные второй таблицы перескочили к первой. Таким образом, щелкая на этой кнпке, мы можем перебрасывать данные из одной таблицы в другую. При этом, как помните, в качестве буфера мы использовали соответствующий массив, в котором и сохраняли данные обо всех полях таблицы.
13.11. Процедуры класса DoCmd для работы с записями. Урок 1 На этом уроке мы начинаем знакомство с процедурами класса DoCommand для работы с набором записей. Разумеется, работа с набором записей очень важна. Она позволяет очень часто наиболее эффективно обрабатывать данные. Иногда мы даже не имеем альтернативы. Основным, особенно в простых случаях, является выполнение стандартных действий Access, которые доступны пользователю в так называемом интеррактивном режиме. Они могут быть вынесены в макро таблицы. Вспомним, что мы на наших уроках производили такие действия, как поиск записей, в зависимости от состояния некоторых элементов управления, и т.д. Все это мы выполняли с помощью макро таблиц. А потом соответствующий макрос можно преобразовать в модуль. И затем можно разбираться в тексте программы на языке Visual Basic. Давайте, сейчас импортируем макрос, который мы создавали ранее. Для этого откроем вкладку Макросы, далее правая кнопка мыши и команда Импорт. Появляется Мои документы, стандартное окошко для импорта файлов. И здесь откроем нашу базу данных first, в которой мы работали ранее. Щелкнем на ней дважды. Вот появляются все те макросы, которые у нас есть в этой базе данных. Как мы видим, здесь два макроса и откроем вот этот макрос - Мой макрос. Щелкнем на кнопке ОК, и вот он появился в нашей базе данных во вкладке Макросы. Откроем его в режиме конструктора и рассмотрим. Щелкнем для этого на соответствующую кнопку. Как мы видим, этот макрос разбивается на 4 отдельные процедуры, которые можно выполнять независимо друг от друга. Здесь имеются различные макрокоманды. Это, например, такая макрокоманда, как К элементу управлению. Макрокоманда Найти запись, есть команда Сообщение, команда Остановить макрос, условия, применение фильтра и т.д. Закроем сейчас этот макрос. И попробуем преобразовать его в программу Visual Basic. Для этого щелкнем на правую кнопку мыши, далее сохранить как. И в появившемся окне в свойстве Как выберем не сохранить как макрос, а сохранить как модуль. Щелкнем на кнопке ОК. Появляется окошко с подсказками о том, хотим ли мы добавить в программу обработку ошибок и примечание макросов. Пусть галочки стоят на обеих этих возможностях. Ни примечание, ни обработка ошибок, конечно же, лишними в программах не являются. И щелкнем на кнопке Преобразовать. В результате появляется сообщение, что преобразование закончено. Закончено, конечно же, успешно. И можно увидеть результат в новом модуле, модуле Преобразованный.
334
TeachPro Microsoft Access 2003
Щелкнем на нем дважды. И вот он появился перед нами. Окно Immediate выключим, щелкнув на соответствующем крестике, чтобы у нас было больше места на нашем экране для анализа того, что у нас получилось. В этом модуле, если приглядеться, есть незнакомый нам объект CodeContextObject. Он соответствует тому объекту, из которого был вызван соответствующий код. Если мы будем работать с формами, этот идентификатор будет соответствовать идентификатору Me, который мы применяли ранее. Далее, как можно увидеть, идут процедуры класса DoCommand. А именно, первый из них - это GoToControl. Он соответствует нашей макро команде к элементу управления. И разумеется, здесь же имя данного элемента. Ниже находится FindRecord - это тоже процедура нашего основного класса DoCmd. А в качестве аргумента эта команда получает значение элементов Combo Box. Кроме этого, в этой функции есть блок On Error, который производит обработки ошибок. Конечно, если они происходят и переходят к соответствующей метке. К метке Мой макрос 1_Err, предварительно вызвав, конечно же, сообщение. И далее после сообщения происходит переход к метке Exit и выходу из функции. Ниже находится вторая процедура. Сместимся чуть пониже, чтобы ее увидеть. Здесь у нас, как можно видеть, есть условие IF, в котором используется функция Eval, и которая вычисляет значение, в данном случае из вот этого соответствующего строкового поля. Здесь же используется еще несколько команд класса DoCmd. А именно, вот в этих трех случаях FinRecord с разного рода условиями. Конечно же, в DoCmd есть и такие стандартные действия, как печать отчетов, открытие нужных форм, выполнение нужных нам запросов и т.д. Эти действия могут быть вынесены в макротаблицы. И как правило, они обрабатываются, как действия класса DoCmd. А для того чтобы просмотреть весь класс DoCmd и его команды, щелкнем сейчас на кнопку F2, чтобы вызвать Object Browser, или же щелкнем на пункте меню View и выполним команду Object Browser. В любом случае появляется вот это стандартное окошко и в этом списке найдем нужный нам класс DoCmd. Вот выделим его и можно увидеть, какие есть команды у этого класса. Например, AddMenu добавить меню, применить фильтр, вызов сигнала - Beep. Закрыть - Close, копировать файл базы данных, копировать объект, удалить объект. Далее DoMenuItem - одна из самых распространенных и универсальных команд данного класса. Она позволяет выполнять большое количество разнообразных действий, связанных с основным меню, которое открывается при открытии базы данных. Т.е. наши формы в приложении Access. Кроме того, мы уже встречали, например, такую процедуру, как GoToControl в нашем преобразованном макросе. Здесь же находится такая команда, как FindRecord найти запись. Команда Maximize и Minimize - максимизация и минимизация. Здесь же находятся песочные часы Hourglass и т.д. Здесь, как мы видим, очень много разного рода команд. Закроем пока этот браузер, щелкнем на вот этом крестике. А теперь же вернемся к Microsoft Access, в котором в списке модулей можно увидеть наш новый преобразованный макрос.
13.12. Процедуры класса DoCmd для работы с записями. Урок 2 Итак, продолжим знакомство с процедурами класса DoCmd. Для этого создадим копию вот этой формы 1, с которой мы работали ранее. Как мы помним, она помогала нам двигаться по нашим записям, а также удалять и добавлять записи при помощи кнопок, созданных нами. Попробуем сейчас все это сделать, используя команду DoCmd. Прежде всего сделаем копию этой формы. Щелкнем на правую кнопку мыши и выполним команду Копировать.
Глава 13. Специальные средства Access VBA (продолжение)
335
Далее правая кнопка мыши и Вставить. Введем имя для нашей формы. Пусть это будет форма1DoCmd. Щелкнем на кнопке ОК. Вот эта форма появилась перед нами. И откроем ее в режиме конструктора. Как мы помним, у этой формы не было задано ни одной таблицы в качестве источника данных. Сейчас попробуем задать. Для этого щелкнем на вот этой кнопке в левом верхнем углу нашей формы. На правую кнопку и далее выберем Свойства. В качестве источника записей выберем таблицу сотрудников. Для этого щелкнем на этом выпадающем списке и выберем ее. Вот она появилась перед нами вместе со всеми его полями. Зададим теперь отображение соответствующих полей в этих двух элементах управления. Вот в этом мы хотим отобразить фамилию. Для этого в появившихся свойствах этого поля выберем пункт Данные и здесь поле Фамилия. Выберем второй элемент управления. Здесь в качестве источника данных выберем имя. Окно свойств сейчас закроем и попробуем запустить нашу форму и посмотреть, как сейчас она работает. Для этого щелкнем на кнопке Вид. Вот появилась перед нами наша форма и все записи нашей таблицы - фамилия и имя каждого из сотрудников. Если мы сейчас щелкнем на кнопке, которую мы вводили, то, как мы видим, все работает, так же как и работало. Т.е. пока все нормально. Переключимся обратно в режим конструктора. Перейдем теперь в редактор Visual Basic. Для этого щелкнем, как всегда на Alt+F11. Щелкнем на этом плюсике, чтобы открыть формы и в частности форму, с которой мы только что работали, и щелкнем на ней дважды. Вот она появилась перед нами. А теперь попробуем изменить процедуру, которую мы создавали в этой форме так, чтобы они использовали объект DoCmd. Перво-наперво попробуем, например, изменить процедуру удаления нашей текущей записи. Как мы помним, она образована при помощи вот этих трех строчек. Сейчас мы их закомментируем. Они нам не нужны. И попробуем создатьу другую версию того же самого события. Чтобы не мучаться с написанием соответствующего кода, переключимся в Microsoft Access и попробуем создать кнопку, которой можно автоматически создать для этих целей. Для этого возьмем кнопку, как элемент управления. Щелкнем. Нарисуем ее где-нибудь. Например, вот в этом месте. Как мы видим, как только мы нарисовали эту кнопку, сразу появилось окошко с мастером создания новой кнопки и здесь можно выбрать одно из автоматически создаваемых действий. Выберем, например, пункт Обработка записей и здесь есть пункт Удалить запись. Это нам сейчас и нужно. Щелкнем сейчас на кнопке Далее. Здесь появляются несколько возможностей для текста, рисунка и т.д. Далее появляется имя для нашей кнопки. Сейчас здесь ничего менять не будем. Щелкнем на кнопке Готово. И вот появилась вот эта кнопка. Теперь же перейдем в редактор Visual Basic. Для этого щелкнем на Alt+F11, как всегда, и сдвинемся в самый конец нашего модуля. Здесь можно увидеть обработку события Нажатие на вот эту кнопку, которую мы только что создали. Как можно увидеть, эта кнопка как раз сейчас использует команду DoCmd. Объект DoCmd сейчас работает при помощи своего метода DoMenuItem, осуществляет выполнение пункта меню, который может появляться в нашей форме в режиме его активизации.
336
TeachPro Microsoft Access 2003
Будет выполняться его пункт меню из группы acEdit и его соответствующий пункт. А сейчас попробуем выполнить все эти же самые действия при помощи нашей кнопки удаления. Конечно же, мы теоретически можем выделить все содержимое этой процедуры и скопировать. Но мы можем это сделать и по-другому. А именно запустить просто-напросто вот эту процедуру кнопкой 26 Click. Для этого выделим ее. Правая кнопка мыши. Команда Сору. Теперь поднимемся вверх, туда, где у нас обработка событий нажатие на нашу кнопку Delete. Щелкнем на клавише Enter. Далее правая кнопка мыши и Paste. Вот мы вставили обработку нашего события. Далее удалим вот эти скобки, они не нужны сейчас и посмотрим, как теперь будет работать эта кнопка. Для этого перейдем в Microsoft Access, запустим нашу форму. Вот, как мы видим, здесь пока все то же самое. Чтобы не удалять уже существующую запись, введем новую. Например, введем какие-нибудь ничего не значащие буквы. А теперь, если мы выделим эту форму и щелкнем на кнопку Delete, то, как мы видим, появляется достаточно логическое предупреждение о том, хотим мы или нет удалить эти записи. Щелкнув на кнопке Да, мы получаем уничтожение этой выделенной нами записи. Перейдем сейчас в режим конструктора и опять запустим Visual Basic. Нажмем для этого на комбинацию клавиш Alt+F11. Теперь же рассмотрим последовательно все те процедуры, которые у нас есть в нашем модуле. Первая из них не использует наш объект rstMy, поэтому здесь все нормально. А вот далее, у нас идет возможность добавления новой записи. Здесь, как мы видим, мы как раз используем rstMy и далее его команду AddNew. Сейчас нам эта команда не нужна, поэтому закомментируем ее. И, щелкнув на кнопке Enter, введем DoCmd. Далее точка. И затем, для того чтобы добавить новую запись, в принципе, прямо такой операции в этом объекте нет, но есть универсальная команда GoToRecord. Вот появилась она перед нами. Щелкнем на ней дважды и введем теперь несколько параметров. Первый из них - это объект данных. Возьмем текущий. Поэтому щелкнем на запятую. Имя нам тоже не нужно. Опять запятая. А вот следующий параметр, при помощи которого мы можем определить, куда мы хотим перейти и что мы хотим сделать с записями, нам как раз и нужен. И здесь, как мы видим, есть пункт acNewRec. Щелкнем на нем дважды. И после этого эта функция у нас уже полностью готова. Добавлять новые записи мы уже тоже можем при помощи DoCmd. Следующая команда - это команда MoveFirst. Мы ее тоже закомментируем. Щелкнем на кнопке Enter. Далее наш класс DoCmd. Точка и его опять команда GoToRecord. Так и напишем. GoToRecord. Появилась перед нами нужная нам команда. Щелкнем дважды. Далее пробел. Теперь опять запятая, чтобы не заполнять первые два параметра. И далее acFirst, конечно же, переход к первой записи. Щелкнем дважды. И теперь эта команда у нас уже полностью готова. Пойдем дальше. Здесь тоже заменим rstMy на другую команду, поэтому ее закомментируем. Щелкнем на Enter и возьмем класс Me. Далее точка, далее Bookmark. Вот появилась соответствующая команда. Щелкнем дважды и опять напишем равняется bMark, т.е. сохраненное значение нашей закладки. Теперь сдвинемся дальше к следующим процедурам. Здесь, как мы видим, есть MoveLast. Его тоже закомментируем. Далее Enter. Далее DoCmd. Точка. Затем GoToREcord. Щелкнем дважды. Пробел. Далее опять 2 запятые. И затем, поскольку мы хотим перейти к последней записи, выберем пункт acLast. Щелкнем дважды. Далее идет запоминание закладки. Опять закомментируем эту строчку и ее немножко изменим. Напишем следующим образом. bMark, равняется. Вызовем класс Me. Далее точка и затем его команда Bookmark.
Глава 13. Специальные средства Access VBA (продолжение)
337
Вот она появилась перед нами. Два раза на ней щелкнем. Теперь переход к следующей записи Next. Закомментируем команду rstMy. Для этого напишем соответствующий апостроф впереди и вызовем класс DoCmd, точка. Далее GoToRecord. Щелкнем дважды. Далее пробел. Опять 2 запятые и нам нужно, конечно же, для перехода к следующей записи acNext. Щелкнем дважды. Вот эти проверки сейчас мы тоже выполнять не будем, их закомментируем. Далее идет команда Previous. Здесь тоже закомментируем вот эти три строчки и выполним команду DoCmd и GoToRecord. Щелкнем дважды. Далее пробел, 2 запятые и для перехода к предыдущей записи нам, конечно же, нужно выполнить команду acPrevious. Щелкнем на этой возможности. Далее опять свинемся ниже. Здесь у нас есть процедура обработки получения номера текущей записи. К сожалению, этой возможностью мы сейчас не можем воспользоваться. Поэтому закомментируем эти строчки. И процедура FormLoad сейчас нам абсолютна не нужна, поскольку базу данных мы определяем не программных образом, а непосредственно, как свойство данной формы. Поэтому сейчас закомментируем все эти строчки. Далее ниже процедура обработки события, связанного с переходом к номеру соответствующей записи. Это мы тоже все закомментируем. И после всех этих изменений ниже находится обработка события Click на кнопку 26, эта кнопка для удаления записи. В принципе, здесь rstMy, конечно же, не использовалась. Это новая функция. И теперь, после всех этих дел мы можем закомментировать, наконец, определение вот этого объекта rstMy. Введем здесь тоже апостроф. Запустим теперь нашу форму. Перейдем в Microsoft Access. Щелкнем на соответствующую кнопку и щелкнем на кнопке Вид. Вот она появилась перед нами. Попробуем сейчас передвигаться по записям. Как видите, мы можем совершенно спокойно передвигаться по записям и вперед, и назад, и к первой, и к последней записи. Точно также мы можем добавить новую запись, ввести здесь что-либо. Например, вот такую аббревиатуру. Можем опять передвигаться. Можем удалить запись, щелкнув на кнопке Да. Таким образом, воспользовавшись классом DoCmd, мы смогли сделать все то же самое, что и раньше делали другим путем. Ну и можем в частности еще и запомнить какую-либо позицию и далее вернуться к ней.
13.13. Процедуры класса DoCmd для работы с записями. Урок 3 Рассмотрим теперь вторую форму, форму 2, которую мы создавали ранее. Щелкнем на ней дважды и можно увидеть, что она собой представляет, и что она делала. А именно, при нажатии на вот эту кнопку Обмен она переставляла данные из одной таблицы в другую и обратно. Попробуем теперь все это проделать при помощи класса DoCmd. Для этого закроем эту форму и подготовим несколько запросов, при помощи которых мы это будем делать. Для этого перейдем на вкладку Запросы, далее щелкнем на кнопке Конструктор - создание запросов в режиме конструктора. В качестве таблицы выберем таблицу Сотрудники. Щелкнем на кнопку Добавить. Закроем. Затем изменим тип за-
338
TeachPro Microsoft Access 2003
проса. Нам нужен сейчас не запрос на выборку, а запрос на добавление. Поэтому щелкнем на правую кнопку мыши и выберем меню Тип запроса. Нам нужно добавление, щелкнем на соответствующей возможности и добавим все это в таблицу Сотрудники-2. Щелкнем на кнопку ОК. Далее в качестве поля выберем Сотрудники и звездочка, для того чтобы мы обрабатывали все поля. И как мы видим, мы теперь будем все данные из нашей таблицы Сотрудники перебрасывать в таблицу Сотрудники-2. Закроем этот запрос. Щелкнем на кнопке сохранить. Введем имя. Допустим, напишем имя q1to2 - переброска данных из первой таблицы во вторую. Щелкнем на кнопке ОК. И теперь создадим аналогичное Q2to1 - из второй таблицы в первую. Опять щелкнем на кнопке Конструктор. На этот раз в качестве основы выберем таблицу Сотрудники-2. Щелкнем на кнопке Добавить. Закроем. Правая кнопка мыши, вместо Выборки выберем тип запроса Добавление. Перебрасывать мы будем в таблицу Сотрудники. Щелкнем на кнопке ОК. Выберем в качестве поля Сотрудники2 со звездочкой, чтобы перебрасывались все поля и все данные. И теперь у нас здесь уже все полностью готово. Щелкнем на крестике, чтобы закрыть запрос. Сохраним изменения. И вместо имени запрос 1 напишем Q2to1.Щелкнем на кнопке ОК, и вот теперь у нас уже полностью готовы два запроса - запросы на добавления. Теперь сформируем два запроса на удаления - очистку первой и второй таблицы сотрудников. Для этого опять щелкнем на кнопке создания запросов в режиме конструктора. Выберем таблицу Сотрудники. Щелкнем на кнопку Добавить. Закроем. Вместо запроса на выборку нам нужен запрос на удаление. Поэтому щелкнем на правую кнопку мыши. Тип запроса Запрос на удаление последний пункт в меню. Далее в качестве поля выберем поле Сотрудники со звездочкой, чтобы удалились все записи. Закроем теперь этот запрос. Конечно же, мы хотим это все сохранить. И напишем имя для этого запроса. Пусть, например, будет qdel1 - удаление всех данных из первой таблицы сотрудников. Щелкнем на кнопке ОК. Теперь то же самое сделаем для второй таблицы. Аналогичный запрос. Щелкнем на кнопке Конструктор. Выберем Сотрудники2, добавить, закроем это окошко. Вместо запроса на выборку выберем при помощи правой кнопки мыши и пункта меню Типы запросов Запрос на удаление. В качестве поля выберем Сотрудники2 со звездочкой, для того чтобы мы удаляли все данные из этой таблицы. Щелкнем на крестике, чтобы закрыть. Сохранить изменение. Да. И наберем имя для нужного нам запроса. Это у нас будет qdel2 - удаление всех данных из второй таблицы. Щелкнем на кнопке ОК, и теперь у нас все запросы уже готовы. Теперь же перейдем к нашей форме, вот к этой форме 2. Создадим ее копию, для того чтобы исходный вариант у нас сохранился. Щелкнем на правую кнопку мыши. Копировать. Далее правая кнопка мыши. Вставить. И выберем новое имя. Напишем опять Форма 2 и далее DoCmd. Именно при помощи этого класса мы сейчас и будем выполнять то, что раньше делала эта форма. Щелкнем на кнопке ОК. А теперь вызовем эту форму в режиме конструктора и откроем Visual Basic. Для этого щелкнем на Alt+F11. Откроем теперь соответствующий модуль. Щелкнем дважды. Вот он появился перед нами и теперь, во-первых, удалим все определения типа DAORecordset. Они нам все не нужны. Выделим. Щелкнем на кнопке Delete и одновременно удалим и всю внутренность этих программ. Оставим только обновления при помощи команды Requery. Они нам понадобятся. Щелкнем на кнопке Delete и теперь напишем новые строки кода. Перво-наперво определим две строковые переменные при помощи оператора Dim. Первая из них, например, строковая переменная Add. Она строковая, поэтому As String. Enter, далее Dim. Следующая строковая переменная strDel. As String. В принципе, в этих двух строковых переменных мы будем определять, какие из запросов мы хотим выполнить.
Глава 13. Специальные средства Access VBA (продолжение)
339
Поэтому напишем оператор IF. Далее воспользуемся командой Dcount для определения количества записей. Скобка. Далее нам нужно задать имя какого-либо из полей. Например, зададим поле Имя. Далее запятая, далее зададим таблицу, в которой мы хотим все это определить. Это у нас таблица Сотрудники. Закроем скобки, и если это количество больше 0, Enter, зададим следующее значение для наших строковых переменных. В переменную strAdd поместим значение q1to2. А во вторую переменную strDel поместим значение запроса qdel1. Enter. Теперь введем Else. Enter. И если количество записей в этой таблице Сотрудники равно 0, тогда мы в переменную strAdd поместим значение запроса Q2to1. Т.е. перебрасывать будем в другую сторону. Ну и удалять будем тоже все записи с другой таблицы. Поэтому strDel равняется и внутри кавычек напишем qdel2 - удаляем все данные из второй таблицы. Далее, конечно же, End If, Enter. А теперь, после того, как мы определились в нашими строковыми переменными и выполняемими запросами, нам нужно их непосредственно выполнить. Для этого воспользуемся, конечно же, DoCmd. Все это затеивалось именно для того, чтобы использовать этот класс. Далее точка и далее его команда OpenQuery. Вот она появилась перед нами. Щелкнем на ней дважды и затем напишем ту строковую переменную, при помощи которой мы хотим выполнить соответствующий запрос. Первая из них - это, конечно же, strAdd. Enter. Далее опять DoCmd, точка. И выполним следующий запрос. После переброски данных нам нужно очистить соответствующую таблицу. Поэтому OpenQuery. Щелкнем дважды и на этот раз выполним второй запрос.strDel, который очищает данные. Посмотрим теперь, как все это будет работать. Для этого перейдем в Microsoft Access и запустим нашу вот эту форму. Щелкнем на кнопке Вид. Вот появилась эта форма. Щелкнем теперь на кнопке Обмен, и появилось вот такое сообщение о том, что мы добавляем данные в таблицу. Щелкнем на кнопке Да. Нам сообщается, что 7 данных будет добавлено. Да. Запрос на удаление приведет к изменению данных в таблице. Теперь, конечно же, мы перешли на процедуру удаления. Да. Мы удалим 7 записей. Да. И в результате всех этих нажатий на кнопки Да, мы как раз и получили переброску данных из одной таблицы в другую. Если мы опять щелкнем на кнопке Обмен и будем щелкать на кнопке Да, то мы перебросим все это обратно. В принципе, все вроде бы действует достаточно нормально. Единственно, конечно, нажатие на кнопку Да все время, немножко нервирует. Поэтому перейдем обратно в режим конструктора, вызовем редактор Visual Basic Alt+F11, и запретим вызов всех этих сообщений. Для этого перед выполнением первого из запросов опять вызовем класс DoCmd, точка и его свойство SetWarnings. Вот он появился перед нами и вызов всех этих сообщений запретим, поэтому напишем False. А после выполнения наших запросов восстановим все к исходному виду. DoCmd, точка, далее опять SetWarnings. И далее True. Перейдем теперь обратно в Microsoft Access. Запустим эту форму. Щелкнем на соответствующей кнопке и затем щелкнем на кнопке Обмен. Как мы видим, мы получили все то же самое. Данные из одной таблицы перебрасываются во вторую и обратно. И на этот раз мы использовали класс DoCmd.
340
TeachPro Microsoft Access 2003
Глава 14. Важнейшие для нас функции Access и Visual Basic for Application 14.1. Текстовые функции Asc и Chr Итак, на этом уроке мы начинаем знакомиться с самыми важными функциями Access и Visual Basic. Надо, конечно же, отметить, что функций в Access и Visual Basic довольно много. И, конечно же, разобраться и познакомиться со всеми ими будет достаточно сложно и даже невозможно. Поэтому разберем те из них, которые наиболее часто используются в программах. Хотя бы в тех примерах, которые мы использовали в курсе Microsoft Access. В частности познакомимся с текстовыми функциями и именно с таких функции и начнем знакомство. Для того, чтобы мы могли писать наши примеры, создадим новую базу данных. Проще всего это сделать с помощью области задач, которая у нас находится в правой части экрана. Щелкнем на пункте Создать файл. Появляется соответствующая вкладка области задач, и здесь щелкнем на пункте Новая база данных. Введем имя для нашего проекта. Например, пусть это будет Funcs - функции. Щелкнем на кнопке Создать. Вот появилась база данных переда нами. Для того чтобы наша база данных не была совсем уж пустой, добавим в нее новую таблицу. Проще всего добавить ее с помощью импорта, для того чтобы не возится с созданием структуры таблицы и заполнением ее содержания. Поэтому щелкнем на правую кнопку мыши, выберем пункт Импорт. Откроем, например, вот эту базу данных first и из нее скопируем и импортируем опять-таки таблицу Сотрудники. Щелкнем на кнопку ОК. И вот соответствующая таблица появилась в нашей базе данных. Теперь же перейдем к модулям и создадим новый модуль. Вот вкладка модули. Пока она абсолютно пуста. Щелкнем на кнопку Создать и появляется новый модуль со стандартным именем Модуль 1. Создадим новую процедуру. Конечно же, она должна начинаться с ключевого слова Sub - подпрограмма, subroutine. Пусть имя этой процедуры будет Х. Далее скобки. Enter. И одновременно с нажатием на кнопку Enter, компьютер чуть-чуть отформатировал введенную нами строку, а также добавил закрытие процедуры End Sub. А теперь напишем несколько строчек кода, в которых применим строковые функции. Объявим для начала несколько переменных, которые мы используем в дальнейшем. Конечно же, их объявлять будем с помощью ключевого слова Dim. Затем первая переменная строкового типа strVar. Далее введем переменную, которая у нас будет типа Integer - intVar - И третья переменная dateVar. В ней мы будем оперировать переменными типа даты. Сейчас, пока мы не будем задавать им явно тип. Они, конечно же, сразу объявляются, как Variant, неопределенного типа. Присвоим, например, вот этой переменной strVar какое-либо значение. Поскольку мы договорились, то это строковая переменная, мы можем написать какую-либо строчку в кавычках. Напишем, например, Иван Иванович Иванов. Щелкнем теперь на клавише Enter, и в принципе, эта переменная у нас уже определена и имеет соответствующее значение. Теперь же попробуем отобра-
Глава 14. Важнейшие для нас функции Access и VBA
341
зить в окне Immediate при помощи функции Debug.Print значение переменной. Поэтому напишем следующим образом. Debug точка Print. Щелкнем дважды. Далее пробел и теперь нам нужно написать ту переменную, которую мы хотим напечатать. Для начала напишем отображение этой же переменной strVar. Попробуем теперь выполнить эту процедуру, но перед этим, конечно же, откроем окно Immediate, для того чтобы мы могли видеть результат выполнения этой процедуры. Для этого щелкнем на пункте меню View. Далее Immediate Window. Вот оно появилось перед нами. А теперь запустим эту процедуру. Щелкнем на кнопке Run. Конечно же, вот это строковое выражение Иван Иванович Иванов у нас появилось в окне Immediate. Теперь же чуть-чуть изменим команду Debug.Print и вместо прямого вывода нашего строкового выражения, напишем впереди вот такую функцию, функцию asc. Далее скобка и, как мы видим, внутри скобки от нас требуют строковое выражение. Конечно же, strVar у нас как раз является в данном конкретном случае строчкой. Поэтому закроем скобку. Попробуем выполнить эту процедуру в таком виде. Перед этим очистим окно Immediate, выделим и щелкнем на Delete. Встанем внутри нашей процедуры и щелкнем на кнопке Run. И можно увидеть, что у нас получилось. А именно в окне Immediate наш компьютер вывел одно число, число 200. В принципе, это выражение требует определенного объяснения. Дело в том, что 200 является кодом первой буквы, которая присутствует в нашем строковом выражении. В нашем конкретном случае это код буквы "И". Причем именно большой буквы "И". Дело в том, что, как вы, наверное, знаете, все символы в компьютере имеют свой предопределенный код, который меняется в пределах от 0 до 255. И в этом перечне русской большой букве "И" соответствует номер 200. Попробуем теперь изменить регистр нашей первой буквы. Вместо большой буквы "И" напишем маленькую. Запустим сейчас нашу процедуру, очистим окно Immediate и, встав внутри процедуры, щелкнем на кнопку Run. Можно увидеть код, которому соответствуют маленькие буквы "и" - это 232. Наряду с функцией Asc, которая возвращает код соответствующего символа, есть и обратная ей функция, функция Char. Эта функция, наоборот, возвращает символ, если мы задали соответствующие число. Попробуем сейчас применить ее к вот этому выражению. Для этого впереди напишем Chr, далее скобка, внутри которой, как мы видим, от нас требуется написать целочисленное значение. Как раз Asc и выдаем его. Закроем скобки. Теперь удалим в окне Immediate всю информацию и запустим нашу процедуру. Встанем внутри, щелкнем на кнопку Run и, как мы видим, мы получили маленькую букву "и". В принципе, так и можно было ожидать. После такого двойного преобразования мы преобразовали букву "и" в его кодовое представление, а затем получили обратно этот же символ. А теперь мы вместо маленькой буквы "и" напишем обратно большую и запустим опять наше выражение, очистив окно Immediate, чтобы мы не путали значения. Щелкнем теперь на кнопке Run и, конечно же, получили большую букву "И". Если же мы введем какое-либо другое число. Например, введем 224. Очистим окно Immediate и запустим нашу программу. Как мы видим, этому коду соответствует маленькая буква "a". Очистим. Снова займемся нашей процедурой. А теперь же эту строчку закомментируем. Нам она сейчас пока не нужна. И щелкнем на кнопке Enter. Попробуем вывести сообщение. Для этого существует специальная функция MsgBox. Мы с ней уже сталкивались. И теперь введем соответствующую строчку, которую хотим вывести в нашем MsgBox, в нашем сообщении. Конечно же, ее надо написать внутри кавычек. И пусть сообщение, например, будет вот такое - "Это сообщение, которое может быть не просто длинным, а очень длинным".
342
TeachPro Microsoft Access 2003
Как мы видим, это сообщение, правда, достаточно длинное, в результате чего мы сдвинулись при помощи скроллинга вдоль нашей строчки. Теперь уже попробуем запустить эту процедуру. Щелкнем на кнопке Run и, конечно же, мы получаем введенное нами сообщениеи. Щелкнем теперь на кнопке ОК и мы возвращаемся к нашему Visual Basic. Конечно же, вот такой длинный вид строчки достаточно неудобен, поскольку целиком окинуть взглядом все сообщение невозможно. Приходится пользоваться скроллингом. Но, попробуем этому помочь. Для этого разобьем вот эту строчку на две строки и таким образом выведем это сообщение. Для этого поставим здесь кавычки. Далее плюс. Вторые кавычки. И в принципе, вот в таком виде мы уже тоже могли бы вызвать это сообщение. Правда, пока никакого особого улучшения от такого выражения не будет. Хоть сообщение и точно такое же, но в длину оно все равно вылезает из нашего окна. Пока мы особого успеха не добились. Но мы сейчас можем поступить следующим образом. Введем после плюса знак подчеркивания и после этого щелкнем на кнопке Enter и перенесем все остальное значение нашей строки на новую строчку. После этого мы опять правильно ввели выражение нашего сообщения. Дело в том, что вот этот знак подчеркивания как раз и является символом, помогающим объединять несколько длинных строк. Попробуем сейчас выполнить нашу процедуру. Щелкнем на кнопке Run и, как мы видим, мы опять получаем то же самое сообщение, не разбитое на 2, а выведенное единой строчкой. Щелкнем теперь на кнопке ОК и попробуем разбить эту строчку на 2 строчки уже и в результирующем сообщении при появлении MsgBox. Надо отметить одно обстоятельство, что при переходе на новую строчку обычно в программах используется два символа с кодом 10 и 13. Поэтому введем здесь для нашей переменной strVar, который мы ранее представляли вот таким строковым выражениям. Новое выражение - здесь мы поставим кавычки. Напишем таким образом: значение переменной strVar равняется. Для того чтобы ввести символы, используем функцию Chr, скобки. Далее 10, далее плюс, опять Chr и следующий символ с кодом 13. Это, как раз и будет знаком перехода на новую строку. И теперь внутри нашей строчки напишем таким образом. Введем здесь дополнительный плюс и далее выведем нашу переменную strVar. Попробуем теперь запустить нашу процедуру. Щелкнем на кнопку Run и можно увидеть, что на этот раз мы как раз смогли разбить нашу строчку. Она вывелась в виде сообщения, состоящего из 2 строчек, первая из которых - это "сообщение, которое может", а дальше "может быть не просто длинной, а очень длинной" - две строки. То, что мы и хотели. Щелкнем на кнопке ОК и мы вернулись к редактору Visual Basic. Разумеется, при желании мы эту переменную, которая является сейчас разделителем строк, можем использовать несколько раз в наших сообщениях.В результате мы получим сообщение, состоящее не только из 2, но и 3, 4 и т.д. - любого количества строк по нашему выбору.
14.2. Текстовые функции Mid, Len, UCase, LCase Рассмотрим несколько строковых функций, достаточно часто используемых в Microsoft Access и Visual Basic и при помощи которых можно получить какую-либо часть строки. Для этого напишем функцию Debug.Print, чтобы выводить результат нашей работы в окне Immediate, и далее напишем такое выражение. Перво-наперво, попробуем определить длину строки. Для этого есть специальная функция Length, далее скобки, внутри которых надо написать какое-либо выражение. В качестве выражений используем вот эту строчку strVar. Закроем скобки. Запустим. И как мы видим, длина этой строки составляет 20 символов. Удалим в окне Immediate все. Далее щелкнем на клавише Enter. Опять введем Debug.Print. И на этот раз воспользуемся другой функцией, функцией InStr, которая определяет первое вхождение подстроки в строку.
Глава 14. Важнейшие для нас функции Access и VBA
343
Для этого перво-наперво надо написать строку, в которой мы проводим поиск. Для этого мы используем strVar, запятая. Далее нам нужно написать ту подстроку, которую мы хотим искать и попробуем найти внутри нашей строки просто-напросто пробел. Больше никаких параметров указывать не будем. Закроем скобки. Хотя в принципе, мы могли еще указать какое-либо число, которое определяло бы, с какой позиции мы хотим искать пробел внутри нашей строки. Сейчас это делать не будем и попробуем выполнить эту процедуру. Щелкнем на кнопку Run и можно увидеть, что пробел стоит внутри нашей строчки на 5 позиции. В принципе, можно отсчитать и увидеть, что так оно и есть на самом деле. Щелкнем теперь на кнопке Enter. Опять Debug.Print. И попробуем сейчас использовать функцию, которая возвращает нам левую часть нашей строки. Для этого существует функция Left. Далее скобка, внутри которой мы должны указать строкуОбразец. Это у нас strVar, запятая и далее количество символов, которые мы хотим получить. К примеру, если мы хотим получить только имя из вот этого нашего выражения, то нам нужно взять, конечно же, первые 4 символа. Запустим, очистив перед этим окно Immediate. Щелкнем на кнопку Run и, конечно же, как мы и ожидали, мы получили имя в качестве выводной информации. Теперь опять очистим окно Immediate. Напишем опять Debug.Print. На этот раз воспользуемся функцией Mid, которая возвращает среднюю часть строки. В качестве образца опять возьмем, конечно же, strVar. Далее запятая, далее нам нужно указать первый символ, начиная с которого мы хотим отображать информацию. Возьмем, начиная с 5-ой, далее запятая и далее выведем, например, еще 5 символов. Закроем скобки. Если мы сейчас щелкнем на кнопке Run, то можно увидеть, что последнее записанное нами выражение опять выдало нам - это "Иван". На самом деле это не первое имя, а просто-напросто часть отчества. Вот эта часть. Если мы, например, вместо 5 символов напишем 9, очистим окно Immediate и щелкнем на кнопке Run, то мы можем увидеть целиком отчество, которое находится внутри нашей строчки. Очистим окно Immediate и теперь попробуем вывести правую часть строки. Для этого опять Debug.Print. И далее воспользуемся функцией Right. Далее скобка. Опять образец строчки. Это у нас будет, конечно же, опять strVar. Далее запятая и далее нам нужно указать количество символов, которые мы хотим отобразить. Отобразим 6 символов, для того чтобы мы могли целиком получить фамилию из нашей строки. Теперь же щелкнем на кнопке Run, и можно увидеть результат выполнения всей нашей процедуры. В конце мы, конечно же, получили последовательно имя, отчество и фамилию при помощи трех функции Left, Mid и Right, которые последовательно вывели левую, среднюю и правую части нашей строки. Попробуем теперь, пользуясь вот этими функциями поиска подстроки, длинны, левой, правой и средней части, написать функцию, которая бы разбивала строчку, состоящую из имени, фамилии и отчества, на соответствующие составляющие. Для этого напишем, во-первых, название этой функции. Конечно же, это должно быть ключевое слово Function. Далее назовем ее, например, GetPart. Далее скобка. Первый из параметров st пусть это будет строка. И далее пусть будет part. Это будет целочисленное значение, в зависимости от которого мы будем выводить имя, отчество или фамилию, в зависимости от того, part будет равен 1, 2 или 3.
344
TeachPro Microsoft Access 2003
Щелкнем на клавише Enter. Конечно же, нам компьютер автоматически ввел End Function. Теперь же введем знак табуляции и введем пару переменных целочисленного типа, которые нам понадобятся в дальнейшем. Для этого напишем Dim. Пусть это будет pos1 и pos2. Это у нас целочисленные переменные, в которых мы будем хранить различного рода позиции. Это позиции 1 и 2 пробела в нашей строке, которыми отделяют имя, отчества и фамилию. Теперь, конечно же, ключевое слово As. Далее Integer. Enter. Далее pos1 равняется, и подыщем первое вхождение пробела внутри нашей строки. Его поищем при помощи функции, конечно же, InStr. Далее скобка. Наша строка, конечно же, st. Далее запятая. Потом введем то, что мы хотим искать. Это, конечно же, пробел, который заключим в кавычки. И далее Enter. Теперь найдем вторую позицию, позицию второго пробела. Это у нас pos2. Равняется. Конечно же, опять InStr. Воспользуемся этой функцией. Но на этот раз поиск начнем не с начала строки, а с позиции pos1 + 1. Далее запятая. А теперь строка, в которой мы производим поиск - st - и далее, что мы ищем. Конечно же, это опять пробел в кавычках. Далее Enter. Теперь у нас есть позиция и первого и второго пробелов. И теперь значения вот этой переменной part определим при помощи оператора Select Case. Далее наша переменная part, Enter. Чтобы не забыть, напишем End Select. Введем здесь Enter, знак табуляции и далее последовательно случаи. Первый случай - это case 1. Если здесь у нас 1, тогда наша переменная GetPart, возвращаемое значение, будет равняться левой части, которую мы получаем при помощи функции Left от нашей исходной строки st. Запятая и мы возьмем, конечно же, количество символов, равное pos1 - 1. Поскольку сам пробел, конечно же, нам не нужен. Поэтому на 1 меньше, чем pos1. А теперь Enter, второй случай case 2. Двоеточие. Опять переменная GetPart - возвращаемое значение. На этот раз она будет равняться Mid - средней части строки st. Запятая. Начинаем мы с позиции pos1 + 1, опять-таки, чтобы взять после пробела следующий символ. Далее запятая и количество нужных нам символов будет pos2 минус pos1. Закрыть скобки. Enter. Последний случай, case 3. Двоеточие. Далее возвращаемое значение GetPart будет равняться правой части, которую мы получаем при помощи функции Right от нашей строки st. И возьмем мы, конечно же, количество символов, которое получим, как вычитание из общего количества символов len от нашей переменной st минус pos - позиция второго пробела 2. Закрыть скобки. И вот теперь у нас уже готова вся нужная нам функция, которая будет разбивать строку st на три составляющие - имя, отчество и фамилию. Строка будет разбиваться в зависимости от пробела, который будет являться разделителем между именем, отчеством и фамилией. Используем теперь вот эту функцию GetPart, которую мы написали и которая разбивает строку, состоящую из имени, фамилии и отчества на три составляющие в нашей процедуре - вот этой процедуре Х. Перед этим удалим эти несколько строчек. Они нам не нужны. Единственное, оставим Debug.Print. Щелкнем на кнопке Delete и напишем следующим образом. GetPart. Далее скобка. Затем используем переменную strVar, которая у нас состоит из имени, отчества и фамилии. Запятая и выведем первую из его составляющих - имя. Далее скопируем всю эту структуру, выделим. Правая кнопка мыши и Сору. Далее вставим здесь Enter. Правая кнопка мыши и Paste. Вставим. Опять Enter. Опять правая кнопка мыши и Paste. Вставим. Далее здесь напишем цифру 2 и цифру 3, чтобы последовательно выводились имя, отчество и фамилия. Теперь же очистим окно Immediate и запустим вот эту процедуру. Щелкнем на кнопке Run и в принципе, как можно было и ожидать, у нас все получилось достаточно правильно. Мы вывели в качестве первой строки имя, далее в качестве второй строки отчество и в качестве третьей строки фамилию, которая находилась внутри нашей строки.
Глава 14. Важнейшие для нас функции Access и VBA
345
14.3. Текстовые функции Str, Val На этом уроке мы поговорим о функциях, которые предназначены для преобразования текстовых величин в числовые и наоборот. Для начала очистим все строчки нашей процедуры Х, для того чтобы мы могли построить наши примеры. Поэтому выделим их, вот таким образом, щелкнем на кнопку Delete. Теперь же, щелкнув на кнопку Enter и введя знак табуляции, можем написать наше выражение. Опять же воспользуемся оператором Debug.Print. Вот щелкнем дважды. Именно при помощи вот этой функции мы можем выводить значение переменных в окно Immediate. Для начала рассмотрим функцию Val, поэтому введем пробел, далее Val, далее скобка. И, как мы видим, от нас требуют ввести какое-либо строковое значение, которое затем будет преобразовано к числовому виду. Например, внутри кавычек и внутри скобок напишем какое-либо числовое выражение, например, 12345. А теперь же, запустив эту процедуру, можем увидеть, что получается. Щелкнем на кнопке Run, и, конечно же, мы получили то, что и могли получить. А именно, 12345 и получили в окне Immediate. А теперь попробуем немножко поэксперимен6тировать. Например, введем какие-либо, скажем так, посторонние знаки в это число. Например, в конце введем какие-либо буквы. Щелкнем на кнопку Run. И в принципе, мы получили то же самое. Т.е. компьютер и Microsoft Access преобразовали это число правильно, несмотря на ввод этих букв. А теперь посмотрим, что будет, если мы какие-либо другие буквы введем не в конце, а в середину нашего числа. Например, вот в этом месте. Если мы сейчас щелкнем на кнопку Run, то, как мы видим, мы получили число 12, что соответствует правильному выражению числа, которое можно получить из первых нескольких символов. Вот из первых двух символов еще число можно получить, а вот из первых трех уже число не получается. Буква "Т" явно мешает. Поэтому компьютер и преобразовал только то количество символов в число, которое поддается такому преобразованию. Если же мы введем с самого начала не число и щелкнем на кнопку Run, то, конечно же, мы получим в результате 0. Теперь же посмотрим, что будет, если мы введем разделительную точку. Например, введем вот в этом месте. Щелкнем на кнопку Run. Ну и, конечно же, получаем все правильно - 123.45. А если же мы введем опять-таки, например, после точки букву, то после преобразования, получим 123. Опять-таки все правильно до буквы. А что будет, если мы введем еще одну точку. Например, вот такое выражение. Теперь же при нажатии на кнопку Run опять-таки преобразовалось то максимальное количество символов с начала строки, которое еще можно преобразовать в число. Это, конечно же, в данном конкретном случае 123.4. Вторую точку компьютер, конечно же, преобразовать не мог, поэтому на этом он и остановился. Рассмотрим теперь, как можно преобразовать корень числа обратно в строковое выражение. Для этого, конечно же, тоже существует соответствующая функция. Закомментируем эту строчку. Щелкнем на клавише Enter и попробуем ввести какое-либо числовое значение при помощи диалогового окна и затем вывести его в окно Immediate.
346
TeachPro Microsoft Access 2003
Для этого определим перво-наперво переменную. Определим ее, конечно же, при помощи Dim. Далее s, пусть это будет имя переменной. Далее оператор As и пусть это будет переменная типа Single - число с плавающей запятой с одинарной точностью. Щелкнем на клавишу Enter. Далее пусть эта переменная s равняется числу, введенному при помощи InputBox. Для этого напишем InputBox. Далее скобка. Далее появляется тот текст, который должен появляться в этом InputBox в качестве подсказки. Например, напишем так - "введите число". Кавычки надо закрыть. Теперь закроем скобку. Enter. Теперь же попробуем распечатать это число s. Для этого опять воспользуемся оператором Debug точка Print. Щелкнем дважды при появлении на соответствующем операторе. И затем введем сперва текстовое значение "вы ввели" и затем попробуем вывести значение s. Для этого воспользуемся плюсом и далее попробуем написать s. Вроде бы все правильно. На самом деле в таком виде эта процедура работать не будет, поскольку происходит некая ошибка при работе программы, связанная с тем, что мы пытаемся в данном конкретном случае сложить строковое выражение с числовым - с s. Посмотрим, как сейчас будет все это проходить. Щелкнем на кнопке Run. Конечно же, появляется окошко - "Введите число". Введем что-либо. Например, введем 45. Щелкнем на кнопке ОК и, конечно же, возникает ошибка смешения типов. Если мы сейчас щелкнем на кнопку Debug, то можно увидеть, где она возникла. Конечно же, она возникла вот в этой строке Debug.Print - там, где мы пытаемся сложить две переменные. Поэтому остановим выполнение этой процедуры и примем соответствующие меры для исправления ошибки. Для этого напишем специальную функцию преобразования от числа к строке. Такая функция есть и называется она функцией str. Далее скобка и, как мы видим, в качестве первого параметра здесь нам требуется числовое значение, которым и является как раз наша s. Поэтому после s закроем скобки. И теперь у нас все должно быть правильно. Просмотрим. Щелкнем на кнопку Run. Введем какое-либо число. Хотя бы те же самые 45. ОК. И мы получили в окне Immediate текст "Вы ввели 45". Сейчас щелкнем на кнопку Run. Мы забыли встать на соответствующее место нашей программы, поэтому компьютер запросил подтвердить, какую же процедуру мы хотим запустить. Конечно же, Х. Щелкнем на кнопку Run. Введем число. Например, на этот раз введем 45.87. ОК. Ну и мы ввели 45.87. Что мы ввели, то мы и получили.
14.4. Текстовая функция String На этом уроке мы поговорим о текстовой функции, функции String. Иногда возникает ситуация, когда нам нужно заполнить некоторое поле каким-либо однородным значением. Или же присвоить некоторой строковой переменной значение фиксированной длины. Это необходимо, когда мы хотим, чтобы длина этого поля или этой переменной была равна намного больше величины. Т.е. возникает ситуация, когда нам надо заполнить недостающие места этого поля или этой переменной какими-либо символами. Можно себе представить, что нам нужно, допустим, заполнить анкету, в которой длина некоторого поля представлена значением, например, в 57 символов. А мы хотим туда вставить строчку, состоящую всего лишь из 10 символов. А вот остальные символы нам надо заполнить и не оставить места для следующих изменений. Именно для этих целей можно использовать функцию String. Опять-таки воспользуемся для примера нашей процедурой Subroutine, предварительно очистив себе место. Вот таким образом. Оставим только Debug.Print. Он нам сейчас понадобиться. И напишем функцию String. Далее скобка. И как мы видим, наш компьютер требует от нас введения какого-либо числа, которое будет представлять собой количество символов в этом строковом выражении. Например, 5.
Глава 14. Важнейшие для нас функции Access и VBA
347
Далее запятая и далее нам нужно ввести какой-либо символ, который как раз и будет повторяться 5 раз. Например, напишем букву С. Далее закрыть скобку. Теперь попробуем запустить и выполнить эту процедуру. Для этого щелкнем на кнопку Run. И как мы видим, мы получили как раз пятикратное повторение нашей буквы С. Можем ввести и большее число. Например, написать 50. Щелкнем теперь на кнопку Run. И, конечно же, мы получили гораздо большее количество символов С, а именно, 50 единиц. Функцию String можно использовать и как заготовку для создания своих собственных функций. Например, попробуем это сейчас сделать. Для этого щелкнем на кнопку Enter и введем ключевое слово Function. Далее пусть эта функция называется fill. Скобка и теперь введем аргументы, которые нам нужны будут в этой функции. Первым пусть будет строковое выражение st. Далее числовое значение lng, которое будет представлять собой общую длину выходного строкового выражения. Далее запятая и тот символ, который мы сейчас обозначим - chr, которым будем заполнять остающиеся пустые места. Щелкнем теперь на клавишу Enter. Конечно же, Access нам автоматически вставил закрытие функции End Function. Далее введем знак табуляции и напишем следующим образом. Fill - возвращаемое значение - равняется. Далее наша функция String, которую мы хотим сейчас применить. Далее скобка. Количество символом для повторения нам нужно lng - общее количество символов, из которого нам нужно вычесть длину вводимой строчки st. Это мы должны получить при помощи функции len. Далее скобка. Строчка st. Закрыть скобку. Запятая. И затем символ для повторения. Это у нас будет chr. Далее закрыть скобку. Плюс. И далее введем нашу строчку st. Вот теперь у нас эта функция полностью готова. Попробуем ее применить, например, в наше процедуре Sub Х. Для этого после Debug.Print напишем таким образом: используем функцию fill, скобка. Далее строковое выражение. Это у нас, допустим, какой-либо текст, например, 12345. Затем запятая. Теперь нам нужно ввести общее количество символов в полученной строке. Пусть, например, будет 20 и далее символ для заполнения пустых мест. В качестве такого символа возьмем, например, знак равенства. Далее закрыть скобки и теперь попробуем выполнить эту процедуру. Щелкнем на кнопку Run. И можно увидеть, что у нас получилось. А именно, все наше строковое выражение вывелось в конец строки, которая представляет собой текст из ровно 20 символов. А остающиеся пустыми места были заполнены знаком равенства. Мы можем поступить и наоборот. Например, недостающие символы в нашем строковом представлении ввести после основной строки, а не до. Для этого достаточно чуть-чуть изменить нашу функцию fill. А именно, сперва написать строковое выражение st. Далее плюс и лишь затем все наши дополнительные символы, получающиеся при помощи функции String. Попробуем сейчас выполнить эту процедуру, процедуру Х. Щелкнем на кнопку Run, и мы видим на этот раз, что знаки равенства и основной текст поменялись местами. Попробуем теперь, например, при помощи вот этой нашей функции fill воспроизвести часть какой-либо анкеты, где нужно ввести имя, фамилию и отчества.
348
TeachPro Microsoft Access 2003
Для этого напишем таким образом. В качестве первого текста сначала введем имя. В качестве общего количества символов возьмем, например, 40 единиц. И в качестве дополнительного введем знак подчеркивания, далее скопируем эту строчку. Выделим ее. Правая кнопка мыши и Сору. Далее Enter. Вставим. Для этого щелкнем на правую кнопку мыши и Paste. Опять вставим. Правая кнопка мыши и Paste. Выровняем все эти строчки. И далее напишем следующим образом. Вместо имени здесь будет отчество и далее фамилия. А теперь же, если мы запустим нашу процедуру, щелкнем на кнопку Run, то можно увидеть, как будет выглядеть часть нашей анкеты. Конечно же, в принципе, все достаточно хорошо выглядит. А именно, есть место, в которое можно ввести имя, отчество и фамилию, и причем ширина текста во всех трех случаях, абсолютно одинакова. В принципе, надо отметить, что это, конечно же, характерно еще и для шрифтов, которые имеют одинаковую ширину вне зависимости от символа, который выводится. Это, например, шрифты типа Curier. А вот шрифты другого типа, например, такие, как Times New Roman, Arial и т.д. такого свойства не имеют. В этом случае такого правильного отображения в одном файле у нас уже не будет. Несмотря на то, что строчки будут иметь одинаковое количество символов, тем не менее их ширина будет все равно различной. А если использовать, как мы еще раз повторимся, моноширийные шрифты, то, конечно же, мы получим вот такой красивый шаблон для наших анкет.
14.5. Применение функции Format к числам и датам На этом уроке мы поговорим о текстовой функции Format. Для начала удалим все функции, которые нам сейчас больше не нужны. Так сказать очистимся от мусора. Например, удалим вот эти функции. Выделим, щелкнем на кнопку Delete. Удалим и вот эти строчки вместе с функцией fill, которую мы использовали ранее. Они нам сейчас тоже не понадобятся. И далее напишем стандартную функцию Format. Далее скобка. И теперь, как мы можем видеть, во-первых, от нас требуется ввести какое-то выражение, которое мы хотим в форматированном виде вывести. Напишем для начала какое-либо число, например, 123. Далее точка и 45. Далее запятая и далее от нас требуется вывести строчку форматирования, которая будет представлять собой шаблон для нашего строкового выражения. Для этого напишем кавычки и внутри них напишем, например, три нуля. Закроем скобки и посмотрим, что мы получим в результате вот такого форматного вывода. Щелкнем на кнопку Run. И, как можно видеть, мы получили 123. Т.е. наш компьютер, во-первых, отбросил всю дробную часть от нашего числа и вывел только его целую часть - первые три знака. В принципе, все это можно догадаться и посмотрев на вот это выражение. Мы, как раз, при помощи вот этих трех нулей зарезервировали именно три места для нашего вывода в окно Immediate.
Глава 14. Важнейшие для нас функции Access и VBA
349
А теперь попробуем ввести большее количество нулей. Вот, например, таким образом. Если мы сейчас щелкнем на кнопку Run, то можно увидеть, что компьютер впереди приписал вместо недостающих символов нули. Напишем посередине в этом шаблоне вот такую точку, в результате чего мы зарезервируем три первых места для целого значение нашего числа, а остальные два - для дробного. В этом случае, если нажмем на кнопку Run, то, как раз и получим значение нашего числа в ее естественном виде, 123.45. Правда, если мы сейчас попробуем вставить лишний 0 в конце и щелкнем на кнопке Run, то в конце компьютер приписал опять-таки 0. Если припишем впереди, то и компьютер впереди приписывает 0, т.е. заполняя недостающие места нулями. А вот если мы впереди напишем меньшее количество 0, чем у нас есть в нашем числе, то при нажатии на кнопку Run, тем не менее, числа не пропадают. Т.е. компьютер берет все числа из целой части, несмотря на то, что количество цифр в выводимом значений больше, чем количе6ство нулей, которое мы предусмотрели в формате для целой части. А в случае с дробной, тут происходит несколько по-другому. Уберем 0, зарезервируем только одно место для нашей дробности части и нажмем на кнопку Run. Как мы видим, компьютер отбросил лишнюю цифру, отобразив только одну цифру после запятой. Надо сказать, что в данном конкретном случае, компьютер округлил в меньшую сторону. А сейчас введем еще какую-либо цифру, например, 456 и нажмем на кнопку Run. В этом случае уже округляется в другую сторону, получая в конце пять десятых. Попробуем теперь отобразить большое число. Например, вот такого типа. И в качестве форматного вывода тоже напишем вот таким образом. Впереди введем шесть нулей и в серединке запятую. Щелкнем теперь на кнопку Run, и можно увидеть, как по иному теперь выглядит наше число. Как мы видим, все то, что у нас было целой частью этого числа, компьютер вывел, разделив по три цифры группами вместе. Вот такой вывод на самом деле уже зависит от региональных установок в нашем компьютере. Теперь вместо запятой здесь поставим какой-либо другой знак, например, знак минус и щелкнем на кнопку Run. В этом случае знак минус компьютер не воспринимает, как разделитель для группировки знаков, а просто-напросто принимает, как символ, который нужно вставить в соответствующее место. В принципе, например, мы можем при помощи знака минус достаточно хорошо отформатировать телефонные номера. Например, написав телефонный номер 1234567, вот в таком виде можем его вывести в форматном виде, написав его в более привычном виде, группировав в 3, 2 и последние 2 цифры. Если мы сейчас щелкнем на кнопке Run, то получим запись телефонного номера, который мы обычно привыкли видеть. На этом уроке мы опять рассмотрим функцию Format и на этот раз используем ее для форматирования дат. А теперь же в качестве источника данных выберем функцию Now, которая нам возвращает текущую дату, а в качестве строчки для шаблона напишем следующее выражение. dd-mm-yy. Щелкнем теперь на кнопке Run и можно увидеть, что у нас получилось. В принципе, это у нас 16-06-2005 года. И это выражение легко читается из соответствующей форматной строки. dd - это у нас, конечно же, день, который выводится при помощи двух цифр. mm - это месяц, который опять выводится двумя цифрами. И yy - это год, для которого тоже предусмотрено два знака. В принципе, вместо разделителя минус можно ввести любой разделитель. Например, введем точки. Если сейчас мы щелкнем на кнопку Run, то получим все то же самое, только с разделителями точки. Вместо такого шаблона, можем в принципе воспользоваться и другим выражением. Для этого выделим его, правая кнопка - Сору, скопируем. Теперь вставим эту строчку. Щелкнем на правую кнопку мыши и Paste. Теперь же вместо вот этого выражения dd.mm.yy напишем просто-напросто short date.
350
TeachPro Microsoft Access 2003
Если мы сейчас щелкнем на кнопку Run, то можно увидеть, что, наряду со старым значением нашей даты мы вывели ее еще немножко по-другому, использовав день, месяц и год и на этот раз год, как мы видим, вывелся полностью. Это все зависит от региональных установок нашего компьютера. И short date выводит дату вот в таком кратком виде. В принципе, для того чтобы год вывести вот таким полным форматом - 4 цифрами, мы можем написать и по-другому, написав здесь в нашем шаблоне 4 раза букву y. Если мы сейчас щелкнем на кнопку Run, то, как мы видим, мы в случае с первым нашим форматным видом и в случае short date мы получаем одно и то же - одинаковое выражение. Надо отметить, что, кроме short date есть еще и форматирование long date. Так сейчас и напишем - long и посмотрим, как сейчас будет выглядеть наша дата. Щелкнем на кнопку Run и можно увидеть, что получаем такое строковое выражение - 16 июня 2005 года. То, как выводится long date тоже в принципе зависит от региональных установок. А теперь же закомментируем вот эту строчку и опять сконцентрируемся на нашей первой строчке вывода даты. Попробуем увеличить количество букв "m" в нашем формате, котоые выводят месяц. Напишем 4 буквы "m". Если мы сейчас щелкнем на кнопку Run, то можно увидеть, как в этом случае выглядит наш формат. Мы в качестве месяца вывели его текстовое значение. Правда, с маленькой буквы. И в качестве разделителя у нас здесь точки, вместо пробелов. А теперь попробуем увеличить еще и количество букв d в числе даты. Напишем таким образом. Щелкнем теперь на кнопку Run, и можно увидеть, что 16 июня представляет собой четверг, т.е. уже эта дата выглядит, как четверг.июнь.2005. Попробуем теперь еще доработать вывод нашей даты. И попробуем наряду со значением дня недели вывести и саму дату. Для этого напишем просто-напросто еще раз вывод при помощи формата d. Напишем две буквы d, чтобы вывелось именно число. Далее, вместо точки пусть будет пробел и то же самое в качестве разделителя между месяцем и годом. И в конце можем ввести букву "г" и далее точку, так, как обычно происходит при выводе даты. Теперь щелкнем на кнопке Run. В результате мы получили нашу дату - четверг 16 июня 2005 года. В принципе, вполне симпатический результат для форматированного вывода.
14.6. Форматирование значений времени На этом уроке мы поговорим о форматировании значения времени. На предыдущем уроке мы занимались форматированием даты. В принципе, поскольку функция Now, которую мы использовали, возвращает не только дату, но и время, вполне логично предполагать, что мы можем форматировать время при помощи этой функции. И функция Format как раз и даем нам такую возможность. Давайте, для начала удалим вот эти символы, которые мы вводили для форматирования даты. Выделим, щелкнем на кнопку Delete и напишем, например, вот такие символы: hh и далее двоеточие и mm. Выполним теперь эту процедуру. Щелкнем на кнопке Run, и можно увидеть, в принципе, что у нас получилось. А именно, 12 часов 21 минута. Это можно увидеть в окне Immediate. Разумеется, как и в случае с датами, для времени тоже существуют свои константы. Например, раскомментируем вот эту строчку и напишем вместо long date - long time. Выполним теперь эту процедуру. Щелкнем на кнопку Run, и можно увидеть, что у нас в результате получается. Это значение времени 12 часов 22 минуты 59 секунд, которые соответствуют, как и понятно, полному формату времени. Кроме этого, мы можем написать и short time, что будет соответствовать укороченному формату времени.
Глава 14. Важнейшие для нас функции Access и VBA
351
Щелкнем на кнопку Run и можно увидеть, что укороченный формат времени у нас совпадает с отображением часов и минут. Закомментируем опять эту строчку и, в принципе, надо отметить, что длинный формат времени мы можем получить и вручную. Для этого можем написать в конце отображение секунд, двоеточие и далее две буквы ss. Если мы сейчас щелкнем на кнопку Run, то как раз можно увидеть 12 часов 24 минуты и 43 секунды. Кроме того, как и в случае с датами, разделителем у нас могут служить различные символы, а не только двоеточие. Например, можем вставить пробелы. Если мы сейчас щелкнем на кнопку Run, получим часы, минуты и секунды, разделенные пробелами, т.е. можно использовать любые символы. Надо отметить, что если мы вот такого рода форматы применяем в наших формах и где-нибудь получится так, что у нас какойлибо из форматов соответствует или long time, или short time, то компьютер автоматически заменит их на соответствующий предопределенный формат. Попробуем, например, применить соответствующий какой-либо формат в форме. Для этого перейдем в Access, создадим какую-нибудь форму, перейдем на вкладку формы. Щелкнем на кнопку Конструктор. Вот появилась новая пустая форма, в которую введем поле для ввода. Например, введем его достаточно длинным, чтобы у нас помещалось все, что мы хотим на нем разместить. Метку удалим. Для этого выделим, щелкнем на кнопку Delete. И внутри нашего поля для ввода напишем такое выражение - равняется и далее Format, далее скобка. Теперь Now - текущее время, далее скобки. Точка с запятой и далее внутри кавычек напишем, например, hh - часы, двоеточие и mm - минуты. Далее закрытие скобок. Щелкнем где-либо и, как мы видим, наш формат hh и mm заменился на краткий формат времени. Конечно же, поскольку у нас Microsoft Access стоит в русской версии, то мы получили русский вариант для краткого форматирования времени. Если мы запустим эту форму, щелкнем на кнопку Вид, то можем видеть отображение текущего времени. Но, конечно же, обновление этого времени сейчас происходить не будет, несмотря то, что мы можем подождать, допустим, одну минуту, две - здесь 12 часов 32 минуты, 33 минуты, и т.д. отображаться не будут. Это будет происходить до тех пор, пока мы тем или иным способом вручную не обновим нашу форму. Например, ее перезагрузим или еще что-либо. Хотя, в принципе, мы могли бы, конечно, на нашей форме поставить какое-либо авто обновление, например, поставить таймер, который обновлял бы это поле через определенные промежутки времени. Сейчас мы этим заниматься не будем. Закроем эту форму. Сохранять изменение не будем. Щелкнем на кнопку Нет и вернемся к Visual Basic, щелкнув на комбинации клавиш Alt+F11.
14.7. Функции даты и времени Рассмотрим теперь, как, используя функции даты и времени, можно измерить интервал между двумя датами. Ну, например, в часах. Для начала попробуем узнать, например, сколько времени прошло с начала года до теперешнего времени, до Now.Для этого из даты Now вычтем дату 1 января. Для этого напишем здесь минус, далее применим функцию DateValue, чтобы получить значение даты. Далее внутри скобок и
352
TeachPro Microsoft Access 2003
внутри кавычек напишем дату - 1 января 2005 года. И, конечно, в качестве форматного вывода, нам сейчас только часы и минуты не хватят. Поэтому напишем следующим образом. В нашем случае, года нас не интересуют, поэтому выведем значение месяцев mm, далее точка, значение дней dd, далее часы, минуты и выведем еще и секунды. А теперь попробуем выполнить эту процедуру. Щелкнем на кнопку Run, и можно увидеть, что у нас получилось. А именно с начала года у нас прошло 6 месяцев, 16 дней, 13 часов 19 минут и 29 секунд. Но, как же теперь нам поступить, если мы хотим измерить все это время в часах. Т.е. сколько часов, минут и секунд прошло с начала года. В этом случае нам при помощи одной функции Format не обойтись. И для этого нам придется написать свою функцию. Напишем ключевое слово function. Далее пусть эта функция, например, называется AllHours - все часы. Далее скобка. В качестве передаваемого параметра пусть будет x, который будет представлять собой дату, вернее интервал между датами. Далее Enter. Конечно же, нам компьютер автоматически вставил End Function, далее вставим табуляцию и напишем такое выражение. Наша функция AllHours, равняется. Далее строковое выражение str, скобка, внутри которой вычислим сперва, сколько часов прошло в этом интервале, в интервале x. Для этого напишем следующим образом: Int(x), т.е. целое число от нашего интервала до Х. Это и будет количество дней, которое прошло между этими датами. Его, конечно, нам нужно умножить на 24 - количество часов в сутках, далее плюс и далее нам надо прибавить еще количество часов текущих, в этом интервале. Это можно получить при помощи функции Hour - час. Внутри в скобках, нам нужно ввести какое-то время. Конечно же, это у нас будет Х. Закрыть скобку. Еще одну скобку закрыть. И теперь у нас уже готово выражение, которое вычислит часы, которые есть в этом интервале. Теперь вставим еще минуты и секунды. Для этого напишем плюс. Далее двоеточие, конечно же, внутри кавычек. Далее плюс, и далее уже, как обычно, используем функцию Format. Скобка. Далее интервал (x). Далее запятая. И в качестве форматного вывода используем mm значение минут. Далее двоеточие и значение секунд. Закроем кавычки и закроем скобку. Теперь у нас уже полностью готова вот эта функция AllHours. А теперь же применим его к нашему интервалу date между текущим временем и 1 января. Для этого напишем таким образом. Раскомментируем эту строчку и далее все это выделим и удалим. И далее напишем так. AllHours. Далее скобка, внутри которой напишем опять Now и минус DateValue. И, конечно же, опять внутри кавычек - 1 января 2005 года. Закроем кавычки. Закроем скобку. Еще одну скобку и теперь у нас уже все готово. Запустим теперь функцию. Щелкнем на кнопку Run, и можно увидеть, что у нас получилось. Как видно, с начала года у нас прошло 40045 часов, 6 минут 26 секунд или 6 месяцев 16 дней 13 часов 25 минут и 26 секунд. В принципе, вроде бы все хорошо, за исключением одной маленькой детали, а именно, можно обратить внимание на одну нестыковку в количестве минут вот в этих двух строчках. Дело в том, что вот эти две аббревиатуры mm на самом деле в данном конкретном случае выводят не минуты, как мы ожидали, а месяцы.
Глава 14. Важнейшие для нас функции Access и VBA
353
Дело в том, что таким образом как раз записывается и то, и другое, и компьютер изучает их только таким образом. А именно, если перед ним стоит аббревиатура hh, только в этом случае, компьютер считает их за минуты. А во всех остальных случаях компьютер считает, что под аббревиатурой mm мы считаем, что нужно выводить месяцы. Поэтому, вот таким образом, на самом деле мы не сможем достичь той цели, которую мы хотим - вывести часы, минуты и секунды. Поэтому удалим вот этот формат и напишем несколько по-другому. А именно, используем наряду с функцией Hour еще и функцию Minute. Эта функция будет выводить минуты, которые у нас есть в значении x. Далее плюс. Далее опять двоеточие в кавычках. Плюс и далее функция Second, которая будет выводить нам секунды, которые у нас находятся в x. Далее Х. Теперь же, для того чтобы нам получить еще и правильное применение этой функции и не получить ошибку, нам нужно вот эту минуту преобразовать к строковому выражению, поскольку в таком виде это целочисленное значение. Поэтому напишем str. Закрытие скобки. И то же самое к функции Second. str, далее скобки и закрытие скобки. Теперь же запустим нашу процедуру. Щелкнем на кнопку Run, и на этот раз можем увидеть то, что и хотели. А именно, 4045 часов 57 минут и 23 секунды. Именно столько времени прошло с 1 января, с начала года. И теперь вот эти последние две строчки в точности соответствуют друг другу.
14.8. Функции преобразования типов На этом уроке поговорим о функциях преобразования типов. Вообще-то, считается, что Visual Basic - довольно-таки типизированный язык программирования, поскольку, как вы уже знаете, у нас строго определены различные типы. Хотя в Visual Basic есть, конечно же, и тип Variant. Но, в принципе, работать с таким типом нежелательно. Поскольку типов очень много, то может возникнуть ситуация, когда, например, при передаче аргументов какой-нибудь функции, нужно будет использовать какой-либо один тип переменной, а мы будем пытаться передавать другой. В этом случае компьютер выдаст нам ошибку. Например, посмотрим это на практике. Для этого уберем вот эту функцию. Она нам сейчас не пригодиться, и очистим нашу процедуру Х. Теперь же введем новую функцию. Напишем, конечно же, ключевое слово Function сперва. Далее имя нашей функции. Пусть будет, например, tw. Далее скобки, внутри которых укажем передаваемый параметр. Пусть это будет Х и он пусть у нас будет типа Single. Т.е. число с плавающей запятой с одинарной точностью. Вот он появился перед нами, нужный нам тип. Далее закроем скобки. Ну и возвращаемое значение пусть тоже будет типа Single. Напишем As и опять Single. Щелкнем дважды на нужной нам строчке. Далее Enter и после этого шаблон этой функции у нас уже полностью готов. Ну и в теле нашей функции напишем просто-напросто самое простое выражение, которое можно придумать, например, tw, равняется, наш передаваемый параметр Х, умноженный например, на число 3. Это все, что будет делать эта функция. Теперь же внутри нашей процедуры x попробуем определить другую переменную. Определим ее, конечно же, при помощи ключевого слова Dim.
354
TeachPro Microsoft Access 2003
Пусть переменная у нас будет y, далее As, и ее тип пусть будет Double - число с двойной точностью. Далее щелкнем на клавишу Enter и попробуем применить нашу функцию tw. Для этого так и напишем. Во-первых, y равняется tw и далее скобка. И в качестве передаваемой функции, несмотря на то, что нас предупреждают, что x должен быть типа Single, передадим переменную y, которая, как мы видим, является типом Double. Так и напишем - y. Закроем скобку. А теперь попробуем выполнить эту процедуру. Щелкнем на кнопку Run, и, как мы видим, компьютер выдал нам ошибку компиляции. А именно, смешение типов. Щелкнем на кнопку ОК. Выйдем из режима выполнения нашей процедуры, щелкнув на кнопку Stop. Ну и теперь нам нужно что-то сделать с нашей переменной y, для того чтобы компьютер, тем не менее, смог выполнить вот эту функцию tw. Именно для этих целей в Visual Basic существуют специальные функции преобразования типов. И в частности преобразование к типу Single. Для этого напишем функцию Csng. Далее скобка. И, как мы видим, нам нужно внутри скобки написать какое-либо выражение, а вот получим мы значение Single. Выражение у нас уже есть - У, далее закроем скобки и теперь опять попробуем выполнить эту процедуру. Конечно же, выполнив еще какую-либо распечатку полученного значения. Для этого напишем Debug.Print. Щелкнем дважды на этой функции. Далее У. А теперь же щелкнем на кнопку Run. Как мы видим, мы выполнили нашу функцию. Получили 0. В принципе, оно и понятно, поскольку в начале мы y ничего не присвоили, то ему было присвоено автоматически нулевое значение. В начале поэтому присвоим ему какое-либо значение. Например, y равняется 2. А теперь же попробуем выполнить эту процедуру. И, конечно же, получим правильное значение. 2х3=6. Вот, таким образом, воспользовавшись преобразованием типов, мы смогли из переменной типа Double получить переменную типа Single с одинарной точностью. Конечно же, в принципе, если бы у нас в y было какое-либо дробное число, в котором было много цифр после запятой, то мы бы потеряли какие-то из этих цифр при преобразовании от двойной точности к одинарной. А в случае с числом 2, конечно же, никакой потери не было, поскольку мы использовали всего лишь одну цифру. Функции преобразований типов на самом деле достаточно много. Для того чтобы их посмотреть, встанем на вот этой функции и щелкнем на кнопку F1. У нас появляется окно помощи, в котором можно увидеть, что функциями преобразования типов являются CBool, CByte, CCur, CDate, CDbl и т.д. Т.е. все основные типы с приставкой С впереди, которые в результате своей работы преобразует любое выражение к соответствующему типу.
Глава 15. Пример «Платежное поручение»
355
Глава 15. Пример "Платежное поручение" 15.1. Платежка 1 Рассмотрим теперь, как при помощи Microsoft Access создать нам базу данных платежек, которая поможет создавать платежки, архивировать их, находить их из списка и изменять. Для начала создадим новую базу данных. Щелкнем на кнопке Создать. Появляется вот такое стандартное окно области задач, в котором мы можем выбрать один из пунктов создания новой базы данных. Щелкнем на пункте Новая база. Появляется стандартное окно, в котором нам нужно выбрать имя для нашей новой базы данных. Пусть эта база данных называется Платежки. И щелкнем на кнопку Создать. И вот перед нами появилась новая база данных. Пока, правда, абсолютно пустая. В ней нет ни одной таблицы, формы, запроса и т.д. Для начала создадим несколько таблиц, чтобы у нас был основной материал, над которым мы в дальнейшем могли бы работать. Конечно же, нам нужно будет создавать таблицу с фирмами, в которой у нас будет храниться информация о разного рода реквизитов фирм. Также нам понадобится таблица с именами банков, в которых у наших есть корсчета. И, конечно же, нам понадобится еще одна таблица, в которой мы будем хранить архив наших платежек. Для начала создадим одну из вспомогательных таблиц, таблицу банков, которую мы разобьем на две таблицы. В первой из них сохраним название всех главных отделений банков. А во второй из них будем хранить название филиалов. Создадим сперва, конечно же, новую таблицу. Щелкнем на пункте Создать таблицу в режиме конструктора. Вот, появляется соответствующее окно. Введем первое из полей - это, конечно же, Id нашего банка - Id_bank. Тип у этого поля будет Счетчик. Конечно же, он будет у нас ключевым. Щелкнем на правую кнопку мыши и выберем соответствующую возможность. Перейдем ко второму полю, которое у нас, конечно же, будет Название - Name. Пусть оно будет текстовым, как и есть 50 букв. В принципе, вполне достаточно. И третье поле это у нас будет так называемый BIK - его номер. Номер будет представлять собой текстовое поле, состоящее из 9 символов. Для него введем маску для ввода, которая будет представлять собой просто-напросто 9 нулей. Это означает, что этот BIK представляет собой 9 символов, каждый из которых представляет собой цифру. И вот после этого у нас уже таблица уже полностью готова. Сохраним ее. Щелкнем на кнопку Сохранить. Назовем ее tBanks, Т - это, конечно же, таблица. Щелкнем на кнопку ОК. Закроем. Создадим теперь вторую таблицу, таблицу филиалов этих банков. Oпять щелкнем на создание таблиц в режиме конструктора. Имя первого поля - это у нас опять Id, но на этот раз филиала - Id_fil. Тип, конечно же, опять будет Счетчик, как у нас принято для первого поля. И, конечно же, он у нас должен быть ключевым. Щелкнем на правую кнопку мыши и выберем соответствующую возможность - Ключевое поле. Следующее поле - это у нас будет поле для подстановок, в которое мы будем подставлять значение головного банка. Поэтому это будет, конечно же, у нас Id_bank. Щелкнем на типе данных. Щелкнем на ниспадающем списке и выберем Мастер подстановок.
356
TeachPro Microsoft Access 2003
Появляется Мастер создания подставок, в котором, конечно же, выбрана возможность для первой из страниц, а именно использование значения из таблицы или запроса. Нас как раз это устраивает. Щелкнем на кнопку Далее. Конечно же, выбрать мы можем пока из единственной таблицы tBanks. Больше, в принципе, у нас в нашей базе данных ничего нет. Но больше ничего нам и не нужно. Щелкнем на кнопку Далее. Столбец подстановки выберем для отображения имени и BIK нашего банка. Щелкнем на кнопку Далее. Сортировка нас сейчас не интересует. Щелкнем на кнопку Далее. Конечно же, возможность скрыть ключевой столбец мы так и оставим отмеченной. Щелкнем опять на кнопку Далее и на кнопку Готово. Компьютер нас спрашивает о необходимости сохранить таблицу. Щелкнем на кнопку Да, и в качестве имени для нашей таблицы наберем tBanks и далее fil - филиалы. Щелкнем на кнопку ОК. Следующее поле, которое нам необходимо - это поле, например, пусть будет City - город. Пусть он будет текстовый, как и есть. Далее следующее поле - это название филиала. Пусть будет Fil. Конечно же, оно тоже будет текстовый. И последнее поле - это корсчет филиала банка. Он у нас будет KS и будет представлять собой текстовое поле размером в 20 символов. Для него тоже введем маску для ввода, которая будет представлять собой просто-напросто 20 нулей, поскольку там должно быть 20 символов, каждый из которых будет представлять собой цифру. Вот таким образом. Щелкнем теперь на кнопку сохранения и закроем эту таблицу. Посмотрим для начала, что представляет собой первая из созданных нами таблиц - таблица банков. Щелкнем для этого на ней дважды. Как мы видим, пока она у нас абсолютно пустая. Заполним хотя бы несколькими простыми значениями. Вот мы заполнили эту таблицу несколькими значениями, которые мы можем использовать в нашем примере. Ну, закроем теперь эту таблицу. Конечно же, сохраним все изменения. Щелкнем на кнопке Да. Откроем теперь филиалы банков, для этого щелкнем на нем дважды. Эта таблица тоже абсолютно пустая. Ну и, конечно же, ее тоже надо заполнить какими-либо значениями. Вот, как может выглядеть таблица филиалов банка после его заполнения вот такими данными. В принципе, конечно же, все эти данные представляют собой достаточно условные наименования. И, как говорится, любые совпадения - они только являются случайными. Закроем теперь эту таблицу. Щелкнем на вот этом крестике. Конечно же, сохраним. Щелкнем на кнопке Да. И создадим теперь еще одну таблицу, таблицу фирм. Для того чтобы создать таблицу, щелкнем на пункте Создание таблиц в режиме конструктора. Вот появляется соответствующее окно. В нем, конечно же, первым полем опять у нас будет Id. На этот раз Id нашей фирмы. Так и напишем Id_fir. Оно, конечно же, будет представлять собой поле типа счетчика. Конечно же, это поле будет у нас ключевым. Щелкнем на правую кнопку и выберем соответствующую возможность. Ну и далее будем заполнять типы полей этой таблицы. Следующее поле пусть будет Mine, которое будет означать, является ли эта фирма нашей или нет. Поэтому оно, конечно же, у нас будет иметь тип логический, так сказать, Да или Нет - наша фирма или не наша фирма. Далее, конечно же, имя нашей фирмы. Пусть это будет Full - полное имя. Оно будет представлять собой текстовое значение. Далее Nick - краткое имя нашей фирмы. Оно тоже будет представлять собой текстовое поле. Но для него можно отвести гораздо меньше букв. Например, 20. Следующее поле пусть будет INN - идентификационный номер, который представляет собой текстовое поле, которое должно состоять из 10 символов с соответствующей маской для ввода. Конечно же, с нулями, что означает, что все 10 символов у нас должны быть цифрами. Далее будет Bank_fil - филиал банка, в котором у нашей фирмы открыт счет. Поэтому так и напишем, Bank_fil. Далее щелкнем на мастере подстановок. Вот появляется соответствующее окно мастера. Щелкнем на кнопке Далее.
Глава 15. Пример «Платежное поручение»
357
Конечно же, нам нужна таблица или запрос. Нам нужна вот эта таблица - tBanks_fil. Далее. Далее выберем поля, которые нам нужны. Например, Id банка. Дальше выберем имя филиала. Ну и город, вместе с корсчетом. Щелкнем на кнопку Далее. Сортировать не будем. Щелкнем на кнопку Далее. Ключевой столбец, конечно же, нам не нужен. Опять далее. И щелкнем теперь на кнопку Готово. Нам подсказывают, что надо сохранить таблицу. Щелкнем на кнопку Да и введем имя для этой таблицы. Пусть имя представляет собой tFirms - таблицы фирм. Щелкнем на кнопку ОК и продолжим заполнение полей нашей таблицы. Следующим будет RS расчетный счет, который будет представлять собой текстовое значение из 20 единиц. Конечно же, нам нужна опять маска для ввода, состоящая из 20 нулей. Далее следующее поле, поле Index, представляет собой почтовый индекс. Он, как обычно, состоит из 6 знаков. В качестве маски для ввода - 6 нулей. Далее City - город, где у нас расположена наша фирма. Он, конечно же, будет иметь текстовое значение. И неплохо иметь еще такое поле, как адрес, в котором будем сохранять адрес нашей фирмы. Ну вот, после всех этих изменений, можно сохранить нашу таблицу, щелкнув на кнопку Сохранить и закрыть ее конструктор. Посмотрим, как выглядит таблица наших фирм. Щелкнем для этого на ней дважды. Вот можно увидеть вид нашей таблицы. Как мы видим, она пока абсолютно пустая. После того, как мы заполнили эту таблицу какимито значениями, можно представить себе, как может выглядеть данная таблица. В принципе здесь у нас не так уж много фирм, но общее представление об этой таблице у нас уже вполне может и быть. Закроем теперь ее. Конечно же, щелкнем на кнопку сохранения и создадим еще одну, последнюю таблицу, таблицу платежек, в которой будем сохранять весь наш архив. Для этого опять щелкнем на кнопку создания таблицы в режиме конструктора. Первое поле, конечно же, у нас опять будет поле Id платежки - Id_plat. Оно у нас должно быть типа Счетчик. И, конечно же, лучше его выбрать ключевым. Для этого щелкнем на правую кнопку мыши и выберем соответствующую возможность. Далее теперь будем заполнять. Следующее поле - это у нас Id_me, так сказать, от какой фирмы будет наша платежка. Откроем Мастер подстановок. Конечно же, используем значение из таблицы или запроса. Щелкнем на кнопку Далее. Далее возьмем таблицу фирм. Щелкнем далее. Для отображения возьмем только Nick - краткое имя. Щелкнем на кнопку Далее. Опять далее. Сортировать, конечно же, не будем. Щелкнем на кнопку Готово. Сохраним таблицу. Да. Имя этой таблицы будет tPlat - таблица платежек. ОК. Следующее поле, поле Num - номер платежки. Пусть он представляет собой обычное числовое значение. Далее следующее поле - это у нас будет фирма, куда мы перечисляем. Поэтому введем Id фирмы. Опять выберем Мастер подстановки. Щелкнем на кнопку Далее. Выберем, конечно же, опять фирмы. Далее. Выберем Nick - краткое имя для отображения. Опять далее. Сортировать не будем. И щелкнем на кнопку Готово. Сохраним таблицу. Щелкнем на кнопку Да. И следующее поле, поле Date - дата платежки. Конечно же, это поле у нас будет иметь тип даты. Тут все понятно. Далее будет у нас поле Sum, которое будет представлять собой денежное значение. Затем Vid вид платежки, текстовое значение. Далее назначение платежки. Очередность. Она будет представлять собой опять-таки подстановку. Поэтому выберем Мастер подстановок. Выберем фиксированный набор значений. Щелкнем на кнопку Далее. Число столбцов, конечно же, будет 1. И введем, например, такие значения, 1, 2, 3, 4, 5 и 6.
358
TeachPro Microsoft Access 2003
Щелкнем на кнопку Готово. Следующее поле - это у нас будет поле Срок платежа, которое тоже будет представлять собой поле типа Даты. Ну и еще одно поле, поле Вид операции. Для вида операции тоже выберем Мастер подстановок и далее выберем фиксированный набор значений. Столбцов, конечно же, будет 1, и вид операции пусть будет 1,2, и 3, три типа платежа. И щелкнем на кнопку Готово. Далее подкорректируем вот это поле Vid. Для него тоже выберем Мастер подстановок из фиксированного набора значений. Один столбец. Первым из значений будет у нас почтовый перевод. Далее телеграфом и электронно. Вот такие три возможности. Щелкнем на кнопке Готово и сохраним эту таблицу. В принципе, она у нас уже более или менее готова. Закроем. И вот все 4 минимальные необходимые нам таблицы уже полностью готовы для начала нашей последующей работы.
15.2. Платежка 2 Рассмотрим более подробно таблицы банков, которые мы только что создали. Как мы видим, у нас в банках уровневая система. А именно, у каждого банка есть свой филиал. И если мы раскроем таблицу филиалов банков, то здесь, наряду с теми полями, которые непосредственно принадлежат вот этой таблице, у нас есть и поле подстановки, в котором отображается часть информации из второй таблицы, таблицы банков. В принципе, конечно же, для того чтобы рассматривать эту таблицу, такая система вполне пригодна, но нам для наших дальнейших нужд понадобится объединить вот эти две таблицы. Конечно же, объединить их проще всего при помощи запросов. Поэтому перейдем во вкладку Запросы, далее щелкнем на пункте создания запросов в режиме конструктора. Вот появляется такое стандартное окошко, в котором мы можем добавлять нужные нам таблицы. Конечно, в нашем конкретном случае нам нужны две таблицы, таблица банков и таблица филиалов банков. Поэтому щелкнем на кнопку Добавить и на банках, и на филиалах. Закроем вот это окошко. Как мы видим, компьютер автоматически установил нам связь между этими двумя таблицами. Теперь выделим вот эту связь. Щелкнем на правую кнопку мыши и выберем пункт Параметры объединения. Конечно же, нас устраивает вот этот третий вариант. А именно объединение всех записей из нашей записи филиалов банка. Ну и все те записи из таблицы банков, которые им соответствует. Поэтому после этого выбора щелкнем на кнопку ОК и вернемся к нашему запросу. Теперь же нам остается только выбрать те поля, которые нам необходимы в нашем запросе. Выберем, во-первых, Id филиала, поле, далее название нашего филиала, город, корсчет. А теперь же перейдем к полям из нашей таблицы банков. Здесь, конечно же, неплохо было бы забрать имя для нашего банка, головного банка. Ну и, конечно же, его номер BIK. Посмотрим теперь, что у нас получается. Для этого щелкнем на кнопку Вид и можно увидеть, какие поля, в каком порядке и как именно представлены у нас теперь в этом запросе. Здесь у нас, конечно же, есть все поля, которые нам необходимы. Поэтому закроем эту таблицу. Конечно же, сохраним. Да. В качестве имени запроса выберем qBanks. ОК. И вот этот запрос у нас появился в списке запросов. Перейдем теперь в нашу таблицу и рассмотрим фирмы, которые присутствуют в базе данных.
Глава 15. Пример «Платежное поручение»
359
Щелкнем для этого на нем дважды, и, как мы видим, у нас фирмы подразделяются на две части. А именно, наши фирмы, которые нам принадлежат и от имени которых мы проводим платежки, и все остальные фирмы, которые не являются нашими, в которые будут идти платежки от нас. Ну и, конечно же, неплохо было бы разделить эти два понятия. А именно, все те фирмы, которые являются нашими, выделить в отдельную таблицу. Конечно же, это проще всего сделать при помощи запроса, выделяя те строчки, которые нам необходимы. Поэтому закроем эту таблицу. Перейдем опять на вкладку Запросы. Щелкнем на кнопку создания запросов в режиме конструктора. Появляется опять вот это окно Запрос на выборку, и одновременно окно добавления таблиц. Здесь нам, конечно же, понадобится, во-первых, таблица фирм. Выберем. Щелкнем на кнопку Добавить. Перейдем еще на запросы и выберем запрос, который формирует нам банки. Щелкнем на кнопку Добавить, и закроем это окошко. Далее нам необходимо связать вот эти две таблицы. Конечно же, мы должны связать по номеру филиала банка и связать его с Id филиала. Для этого перетащим вот это поле направо. И, как мы видим, у нас получилась соответствующая связь. Теперь выделим его. Правая кнопка мыши, параметры объединения и выберем, конечно же, объединение всех записей из таблицы фирм с соответствующими записями из нашего запроса банков. Щелкнем теперь на кнопку ОК. И, как мы видим, соответствующая связь у нас появилась в нашем конструкторе запросов. Выберем теперь необходимые нам поля. Из нашей таблицы фирм выберем, конечно же, Id. Выберем поле Mine, по которому и будем сортировать, нужна нам эта запись или нет. Далее выберем полное и краткое имя нашей фирмы. Затем, конечно же, INN - идентификационный номер нашей фирмы, расчетный счет. И остальные три параметра - индекс, город и адрес. Далее выберем те записи из таблицы банков, которые нам тоже необходимы. Это, конечно же, имя нашего филиала, город, где находится наш банк, корсчет, имя центрального офиса банка и его BIK. Теперь же вернемся к началу наших полей. И займемся вот этим полем Mine. В принципе, выводить его на наше окно совсем необязательно. Он здесь у нас совсем для других целей. Нас интересует условие отбора. И в качестве условия отбора у нас будет значение Истина. Посмотрим теперь, как будет выглядеть этот запрос. Щелкнем на кнопку Вид. Ну и в принципе, как можно было ожидать, мы получили всего две фирмы, Моя первая и Моя вторая фирма. Они, конечно же, являются нашими, поэтому и заполнили собой наш запрос. Перейдем обратно к нашему запросу и сохраним его. Для этого щелкнем на кнопку Сохранить. Выберем имя для нашего запроса. Пусть это у нас будет qMine - все наши фирмы. Щелкнем на ОК и закроем этот запрос. Откроем теперь пункт меню Сервис и здесь выберем команду Схема данных. Здесь, как мы можем видеть, у нас видны все 4 наши таблицы - таблица банков, филиалов, фирм и платежек. Обратим внимание на связи, которые у нас есть между ними и слегка их модернизируем. Выделим первую из этих связей - между банками, филиалами. Щелкнем на правую кнопку мыши, выберем команду Изменить связь и поставим флажок на пункте Обеспечение целостности данных. Конечно же, поля с которыми свяжутся эти таблицы, нас вполне устраивают. Щелкнем теперь на кнопку ОК. И, как мы видим, у нас эта связь является связью один ко многим. Ту же самую процедуру сделаем со связью между филиалами, банками и фирмами. Щелкнем на правую кнопку мыши, Изменить и обеспечить целостность данных. ОК. Ну и последняя из нужных нам связей - между фирмами и платежками. Правая кнопка мыши, Изменить связь и обеспечить целостность данных. Закроем теперь схему данных. Мы здесь сделали все, что в данный момент хотели, и вернемся к нашей базе данных. Сформируем теперь еще один запрос, который из нашей таблицы платежек выбирает все те Да, которые в нем присутствует. Т.е. группирует все платежки по соответствующим годам. Перейдем на запросы. Щелкнем на кнопку создания запросов в режиме конструктора. Выберем, конечно же, таблицу платежек. Щелкнем на кнопку Добавить. Закроем это окошко. Поле, которое здесь нам необходимо - это единственное поле даты операции. Вот это поле. Перетащим его. Теперь к этому полю применим функцию, для того чтобы из него извлечь год. Для этого щелкнем на правую кнопку мыши и выберем команду Построить. Выберем соответствующую функцию. Для этого раскроем вот эту возможность Функции.
360
TeachPro Microsoft Access 2003
Выберем встроенные функции и здесь найдем такую функцию, как Year. Щелкнем на ней дважды. Вот она появилась перед нами. И, как мы видим, эта функция имеет следующий синтаксис. В скобках после Year должна указываться соответствующая дата. Поэтому вот это все лишнее уберем. Щелкнем на кнопку Delete. И недостающую скобку, конечно же, напишем. Щелкнем на кнопку ОК. Далее выберем имя для нашего поля. Как мы видим, автоматически здесь появилось выражение 1. Оно нас, конечно же, не устраивает. И выберем имя Year - год. Щелкнем теперь вот здесь на правую кнопку мыши. Выберем пункт Групповые операции. Появляется новая возможность, возможность группировки, и после этого у нас этот запрос тоже уже совершенно готов. Сохраним его. Щелкнем на кнопку сохранения. Введем для этого запроса имя. Пусть этот запрос называется qYears. Щелкнем на кнопку ОК и закроем соответствующее окно конструктора.
15.3. Платежка 3 Зададим теперь в нашей базе данных, в базе данных Платежки, форму, которая и будет главным, так сказать, местом, в котором будут происходить все действия пользователя. Переключимся для этого на вкладку формы и щелкнем на Создать форму в режиме конструктора. Щелкнем на соответствующую кнопку. И вот появилась перед нами пока абсолютно пустая форма. Расширим ее. Конечно же, место нам нужно чуть-чуть побольше. А теперь введем в нашу форму такой элемент, как Вкладки, при помощи которого мы можем на одном поле отображать несколько наборов элементов. Для этого выберем соответствующий элемент - инструмент Вкладка. Нарисуем его, допустим, таким образом. Сразу же, как мы видим, появилась вкладка с двумя возможностями вкладка 1 и вкладка 2. Допустим, пусть первая вкладка у нас будет внешним видом нашей платежки, поэтому щелкнем на правую кнопку мыши. Далее свойства. И выберем другое имя. Вместо Вкладка 1, напишем Платежка. Закроем теперь эти свойства. Переключимся на вторую вкладку. Щелкнем здесь на правую кнопку мыши, Свойства, и вместо имени Вкладка 2 напишем Список. Здесь у нас будет отображаться список наших платежек со всеми ее данными. Закроем. Вот теперь у нас уже сформированы две вкладки. Переключимся на Платежки и разместим на них несколько элементов управления. Для этих элементов управления, нам, конечно же, понадобится источник данных, какая-либо таблица или запрос. Поэтому выберем свойство нашей формы, и далее нам понадобится вкладка Все и Источник записей. Здесь выберем таблицу tPlat, которую мы уже сформировали ранее. Вот поля этой таблицы у нас перед глазами. Закроем теперь свойства нашей формы и займемся вот этой таблицей. Перво-наперво, перетащим идентификационный номер нашей платежки Id_plat, разместим его где-либо. Вот эта метка нам не нужна. Удалим ее. Выделим и щелкнем на кнопку Delete. Чуть-чуть уменьшим это поле. В принципе, оно отображаться на нашей платежке не будет. Оно будет играть вспомогательную роль, при помощи которого мы можем ориентироваться по номеру нашей платежки, по его идентификатору.
Глава 15. Пример «Платежное поручение»
361
Для того чтобы он не был виден на нашей форме, щелкнем на правую кнопку мыши и выберем его свойства. Переключимся на макет и в свойстве Вывод на экран вместо Да перещелкнем его на Нет. В этом случае он отображаться не будет. Закроем свойства этого поля. Далее отобразим номер платежки - поле Num. Чуть-чуть изменим местоположение полей и соответствующей метки. Допустим, вот таким образом. Вместо Num напишем по-русски Номер. А теперь чуть-чуть уменьшим место, которое отводится под номер. В принципе, такое большое нам не нужно. Далее введем дату платежки. То же самое, чуть-чуть обработаем внешний вид этого элемента управления. Вместо даты по-английски опять напишем по-русски - Дата. Само поле чуть-чуть уменьшим. Далее следующее поле - это Вид платежки. Опять-таки вместо английского слова Вид, напишем по-русски. Разместим его вот в этом месте. Далее разместим плательщика, т.е. это будет название нашей фирмы. Это у нас будет поле Id_me, перетащим его. Вместо Id_me напишем Плательщик. Опять чуть-чуть расширим. Допустим, вот таким образом. Далее сумма платежка. Напишем русскими буквами Сумма. Далее проведем черту, чтобы отделить верхнюю часть платежки от нижней. Пусть это будет горизонтальная линия, вот такая. Теперь же продолжим размещение элементов. Отобразим ИНН получателем, его идентификационный номер. Для этого нам понадобится Id фирмы. Вот этот. Перетащим его. Напишем вот здесь Получатель ИНН. Вот таким образом. Далее чуть-чуть сдвинем само поле формы, в котором у нас будет отображаться фирма. Сделаем его чуть побольше. Вот это название сдвинем выше. Здесь у нас будет отображаться название самой фирмы, а ИНН будем отображать чуть выше. Для этого нам понадобится свободное поле, в качестве которого выберем соответствующий элемент. Нарисуем его например, вот в этом месте. И здесь напишем таким образом. Знак равенства, далее ID фирмы, и отобразим его соответствующую колонку, column. Далее откроем скобку и введем, например, 4 колонку. Мы, конечно, в принципе не уверены, четвертая колонка ли ИНН, но сейчас попробуем переключиться в соответствующее место и посмотреть, так ли это. В принципе, у этого поля еще отобразилась метка. Нам она не нужна, поэтому выделим и щелкнем на кнопку Delete, для того чтобы ее удалить. Pдесь вот этой одной метки нам вполне достаточно. Разберемся теперь с колонками вот этой фирмы. Для этого нам придется перейти в таблицу платежек. Но, прежде, чем мы это сделаем, сохраним эту форму, во избежание каких-либо недоразумений. Щелкнем на кнопку сохранения и, конечно же, название форма 1 нас совершенно не устраивает. Введем название frmMain, поскольку это у нас будет главная форма. Щелкнем на кнопке ОК. Вот эту форму мы уже сохранили. Закроем ее. Перейдем в наши таблицы и откроем таблицу Платежка в режиме конструктора. Щелкнем на соответствующую кнопку. Вот у нас Id фирмы. Перейдем в подстановку и здесь можно увидеть, что у нас всего две колонки на самом деле. Это колонка Id фирмы и колонка с кратким именем. Конечно же, нас это не устраивает. Нам нужно гораздо больше колонок. В том числе и колонка с ИНН получателя. Поэтому щелкнем на источнике строк и щелкнем на вот этих трех точках, чтобы вызвать построитель запросов. Как мы видим, у нас в качестве источника данных инструкция SQL с Select. Вместо этого, конечно же, мы можем использовать прямо соответствующую таблицу, таблицу фирм. Поэтому щелкнем на выпадающем списке и выберем таблицу tFirms.
362
TeachPro Microsoft Access 2003
И далее отметим, что число столбцов здесь нам нужно три. В принципе, поверим на слово, что так и есть, поскольку краткое наименование фирмы как раз и является третьим полем в таблице фирм. Поэтому здесь напишем таким образом: ширина столбцов 0, далее опять 0, и лишь затем следующее более существенное поле, которое будет определенного размера. Пусть так и остается. В принципе, за одно мы можем изменить и подстановку в поле Id_me. Здесь, как мы видим, у нас опять Select. Вместо Select введем запрос qMine, поскольку в этом случае у нас будут отображаться только наши фирмы, что, конечно же, более справедливо для вот этого поля. Точно также введем отображение трех столбцов. Сохраним эту таблицу. Щелкнем на кнопку сохранения. Закроем ее. Попробуем посмотреть, как она выглядит. Для этого щелкнем на ней дважды. Как мы видим, в принципе, все более или менее вполне выглядит. Вот здесь можно выбрать среди моих фирм одну из двух существующих. Можем выбрать одну из фирм, в которой мы можем перечислить. В принципе, все более или менее нормально. Закроем теперь и откроем нашу форму, над которой мы будем работать дальше. Перейдем во вкладку формы. Щелкнем теперь на конструкторе, для того чтобы вызвать нашу форму frmMain. Теперь же изменим свойства вот этого поля Id_firm, для того чтобы оно отображало не только название фирмы, но и еще несколько колонок, одну из которых мы используем для отображения ИНН строчкой выше. Поэтому щелкнем на правую кнопку мыши, свойства. Как мы видим, тип и источник данных у него запрос Select - вот такого типа. Закроем его, и вместо такого запроса в качестве источника данных выберем таблицу tFirms. Далее переключимся на макет и изменим отображаемые колонки. Число столбцов возьмем, например, 5, для того чтобы вот эта 4 колонка у нас тоже отобразилась. Ну и зададим ширину соответствующих колонок. 0, потом 0, потом 2,54, это в принципе, как раз и будет та колонка, которая нам нужна. Далее точка с запятой и еще две нулевые колонки. Сохраним. Закроем эти свойства и, если мы сейчас запустим вот эту нашу форму, то можно увидеть вид нашей платежки. Какие-то поля у нас уже отображаются. Это, конечно, номер, дата, вид платежка, плательщик, сумма, ИНН получателя и сам получатель. Мы можем передвигаться по нашей таблице платежек, и соответствующие данные будут отображаться в нашей форме. Перейдем опять в режим конструктора и продолжим размещение элементов. Следующий элемент, который нам понадобится, - это Вид оплаты. Расширим нашу таблицу платежек, для того чтобы отобразить все его элементы. Вот у нас вид оплаты. Перетащим его. Далее опять изменим имя. Напишем Вид оплаты. Далее чуть-чуть изменим расположение этих элементов. Уменьшим вот это поле. Далее чуть-чуть расширим нашу форму, для того чтобы поместился здесь еще один элемент. Разместим еще и очередность платежа, вот это поле Och. Чуть-чуть опять-таки изменим внешний вид, изменим текст. Вместо Och напишем Очередность платежа. Разместим его вот таким образом. Уменьшим поле до такого вида. Далее следующее поле - это Срок оплаты. Напишем вот здесь Срок платежа, Срок ПЛ. Далее сдвинем вот эти оба поля. Ну вот, разместим таким образом. Поместим еще поле Назначение. Вот это название поместим выше, вот таким образом. Вместо Naz напишем Назначение. Ну и, конечно, назначение обычно должно занимать гораздо больше места. Поэтому сделаем его вот таким большим. Запустим нашу форму, щелкнув на соответствующую кнопку Вид, и можно уже видеть вид нашей платежки.
Глава 15. Пример «Платежное поручение»
363
В принципе, конечно же, пока внешний вид оставляет желать лучшего, но достаточно много информации из этой платежки мы уже получить можем. Мы можем передвигаться по нашей таблице и видеть соответствующие данные.
15.4. Платежка 4 Разместим на нашей форме еще несколько элементов управления, при помощи которых мы могли бы создать новую платежку, а также скомандовать нашей форме, чтобы она вывела нашу платежку на печать или же его печатный, так сказать, вид на экран. Для этого переключимся, конечно же, опять в режим конструктора. Чуть-чуть расширим нашу форму и его вкладки тоже. Ну, вот чуть-чуть еще сдвинем вправо, чтобы точнее разместить нашу вкладку. Далее разместим новый элемент - поле со списком. Разместим его, например, вот в этом месте. Сразу же появляется соответствующий мастер создания поля. Этот combo box будет отображать всегонавсего, как мы хотим создать нашу платежку - такую же, как у нас есть или же пустую. Поэтому нам нужен вот здесь второй переключатель создания фиксированного набора значений. Щелкнем на кнопке Далее. Теперь введем число столбцов 2. В первом у нас пусть будет просто-напросто 1 и 2. Именно на эти значения мы будем ориентироваться, когда будем анализировать, что у нас введено в данном combo box. А вот в столбце 2 введем соответствующее текстовое значение. Напишем "такую же" в качестве первого элемента и в качестве второго - "пустую". Щелкнем на Далее. Опять далее. Больше здесь ничего изменять не будем. Щелкнем на кнопку Готово. И в принципе, у нас уже это поле есть. Единственное, изменим названием. Вместо столбец 1, который мы не изменили в мастере, напишем просто-напросто Создать и далее двоеточие. Чуть-чуть сдвинем. Если сейчас мы переключимся на Вид, то можем увидеть вот этот наш combo box. Если мы щелкнем на выпадающем списке, то можно увидеть обе возможности, такую же и пустую. Правда, здесь отображается еще 1 и 2. 1 и 2 нам, конечно же, отображать абсолютно не с руки. Поэтому переключимся обратно в конструктор. Щелкнем здесь на правую кнопку мыши, выберем свойства и ширину столбцов. Для первого из них зададим 0 см. Закроем эти свойства. Если мы сейчас переключимся на режим нашей формы, и выберем вот этот combo box, то можно увидеть, то, что мы и хотим. А именно, отображаются только вот эти две возможности - такую же и пустую. Правда, вот это поле здесь слишком большое, поэтому переключимся обратно в свойства поля и вместо 2,54 см зададим, например, 1,5 см. И общую ширину зададим тоже 1,5 см. Если мы сейчас закроем эти свойства, переключимся в режим выполнения нашей формы, то, как мы видим, сейчас уже все выглядит так, как и должно выглядеть. Здесь у нас две возможности - создать такую же платежку и создать пустую. Переключимся обратно в вид. Теперь же определимся, по какой форме мы хотим создавать нашу платежку. Для этого создадим новый combo box. Выберем вот эту возможность. Нарисуем combo box. Фиксированный набор значений нас, конечно же, не устраивает, и нам нужно использовать значение из таблицы или запроса.
364
TeachPro Microsoft Access 2003
Щелкнем на кнопке Далее. Ну, в нашем конкретном случае нас больше устраивает запрос, чем таблицы. И нам нужен запрос qMine, в котором сконцентрированы все наши фирмы. Щелкнем на кнопку Далее. В качестве доступных полей выберем, например, первые три поля. Id фирмы, полное имя и Nick. В принципе, сейчас это особого значение не имеет. Щелкнем на кнопку Далее. Сортировать не будем. Щелкнем опять на Далее. Вот, можем видеть, в принципе, как все это будет выглядеть. Щелкнем на кнопке Далее и на кнопке Готово, для того чтобы закончить с этим делом. Теперь изменим расположение этого поля вот таким образом. Теперь же изменим метку, вместо Id_fir1 напишем просто-напросто по и далее двоеточие. Затем щелкнем здесь на правую кнопку мыши, выберем свойства. В качестве источника данных выберем не вот этот Select, а конкретную таблицу, вернее запрос qMine. Зададим ширины столбцов. Как мы видим, сейчас у нас отображается 2,54, 2,54 и т.д. Заменим на отображение 0 см, 0 см и лишь затем отображение третьего столбца. Сдвинемся чуть ниже. Зададим общую ширину. Конечно же, нам не нужно здесь больше 7 см. Поэтому зададим здесь тоже 2,5 см. Закроем свойства. Переключимся в режим обычной формы и, если мы здесь щелкнем на выпадающем списке, то мы можем видеть как раз название кратких наименования наших фирм. Моя 1 и Моя 2 фирма. Переключимся обратно в режим конструктора. Изменим теперь имена вот этих элементов. Выберем первый из них, который помогает нам выбрать вид нашей новой платежки. И щелкнем на правую кнопку мыши. Свойства и вместо имя Поле со списком с соответствующим номером напишем соответствующую, более удобную нам аббревиатуру. Cbo - combo box, далее NewMode. В принципе, по названию тоже лучше будет видно, для чего служит этот combo box. Закроем. Далее выберем свойство вот этого combo box, вместо опять-таки поля со списком, напишем cbo, далее MeForNew. Закроем. А теперь же разберемся, как мы хотим печатать нашу платежку. Для этого опять нам потребуется для выбора вида печати создать новые combo box. Для того чтобы не мучаться, скопируем вот этот combo box. Выделим его, щелкнем на правую кнопку мыши. Далее копировать. Далее вставим. Правая кнопка мыши и Вставить. Сдвинем его вот так, чуть ниже. Вместо Создать, напишем Вывести. Далее изменим свойства этого combo box. Щелкнем на правую кнопку мыши и выберем пункт Свойства. Чуть-чуть расширим и можно увидеть, где находится тот текст, который отображается в этом combo box. Но, как мы видим, вот здесь у нас отображается "такую же" и "пустую". Нам сейчас надо этот текст чуть-чуть изменить. Вместо "такую же", напишем "На экран". А вместо "пустую" напишем "На печать". Вот и все изменения, которые нам нужны. Далее вместо имя "Поле со списком" напишем cbo. Далее PrintMode. Закроем. Далее вставим еще один combo box, который поможет нам определить, сколько экземпляром мы хотим распечатать. Для этого опять-таки выберем соответствующий combo box - поле со списком. Разместим его. Далее в соответствующем мастере выберем фиксированный набор значений. Затем Далее. Число столбцов пусть один и будет. Здесь нам ничего более не нужно. Напишем здесь простонапросто 1,2,3,4,5,6,7,8 и 9, просто-напросто перечисляя возможные количества экземпляров от 1 до 9. Щелкнем на кнопке Далее и доберемся до кнопки Готово. Далее изменим местоположение вот таким образом. Вместо "Столбец 1" напишем "экземпляров". Далее изменим ширину этого поля. В принципе, его можно сделать вот таким коротким. Тут всего лишь помещается одна цифра. Далее щелкнем на кнопке Вид, чтобы перейти в режим Формы и можно увидеть, как работают вот эти наши новые элементы.
Глава 15. Пример «Платежное поручение»
365
Если мы щелкнем на пункте Создать, то появляется выбор "такая же" или "пустая" платежки, по нашей первой форме или по второй фирме, мы можем вывести на экран или же на печать, и можем вывести количество экземпляров от 1 до 9. Переключимся обратно в режим конструктора и разместим здесь еще и две кнопки, которые и будут управлять процессом создания новой платежки и процессом распечатки. Выберем элемент Кнопка, разместим ее вот в этом месте. Здесь мы этим мастером пользоваться не будем. Щелкнем на кнопку Отмена. Изменим надпись. Напишем просто-напросто Выполнить. Далее создадим еще одну кнопку такого же содержания. Ее проще скопировать. Правая кнопка мыши и далее Копировать. Затем правая кнопка мыши и выберем пункт Вставить. И вот у нас уже есть две кнопки. Первая из них будет управлять созданием новой платежки, а вторая - печатью. Обработкой событий нажатия на эту кнопку мы займемся попозже. А сейчас отметим, что мы забыли задать имя для этого combo box. Он пока имеет стандартное имя - Поле со списком. Поэтому щелкнем на правую кнопку мыши и свойства. Зададим имя. Пусть это у нас будет cboCopyCount - количество экземпляров распечатки. И в принципе, если мы сдвинемся ниже, имеет смысл изменить число строк списка с 8 на 9, поскольку в этом случае у нас весь список будет перед глазами, и скроллинг появляться не будет. Конечно же, ради всего лишь одного элемента, одной 9, выводить скроллинг, в принципе, не очень удобно. Поэтому так и сделаем. Закроем Свойства. Если мы сейчас переключимся в режим формы и щелкнем на выпадающем списке, то можно увидеть, что скроллинг исчез с нашего поля, и отобразились все наши 9 возможностей. Правда, вот эти 2 кнопки Выполнить пока абсолютно не рабочие. Переключимся обратно в режим конструктора и отметим, что, конечно же, вот эти две группы элементов имеет смысл выделить каким-либо образом. Выделить мы можем при помощи вот этого прямоугольника. Поэтому выберем его. Далее нарисуем. И аналогично выделим нижнюю группу. Теперь же разместим еще одну кнопку, кнопку удаления, при помощи которой будем удалять текущую платежку. Для этого возьмем соответствующую кнопку, нарисуем ее. Пусть она будет расположена вот в этом месте. Выберем обработку записей и удаление записей. Щелкнем на кнопку Далее. Здесь у нас есть возможность выбора картинки для нашей кнопки. Ну, например, выберем вот такую корзинку и щелкнем на кнопку Готово. Вот теперь кнопка удаления будет иметь вот такой вид. Разместим теперь на нашей форме еще один элемент, а именно Календарь, который поможет нам выбирать даты. Разместим его вот в этом месте, в правом нижнем углу нашей фирмы. Для этого выберем инструмент Другие элементы. Здесь у нас появляется список всех внедренныхобъектов, которые мы можем использовать в наших формах. Здесь достаточно большой список, и если мы сдвинемся ниже и будем сдвигать этот список, чтобы дойти до конца, то в конце нашего списка и находится нужный нам элемент, Элемент управления Календарь. Щелкнем на нем. Далее нарисуем его. Допустим, вот в этом месте нашей формы, и можно видеть, как он выглядит. Чуть-чуть его увеличим, поскольку, как мы видим, цифры налезают друг на друга. И вот в таком виде он уже вполне может нас устроить. Введем еще и некую надпись. Ну, до этого чуть-чуть сдвинем вот эти элементы ниже. Для этого выделим вот таким выделением прямоугольника, далее сдвинем вот эти элементы пониже. Вот в этом месте разместим текст. Для этого выберем, конечно же, надпись, разместим ее вот в этом месте и здесь напишем текст. "Нажмите на календарь", запятая, "чтобы выбрать дату платежа". Далее двоеточие. Как мы видим, эту метку надо чуть-чуть сдвинуть левее. Вот так в принципе, вот в таком виде нас это может и устроить.
366
TeachPro Microsoft Access 2003
Если мы сейчас щелкнем на кнопке Вид, то можно увидеть окончательный вид нашей платежки. Конечно же, единственный минус у этой платежки то, что, в принципе элементы на ней достаточно плохо выровнены. И с эстетической точки зрения платежка достаточно удручающе выглядит. Но пока оставим, как есть. Зато по функциональности у нас все пока нормально. Все поля отображают соответствующую информацию, можем выбрать возможные создания новой платежки. Правда, пока вот эти кнопки не работают. Можем выбрать какую-либо дату. Но, как мы видим, у нас все элементы имеют возможность что-либо так сказать делать. Правда, результат выполнения этих операций пока нулевой. Поэтому переключимся в режим конструктора, для того чтобы поработать над нашей формой. Свяжем теперь дату, которая отображается вот в этом календаре с датой платежки. Для этого выберем вот этот календарь, щелкнем на правую кнопку мыши и выберем пункт Свойства. И затем, в поле Данные, щелкнув на выпадающем списке, выберем соответствующее поле, которое будет управлять этим календарем. Конечно же, это у нас должно быть поле Дата. Отметим еще, что в этом списке есть достаточно много настроек, при помощи которых мы можем изменять внешность нашего календаря и отдельные его свойства. Для этого сдвинем чуть ниже. И как мы видим, мы можем изменять отображения сетки Grid, можем отображать или не отображать месяца, дни, показывать или нет заголовок данной таблицы и т.д. В принципе, сейчас ничего здесь менять не будем - ни шрифт, ни метку, все оставим, как есть. Согласимся с установками по умолчанию. Щелкнем на крестике, закроем Свойства. Если мы сейчас запустим нашу форму, то, перемещаясь по таблицам, можно видеть, как соответствующим образом меняется отображение даты в этом календаре. Правда, если мы что-либо изменим в нашем календаре, то это автоматически вот в этой дате не отображается. Для того чтобы это происходило и в другую сторону тоже, нужно создать уже специальный обработчик. Автоматически такой обратной связи нет. Переключимся теперь обратно в режим конструктора, в котором и будем производить дальнейшие изменения нашей формы.
15.5. Платежка 5 Оставим теперь пока вот эту вкладку, вкладку Платежка и переключимся на вторую вкладку, вкладку Список. Как мы видим, она пока абсолютно пустая, здесь нет никаких элементов. Разместим здесь всего лишь один единственный элемент, а именно Список. Для этого выберем вот этот элемент, элемент Список. Разместим его вот таким образом. Конечно же, автоматически появляется мастер создания списков. Воспользуемся им. Конечно же, нам сейчас нужна первая возможность использования таблицы или запросов. Фиксированный набор значений, нам, конечно, сейчас не нужен. Мы хотим отображать список всех платежек, которые у нас есть в нашей базе данных. Щелкнем на кнопке Далее. В качестве основы возьмем вот эту таблицу tPlat, таблицу платежек. Щелкнем на кнопке Далее. Выберем поля, которые нам нужны. Это, во-первых, номер платежки. Далее имя нашей фирмы, от которой мы проводили перечисления. Далее имя фирмы, в которой произошло перечисление. Далее дата платежки. Сумма, и в принципе, еще поместим в наш список назначение. Щелкнем теперь на кнопку Далее. Сортировать мы не будем. Опять Далее. Опять Далее. И щелкнем на кнопку Готово. Наконец, уберем вот эту метку. Она нам не нужна. Выберем и щелкнем на кнопку Delete. А теперь же, если мы запустим нашу форму и переключимся в список, вот в эту вкладку, то можно увидеть список всех платежек, которые у нас есть в нашей базе данных. Правда, то, как выглядит этот список, скорее всего не вполне нас устраивает, поскольку определить, из какой фирмы и в какую фирму перешла платежка по этому его номеру, конечно же, достаточно сложно и лучше бы здесь выводились краткие имена.
Глава 15. Пример «Платежное поручение»
367
Попробуем сейчас так и сделать. А также вывести заглавие в этом списке. Поэтому переключимся в режим конструктора и откроем свойство этого поля. Для этого щелкнем на правую кнопку мыши и далее Свойства. Во-первых, зададим отображение заголовков. Щелкнем и изменим Нет на Да. Далее откроем источник строк, вот этот Select. Щелкнем на вот этих трех точках. Появляется построитель запросов - соответствующий конструктор. И здесь, наряду с вот этой таблицей платежек, введем еще и таблицу фирм, чтобы отобразить соответствующее имя фирмы. Для этого щелкнем на правую кнопку мыши и выберем пункт Добавить таблицу. Нам сейчас нужна таблица tFirms. Щелкнем на кнопку Добавить. Щелкнем еще раз на кнопку Добавить, для того чтобы мы могли видеть не только нашу фирму, но и фирму, куда мы хотим перечислить. Теперь надо вот эту таблицу Firms1 тоже связать с таблицей платежек. Первая из вот этих таблиц связалась автоматическим образом. Для этого перетащим вот это поле Id_fir и свяжем его с Id_fir из таблицы платежек. Ну и для большей наглядности, чуть-чуть по-другому расположим вот эти таблицы. Вот в таком виде, конечно же, все гораздо более наглядно. Далее, вместо поля Id_me, выберем поле Nick из вот этой таблицы. Для этого схватим соответствующее поле, перетащим вот сюда, то же самое сделаем со вторым именем фирмы. Т.е. куда мы перечисляем, это у нас тоже опять Nick. Переместим его вот в это место. Ну и старые два поля Id_me и Id_fir, конечно же, нам сейчас уже не нужны. Поэтому выделим вот эти два поля и щелкнем на кнопку Delete. Далее, выведем в этом запросе еще Id платежки - номер платежки, поскольку нам понадобится в дальнейшем для идентификации соответствующего элемента списка. Поместим это поле в конец и сохраним этот запрос. Щелкнем на кнопку сохранения. Зададим имя запроса. Конечно же, нас запрос 1 не устроит. Напишем qPlat и щелкнем на кнопку ОК. Закроем. Подтвердим сохранение всех изменений. Да. Дальше изменим число столбцов. Вместо 7 напишем 8, поскольку мы там ввели еще один дополнительный столбец. Ну и этот дополнительный столбец отобразим шириной 0. Т.е. мы его выводить на экран не будем. Закроем теперь эти свойства. И посмотрим, что у нас получилось. Щелкнем на кнопку Вид, переключимся на список, и можно увидеть на этот раз вид нашего списка. Все, конечно же, уже более или менее нормально. Единственно, конечно же, вот это название требует соответствующего изменения. Поэтому переключимся в режим конструктора. Опять нажмем на правую кнопку мыши и выберем Свойства. Откроем вот этот запрос qPlat. Щелкнем на вот этих трех точках и зададим имена для вот этих двух полей. Напишем, например, таким образом. Кр.имя - краткое имя, далее двоеточие. Изменим еще и название вот этой колонки. Здесь напишем просто Получатель. Ну и заодно изменим имена остальных колонок. Здесь напишем, конечно же, номер. Особого смысла изменять имя для Id платежки не имеет. И в принципе, можно заметить, что Id платежки мы ввели еще один раз. Это поле сейчас абсолютно лишнее, поэтому выделим и щелкнем на кнопку Delete, чтобы не замусоривать. Далее изменим наименование поля даты. Напишем русскими буквами Дата, двоеточие. Затем, конечно же, сумма, двоеточие. Ну и последнее поле - Назначение. Сохраним теперь этот запрос. Как мы видим, компьютер нам не позволил использовать вот такое наименование с точкой. Щелкнем на кнопку ОК. И подправим соответствующее имя. Уберем просто-напросто вот эту точку, изменим его, например, на знак подчеркивания. Сохраним. Щелкнем на значке сохранения. На этот раз все нормально. Закроем. Опять число столбцов изменим обратно на 7, исправляя нашу ошибку. 0 см здесь нам тоже уже не к чему. И закроем эти свойства. Если мы сейчас переключимся на вид и откроем вкладку Список, то можно увидеть уже вполне нормальный внешний вид нашего списка платежек.
368
TeachPro Microsoft Access 2003
15.6. Платежка 6 15.6.1. Начинаем делать Платежку 6 Продолжим работу с нашей базой данных платежек. Рассмотрим вот эту нашу форму Main - главную. Запустим ее. Для этого щелкнем на ней дважды. Вот она появилась перед нами. Как мы видим, у нас на данном этапе есть две вкладки вкладка платежек и вкладка со списками всех платежек в нашей базе данных. Правда, надо сказать, что в таком виде работать с этой базой будет достаточно неудобно, особенно, если у нас достаточно много платежек. В этом случае список будет достаточно длинный и искать нужную нам платежку, будет довольно затруднительно. Поэтому имело бы смысл, конечно, чтобы мы могли оперировать не целиком со всей базой данных, а с какой-либо ее частью. Например, выделить часть базы данных, касающейся только какой-либо из наших фирм, к примеру, Мою 1 или Мою 2 фирмы. А также отделить платежки за разные годы. Попробуем это реализовать. Для этого переключимся в режим конструктора. Вот появился перед нами режим конструктора и в нем загружена, как мы видим, наша форма. И теперь же отметим, что все элементы, которые пока у нас есть, размещены в области данных. Для того чтобы управлять всем этим хозяйством и выбирать отдельно часть нашей базы данных, используем еще и другие области в нашей форме. Для этого щелкнем на пункте меню Вид и далее щелкнем на команде Заголовок/примечание формы. Как раз в этом случае у нас появляется возможность размещать элементы на заголовки, а также на примечания. Примечание нам не нужно, поэтому его вот так занулим. А вот в заголовке разместим несколько элементов. Это, во-первых, combo box, при помощи которого будем выбирать название нашей фирмы. Для этого, конечно же, нам нужно выбирать соответствующий элемент - поле со списком. Разместим его, например, вот в этом месте. Как мы видим, автоматически запустился мастер создания поля. Мы можем воспользоваться этим мастером, или же, щелкнув на кнопку Отмена, настроить это поле вручную. Сейчас щелкнем на кнопку Отмена и попробуем самим cорганизовать. Для этого щелкнем на правую кнопку мыши, далее свойства. В свойствах нам понадобится пункт Данные. если мы щелкнем на ниспадающем списке, то мы можем видеть все поля из нашей текущей таблицы. В принципе это нас не устраивает, поэтому перейдем на свойство Источник строк. И здесь, конечно же, нам нужно выбрать одну из тех возможностей, которые сейчас предоставляет Microsoft Access. А именно, в данном конкретном случае нам нужно выбрать запрос qMine, внутри которого как раз и формируется список наших фирм. Щелкнем. Теперь нам нужно определиться с числом столбцов, и какие столбцы нам нужны. Для этого откроем вот этот запрос qMine, щелкнув на вот эти три точки. Как мы видим, первая строчка у нас Id фирмы, далее полное имя. И далее Nick - краткое имя нашей фирмы. Можем использовать, например, полное имя. Как мы видим, это у нас второй столбец. Ну и, конечно же, первый столбец нам тоже понадобится для дальнейшей идентификации. Сейчас закроем этот запрос. Все, что нам нужно мы уже получили. Число столбцов, как мы поняли, нам нужно 2, далее зададим ширину столбцов. Конечно же, первый столбец 0. Его нам выводить не надо. А вот второй столбец зададим, например, 3см.
Глава 15. Пример «Платежное поручение»
369
Изменим теперь еще ей имя данного элемента управления. Пусть он называется у нас cbo (combo box) и далее FirmFilter. В принципе, достаточно понятно, как сформировалось это имя. Закроем свойства. И изменим тот текст, который у нас отображается перед этим полем. Ну, конечно же, вот такое глупое поле со списком 34 нас не устраивает. А вместо этого напишем просто-напросто Платежные Поручения. У нас немного налезло одно поле на другое, поэтому чуть-чуть раздвинем платежку и соответствующую метку, соответствующий текст. Допустим, вот таким образом. Введем еще один элемент управления combo box, при помощи которого можем фильтровать еще и год перечисления, когда была создана эта платежка. Ну, опять-таки выберем соответствующий элемент управления - combo box, поле со списком. Нарисуем его, например, вот в этом месте. Опять появляется мастер. Откажемся от него. Щелкнем на кнопку Отмена. Далее правая кнопка мыши и свойства. Вызовем соответствующее окно со свойствами. Поскольку мы сразу попали на имя, заодно его и поправим. Конечно же, оно у нас будет не таким, как компьютер нам подсказывает по умолчанию, а наберем cboFilterYear, поскольку фильтровать мы будем года. Далее в качестве источника данных нам нужна таблица или запрос. А в качестве источника строк выберем запрос qYears - года. Если мы щелкнем на трех точках, чтобы посмотреть, как выглядит этот запрос, то можно увидеть, что в принципе, здесь как раз всего лишь одно поле и есть - поле год. Закроем его. И закроем эти свойства тоже. Щелкнем на крестике. В принципе, мы уже все, что хотели, сделали, единственное, конечно же, изменим название этого поля. Вместо поле 36 напишем "за". Немножко изменим вид наших платежек. Разместим чуть-чуть по-другому, например, вот таким образом. И напишем еще в конце год. Для этого возьмем надпись. Разместим ее в конце этого текста и напишем слово Год. Уменьшим область заголовка. Конечно же, так много места нам не нужно. И посмотрим, как все это теперь будет выглядеть при работе формы. Для этого, конечно же, запустим нашу форму, щелкнув на кнопку Вид. Вот у нас все это появилось на экране. И, щелкнув на выпадающем списке, мы можем выбрать одну из двух фирм, Моя Первая Фирма или Моя Фирма, а также можем выбрать, за какой год мы хотим посмотреть платежки. Правда, в принципе, можно заметить, что все мы здесь выбираем. никак не отражается не на таблицы платежек, ни на списки. В принципе, оно и понятно, поскольку никакого обработчика мы пока еще не реализовывали. А сейчас как раз самое время этим и заняться. Для того чтобы организовать обработку фильтрации наших таблиц и списков, по фирме и по году, конечно же, во-первых, переключимся в режим конструктора нашей формы.
15.6.2. Обработка при помощи Visual Basic Запустим теперь Visual Basic, поскольку именно в нем мы должны написать обработку нужных нам событий, а именно событие загрузки нашей формы и изменение значения в соответствующих combo box. Поэтому щелкнем на Alt+F11. Вот появился наш Microsoft Visual Basic, в котором, как мы видим, у нас находится наш модуль, связанный с нашей формой Form_frmMain. Конечно же, он пока у нас абсолютно пустой, поэтому выберем первое из нужных нам событий, которое, конечно же, происходит при загрузке нашей формы. Для того чтобы выбрать это событие, щелкнем на вот этом выпадающем списке и выберем пункт Form. И как только мы на нем щелкнем, сразу же появляется то событие, которое связано с этим элементом по умолчанию, а именно Form_Load - загрузка формы.
370
TeachPro Microsoft Access 2003
Конечно, мы можем выбрать и любое другое событие. Для этого надо щелкнуть на вот этом выпадающем списке. Здесь достаточно много событий, связанных и с мышкой, и с кнопкой и т.д. Но сейчас, нас как раз устраивает Form_Load - загрузка формы. Поэтому здесь и будем работать. Щелкнем на кнопку табуляции и далее напишем оператор With Me, для того чтобы мы могли не писать обращение к нашей форме каждый раз, а использовать всего лишь точку для обращения к каждому из элементов управления на нем. Далее напишем End With, для того чтобы не забыть закрыть этот оператор. Далее Enter, знак табуляции. И теперь напишем тот оператор, при помощи которого будем загружать некое начальное значение - cперва один combo box, связанный с фирмами, а затем и второй combo box, связанный с годами. Для этого напишем точка, далее combo box, это у нас cboFirmFilter. Щелкнем на нем дважды. Далее знак равенства, и теперь нам нужно загрузить какое-либо значение сразу же. Конечно же, оставлять без загрузки неинтересно, поскольку при загрузке нашей формы мы просто поручаем пустое место. Это не очень логично. Значение, которое должно быть в этом combo box, - это одно из фирм. Какое выбрать - более или менее все равно, поэтому выберем просто-напросто, скажем так, первое попавшееся. Первое попавшееся мы можем выбрать при помощи функции Dmin, т.е. минимальное значение из соответствующего выбора. А выбор мы можем сделать по значению по соответствующему полю. Поле, это, конечно же, у нас будет Id_me - идентификатор нашей фирмы. Далее запятая и источник данных. Это у нас будет запрос qMine. Вот мы все это уже оформили. Закроем скобку. Enter. Вот у нас один combo box уже полностью готов к работе, сразу же при загрузке формы. Теперь точка, второй combo box. CboFilterYear. Вот он. Щелкнем на нем дважды. Далее знак равенства и теперь ему присвоим тоже какое-то значение. Но на этот раз первое попавшееся будет не интересно. Если у нас платежки идут в хронологическом порядке, то, конечно, первая же из платежек - это у нас будет самая старая. А интересно посмотреть, наоборот, на самые новые платежки. Поэтому, во-первых, воспользуемся функцией Year, для того чтобы выбрать год из нашей соответствующей даты и далее воспользуемся функцией Dmax, чтобы выбрать последнюю из возможных значений. Далее скобка. А теперь поле, которое нам нужно для этого xombo box. Это, конечно же, будет Date - дата. Далее запятая и источник данных - это у нас будет наша таблица tPlat, в которой и сконцентрированы у нас все наши платежки. Закроем скобку и закроем вторую скобку тоже. Вот после этого у нас оба combo box уже будут готовы. И мы можем приступить к фильтрации наших записей. Для этого, конечно же, мы можем все функции и операторы, которые нам для этого нужны, написать вот в этом месте, но лучше оформить все это в виде отдельной функции, поскольку эти действия нам понадобятся еще раз. Напишем функцию reFilter. А оформим ее чуть ниже. Для этого напишем Sub - оператор задания подпрограммы. Далее reFilter - название этой подпрограммы. Далее скобки, поскольку никаких передаваемых параметров нет. Далее Enter.
Глава 15. Пример «Платежное поручение»
371
Как мы видим, компьютер автоматически написал нам End Sub, закрыв нашу подпрограмму. Далее знак табуляции. Опять напишем With Me и закроем End With. Теперь же, щелкнув на Enter и знаке табуляции, нам нужно написать все соответствующие операторы, первый из которых, это задание соответствующего фильтра. Поэтому напишем точка. Далее фильтр. Вот появился нужный нам оператор. Щелкнем дважды. Далее знак равенства. Кавычки. И внутри кавычек нам нужно написать необходимое нам условие. Первое из них - это условие на год. Для этого воспользуемся функцией Year, при помощи которой мы выделим из нашего поля Date, которое напишем внутри квадратных скобок, соответствующий год. И вот это значение должно равняться соответствующему значению в combo box, связанным с вводом. А его мы получим при помощи forms, поскольку он относится к формам. Далее восклицательный знак. Далее наша текущая форма frmMain, восклицательный знак и далее уже обращение к конкретному элементу управлению, к combo box - cboFilterYear. Вот после этого у нас уже будет полностью готово условие на год. Конечно, это нам недостаточно, поэтому напишем связку and и далее второе условие. Это у нас будет на поле Id_me, и значение этого поля должно равняться со значением combo box, связанным с нашей фирмы. Его мы получим опять-таки при помощи Forms, далее восклицательный знак и наша конкретная форма frmMain. Далее восклицательный знак и наш combo box - cboFirmFilter. Выйдем в конец строки. Далее Enter. А теперь же нам нужно включить фильтрацию, иначе все, что мы написали, просто-напросто работать не будет. Поэтому введем точку, далее FilterOn, вот эта функция. Щелкнем на ней дважды и присвоим ей значение True. Как только написали равенство, появилось True и False. Нам нужен вариант True. Щелкнем дважды. Запустим теперь нашу форму и посмотрим, что у нас в результате всего этого дела получилось.Для этого перейдем в Microsoft Access. Щелкнем на соответствующую кнопку. Запустим вот эту нашу форму. Как мы видим, у нас сразу же появилась наша фирма Моя Первая Фирма в соответствующем combo box. И последний из годов, в котором есть платежка. Ну, конечно же, это в данном конкретном случае 2005. Ну и внизу появилась подпись Фильтр, что означает, что у нас вот эта таблица отфильтрована. Это можно увидеть и по количеству записей 8. На самом деле их всех гораздо больше. Но платежек от моей первой фирмы за вот этот год только 8. Правда, наряду с загрузкой и с фильтрацией неплохо было бы, чтобы название фирмы появилось бы и вот в этом поле автоматически. Это мы сейчас попробуем сделать. Также, если мы переключимся в список, то можно увидеть, что здесь как раз никакой фильтрации не произошло. Здесь отображается как и Моя первая фирма, так и моя вторая фирма за все года, которые есть. Но это нам тоже необходимо сделать. Поэтому переключимся в режим конструктора. Вопервых, посмотрим, как называется вот этот combo box, связанный с формой - cboMeForNew. Его надо заполнить. Перейдем в список. Посмотрим, как называется наш список. Но можно увидеть, что вот это имя, нам, конечно же, доставит много неудобств, достаточно непонятное имя. Быстренько его исправим. Для этого щелкнем на правую кнопку мыши. Далее свойства. Вместо имени список 32, напишем, например, lstList. Закроем. И перейдем в Visual Basic. Для этого щелкнем на Alt+F11. И вот в этом фильтре напишем еще несколько строк. Точка, далее lstList, и здесь нам простонапросто надо обновить поля. Поэтому напишем точка и далее вызовем оператор Requery. Вот он появился перед нами. Щелкнем дважды. И после этого у нас все значения вот в этом листе обновятся с соответствующими условиями, с соответствующим фильтром. Щелкнем на кнопку Enter и теперь на всякий случай обновим значение и в поле годов, если оно случайно оказалось каким-либо образом после каких-либо событий несовпадающим с фильтром. Для этого напишем точка. Далее cboFilterYear. Вот он появился перед нами и та же функция оператор Requery. Щелкнем на нем дважды, вот он появился перед нами.
372
TeachPro Microsoft Access 2003
В принципе, это не очень обязательная, конечно же, функция, но иногда, чтобы компьютер не промахивался, лучше написать лишнее обновление. Теперь Enter. И последнее, что нам необходимо сделать, - это перекинуть значение нашей фирмы из верхнего combo box в нижний, там, где у нас происходит выбор новой платежки. Поэтому напишем таким образом. Здесь просто-напросто присваивание. Пишем точка, cboMeForNew - название этого combo box. Вот он появился перед нами, щелкнем дважды. Далее знак равенства. И далее опять точка, cbo (combo box). И вот этот FirmFilter. Щелкнем дважды, и после этого эта процедура уже полностью готова к использованию. Отметим теперь еще одно обстоятельство, что, конечно же, фильтрация должна происходить не только при начальной загрузке нашей формы, но и каждый раз, когда мы меняем значения вот в этих combo box - cboFirmFilter и cboFilterYear. Поэтому вызовем соответствующую процедуру. Для этого щелкнем на вот этом выпадающем списке и выберем combo box cboFilterYear. Если мы щелкнем на нем, то появляется вот эта процедура, которая сейчас у нас по умолчанию Before Update. Но нас как раз интересует не Before Update, а после Update, после того, как обновилось это значение. Поэтому выберем вот эту функцию. Щелкнем. Вот она появилась перед нами и здесь нам нужно использовать вот этот reFilter. Поэтому табуляция и так и напишем reFilter. Вот эта функция Before Update нам не нужна, поэтому выделим и щелкнем на кнопку Delete, просто-напросто стерев. Теперь же фильтрацию нужно вызвать и после обновления combo box, связанного с фирмами. Поэтому щелкнем на вот этом ниспадающем списке и выберем наш combo box FirmFilter. Опять появляется Before Update. Нам нужно не Before Update, а After Update. Выберем соответствующую процедуру. Before Update выделим и удалим, щелкнув на кнопку Delete. Далее напишем здесь тоже reFilter. Знак табуляции. Далее reFilter вызов соответствующей процедуры фильтрации. И можно увидеть, что у нас теперь reFilter вызывается и после обновления FilterYear и после обновления FirmFilter, в обоих combo box. Посмотрим теперь, как все это у нас будет работать. Для этого переключимся на Microsoft Access и далее запустим вот эту форму. Щелкнем на соответствующую кнопку Вид. Вот появилась наша таблица. Если мы сейчас вместо нашей первой фирмы выберем вторую фирму, то можно увидеть, что сразу же у нас изменилось и количество записей, и соответствующая платежка. Теперь мы оперируем платежками со второй фирмы. Ну и точно также, если изменим код, это точно также действует на соответствующую таблицу. А если мы переключимся на Cписок, то, как мы видим, пока у нас абсолютно полная фильтрация по вот этим двум параметрам не произошла. Посмотрим в чем дело. Для этого переключимся в режим Вид и посмотрим, как у нас формируется вот этот список. Для этого щелкнем на правую кнопку мыши, далее Cвойства. У нас, как мы видим, источником строк является запрос qPlat. Щелкнем на вот этих трех точках, и видим весь наш запрос. Теперь же нам в этом запросе надо поставить соответствующие условия. Во-первых, надо поставить условие на вот это поле Id_me, чтобы оно совпадало с соответствующим combo box в нашей форме, и условие на соответствующую дату. На вот эту. Для этого выведем эти два поля. Во-первых, Id_me поставим вот сюда. Далее дату. Тоже перетащим. И теперь нам нужно на них поставить соответствующие условия. Условия нам надо написать вот в это поле. Во-первых, эти два поля выводить нам совсем не обязательно. Снимем соответствующие галочки. А теперь можно, конечно, здесь условия отбора написать по памяти, но воспользуемся построителем выражений. Для этого щелкнем на вот эту кнопку Построить. Далее нам нужны наши формы. Щелкнем дважды. Все формы. Наша форма frmMain. Далее, поскольку нам нужно условие на Id_me, это, конечно же, FirmFilter. Ну и значение.
Глава 15. Пример «Платежное поручение»
373
Щелкнем дважды. Вот появилось все, что нам нужно, и щелкнем на ОК. С фирмами мы уже разобрались. Теперь же нам нужно условие на дату. Перейдем в соседнюю ячейку. Далее опять вызовем построитель выражений. Щелкнем. Вот он, появился перед нами. Опять формы. Все формы. Наша форма frmMain. И на этот раз нам нужен cboFilterYear. Опять-таки нам нужно его значение. Щелкнем дважды и ОК. Правда, у нас в этой ячейке получается просто-напросто год. А нам нужно из вот этого поля тоже выбрать год. Поэтому напишем впереди соответствующую функцию Year, для того чтобы из этого поля даты получить год. Напишем Year. Далее скобка. А дату поставим внутрь квадратных скобок. Вот таким образом. Как мы видим, это поле у нас преобразовалось к вот такому виду Year от даты. В принципе, все на самом деле уже нормально. Сохраним, щелкнув на кнопку сохранения. Закроем этот запрос. Закроем и свойства вот этого листа и запустим нашу форму, щелкнув на соответствующую кнопку. На первой вкладке, вкладке Платежка пока все нормально. Здесь мы уже все видели. Переключимся на Список. И здесь, как мы видим, у нас уже наш фильтр работает. Сейчас отображается Моя вторая фирма и все платежки за 2005 год. Посмотрим, какие платежки за 2004 год. Как мы видим, всего лишь две платежки. А у первой фирмы, как мы видим, три. Т.е. каждый раз, переключаясь, мы получаем все достаточно правильно. Перейдем теперь в конструктор нашей формы, и обратим внимание на вот этот combo box и на то, как в нем формируется соответствующий список для отображения. Если мы щелкнем на правую кнопку мыши и вызовем его свойства, то видно, что он у нас формируется на основе запроса qYears. Но это в принципе не очень рациональное использование компьютера, поскольку все то же самое мы можем сделать без использования запросов, а именно: строчку с соответствующим запросом использовать прямо внутри этого combo box. В этом случае все будет работать намного быстрее, не создавая отдельный список с запросом. Попробуем это сделать. Для этого вызовем этот запрос сперва, чтобы использовать его шаблон. Далее щелкнем на правую кнопку мыши и перейдем в режим SQL, и здесь мы можем видеть все те строчки, которые нам нужны. Именно вот эти всего лишь три строчки нам нужны. Щелкнем на правую кнопку мыши и копировать. Закроем теперь это окно. Вместо Источника строк, запроса qYears, который мы сейчас удалим, щелкнув на кнопку Delete, вставим наш SQL запрос. Для этого щелкнем на правую кнопку мыши и выберем пункт Вставить. Вот все те строчки, которые нам нужны, сюда как раз и вставились вместе с Select и вместе с группировкой. Закроем. Теперь перейдем в нашу таблицу и в принципе, перечитав запросы, вот этот запрос qYears мы можем с полным спокойствием удалить. Он нам уже не нужен. Он свое дело уже сделал. Щелкнем на клавише Delete. Подтвердим удаление и попробуем теперь запустить нашу форму, посмотреть, все ли теперь нормально. Щелкнем на кнопку Вид, и, как мы видим, у нас правильно заполняется вот этот combo box, год 2004 и 2005, все платежки, которые у нас есть за разные года.
15.7. Платежка 7. Синхронизация вкладок Рассмотрим теперь форму, которые мы только что создали. Запустим ее. Для этого щелкнем на ней дважды. Вот, она появилась перед нами. Как мы помним, здесь две вкладки, вкладка платежек и вкладка, на которой находится список всех платежек. Но, надо сказать, что вот эти две вкладки абсолютно не связаны друг с другом. Конечно же, было бы интересно, если бы мы, выбрав какую-либо платежку, передвигаясь по нашей таблице, например, платежку 5, далее переключившись на список, автоматически встали вот в этом списке на платежку под номером 5. Ну и наоборот, выбрав какую-либо из платежек в списке, переключившись в платежку, мы получили бы именно ту платежку, которую мы выбрали в списке.
374
TeachPro Microsoft Access 2003
Но в данном конкретном случае у нас номер 8, а не номер 5. Попробуем это все реализовать. Для этого переключимся в режим конструктора и далее перейдем в Visual Basic. Для этого, как всегда щелкнем на Alt+F11, но до этого займемся вот этими двумя вкладками, которые у нас есть. А если мы на ней щелкнем, то можно увидеть название этих вкладок. Это у нас вкладка Платежки и далее вкладка Список. Эти два наименования следует запомнить. Они нам понадобятся. Теперь же запустим, как мы и обещали Visual Basic - Alt+F11. Вот мы попали в Visual Basic. Окно Immediate сейчас закроем. Оно нам не нужно. Mесто для наших программ сейчас нам нужно гораздо больше. Откроем теперь список всех объектов на нашей форме. Сдвинемся скроллингом ниже и рассмотрим вот этот элемент управления Список. Здесь, как мы видим, у него достаточно много событий. Автоматически, конечно же, загрузился Click, т.е. что будет происходить при щелкани на заголовке соответствующей вкладке. Сейчас нас интересует не это событие нажатия, а событие получения этим элементом фокуса. Поскольку не всегда на эту вкладку можно зайти только лишь нажатием. Можно, например, перейти с клавиатуры нажатием, например, на табуляцию. Поэтому лучше воспользуемся другим событием. Какого рода события у нас сейчас связаны с этой вкладкой платежек? Это, как мы видим, Click, DoubleClick и работа с мышками. В принципе, конечно, можно было бы ограничится и вот этим событием Click. Но в этом случае, как мы сказали, мы неправильно будем работать с клавиатурой. В частности, переключаясь по табуляции. Поэтому выберем лучше по-другому, сообщение, которое мы будем обрабатывать. А именно выберем не список, а прямо нашу вкладку объект. Он находится чуть выше. Вот этот набор вкладок. Вот, как мы видим, сразу же опять появилось его событие Click, но сейчас нас интересует не Click, а другое событие. А именно, Change, т.е. изменение в нашем заголовке. Но все остальные процедуры они нам сейчас не нужны, поэтому выделим и щелкнем на кнопку Delete, удалив их. А теперь же, во-первых, нам нужно выяснить, что же у нас произошло при изменении вкладки. А именно, какая из вкладок активизировалась в данном случае. Это мы сейчас выясним при помощи оператора IF, далее вот этот наш набор вкладок. Напишем так: me, точка, далее набор вкладок. Щелкнем на нем дважды. Далее точка. И затем Value - значение. Щелкнем дважды. И вот, если это значение у нас равняется 1, т.е. мы активизировали вторую вкладку, поскольку, как мы помним, нумерация у нас начинается с 0, то платежка с номером 1 - это у нас вторая вкладка - Cписок. В общем, если вот это верно, то в этом случае then, напишем заодно и End If, чтобы в дальнейшем не забыть. Далее Enter, знак табуляции и теперь напишем такое выражение. Me, далее lstList, это у нас наш список. Вот он появился перед нами. Щелкнем на нем дважды. Далее точка Value. Вот оно. Щелкнем дважды, и вот его значение пусть равняется номеру идентификатора нашей платежки в списке. В этом случае как раз список позиционируется правильным образом. Поэтому напишем Me и дальше наш элемент управления Id_plat. Вот он. Щелкнем на нем дважды. Как мы помним, вот этот элемент управления мы разместили на нашей форме, но, правда, оставили его невидимым, поскольку при просмотре платежек он нам абсолютно не нужен.
Глава 15. Пример «Платежное поручение»
375
Это, так сказать, внутренняя кухня нашей фирмы. А вот для идентификации он, конечно, нам сейчас и понадобился. Запустим теперь нашу форму. Для этого перейдем сперва на Microsoft Access. Далее щелкнем на кнопке Вид. Вот появилась наша форма. Переключимся на какую-нибудь платежку. Например, на платежку номер 7. Переключимся на список и, как мы видим, мы как раз спозиционировались на 7 платежке. Если мы сейчас изменим и встанем на какую-либо, например, на 8, переключившись на список, увидим, что как раз здесь и находимся. Т.е. вот таким образом, выбрав любую из платежек и переключившись на список, мы сразу же попадаем на соответствующую строчку. Но, правда, обратное действие пока не происходит. Вот, выбрав, например, вот эту 4 платежку, переключившись, мы опять видим вторую. Сейчас это тоже можно исправить. Для этого переключимся обратно в режим конструктора, далее Visual Basic - Alt+F11 и теперь понятно, что надо делать. Нам нужно выяснить, что будет происходить, если значение набора вкладок равняется не 1, а 0. Т.е. мы переключились в первую вкладку. Поэтому напишем следующим образом. Во-первых, чтобы много не писать, выделим вот эти три строчки. Правая кнопка мыши и Сору. Далее здесь щелкнем на Enter, вставим все это дело. Правая кнопка мыши и Paste. Но вместо 1, здесь напишем 0. Удалим лишнюю строчку вот таким образом. И теперь, вместо вот этого выражения, которое мы сейчас сотрем, напишем следующим образом. Нам надо найти теперь в таблице соответствующую запись. Для этого напишем так: DoCmd, точка. Далее FindRecord. Вот появился перед нами соответствующий оператор. Щелкнем на нем дважды и далее теперь нам нужно выяснить, что мы хотим найти. Для этого воспользуемся Me, точка. Далее lstList - это у нас соответствующий элемент управления Список и из этого списка нам нужно значение его первой колонки, поскольку именно там находится идентификатор платежки. Поэтому поставим точку. Далее Column. Вот он. Щелкнем на нем дважды и далее 1. Запустим теперь опять нашу форму. Для этого переключимся на Microsoft Access. Далее кнопка Вид. Ну вот мы опять в нашей форме. Сейчас, как мы видим, у нас активизирована пятая платежка. Например, сдвинемся до 7, переключимся на список. Седьмую мы как раз и получили внутри списка. Здесь выберем какую-нибудь другую, например, 10. Переключимся обратно на платежку, получая вот эту 10 платежку. Т.е. в принципе, вроде бы все работает, как надо. Можем выбрать, например, вторую фирму. Вот номер платежки 3, так и есть 3. Переключимся, например, 7 платежка. Вот 7 платежка активизирована и в этой вкладке. Т.е. эти две вкладки у нас сейчас синхронизированы.
15.8. Платежка 8. Новая платежка Займемся теперь вопросом, как мы можем редактировать наш список платежек. Перво-наперво, попробуем организовать функциональность создания новой платежки. Вот этой части нашей формы. Для этого переключимся на режим конструктора внутри этой формы. Во-первых, зададим значение по умолчанию для вот этого элемента, который задает у нас, каким образом мы должны создавать нашу новую платежку. Для этого щелкнем на правую кнопку мыши, далее Свойства. Нам нужна вкладка Далее. И здесь значение по умолчанию. Надо определиться, что мы хотим - cоздавать "такую же" или же "пустую" платежку. Например, пусть значение по умолчанию будет 1. Закроем Cвойства. Теперь же займемся вот этой кнопкой, на которой написано Выполнить. Перво-наперво, изменим все-таки его имя, поскольку вот это имя - Кнопка 25 - достаточно неприятно. Поэтому щелкнем на правую кнопку мыши, свойства, далее Все. Вместо Кнопка 25, напишем, например, cboDoNew. Далее переключимся на события и выполним событие Нажатие кнопки.
376
TeachPro Microsoft Access 2003
Щелкнем на вот этих трех точках и выберем выполнение программы. Щелкнем на кнопку ОК. Конечно же, мы сразу же попали в Visual Basic и в процедуру Click. Щелкнем на табуляции и теперь займемся всем тем, что нужно написать внутри этой функции. Перво-наперво, чтобы к этому не возвращаться, напишем обработку ошибки, поэтому напишем так: On Error GoTo и Err. И дальше, раз мы такую обработку написали, нам, конечно же, нужно вставить соответствующую метку. Во-первых, напишем Exit Sub - выход из подпрограммы до обработки ошибки. И далее метка err, которая и завершит нашу программу в аварийном случае какойлибо ошибки. В принципе, неплохо было бы выдать еще и сообщение об ошибке. Так сейчас и сделаем. MsgBox, далее err, точка и далее description - его описание. Щелкнем дважды и вот после этого все ошибки мы уже предусмотрели. Теперь же займемся самой программой, которую написать надо вот в этом месте, между error и выходом из нашей процедуры. Перво-наперво определим переменные, которые нам в дальнейшем понадобится. Это, конечно же, задается оператором Dim, далее CurRec - текущая запись. Далее определим Dim idCurPlat, т.е. номер текущей платежки. Он у нас будет asLong, т.е. число. Щелкнем дважды. Далее запятая и определим еще одну переменную NewNum, которая нам поможет создавать новый номер платежки. Enter. Далее зададим при помощи оператора Set rstPlat, равняется, далее CurrentDb - текущая база данных, точка и оператор OpenRecordset. Откроем соответствующую запись. Щелкнем дважды. И, конечно же, нам нужна таблица платежек, в которой мы сейчас и будем работать. Поэтому так и напишем. tPlat - название нашей таблицы платежек. Далее Enter. Необходимый минимум переменных мы уже определили. Теперь напишем, во-первых, With Me, чтобы не писать все время этот идентификатор Me. Конечно же, если мы написали With Me надо и End With написать, чтобы закрыть использование этого Me. Далее Enter. Опять знак табуляции и теперь уже определим существенные вещи внутри нашей процедуры. Во-первых, определим вот этот idCurPlat - переменную, в которой мы храним текущий номер платежки. Напишем равняется, точка и его возьмем мы из элемента управления id_Plat. Вот он. Щелкнем дважды. Этот элемент управления, как мы помним, мы создали на нашей форме и сделали его невидимым. Напомню еще раз, где он находится. Переключимся на Microsoft Access, и вот эта платежка, вот этот номер Id_Plat. Он, как мы помним, невидимый. Т.е. при запуске его не видно. Вот его нет. Переключимся обратно в режим конструктора. Далее Alt+F11, вернемся обратно к Visual Basic, щелкнем сейчас на Enter и продолжим заполнение нашей процедуры. Теперь же нам нужно определить новый номер платежки автоматическим образом. Для этого напишем NewNum - новый номер. Далее равняется, и определим его как максимальное значение Dmax из нескольких значений. А именно, из поля номеров платежек Num из таблицы tPlat. Для этого так и напишем внутри кавычек - tPlat, запятая. В принципе, можно было бы так и оставить. Но в этом случае у нас будет сквозная нумерация по всем фирмам и годам, что в принципе, не очень хорошо. В принципе, номера платежек у нас могут отличаться в зависимости от года и фирмы. У разных фирм, конечно же, вполне может быть платежка с одинаковыми номерами. Поэтому напишем здесь еще и соответствующий критерий, который будет выглядеть таким образом
Глава 15. Пример «Платежное поручение»
377
внутри кавычек. Закроем скобки, чтобы далее не забыть об этом. Затем критерием возьмем год year, скобка, далее поле Date. И вот это значение года из нашей даты платежки должно равняться значению года от нашего сегодняшнего дня new плюс 1, поскольку платежка теоретически пойдет завтрашним числом. Далее and и второй критерий, который здесь тоже необходим, это номер нашей фирмы. Это у нас id_me, и номер нашей фирмы должен равняться соответствующему значению. Его мы возьмем из нашей формы forms. Далее восклицательный знак. Далее frmMain, восклицательный знак и cboMeForNew. Вот, таким образом мы уже полностью сформировали наше условие и новый номер платежки. Но, правда, есть одно обстоятельство - в принципе, у нас может совсем не быть записи, которая удовлетворяет этому условию. В этом случае нам нужно поступить немножко по-другому. А именно, если NewNum больше 0, конечно же, впереди надо написать If, и в этом случае нам к значению, которое мы получили предыдущим образом - NewNum, надо прибавить 1. Напишем равняется, далее NewNum плюс 1. А в другом случае, случае else мы поступим немножко по-другому. Конечно же, NewNum просто присвоим значение 1. Тогда у нас будет номер 1. Далее End If Закроем, конечно же, наш оператор If. Ну и дальше нам нужно выполнить пару действий для дальнейшей работы. Перво-наперво, разрешим добавление платежек. Для этого напишем точку и далее AllowAdditions - разрешить добавление. Далее равняется True, Enter. И затем отключим фильтрацию. Точка, далее FilterOn будет равняться False, фильтрация сейчас нам не нужна. Вот все предварительные действия мы уже совершили. Теперь нам нужно обратить внимание на вот эту переменную rstPlat, которая содержит у нас соответствующую запись Recordset. Поэтому щелкнем на Enter. На этот раз напишем With и вот эта переменная rstPlat. Ну, конечно, если у нас есть With, то нам нужен End With. И теперь начнем заполнение нашей новой платежки и его обработку. Перво-наперво зададим индекс, по которому будем искать платежку. Index равняется и в качестве индекса возьмем первичный ключ - PrimaryKey. Это нас сейчас вполне устраивает. Далее передвинем запись при помощи оператора Seek. Далее в кавычках знак равенства условия, запятая и выберем idCurPlat. Как раз вот это место нам и нужно сдвинуть в нашей записи. Далее считаем текущую запись в соответствующий массив: CurRec, равняется, точка, GetRows(1) - получить первую же строчку. Enter. Ну и, наконец, добавим новую платежку AddNew. Вот в данный конкретный момент у нас сейчас уже образовалась новая платежка. Правда, она пока пустая. Теперь нам ее надо заполнять соответствующими значениями. Теперь будем заполнять поля. Восклицательный знак и далее поле Num - номер, пусть равняется, конечно же, NewNum - новому номеру, который мы только что создавали. Далее Id_me - идентификатор нашей фирмы. Пусть равняется Me. Далее cboMeForNew. Вот соответствующий элемент управления. Вот щелкнем на нем дважды, далее Enter. Далее нам нужен Id фирмы, куда мы перечисляем сумму. Id_Fir. Конечно же, знак равенства. И его мы возьмем из нашей текущей записи, которую мы сохранили - CurRec. Скобка. И нам нужен третий элемент из нулевой строчки. Далее Enter. Теперь нам нужно выяснить, какую мы платежку создадим - "пустую" или "новую,"или такую же, как только что мы видели в нашей форме. Для этого нам нужен оператор If, далее Me, точка, cboNewMode. Щелкнем дважды и, если это значение равняется 1, тогда - than. Во-первых, напишем End If. тут Enter, знак табуляции и продолжим заполнение. Если мы хотим создавать такую же платежку, в этом случае нам нужно выбрать сумму Sum, равняется, такую же, как в текущей записи CurRec.
378
TeachPro Microsoft Access 2003
Она у нас находится на пятой позиции. Далее заполним поле назначения Naz, равняется. Опять CurRec. На этот раз это у нас находится в 7-ой позиции. В принципе, это можно было посмотреть в соответствующей таблице платежек. Далее очередность платежа. Равняется. Опять CurRec, и очередность у нас находится на 8 позиции. Теперь же заполним дату. Дату мы заполним, как текущую дату New плюс 1. Т.е. следующий день после сегодняшнего. Как мы видим, мы допустили ошибку. Конечно же, здесь надо было написать не New, а Now сегодняшний день. Вот, как мы видим, сейчас уже все нормально. Далее срок оплаты. Срок равняется. Он у нас будет просто равен дате, опять завтрашнему числу. Далее вид оплаты. Равняется. Мы его возьмем из CurRec - текущей записи и его 6 поля. Далее вид операции. Мы опять его возьмем из текущей записи и из его последнего 10 поля. Ну и последнее, что мы сделаем, это операция Update. Теперь надо провести еще несколько операций по так сказать закруглению работы нашей процедуры, чтобы все корректно дальше продолжалось. Возьмем опять и напишем With Me. Далее End With и внутри него напишем такие операторы. Во-первых, AllowAdditions. Запретим добавление новых записей. Равняется False, Enter. Далее обновим значение года в поле cboFilterYear, точка, Requery. Вот соответствующая процедура. Далее зададим фильтр года. Точка. cboFilterYear. Зададим его как year - год от опять-таки now плюс 1 - следующего дня. Далее зададим фильтр фирмы cboFirmFilter. Он у нас должен равняться от cboMeForNew. Далее Enter. А теперь проведем фильтрацию. Как мы помним, это у нас происходит reFilter. Вот он у нас, процедура уже описана ранее. Далее поместим фокус на номере, если мы хотим его вручную изменить. Для этого напишем точку. Далее Num, далее точка и SetFocus. Ну и последнее, что нам нужно сделать, - это DoCmd и поместить соответствующую запись на новую строчку. FindRecord, NewNum. Вот таким образом. Запустим теперь нашу форму и посмотрим, как все это работает. Для этого переключимся на Microsoft Access. Закроем Свойства id_plat. Далее запустим нашу форму, щелкнем на кнопку Вид. И теперь попробуем создать такую же платежку. Для этого щелкнем на кнопке Выполнить. Как мы видим, компьютер выдал нам некую ошибку. Посмотрим, в чем сейчас дело. Для этого перейдем в режим конструктора и дальше щелкнем на кнопку Alt+F11, чтобы перейти в Visual Basic. Отключим обработку ошибок. Для этого достаточно здесь написать просто-напросто вот такие кавычки. Далее перейдем опять в Microsoft Access. Запустим нашу форму и попробуем нажать на вот эту кнопку Выполнить. Как мы видим, опять появилась ошибка. На этот раз щелкнем на кнопку Debug, чтобы посмотреть, в какой строчке у нас ошибка. Как мы видим, в строчке определения нового номера. В принципе, если приглядеться, то можно увидеть, что мы просто-напросто неправильно написали слово now. Вместо now написали new. Поэтому исправим эту ошибку. Напишем здесь now. Ну и заодно отметим еще одну ошибку, которую мы допустили, а именно написали Exit Sub совсем в неподходящем месте. Компьютер просто-напросто не будет выполнять все операции после этого. Поэтому удалим эту строчку. А Exit Sub нам нужно было бы написать гораздо ниже, там, где у нас кончается наша процедура и начинается обработка ошибки. Поэтому щелкнем здесь на Enter, и далее напишем End Sub - конец процедуры. Как мы видим, эти изменения приведут к прекращению выполнения нашей программы. А сейчас согласимся с этим. ОК. Нас это вполне устраивает. И включим обратно обработку ошибок. Уберем вот этот знак комментария. Теперь же попробуем выполнить еще раз. Для этого перейдем в Microsoft Access и запустим нашу форму. Щелкнем на вот эту кнопку Выполнить. Запомним, что у нас сейчас 5 номер платежки. Плательщик - Моя первая фирма, строительный материал и т.д. Щелкнем сейчас на кнопке. Как мы
Глава 15. Пример «Платежное поручение»
379
видим, опять возникла ошибка - неопределенная метка. Щелкнем на ОК. Остановим выполнение программы. Посмотрим, в чем дело. Вроде бы мы err описали внизу. Сдвинемся скроллингом ниже и можно увидеть, что мы написали здесь End Sub. А End Sub это окончание процедуры. Вместо End Sub нам нужно было написать Exit Sub. В принципе, исправим, далее переключимся на Microsoft Access, на нашу форму. И еще раз попробуем щелкнуть на эту кнопку Выполнить. И как мы видим, на этот раз у нас все получилось, как надо. Вот получилась дата 09.07.2005 года следующий день. Получился номер платежек максимальный плюс 1 - 11, и все остальные поля точно такие же, как и были. А вот если бы мы вместо "такую же", поставим "пустую" и щелкнем на кнопку Выполнить, то, как мы видим, соответствующие поля у нас не заполнились. Вот в частности, назначение платежа, как мы видим, пустое. Т.е. в результате всех этих действия, мы получили вполне функциональную кнопку Выполнить, добавляющую новую платежку.
15.9. Платежка 9. Настройка календаря Конечно же, после добавления новой платежки неплохо было бы, чтобы мы могли изменять дату. Причем, чтобы изменять дату новой платежки мы могли не вот здесь, в этом месте, а, конечно же, использовать вот этот достаточно красивый календарь. Сейчас, выбирая какую-либо дату, это все никак не отражается на нашей дате. Попробуем это все реализовать. Перейдем в режим конструктора. Далее запустим Visual Basic с помощью Alt+F11, и теперь, щелкнув на вот этом ниспадающем списке, найдем наш календарь. Вот он у нас календарь. Щелкнем на нем. И сразу же появилась процедура Updated. Вместо Updated нам лучше использовать другую процедуру. Поэтому щелкнем на вот этом выпадающем списке, и вместо Updated выберем AfterUpdate. Предыдущую процедуру, которую нам компьютер пытался подсунуть, выделим и, щелкнув на кнопку Delete, удалим. А теперь напишем такие строчки. Во-первых, With Me. Далее End With, знак табуляции и попробуем обновить значение даты. Но перед этим выясним, является ли эта дата так сказать старой, за прошлые года. За прошлые года, в принципе, нехорошо менять платежки, поэтому на этом мы поставим ограничения. Напишем таким образом. If, далее функция Year от нашей даты, точка Date, равняется Year - год от Now, от нашей сегодняшней даты. В этом случае мы имеет возможность изменять дату. Поэтому напишем точка Date, равняется точка и далее наш календарь - Calendar0. Далее точка Srok, срок платежа. Его также надо установить в то же самое значение. Поэтому напишем опять точка и наш календарь. Enter. А теперь закроем наш оператор If при помощи Else. Ну и в противном случае выдадим сообщение MsgBox о том, что старые платежки менять нельзя. Так и напишем - Нельзя менять даты прошлых лет. И в качестве титульного сообщения введем еще, так сказать, усиление этого запрета, написав просто-напросто Нельзя!. И, конечно, после всего этого нам нужно закрыть оператор If при помощи End If. Вот, после всего этого у нас календарь будет работать вполне прилично. Попробуем это проверить, перейдем в Microsoft Access и запустим нашу форму. А теперь, перейдя на соответствующую другую дату, как мы видим, в результате сделанных нами изменений, наш календарь абсолютно перестал реагировать на нажатие мышки. Мы никак не можем изменить дату. Хотя, если мы будем двигаться по нашим записям, дата правильно отображается в календаре. Но календарем пользоваться стало невозможно в режиме редактирования. Посмотрим, в чем дело. Для этого переключимся в режим конструктора. Далее запустим Visual Basic - Alt+F11, и посмотрим, что же мы неправильного сделали в нашей функции.
380
TeachPro Microsoft Access 2003
Дело в том, что если мы будем пользоваться в таком виде нашей функцией обработки с календарем, то вот этот оператор Календарь выдает нам дату не ту, которая находится внутри календаря, а ту, которая выдает ему его источник записи. А источником данных для него является поле Date. Для того чтобы выйти из этого заколдованного круга, нам необходимо написать еще один оператор в начале. Точка, Calendar, далее точка и ControlSource, и вот, в качестве источника записей ControlSource возьмем пустое значение. В этом случае в календаре 0 будет как раз текущее значение, полученное при помощи нажатия мышки. Ну и в конце после выполнения этой процедуры, нам, конечно же, все надо возвратить обратно. Поэтому точка. Далее Calendar, точка, ControlSource, и присвоим ему опять значение даты. Вот теперь уже должно все нормально работать. Посмотрим, так ли это. Для этого переключимся в Microsoft Access. Запустим нашу форму. И можно увидеть, что, передвигаясь по нашему календарю, это автоматически отображается в нашей дате. Ну, и наоборот. Передвигаясь по нашим записям в таблице, мы автоматически получаем то же самое значение в нашем календаре. Т.е. все получилось уже более или менее нормально. Если же мы откроем наши записи за прошлый, например, 2004 год, и попробуем передвигаться здесь, то календарь также работает исправно. А вот попытка изменения данных в платежке за прошлый год вызывает, конечно же, вот такое предупреждение о том, что нельзя менять даты прошлых лет.
15.10. Платежка10. Удаление А теперь же организуем обработку нажатия на вот эту кнопку, кнопку удаления. Сейчас, в принципе, она работает в автоматическом режиме. Так как ее создал нам мастер Microsoft Access. Переключимся для этого в режим конструктора. Далее чуть-чуть расширим это окно, чтобы добраться до соответствующей вот этой кнопки. Щелкнем на правую кнопку мыши и вызовем его свойства. Переключившись на вкладку События, можно увидеть, что по нажатию кнопки будет происходить некоторое событие, процедура обработки этого события. Но, прежде чем перейдем на эту процедуру, изменим название для нашей кнопки. Для этого вызовем все его свойства и изменим надпись. Вместо вот этого безликого нажвания Кнопка 29, напишем, например, аббревиатуру cmd, далее DelPlat - удаление платежки. В принципе, подпись можно не менять, поскольку все равно она не видна. Отображается только вот этот рисунок. Далее переключимся на события и, щелкнув на вот этих трех точках, мы сразу попадаем в Visual Basic и в соответствующую обработку события Click на вот эту кнопку cmdDelPlat. Как мы видим, компьютер уже подготовил несколько строчек кода, который удаляет нашу текущую платежку. Как мы видим, удаление нашей платежки реально происходит при помощи вот этих двух строчек, при помощи которых компьютер обращается к соответствующим строчкам меню Edit. Но мы сейчас немножко изменим эту процедуру и обрабатывать удаление будем несколько по-другому. А вот эти две строчки сейчас просто-напросто закомментируем, написав вот такой апостроф. А теперь напишем таким образом. Во-первых, зададим Recordset, в который у нас будут сконцентрированы возможности по работе с записями в базе данных.
Глава 15. Пример «Платежное поручение»
381
Для этого создадим переменную rstPlat. Далее равняется. CurrentDb - текущая база данных. Точка. Далее OpenRecordset. Откроем. Откроем, конечно же, таблицу платежки, которая, как мы помним, у нас называется tPlat. Эту аббревиатуру поставим в кавычки. А теперь же, после того, как мы создали эту переменную, необходимо, конечно же, перед удалением запросить, правда ли мы хотим удалить нашу запись. Такая предосторожность, конечно же, лишней не является. Вдруг мы случайно нажали на кнопку удаления. Поэтому введем If. Далее MsgBox. Конечно же, требуется некое сообщение. Cообщение у нас будет такое - "удалить эту платежку". Такой текст в принципе, вполне подойдет для соответствующей операции. Далее, конечно же, нужен вопросительный знак, после этого запятая. Теперь следующий параметр - это у нас те кнопки, которые мы хотим вывести при этом вопросе. Это, конечно же, vbYesNo - кнопка подтверждения и кнопка отрицания. Далее запятая. А теперь выведем, что у нас будет в титульном месте этого окошка. Пусть, например, это будет просто-напросто удаление с вопросительным и восклицательным знаком. Ну и далее закроем скобки. Теперь сравним то, что мы получили после вот этого окна с Yes, подтвердим или нет удаление. Напишем vbYes и, если это верно, т.е. удаление подтверждено, в этом случае Then действуем соответствующим образом. Во-первых, создадим With Me, для того чтобы не писать это в дальнейшем. Далее Enter. Далее напишем End With. Закроем With и заодно закроем и If. Для этого напишем End If. А теперь же внутри этих аббревиатур нам нужно написать содержательную часть. Во-первых, разрешим удаление. Для этого точка, AllowDeletions. Вот он. Разрешим удаление записи. Равняется True. После этого нам надо найти соответствующую платежку. Напишем With rstPlat. Далее опять End With, точка и Index. Воспользуемся первичным ключом, который поставим в кавычки. Первичный ключ, конечно же, пишется как PrimaryKey. Далее Enter. Теперь нам нужно сдвинуться на соответствующую платежку. Для этого напишем точка и Seek - операция сдвига. Далее знак равенства, что мы хотим и чему должна равняться наша платежка. Конечно же, эту у нас будет Me и далее Id_plat - номер платежки. Вот, после этого у нас уже спозиционировалась таблица наших платежек на соответствующую строку, которую уже с чистой совестью можно удалить. Для этого точка и Delete. После всех этих удалений, необходимо восстановить некие параметры. Во-первых, восстановим значение в переменную FilterYear. Для этого напишем cboFilterYear. Во-первых, восстановим значение в элементе управления, который задает фильтрацию годов. Для этого точка и далее cboFilterYear. Вот эта переменная. Просто-напросто восстановим. Для этого точка и выполним операцию Requery. Вот эта операция. Далее Enter. А теперь то же самое сделаем со списком. Для этого точка. lstList. Вот этот оператор управления. К нему тоже применим операцию Requery - восстановления. Вот она. Щелкнем дважды. Далее восстановим и все, что находится у нас на форме. Для этого тоже выполним операцию Requery. Вот она появилась перед нами. Щелкнем дважды. И последнее, что можно сделать, - это запретить дальнейшее удаление, чтобы мы не могли удалить каким-либо другим путем платежку. Для этого точка и AllowDeletions - разрешение удаления поставим в False. Равняется False. Щелкнем дважды. Вот после этого у нас уже эта процедура сформировалась и готова к дальнейшему использованию. Посмотрим, все ли сейчас нормально с ним. Для этого переключимся в Microsoft Access, щелкнув на соответствующую кнопку. Свойства вот этой кнопки нам уже не нужны. Закроем и попробуем запустить нашу форму. Для этого щелкнем на кнопке Вид. Вот наша форма запустилась. Добавим какую-либо запись, чтобы не удалять старую. Конечно же, нам нужно для этого щелкнуть на кнопке Выполнить. Она и добавляет новую строчку.
382
TeachPro Microsoft Access 2003
Добавилась новая платежка с номером 14. Если мы перейдем на список, то вот она видна. На ней сейчас находится текущий фокус. Далее обратно переключимся на платежку и щелкнем на кнопку Delete - удаление. Конечно же, появилось вот такое предупреждение, хотим или нет. Если мы сейчас щелкнем на Нет, то мы просто-напросто возвращаемся к нашей форме. Ничего не произошло. А если мы сейчас щелкнем на кнопку Delete, и далее на кнопку Да, то как мы видим, мы перескочили на 5 номер платежки, что означает, что наша новая платежка удалилась. Если мы перейдем на список, то видно, что платежки с номером 14 уже у нас нет. Она была благополучно удалена из списка.
15.11. Платежка 11 15.11.1. Печать (Создание формы и запроса) Теперь же, задействуем в нашей форме обработку процедуры удаления кнопки. Для этого у нас есть несколько элементов управления, которые сгруппированы в нижней части нашей платежки. Во-первых, нам нужно задавать, конечно же, куда мы хотим выполнить печать - на экран или на печать, а также сколько экземпляров мы хотим распечатать. Конечно же, неплохо было бы, во-первых, чтобы у нас по умолчанию какие-либо значения были вот в этих двух combo box сразу же при загрузке нашей формы. Ну и, конечно же, должна работать вот эта кнопка Выполнить, которая сейчас абсолютно бездействует. Нажатие на нее простонапросто никакого действия не выполняет. Переключимся для этого на Вид, на режим конструктора, далее вызовем свойство первого из вот этих combo box. Щелкнем на правую кнопку мыши и свойства. Далее переключимся на вкладку Данные. Здесь, как мы видим, у нас есть свойство Значение по умолчанию, которое сейчас, как мы видим, у нас не задано. Пусть по умолчанию у нас будет 1. Т.е. вывод на экран. Закроем. Вызовем свойство и для количества экземпляров, для этого правая кнопка мыши, Свойства. Как мы видим, мы сразу же попадаем на вкладку Данные, и значение по умолчанию пусть будет 1 экземпляр. Это вполне логично. Закроем. Далее сохраним все это, щелкнув на кнопку сохранения. А теперь можем закрыть эту форму, и если мы ее откроем еще раз, щелкнув дважды на соответствующие возможности, то, как мы видим, сразу же по закрутке, мы по умолчанию получаем соответствующее значение для печати. А именно, вывести на экран и количество экземпляров в количестве 1 шт. Правда, кнопка Выполнить пока опять не работает. Ну, сейчас займемся обработкой события вот этой кнопки. Для этого переключимся обратно в режим конструктора, далее вызовем свойство этой кнопки, правая кнопка мыши и свойства. Прежде всего, конечно же, изменим название этой кнопки, кнопка 26 - это совсем уже глупое название. Для этого перейдем во вкладку Все. Далее вместо имени кнопка 27, напишем, например, cmdPrint, поскольку мы как раз и собираемся печатать при помощи этой кнопки. Теперь перейдем на события и, конечно же, выберем событие Нажатие на эту кнопку. Конечно же, простое, ни двойное, ни кнопка вниз или вверх, а просто нажатие на кнопку, кнопка Click.
Глава 15. Пример «Платежное поручение»
383
Щелкнем на вот этих трех кнопках и выберем, конечно же, программу. Щелкнем на ОК и мы сразу же попадаем в Visual Basic и в соответствующую процедуру обработки сообщения Print_Click. А теперь же здесь напишем таким образом. Во-первых, зададим переменную целого типа. Сделаем это, конечно же, при помощи Dim. Далее i as Integer. Вот появилась соответствующая возможность. Эта переменная нам нужна, как счетчик, для того чтобы мы могли распечатать определенное количество экземпляров. Теперь напишем With Me как обычно, и закроем этот вид при помощи End With. А теперь Enter, знак табуляции и напишем таким образом. Во-первых, нам нужно разобраться в каком режиме мы находимся - в режиме печати или в режиме вывода всего этого на экран. Для этого выберем оператор If, точка. Наш combo box cboPrintMode. Вот этот. Щелкнем дважды и сравним его с единицей. И если этот PrintMode равняется 1, then - то в этом случае выполним команду предварительного показа на экран. А в случае, если это не верно, тогда else и далее напишем End If, мы выведем все это на печать. Но для того чтобы вывести на печать, нам нужно организовать цикл, чтобы вывести его определенное количество раз. Поэтому цикл напишем, конечно же, For i, равняется 1. to, далее точка, cboCopyCount - количество копий. Вот столько раз мы должны выполнить цикл распечатки. Далее, конечно же, next i, и теперь у нас уже все практически готово в этой функции. Осталось только написать вот в этой строчке тот оператор, который будет вызывать предварительный показ распечатки нашей платежки. А вот в этой строчке надо будет написать тот оператор, который выведет на печать уже непосредственно на принтер экземпляр платежки. Для того чтобы все это сделать, нам понадобиться внутри Microsoft Access создать соответствующие экземпляры распечатки нашей платежки в виде отчета. Для этого пока оставим дальнейшее написание процедуры в Visual Basic, но в принципе, предварительно сохранив, щелкнем на кнопку Save, перейдем в Microsoft Access. Закроем вот эти свойства. Закроем и эту форму тоже, пока она нам не нужна. Сохраним ее на всякий случай. Нажмем на кнопку сохранения. Далее закроем нашу форму, щелкнем на вот этом крестике и перейдем в отчеты на соответствующую вкладку. Как мы видим, пока у нас ни одного отчета в нашей базе данных нет. Но, конечно же, при создании отчета нам понадобится какая-либо таблица или запрос, на который мы будем опираться в нашем отчете. Ну и для этого перейдем сперва во вкладку запросы и создадим новый запрос, в котором сконцентрируем все необходимые данные, которые будем использовать в отчете, т.е. в распечатке нашей платежки. Для этого создадим новый запрос. Щелкнем на вот эту кнопку. Во-первых, от нас требуют определиться, какие таблицы мы сейчас использовать. Используем таблицу tPlat. Щелкнем на кнопку Добавить. Далее используем таблицу Firms, щелкнем на кнопку Добавить. Добавим еще одну таблицу фирм, щелкнув на соответствующую кнопку, для того чтобы мы могли идентифицировать обе фирмы, откуда идет платежка и в какую фирму. Закроем теперь. Чуть-чуть изменим местоположение этих таблиц. Например, расставим его вот таким образом. Теперь связку между платежками и вот этой таблицей фирм сделаем немножко по-другому. Выделим ее. Удалим связку и связку сделаем Id_fir с Id_fir в нашей платежке. Вот таким образом. Ну и связку с таблицей фирмы 1 свяжем с нашей платежкой, но на этот раз свяжем с Id_me. Перетащим теперь поля платежек в наш конструктор запросов. Вот сюда. Перетащим данные от фирм, куда идет платежка, и перетащим данные от нашей фирмы, откуда идет платежка. Перетащим еще отдельно Id платежки, для того чтобы мы могли по нему выбрать нужную нам платежку и поставить условие отбора. А условие у нас будет такое. Возьмем, конечно же, для облегчения нашего труда конструктор, щелкнем на вот этой кнопке Построить, далее откроем формы, все формы.
384
TeachPro Microsoft Access 2003
Конечно же, это форма Main, она у нас единственная и далее найдем на ней то поле, которое нам нужно. А именно, поле Id_PLat. Именно эту платежку мы и хотим распечатать. Далее щелкнем на пункте Значения, и это все значение у нас появилось в построителе выражений. Оно нас вполне устраивает и щелкнем на кнопке ОК. После этого осталось нам сохранить этот запрос. Щелкнем на кнопке Сохранить. Далее, вместо запрос 1 напишем qPlat. Поскольку qPlat у нас уже есть, пусть это будет платежка 1, чтобы подчеркнуть, что мы в принципе, выводим всего лишь одну единственную запись. Щелкнем на кнопке ОК. Закроем этот запрос. И он у нас появился в списке запросов. Проверим, как он работает. Если мы сейчас щелкнем на нем дважды, то, конечно же, от нас требует ввести значение параметра, поскольку форма у неактивна. Конечно, мы могли бы ввести значение. Но мы поступим по-другому. Закроем это окно. Откроем нашу форму, вот эту frmMain. Щелкнем на ней дважды. Вот она появилась перед нами, и теперь именно сейчас запустим наш только что сконструированный запрос. Щелкнем дважды. Ну и, конечно же, вот эта платежка с идентификационным номером 7, которая идет под номером 5, и появилась вот в этом запросе. Появилась, конечно же, благодаря нашей форме, на которой у нас она и выбрана. Если мы выберем какую-либо другую и далее еще раз вызовем наш запрос, то, конечно же, появляется запись о соответствующей платежке. В общем, у нас все это работает, и все поля отображены в этом запросе. Закроем теперь запрос, закроем и нашу форму и перейдем к отчетам. Создадим новый отчет
15.11.2. Печать (Создание отчета) Щелкнем теперь на кнопке создания отчета в режиме конструктора. Как мы видим, появился вот такой пока абсолютно пустой отчет, на котором ничего нет. Щелкнем на меню Вид и уберем колонтитулы с помощью команды Колонтитулы, они нам не нужны. Нам нужна только область данных в данном конкретном моменте. Далее щелкнем на правую кнопку мыши и выберем свойства этого отчета, в котором первое, что нам нужно задать, - это источник записи, в качестве которого, конечно же, выберем наш запрос qPlat1. Его мы сейчас как раз и сконструировали для наших целей. Далее закроем эти свойства. Конечно же, автоматически появился список полей, который у нас есть в этом запросе. Раскроем теперь это окошко. Щелкнем для этого на нем дважды и изменим размер этого отчета. Сделаем, допустим, вот таким. И теперь будем потихоньку заполнять эту платежку. Но, перво-наперво, перетащим на наш отчет по платежкам номер. Схватим, перетащим, поместим его вот в этом месте, наверху нашего отчета. Зададим название. Конечно же, просто-напросто Num нас не устраивает, поэтому напишем таким образом. Просто-напросто платежное поручение большими буквами. Далее вставим знак номера. Вот таким образом. Ну и чуть-чуть исправим положение этой платежки. Ну, пусть оно располагается вот в этом месте нашего отчета. Изменим еще и размер шрифта. Вместо, 8 возьмем, например, 10 единиц. И оставим все это вот в таком виде. Передвинем еще и вот этот номер. Разместим его в соответствующем вот в этом месте. Ему тоже зададим шрифт 10 единиц, и сделаем его вот таким жир-
Глава 15. Пример «Платежное поручение»
385
ным. Ну и его чуть-чуть уменьшим. Столько места для одного номера, нам не нужно. Теперь же поместим дату. В качестве этого используем элемент управления Поле для ввода. Поместим его приблизительно вот в этом месте. Вот таким образом. Далее здесь напишем такое выражение: равняется. Далее используем функцию Format для форматирования. Далее скобка и в качестве источника используем значение даты, которую поместим, конечно же, в квадратные скобки, поскольку это у нас поле Даты. Далее точка с запятой. Теперь нам нужно написать строчку форматирования. Форматированием нам нужно вывести число, месяц и год. Поэтому напишем следующим образом. dd точка, mm точка и yyyy - 4 буквы y, чтобы год выводился в полном формате. Далее закроем скобки, вот в принципе, и все, чтобы отобразилась правильно дата. Теперь нам нужно удалить вот эту метку, которая появилась вместе с этим полем для ввода. Для этого выделим ее, щелкнем на кнопку Delete и одновременно изменим формат шрифта, который используется для вывода данных. Опять-таки 8 единиц слишком мало, возьмем 10 единиц. Далее возьмем вид платежа. Вот это поле. Перетащим его. Удалим метку. Или же, в принципе, можно даже не удалять, а использовать ее в нашем отчете. Для этого сперва перетащим вот этот элемент Вид в то место, где он должен стоять, правее нашей даты. Вот приблизительно в этом месте. Зададим ему тоже размер в 10 единиц для шрифта. Далее перетащим его метку, вот в этом месте пусть она стоит. Здесь напишем Вид платежа. Далее поместим еще одну метку, которая будет находиться под датой, и в ней мы напишем дату, просто слово. Далее нарисуем еще вот такую разделительную линию. Зададим ей свойство. В качестве свойства толщину. Для этого выберем свойства и вместо сверхтонкой зададим 1 пункт в качестве ширины. В принципе, этого вполне достаточно для наших целей. Теперь такую же линию поместим под разделителем между видом и видом платежа. Нарисуем его. Зададим теперь сумму. Для этого перетащим соответствующее поле Sum и поместим его не непосредственным перетаскиванием соответствующего поля, а поместим сперва поле для ввода. Поместим его вот в этом месте, таким образом. Зададим еще и надпись, в качестве которой напишем Сумма прописью. Далее чуть-чуть изменим размер и местоположение вот этого элемента таким образом. Зададим еще и шрифт в 10 единиц. То же самое и для вот этой суммы, тоже шрифт в 10 единиц. Далее зададим разделитель, еще один разделитель. В принципе, у нас уже довольно много чего сделано, и для того чтобы ничего неожиданного не произошло с нашим трудом, сохраним на всякий случай промежуточные наши результаты. Щелкнем на кнопку Сохранить. Появляется вот это стандартное окно по заданию имени для нашего отчета. Пусть отчет называется rpt и далее Plat. Щелкнем на кнопку ОК. А теперь у нас уже вот этот текущий вариант платежки, его отчета, сохранен в файле базы данных. Разместим теперь на нашем листе INN нашей фирмы. Возьмем список всех полей. Сдвинемся ниже и вот можем найти вот этот INN. Он как раз и относится именно к нашей фирме, поскольку все поля, относящиеся к нашей фирмы, начинаются с вот этой приставки Firms_1, как мы помним. Перетащим его. Поместим вот в этом месте, впереди напишем INN в метке. Все остальное уберем. Выровняем. Зададим ему тоже шрифт в 10 единиц. То же самое сделаем и для самого поля. Далее поместим полное имя нашей фирмы. Это у нас будет вот это поле Full. Вытащим его. Поставим, в метке напишем плательщик. Далее зададим опять 10 единиц в качестве шрифта и выровняем все это. Плательщик пока сдвинем ниже, а вот саму фирму поместим вот в этом месте и дадим ей, конечно же, гораздо большее место. Например, пусть будет вот такого размера. Теперь подтянем и плательщик, метку. Поместим его вот в этом месте. Шрифт для этого поля сделаем поменьше.
386
TeachPro Microsoft Access 2003
Ну и далее здесь же поместим еще одну разделительную линию. Для того чтобы она стала точно такой же, как вот эта, проще всего ее скопировать. Теперь же сдвинем вот эту линию ниже. Ну, вот, например, вот в этом месте. Сдвинем еще и вправо, чтобы выровнять. Поместим еще и сумму платежа, и номер счета. Для этого найдем соответствующие поля. Поле Сумма. Поместим его вот в этом месте. Опять выровняем, метку поместим вот сюда. Вместо слова Sum английскими буквами напишем слово Сумма русскими буквами, шрифт зададим в 10 единиц. Чуть-чуть раздвинем. То же самое - шрифт зададим и для нашего поля, в котором реально выводится соответствующее значение. Выровняем все это вот таким образом. Разместим теперь номер счета нашей фирмы. Вот это поле Расчетный счет. Поместим, изменим название, которое отображается на этой метке. Напишем счет и номер. Опять все это выровняем. Зададим шрифт в 10 единиц. То же самое касается, конечно же, и самого счета. Сдвинем чутьчуть вот эту панель инструментов и список полей. Нарисуем еще несколько разделительных линий. Например, вот такую вертикальную. Еще одну вертикальную линию и еще одну горизонтальную. Теперь нам надо на нашем отчете поместить информацию о наших банках, в которых у нас находится счет. Но надо отметить, что, если мы посмотрим на наш список, список полей, то информация о банках здесь, к сожалению, отсутствует. Поэтому, судя по всему, нам придется доработать наш запрос qPlat1, на основе которого мы сделаем наш отчет. Для этого, во-первых, сохраним все то, что мы сделали в нашем отчете, в нашей платежке. Щелкнем на кнопке сохранения. Далее закроем сейчас это окошко. Перейдем во вкладку Запросы и откроем вот этот запрос qPlat1. Откроем его в режиме конструктора, щелкнув на соответствующую кнопку и добавим теперь еще пару полей, конечно же, связанных с банками. Для этого щелкнем на правую кнопку мыши, далее Добавить таблицу. Добавить нам, конечно же, нужно таблицу, связанную с банками, поэтому лучше всего переключиться на запросы, где у нас есть qBanks. Здесь сконцентрирована вся информация о наших банках и их филиалах. Щелкнем на кнопке Добавить, еще один раз щелкнем. Два раза нам нужно, потому что банк есть и у фирмы и у нашей фирмы тоже. В принципе, для того чтобы было более понятно, поменяем вот эти две таблицы местами, чтобы, так сказать таблицы с единицами были вместе и таблицы без 1 тоже были вместе. Теперь свяжем соответствующим образом таблицы друг с другом. Сдвинемся ниже и найдем идентификатор банка Bank fil. Свяжем его, конечно же, с Id_fil. Теперь ту же самую операцию сделаем и с той фирмой, куда должна идти платежка. Найдем Bank fil и свяжем его с Id_fil. После этого мы можем уже оперировать всей информацией, связанной с банками. Во-первых, поместим эту информацию в выходном файле, который конструирует наш запрос. Потащим вот эту звездочку. Вот вся информация будет писаться в соответствующем месте, и далее поместим информацию о банке, связанном с нашей фирмой. Тоже потянем вот эту звездочку и поместим в соответствующем месте нашего запроса. Вот, после этого все эти изменения уже вполне адекватно будут отображать все нужные нам поля, поэтому сохраним запрос, щелкнув на кнопке сохранения. Закроем теперь этот запрос, щелкнем на крестике. Перейдем опять в отчеты и откроем нашу платежку. Конечно же, откроем ее в режиме конструктора, и если мы сейчас сдвинемся в самый конец нашего списка полей, то можно увидеть здесь информацию о банках. Нас, конечно же, сейчас пока интересует информация о банке 1. Это и есть банк, связанный именно с нашей фирмой.
Глава 15. Пример «Платежное поручение»
387
Для того чтобы разместить эту информацию, во-первых, поместим сперва на нашу платежку поле для ввода. Например, вот в этом месте. Пока все равно где. Сейчас будем его выравнивать. Метку сдвинем ниже. Само же это поле разместим таким образом, выровняем. Метку поместим под ним и напишем здесь Банк плательщика. Далее зададим шрифт для банка в 10 единиц. И здесь разместим такую информацию. Знак равенства и далее строковая переменная, которая получается сцеплением имени банка с его именем филиала. Поэтому напишем таким образом внутри квадратных скобок. Конечно же, нам нужно написать qBanks_1, точно так же, как и написано вот в этом месте в списке поле - черточка 1. Далее точка и поле Name - имя. Затем надо сцепить все это дело, конечно же, во-первых, с пробелом. Нельзя слеплять имя банка и имя филиала совсем вплотную друг к другу. И далее в квадратных скобках напишем имя филиала, которое получается опять-таки qBanks_1, точка и далее полное имя, т.е. Fill. Далее здесь проведем опять горизонтальную линию, вот таким образом. Далее нам нужно разместить информацию о банке, куда мы перечисляем деньги. Проще всего скопировать соответствующие поля, выделим их, нажимая на Ctrl вместе с вот этой черточкой. Далее, после того, как мы все это выделили, щелкая на соответствующие элементы, и, не отпуская кнопку Shift, щелкнем на правую кнопку мыши и выберем пункт Копировать. Далее встанем вот сюда, например, правая кнопка мыши и Вставить. Конечно же, все это у нас появилось в верхнем левом углу. Сдвинем ниже, вот таким образом, при помощи, например, клавиатуры и выровняем так, как нам нужно, нажимая на клавиатуре кнопки со стрелками. Ну, конечно же, сейчас здесь нам нужен не банк плательщика, а банк получателя, поэтому исправим. И исправим также вот эту формулу. Здесь нам надо всего лишь убрать вот эти единицы. Это все, что требуется для исправления, чтобы банк плательщика превратился в банк получателя.
15.11.3. Печать (Изменение интерфейса отчета) А теперь необходимо поместить в нашу платежку информацию о BIK и кор.счете банка. Для этого тут немножко по-другому сформируем линии. Вытянем вот эту вертикальную линию тоже ниже. И вот эту вторую вертикальную линию тоже. Вставим еще пару горизонтальных линий вот в этом месте. И чуть пониже тоже. Теперь нам нужно найти информацию о BIK нашего банка сперва. Вот найдем его в этом месте qBanks_1.BIK. Вытащим его. Поместим. Изменим информацию на нашей метке. Напишем просто-напросто, конечно же, БИК. Метку сделаем чуть поменьше. Такая большая не нужна. И сдвинем его, чтобы оно располагалось там, где мы хотим. Саму информацию, так сказать, ее существенную часть, тоже сдвинем. Зададим шрифт в 10 единиц и для БИК, и для банка. Теперь нам нужно поместить вот этот кор.счет. В качестве текста наберем счет №. Конечно же, эту метку тоже можно сократить вот таким образом и разместить в соответствующем месте. Саму информацию о банке тоже, вот счет в банке тоже сдвинем. Конечно же, шрифт изменим и в метке, и в самом счете. А теперь нам нужно разместить чуть пониже информацию о фирме получателя.
388
TeachPro Microsoft Access 2003
Конечно, можно все это размещать и выравнивать, но проще скопировать то, что у нас уже есть. И в дальнейшем изменить источник данных, изменив поля. Предварительно чуть-чуть увеличим размер нашей платежки, чтобы все у нас поместилось. Теперь схватим те поля, которые нам нужны. Это, конечно же, INN. Нажмем на Shift, далее название фирмы. Слово вот это Плательщик. После того. как мы все это выделили, правая кнопка мыши, далее Копировать. Щелкнем на пустом месте. Правая кнопка мыши и Вставить. А теперь всю эту информацию сдвинем ниже, нажимая на кнопки на клавиатуре со стрелками. Выровняем и левый край тоже. Вот уже все у нас более или менее получилось. А теперь надо все это исправлять. Во-первых, изменим фирму INN. Это, конечно же, должно быть не Firms1, а самой фирмы. Т.е. другое поле нам тут требуется. Для этого щелкнем на правую кнопку мыши и вызовем его свойства. И в данных щелкнем на вот этом ниспадающем списке и выберем tFirms.INN. Вот это поле. Закроем. А теперь исправим полное название фирмы, щелкнем на свойствах. И в данных возьмем другое поле, поле tFirms.Full. Вот это поле. Закроем. Вместо слова Плательщик напишем слово Получатель. Щелкнем где-либо и, в принципе, уже этот блок у нас тоже готов. Проведем еще одну горизонтальную линию. Проще всего, ее, конечно же, скопировать. Выделим вот эту линию. Правая кнопка мыши, Копировать. Далее, правая кнопка мыши и Вставить. Сдвинем теперь то, что у нас вставилось пониже. Теперь еще стянем вот эту вертикальную линию, которая у нас здесь находится, до самого низа. Вот до этого места. То же самое со второй линией. В принципе, сейчас наша разметка практически не видна на фоне сетки, поэтому имеет смысл хотя бы сетки отключить. Поэтому щелкнем на пункте Вид и далее выполним команду Сетка. И теперь, после этого, конечно же, гораздо лучше видно взаиморасположение элементов на нашей платежке. Проведем еще одну горизонтальную линию вот в этом месте, для того чтобы разместить наш расчетный счет. Для этого выделим, например, вот эту линию. Далее скопируем ее, правая кнопка мыши и Копировать. Далее правая кнопка мыши и Вставить. Далее сдвинем эту линию. В принципе, видно, как она у нас двигается. И вот такое местоположение нас уже вполне устраивает. Теперь же разместим в нижней части информацию о БИК и кор. счете банка получателя. Для этого проще всего, конечно же, скопировать соответствующие поля. Выделим вот эти два поля. Выделим и счет тоже. Вот все эти 4 элемента управления, после того, как мы выделили, нажав на кнопку Ctrl, и далее выделяя мышкой, теперь скорируем с помощью правой кнопки мыши и команды Копировать. Теперь правая кнопка мыши и Вставить. В принципе, пока эти элементы не видны, поскольку у нас платежка чуть-чуть сдвинута, и выходит за границы экрана. А вставилось все это в верхней части нашей платежки. Поэтому опять-таки сдвинем при помощи кнопок со стрелками на нашей клавиатуре. Вот все это у нас сейчас появилось в видимости части нашей платежки. Теперь сдвинем еще и правее. И окончательно выровняем в этом месте. После этого, нам, конечно же, необходимо изменить банк 1 на просто Банк, поэтому выделим вот этот элемент. Правая кнопка мыши и Свойства. Далее выберем соответствующее поле, не Banks_1.BIK, а просто Banks.BIK. Закроем свойства. То же самое с кор. счетом. Правая кнопка мыши, свойства, данные и далее кор.счет банка. Закроем. А теперь нам нужен счет нашей фирмы, расчетный счет, опять-таки скопируем его из вот этого места. Выделим и метку. Далее нажмем на Shift, и, не отпуская, еще и расчетный счет фирмы тоже. Правая кнопка мыши, Копировать. Далее встанем где-либо, правая кнопка мыши и Вставить.
Глава 15. Пример «Платежное поручение»
389
Вот появилось в этой верхней части нашей платежки. Конечно же, здесь она нас не устраивает. Поэтому сдвинем в нужное нам место, и выровняем при помощи кнопок на нашей клавиатуре вот до такого состояния. В принципе, мы уже довольно много чего сделали. Посмотрим, как все это будет выглядеть в режиме выполнения отчета. Во-первых, чтобы не произошли какие-либо не предвиденные обстоятельства, сохраним всю нашу работу, щелкнем на кнопке сохранения. Далее щелкнем на кнопку Вид. Конечно же, поскольку у нас наша форма frmMain не открыта, компьютер запрашивает значение параметра Id_Plat. Введем, например, число 1, чтобы отобразилась первая из платежек. Щелкнем на кнопку ОК, и можно видеть, как при этом будет выглядеть наша платежка. Пока, как мы видим, все более или менее нормально, единственное - вот поля для разного рода счетов, конечно же, немножко не хватило. Поэтому нам придется чуть-чуть расширить вот это место, сдвигая соответствующие линии, элементы управления и их ширину вправо.
15.11.4. Печать. Параметры страницы Имеет смысл, конечно же, еще и подравнять вид платежа и дату. Перейдем в конструктор и попробуем все это подкорректировать. Во-первых, сдвинем метку даты правее. Вот таким образом. Выравнивание даты сделаем по центру. То же самое и для вида оплаты. А теперь расширим поля для всех наших счетов. Во-первых, уберем поля доступные и элемент управления. Они нам сейчас только мешают. Теперь же, после того, как мы выровняли все поля, для того чтобы все это помещалось на нашем листе, зададим размеры листа при распечатке. Для этого щелкнем на пункте меню Файл, далее пункт Параметры страницы и здесь изменим поля, которые мы отводим под нашу распечатку. Ну, конечно же, то, что здесь есть по 25 мм - это слишком много, по крайней мере, для нашего конкретного случая. Зададим, например, от верхнего поля 10мм. Что мы зададим от нижнего поля, в принципе, особого значения не имеем, поскольку платежка в любом случае поместится на листе. Далее левый отступ зададим 10 и правый отступ, ну, например, 6 мм. Все остальное оставим без изменения. Щелкнем теперь на кнопку ОК. И посмотрим, что у нас в результате получилось. Щелкнем на кнопку Вид, зададим какую-либо платежку. Опять-таки, например, первую, щелкнем на ОК и можно увидеть, что у нас получилось в результате. Теперь, как мы видим, у нас все поместилось на нашем листе. Перейдем теперь обратно в конструктор, и продолжим заполнение этой платежки соответствующими полями. Вытянем вот эту линию и разместим здесь несколько элементов. Возьмем такое поле, как Вид операции. Поместим его вот сюда. Метку сдвинем, расширим ее. Нам тут понадобится довольно большое пространство, поскольку тут надо будет написать три строчки. Во-первых, вид оплаты. Далее назначение платежа и далее кор. Как мы видим, все это у нас не поместилось. В принципе, надо отметить, что вот этот шрифт в 8 единиц достаточно маленький, поэтому расширим соответствующие поля. Вот в таком виде все это уже у нас поместилось в соответст-
390
TeachPro Microsoft Access 2003
вующее место. Теперь вот этот вид оплаты разместим в соответствующем нужном нам месте. Вот сюда. И, конечно же, место под него уменьшим очень сильно. В принципе, до такого размера. Конечно же, при этом от этого поля остался один вот этот треугольник. В принципе, все достаточно аккуратно и нормально. Разместим теперь еще здесь один элемент управления. Для этого схватим его, поместим вот в этом месте. Сдвинем. Вместо поле 46 напишем опять несколько строчек. Во-первых, тут нам нужен срок платежа. Далее Shift+Enter. Следующая строчка у нас будет Очередность платежа. Очер точка плат точка. Далее опять Shift+Enter, и следующая строчка будет резервное поле, рез точка поле. Разместим теперь Срок платежа вот в этом поле. Сдвинем вот до такого состояния. Теперь напишем здесь следующим образом. Знак равенства. Далее Format. В принципе, мы будем писать практически то же самое, что мы писали, когда хотели вывести дату платежа. Format. Далее скобка. Далее то поле, которое мы хотим выпечатать, в квадратных скобках напишем поле Срок. Далее точка с запятой. И внутри кавычек напишем dd точка, mm точка и 4 У, чтобы вывести два знака для дня, два знака для месяца и 4 знака для года. Закроем скобку и в принципе все. Разместим еще очередность платежа. Здесь просто схватим соответствующее поле, разместим здесь. Метка нам сейчас не нужна, поэтому выделим и, щелкнув на Delete, удалим. Далее уменьшим вот это поле и сдвинем его, чтобы оно выравнивалось относительно соответствующей надписи Очередность платежа. Теперь подравняем вот эти горизонтальные линии. Нарисуем еще вертикальные две линии, чтобы разделить вот эту область на 3 ячейки. Схватим линию. Нарисуем ее. Нарисуем еще одну вертикальную линию. И посмотрим, что в результате всего этого дела у нас получилось. Для этого щелкнем на кнопку Вид, зададим какую-либо платежку, например, 1, щелкнем на ОК и вот, что у нас получилось. В принципе, у нас уже все более или менее нормально. Единственное, конечно же, что необходимо сделать, - это разместить информацию о назначении платежа. Переключимся в Вид, чтобы попасть в конструктор. Сдвинем все это дело. Расширим платежку. В принципе, исправим еще одну маленькую неточность, которая у нас закралась. А именно, вот эта вертикальная линия, если приглядеться в отчете, была не совсем вертикальной. Поэтому выберем ее, правая кнопка мыши, выберем ее свойства, далее Макет и можно увидеть, что у нас в качестве ширины задается некое количество сантиметров. Конечно же, это неправильно. Нам нужно задать 0. В этом случае у нас линия будет абсолютно вертикальной. Закроем. Разместим здесь поле Назначение. Метку сдвинем наверх. Уберем сперва, конечно же, панель инструментов и наименование полей. Вот здесь у нас будет некий текст. Текст, в принципе, достаточно длинный, поэтому расширим вот это поле. А напишем здесь вот такой текст. Назначение платежа запятая, далее наименование товара, запятая, выполненных работ, запятая, далее номера и суммы товарных документов, запятая. И последним идет НДС. И двоеточие. Вот, в принципе, весь текст, который здесь должен поместиться.
15.11.5. Печать (Запись численного выражения прописью) А теперь поместим здесь же и назначение. Сдвинем его вот таким образом. Расширим это поле. Проведем теперь горизонтальную линию. Проще всего ее скопировать вот отсюда. Выделим. Правая кнопка мыши Копировать. Далее встанем вот здесь. Правая кнопка мыши и Вставить. Сдвинем ниже эту линию, вот сюда.
Глава 15. Пример «Платежное поручение»
391
Ну и нам необходимо еще несколько меток, первая из которых будет отмечать место для печатки. Например, вот в этом месте. Здесь мы пишем МП, место печати. Далее еще одна метка подписи. Шрифт зададим, как всегда, в 10 единиц и для места печати и для подписи. Далее отметки банка. Тоже шрифт в 10 единиц. Чуть-чуть сдвинем, выровняем все эти три элемента относительно друг друга. Для этого выделим их все. Далее Формат, выровнять, и, допустим, выровняем по верхнему краю. Вот теперь мы можем полностью быть уверены, что все эти три надписи находятся на одном уровне. Посмотрим теперь, что у нас получилось. Для этого переключимся в Вид. Нажмем на кнопку Вид. Зададим номер платежки. Например, опять 1. ОК. И вот, результат всего, что у нас получилось. Щелкнем и можем оценить нашу платежку в виде листа. Единственное, конечно, что мы еще не доделали, это, конечно же, сумма прописью, для отображения которой в принципе придется написать достаточно объемную, хотя и не очень сложную процедуру. Эта процедура будет переводить численное выражение в ее словарный эквивалент на русском языке. Сейчас, чтобы с этим не возиться, простонапросто отобразим здесь такой же текст, как и в месте суммы, т.е. без прописи. Переключимся в конструктор и в свободном поле напишем просто-напросто равняется и поле Sum. В этом случае, конечно же, слов суммы у нас прописью не будет, а будет просто Сумма. Посмотрим, так ли это. Переключимся обратно в Вид. Зададим, например, первую платежку. ОК. И вот эта сумма 110 появилась, правда, немножко в другом виде, без рубля и без точек. Перейдем в режим конструктора и единственное - просто-напросто здесь припишем слово руб. Для этого, конечно же, нам понадобится знак сцепления, далее кавычки и руб. И далее точка. Сдвинем вот эти платежки. В принципе, сейчас уже видно, что мы сделали. Теперь же, в принципе, оставим уже вот эту платежку в таком виде. Щелкнем на кнопку сохранения. Закроем. Запомним название нашего отчета rptPlat. Свернем немножко нашу базу данных и откроем нашу форму. Переключимся на формы. Далее запустим вот эту форму frmMain в режиме конструктора, щелкнув на соответствующую кнопку. А теперь перейдем в Visual Basic, для этого щелкнем на Alt+F11. И найдем ту процедуру, которая у нас возникала при нажатии на кнопку печати. Для этого сдвинемся скроллингом. Вот эта процедура Print_Click. Тут, как мы помним, мы оставили места, где нам нужно прописать название нашего отчета. Во-первых, нам нужно написать, что будет происходить при предварительном показе, если PrintMode равняется 1. Но, напишем таким образом. DoCmd, точка. Далее нам нужно открыть наш отчет OpenReport. Вот появилась эта команда. Щелкнем на ней дважды. Далее надо задать имя нашего отчета. Это, как мы помним, будет rptPlat. Далее запятая и далее нам нужно задать, в каком режиме мы хотим распечатывать. Конечно же, пока нам нужно в режиме Preview. Щелкнем на соответствующей возможности. Щелкнем дважды. А теперь зададим то же самое в случае уже непосредственной печати. Напишем опять DoCmd, точка. Далее OpenReport. Щелкнем дважды. В качестве отчета, конечно, нам опять нужно rptPlat. Далее запятая и на этот раз нам нужно ViewNormal, т.е. именно распечатка. Вот, после этого, у нас уже эта кнопка должна вполне адекватно работать. Переключимся в Microsoft Access и запустим эту форму. Щелкнем на кнопке Вид и попробуем распечатать вот эту
392
TeachPro Microsoft Access 2003
платежку, на которой мы сейчас находимся. Щелкнем на кнопке Выполнить, и вот можно увидеть результат наших усилий. А именно, распечатка нашей платежки. Как мы видим, мы распечатку получили в окне на экране. В принципе, оно и понятно, поскольку у нас было задано вывести на экран. А если бы мы задали - вывести на печать, в этом случае, конечно же, при нажатии на эту кнопку, сразу же заработал бы наш текущий принтер. Сейчас мы этого делать не будем, а попробуем вывести на экран еще какую-либо платежку, выбрав его из списка. Например, вот эту платежку с номером 9. Если мы переключимся обратно сейчас на платежку, конечно же, эта платежка с номером 9 стала текущей, а щелкнув на кнопку Вывести на экран, мы получаем на экране платежку. Расширим теперь эту платежку, щелкнув на вот этом плюсе. Проще всего щелкнуть около номера, но, как мы видим, вместо 9, мы опять получили 5 платежку. Дело в том, что для того чтобы получить именно текущую, нам надо закрыть вот это окно отчета. И теперь щелкнем на кнопку Выполнить распечатку. И на этот раз мы как раз и получаем нашу 9 платежку со всеми своими атрибутами - с плательщиком, получателем, банком и т.д. Все, в принципе, как раз расположено так, как мы и задумывали. Закроем теперь эту платежку и щелкнем на вот этой кнопке, чтобы привести нашу форму в обычный вид.
15.12. Платежка 12 15.12.1. Фирмы. Создание форм Мы в нашей базе данных уже создали одну форму frmMain. Если мы ее откроем, щелкнув дважды на соответствующей кнопке, то можно увидеть, что представляет собой эта форма. Это форма с двумя вкладками, в которых мы можем просматривать платежки и весь список платежек. Но стоит еще один вопрос. Как же нам быть, если нам нужно что-либо изменить или отредактировать в списке наших фирм, в соответствующей таблице. Для этого мы можем создать еще одну форму, в которой сконцентрируем все возможности по редактированию списка фирм. Или же, пойдя дальше, можем сконструировав эту форму, поместить ее в эту форму frmMain в качестве еще одной вкладки. Ну, посмотрим, как все это у нас будет происходить. Закроем вот эту форму frmMain и создадим новую форму. Зададим ее, конечно, в режиме конструктора. Для этого щелкнем дважды на соответствующей кнопке, раскроем ее на весь экран и чуть-чуть увеличим размер, который есть у нашей формы. Исходный размер, который у нас был, конечно же, нас не устраивает. Он слишком маленький. Для того чтобы мы могли сейчас получше ориентироваться внутри вот этой формы, включим опять режим показа сетки. Для этого щелкнем на пункте меню Вид. Далее сетка. И вот она у нас появилась перед нами. В таком режиме, конечно, проще вставлять элементы управления, выравнивать их относительно друг друга. Перво-наперво, зададим источник данных для вот этой формы. Для этого щелкнем на правую кнопку мыши. Далее откроем ее свойства.
Глава 15. Пример «Платежное поручение»
393
Перейдем в Данные и в качестве источника данных возьмем таблицу фирм tFirms. Щелкнем, закроем вот эти свойства. Конечно же, список полей у нас автоматически сразу же появился перед нами. Первое, что нам необходимо, - это Id нашей фирмы. Перетащим его и расположим на нашей форме. Метку удалим, выделив и щелкнув на кнопку Delete.Само вот это поле поместим в левом верхнем углу. И, конечно же, уменьшим место, которое отводится под него. В принципе, здесь достаточно короткая информация. Разместим теперь на нашей форме еще и combo box, при помощи которого мы можем переходить к соответствующей записи, выбрав ее из списка, появляющемся в этом combo box. Для этого нам этот combo box, конечно, нужно создать, создать из панели инструментов. Выберем combo box c раскрывающимся списком. Щелкнем на соответствующей кнопке. Нарисуем его. Сразу же, как мы видим, появился мастер, помогающий нам создавать этот combo box и его содержимое. Щелкнем сейчас на кнопке Далее, поскольку нас как раз и устраивает тот случай, который здесь отмечен. Т.е. использовать значение из таблицы или запроса. Появляется теперь окошко, в котором нам нужно выбрать таблицу или запрос, который будет источником данных. Выберем, конечно же, таблицу tFirms. Щелкнем на кнопку Далее. Теперь нам нужно выбрать доступные поля. В качестве доступных полей выберем 3 первых поля - ID фирмы, моя или не моя, и полное имя. Теперь щелкнем на кнопку Далее. В принципе, мы можем сортировать значения или оставить их в том порядке, в котором они вводились. Сортировать мы можем по каждому из пунктов. Т.е. по ID, по моему или не моему, или же по полному наименованию. Допустим, сортировать будем по типу моя или не моя фирма, а затем в качестве второго значения - полное имя. Щелкнем теперь на кнопку Далее. Теперь появляется тот вид, который будут иметь столбцы вот этого нужного нам списка. Как мы видим, сейчас стоит галочка на скрытии ключевого столбца. В принципе, конечно же, он визуально дает мало какую информацию. Щелкнем теперь на кнопке Далее, оставив все как есть. Ну и сохранить в поле все это дело нам не нужно. Щелкнем на кнопке Далее. Ну и щелкнем на кнопке Готово. В результате вот этот combo box появился перед нами. У него в принципе есть еще метка. Перетащим его чуть правее и здесь напишем следующие слова - Перейти к. Уберем ту надпись, которая здесь есть и теперь зададим шрифт для наших элементов управления не 8, а 10 единиц. То же самое для Id фирмы, поскольку 8 единиц уж слишком мелкий шрифт. Если мы сейчас запустим нашу форму, щелкнув на кнопке Вид, то можно увидеть, что в этом combo box, если мы раскроем список, находятся все фирмы. Причем, и те, которые являются моими и все остальные тоже, причем все это находится в порядке возрастания, сперва моя или не моя фирма, т.е. мои фирмы, потом не мои, а далее идет сортировка по полному названию фирмы. В принципе, в этом combo box, конечно же, вот эта первая колонка лишняя. Поэтому перейдем при помощи кнопки Вид в режим конструктора, далее вызовем свойства этого поля. Затем, перейдя во вкладку Макет, изменим ширину второго столбца. Вместо 2.54 напишем 0 см. И увеличим размер под третью колонку. Пусть будет 5 см. После этого у нас будет выводиться в наш combo box только полное название фирмы. Закроем теперь эти свойства. Конечно же, перед этим изменим имя, поскольку названия Поле со списком, в принципе, нас явно не устраивает. Переключимся на Все, и вместо Поле со списком напишем cbo и далее ChoodeFirm - выбор фирмы. Вот соответствующее имя, после того, как мы перещелкнули мышкой, появилось в качестве названия фирмы. Закроем теперь эти свойства и займемся расположением остальных элементов на нашей форме.
394
TeachPro Microsoft Access 2003
15.12.2. Фирмы. Редактирование формы Во-первых, мы видим полное имя фирмы, вот это поле Full. В метке напишем соответствующий текст - Полное имя. Далее чуть-чуть изменим местоположение метки и самого элемента. Конечно же, увеличим и то место, которое отводится под него, т.е. ширину. Зададим еще и шрифт, вместо 8 10 единиц, как всегда. Вот, после всех этих изменений, наша форма принимает такой вид. Теперь разместим на нашем поле краткое наименование. Это тоже достаточно интересная информация для нас при работе с фирмами. Перетащим вот этот Nick. Зададим для него тоже шрифт в 10 единиц, и для поля и для метки. Перетащим и выровняем, вместо Nick напишем слово Кратко. Далее перетащим и вот это соответствующее поле. Конечно же, перетаскивать надо за левый верхний прямоугольник, иначе будет перетаскиваться не только поле, но и его метка. Мы хотим выровнять сейчас только поле. Ну вот, теперь чуть-чуть расширим до такого состояния, например. В принципе, краткое имя здесь поместится. А теперь поместим галочку - Моя эта фирма или нет. Для этого перетащим поле Mine. Напишем здесь Моя и разместим в соответствующем месте. Так вот перетащим. Далее разместим еще и INN нашей фирмы или же любой другой фирмы, так сказать, INN фирмы. Вот мы его разместили. Во-первых, метку, конечно же, сдвинем, разместив вот в этом месте, и изменим название, которое находится на этой метке. INN напишем русскими буквами. Конечно же, шрифт опять зададим в 10 единиц. В принципе, то же самое сделаем и для вот этой галочки. Изменим еще и шрифт для поля INN. Теперь разместим INN чуть повыше, перетащим. И выровняем. В принципе, видно, конечно же, что метка моя и INN слишком придвинулись друг к другу. Конечно же, вот это название Моя, лучше бы поменять вот этой галочкой. Сейчас так и сделаем. Галочку сместим правее, а название Моя поместим левее. В принципе, мы уже закончили с теми данными, которые относятся конкретно к фирме, поэтому всю вот эту группу данных не плохо было бы объединить в рамочку. Для этого нарисуем вот этот элемент управления - группа переключателей, вот в этом месте. Вот таким образом, группируя все эти элементы. Ну, здесь у нас появляется мастер создания группы переключателей. Он нам сейчас абсолютно не нужен. Щелкнем на кнопку Отмена. Вместо группы 7 напишем здесь в качестве имени просто-напросто Общие. Далее закроем, переименуем еще и вот это название, которое вот здесь появилось. Тоже напишем Общие. Чуть-чуть расширим. Ну вот, в таком виде это уже нам вполне устроит. Теперь разместим следующую группу данных, связанных с банком. Опять-таки разместим вот такую рамку. Проще всего ее скопировать. Выделим вот это все. Правая кнопка мыши далее копировать. Правая кнопка мыши и далее Вставить. Сместим все это ниже при помощи клавиш на клавиатуре. И разместим, например, вот таким образом. Теперь, конечно же, вместо слова Общие, здесь напишем банковские реквизиты. И теперь будем сюда вставлять соответствующие элементы управления. Перво-наперво, конечно же, разместим полное имя банка. Для этого перетащим вот это поле Bank_fil.
Глава 15. Пример «Платежное поручение»
395
Далее в метке напишем Банк. Сместим все это вот таким образом. Зададим шрифт, опять-таки, конечно же, 10 единиц. То же самое и для соответствующего отображаемого поля. Далее все это сдвинем повыше. Расширим чуть-чуть. Расширим и в ширину тоже. А теперь займемся тем, что уже отображается в этом поле. Для этого щелкнем на правую кнопку мыши. Далее свойства. И, как мы видим, это поле опирается у нас на соответствующий запрос с Select- ом. Причем, если присмотреться, можно увидеть, что первое поле у нас является невидимым, а реально отображаются все данные, начиная со 2 поля. Рассмотрим этот Select подробно. Щелкнем на вот этих трех точках. И видно, какие данные сейчас у нас доступны в данный конкретный момент. Это Id банка, Id филиала, далее название филиала, далее город, где находится филиал и кор. счет. В принципе, этих данных нам не достаточно, поэтому закроем вот этот запрос, щелкнув на вот этом крестике и в качестве источника данных выберем, щелкнув на вот этом выпадающем списке, запрос qBanks. В нем находится гораздо больше информации, как мы помним. Если мы сейчас щелкнем на вот этих трех точках, то можно увидеть, что, конечно же, запрос qBanks состоит из обеих таблиц - и таблиц банков, и таблиц филиалов. Соответственно здесь есть все поля. Конечно же, посмотрев на вот этот запрос, неплохо было бы запомнить номера соответствующих колонок. Они нам понадобятся при отображении соответствующих данных. Как мы видим, нулевая колонкой, которая здесь есть у нас, - это ID филиала. Она нам, конечно же, в принципе, не понадобится. А вот далее идут существенные колонки. Первая из колонок - это колонка Полное имя филиала. Затем вторая - это колонка город. Третья - это кор. счет. Четвертая - это имя. И 5 колонка - это BIK банка. Закроем теперь этот запрос, здесь нам ничего менять не надо. Теперь изменим ширину, которую мы задаем мы в наших полях. Конечно же, нас интересует только колонка с именем банка. Поэтому все остальным зададим длину 0 см. А в 5 колонке напишем, например, 5 см. Вот, таким образом, уже мы отобразим именно название банка в этом элементе управления. Число столбцов зададим, например, 6 единиц и закроем эти свойства. А теперь нам нужен BIK нашего банка, поэтому возьмем поле для ввода. Разместим его, например, вот в этом месте. Далее зададим ширину шрифта в 10 единиц. То же самое и для метки. Выровняем. Вместо поля 21, напишем Бик. Далее зададим, что у нас будет отображаться в этом поле. Напишем следующим образом. Знак равенства, далее Bank_fil, точка и далее та колонка, которая нам тут нужна - column, и в скобках напишем колонку номер 5. Именно в пятой колонке у нас отображается BIK этого банка. Теперь разместим город. Но, опять-таки, чтобы все это не переписывать, выделим это поле. Далее щелкнем на правую кнопку мыши и далее Копировать. Щелкнем где-либо. Далее правая кнопка мыши и Вставить. Сдвинем этот элемент управления в нужное нам место. Вот эта метка нам сейчас не нужна. Выделим только вот эту метку, и щелкнем на кнопку Delete. Теперь пододвинем к левому элементу, к названию банка. В качестве номера колонки сейчас нам нужна колонка с индексом 2, в которой у нас и находится название города. Теперь нам понадобится название нашего отделения. Опять-таки скопируем вот этот элемент. В принципе, он у нас уже в буфере обмена есть, поэтому правая кнопка мыши и Вставить. Сдвинем опять в соответствующее место. Вот эту метку выделим и удалим, щелкнув на клавишу Delete.
396
TeachPro Microsoft Access 2003
Теперь разместим вот здесь это поле. В качестве номера колонки нам сейчас нужна не 5 колонка, а колонка 1. Именно здесь находится имя филиала. Теперь разместим наш расчетный счет. Его в принципе можно взять вот отсюда, прямо из списка наших полей Метку сдвинем на свое место. Напишем здесь расчетный счет русскими буквами, вот таким образом: Р и далее С - расчетный счет. Зададим для него шрифт в 10 единиц. То же самое для вот этого поля. Выровняем, чуть-чуть расширим вот это поле, вот таким образом сейчас разместим эти элементы. Теперь нам нужен кор.счет нашего банка. Его мы можем взять опять из вот этой подстановки Филиал - Bank_fil. Скопируем его. Правая кнопка мыши, Копировать. Далее вставим, правая кнопка мыши и Вставить. Сдвинем его на нужное нам место. Вот, например, сюда. Теперь изменим номер колонки. Нам, конечно же, сейчас нужна не первая колонка, а третья. Именно в третьей у нас находится кор.счет. Надо отметить, что, конечно же, нам необходима здесь еще и надпись, что это кор. счет. Поэтому, поскольку мы здесь метку вставить забыли, вставим теперь так сказать в принудительном плане вот эту надпись. Разместим ее вот в этом месте. Напишем КС - кор. счет. Чуть-чуть выровняем теперь вот эти элементы. Надо сказать, что вот эту рамку нам, конечно же, тоже необходимо расширить. Например, сделаем вот так, расширим и верхнюю рамку тоже, чтобы выровнять все эти элементы относительно друг друга. Ну и заодно, поле, которое мы отводим под полное имя фирмы, тоже можем расширить без ущерба для общего вида нашей формы. Расширим поле для кор. счета. Ну и предусмотрим кнопку, как раз для нее у нас место есть, при нажатии на которую мы смогли бы запустить какой-либо механизм для редактирования списка банков при необходимости. Для этого разместим вот эту кнопку в соответствующем месте. И напишем на этой кнопке соответствующую надпись. Сейчас щелкнем на кнопку Отмена. Мастер нам не нужен. Действием этой кнопки мы займемся попозже. Сейчас просто-напросто изменим надпись. Вместо вот этой надписи - кнопка 30 напишем просто-напросто Банки. Далее изменим и имя вот этой кнопки. Щелкнем на правую кнопку мыши. Свойства, и вместо кнопка 30 тоже напишем Банки. Закроем свойства. Разместим теперь адресные данные, которые у нас есть в наших полях в таблице tFirms на нашей форме. Во-первых, скопируем вот эту рамку. Для этого выделим ее, правая кнопка мыши и Копировать. Далее вставим, щелкнув где-либо правой кнопкой мыши и выбрав пункт меню Вставить. Далее сдвинем ниже эту рамку на свободное место. Вот, например, в этом месте. А теперь разместим соответствующие элементы. Панель управления сдвинем вправо. Перво-наперво, перетащим вот этот индекс. Изменим метку. Напишем здесь индекс русскими буквами. Изменим шрифт метки и самого поля с 8 на 10 единиц. Выровняем теперь все эти элементы. Далее разместим на нашей форме название города, в котором находится наша фирма, вот это поле City. Перетащим его. Вместо City напишем город. Теперь зададим опять-таки ему размер шрифта в 10 единиц. То же самое и для вот этого поля тоже. Выровняем все это. Далее расположим адрес. Перетащим. Разместим метку в этой части нашей формы. Напишем здесь адрес. Далее опять изменим шрифт с 8 на 10 единиц. Чуть-чуть увеличим вот это место для города, чтобы вот это все выравнивалось относительно друг друга. Изменим шрифт для поля, которое относится к адресу. Разместим его вот в этом части нашей формы. И увеличим место, которое отводится под него до такого размера. Здесь, конечно же, в принципе, может быть гораздо больше информации, чем во всех остальных полях на этой форме. Вот теперь мы уже использовали все поля, которые у нас есть.
Глава 15. Пример «Платежное поручение»
397
Можем чуть-чуть уменьшить общий размер нашей формы. Увеличить размер, который отводится под полное имя, для того чтобы выровнять его с остальными элементами управления. И посмотрим, как теперь все это выглядит. Для этого щелкнем на кнопке Вид, чтобы переключиться в режим работы этой формы и можно увидеть, что собой представляет эта форма. Мы можем передвигаться по записям, одновременно рассматривая, как выглядит наша форма, наша фирма, где находится ее банк, какие у нее реквизиты и т.д. Здесь у нас наверху находится список всех наших фирм. Мы можем выбрать любую из них. Правда, надо отметить, что при этом никакого влияние на нашу форму и на все эти данные, которые находятся ниже, это не имеет. Оно и понятно, поскольку мы обработку события изменения данных вот в этом combo box пока не делали. И то же самое относится к вот этой кнопке банков. Нажатие на нее тоже не оказывает никакого действия. Переключимся в режим конструктора и исправим все эти замеченные сейчас недостатки. Щелкнем на кнопку Вид. В принципе, для того чтобы не потерять все наши вот эти изменения, щелкнем на кнопку Сохранить и вместо ничего незначащей формы 1 напишем название для этой формы frmFirms и щелкнем на кнопку ОК. Теперь все наши труды, конечно же, не пропадут даже в случае каких-то неполадок с компьютером, если у нас случайно зависнет система. Конечно же, имеет смысл при работе с компьютером периодически сохранять все на жесткий диск, хотя бы с интервалом в минут 10.
15.12.3. Фирмы. Создания обработчика событий Теперь же создадим обработчик событий, щелкнув на эту кнопку, и изменение его данных. Для этого щелкнем на правую кнопку мыши. Далее выберем пункт Свойства. Перейдем в события, и здесь нам пригодится, конечно же, событие после обновления. Щелкнем на вот этих трех точках и выберем пункт Программы. Щелкнув на кнопке ОК, мы, конечно же, попадаем в Visual Basic и в соответствующую процедуру, которую подготовил для нас Access. Щелкнем на кнопке табуляции и далее напишем, во-первых, With Me и далее End With, для того чтобы мы могли пользоваться вместо аббревиатур просто-напросто точкой для идентификации нашей текущей формы. Далее знак табуляции, далее точка и сразу же после выбора какой-либо фирмы из этого combo box поместим фокус на поле Id_fir. Для этого щелкнем на точку. Далее в появившемся списке наберем Id_fir, вот она появилась перед нами. Щелкнем на нем дважды. Далее точка. И далее воспользуемся его оператором SetFocus. Вот он появился перед нами, щелкнем на нем дважды. После этого теперь нам нужно перейти на соответствующую запись в нашей таблице. Для этого воспользуемся объектом DoCmd, далее точка. И в появившемся свойстве его операторов выберем FindRecord. Ну, вот, сразу же появилось то, что нам нужно. Выберем FindRecordю Щелкнем дважды. Далее пробел и теперь то, что нам нужно найти. А найти нам нужно ту запись, которая совпадает с той, что у нас находится в этом combo box.
398
TeachPro Microsoft Access 2003
Щелкнем на точку. Далее cbo и ChooseFirm. Вот он появился перед нами. Щелкнем на нем дважды. Вот после выполнения этих операторов у нас как раз наша запись в списке встанет на то место, которое соответствует нашему выбору вот в этом combo box. Теперь же заодно выполним и другую процедуру, а именно обработку сообщения Нажатия на нашу кнопку банков в случае редактирования. В этом случае, конечно же, можно было бы создать еще и отдельную форму для редактирования банков. Но можно сделать все это по-простому. А именно, при нажатии на эту кнопку открыть список банков. Поэтому выберем объект - соответствующую кнопку, кнопку Банки. Теперь же в этой процедуре банка Click щелкнем на знак табуляции и напишем, воспользовавшись объектом DoCmd, щелкнем на точку и выберем его оператор OpenTable. Вот мы набрали несколько букв. Появилась вот эта процедура. Вот этот оператор. Щелкнем на нем дважды и далее наберем имя той таблицы, которую мы хотим открыть. Это у нас таблица tBanks. Сохраним теперь все наши изменения, щелкнув на кнопке сохранения, перейдем в Microsoft Access и запустим все это в режим выполнения нашей формы. Закроем вот эти свойства, они нам не нужны. Они случайно появивились на нашем экране. Теперь выберем какую-либо фирму. Например, Мою первую фирму. Как мы видим, сразу же появились все ее реквизиты - имя, банковские реквизиты и т.д. Выберем какую-либо другую фирму. Например, Сотовая связь, вот все эти данные. В принципе, все более или менее нормально, единственное, вот здесь название Банковские реквизиты, конечно же, лишнее. Здесь у нас должна быть надпись Адресные данные. Тут, конечно же, мы слегка ошиблись. Поэтому переключимся в режим конструктора и изменим здесь текст. Напишем Адресные данные. Вот, после этого у нас, конечно же, все будет выглядеть гораздо лучше. Теперь же, сделаем так, чтобы вот этот весь элемент управления, вся эта форма у нас разместилась на нашей главной форме в виде подформы. Наши изменения сохраним, щелкнув на кнопке сохранения. Закроем теперь эту форму, щелкнув на вот этом крестике. Перейдем теперь в формы. Щелкнем на вот этой форме frmMain и щелкнем на кнопке Конструктор. Запустилась вот эта форма в режиме конструктора. И теперь в списке вкладок добавим еще одну вкладку. Для этого щелкнем на правую кнопку мыши, выделив вкладки. Далее выполним команду Добавить вкладку. Вот появилась новая вкладка. В принципе, имя этой вкладки нам совсем ни о чем не говорит, и оно нас совсем не устраивает. Щелкнем на правую кнопку мыши, свойства и зададим во вкладке Все, имя для этой вкладки. Вместо "вкладка 46", напишем просто-напросто Фирмы. И соответствующие изменения отобразились у нас и во вкладке, и в названии нашего объекта. Закроем теперь. Теперь попробуем разместить здесь вторую форму, форму с фирмами, которую мы только что создавали. Для этого щелкнем на пункте Подчиненная форма отчет. Нарисуем ее. Сразу же появляется мастер, в котором мы можем выбрать имеющиеся таблицы и запросы или же имеющиеся формы. Нам как раз нужна форма. Переключимся, выберем вот эту форму. И щелкнем на кнопке Готово. Вот у нас все здесь появилось. Вот эта метка лишняя Ее мы выделим и удалим. Перещелкнем сперва, выберем фирму, щелкнем на Delete Вот она у нас удалилась. А теперь чуть-чуть изменим местоположение, вот таким образом. Раздвинем вниз. И переключимся в списке вкладок на вкладку платежки, чтобы она у нас все-таки была первой. Ну и после всех этих изменений, щелкнем на кнопку сохранения. И щелкнем на кнопку Вид, чтобы посмотреть, как же все это теперь работает. Первая и вторая вкладки, мы с ними уже вполне знакомы. Переключимся на третью вкладку Фирмы, и здесь, как мы видим, расположены все наши фирмы.
Глава 15. Пример «Платежное поручение»
399
Мы можем перейти к любой из фирм. Например, вот. Как видно, мы переключились к фирме Рога и Копыта, правда, никакого влияния это на все остальные поля не оказало. Как мы видим, тут осталось старое название и реквизиты фирмы. Судя по всему, мы допустили где-то какую-то ошибку. Перейдем в режим конструктора и посмотрим, в чем же дело. Откроем свойства этого поля. Правая кнопка мыши и Свойства. И можно увидеть, в чем наша ошибка. Мы разрешили связь между основной формой и подчиненной по полю Id_fir. Конечно же, нам сейчас никакая связь не нужна. Поэтому удалим вот эти два свойства. Теперь закроем свойства. Переключимся в режим формы. И сейчас попробуем перейти к фирмам и далее откроем какую-либо из фирм. Как мы видим, сейчас все это работает гораздо лучше. Если мы сейчас щелкнем на кнопке Банки, то появляется таблица банков, в которой мы можем изменить какие-либо данные, добавить новые и т.д. Можем открыть филиалы банков и внести нужные нам изменения. После этого можно закрыть эту таблицу и вернуться к нашей основной форме. Т.е. все сейчас у нас работает уже вполне адекватно. Сохраним. Щелкнем на кнопке сохранения и закроем эту форму, перейдя в основное окно нашей базы данных.
15.13. Платежка13. Параметры запуска Мы уже достаточно далеко продвинулись в плане задания функциональности нашей программы платежек. У нас есть наша главная форма frmMain, запуская которую, мы, воспользовавшись этими тремя вкладками, можем редактировать и базу данных, и список фирм, и задавать новые платежки. Ну при этом надо сказать, что, конечно же, в таком виде, оставлять наше приложение не очень хорошо, поскольку любой пользователь может забраться в нашу базу данных. Может открыть ее в режиме конструктора, изменить любые наши настройки и может быть даже испортить базу данных в случае каких-либо неосторожных действий. Поэтому, конечно же, имеет смысл запустить нашу базу данных в таком режиме, чтобы пользователь не имел прямого доступа к разного рода возможностям Access. Только запускал бы в нашем конкретном случае вот эту форму и работал бы только на ней. Т.е. с теми возможностями, которые ему мы предоставляем. Ну, для того чтобы рассмотреть эти возможности, щелкнем на пункте меню Сервис и далее выполним команду Параметры запуска. Именно в этом окошке сконцентрированы все те возможности и блокировки, которые будет проводить для нас Microsoft Access при запуске нашего приложения. Первое, что здесь, конечно, есть, - это заголовок приложения, который, как мы видим, сейчас пуст. Но мы здесь можем написать любой нужный нам текст. Например, просто-напросто напишем Моя программа. Далее мы можем задать какой-либо значок приложения или непосредственно указать путь к соответствующему графическому файлу. Или, щелкнув на кнопку Обзор, найти его на нашем жестком диске. Можем задать строку меню, которая у нас сейчас стоит по умолчанию. А также можем разрешить или наоборот отключить показ и вывоз полного меню Access.
400
TeachPro Microsoft Access 2003
Конечно, после редактирования и полного завершения работы над программой имеет смысл отключить здесь эту возможность - показ полного меню Access, чтобы пользователь не имел возможности изменять нашу программу при помощи пунктов меню. А, пользуясь этими пунктами, конечно же, можно залезть в любые уголки нашей программы, изменив ее достаточно основательно, что иногда бывает нежелательно. Также можно оставить контекстное меню по умолчанию или убрать. Эту галочку сейчас оставим. Далее мы можем задать ту форму, которая будет запускаться в нашей базе данных при ее запуске. Сейчас, как мы видим, вот тут стоит слово Отсутствует, что означает, что при запуске нашей базы данных ни одна из форм запускаться по умолчанию не будет. Конечно, в данном конкретном случае это неправильно, поэтому щелкнем на выпадающем списке. Появляются все формы, которые существуют у нас в базе данных. В нашем конкретном случае нам, конечно же, надо начать работу с формы frmMain. Поэтому щелкнем на ней и поместим ее в список автозагрузки. Далее у нас находится галочка на пункте окно базы данных. Опять-таки это то окно, в котором теоретически пользователь может, запуская конструктор, запуская различные возможности по редактированию, несанкционированно изменить нашу программу. Поэтому после окончательной шлифовки имеет смысл отключить, сняв галочку с этого пункта. Строку состояния, конечно же, лучше оставить. Это достаточно хороший инструмент, который обычно находится в нижней части нашего экрана. Контекстное меню пусть будет по умолчанию, ну и панель инструментов пока оставим, как есть. Щелкнем теперь на кнопку ОК, сохраним нашу базу данных. И закроем ее, щелкнув вот на этом крестике. Вот, сейчас у нас в нашем Microsoft Access нет ни одной запущенной программы базы данных. Попробуем теперь запустить ту базу данных, которая у нас есть и которую мы создавали, базу данных платежек. Конечно же, ее можно запустить из просто Windows или Explorer, щелкнув на соответствующем значке. Но можно, конечно же, запустить непосредственно из Microsoft Access. Для этого щелкнем на пункте меню Открыть. И далее в Моих документах откроем нашу базу данных платежек. Вот она. Щелкнем на ней дважды. И, как мы видим, после загрузки нашей базы данных автоматически появилась вот эта форма frmMain. На заднем фоне главного окна нашей базы данных нет и все сконцентрировано вот в этой форме из ее производных. Т.е. всеми теми окнами, в которые мы попали бы из вот этой главной для нас формы. В принципе, мы сейчас в нашей конкретной базе данных Платежки все возможности сконцентрированы вот в этом главном окне и в нескольких его вкладках. При этом, как мы видим, у нас пункты меню, относящиеся к редактированию самой программы исчезли из нашей программы Microsoft Access. А наверху появилась вот эта надпись Моя программа, которую мы вставили в параметры автозапуска. Ну, в принципе, у нас еще осталась панель инструментов от старых возможностей. В принципе, ее тоже можно отключить. Ну, сейчас для того чтобы это сделать, нам придется опять вызвать стандартное меню Access. Это можно сделать, нажав на кнопку F11 на клавиатуре. При этом, как мы видим, появилось главное окно нашей базы данных, в котором мы можем изменять различные аспекты нашего приложения. При этом параметры автозагрузки здесь, как мы видим, все равно недоступны, поскольку окно с главным меню все равно не появилось. Главное меню выглядит достаточно в усеченном виде. Для того чтобы помочь, тем не менее, всему этому делу, мы можем закрыть нашу базу данных, щелкнув вот на этом крестике. И далее открыть тот же самый файл, но без автоматический загрузки и выполнения всех предварительных команд. Попробуем это сделать. Для этого щелкнем на кнопку Открыть. Выберем тот файл, который мы хотим открыть. Нажмем на кнопку Shift и, не отпуская Shift, щелкнем на кнопку Открыть.
Глава 15. Пример «Платежное поручение»
401
Вот мы открыли нашу базу данных. При этом кнопка Shift у нас все время была нажатой и, как мы видим, на этот раз все открылось так сказать в том виде, как и раньше. Без выполнения всех автозагрузок, со стандартным меню, со стандартной базой данных и перед нами стандартное окно базы данных, а не наша форма frmMain, как мы задавали в автозагрузке. Откроем теперь опять автозагрузку. Для этого щелкнем на пункте меню Сервис, далее параметры автозагрузки, и теперь можем отключить панели инструментов. Встроенные панели инструментов отключим, и в таком виде уже наша база данных будет работать в гораздо более устойчивом режиме по отношению к ошибкам пользователей. Но остается все равно еще одна возможность - это специальные клавиши Access, которыми мы как раз и пользовались, для того чтобы получить доступ к редактированию самой программы базы данных, а не только данных, которые в ней есть. Конечно же, эти возможности тоже можно отключить, сняв вот эту галочку, но тогда уже мы не сможем редактировать нашу программу. Этим надо пользоваться уже в самом последнем случае, после того, как все наши изменения мы точно провели, программу хорошо отшлифовали, создали ее резервную копию и затем хотим ее выдать, так сказать, в широкий прокат. В этом случае документом будут пользоваться различного рода пользователи. В этом случае мы как раз снимаем здесь галочку и щелкаем на кнопку ОК, для того чтобы параметры автозагрузки были именно такие - без возможности запуска настроек Access. Сейчас мы здесь галочку оставим, для того чтобы иметь возможность запускать и главное окно, и иметь возможность при нажатии на кнопку Shift при загрузке получать стандарты окно Microsoft Access. Щелкнем сейчас на кнопке ОК. И попробуем закрыть это окно нашей базы данных. Сейчас мы все закрыли и откроем еще раз. Щелкнем на кнопке открытия, далее база данных Платежки, щелкнем на кнопку Открыть. Ну и, как мы видим, у нас уже на экране только наша форма frmMain и пункты меню, при помощи которых мы можем в принципе редактировать записи и данные в нашей баз данных. Но мы не сможем редактировать саму программу. Не сможем редактировать структуру таблиц, запросов, форм и т.д.
402
TeachPro Microsoft Access 2003
Глава 16. Связи с Office 16.1. Публикация в Word Продолжим наши занятия и рассмотрим такую тему, как связь с Офис. В значительной степени мы эти возможности уже рассматривали, когда касались темы экспорта и импорта. Теперь же рассмотрим, какие еще есть возможности у Microsoft Access. Стандартная панель управления, на ней находится вот такая кнопка связи с Office. Если мы щелкнем на вот этом треугольнике, то появляются три возможности, которые у нас сейчас есть. Это слияние в Microsoft Office Word, публикация в Microsoft Office Word и анализ в Microsoft Office Excel. Те же самые пункты можно получить и из меню. Для этого щелкнем на пункте меню Сервис, далее рассмотрим команду Связь с Office, в котором как раз у нас и есть вот эти три пункта, слияние и публикация в Word и анализ в Microsoft Excel. На самом деле все эти действия, которые выполняются при публикации в Microsoft Word и анализ в Microsoft Excel ничм не отличаются от всех тех возможностей, которые мы можем сделать при экспортировании данных обычным способом из нашей базы данных. Возьмем, например, какую-либо из таблиц и рассмотрим, как все это происходит. Например, возьмем вот эту таблицу tFirms. В принципе, у нас сейчас эта таблица не очень большая. Это достаточно существенно, поскольку процесс конвертирования из одной программы в другую можем занимать достаточно продолжительное время. Поступим сейчас таким образом. Щелкнем на вот этой кнопке и выберем пункт Публикация в Microsoft Word. Как мы видим, компьютер, подумав немножко, проделал вот такое преобразование. При этом мы попали в программу Microsoft Word, а все поля и данные нашей таблицы оказались отображенными в нашей странице Word. Процесс преобразования на самом деле заключается в том, что та таблица, которая у нас была текущей - в нашем конкретном случае tFirm, или же запрос, просто-напросто сохраняется в неком буферном формате, который может понимать обе программы - и Access, и Word. В конкретном случае это файл rtf. И затем открывается Microsoft Word, в котором загружается этот файл. В этом можно убедиться, если мы откроем пункт меню Файл, и далее Сохранить как. Можно увидеть, что здесь у нас есть вот этот новый файл tFirms формата rtf, который сейчас открыт у нас в Microsoft Word. Щелкнем сейчас на кнопке Отмена и вернемся к нашей странице. В нашей странице, как можно видеть, у нас есть все данные вместе с соответствующими заголовками. Мы видим его, конечно же, с некоторыми форматированиями, и надо отметить, что логические поля, например, вот это поле Mine, у нас преобразовалось к типу Да-Нет. И еще один нюанс, поскольку у нас таблица достаточно широкая, то она целиком на наш лист не поместилась и вылезла за правый край нашей страницы. Поэтому, для того чтобы посмотреть всю нашу таблицу целиком, мы должны перейти в обычный режим. Щелкнем на соответствующей кнопке, и в этом случае мы можем добраться и до последних полей нашей таблицы и просмотреть ее целиком. Надо отметить, что маска ввода при преобразовании соответствующих строк сохраняется. А также при преобразовании происходят все подстановки, которые нужны в данной таблице.
Глава 16. Связи с Office.
403
Т.е., например, все существующие подстановки вместо того, чтобы отображать числа, которые на самом деле реально там находятся, будут отображать соответствующую первую колонку с реально отображаемым текстом. В общем, если коротко резюмировать, то можно отметить, что просто-напросто образ таблицы, так как мы его видим в Microsoft Access, был передан в Word. Заметим еще одно обстоятельство. Максимальный размер колонок в Word равняется 32, и поэтому если в нашей таблице больше количество колонок, то соответствующие лишние колонки просто-напросто потеряются при преобразовании. Попробуем теперь вот эту же самую структуру, такой же файл получить в Word несколько другим путем. Для этого закроем этот Word. Щелкнем на вот этом крестике, и мы опять попали в наш Microsoft Access. Выберем тот же самый файл tFirms. Щелкнем на правую кнопку мыши и выберем команду Экспорт. Далее выберем тип файла уже не Microsoft Office Access, а тип файла Формат RTF. Это именно тот формат, который хорошо понимает и Access, и Word. Но, как мы видим, таблица tFirms у нас уже есть. Если мы сейчас щелкнем на кнопке Экспорт, то компьютер нам сообщает, что вот такой уже существует. Если мы сейчас щелкнем на Да, то мы просто-напросто сотрем тот файл, который только что создал Microsoft Access при преобразовании данных в Word, при публикации. Но мы можем, щелкнув на кнопке Нет, изменить имя или же просто-напросто затереть этот файл, если мы щелкнем на кнопку Да. Так сейчас мы и поступим, и в результате у нас на жестком диске только что был произведен экспорт этого файла. И далее мы можем найти его на нашем компьютере и открыть при помощи Microsoft Word. В принципе, это можно сделать даже проще. Опять-таки щелкнем на правую кнопку мыши, выберем пункт Экспорт, выберем формат RTF и поставим галочку на флажок Автозагрузка. В этом случае, мы сразу же, после конвертации, после экспортирования запустим в автоматическом режиме Microsoft Word, который этот файл и откроет. Щелкнем на кнопке Экспорт, заменим, щелкнув на кнопку Да, и в результате компьютер проделал преобразование и открыт этот буферный RTF файл в Microsoft Word. В принципе, если приглядеться, то мы получили практически и теоретически то же самое, что только что было. А именно отображение нашей таблицы tFirms в Microsoft Word. Закроем теперь Microsoft Word.
16.2. Публикация в Word. Анализ в Excel Вот мы опять попали в Microsoft Access и то же самое касается, например, запросов. Можем выбрать какой-либо из запросов, например, qBanks. Далее щелкнуть на пункте Связи с Word в панели инструментов, щелкнем на кнопке Публикация в Microsoft Word. И получим отображение нашего запроса со всеми его данными и ячейками в Microsoft Word. Закроем опять. Экспортировать и публиковать в Word можно и формы, и отчеты. Например, возьмем эту форму frmFirms.Щелкнем на кнопке Связь с Word, и, как мы видим, публикация в Microsoft Office Word сейчас активна, в отличие от слияния в команды Слияние в Microsoft Office Word, которое мы не можем сделать с нашими формами. Попробуем сделать публикацию. Щелкнем. И в результате получаем вот такой достаточно странный вид документа Word. В нем, в принципе, находятся все поля, которые есть в нашей форме и вместе со своими данными. Правда, пользоваться вот таким видом нашей формы вряд ли особо удобно. Поэтому, конечно же, экспортировать формы, так же, как и отчеты, в Microsoft Word надо с большой осторожностью. Это не относится к таблицам и запросам, которые экспортируются достаточно удобно. Правда, надо отметить, что не все типы запросов можно экспортировать в Word. Можно экспортировать только те запросы, которые формируют какие-либо данные. Т.е. запросы на выборку или же перекрестный запрос. А запросы типа создания новой таблицы и т.д., конечно же, такого рода запросы, экспортировать в Word нельзя. Данные из Microsoft Access можно
404
TeachPro Microsoft Access 2003
публиковать не только в Word, но и в Microsoft Excel при помощи вот этих кнопок, которые можно запустить из панели инструментов. Т.е. мы можем выполнить пункт Анализ в Microsoft Office Excel. Для этого нам надо выполнить те данные, которые мы хотим преобразовать к Excel. Например, выберем вот эту таблицу tFirms. Точно также мы можем выбрать и какой-либо запрос или другие элементы. Но сейчас ограничимся Firms. Далее щелкнем на пункте панели инструментов Связи с Office и далее выберем Анализ в Microsoft Office Excel. Щелкнем. Надо отметить, что точно так же, как и с Word, вот это действие, в результате которого в Excel появилась наша таблица, - это то же самое, что если бы мы эту таблицу при помощи возможности сохранить как сохранили бы в соответствующем формате Excel и далее его бы открыли. В результате, в любом случае мы получаем вот такой вид нашей таблицы. Здесь, как мы видим, всего одна вкладка, вкладка с названием нашей таблицы. Наверху находятся все заголовки, а внутри наших ячеек находятся все данные, соответствующей таблицы. Причем, как мы видим, поля типа Boolean преобразовались к типу Истина или Ложь, в отличие от Word, где они преобразовались к строковому выражению Да - нет. Далее мы можем отметить, что вот эти разного рода числа, которые у нас были в нашей таблице, они сохранились, как текст. Можно увидеть это, щелкнув на вот этом предупреждении, число сохранено как текст. В принципе, мы можем преобразовать все это в число и использовать в таком виде, или оставить его в виде текста. Закроем теперь Excel, щелкнув на вот этом крестике. И вот мы опять попали в Microsoft Access. А теперь попробуем, чтобы наши данные попали в Excel опять-таки не при помощи вот этих возможностей публикации и анализа, а так сказать непосредственным образом. Выберем на этот раз какой-либо другой объект. Например, вот эту таблицу qBanks. Далее щелкнем на правую кнопку мыши. Далее Экспорт. Как мы видим, появилось окошко экспорта запроса qBanks. Выберем тип файла, на этот раз Excel, вот этот Microsoft Excel. Далее активизируем Сохранить формат и Автозагрузка, для того чтобы сразу же после создания соответствующего файла Excel стартовал и открыл нам его. Cогласимся с именем qBanks, с таким же, как у нас в исходном объекте и щелкнем на кнопке Экспорт. Как мы видим, в результате открылся Excel с нашим файлом qBanks, и внешний вид этого файла точно так же выглядит, как при анализе Microsoft Access, как в предыдущем случае. Наверху у нас находятся заголовки, а внизу - все данные. Причем опять-таки надо отметить, что ячейки имеют точно такое же представление, как в таблице Microsoft Access. Хотя внутреннее, так сказать, представление соответствующих ячеек может быть совсем другим. Например, вот это поле Name на самом деле является подстановкой соответствующих банков в нашу таблицу филиалов. И на самом деле здесь хранится не имя банка, а просто-напросто число, которое является ссылкой на соответствующую запись в другой таблице, таблице банков. В результате всего этого преобразования компьютер вывел имена непосредствено в сответствующее название банка. Точно так же он вывел и BIK этого банка.
Глава 16. Связи с Office.
405
А вот эти числовые выражения были преобразованы к строковому. Это мы уже видели, рассматривая предыдущее преобразование в Excel. Закроем теперь Excel, щелкнув на соответствующей кнопке закрытия. И вот мы опять попали в нашу базу данных Microsoft Access.
16.3. Простые примеры слияния с Word. Запуск из Access Рассмотрим теперь последнюю возможность, которая у нас для связи с другими программами Office в этой кнопке Связи с Office на панели инструментов. Это слияние в Microsoft Office Word. В принципе при рассмотрении этого вопроса есть один маленький нюанс. При этом требуется уже знание достаточно тонких моментов работы с Microsoft Word. В отличие от тех возможностей, которые нам нужны в Word и Excel при публикации и анализе, при слиянии уже нам нужны гораздо более тонкие моменты. Попробуем теперь выполнить процесс слияния с Microsoft Word. Выберем, например, вот этот запрос qBanks. Далее щелкнем на вот эту кнопку, выполним пункт слияния. Как мы видим, появился сразу же вот такой мастер, в котором всего лишь одна возможность. А именно - одна проблема, которую нам надо решить. Надо установить связь с готовым документом Microsoft Word или создать новый документ. В данном конкретном случае на самом деле у нас выбора нет, поскольку этот пункт мы выполняем в первый раз, то, конечно же, нам нужно создать новый документ и установить связь с ним. А если бы у нас ранее было бы проделано нечто подобное, то мы могли бы установить уже связь с готовым документом. А сейчас создадим новый. Щелкнем теперь на кнопку ОК, и в результате запускается программа Microsoft Word, но пока с абсолютно пустым листом. Правда, если мы обратим внимание на область задач, то можно увидеть, что у нас запустился некий мастер, в котором мы находимся на первом этапе из 6. Это мастер создания нового типа документа. Мы можем пойти по этому мастеру, выбирая определенные решения на каждом этапе, и в результате получить соответствующий вордовский документ. Мы сейчас этим мастером пользоваться не будем. Щелкнем на вот этом крестике, чтобы его убрать. Воспользуемся вот этой панелью инструментов, которая дополнительно появилась у нас в Word и которая помогает нам для слияния документов Access с Word. Мы можем воспользоваться, например, вот этой кнопкой Вставить поля слияния. Если мы щелкнем, появляются те поля, которые у нас были в исходном объекте, в запросе qBanks, и можно вставить их на наш документ. Или же можем выбрать кнопку Добавить поле Word и здесь у нас достаточно много возможностей, и в том числе, например, такие, как, например, написание таких сложных конструкций, как If...Then, NextIf и т.д. Например, сейчас щелкнем на пункте Вставить поля слияния и добавим, например, поле Fil филиал. Щелкнем на кнопке Вставить. Вот, как мы видим, появилась соответствующая аббревиатура на нашем документе Word. Закроем. Вставим, например, пробел, далее опять вставить поля слияния.
406
TeachPro Microsoft Access 2003
Выберем, например, поле Город - City. Щелкнем на Вставить. Закроем. Вставим еще один пробел. Опять добавим новое поле. Выберем поле Name - имя банка и щелкнем на кнопке Вставить. Закроем теперь окончательно наше окошко по вставке полей и, как мы видим, у нас на документе Word теперь появилось три аббревиатуры, каждая из которых заключена в кавычки. Это Fil, City и Name - филиал, город и имя банка. Т.е. название соответствующих полей в нашем запросе. Конечно же, в моменте слияния вот эти аббревиатуры будут заполнены соответствующими данными из таблицы. Преимущество Word по сравнению, например, с Access заключается в том, что у нас, конечно же, в этом случае гораздо больше возможности по форматированию и взаиморасположению текста. В отличие от Access, который, конечно же, гораздо менее к этому приспособлен. Посмотрим теперь на результат слияния. Щелкнем для этого на вот этой кнопке Слияние в новый документ. Как мы видим, сразу же автоматически появляется вот такое окошко, в котором от нас требуют выяснить, хотим ли мы объединить все записи из нашей исходной таблицы, в нашем конкретном случае запроса. Или же мы хотим выбрать только текущую запись, или запись, начиная с какого-то и до какогото места. Сейчас выберем все. В принципе, у нас не очень много записей в нашем запросе. И все это будет обрабатываться не очень долго, щелкнем на кнопке ОК. И вот можно увидеть результат выполнения нашей работы. В принципе, надо отметить, что, конечно, мы видим сейчас всего лишь одну строчку, на которой сконцентрировано название филиала, город и название банка. Но на самом деле здесь гораздо больше данных. Просто-напросто каждая из записей из нашего запроса помещена на отдельный лист. Поэтому на самом деле мы можем перейти, например, ко второму листу. Вот здесь находится вторая запись и т.д. Переходя к соответствующим страницам, мы можем видеть каждую из них в отдельности. В принципе, мы можем выбрать и отображение в обычном режиме, и в этом случае все наши данные попадают так сказать в один раздел, несмотря на то, что между ними находится вот такой разрыв. Просто-напросто мы их видим подряд.
16.4. Простые примеры слияния с Word. Запуск из Word Сейчас мы рассмотрели те возможности. которые появляются у нас при запуске процесса слияния из Microsoft Access. Но мы можем этот процесс запустить непосредственно из Microsoft Word с чистого листа. И в этом случае у нас тоже будут свои нюансы при работе. Для того чтобы это сделать, закроем сейчас наш Word. Щелкнем на вот этом крестике. Сохранять мы ничего не будем. Щелкнем на кнопке Нет. Мы попали в исходный вид нашего слияния. Он нам тоже сейчас не нужен. Щелкнем на крестике. Опять Нет. И мы в результате получили стандартный вид Microsoft Word без открытого документа. Создадим теперь новый пустой документ, щелкнув на соответствующей кнопке. И далее запустим процедуру слияния. Как мы видим, мы запустим из Microsoft Word, непосредственным образом с пустого документа. Для этого щелкнем на пункте меню Сервис. Далее вот это подменю Письма и рассылки. Он как раз нам и нужен. И здесь же у нас находится команда Слияние. Щелкнем. Появляется вот такой мастер слияния. Его мы уже видели. И здесь, как мы видим, 6 этапов, на первом из которых мы сейчас находимся. Кроме этого мастера, мы можем еще показать панель инструментов слияния, в которой есть достаточно много нужных нам кнопок. Для этого выберем опять пункт меню Сервис. Далее Письма и рассылки. И здесь есть команда Показать панель инструментов слияния. Вот она появилась перед нами.
Глава 16. Связи с Office.
407
Теперь выполним этапы вот этого мастера. Как мы видим, на первом этапе мы должны выбрать, какого типа документ мы хотим - письмо, конверт, наклейка или каталог. В принципе, это особого значения не имеет для сущности процесса. Выберем, например, письма. Щелкнем теперь на кнопке Далее. И здесь нам нужно выбрать, как мы хотим создать основу для нашего документа. Это текущий документ, шаблон или существующий документ. Выберем, конечно, текущий документ. В нашем случае он пустой. И щелкнем на кнопке Далее. Теперь мы должны выбрать получателей. Нужно его выбрать из списка из Outlook или создания списка. А также выбрать существующий список. Сейчас нас как раз этот вариант и устраивает. Щелкнем на кнопке Обзор. Здесь появляются все возможности, которые у нас есть по выбору источников данных. Это такой, как подключению к SQLсерверу, подключение к новому источнику базы данных и т.д. Сейчас нас интересуют базы данных Access. Поэтому выберем тип файлов подключение к базам данных Access, вот эта возможность. И выберем пункт Мои документы, в котором находится нужная нам база данных. В нашем конкретном случае выберем вот эту базу данных Платежки. Щелкнем на ней дважды. И в появившемся окне у нас перечислены все запросы и таблицы, которые у нас существуют в нашей базе данных и которые мы имеем возможность использовать в качестве слияния для нашего документа Microsoft Word. Опять-таки выберем, например, вот этот запрос qBanks и щелкнем на кнопку ОК. Далее мы видим, содержание вот этого запроса. И мы можем отсортировать список, щелкнув на соответствующем заголовке. Мы можем отобрать какие-либо из записей, сняв или наоборот поставив галочку. Также можно выделить все, очистить все и т.д. Здесь достаточно подробно можно работать с этой таблицей. Сейчас здесь особо менять ничего не будем, и щелкнем на кнопку ОК. А теперь мы можем выбрать различного рода поля и сведения из наших запросов или таблиц. То же самое мы можем выбрать, щелкнув на вот этой кнопке Вставить поля слияния. Например, щелкнем и выберем опять точно так же, как и делали ранее, несколько полей. Например, оставим название филиала. Щелкнем на кнопке Вставить. Вставим название города City. Вставим имя банка, щелкнув на кнопке Вставить. И закроем. Например, хватит нам вот этих трех полей. И теперь надо отметить, что мы можем воспользоваться всеми возможностями по форматированию, которое предоставляет нам Microsoft Word. Например, напишем таким образом. Вставим здесь пробел. Напишем, что это филиал. Далее, вот это название филиала. Потом точка. Далее пробел. Потом он находится в городе. Название города появится вместо City. Далее точка. И принадлежит банку, и появится название банка. И в конце точка. А теперь мы можем использовать различного рода форматирование. Например, зададим жирный шрифт для всех данных. Вот это название филиала пусть появляется с большим шрифтом. Например, 14 единиц и курсивом. Для города выберем еще какой-либо вариант форматирования. Например, зададим в виде красного текста. Имя банка выделим, например, вот таким выделением, желтым цветом. Т.е. все эти возможности, которые у нас есть в Microsoft Word, можем использовать совершенно спокойно.
408
TeachPro Microsoft Access 2003
А теперь посмотрим, что у нас получается. Для этого мы можем воспользоваться кнопкой Слияние при печати. В этом случае мы, выбрав, что мы хотим напечатать - все записи, текущую запись или какойлибо интервал, щелкнув на кнопке ОК, выводим все на печать. Сейчас нам особенно это все не нужно. Щелкнем на Отмену и выведем все это на экран. Для этого щелкнем на кнопке Слияние в новый документ. Пусть у нас будет Все записи. И щелкнем на кнопке ОК. И вот, в результате, что у нас получилось. Так как и мы ожидали, каждая из записей появилась на отдельной странице, количество страниц у нас точно соответствует количеству записей в нашем запросе. Как мы видим, их в нашей базе данных немного. Можем еще перейти в режим обычного отображения документа. В этом случае у нас все данные появляются один под другим, без разрывов между страницами. Но при этом, все возможности форматирования, конечно, остались. Вот, как мы видим, мы использовали и курсив, и разного рода цвет, и выделение при помощи заливки фона. Могли бы использовать и выравнивание влево, вправо или по ширине и т.д. Т.е. это абсолютно все, что возможно в Microsoft Word и чего мы лишены, например, в Microsoft Access.
16.5. Простые примеры слияния с Word Использование шаблона Попробуем теперь провести слияние в Microsoft Word при помощи шаблона, который есть в Word. Для этого закроем этот документ, с которым мы только что работали. Щелкнем на вот этом крестике. Сохранять не будем. Закроем и основу этого документа. Щелкнем на вот этом крестике. Конечно же, опять сохранять не будем. Это у нас просто-напросто пример. Щелкнем теперь на пункте меню Файл и далее Создать. Как мы видим, появилась в правой части нашего экрана область задач с помощником по созданию нового документа, и выберем на этот раз шаблоны. Выберем шаблоны на Моем компьютере. И выберем здесь последнюю вкладку слияние. Здесь, как мы видим, достаточно много различного типа шаблонов и здесь выберем, например, вот этот шаблон Стандартный список адресов. Щелкнем на нем дважды. В результате выполнения вот этого шаблона мы получаем вот такой вид нашего документа. И нам, конечно же, потребуется сейчас использовать какой-либо источник данных для нашего документа. Мы можем использовать его из списка, из Outlook, или из создателя, но сейчас щелкнем лучше на кнопку Обзор, для того чтобы получить данные из существующего списка. Щелкнем. Вот появляются все возможности, которые у нас сейчас есть. Это опять-таки подключение к SQL-серверу, подключение к новому источнику данных и т.д. Но сейчас мы выберем базу данных Microsoft Access. И далее выберем папку Мои документы и здесь выберем, например, нашу таблицу first, с которой мы работали. Щелкнем на ней дважды. И здесь у нас есть несколько таблиц, и в том числе возьмем такую таблицу, как таблица Сотрудники. Щелкнем на кнопке ОК. Вот появились данные, которые здесь у нас есть. Пусть у нас выделены все данные и щелкнем на кнопке ОК, ничего здесь менять не будем.
Глава 16. Связи с Office.
409
Теперь нам нужно добавить соответствующие поля в шаблон. Вставим здесь соответствующие данные. Щелкнем на кнопке Вставить поля слияния. В качестве фамилии нам, конечно же, фамилия нужна, поэтому выберем соответствующее поле, щелкнем на кнопке Вставить. Закроем. Вот этот Last Name нам не нужен, удалим вот таким образом. Теперь вместо First Name нам опять-таки нужно соответствующее поле. Щелкнем на кнопке Вставить поля слияния. Выберем имя. Вставить. Далее нам, конечно же, понадобится должность. Выделим вот эту аббревиатуру. Щелкнем на кнопке Вставить поля слияния, должность, вставить, закрыть. Далее вместо компании вставим другое название. Щелкнем дважды. И напишем вместо организации слово Дата рождения. И вместо телефона напишем Дата найма. Это те данные, которые у нас есть в нашей базе. А теперь закроем колонтитулы, изменим соответствующие поля, выделим вот эту компанию. Далее выберем кнопку Вставить поля. Нам нужна дата рождения. Щелкнем на кнопке Вставить. Закроем. А теперь выберем вот этот пункт Дата найма. Щелкнем опять на кнопку Вставить. Вот эта дата найма. Вставить. Закроем. Вот это окно с областью задач удалим, щелкнув на вот этом крестике, чтобы у нас больше места было для редактирования. В принципе, можно увидеть, что вместо Дата найма у нас здесь вставилось что-то совсем непонятное. Поэтому выделим, удалим. Далее щелкнем на кнопку Вставить, и опять выберем дату найма. Щелкнем на кнопку Вставить. Закроем. Вот на этот раз все у нас вставилось нормально. Вместо факса, который удалим, напишем прочерк. И в качестве электронного адреса тоже вставим прочерк. У нас этих данных просто-напросто нет. В принципе, мы можем немножко выровнять вот этот колонтитул, щелкнув дважды, и вот таким образом выделяя. Выполним вот это слияние и посмотрим, что у нас в результате всего этого получилось. Для этого щелкнем на пункте слияния в новый документ. Конечно же, слияние сейчас будет на экране. Если мы щелкнем на кнопке рядом, то слияние будет происходить непосредственно при печати на принтер. Но сейчас выполним слияние на экран. Появляется вот это стандартное окошко. Пусть будут отображаться Все записи. Щелкнем ОК. И вот результат выполнения нашего слияния можно видеть на нашем экране. Мы получаем вот такую таблицу, заполненную соответствующими фамилиями, должностью, датами и т.д., которые заполняются из данных, находящихся в нашей базе данных.
410
TeachPro Microsoft Access 2003 A
Array, 10, 305, 306 B Boolean, 299, 300, 302, 306, 324, 411 Byte, 299 C Char, 348 CheckBox, 307 CodeContextObject, 340 ComboBox, 247, 248, 257, 334, 335, 336 Connections, 307 Continue, 288, 289, 290 Control, 307 D Date, 299, 300, 364, 377, 378, 384, 386, 387 DCount, 335 Debug, 10, 297, 301, 303, 305, 306, 309, 310, 312, 314, 317, 319, 329, 330, 331, 333, 348, 349, 350, 351, 352, 353, 354, 361, 385 Dim, 299, 301, 302, 304, 305, 306, 307, 309, 316, 321, 324, 332, 337, 345, 347, 351, 353, 361, 383, 390 Do Until, 10, 294, 295, 317 Do While, 10, 294, 295 DoCmd, 11, 339, 340, 341, 342, 343, 344, 345, 346, 382, 385, 398, 399, 405 E Edit, 277, 312, 313, 388 End With, 11, 318, 323, 338, 377, 378, 383, 384, 385, 386, 388, 390, 404 Err, 275, 297, 340, 383 Eval, 340 Exit For, 293, 295 F For, 10, 292, 293, 294, 295, 390 Form, 267, 271, 306, 307, 320, 321, 322, 323, 327, 376, 377 Format, 11, 251, 355, 356, 357, 358, 359, 392, 397 I Immediate Window, 268, 288, 301, 348 Input Box, 298 Integer, 299, 301, 302, 304, 306, 313, 337, 347, 351, 390 L Left, 350, 351 Len, 11, 349 Loop, 294, 295, 310, 318 M Microsoft DAO 3.6 Object Library, 307 Microsoft Visual Basic, 266, 268, 276, 280, 287, 289, 290, 301, 307, 309, 311, 313, 314, 325, 376
Mid, 11, 305, 349, 350, 351 Module, 279, 298, 301, 309, 316 Move Next, 313 MyRec, 300, 301, 302 N Next_Click, 325 Now, 356, 357, 358, 359, 385, 386 O Object, 307, 309, 341 Object Browser, 307, 341 On Error, 275, 297, 340, 383 Open Database, 311, 321 P Private, 10, 278, 279 Public, 10, 278, 280 R ReDim, 304 Replace, 277 Report, 272, 307 Reset, 289, 297, 300, 301, 303, 312 Right, 350, 351 rstDAO, 309, 310, 312, 313, 316, 317 Run, 270, 278, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 300, 301, 302, 303, 305, 306, 309, 310, 311, 312, 313, 314, 317, 318, 319, 320, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361 S Select, 10, 275, 276, 277, 284, 290, 291, 313, 314, 315, 321, 334, 335, 351, 368, 369, 371, 374, 380, 402 Select Case, 10, 275, 276, 277, 284, 290, 291, 351 Str, 11, 297, 352 String, 11, 299, 300, 302, 304, 306, 310, 312, 329, 345, 353, 354 U UBound, 338 V Val, 11, 352 Variant, 299, 305, 306, 332, 347, 360 W With, 11, 318, 319, 323, 338, 377, 378, 383, 384, 385, 386, 388, 390, 404 А Автозагрузка, 250, 251, 252, 410, 411 Анализ, 12, 125, 129, 410, 411 Б Будет введен фиксированный набор значений, 94
Предметный указатель В Вкладка, 243, 246, 336, 367 Вставка, 59, 60, 74, 77, 134, 137, 202, 234, 242, 243 Выровнять, 190, 238, 239, 244, 284 Д Деловые, 56 Добавить гиперссылку, 74 Другие элементы, 372 З Запрос, 5, 8, 120, 122, 141, 143, 148, 149, 161, 162, 165, 166, 169, 170, 171, 173, 174, 176, 181, 209, 244, 246, 247, 281, 344, 345, 346, 365, 366, 393 Запуск, 12, 121, 146, 153, 155, 161, 167, 168, 173, 175, 177, 178, 214, 215, 216, 286, 412, 413 И Идентификатор me, 322 Изменить связь, 366 Изменить структуру таблицы, 57 Импорт, 5, 7, 96, 98, 99, 101, 104, 105, 106, 108, 110, 111, 112, 114, 115, 117, 118, 311, 340, 347 Интервал по вертикали, 284 К Календарь, 372, 387 Колонтитулы, 391 Конструктор, 8, 9, 53, 54, 141, 144, 145, 161, 182, 205, 214, 217, 223, 227, 237, 252, 254, 256, 257, 267, 277, 282, 283, 344, 345, 358, 405 Копировать, 45, 48, 49, 50, 73, 74, 79, 135, 161, 165, 172, 176, 191, 192, 198, 199, 207, 225, 226, 233, 239, 240, 241, 242, 257, 282, 285, 336, 341, 345, 372, 394, 395, 396, 398, 402, 403 Л Личные, 56 М Метод Requery, 11, 334 Н Новая база данных, 308, 347 Новые ярлыки объектов, 55 О Обеспечение целостности данных, 139, 366 Область задач, 6, 40, 244 Обработка событий, 218, 271, 342 Обработка событий, 270, 320 Отобразить все связи, 139 П Параметры запуска, 12, 406
411 Переименовать, 50, 55, 57, 60, 129, 131, 253 Переименовать столбец, 50, 55 Поиск, 40, 220, 221, 222, 225, 226, 227, 228, 231, 232, 233 Поиск файлов, 40 Показать панель инструментов слияния, 414 Построитель выражений, 8, 158, 200, 247, 335 Построить, 158, 160, 198, 231, 267, 366, 379, 391 Программа, 30, 61, 147, 250, 267, 276, 277, 279, 280, 284, 299, 318, 333 Программы, 16, 250, 267, 270, 276, 323, 325, 326, 330, 332, 335, 337, 404 Р Расширенный поиск файлов, 41 Редактор Visual Basic, 285, 292 С Связи с Office, 5, 12, 409, 411, 412 Связь с таблицами, 96, 97, 98, 102, 110, 112, 115 Сетка, 395 Скрыть ключевой столбец, 94 Слияние, 410, 413, 414, 415 Слияние в Microsoft Office Word, 410 Слияние в новый документ, 413, 415 События, 221, 247, 248, 267, 276, 323, 325, 326, 328, 330, 387 Создание новой таблицы, 120 Создание файла, 40, 41 Создать, 26, 40, 44, 61, 77, 78, 96, 111, 135, 136, 185, 203, 204, 209, 213, 230, 233, 237, 247, 254, 256, 258, 261, 267, 268, 275, 278, 281, 286, 308, 336, 347, 362, 367, 370, 371, 372, 415 Создать из файла, 77, 78 Создать новый, 78, 209 Сохранить формат, 113, 411 Справка, 40, 132 Строки, 59 Структура и данные, 45 Схема данных, 134, 366 Т Таблица, 61, 94, 98, 111, 115, 125, 127, 129, 130, 259 Тип запроса, 120, 121, 123, 169, 172, 173, 174, 176, 179, 182, 344 Э Экспорт, 7, 9, 98, 102, 103, 107, 108, 111, 112, 113, 114, 116, 250, 251, 252, 253, 410, 411
е-Издательство «Мультимедиа Технологии и Дистанционное Обучение» Основные направления деятельности е-Издательства ММТиДО — разработка и создание мультимедийных обучающих программ (учебников и пособий). За истекшие годы создано более 160 наименований CD-ROM для России, Западной Европы и США. По иностранным языкам (серии Gold и Platinum), по компьютерной грамотности, по школьным и некоторым специальным дисциплинам (серия TeachPro). ММТиДО является одним из лидеров в РФ в области разработки мультимедийных обучающих программ, предназначенных для индивидуального и группового обучения. Курс французского языка — «Français d`Or 2000» — выбран Министерством образования РФ для поставки в 40 тысяч городских и сельских школ России по Президентской программе. ММТиДО по заданию Минобразования разработало курс "Компьютерная грамотность и дизайн", "Немецкий язык, 5-9 классы" и "Организация и технология механизированных работ в животноводстве". Совместно с МЧС РФ создана обучающая программа «TeachPro ОБЖ, 10 класс», которая удостоена золотой медали на международной выставке в Сеуле — «SIIF 2002». Программа имеет Гриф Министерства Образования РФ. Большинство ведущих вузов России (МЭСИ, РАГС, СГА, МГУ, МПГУ, РУДН, ВЗФИ, РТА, МГОУ, МПСИ, МГСУ, ЛГУ и др.), а также сотни школ и лицеев г. Москвы используют обучающие программы ММТиДО в образовательном процессе. Курсы серии TeachPro по Математике, Физике и Химии, разработанные совместно с СГА, получили золотую медаль и Диплом ВВЦ (№82 от 29.10.02) на выставке "Современная образовательная среда 2002 г. ". ММТиДО успешно выполнил государственные заказы Госкомстата РФ по разработке и созданию мультимедийных обучающих программ для временных переписных работников – «TeachPro Перепись 2002», за что несколько сотрудников ММТиДО Указом Президента РФ от 14.10.02 награждены медалью "За заслуги в проведении всероссийской переписи населения", а также «TeachPro Сельскохозяйственная перепись 2006».
e-Издательство «ММТ и ДО»
413
Курс "TeachPro Internet Trading" по мнению самого авторитетного американского профессионального издания в области трейдинга — "Technical Analysis Of Stocks And Commodities" "не имеет равных на всем американском рынке". (См. www.terratrade.ru/vcollege.html). В разное время наши заявки на конкурсы, проводимые Минобрнауки, поддерживали: Фельдштейн Д.И. — вице-президент РАО, Бондырева С.К. — академик РАО, Гулидов А.Д. — заместитель гендиректора Росстата, Песоцкий Ю.С. — гендиректор «Росучприбор", Солдаткин В.И. — гендиректор "Российского государственного. института открытого образования» и др. ведущие специалисты. Наши партнеры — ЦБ РФ, Госдума РФ, Мэрия Москвы, МЧС, Госкомстат, Русский Алюминий, Тюменская Нефтяная Компания, 1С, Лукойл, РБК и др. известные организации.
Мультимедийные самоучители на CD-ROM Серия «TeachPro™» «TeachPro™» — это серия интерактивных компьютерных учебников. При использовании этих программ обучаемому не требуется иметь никакой справочной или учебной литературы, не понадобится обращаться к преподавателю или более опытному пользователю, заниматься на дорогостоящих курсах, — полный цикл лекций и практические занятия позволят самостоятельно освоить данный предмет. Обучение в системах TeachPro™ построено следующим образом: компьютер, выступая в роли опытного педагога, использует приемы реальной работы с учащимися. Каждый цикл лекций предоставляет исчерпывающий набор знаний, умений и навыков, достаточных для работы с изучаемым предметом. Занятия осуществляются в форме диалога, таким образом проверяется объем изученного материала. Тесты в конце каждого урока позволят оценить и закрепить знания учащегося. Для группового обучения в локальных сетях «ММТ и ДО» предлагает сетевые версии обучающих программ TeachPro™.
414
TeachPro Microsoft Access 2003
Мультимедийные самоучители серии «TeachPro™» по программным продуктам Microsoft. Серия представляет собой набор интерактивных курсов, предназначенных для обучения работе с программами пакета Microsoft. Учебники будут в равной степени полезны как новичкам, так и опытным пользователям. Люди, не имеющие навыков работы с компьютером, смогут быстро освоить выбранный продукт; опытные же пользователи наверняка узнают множество приемов по работе с системой. Занятия организованы таким образом, что, прослушав только первые лекции, вы уже сможете начать реальную работу с изучаемой программой. Продолжая занятия, вы, максимально автоматизируя свою работу, будете постепенно расширять круг решаемых задач, использовать новые инструменты, создавать все более серьезные и объемные проекты. На практике программные продукты Microsoft применяются почти повсеместно. Но, как уже говорилось, используются далеко не так широко, как могли бы. И дело здесь не только в недостатке знаний у пользователей. В этом повинны, в частности, многочисленные справочники и руководства (всех видов, мастей и названий), которыми усыпаны книжные прилавки. Авторы данных курсов уполномочены заявить со всей ответственностью — нам не встретился ни один учебник, который позволил бы качественно освоить любой из продуктов Microsoft, не имея начальной подготовки. Хорошие комплексные знания предмета можно получить, занимаясь с группой на курсах, но, во-первых, далеко не каждые курсы дают действительно полные и хорошие знания, а, вовторых, это весьма дорогое удовольствие, и отнимает оно много времени (одна дорога туда и обратно чего стоит). Курсы серии «TeachPro™» совмещают в себе качество знаний, получаемых при занятиях в хорошей группе с опытным преподавателем, с индивидуальной работой с учебником и справочным руководством. Вы будете поражены, убедившись, как легко и быстро усваиваются новые знания, методы и приемы работы.
e-Издательство «ММТ и ДО»
415
Мультимедийные самоучители по изучению иностранных языков Cерия «DeLuxe» «DeLuxe» — серия мультимедийных учебников для самостоятельного изучения иностранных языков, разработанное в соответствии с концепцией современного интенсивного и интерактивного обучения иностранным языкам. Благодаря нашим курсам вы сможете корректировать своё произношение с помощью компьютера; научитесь быстро и правильно конструировать предложения; изучите грамматику и фонетику; озвученный и иллюстрированный словарь (12000 слов) позволит быстро пополнить словарный запас. Глубоко продуманная методика, разработанная специально для компьютерного обучения иностранным языкам, огромный объем тщательным образом подобранного материала и интеллектуальные средства контроля в совокупности создают все предпосылки для эффективного изучения иностранного языка. Диалог. Раздел состоит из 144 диалоговых ситуаций из жизни. Каждый урок содержит словарь, грамматические пояснения, упражнения по отработке произношения, написания и перевода слов и фраз. Вы сможете стать активным участником диалогов, моделируя речевые ситуации с помощью микрофона. Фильм. Звуковой ряд, слайды и текст помогают понять, как говорят в стране, язык которой вы изучаете, уловить различие диалектов и просто почувствовать язык. Если возникнут сложности с пониманием фильма, перейдите в пошаговый режим. В нем вы сможете проработать каждую фразу. Словарь. Иллюстрированный и озвученный словарь курса содержит более 12000 слов, что достаточно для свободного общения на языке. Работа со словарём делится на 4 этапа и проходит в интерактивном режиме, где вместе с виртуальным учителем Вы сначала знакомитесь со словами и их произношением, потом учитесь правильно писать, а затем и произносить их. Такая система, мобилизуя все механизмы памяти, делает процесс запоминания наиболее эффективным и быстрым. Раздел снабжён поисковой системой, что облегчит поиск интересующего вас слова. Грамматика. С помощью доступного и удобного грамматического раздела курса вы научитесь грамотно и красиво говорить и писать на изучаемом языке. Фонетика. Этот раздел курса содержит исчерпывающий теоретический материал по фонетике и практические занятия по отработке произношения отдельных слов, интонации, скорости и ритмичности речи. Администрирование. Курс снабжён уникальной системой контроля и координации учебного процесса, которая состоит из системы сбора статистики успеваемости каждого пользователя по всем разделам и системы администрирования, которая позволяет привилегированному пользователю отслеживать успеваемость всех пользователей курса и настраивать индивидуальные уровни сложности для каждого из них. Система <Администратор> пригодна для использования в дистанционном обучении: статистические данные через Internet отправляются на сервер Дистанционного Обучения, кото-
416
TeachPro Microsoft Access 2003
рый таким же образом управляет локальным компьютером в зависимости от успеваемости пользователя. Курсы снабжены дополнительным сервисом: теперь пользователь может самостоятельно настраивать систему (таймер, будильник, настройка временных интервалов между фразами в диалогах). Весь учебный материал из любого раздела можно вывести на печать. Важным отличаем DeLuxe от предыдущих версий и аналогичных обучающих программ является интеграция всех подсистем курса (диалоги, словарь, фильм, грамматика) в единую обучающую среду, что позволяет развивать все аспекты языка взаимосвязанно.
Мультимедийные самоучители по программным продуктам Microsoft на CD-ROM TeachPro Word 2003
Cамоучитель по Microsoft Word 2003.
TeachPro Excel 2003
Cамоучитель по Microsoft Excel 2003.
TeachPro Access 2003
Cамоучитель по Microsoft Access 2003.
TeachPro PowerPoint 2003
Cамоучитель по Microsoft PowerPoint 2003.
TeachPro Outlook 2003
Cамоучитель по Microsoft Outlook 2003.
TeachPro FrontPage 2003
Cамоучитель по Microsoft FrontPage 2003.
TeachPro Visio 2003
Cамоучитель по Microsoft Visio 2003.
TeachPro Publisher 2003
Cамоучитель по Microsoft Publisher 2003.
TeachPro OneNote 2003
Cамоучитель по Microsoft OneNote 2003.
TeachPro Internet 2003
Cамоучитель по Microsoft Internet 2003.
TeachPro Office 2003
Cборник самоучителей по Word 2003, Excel 2003, Access 2003, Outlook 2003, PowerPoint 2003, FrontPage 2003, Visio 2003, Publisher 2003 и OneNote 2003.
TeachPro Windows XP
Cамоучитель по Microsoft Windows XP.
TeachPro Word 2002
Cамоучитель по Microsoft Word 2002.
TeachPro Excel 2002
Cамоучитель по Microsoft Excel 2002.
TeachPro Access 2002
Cамоучитель по Microsoft Access 2002.
TeachPro PowerPoint 2002
Самоучитель по Microsoft PowerPoint 2002.
TeachPro Outlook 2002
Cамоучитель по Microsoft Outlook 2002.
TeachPro Internet 2002
Cамоучитель по Microsoft Internet 2002.
TeachPro FrontPage 2002
Cамоучитель по Microsoft FrontPage 2002.
e-Издательство «ММТ и ДО» TeachPro Win&Office XP
417 Cборник самоучителей по Windows ХР, Word 2002, Excel 2002, Access 2002, Outlook 2002, PowerPoint 2002, FrontPage 2002 и Internet 2002.
Самоучители для школьников и абитуриентов TeachPro ОБЖ
Основы безопасности жизнедеятельности для 10 класса.
TeachPro Физика 11 класс
Физика по программе для 11 класса.
TeachPro Физика
Физика для абитуриентов для 7-11 классов.
TeachPro Математика
Математика для абитуриентов для 7-11 классов.
TeachPro Химия
Химия для абитуриентов для 7-11 классов
TeachPro Решебник по Физике
Решебник по физике для 7-11 классов.
TeachPro Решебник по Математике
Решебник по математике для 7-11 классов.
TeachPro Решебник по Химии
Решебник по химии по 7-11 классов.
TeachPro Информатика
Информатика для абитуриентов.
Самоучители по языкам программирования TeachPro С++
Самоучитель С++.
TeachPro JAVA
Самоучитель JAVA.
TeachPro Visual Basic .Net
Самоучитель Visual Bacic. Net.
TeachPro Visual Basic for Applications
Самоучитель Visual Basic for Applications.
Самоучители по графическим программам TeachPro Flash MX
Самоучитель по Flash MX.
TeachPro Adobe PageMaker
Самоучитель по Adobe PageMaker 7.0.
TeachPro AutoCad 2005
Самоучитель по AutoCad 2005.
TeachPro Adobe Premiere Pro 1.5
Самоучитель по Adobe Premiere Pro 1.5.
TeachPro Adobe Photoshop CS
Самоучитель по Adobe Photoshop CS.
TeachPro Adobe Illustrator CS
Самоучитель по Adobe Illustranor CS.
418
TeachPro Microsoft Access 2003
TeachPro 3D Studio Max6
Самоучитель по Adobe по 3D Studio Max6.
TeachPro CorelDraw 12
Самоучитель по Adobe по CorelDraw 12.
TeachPro Web-дизайн
Самоучитель по Web-дизайну.
TeachPro Quark XPress 6.0
Самоучитель по Quark XPress 6.0.
TeachPro Adobe Photoshop
Самоучитель по Adobe Photoshop 6.0.
Самоучители по другим приложениям TeachPro Утилиты
Самоучитель по утилитам. (Описано 29 утилит: архиваторов, файловых менеджеров, антивирусных программ, программ для работы со звуковыми файлами и для настройки и оптимизации работы ОС).
TeachPro Excel на производстве
Учебник. Проектирование производственного программного обеспечения в среде Microsoft Excel.
TeachPro Лекции по математике для юристов
Самоучитель математики для юристов.
TeachPro СПЭС
Индивидуальный компьютерный тренинг. Самоучитель по справочно-правовым и экономическим системам. Консультант плюс, Кодекс, Ваше право, Гарант, ЮСИС, 1С-Бухгалтерия, ProjectExpert.
TeachPro Internet Trading
Самоучитель по операциям с ценными бумагами в Internet (на английском языке).
TeachPro Массаж
Учебник по теории и практике точечного массажа.
TeachPro PC User 98
Сборник обучающих программ по MS Windows, MS Office и Internet.
Евангелия
Мультимедийное издание.
TeachPro Программы Самоучитель компьютерных программ для профессионального перевода профессиональных переводчиков.
Самоучители по иностранным языкам English DeLuxe
Самоучитель американского английского языка.
Oxford DeLuxe
Самоучитель английского языка.
Deutsch DeLuxe
Самоучитель немецкого языка.
Franсais DeLuxe
Самоучитель французского языка.
Espanol DeLuxe
Самоучитель испанского языка.
Italiano DeLuxe
Самоучитель итальянского языка.
e-Издательство «ММТ и ДО» Japanese DeLuxe
419 Самоучитель японского языка.
Chinese DeLuxe
Самоучитель китайского языка.
Немецкий язык
Библиотека наглядных пособий.
Английский язык. 5-9 классы
Самоучитель английского языка для 5-9 классов.
Немецкий язык. 5-9 классы
Самоучитель немецкого языка для 5-9 классов.
Французский язык. 5-9 классы
Самоучитель французского языка для 5-9 классов.
Испанский язык. 5-9 классы
Самоучитель испанского языка для 5-9 классов.
Японский язык. 5-9 классы
Самоучитель японского языка для 5-9 классов.
Итальянский язык для детей
Самоучитель итальянского языка для детей.
Китайский язык для детей
Самоучитель китайского языка для детей.
Самоучители русского языка для иностранцев Серия Gold 2000 Golden Russian 2000
Учебник русского языка для англичан.
Russe d’Or 2000
Учебник русского языка для французов.
Goldenes Russisch 2000
Учебник русского языка для немцев.
Ruso de Oro 2000
Учебник русского языка для испанцев.
Golden Russian 2000
Учебник русского языка для японцев.
Под редакцией Григория Антонова
TeachPro Microsoft
Access 2003 Ответственный редактор В.Ф.Гончаров Художественный редактор Ю. М. Славнова Компьютерная верстка К. А. Савичев
Издательская лицензия ИД № 06489 Гигиенический сертификат №77.99.02.953.П.000415.02.02 от 28.02.2002
Наши координаты: 111024, Москва, Шоссе Энтузиастов, д. 20А тел. (495) 673-7692, (495) 673-7693 факс (495) 673-5975 http://www.mmt-dl.ru
[email protected] — отдел продаж
[email protected] — служба технической поддержки
[email protected] — замечания и предложения по сайту
[email protected] — общая информация о наших продуктах
[email protected] — другие вопросы