Справочники. Часть 2.

Источник: Leader

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

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

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

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

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


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=9495