Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Access 2007

.pdf
Скачиваний:
115
Добавлен:
11.05.2015
Размер:
23.5 Mб
Скачать

Рис. 4.5. Если вы применяете функцию Date ( ), как значение по умолчанию в поле DateAcquired в таблице с кукламиболванчиками, то при каждой вставке новой записи о кукле программа Access вставляет текущую дату. Вы решаете — оставить ее или заменить другим значением

Примечание

Вы узнаете больше о выражениях языка SQL (Structured Query Language, язык структурированных запросов) в части II.

Предотвращение дублирования значений с помощью индексов

Первое правило любой таблицы — каждая включенная в нее запись должна быть уникальна. Для соблюдения этого требования вам нужно выбрать первичный ключ (см. разд. "Первичный ключ"главы 2), одно или несколько полей, которые не должны дублироваться в разных записях.

Но здесь есть подводный камень. Как вы узнали из главы 2, самый надежный способ — создание идентификационного поля (поля Код) для первичного ключа. До сих пор во все таблицы, которые вы видели, включалось такое поле. Но что, если вам нужно, чтобы другие поля тоже были уникальны? Представьте себе, что вы создаете таблицу Employees (сотрудники). Вы следуете правильным принципам проектирования БД и идентифицируете каждую запись автоматически генерируемым идентификационным номером. Но вы также хотите быть уверены в том, что в таблице нет двух сотрудников с одинаковыми номерами социального обеспечения (Social Security number, SSN), и, тем самым, желаете предупредить возможные ошибки — такие, как случайный повторный ввод данных об одном и том же сотруднике.

141

Примечание

Для того чтобы вспомнить, почему так важны идентификационные поля, еще раз прочитайте примечание "На профессиональном уровне. Как Access предотвращает дублирование записей" в разд. "Первичный ключ" главы 2. В таблице Employees вы конечно можете выбрать SSN в качестве первичного ключа, но ситуация будет далека от идеальной, когда вы начнете связывать таблицы друг с другом (см. главу 5), и возникнут проблемы, если позже понадобится из менить номер социального обеспечения (например, из-за ошибки) или ввести информацию о сотруднике до того, как вы получите SSN.

Вы можете заставить поле требовать уникальных значений с помощью индекса. Индекс БД похож на предметный указатель в книге — это список значений (из поля) с перекрестной ссылкой, которая указывает на соответствующий раздел (полную запись). Если индексировать поле SocialSecurityNumber, программа Access создаст список, подобный приведенному в табл. 4.1 и хранящийся в файле вашей БД.

Таблица 4.1. Список, хранящийся в БД после создания индекса

SocialSecurityNumber

Location of Full Record

001-01-3455

001-02-0434

001-02-9558

002-40-3200

С помощью этого списка программа Access может быстро определить, не дублируется ли в новой записи уже имеющийся SSN. Если это опасение подтверждается, Access не разрешит вставить такое значение.

На профессиональном уровне. Как работают индексы

Важно то, что список номеров социального обеспечения отсортирован. Сортировка означает, что номер 001-01-3455 всегда предшествует в индексе номеру 002-40-3200, независимо от физического размещения записи в БД. Такая сортировка важна, т. к. она позволяет программе Access быстро проверять наличие дубликатов. Если вы вводите номер 001-02-4300, Access достаточно прочитать только первую часть списка. Как только программа обнаружит следующий "больший" SSN (тот, который включен в список позже в результате сортировки, например 001-02-501), она уже знает, что в оставшейся части индекса нет дубликата. На практике все БД используют множество алгоритмов оптимизации для того, чтобы сделать этот процесс стремительным. Но существует один ключевой принцип — без применения индекса программа Access должна проверять всю таблицу. В БД хранятся несортированные таблицы, поэтому программа не может быть уверена в том, что данного SSN нет в таблице до тех пор, пока не проверит каждую запись.

Итак, как применить индекс с полем? Хитрость заключается в применении свойства Индексированное поле (Indexed), которое доступно для данных всех типов за исключением типа Вложение и типа Объект OLE. Когда вы добавляете поле, у его свойства Индексированное

142

поле указано значение Нет. Для вставки индекса и предупреждения дублирования значений вы можете изменить в Конструкторе значение свойства Индексированное поле

