Обычно справочные таблицы служат источниками данных для списков или полей со списками. Но прежде чем перейти к созданию форм – справочников, рассмотрим сначала варианты организации этих списков без использования справочных таблиц (см. форму Пример1).
Ссылка таблицы на саму себя (Пример1. Вариант1)
Это самый простой способ организации справочника. Создаем форму «Адресат», цепляем к ней источник – таблицу «Адресат». Создаем поле со списком, источник которого – запрос к полю «Улица» из этой же таблицы. Запрос обязательно должен быть сгруппирован и в условии отбора необходимо исключить пустые стоки (Адресат.Улица = Is Not Null). Для обновления списка можно на свойство формы «После обновления» повесить Улица.Requery. Свойство «Ограничиться списком» должно быть «Нет». Иначе нельзя будет добавлять новые данные.
Достоинства: простота реализации, не нужны справочные таблицы, весь программный код – одной строчкой.
Недостатки: если ввести например «ул. Кирова» а затем «Кирова», то в списке появятся оба варианта, хотя по сути это одно и тоже. Еще хуже «Кирова», « Кирова», «Кирова » - пробелы ведь тоже считаются за символы. Но самое плохое – чтобы удалить «кривое» название из справочника, нужно исправить их все в таблице. Ведь пока будет хотя бы одно «кривое» обозначение, оно будет присутствовать в списке. Подобные проблемы требуют программных решений: создания функций, следящих за правильностью ввода, находящих и исправляющих неправильные значения во всей таблице. Но тогда теряется главное преимущество такого варианта – простота.
Впрочем, пробелы можно победить например так:
Trim([Улица])
а за неправильность ввода бить по рукам. К тому же, если в список заводятся например номера домов в виде чисел, то этот способ в принципе заслуживает внимания. Чтобы отличить число от текста можно воспользоваться например такой процедурой:
If Val(Дом) = 0 Then MsgBox "Не правильный формат данных!", vbCritical, "администратор" Дом = Null End If
Но в нашем примере я завел для номеров домов тип поля «Текст» - ведь номер может быть например 1/2 или кор. 3. Поэтому, с домами разберемся по другому.
Добавление отсутствующего значение в список значений (Пример1. Вариант2)
Для реализации этого способа мы используем в качестве источника данных списка – «Список значений». Основа этого способа – перехват события списка «От��утствие в списке». Вот пример процедуры:
Private Sub Дом_NotInList(NewData As String, Response As Integer) Dim ctl As Control ' Возвращает объект Control, указывающий на поле со списком Set ctl = Me!Дом ' Приглашение подтвердить ввод нового значения If MsgBox("Значение отсутствует в списке. Добавить?", vbOKCancel) = vbOK Then ' Значение аргумента "Response" определяет добавление в список Response = acDataErrAdded ' Добавляет значение аргумента "NewData" в источник строк ctl.RowSource = ctl.RowSource & ";" & NewData Else ' При нажатии кнопки "Отмена" подавляет вывод ' сообщения об ошибке и отменяет изменения Response = acDataErrContinue ctl.Undo End If End Sub
Испытаем процедуру: раскроем сначала список, посмотрим какие там номера и введем такой, которого там нет. При переходе на новую запись или другой элемент формы появится сообщение с предложением завести новое значение списка. Скажем «Да» - значение заведется, скажем нет – сотрется.
Достоинства: не нужны справочные таблицы.
Недостатки: новые данные в списке, увы, не сохраняются. То есть, если в список добавилось новое значение, то при закрытии формы оно исчезнет. Все потому, что список значений можно заполнять только в конструкторе форм (в примере список не заполняется, а просто контролу временно "подсовывается" новый источник строк). Однако такой способ может оказаться полезным, когда именно это и требуется: например в списке присутствуют стандартные значения, но требуется ввести не стандартное, причем не один раз, и чтобы все разы одинаково, а в справочную таблицу заносить новые данные по каким либо причинам не следует. Ситуация довольно странная, но при работе с базами данных случается и не такое.
В обоих примерах есть общий недостаток: сложно будет реализовать обновление однотипных данных в таблице «Адресат» - ведь обновлять то их собственно не с чем, нет соответствующей справочной таблицы. То есть, если, например Вы решите изменить название «Москва» на «г. Москва», то придется программно отлавливать в таблице все соответствующие записи и менять их. А вот в случае с использованием справочных таблиц для этого достаточно изменить данные в справочнике. О различных вариантах оформления форм – справочников я расскажу в следующей статье.
|