Краткое содержание 29 Об этих стрелках 30 о сочетаниях клавиш 32 о щелчках кнопкой мыши 33 Примеры 33
Скачать 19.64 Mb.
|
Глава 4 Блокировка неправильных данных Даже лучшие проектировщики БД проводят бессонные ночи, тревожась об ошибках, способных проникнуть в их БД. Неверные данные — печально известная проблема, эти данные проникают в БД, прячутся там с течение месяцев и проявляют себя, только когда вы отправили по электронной почте счет клиенту "Blank Blank" ("Пробел пробел") или продали мешок арахиса за -4.99 долларов. Лучший способ борьбы с подобными проблемами — прежде всего, помешать некорректным данным проникать в вашу БД. Другими словами, нужно задать правила проверки, которые отвергают подозрительные данные в момент их ввода. После того как неверные данные попали в БД, найти их труднее, чем иголку в стоге сена. В этой главе описан основной набор средств проверки, имеющийся у программы Access:
О целостности данных Все средства проверки программы Access реализованы в режиме Конструктора, с которым вы познакомились в главе 2. Для их применения вы выбираете поле и настраиваете его свойства. Единственная сложность — знать, какие свойства наиболее полезны. Некоторые из них описаны в главе 2, но в следующих разделах вы найдете дополнительные подробности. Совет Программа Access предоставляет три варианта переключения в режим Конструктора. Можно щелкнуть правой кнопкой мыши на заголовке вкладки таблицы и выбрать из меню команду Конструктор, использовать кнопку Режим на вкладке ленты Главная или воспользоваться крошечными кнопками режима в правом нижнем углу окна программы Access. Если вы очень нетерпеливы, то можете даже не открывать вашу таблицу, а просто найти ее в области переходов, щелкнуть ее правой кнопкой мыши и выбрать команду Конструктор. Запрет незаполненных полей Для того чтобы каждая запись имела какой-то смысл, в ней должен быть хотя бы абсолютный минимум информации. Без вашей помощи программа Access не может отделить важную информацию от необязательных деталей. По этой причине все поля в новой таблице определены как необязательные, за исключением поля первичного ключа (которое обычно содержит идентификационный номер записи). Убедитесь в этом с помощью таблицы Dolls из главы 1; вы быстро обнаружите, что можете вставлять записи, фактически не содержащие данных. Э тот недостаток легко исправить. Просто выберите в Конструкторе поле, которое обязательно должно быть заполнено и задайте в свойстве Обязательное поле (Required) значение Да (рис. 4.1). Рис. 4.1. Свойство Обязательное поле сообщает программе Access о запрете пропущенных значений (именуемых на профессиональном жаргоне null) Access проверяет свойство Обязательное поле при каждом добавлении новой записи или исправлении поля в уже имеющейся записи. Но если в вашей таблице уже есть данные, нет гарантии, что они соответствуют установленным правилам. Представьте, что вы внесли в таблицу Dolls сведения о нескольких куклах-болванчиках до того, как решили, что в поле Character обязательно должно быть значение. Вы переключаетесь в Конструктор, выбираете поле Character и заменяете значение свойства Обязательное поле на Да. Когда вы сохраняете таблицу (возвращаясь в Режим таблицы или закрывая таблицу), программа Access дает вам возможность проверить записи о куклах-болванчиках, уже внесенных в таблицу (рис. 4.2). Если вы выбираете выполнение проверки и Access обнаруживает проблему, программа позволяет вам отменить внесенные корректировки (рис. 4.3). Рис. 4.2. Это хорошая идея проверить таблицу на соответствие новым требованиям, которые вы установили. В противном случае некорректные данные могут остаться в БД. Не дайте этому сообщению запугать вас — пока у вас нет десятков тысяч записей, такая проверка не займет много времени Рис. 4.3. Если программа Access находит пропущенное значение, она останавливает поиск и спрашивает вас, что делать. Вы можете сохранить изменения (даже если они конфликтуют хотя бы с одной записью) — в итоге, по крайней мере, новые записи не будут порождать подобную проблему. Другой возможный вариант — вернуть прежнее, более терпимое значение свойству поля. В любом случае вы можете найти пропущенные данные, отсортировав данные с помощью вопроса, выводящего незаданные значения в верхние строки таблицы Для тех, кто понимает. Не требуйте слишком многого Вы должны хорошенько подумать, какой минимум данных вам нужен для создания записи. Например, компания, продающая костюмы Элвиса, возможно, не захочет вставлять новый комплект одежды в свою таблицу Products (изделия), пока он не будет полностью готов. Свойство Обязательное поле в данном случае хорошее подспорье, поскольку не даст включить в каталог незавершенные изделия. С другой стороны, такая строгость не годится в таблице Customers (клиенты) той же компании. Отделу продаж нужна гибкость при добавлении новых предполагаемых клиентов, даже если предоставлена только частичная информация. Потенциальный клиент может позвонить и оставить только почтовый адрес (без номера счета, номера телефона, адреса электронной почты и т. п.). Даже в этом случае, не имея полной информации о клиенте, вы должны включить его в таблицу Customers, для того чтобы он или она получали ежемесячный информационный бюллетень. Примите за правило применение необязательного поля в том случае, когда данные для него необязательны или недоступны в момент ввода записи. Пропущенные значения и пустые строки Программа Access поддерживает свойство Обязательное поле (Required) для всех типов данных. Но, возможно, для некоторых типов данных понадобятся дополнительные проверки. Это объясняется тем, что свойство Обязательное поле запрещает только незаполненные поля — поля, в которых нет совсем никаких данных. Но программа Access, что кажется несколько странным, различает пропущенные значения и пустые строки (empty text). Пропущенное значение (null) означает отсутствие данных. Пустая строка свидетельствует о том, что значение поля было введено, но оказалось пустым. Все еще недоумеваете? Разница существует, т. к. БД, такие как Access, должны распознавать пропущенные данные. Пропущенное значение может означать оплошность — возможно, кто-то просто забыл ввести значение, С другой стороны, пустая строка означает сознательное решение исключить данную информацию. Примечание Для того чтобы проверить эту разницу в своей таблице, создайте текстовое поле со значением свойства Обязательное поле, равным Да. Попытайтесь вставить новую запись и оставить ее пустой. (Access хладнокровно остановит вас.) Теперь попробуйте вставить новую запись, но поместите единственный пробел в поле. Происходит странная вещь: Access автоматически обрезает пробелы и, делая это, превращает ваш единственный пробел в пустую строку. Но вы не получите сообщения об ошибке, поскольку пустая строка — это не то же самое, что пропущенное значение. К счастью, если вы сочтете это различие сбивающим с толку, можно запретить и пропущенные значения, и пустые строки. Просто установите в свойстве Обязательное поле (Required) значение Да для запрета пропущенных значений и в свойстве Пустые строки (Allow Zero Length) значение Нет для запрета пустых строк. Примечание Такое же различие существует и у данных числового типа. Даже если установить свойство Обязательное поле равным Да, вы все равно можете вставить значение 0. Если вы хотите помешать этому, нужно применить правила верификации, описанные в разд. "Правила верификации или условия на значения" далее в этой главе. Задание значений по умолчанию До сих пор поля в ваших таблицах заполнялись явно человеком, вставлявшим запись или пропускавшим ее. Но есть еще одна возможность — вы можете определить значение по умолчанию. Теперь, если кто-то вставляет запись и пропускает поле, программа Access использует в нем значение по умолчанию. Задается значение по умолчанию в свойстве поля Значение по умолчанию (Default Value). Для поля AddedCost (добавленная стоимость) числового типа вы могли бы оставить его равным 0. В текстовом поле Country (страна) можно использовать строку "U.S.A." как значение по умолчанию. (Все текстовые значения, используемые как значения по умолчанию, должны быть заключены в кавычки.) Программа Access выводит вес значения по умолчанию в строке, подготовленной для ввода новой записи, в нижней части таблицы (рис. 4.4). Она также автоматически вставляет значения по умолчанию в любые скрытые столбцы (см. разд. "Скрытие столбцов " главы 3). Р ис. 4.4. Эта служба знакомств использует четыре значения по умолчанию: стандартный рост (5.9), город по умолчанию (New York), штат по умолчанию (тоже New York — NY) и страну по умолчанию (U.S.A.). Такая система хороша, поскольку в большинстве новых записей содержится именно эта информация. С другой стороны, нет оснований предлагать значения по умолчанию для полей, содержащих имя и фамилию Access вставляет значение по умолчанию, когда вы создаете новую запись (но вы всегда можете изменить это значение). Вы также можете во время редактирования поля вернуться к значению по умолчанию с помощью сочетания клавиш <Сtrl>+<Аlt>+<Пробел>. Совет Очень удобно использовать значение по умолчанию как отправную точку для новой записи. Например, когда создается новая запись в таблице, можно редактировать значение по умолчанию, а не заменять его полностью другим значением. Вы можете создать и более развитые динамические значения по умолчанию. Программа Access оценивает их, когда вы вводите новую запись, что означает зависимость выбранного значения по умолчанию от других данных записи. Динамические значения по умолчанию используют выражения (специальные формулы БД), способные выполнять вычисления или извлекать другие подробности. Одна полезная функция Date ( ) извлекает текущую дату, установленную на вашем компьютере. Если применить эту функцию как значение по умолчанию для поля с датой (как показано на рис. 4.5), программа Access автоматически вставляет текущую дату при вводе новой записи. Р ис. 4.5. Если вы применяете функцию Date ( ), как значение по умолчанию в поле DateAcquired в таблице с куклами-болванчиками, то при каждой вставке новой записи о кукле программа Access вставляет текущую дату. Вы решаете — оставить ее или заменить другим значением Примечание Вы узнаете больше о выражениях языка SQL (Structured Query Language, язык структурированных запросов) в части II. Предотвращение дублирования значений с помощью индексов Первое правило любой таблицы — каждая включенная в нее запись должна быть уникальна. Для соблюдения этого требования вам нужно выбрать первичный ключ (см. разд. "Первичный ключ"главы 2), одно или несколько полей, которые не должны дублироваться в разных записях. Но здесь есть подводный камень. Как вы узнали из главы 2, самый надежный способ — создание идентификационного поля (поля Код) для первичного ключа. До сих пор во все таблицы, которые вы видели, включалось такое поле. Но что, если вам нужно, чтобы другие поля тоже были уникальны? Представьте себе, что вы создаете таблицу Employees (сотрудники). Вы следуете правильным принципам проектирования БД и идентифицируете каждую запись автоматически генерируемым идентификационным номером. Но вы также хотите быть уверены в том, что в таблице нет двух сотрудников с одинаковыми номерами социального обеспечения (Social Security number, SSN), и, тем самым, желаете предупредить возможные ошибки — такие, как случайный повторный ввод данных об одном и том же сотруднике. Примечание Для того чтобы вспомнить, почему так важны идентификационные поля, еще раз прочитайте примечание "На профессиональном уровне. Как Access предотвращает дублирование записей" в разд. "Первичный ключ" главы 2. В таблице Employees вы конечно можете выбрать SSN в качестве первичного ключа, но ситуация будет далека от идеальной, когда вы начнете связывать таблицы друг с другом (см. главу 5), и возникнут проблемы, если позже понадобится изменить номер социального обеспечения (например, из-за ошибки) или ввести информацию о сотруднике до того, как вы получите SSN. Вы можете заставить поле требовать уникальных значений с помощью индекса. Индекс БД похож на предметный указатель в книге — это список значений (из поля) с перекрестной ссылкой, которая указывает на соответствующий раздел (полную запись). Если индексировать поле SocialSecurityNumber, программа Access создаст список, подобный приведенному в табл. 4.1 и хранящийся в файле вашей БД. Таблица 4.1. Список, хранящийся в БД после создания индекса
С помощью этого списка программа Access может быстро определить, не дублируется ли в новой записи уже имеющийся SSN. Если это опасение подтверждается, Access не разрешит вставить такое значение. На профессиональном уровне. Как работают индексы Важно то, что список номеров социального обеспечения отсортирован. Сортировка означает, что номер 001-01-3455 всегда предшествует в индексе номеру 002-40-3200, независимо от физического размещения записи в БД. Такая сортировка важна, т. к. она позволяет программе Access быстро проверять наличие дубликатов. Если вы вводите номер 001-02-4300, Access достаточно прочитать только первую часть списка. Как только программа обнаружит следующий "больший" SSN (тот, который включен в список позже в результате сортировки, например 001-02-501), она уже знает, что в оставшейся части индекса нет дубликата. На практике все БД используют множество алгоритмов оптимизации для того, чтобы сделать этот процесс стремительным. Но существует один ключевой принцип — без применения индекса программа Access должна проверять всю таблицу. В БД хранятся несортированные таблицы, поэтому программа не может быть уверена в том, что данного SSN нет в таблице до тех пор, пока не проверит каждую запись. Итак, как применить индекс с полем? Хитрость заключается в применении свойства Индексированное поле (Indexed), которое доступно для данных всех типов за исключением типа Вложение и типа Объект OLE. Когда вы добавляете поле, у его свойства Индексированное поле указано значение Нет. Для вставки индекса и предупреждения дублирования значений вы можете изменить в Конструкторе значение свойства Индексированное поле на Да (Совпадения не допускаются). При выборе третьего варианта — Да (Допускаются совпадения) — создается индекс, но разрешается нескольким записям иметь одинаковые значения поля. Этот вариант не поможет вам поймать повторяющиеся записи, но его можно применить для ускорения поиска (для получения дополнительной информации см. примечание "Практические занятия для опытных пользователей. Как индексы ускоряют поиск" в разд. "Получение заданного количества первых записей" главы 6). Примечание Как вы знаете из главы 2, первичные ключи также предотвращают дублирование записей с помощью аналогичного метода. Когда вы определяете первичный ключ, программа Access создает индекс в поле. Когда вы закрываете Конструктор после изменения свойства Индексированное поле, программа Access напоминает о необходимости сохранить ваши корректировки. В этот момент она создает любые нужные ей новые индексы. Вы не можете создать индекс, запрещающий совпадения, если в вашей таблице уже есть дублирующаяся информация. В данной ситуации Access выводит сообщение об ошибке, когда закрывается Конструктор и программа пытается добавить индекс. |