РАБОТАЕМ С ДАННЫМИ | КОМПЬЮТЕРНАЯ ГАЗЕТА
Microsoft Access, шаг первый Как уже упоминалось ранее, одним из основополагающих элементов СУБД Microsoft Access, как и вообще любой СУБД, является таблица. Именно в таблицах базы данных хранят всю свою информацию. Когда оператор заполняет форму, он тем самым заполняет данными одну или несколько таблиц. Когда тот же пользователь задает базе какой-нибудь вопрос, то инициализирует процедуру обращения к некоторому сообществу таблиц. Таким образом, изучение принципов функционирования СУБД следует непременно начинать с таблицы как таковой. (c) Компьютерная газета | Итак, таблица. Общеизвестно, что таблица состоит из столбцов и строк, являющихся в целом разграфленной прямоугольной областью, в которой пояснительные надписи являются наименованиями столбцов, а непосредственно сама информация располагается в строках. Однако в Microsoft Access понятие таблицы имеет и некоторые дополнительные черты. Придется привыкнуть, что в СУБД таблица чрезвычайно похожа на сказочного двуглавого дракона. Одной головой является ее, простите за тафталогию, табличное представление, а второй - представление в режиме конструктора. Разница между ними огромная. Как таблица, она показывает свое содержимое. Например, город, наименование улицы, номер дома, номер корпуса, номер подъезда, квартиру и фамилию ее владельца, если речь идет о таблице с перечнем адресов. А вот настройка таблицы возможна только в режиме конструктора (см. рис. 1.). Как видно из иллюстрации, при конструировании любой таблицы вы будете иметь дело с мастером, состоящим из пяти основных элементов. Сверху располагаются три столбца, озаглавленные: " Имя поля", " Тип данных", " Описание". В нижней части окна мастера есть две вкладки: " Общие" и " Подстановка". Суть системы чрезвычайно проста и по-своему элегантна. В первом столбце пользователь имеет возможность задать любое имя столбца, какое посчитает необходимым. Следует помнить, что столбцы в таблице будут располагаться именно в том порядке, в котором вы их задали. Таким образом, желательно с самого начала продумать их последовательность с учетом удобства последующей эксплуатации всей таблицы в целом. Так, например, любая сортировка таблиц практически во всех СУБД производится слева направо. Иными словами, сначала выполняется условие сортировки, заданное в первом столбце, затем - во втором, и так далее. Если в таблице, по недосмотру, столбец с номерами домов окажется перед столбцом с названиями улиц, то вы не сможете, без дополнительных вспомогательных операций, отсортировать таблицу сначала по улицам, а потом по номерам домов. Придется создавать отдельный запрос, который потребует дополнительного места, дополнительной вычислительной мощности и дополнительного времени на его выполнение. После задания имени поля в СУБД Microsoft Access требуется непременно указать тип данных, которые в этом поле предполагается хранить. Тут существуют свои тонкости. Люди, имеющие опыт работы с электронными таблицами, привыкли, что, по большому счету, все данные делятся на три больших группы: числовые, текстовые и все прочие. В Microsoft Access дела обстоят несколько сложнее. Всего существует десять базовых типов данных, каждый из которых имеет свое собственное назначение. Помнить о типе данных следует, как минимум, по следующим причинам. Во-первых, Microsoft Access имеет физический предел на объем хранимой информации. Для Microsoft Access 2.0 он составлял что-то около трех гигабайт. Более поздние версии несколько подрасширены, но не слишком обольщайтесь, нередко в сложных проектах разработчики уже с самого начала вынуждены обращаться к механизмам экспорта/импорта данных и к связям с внешними базами, так как им тривиально не хватает обрабатываемого объема. Еще прискорбнее, когда такая надежная и удобная база, давно уже ставшая незаменимой в работе, вдруг начинает терять данные в самый неподходящий момент. Это тем более неудобно, так как простого решения в подобном случае не существует и вам наверняка понадобится кардинальная переработка всего проекта. А это, как вы сами понимаете, требует времени и денег... Так что изящное программирование, это есть создание такой системы, которая уже изначально занимает только необходимое место. Да и потом, богатый встроенный инструментальный арсенал Microsoft Access также тесно привязан к конкретному типу данных. Допустим, нельзя воспользоваться функцией начисления процентов на остаток по счету, если указанный счет задан каким-либо другим типом данных, кроме денежного. Или, к примеру, нельзя применить операцию сортировки к данным, представленным типом МЕМО. Многие из возникающих по подобной причине препятствий можно преодолеть путем внутреннего преобразования типов. Однако, во-первых, некоторые типы преобразовать невозможно (к примеру, текст никак не удастся превратить в число), а во-вторых, любое преобразование приводит к частичным потерям (к примеру, число с плавающей точкой, будучи преобразованное к целому типу, навсегда потеряет свою дробную часть). Столбец " Описание" носит лишь вспомогательный характер. Все, что в нем набирается, нужно вам самим. По собственному опыту могу сказать, что уже месяцев через пять редко кто с первого взгляда может определить, за что отвечают те или иные данные. И уж тем более, если модернизацией проекта впоследствии займутся другие люди. Правда, не стоит и переусердствовать. В таблице " Клиенты", в поле, типа " Текстовое", с именем " Фамилия", будет указываться, вероятнее всего, фамилия именно вашего клиента, а не голкипера НХЛ, набравшего максимальное количество очков в прошлом сезоне по системе "гол плюс пас". Все вышеперечисленные настроечные тонкости определяются на вкладках, как только вы выделили какое-нибудь поле в столбце " Тип данных" конструктора таблицы. Собственно, выделив поле, вы тем самым попадаете в список возможных значений, в котором нужно лишь указать желаемый вариант. Как только с определением типа покончено, можно перейти к точной подгонке. Допустим, вы создаете поле, в котором предполагается вводить наименование городов. Естественно, это будет поле текстового типа. Однако отводить ему все двести пятьдесят пять символов наверняка излишне. Даже если очень постараться, трудно будет найти такое наименование населенного пункта, общая длина которого превысит двадцать пять букв. Таким образом, указав на вкладке " Общие" в строке " Размер поля" величину "25", вы сэкономите место для двухсот тридцати символов. Эта, вроде как небольшая, экономия приобретет несколько иной смысл, если предположить, что в базе может быть сто тысяч строк. Если я ничего не путаю в математике, это 23000000 символов, что соответствует очень толстой книге, которая, даже без иллюстраций в формате ТХТ, займет никак не меньше пятисот килобайт. А ведь казалось бы, всего 230 символов... В том случае, если данные могут иметь определенный формат, то их представление можно принудительно указать в строке " Формат поля". Допустим, для полей типа Дата/Время можно указывать только часы, либо часы и минуты, либо часы, минуты и секунды. Причем как в 12-и, так и в 24-х часовом представлении. Все возможные варианты представления данных автоматически подбираются в зависимости от того, какой тип данных вами выбран. Строка " Маска ввода" существует на тот случай, когда данные должны вводиться в заранее заданной форме. Человек привык записывать телефонный номер, указывая в скобках междугородний код, затем несколько групп цифр, разделенных тире. Было бы удобно, если бы система не заставляла оператора вводить каждый раз, кроме цифр, еще и тире. Поэтому весьма нелишне ввести маску набора цифр, чтобы Microsoft Access автоматически расставляла вводимые с клавиатуры цифры согласно необходимой схеме. Существуют маски и для других типов данных. Хочу обратить ваше внимание на строку " Подпись". Вообще говоря, особого смысла она не имеет. То, что в ней набрано, Microsoft Access в дальнейшем использует как всплывающую подсказку для элемента управления. Это когда человек наводит маркер мыши на тот или иной элемент и, спустя мгновение, рядом возникает белый прямоугольник с краткой пояснительной надписью. Позднее вы, несомненно, узнаете, что, создавая формы, можно самостоятельно добавлять аналогичные элементы. Однако почти всегда такие пояснения совпадают между собой в разных формах, таким образом значительно проще один раз набрать пояснение, которое система сама подставит куда надо, каждый раз, когда вы будете использовать данные из этого поля этой таблицы. Так как таблица является жесткой формой, то она крайне плохо относится к незаполненным полям. Почти повсеместно незаполненное поле не содержит вообще никакой информации, что всегда приведет к сбою, если такой столбец подвергнется обработке любой автоматической функцией. С другой стороны, операторы обычно весьма невнимательно относятся к полям, значения в которых меняются редко. Предположим, вы работаете в основном с клиентами из Минска, но время от времени встречаются и иногородние. Если оставить этот вопрос без внимания, ошибки в заполнении формы практически неизбежны. Чтобы их избежать, стоит ввести в строке " Значение по умолчанию", если придерживаться вышеописанного примера, слово "Минск". В этом случае, как только будет создана новая запись, в поле " Город" по умолчанию окажется введенным город " Минск". Естественно, его можно заменить любым другим, однако больше не придется постоянно следить за этим полем без особой надобности. Строка " Условие на значение" предназначена для организации так называемой "защиты от дурака". Нельзя забывать, что компьютер, сам по себе, глуп беспросветно. Он попытается выполнить даже ту команду, которая приведет к его собственной гибели, например, отформатировать системный логический диск, с которого сам же и загружается. Прибавьте сюда невнимательность пользователей и получите полную картину. Чтобы вам впоследствии не понадобились услуги высококвалифицированного испытателя (в компьютерном мире их называют бета-тестерами) или валидол, желательно постараться заранее ограничить все возможные действия пользователя в тех случаях, когда такое возможно. Общеизвестно, что нельзя заплатить отрицательную сумму. Стало быть, разработчики встроенных функций даже не пытались предусмотреть защиту от подобной коллизии. Стало быть, если случайно перед числом окажется знак "минус", то, скорее всего, определенная часть всего проекта либо выдаст некорректный результат, либо вообще аварийно закончит работу в результате сбоя. Причем нередко подобное может оказаться причиной потери важных данных. Таким образом, заранее определив "что нельзя", вы одновременно убиваете двух зайцев. С одной стороны, это воспрепятствует попаданию в таблицу заведомо неверных данных, даже если они совпадают по типу. С другой стороны, в случае возникновения подобной ошибки Microsoft Access выведет на экран соответствующее предупреждение, которое, кстати говоря, может оказать неоценимую помощь при диагностировании причин, приведших к сбою. Более того, в подобном случае вмешательство разработчика вообще может не потребоваться, достаточно заполнить строку " Сообщение об ошибке" - и пользователь сразу поймет, где он ошибся и как ситуацию исправить. Как известно, любые данные могут быть важными, а могут быть второстепенными. Допустим, покупая автомобиль, в первую очередь покупателя интересует его марка, год выпуска, общее техническое состояние и тому подобное. Неплохо, если в салоне на полу лежат резиновые коврики, но их отсутствие вовсе не остановит покупателя, если первостепенные показатели окажутся приемлемыми. Аналогичным образом подразделяются данные СУБД. Чтобы система была в состоянии самостоятельно отслеживать заполнение первостепенных полей, следует сказать " Да" в строке " Обязательное поле". Тогда Microsoft Access не внесет в таблицу строку, одно или несколько обязательных полей в которой оказались не заполнены или заполнены значением по умолчанию. Обязательное поле должно заполняться вручную. Точно так же, если, например, поле имеет тип МЕМО, который часто применяется в качестве размещения всевозможных примечаний, можно допустить ситуацию, когда само поле может остаться незаполненным вообще ничем. В противном случае, желательно принудительно сказать в строке " Пустые строки" о том, что данное поле не может остаться пустым ни при каких обстоятельствах. Отдельно следует остановиться на строке " Индексированное поле". Понятно, что любая база является не чем иным, как простым хранилищем какой-либо информации. А хранилище - это то, откуда что-либо время от времени берут. Сама технология СУБД возникла прежде всего для того, чтобы извлекать необходимые данные из хранилища с минимальными затратами. Одним из механизмов, с помощью которого подобная цель достигается, является индекс. Это как бы своего рода дополнительная метка, по которой СУБД Microsoft Access производит просмотр своего содержания. Сначала просматриваются ключевые поля, затем - индексированные, и только потом все остальные. Таким образом, если вы предполагаете, что к данному полю возможно частое обращение, то стоит указать его как индексированное, что делается в строке " Индексированное поле". Ну и последнее. Есть в Microsoft Access такое понятие, как подстановка. Предположим, некоторая компания работает с несколькими видами валют. Понятно, что каждый раз, когда требуется такие валюты определять для каких-либо надобностей, необязательно создавать отдельные реестры. Это достаточно трудоемко, да и ресурсов машинных требует. Значительно удобнее задать в проекте всего одну таблицу, в которой будет вестись учет всех применяющихся денежных единиц, а в тех случаях, когда подобная информация понадобится в других местах, - подставлять там содержимое единого валютного реестра. В таком случае, в поле " Тип элемента управления" следует выбрать что-либо, кроме обычного поля ввода. Например, если выбран вариант "Поле со списком", то в табличном представлении вместо обычной ячейки в соответствующем месте появится поле с выпадающим списком, из содержимого которого пользователь и будет выбирать конкретное значение, которое впоследствии станет заноситься в таблицу в качестве его текущего значения. Теперь немного общей теории. В Microsoft Access существует обязательное правило, в соответствии с которым любая таблица должна содержать ключевое поле. Ключевым должно быть такое поле или их сочетание, которое однозначно описывает всю запись (то есть строку) в таблице. Обычно в этом качестве используется нумерация строк. Поэтому первым полем любой таблицы зачастую задается поле с типом " Счетчик", содержимое которого автоматически увеличивается на единицу при создании новой строки. Чтобы поле стало ключевым, в режиме конструктора, его следует выделить (то есть выделить всю строку этого поля) и нажать мышью на изображение ключа на панели инструментов. Слева, возле данного поля, появится маленький ключик, который и символизирует, что данное поле является ключевым. Более того, без обязательного назначения одного или нескольких ключевых полей Microsoft Access не позволит вновь создаваемую таблицу сохранить. Полагаю, что процедуру сохранения, как и первоначального назначения имени таблице, объяснять необходимости нет. Она ничем не отличается от других приложений для операционной системы Microsoft Windows 95/98. На этом создание таблицы при помощи конструктора заканчивается. Сразу после сохранения на вкладке " Таблицы" рабочей области Microsoft Access появится соответствующая пиктограмма с заданным вами названием. В дальнейшем, эту таблицу можно открывать для просмотра (или заполнения), а также для модернизации. Таблицы в Microsoft Access могут создаваться и по-другому. Причем местами эти способы могут оказаться более удобными с точки зрения трудозатрат. Однако, чтобы пользоваться ими, необходимы дополнительные знания, о которых мы поговорим позднее. В любом случае, понять назначение других способов создания таблиц в СУБД без изучения тонкостей самой таблицы в режиме конструктора невозможно.
Наименование типа данных | Содержимое | Максимальное значение данного типа
Текстовый | (Значение по умолчанию). Текст или числа,не требующие проведения расчетов,например,номера телефонов. | Число символов,не превышающее минимальное из двух значений: 255 или значение свойства Размер поля (FieldSize). Microsoft Access не сохраняет пустые символы в неиспользуемой части поля.
Поле МЕМО | Длинный текст или комбинация текста и чисел. | До 65535 символов. (Если поле MEMO обрабатывается через объекты доступа к данным (DAO) и содержит только текст и числа,а не двоичные данные,то его размер ограничивается размером базы данных).
Числовой | Числовые данные,используемые для проведения расчетов. | 1,2,4 или 8 байт (16 байт только для кода репликации).
Дата/время | Даты и время,относящиеся к годам с 100 по 9999 включительно. | 8 байт.
Денежный | Денежные значения и числовые данные,используемые в математических расчетах,проводящихся с точностью до 15 знаков в целой и до 4 знаков в дробной части. | 8 байт.
Счетчик | Уникальные последовательно возрастающие (на 1) или случайные числа,автоматически вводящиеся при добавлении каждой новой записи в таблицу. Значения полей типа счетчика обновлять нельзя. | 4 байт (16 байт,если для свойства Размер поля (FieldSize) задано значение кода репликации).
Логический | Логические значения,а также поля,которые могут содержать одно из двух возможных значений (True/False,Да/Нет). | 1 бит.
Поле объекта OLE | Объект (например,электронная таблица Microsoft Excel,документ Microsoft Word,рисунок,звукозапись или другие данные в двоичном формате),связанный или внедренный в таблицу Microsoft Access. | До 1 Гбайт (ограничивается объемом диска).
Гиперссылка | Строка,состоящая из букв и цифр и представляющая адрес гиперссылки. Адрес гиперссылки может состоять максимум из трех частей: текст s- текст,выводимый в поле или в элементе управления; адрес s- путь к файлу (в формате пути UNC) или странице (адрес URL); дополнительный адрес s- смещение внутри файла или страницы. | Каждая из трех частей в типе Гиперссылка может содержать до 2048 символов.
Мастер подстановок | Создает поле,в котором предлагается выбор значений из списка или из поля со списком,содержащего набор постоянных значений или значений из другой таблицы. Выбор этого параметра в списке в ячейке запускает мастера подстановок,который определяет тип поля. | Тот же размер,что и у ключевого поля,используемого в подстановке (обычно 4 байт).
Александр Запольскис
(c) Компьютерная газета