- •Часть I. Хранение данных в таблицах 34
- •Глава 1. Создание вашей первой базы данных 35
- •Глава 2. Создание более сложных таблиц 66
- •Глава 3. Обработка листа данных: сортировка, поиск,
- •Глава 4. Блокировка неправильных данных 136
- •Глава 5. Связывание таблиц с помощью отношений 168
- •Часть II. Обработка данных с помощью запросов 206
- •Глава 6. Запросы, выбирающие записи 207
- •Глава 7. Основные хитрости, применяемые в запросах 241
- •Глава 8. Запросы, обновляющие записи ..272
- •Глава 9. Анализ данных с помощью перекрестных запросов и
- •Часть III. Отчеты 323
- •Глава 10. Создание отчетов 324
- •Глава 11. Проектирование сложных отчетов 356
- •Часть IV. Разработка пользовательского интерфейса
- •Глава 12. Создание простых форм 392
- •Глава 13. Проектирование сложных форм 426
- •Глава 14. Создание системы переходов 465
- •Часть V. Программирование в access 496
- •Глава 15. Автоматизация задач с помощью макросов 497
- •Глава 16. Автоматизация выполнения задач средствами языка
- •Глава 17. Написание кода с более развитой логикой 571
- •Часть VI. Совместное использование access 615
- •Глава 18. Совместное использование бд несколькими пользователями 616
- •Глава 19. Импорт и экспорт данных 650
- •Глава 20. Подключение Access к sql Server 692
- •Глава 21. Подключение Access к SharePoint 724
- •На профессиональном уровне. Преимущества хорошо спроектированной базы данных
- •Для тех, кто понимает. Когда программы Access недостаточно
- •Уголок ностальгии. Зачем опять изобретать колесо?
- •Уголок ностальгии. Сочетания клавиш в Access 2003
- •Часть I
- •Часто задаваемый вопрос. Использование чужой бд
- •На профессиональном уровне. Шаблоны, подходящие для разных целей
- •На профессиональном уровне. Работа Access в интерактивном режиме
- •Для тех, кто понимает. Использование Access бд, созданных в более ранних версиях программы
- •На профессиональном уровне. Проектирование бд для начинающих
- •На профессиональном уровне. Вставка больших значений в узкие столбцы
- •Для тех. Кто понимает. Если сомневаетесь, не удаляйте
- •Малоизвестная или недооцененная возможность. Копирование записи целиком за один шаг
- •Малоизвестная или недооцененная возможность. Сжатие бд
- •Часто задаваемый вопрос. У какого файла расширение laccdb?
- •Практические занятия для опытных пользователей. Изменение папки, которую Access использует для хранения бд
- •Малоизвестная или недооцененная возможность. Сворачивание ленты
- •Экономящая время подсказка. Создание ярлыка для таблицы
- •Глава 2
- •Для тех, кто понимает. Изменение типа данных может привести к потере информации
- •На профессиональном уровне. Нормативы максимальной длины
- •На профессиональном уровне. Как Access предотвращает дублирование записей
- •На профессиональном уровне. Почему так важна уникальность
- •Глава 3
- •Малоизвестная или недооцененная возможность. Настройка всех листов данных
- •На профессиональном уровне. Числа и специальные символы в текстовых полях
- •Практические занятия для опытных пользователей. Фильтры в противоположность запросам
- •Малоизвестная или недооцененная возможность. Поиск и замена
- •Глава 4
- •Для тех, кто понимает. Не требуйте слишком многого
- •На профессиональном уровне. Как работают индексы
- •Часто задаваемый вопрос. Индексы и производительность
- •Практические занятия для опытных пользователей. Вставка вашей маски в список масок программы
- •На профессиональном уровне. Создание списка подстановки, использующего другую таблицу
- •Глава 5
- •Часто задаваемый вопрос. Отключение обеспечения целостности данных
- •Для тех, кто понимает. Пользуйтесь каскадным удалением с осторожностью
- •Практические занятия для опытных пользователей. Изменение параметров подтаблицы
- •Часто задаваемый вопрос. Обновление списка
- •Для тех, кто понимает. Применяйте связи "один-к-одному" с осторожностью
- •Часто задаваемый вопрос. Работа со связями "многие-ко-многим"
- •Часто задаваемый вопрос. Печать ваших отношений
- •Часть II
- •Для тех, кто понимает. Не бойтесь подстановок
- •На профессиональном уровне. Синтаксис фильтра
- •Практические занятия для опытных пользователей. Как индексы ускоряют поиск
- •Малоизвестная или недооцененная возможность. Запросы на базе запросов
- •Для тех, кто понимает. Подумайте дважды, прежде чем изменять структуру таблиц
- •На профессиональном уровне. Сравнение: отношения и объединения
- •На профессиональном уровне. Изменение данных при использовании запроса с объединением
- •Глава 7
- •На профессиональном уровне. Синхронизация запросов
- •Малоизвестная или недооцененная возможность. Переименование поля в запросе
- •Часто задаваемый вопрос Банковское округление
- •Практические занятия для опытных пользователей. Улучшенные числовые форматы
- •Малоизвестная или недооцененная возможность. Использование случайных чисел для сортировки в случайном порядке
- •Практические занятия для опытных пользователей. Как извлечь первое слово из текстовой строки
- •Для тех, кто понимает. Вычисления для дат и времени
- •Глава 8
- •Аварийная ситуация. Когда Access блокирует ваше обновление
- •Малоизвестная или недооцененная возможность. Скрытие запроса
- •Глава 9
- •Часто задаваемый вопрос. Итоговый проигрыш; итоговый запрос против перекрестного
- •Для тех, кто понимает. Создание запроса с объединением для лучшей группировки
- •На профессиональном уровне. Правильный выбор групп
- •Малоизвестная или недооцененная возможность. Помещение сводных таблиц в их собственные формы
- •Часть III
- •Глава 10. Создание отчетов
- •Глава 11. Проектирование сложных отчетов
- •Глава 10
- •На профессиональном уровне. Выполнение тяжелой работы с помощью запроса
- •Часто задаваемый вопрос. Добавление изображений в отчеты.
- •На профессиональном уровне. Учитесь любить pdf-файлы
- •Часто задаваемый вопрос. Разные способы экспорта данных
- •Малоизвестная или недооцененная возможность. Формат по образцу.
- •Практические занятия для опытных пользователей. Разные линии сетки
- •Глава 11
- •Часто задаваемый вопрос. Ошибки выражений
- •Часть IV
- •На профессиональном уровне. Поля типа Счетчик в формах
- •На профессиональном уровне. Разные люди — разные формы
- •Малоизвестная или, недооцененная возможность. Вывод на экран изображений из бд
- •На профессиональном уровне. Семейство форм Access
- •Глава 13
- •На профессиональном уровне. Присоединенные элементы управления
- •Малоизвестная или недооцененная возможность. Повторное применение ваших любимых настроек стиля границ
- •Часто задаваемые вопросы. Осовременивание элементов управления Windows
- •Практические занятия для опытных пользователей. Как освободиться от привязки к сетке
- •На профессиональном уровне. Насколько велик ваш экран?
- •Глава 14
- •Малоизвестная или недооцененная возможность. Варианты сортировки и просмотра в области переходов
- •На профессиональном уровне. Кнопочные формы с несколькими страницами
- •За кадром. Меню кнопочных форм сохраняются в бд
- •Часть V
- •На профессиональном уровне. Макросы по сравнению с программным кодом
- •Практические занятия для опытных пользователей. Обработка ошибок макроса
- •На профессиональном уровне. Макрокоманды, которым Access не доверяет
- •На профессиональном уровне. ОтправитьОбъект работает с вашей программой элекронной почты
- •Часто задаваемый вопрос. Внедренный макрос
- •Глава 16
- •Малоизвестная или недооцененная возможность. Справка по Visual Basic
- •Для тех кто понимает. Как код связывается с событиями
- •Малоизвестная или недооцененная возможность Разбиение длинных строк кода
- •На профессиональном уровне. Взаимодействие с другими формами
- •Практические занятия для опытных пользователей. Получение нужного цвета
- •Часто задаваемый вопрос. Ленточные формы и неприсоединенные элементы управления
- •Практические занятия для опытных пользователей. Связывание записей с рисунками
- •Глава 17
- •Практические занятия для опятных пользователей. Применение более сложных переменных
- •Практические занятия для опытных пользователей. Применение пользовательских функций в запросах
- •На профессиональном уровне. Алгоритм Луна (Luhn Algorithm)
- •Часто задаваемый вопрос. Запуск других Windows-программ
- •На профессиональном уровне. Станьте знатоком статистических функции по подмножеству
- •Уголок ностальгии. Dао против аdо
- •Часть VI
- •Для тех, кто понимает. Поиск места в сети для вашей бд
- •На профессиональном уровне Указание местонахождения в сети
- •Часто задаваемый вопрос. Как поведут себя старые версии Aсcess?
- •Аварийная ситуация. Мистическая ошибка “Файл уже используется”
- •Часто задаваемый вопрос. Когда не следует пользоваться форматом accde
- •Уголок ностальгии. Отмирание страниц доступа к данным
- •Практические занятия для опытных пользователей. Разделение таблиц для более безопасных корректировок
- •Уголок ностальгии. Защита с помощью рабочих групп упразднена
- •Глава 19
- •На профессиональном уровне. Sql Server и SharePoint: два частных случая
- •Сберегающая время подсказка. Копирование из одной бд в другую
- •На профессиональном уровне. Опасность дубликатов
- •Малоизвестная или недооцененная возможность. Экспорт отчетов
- •На профессиональном уровне. Более внимательный взгляд на теги
- •Глава 20
- •На профессиональном уровне. Важнейшие причины перехода на sql Server
- •Часто задаваемые вопрос. Можно ли доверять корпорации Microsoft?
- •На профессиональном уровне. Проекты Access по сравнению со связанными таблицами
- •0 Запросах
- •Для тех, кто понимает. Синтаксические различия
- •Глава 21
- •Часто задаваемый вопрос. Путаница, связанная с SharePoint
- •На профессиональном уровне. Установка SharePoint
- •На профессиональном уровне. Пять интересных инструментов программы SharePoint, которые стоит опробовать
- •Малоизвестная или недооцененная возможность.
- •Малоизвестная или недооцененная возможность. Представление таблицы данных Access
- •Малоизвестная или недооцененная возможность. Параметры списков SharePoint
Практические занятия для опятных пользователей. Применение более сложных переменных
В примере, приведенном выше, показан простейший способ создания переменной в коде на языке VB. В нем создается переменная, известная как Variant и способная хранить любой тип данных, включая текст, числа, логические значения и т. д. Грамотные VB-программисты предпочитают быть строже и явно задают тип данных для каждой создаваемой ими переменной. В этом случае никто случайно не сохранит текст в переменной, предназначенной для числового содержимого и наоборот.
Для создания переменной с фиксированным типом данных вы добавляете в объявление ключевое слово As. Вот как создается переменная TextContent для хранения только текста:
Dim TextContent As String
Далее создается переменная, которая хранит большие целые числа:
Dim NumberContent As Long
Подобный подход считается хорошим стилем программирования и помогает выявлять определенные типы ошибок. Но для его применения нужно знать разные типы данных языка Visual Basic. К наиболее часто используемым относятся String, Date, Boolean (значения Истина или Ложь), Long (целое, которое может быть очень маленьким или очень большим), single (число с дробной частью) и Currency (числовой тип данных, идеально подходящий для хранения финансовых сумм).
Описание всех типов данных языка VB можно найти в справочной системе программы Access. Для перехода к ней выберите Справка → Справка: Microsoft Visual Basic (Microsoft Visual Basic Help → Microsoft Visual Basic help) из меню редактора Visual Basic. Далее выберите последовательно Visual Basic for Applications Language Reference → Visual Basic Language Reference → Data Types.
После того как переменная создана, в нее можно помещать информацию и извлекать из нее данные. Для выполнения обеих операций применяется известный знак равенства, так же как и в случае свойств.
Далее приведен пример сохранения некоторого текста в переменной:
TextContent = "Тестовый текст"
В следующем примере все сведения собраны вместе. В нем используется переменная для взаимообмена информацией между двумя текстовыми полями.
Dim TextContent
' Копируется текст из первого поля для использования в дальнейшем
TextContent = TextBoxOne.Value
' Заменяется текст в первом поле
TextBoxOne.Value = TextBoxTwo.Value
' Заменяется текст во втором поле с помощью переменной
TextBoxTwo.Value = TextContent
Принятие решений
Условная логика, еще один ключевой элемент программирования, — это код, который выполняется при соблюдении определенного условия. Для применения условной логики нет никаких ограничений. Можно помешать обновлению, если вновь введенные данные не проверены. Или же возможна иная настройка элементов управления на форме в зависимости от их данных. Все это и многое другое можно сделать с помощью условной логики.
Любой условный блок начинается с условия: простого выражения, которое может принимать значение Истина или Ложъ (программисты называют этот процесс проверкой истинности или ложности условия). Затем ваш код может принять решение о выполнении разных логических алгоритмов в зависимости от оценки условия. Для построения условия необходимо сравнить переменную или свойство с помощью логической операции, например = (равно), < (меньше чем), > (больше чем) и о (не равно). Например, Price=10 — это условие. Оно может быть истинно (если в поле Price содержится число 10) или ложно (если в этом поле содержится любое другое число). Условия уже применялись в правилах верификации или условиях на значения. В языке Visual Basic условия следуют набору очень похожих правил.
Само по себе условие не может ничего сделать. Но в сочетании с другим кодом оно может стать чрезвычайно мощным инструментом. После того как подходящее условие создано, его можно поместить в специальную структуру, именуемую блоком If. Блок If вычисляет условие и выполняет часть кода, если условие истинно. Если условие ложно, программа Access полностью игнорирует код.
Далее приведен пример блока If, проверяющего, не превышает ли значение в поле Price числа 100. Если да, то Access выводит на экран сообщение:
If Price > 100 Then
MsgBox "Надеюсь, у вас выделены деньги для этого."
End If
Обратите внимание на то, что блок If всегда начинается со слова If и заканчивается оператором End If. Внутри блока If можно поместить столько строк кода, сколько захотите. Это условный код, он выполняется, только если условие истинно.
В условном блоке может проверяться несколько разных условий. Далее приведен пример, в котором вычисляется цена товара с учетом всех налогов, а затем отображается в элементе управления Подпись. Хитрость заключается в том, что налоговая ставка зависит от другого поля (Country) и именно здесь в игру вступает условная логика.
' В этой переменной сохраняется налоговая ставка,
‘которую вы хотите применить
Dim TaxRate
If Country = "U.S.A." Then
' Налоги меняются для клиентов из США (7%)
TaxRate =1.07
Elself Country = "Canada" Then
' Еще большие налоги взимаются с клиентов из Канады (14%)
TaxRate =1.14 Else
' Все остальные освобождаются от налогов
TaxRate =1 End If
' Окончательный итог отображается в подписи
TotalWithTax.Caption = Price * TaxRate
ВблокеI f выполняется только один сегмент кода. В данном примере программа Access по-своему обрабатывает блок, проверяя каждое условие до тех пор, пока не найдет подходящее. Как только совпадение найдено, выполняется условный блок кода и последующий переход к завершающему оператору End I f, а затем продолжается обработка остального кода, входящего в процедуру. Если нет подходящих условий, Access выполняет код в заключительном операторе Else (если вы его вставили). На рис. 17.2 показано выполнение данного кода.
Рис. 17.2. Благодаря условной логике эта подчиненная форма всегда отображает правильно вычисленную окончательную цену, учитывая как текущую цену, так и страну клиента. Она действует в ответ на событие Текущая запись (On Current), возникающее каждый раз, когда запись выводится на экран
Эти примеры показывают лишь лежащие на поверхности возможности условной логики. Можно применять ключевые слова And и Or для комбинирования условий, помещать один условный блок в другой и т. д.
В главе 15 вы видели пример, который выполнял проверку на значение конкретного типа в записях клиентов. Эта проверка использовала два поля: WantsEmail и Email Address. Если в поле WantsEmail было задано значение Да (Yes), поле EmailAddress не могло оставаться
пустым. Но если у поля WantsEmail было значение Нет (No), пустое поле EmailAddress считалось вполне приемлемым. Вы можете с помощью VB-кода реализовать идентичную логику проверки, но тут есть хитрость — в проверке применяются два блока If (следом за кодом дается построчное объяснение1):
1 Private Sub Form_BeforeUpdate(Cancel As Integer)
' Проверяется, нужен ли электронный адрес
2 If WantsEmail = True Then
' Убеждаемся, что поле EmailAddress не пустое или незаполненное
3 If EmailAddress = "" Or IsNull(EmailAddress) Then
' Это некорректный вариант.
' Отмена изменения и вывод сообщения
4 MsgBox "You can't be notified without an email address."
5 Cancel = True
6 End If
7 End If
8 End Sub
Вот как выполняется приведенный код.
В строке 1 объявляется программная процедура, обрабатывающая событие формы До обновления (On Before Update). Обратите внимание на то, что этот обработчик события получает одну порцию данных — значение True (Истина) или False (Ложь) в параметре Cancel, который позволяет задать запрет обновления.
В строке 2 начинается блок If, проверяющий установлен ли флажок WantsEmail.
В строке 3 выполняется вторая проверка. Она несколько сложнее, потому что есть две вещи, способные вызвать выполнение условного кода. Он выполняется, если адрес электронной почты равен пустому значению (что происходит при стирании введенного электронного адреса) или если поле адреса не заполнено (т. е. электронный адрес не вводился ни разу; см. обсуждение значений null в разд. "Пропущенные значения и пустые строки" главы 4).
ш Строка 4 выводит пояснительное сообщение об ошибке. Помните о том, что этот фрагмент кода выполняется, только если оба блока If имеют значение True. Если обе проверки выдают значение False (флажок WantsEmail не установлен или поле EmailAddress не задано), Access немедленно возвращается назад.
Примечание
Технически можно оба эти блока If объединить в один блок с помощью более сложного условия, проверяющего все сразу. Но сделать это правильно (и впоследствии понять, что вы написали) гораздо труднее. Опытные программисты знают, что всегда лучше писать ясный код, даже если при этом он становится слегка многословнее.
1 В тексте строки кода пронумерованы. Обратите внимание, что в реальном коде нумеровать строки не следует. — Ред.
Строка 5 отменяет обновление с помощью параметра Cancel, предоставляемого событием До обновления (On Before Update). В этом случае изменения не происходят, и запись остается в режиме редактирования.
Строки 6—8 — завершающие: они закрывают оба блока If и заканчивают процедуру.
У программы Access есть множество событий, которые вы можете отменить, как событие До обновления (On Before Update). Поищите параметр Cancel, располагающийся в скобках после имени процедуры. Если он там, можно задать ему значение True для прекращения действия, которое готово произойти.
Повторение действий с помощью цикла
Цикл — это инструмент, позволяющий повторять операцию столько раз, сколько нужно. В языке Visual Basic есть несколько типов циклов, которые можно использовать. Наиболее популярны блоки Do/Loop и For /Next, и в этом разделе вы познакомитесь с обоими.
Далее приведен пример блока Do/Loop, который наверняка выведет читателей из равновесия:
Do
MsgBox "Ever ever get that nagging deja vu feeling?" Loop
Когда программа Access обрабатывает этот код, она начинает с вывода окна сообщения и остановки выполнения остального вашего кода. После того как вы щелкнули мышью кнопку ОК, выполнение кода продолжается до финального оператора Loop в конце цикла. В этот момент программа автоматически переходит к началу цикла (оператор Do) и повторяет ваш код, выводя второе окно сообщения. Проблема в том, что этот процесс продолжается бесконечно! Если допустить ошибку и запустить этот код, ваша БД будет заблокирована на неопределенное время (пока вы не нажмете комбинацию клавиш аварийного останова <Ctrl>+<Break>).
Для того чтобы избежать подобной ситуации, следует создавать все циклы с условием выхода из цикла, сигнализирующим о моменте его завершения. Далее приведен исправленный вариант того же цикла, который прекращается после того, как сообщение отображено пять раз:
' Отслеживает количество повторений цикла
Dim NumberOfTimes
' Начинает отсчет с 0
NumberOfTimes = 0
Do
MsgBox "Ever ever get that nagging deja vu feeling?"
' Увеличивает счетчик на 1
NumberOfTimes = NumberOfTimes + 1
Loop Until NumberOfTimes =5
Важная часть — оператор в конце цикла, Until Number0fTimes=5. Он определяет условие, и как только оно становится True (значение переменной NumberOfTimes равно 5), программа Access достигает конца цикла и переходит к выполнению оставшегося кода процедуры.
Если вам нужен цикл с фиксированным количеством повторений, возможно, вас заинтересует цикл типа For/Next. Этот тип цикла в точности такой же, как цикл Do/Loop за исключением того, что у него есть встроенный счетчик, увеличивающийся автоматически при каждом проходе цикла.
Теперь можно переписать предыдущий пример в более компактной форме с применением цикла For/Next:
Dim NumberOfTimes
For NumberOfTimes = 1 To 5
MsgBox "Ever ever get that nagging deja vu feeling?"
Next
Важная часть цикла - оператор NumberOfTimes=l To 5, сообщающий программе Access о начальном значении переменной NumberOfTimes, равном 1, о необходимости увеличения ее значения на 1 при каждом проходе цикла и о завершении цикла после пятого прохода.
Цикл Do/Loop удобен при обработке коллекции данных. Его можно применять для обработки информации до тех пор, пока она не иссякнет, даже если заранее вы не знаете, сколько данных у вас есть. Вы увидите пример использования этого метода в конце данной главы, когда будете выполнять пакетное обновление вашей БД с помощью программного кода.
С другой стороны цикл For/Next предстанет во всей красе, если вы можете точно определить заранее, сколько раз хотите повторить цикл. В справедливости этого вы убедитесь чуть позже в этой главе, когда будете проверять номера кредитных карт.
Создание пользовательских функций
Вы уже научились создавать собственные процедуры, но еще не знаете о том, как создать их старшую сестру, функцию.
Функция, как и процедура, — изолированный фрагмент кода, способный включать в себя произвольное число операторов. И, так же как и процедуры, функции можно добавлять в модули. В модуле может сосуществовать рядом любое количество процедур и функций.
Function DoSomething()
'Здесь код функции
End Function
Главное отличие функции от процедуры заключается в том, что функция формирует конечный результат. Другими словами, функции предоставляют порцию нужных вам данных.
Вы задаете результат, написав строку кода, которая присваивает окончательное значение имени функции. (По существу, вы считаете, что имя функции — это переменная, в которой можно хранить некоторые данные.)
Далее приведен пример:
Function GetMyFavoriteColor()
GetMyFavoriteColor = "Magenta" End Function
Эта функция названа GetMyFavoriteColor (получение моего любимого цвета). Ее результат — текстовая строка "Magenta" (пурпурный).
Вызов функции несколько отличается от вызова процедуры. Для вызова процедуры вы используете имя модуля, за которым следует точка, а затем имя процедуры. Этот же способ можно применить и для вызова функции:
MyModule.GetMyFavoriteColor
Но возникает проблема. Этот шаг запускает функцию GetMyFavoriteColor, но отбрасывает результат (строку с текстом Magenta).
Если вас интересует результат, можно вызвать функцию в операторе присваивания. В приведенном далее коде создана переменная для хранения результата и последующего отображения его в окне сообщения:
' Создается переменная для хранения результата
Dim Color
' Вызывается функция и результат сохраняется в переменной
Color = MyModule.GetMyFavoriteColor
' Результат отображается в окне сообщения
MsgBox "Your favorite color is " & Color
Если вы по-настоящему сообразительны, то можете сократить этот код до одной строки и вообще избежать использования переменной Color:
MsgBox "Your favorite color is " & MyModule.GetMyFavoriteColor
Функция GetMyFavoriteColor предельно проста, т. к. не использует аргументы. Но ничто не мешает вам проявить большую изобретательность. Рассмотрите следующую пользовательскую функцию, которая принимает два аргумента — длину и ширину — и вычисляет площадь, перемножая их:
Function Area(Length, Width)
Area = Length * Width
EndFunction
Эти два параметра определяются в скобках после имени функции. Количество параметров может быть любым при условии, что вы отделяете один от другого запятой.
Далее приведен пример вызова данной функции и отображения результата. В нем для определения параметров Length (длина) и Width (ширина) применяются числовые константы. Но их вполне можно заменить именем поля, переменной или свойством, которые вы хотите использовать в функции Area.
MsgBox "The area of a 4x4 rectangle is " & Area(4, 4)
На экране появится:
The area of a 4x4 rectangle is 16
Ни функция GetMyFavoriteColor (), ни функция Area () не продемонстрировали ничего впечатляющего, но в следующем разделе этой главы вы создадите гораздо более мощную функцию для проверки номеров кредитных карт.