Телефонный справочник в access как сделать

Обновлено: 05.07.2024

В каждой базе данных есть справочники , которые служат для хранения часто вводимых данных. Например, если в таблице "Атрибуты заказчика" есть поля типа "Страна", "Город", то вместо того, чтобы постоянно вводить вручную эти данные, можно завести соответствующие справочники городов и подставлять данные из них. Но дело в том, что справочники могут быть как простые, состоящие из одной таблицы, так и сложные, составные (многоуровневые). В этой статье мы рассмотрим примеры организации различного рода справочников.

"Подскажите, как правильно разработать структуру базы для реализации почтовой базы. Интересует правильная связь таблиц: Страна, Регион, Город, Улица."

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

Создаем четыре справочные таблицы: Адресат , Справочник страны , Справочник регионы , Справочник города . В каждой таблице обязательно должно быть соответствующее ей ключевое поле (Тип Счетчик) - id.

Обычно ключевое поле таблицы, которое является уникальным идентификатором записи в этой таблице, называют внутренним ключом (в нашем случае это поля типа "Счетчик"), а ключевые поля, через которые внешние таблицы привязаны к данной - соответственно внешними ключами (в нашем случае это числовые поля Длинное целое)

Поле в связанной таблице

В руководствах для начинающих разработчиков часто присутствуют рассуждения, какое поле таблицы сделать ключевым. Дается определение ключевых полей и приводятся примеры связей между ними. На мой взгляд, такие рассуждения только сбивают с толку начинающих. Ведь в принципе, все довольно просто: в 99% случаев лучшее ключевое поле - счетчик. Оно 100% уникально (без повторений) и при установке связи с основной таблицей (в которую подставляются данные из этого справочника) с соответствующим полем Числовое (Длинное целое) связь автоматически определяется как один ко многим (одна запись в справочнике и много аналогичных записей в основной таблице).

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

Как видно, в справочниках только два поля: ключевое и обозначение. А основная таблица состоит в основном из числовых полей, кроме поля "Улица". Вот здесь то и проявляется основная особенность построения реляционных баз данных:

вместо того, чтобы хранить в таблице "Адресат" наименования стран, регионов, городов в виде текста, сохраним их лучше в виде чисел (значений ключевых полей справочников).

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

Справочники "Улицы" и "Дома" создавать, как мне думается, нет смысла. Улиц будет слишком много, их проще ввести вручную.
Так же в справочных таблицах не помешает сделать поле "Обозначение" уникальным, не допускающим повторений. Для этого в конструкторе таблицы в свойстве поля "Индексированное поле" выберем "Да. Повторения не допускаются". Если теперь нажать в конструкторе таблиц на кнопку "Индексы" (на ней значок молнии), то увидим, что в таблицу кроме основного индекса ключевого поля добавился еще один - "Обозначение".

Имена полей таблиц не должны содержать пробелов, иначе могут быть проблемы с VBA, и однозначно возникнут проблемы, при переносе базы на SQL Server. Если имя поля состоит из двух слов, то можно выбрать например такай вариант: НазваниеУлицы или Название_улицы .