на Да (Совпадения не допускаются). При выборе третьего варианта — Да (Допускаются совпадения) — создается индекс, но разрешается нескольким записям иметь одинаковые значения поля. Этот вариант не поможет вам поймать повторяющиеся записи, но его можно применить для ускорения поиска (для получения дополнительной информации см. примечание "Практические занятия для опытных пользователей. Как индексы ускоряют поиск" в разд. "Получение заданного количества первых записей" главы 6).

Примечание

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

Когда вы закрываете Конструктор после изменения свойства Индексированное поле, программа Access напоминает о необходимости сохранить ваши корректировки. В этот момент она создает любые нужные ей новые индексы. Вы не можете создать индекс, запрещающий совпадения, если в вашей таблице уже есть дублирующаяся информация. В данной ситуации Access выводит сообщение об ошибке, когда закрывается Конструктор и программа пытается добавить индекс.

Часто задаваемый вопрос. Индексы и производительность

Индексы — это средство предотвращения ввода неверных данных или средство, повышающее производительность?

Индексы не только препятствуют дублированию значений. Они также незаменимы, когда нужно увеличить скорость обычного поиска. Программа Access может использовать индекс для поиска нужной ей записи во многом так же, как вы применяете предметный указатель в конце книги для поиска конкретной темы или термина.

Если вы выполняете поиск для удаления из таблицы Employees сотрудника с заданным номером социального обеспечения (SSN), Access может применить индекс. С его помощью программа найдет совпадающее значение гораздо быстрее и просто перейдет по указателю к полной записи.

Дополнительную информацию о том, как индексы могут ускорить поиск, вы найдете в

примечании "Практические занятия для опытных пользователей. Как индексы ускоряют поиск" в разд. "Получение заданного количества первых записей " главы. 6. Но важно знать, что индексы улучшают производительность только в случае очень больших и сложных таблиц. Если вы храните несколько сотен записей, в каждой из которых горстка полей, вам на самом деле не нужен индекс — Access и так выполнит поиск с ошеломляющей скоростью.

Индексы для нескольких полей

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

143

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

Примечание

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

Для обеспечения уникальности комбинации полей необходимо создать составной индекс, в котором объединяется информация из нескольких полей. Далее описаны необходимые для этого действия. 1. В Конструкторе выберите на ленте Работа с таблицами | Конструктор → Показать или скрыть → Индексы (Table Tools | Design Show/Hide Indexes).

На экране появится окно Индексы (Indexes) (рис. 4.6). С его помощью можно просмотреть уже созданные индексы и создать новые.

Рис. 4.6. В окне Индексы показаны все индексы, которые определены в таблице.

В нем приведен простой индекс для поля ID (создаваемого программой Access автоматически) и составной индекс, который в данный момент создается

2.Выберите имя для вашего индекса. Введите его в первую пустую строку в столбце Индекс (Index Name)

Имя индекса не важно — программа Access использует его для хранения индекса в БД, но вы не увидите его во время работы с таблицей. Обычно для этого используются имена одного или нескольких полей, которые индексируются (например, LastName+FirstName).

3.Выберите первое поле в столбце Имя поля (Field Name) в той же строке (например, LastName).

Какое поле вы укажете первым, не имеет значения. В любом случае индекс сможет помешать дублированию значений. Но порядок играет роль в случае использования индекса в поиске для повышения производительности. Вы узнаете об этом больше в примечании "Практические занятия для опытных пользователей. Как индексы ускоряют поиск" в разд. "Получение заданного количества первых записей" главы 6.

144

4.В нижней части окна установите значение свойства Уникальный индекс (Unique) равным Да. В этом случае создается индекс, запрещающий совпадения значений (в отличие от индекса, применяемого только для увеличения скорости поиска).

Вы также можете задать значение Да для свойства Пропуск пустых полей (Ignore Nulls), если хотите, чтобы программа Access разрешила дублирование пропущенных (незаданных) значений. Например, вы хотите сделать поле номера социального обеспечения (SSN) необязательным. Но если уж SSN вводится вы хотите быть уверенным в том, что он не совпадает ни с каким другим значением, в данном случае вам следует задать значение Да в свойстве Пропуск пустых полей. Если значение этого свойства равно Нет, программа Access разрешит только одной записи иметь пропущенное (неопределенное) значение в поле SSN, что, возможно, вас не устроит.

Примечание

Можно запретить пропущенные значения вместе с применением свойства Обязательное поле, как описывается в разд. "Запрет незаполненных полей" ранее в этой главе.

Пропустите свойство Ключевое поле (Primary), которое задает индекс первичного ключа.

5.Перейдите на одну строку ниже. Оставьте поле Индекс пустым (это говорит программе Access о том, что это часть предыдущего индекса), но выберите другое поле в столбце Имя поля (например, FirstName).

Если вы хотите создать составной индекс из нескольких полей (больше двух), просто повторяйте этот шаг до тех пор, пока не вставите все нужные поля. На рис. 4.7 показано, как выглядит сформированный индекс. Теперь можно закрыть окно Индексы.

Рис. 4.7. Здесь представлен составной индекс, препятствующий включению в таблицу двух людей с одинаковыми именем и фамилией

Маски ввода

Как вы уже знаете, БД ценят непротиворечивость данных. Если у вас есть поле Height (рост), лучше использовать в нем значения, заданные в одних и тех же единицах измерения,

145

в противном случае ваши данные и ломаного гроша стоить не будут. Аналогично, если у вас есть поле PhoneNumber (номер телефона), лучше убедиться в том, что у всех номеров один и тот же формат. Если одни телефонные номера записаны с дефисами, пробелами и скобками (например, (844) 547-1123), в то время как другие несколько отличаются (скажем, 847-547- 1123), а третьи вообще пропускают междугородний код (547-1123), у вас появится небольшая проблема. Из-за недостатка согласованности вам будет трудно обрабатывать такие данные (например, искать конкретный телефонный номер или отсортировать телефонные номера в зависимости от междугороднего кода).

Рис, 4.8. Вверху: показано поле PhoneNumber с маской, готовое принимать данные. К этому моменту пользователь, вводящий данные, еще не ввел ни одного символа. В поле PhoneNumber автоматически выводится текст, содержащий символы-заполнители. Внизу: маска форматирует номера по мере их ввода. Если вы введете 1234567890 в данную маску телефонного номера, то увидите следующий текст: (123) 456-7890. В файле БД данные хранятся как 1234567890, а на листе данных представлены с привлекательным внешним оформлением. Это оформление и есть маска

Для облегчения обработки значений, имеющих фиксированный шаблон, — например, телефонных номеров — вы можете воспользоваться маской ввода. Маска ввода (или маска для краткости) предоставляет возможность сообщить программе Access, какой шаблон или образец должны использовать ваши данные. Основываясь на этом образце, Access изменяет

146

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

Вы можете добавить маску для любого поля с текстовым типом данных. По сравнению с обычным текстом маски обладают рядом достоинств,

Маски управляют элементом ввода. Будучи пустым, шаблон маски отображает символызаполнители, на место которых должны попасть значения. В пустой маске телефонного номера отображается текст (_ _ _)_ _ _ - _ _ _ , ясно обозначающий вид необходимых данных.

Маски помогают понять смысл данных. Гораздо легче читать множество значений, представленных определенным образом. Большинство людей быстрее найдут нужные номера социального обеспечения, если они будут представлены как (012-86-7180), не как (012867180).

Маски предупреждают ошибки. Они отбрасывают символы, не соответствующие шаблону. Если вы пользуетесь маской для ввода номеров телефонов, то не сможете ввести буквы.

Маски устраняют путаницу. Одни и те же данные многих типов можно представить несколькими способами. Вы можете ввести номера телефонов с междугородним кодом и без него. Используя маску с символами-заполнителями для междугороднего кода, выдаете понять, что эта информация обязательна (а также показываете, где она должна располагаться). Очевидно, что вам не нужно набирать скобки или дефисы для разделения номеров, поскольку эти детали уже стоят в нужном месте. Такие же преимущества маски дают при вводе дат, которые можно ввести разнообразными способами (Год/Месяц/День, Месяц-День-Год и т. д.).

Маски подходят как нельзя лучше для сортировки числовой информации в текстовом поле. Этот сценарий реализуется с самыми разными данными, включая номера кредитных карт, почтовые индексы и номера телефонов. Данные этих типов не следует хранить в числовых полях, поскольку они не должны интерпретироваться как единый номер. Их следует воспринимать как последовательность цифр. (Если вы допустите ошибку и сохраните номер телефона в числовом поле, то обнаружите, что пользователи могут ввести совершенно бессмысленные номера, такие как 0 или -14, поскольку это примеры корректных чисел, несмотря на то, что их нельзя считать допустимыми номерами телефонов. Маска в текстовом поле вылавливает с легкостью подобные ошибки.)

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

Примечание

Маски поддерживают только типы данных Текстовый и Дата/время.

Применение готовых масок

Легче всего начать использование масок с применения одной из разнообразных подготовленных масок, предлагаемых программой Access. Это замечательный способ, т. к. не требует изучения таинственного искусства создания масок.

147

Далее перечислены действия, необходимые для выбора встроенной маски.

1.В Конструкторе выберите текстовое поле, в котором вы хотите применить маску.

Вданном примере используйте поле PhoneNumber.

2.Найдите свойство поля Маска ввода (Input Mask), щелкните кнопкой мыши в поле этого свойства.

Вэтот момент у правого края поля появится маленькая кнопка (...) со скругленными углами, показанная на рис. 4.9.

Рис. 4.9. С помощью кнопки (...) со скругленными углами программа Access сообщает о том, что вы не должны вводить значение вручную. Вместо этого можно щелкнуть мышью кнопку и вывести на экран программу-мастер (например, Мастер создания масок ввода) или другую разновидность полезного диалогового окна

3.Щелкните мышью эту кнопку.

Запустится Мастер создания масок ввода (рис. 4.10).

4.Выберите нужную вам маску из списка возможных вариантов.

В данном случае выберите первый элемент списка (Phone Number).

Примечание

Не нравится то, что получается? Тогда вам нужно создать собственную маску, пользуясь советами из

разд. "Создание собственной маски" далее в этой главе. Если вы нашли близкую, но не идеальную готовую маску, выберите ее. Вы сможете откорректировать ее во втором окне данного мастера.

5.Щелкните мышью кнопку Далее (Next).

На экране появится второе окно мастера (рис. 4.11).

6.Если хотите, можно изменить маску или символ-заполнитель в ней.

Для изменения маски вам придется узнать, что означает каждый символ маски. Вы найдете их описание в табл. 4.2.

Символы-заполнители применяются для обозначения пустых позиций, в которые вводится информация. Стандартный заполнитель — символ подчеркивания (_). Иногда

148

можно использовать пробел, дефис, звездочку или любой другой символ, введя его в иоле Заполнитель (Placeholder character).

Рис. 4.10. Мастер создания масок ввода выводит на экран список общеупотребительных масок. Рядом с каждой маской приведен пример отформатированного маской значения. После выбора маски можно опробовать ее в текстовом поле Проба, в котором вы увидите, как будет вести себя ваше поле, если в нем применить маску

Рис. 4.11. Для телефонного номера применяется маска !(999) 000-000. Каждая цифра 9 обозначает необязательную цифру от 0 до 9. Каждая цифра 0 представляет обязательную цифру от 0 до 9. Итак, в соответствии с данной маской (123) 456-7890 — правильный номер телефона, как и 123-4567, а номер (123) 456 — неправильный

149

7. Щелкните мышью кнопку Далее.

Если вы вставляете маску в текстовое поле, на экран выводится завершающее окно мастера (рис. 4.12).

Если вы включаете маску в поле с датами, программе Access не нужно знать, как вы будете хранить информацию в поле — она уже знает это. В этом случае вы можете перейти к пункту 9 и щелкнуть мышью кнопку Готово (Finish).

Рис. 4.12. В завершающем окне мастера можно выбрать способ хранения данных в вашем поле — с символами маски или без них

8.Укажите, как вы хотите хранить значение в данном поле.

Обычно хранятся только вводимые символы (другими словами, все, что вы вводите в поле). Если вы выбираете этот вариант, символы-заполнители в поле не включаются. Например, телефонный номер (416) 123-4567 хранится как 4161234567. Этот вариант экономит немного дискового пространства и позволяет вам изменить маску в дальнейшем для несколько иного представления данных.

Вы могли бы сохранить маску полностью со всеми дополнительными символами. В этом случае номер телефона хранился бы с дефисами, знаками подчеркивания и пробелами, например, (416) 123-4567. Это менее гибкий подход, поскольку не позволяет изменять маску впоследствии.

9.Щелкните мышью кнопку Готово.

Окончательная маска выводится в поле свойства Маска ввода (Input Mask). Прежде чем двигаться дальше, возможно, вы хотите убедиться в том, что зарезервированная длина поля соответствует маске. В примере с номером телефона Размер поля должен быть 10, если выбрано хранение неформатированного значения (поскольку в номере 10 цифр), или 14, если выбрано хранение полной маски вместе с заполнителями (один дефис, один пробел и две скобки).

150

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]