Хотя согласно Help, имя может включать любую комбинацию букв, цифр, и специальных знаков за исключением точки (.), восклицательного знака (!), надстрочного знака (`) и квадратных скобок ([ ]), но желательно не использовать в именах полей таблицы никаких символов, кроме букв и цифр. Дело в том, что например имя поля таблицы типа "Улица№" в проекте mdb скорей всего не вызовет никаких конфликтов, а вот при переносе базы на SQL Server, мастер переноса просто "выкинет" его из таблицы.

При создании однотипных справочных таблиц дело пойдет быстрее, если в окне проекта "Таблицы" выделить таблицу, затем Ctrl + C или в контекстном меню при правом щелчке мыши выбрать "копировать", затем выбираем вставить, в появившемся окне задаем имя новой таблицы и жмем "ОК". Вот потому то я во всех справочниках ввел однотипное поля "id", "Обозначение". В таблице "Адресат" так же создаем внешние ключевые поля (Длинное Целое) - idСтрана, idРегион, idГород. Не забудьте убрать в них значение по умолчанию = 0.

Теперь осталось только установить связи между таблицами. Жмем в окне проекта на кнопку "Схема данных" или правой кнопкой мыши, и в контекстном меню выбираем "Схема данных". Появилась диалоговое окно "Добавление таблицы". Щелкаем дважды по всем названиям таблиц и закрываем окно.

Располагаем таблицы например так: слева основная - "Адресат", справа остальные (справочники). Наводим курсор в таблице "Адресат" на поле "idСтрана" нажимаем и тащим на поле "idСтрана" в таблице Справочник страны . В появившемся диалоговом окне "Изменение связей" устанавливаем флажки: "Обеспечение целостности данных", "Каскадное обновление связанных полей" и жмем "ОК".

Флажок "Обеспечение целостности данных"

Его установили для того, чтобы исключить возможность ввода в таблицу "Адресат" в поле "idСтрана" значения, которого нет в аналогичном поле справочной таблицы "Справочник страны". Советую всегда так делать. Этим Вы во многом избавитесь от проблемы "мусора" в базе данных - наличие ни с чем не связанных записей. Правда есть и другие способы "замусоривания", но не лишним будет уже в структурной схеме базы постараться свести их к минимуму.

Флажок "Каскадное обновление связанных полей"

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

А вот флажок "Каскадное удаление связанных записей" в данном примере я бы не рекомендовал ставить. Иначе может возникнуть весьма печальная ситуация: пользователь решит удалить название города из соответствующего справочника (мол, больше не нужен), а вместе с ним удалятся и все связанные с ним записи в таблице "Адресат" - это и есть каскадное удаление. Правда, при всякой попытке удаления Access выдает соответствующее предупреждение, но надеяться на то, что пользователь адекватно среагирует на него, я бы не стал. Каскадное удаление имеет смысл ставить в случае, например при связи таблиц "Заказы" и "Заказы данные". Удаляете заказ, а вместе с ним автоматически и все данные по нему, так как зачем данные по заказу, которого больше нет.

Остановлюсь еще на одном моменте: многим наверное приходилось сталкиваться с ошибкой "Слишком большое число". Если не хотите иметь с этим проблем, возьмите себе за правило не делать поля со списками в таблице (начинающие обычно для этого используют мастер подстановок). Дело в том, что из за несоответствия форматов единиц измерения ширины столбцов в разных версиях Access, эта самая ширина может вместо стандартной 2,54см стать … 57,2 см (слишком большим). Поэтому список лучше сделать на форме, а в таблице оставьте просто поле.

Справочная система без . справочных таблиц

Обычно справочные таблицы служат источниками данных для списков или полей со списками. Но прежде чем перейти к созданию форм - справочников, рассмотрим сначала варианты организации этих списков без использования справочных таблиц (см. форму Пример1).

Ссылка таблицы на саму себя (Пример1. Вариант1)

Это самый простой способ организации справочника. Создаем форму "Адресат", цепляем к ней источник - таблицу "Адресат". Создаем поле со списком, источник которого - запрос к полю "Улица" из этой же таблицы. Запрос обязательно должен быть сгруппирован и в условии отбора необходимо исключить пустые стоки (Адресат.Улица = Is Not Null) . Для обновления списка можно на свойство формы "После обновления" повесить Улица.Requery. Свойство "Ограничиться списком" должно быть "Нет" . Иначе нельзя будет добавлять новые данные.

Достоинства: простота реализации, не нужны справочные таблицы, весь программный код - одной строчкой.

Впрочем, пробелы можно победить например так:


а за неправильность ввода бить по рукам. К тому же, если в список заводятся например номера домов в виде чисел, то этот способ в принципе заслуживает внимания. Чтобы отличить число от текста можно воспользоваться например такой процедурой:


Но в нашем примере я завел для номеров домов тип поля "Текст" - ведь номер может быть например 1/2 или кор. 3. Поэтому, с домами разберемся по другому.

Добавление отсутствующего значение в список значений (Пример1. Вариант2)

Для реализации этого способа мы используем в качестве источника данных справочного списка - "Список значений" . Основа этого способа - перехват события списка "Отсутствие в списке" . Вот пример процедуры:


Достоинства: не нужны справочные таблицы.

Недостатки: новые данные в справочном списке, увы, не сохраняются. То есть, если в список добавилось новое значение, то при закрытии формы оно исчезнет. Все потому, что список значений можно заполнять только в конструкторе форм (в примере список не заполняется, а просто контролу временно "подсовывается" новый источник строк). Однако такой способ может оказаться полезным, когда именно это и требуется: например в списке присутствуют стандартные значения, но требуется ввести не стандартное, причем не один раз, и чтобы все разы одинаково, а в справочную таблицу заносить новые данные по каким либо причинам не следует. Ситуация довольно странная, но при работе с базами данных случается и не такое.

В обоих примерах есть общий недостаток: сложно будет реализовать обновление однотипных данных в таблице "Адресат" - ведь обновлять то их собственно не с чем, нет соответствующей справочной таблицы. То есть, если, например Вы решите изменить название "Москва" на "г. Москва", то придется программно отлавливать в таблице все соответствующие записи и менять их. А вот в случае с использованием справочных таблиц для этого достаточно изменить данные в справочнике.

Добавление отсутствующего значение в список значений (Пример1. Вариант3)

В предыдущем примере рассматривался вариант добавления отсутствующего значения в список подстановок. Но данные не сохранялись, потому что для этого нужна справочная таблица. Теперь я покажу аналогичный пример, но уже с использованием справочной таблицы, тем самым решится проблема сохранения нового значения в справочнике. Добавлять данные, так же как и в предыдущем примере будем программно. Для этого воспользуемся DAO - Data Access Objects - объектная модель доступа к данным. Объекты доступа к данным создавались, как объектно - ориентированный интерфейс для ядра баз данных Jet фирмы Microsoft как раз для того, чтобы можно было программно вносить, изменять, удалять данные в таблицах.

Создадим функцию AppendLookupTable и поместим в общий модуль, чтобы ее можно было вызывать из разных форм, для разных полей со списками, а не только для конкретного.

Для работы с таблицей программно (через DAO), сначала необходимо объявить объектную переменную и присвоить ей источник данных (Recordset):


при работе с таблицей/запросом через DAO после выполнения действий со строками обязательно должно быть обновление источника rst.Update. Иначе компилятор тут же выдаст ошибку. И не забываем закрывать источник после работы - освобождаем память. В принципе это не обязательно, при выходе из процедуры Access его все равно обнулит, но стоит выработать такую хорошую привычку - освобождать переменные в конце процедур.

Вызывать функцию будем аналогично предыдущему примеру:


Формы - справочники.

Теперь займемся наконец справочными формами. Начнем с простого: создадим табличную форму - справочник. На событие "Открытие" формы вешаем процедуру:


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


1. Раз справочник - источник поля со списком, то почему бы дважды не щелкнуть по соответствующему списку для его открытия? А чтобы это как то узаконить, покрасим список в синий (можно, разумеется, и в любой другой) цвет и объявим в справке к программе, что при двойном щелчке по полю синего цвета открывается подобающая ему справочная таблица. Создаем процедуру открытия табличной формы:

acFormDS - указание на то, что форма открывается в режиме таблицы
acWindowNormal - указываем тип границы (вид формы) - обычная Windows ("Нормальная" в конструкторе форм)

Осталось сделать еще одну важную вещь: обновить список при закрытии справочника. Ведь если мы внесли туда новые данные (или удалили) изменения желательно тут же отобразить в списке.


IsLoaded - эта функция проверки, открыта ли форма "Пример1". Взята из базы "Боррей".

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

Для организации подобного интерфейса нам понадобится служебная таблица "ФормыПараметры" и функция fOpenForm. В этом примере для разнообразия применим другой вид формы.

Справочник у нас будет состоять из двух форм: простая форма будет служить контейнером для табличной. Поле серого цвета - поле фильтра. Начните вводить в него первые буквы искомого обозначения - и содержимое таблицы станет динамически фильтроваться (по первым буквам). Фильтрация происходит при помощи функции "fFilForm".

А теперь самое интересное: я сделал только одну подобную форму справочник (основная форма "Справочник", починенная табличная "SubFrm"), а в списке их у меня две: Страны, Регионы. И в базе вы не найдете форм "Справочник страны", "Справочник регионы". Откуда же они берутся? Все очень просто. Рассмотрим функцию "fOpenForm".


Здесь мы видим процедуру присвоения значений трем переменным: strFormName, strTextFormName, strTableName. А теперь посмотрим на самый верх модуля "Module1". Там мы увидим


Здесь мы подошли к такому важному понятию, как область видимости переменных. Раз эти три переменных объявлены в разделе General общего модуля с ключевым словом Public, то они становятся видимыми для всех модулей приложения. Например, их "увидят" процедуры модуля формы "Справочник" для того чтобы присвоить форме соответсвующие параметры. Рассмотрим их.

В таблице "ФормыПараметры" есть три поля: ИмяФормы (имя формы в приложении), ОбозначениеФормы (текстовое обозначение формы, или просто заголовок формы), Таблица (источник данных формы - имя таблицы). В функции "fOpenForm" происходит присвоение этим переменным значений при помощи


как видно, значения берутся из полей служебной таблицы "ФормыПараметры". А затем команда на открытие формы DoCmd.OpenForm strFormName

Теперь заглянем в модуль формы "Справочник". Рассмотрим процедуру, происходящую при открытии формы:


Открытие формы происходит после присвоения значения глобальным переменным. Свое обозначение и источник данных форма получает при открытии.

В результате получился макет формы. При запуске форме присваивается текстовое обозначение и цепляется источник строк при помощи глобальных переменных, значения для которых берутся из служебной таблицы. Таким образом, становится возможным используя всего один макет формы "создавать" множество однотипных справочников. Для этого достаточно лишь заполнить необходимыми данными служебную таблицу. Единственное условие: во всех справочных таблицах должно быть два поля, называться они должны одинаково: id, Обозначение. Это накладывает ограничение на возможные варианты справочников, но ведь речь идет о простых справочных формах.

А теперь, попробуйте сами: "создайте" справочник "Города", заполнив соответствующими данными таблицу "ФормыПараметры".

До сих пор мы рассматривали только простейшие справочники. Но представьте: в каждой стране десятки регионов, в каждом регионе десятки городов. Для страны городов получится не одна сотня. Не удобно выбирать из списка с несколькими сотнями записей. Было бы лучше, если выбрав регион, в списке городов отобразились бы только соответствующие ему города. Для этого потребуются специального вида справочники: многоуровневые (зависимые).

Многоуровневые справочники.

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

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

из особенностей
1. открываеться без окна акса
2. сворачиваеться в трэй
3. удобный поиск (по крайней мере я так думаю :)

из недостатков (то что хотелось бы еще доделать)
1. сделать ввиде дерева (ни разу с деревьями не сталкивался, но наверно придеться)

кто делал свои справочники телефонные. может поделитесь ?

п.с. много кода не моего, подсмотрел у кого то давно уже

про форму резиновую - это тут и не надо. зачем?

например: диспетчерская комбината - "диспетчерская" записываеться в Фамилию, а "комбината" в Имя

можно конечно записать все в наименование. но тогда список "родителей" выростет очень сильно. (там условие - имя и отчество = null)

Создание учебной базы данных Телефонный справочник в Access 97

Другие материалы по предмету

Если база данных уже была открыта или уже закрыто окно запуска, нажмите кнопку Создать базу данных на панели инструментов и дважды нажмите кнопку мыши, установив указатель на значок новой базы данных.

2. Укажите имя и каталог базы данных и нажмите кнопку ОК(например, c:\BD\Access\телефонный справочник.mdb)

После создания пустой базы данных необходимо самостоятельно создать объекты этой базы данных.

4. Создание таблиц

В Microsoft Access можно создать таблицы несколькими способами. Я здесь рассмотрю создание таблиц в режиме конструктора.

Имя поляТип данныхФамилияТекстовыйИмяТекстовыйОтчествоТекстовыйАдресТекстовыйТелефонЧисловойС тем чтобы Microsoft Access мог связать данные из разных таблиц каждая таблица должна содержать поле или набор полей, которые будут задавать индивидуальное значение каждой записи в таблице. Такое поле или набор полей называют основным ключом.

Для поля Телефон поставим ключ и зададим Маску ввода “90\-00\-00”.

Таким же образом создадим вторую взаимосвязанную таблицу. В ней будут храниться личные данные абонентов. Зададим для нее следующие поля:

Имя поля Тип данныхТелефонЧисловойНомер паспортаЧисловойДата рожденияДата/ВремяМесто рожденияТекстовыйОбразованиеТекстовыйМесто работыТекстовыйДолжностьТекстовый

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

Для облегчения работы с данными используют формы.

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

  • нажмите на Панели элементов кнопку Надпись;
  • после этого щелкните в заголовке форме и введите надпись Данные об абоненте;
  • после этого с помощью пиктограмм Панели инструментов измените цвет надписи на темно синий, размер шрифта 14, и выделите ее жирным шрифтом;
  • теперь щелкните на Панели элементов Прямоугольник и разместите его на форме, задайте нужные размеры. Щелкните пункт меню Вид Свойства, в появившемся меню перейдите на вкладку Макет и задайте свойство Оформлениеприподнятое. При необходимости можете изменить цвет фона;
  • объедините текстовые окна (в которых пользователь будет вводить текстовые данные) и поместите их в этот прямоугольник;
  • изменить цвет и шрифт этих текстовых окон.

Подробнее смотрите в пункте Приложение.

Теперь создадим кнопки на форме для перемещения по записям. Создадим кнопку Следующая запись с помощью Мастера.

  1. откроем форму в режиме Конструктор;
  2. на Панели элементов выделим объект Кнопка и перетащим его на форму;
  3. в появившемся меню выберем категорию Переходы по записям и действие Следующая запись, нажмем кнопку Далее;
  4. в этом окне ставим флажок в меню Текст и пишем Следующая запись (эта надпись будет отображаться на кнопке), и жмем кнопку Готово;
  5. с помощью пиктограмм на панели инструментов можно изменить цвет и размер надписи на кнопке.

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

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

Во-вторых, сделаем эту форму всплывающей (всплывающая форма всегда располагается над другими окнами Microsoft Access.). В режиме конструктора откройте окно свойств формы двойным нажатием кнопки мыши в области выделения формы. Введите значение Да в ячейку свойства Всплывающее окно. В ячейке свойства Тип границы выберите Тонкая, если следует запретить изменение размеров формы; в противном случае перейдите к следующему шагу. Если задано значение Тонкая, всплывающую форму можно перемещать, но нельзя изменять ее размеры.

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

Еще сделаем кнопку для закрытия формы.

1. откроем форму в режиме Конструктор;

  1. на Панели элементов выделим объект Кнопка и перетащим его на форму;
  2. в появившемся окне выберем категорию Работа с формой и действие Закрытие формы, нажмем кнопку Далее;
  3. ставим флажок в пункт Рисунок Выход и жмем кнопку Готово.

Создание кнопки для обновления данных в форме.

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

Можно так же сделать кнопку поиска в поле записи с помощью стандартных средств Access:

  1. откроем форму в режиме Конструктор;
  2. на Панели элементов выделим объект Кнопка и перетащим его на форму;
  3. выбираем категорию Переходы по записямНайти запись и нажимаем кнопку Далее;
  4. ставим флажок ТекстПоиск записи и жмем кнопку Готово.

Структура таблиц БД.

Имя поля Тип поля Примечание
Код числовой размер поля: длинное целое
Вид телефона текстовый длина 20
Номер текстовый длина 20


Имя поля Тип поля Примечание
Пункт текстовый длина 30

Поле Имя таблицы Сортировка
Пункт Пункт по возрастанию


  1. Тип элемента управления — Поле со списком;
  2. Тип источника строк — Таблица или запрос;
  3. Источник строк — Пункт_запрос.
Преимущества использования связей

Раздельное хранение данных в связанных таблицах обеспечивает указанные ниже преимущества.

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

Эффективность. Хранение данных в одном месте позволяет сэкономить место на диске. Кроме того, данные из небольших таблиц извлекаются быстрее, чем из больших.

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


Читайте также: