Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС_проект_ИС.doc
Скачиваний:
18
Добавлен:
11.08.2019
Размер:
3.38 Mб
Скачать

4.2. Связывание наборов данных

Наборы данных, размещенные в модуле данных, связаны реляционными отношениями один-ко-многим. Например, единственной записи (накладной) в наборе Naklad может соответствовать произвольное количество записей (строк) в наборе Snakl. Чтобы НД «знали» об этом и согласованно отображали данные, их необходимо предварительно подготовить.

Два НД связываются друг с другом по ключевому полю с помощью свойств MasterSource / MasterFields. Зададим значение свойства MasterSource для НД Snakl равным SourceNak (главная таблица, на записи которой ссылается подчиненная таблица). Вызовем специальный редактор отношений, обратившись с помощью Инспектора объектов к свойству MasterFields. В списке Available Indexes (Доступные индексы) по умолчанию отображается значение Primary (Первичный). Выберем созданный на этапе проектирования таблицы первичный индекс по полю SnNNom и свяжем его с полем NNom таблицы Naklad с помощью кнопки Add, как показано на рис. 20.

Если внешний ключ не входит в состав первичного ключа таблицы, то раскрывается список Available Indexes, в котором необходимо выбрать соответствующее значение.

Существует еще один, более удобный и наглядный способ связывания НД по ключевым полям, который будет рассмотрен в п. 4.5. Этот способ предполагает использование диаграмм (схем данных).

Р ис. 20. Связывание НД с использованием первичного индекса

4.3. Создание объектов-полей

Двойным щелчком на компоненте Izdelie откроем окно редактора полей, щелкнем в окне редактора правой кнопкой мыши и в контекстном меню выберем команду Add all fields. Окно редактора заполнится списком всех полей таблицы IZDELIE.

Это означает, что теперь для каждого поля набора данных Izdelie создан специальный объект со своими свойствами, методами и событиями. Если щелкнуть на любом поле в окне редактора полей, то в окне инспектора объектов станут доступными свойства и события объекта-поля. По умолчанию Delphi присваивает объекту-полю имя, полученное сцеплением имени набора данных и имени поля, так что теперь в программе окажутся компоненты с именами IzdelieIKod, IzdelieINaim, IzdelieIEdin, IzdelieICena (объявление этих компонентов можно увидеть в окне кода модуля данных в объявлении класса TDM).

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

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

Если мы собираемся расширить НД за счет добавления к нему подстановочных полей из других таблиц, то без объектов-полей в этом случае не обойтись – это еще один довод в пользу их создания.

Напомним, что НД Naklad содержит поле NZkod (код заказчика), но не содержит полей, отображающих наименование, адрес и телефон заказчика. Решить проблему можно с помощью подстановочных полей или полей соответствия (Lookup fields), которые создаются в редакторе полей (Fields editor) для физической таблицы Naklad. Они имитируют реальные поля, выполняя подстановку значений полей из других таблиц, соответствующих имеющимся ключевым значениям.

ВНИМАНИЕ! Перед созданием новых полей в НД необходимо закрыть этот НД, выбрав для его свойства Active значение False.

В модуле данных двойным щелчком на компоненте Naklad откроем окно редактора полей и щелчком правой кнопки мыши вызовем его контекстное меню. Выберем команду New Field, чтобы открыть окно конструктора нового поля (рис. 21).

Рис. 21. Окно конструктора нового поля

С помощью конструктора нового поля можно создать в НД новые поля одного из трех типов (тип определяется переключателями в группе Field type):

  • Data – поля содержат произвольные данные;

  • Calculated – поля содержат вычисляемые данные;

  • Lookup – поля содержат данные из таблицы подстановки.

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

В строке Name окна конструктора поля введем имя нового поля Naim, раскроем список Type и выберем для поля тип String, его размер Size установите равным 18. Установим переключатель Lookup, раскроем список полей Key Fields и выберите в нем поле NZKod, в списке Dataset выберем НД Zakazcik, в списке Lookup Fields – ключевое поле ZKod и, наконец, в списке Result Field – поле ZNaim. Закроем окно конструктора щелчком на кнопке ОК. Таким же образом создадим для НД Naklad подстановочные поля Adres и Telefon, указав в качестве результирующих полей соответственно ZAdres и ZTelef и задав размеры 20 и 10 символов.

Для НД Snakl создадим два подстановочных поля с именами Name и Cena, связав их с помощью поля SnIKod с НД Izdelie (поле IKod) и указав в качестве результирующих полей соответственно INaim (тип поля – String, размер – 25) и ICena (тип поля – Currency). Также создадим вычисляемое поле Summa, для чего в строке Name введем имя Summa, в строке Type выберем тип Currency и установим переключатель Calculated.

Для НД Plateg также создадим подстановочные поля Naim, Adres и Telefon, характеризующие заказчика, связав их с помощью поля SpZKod с НД Zakazcik (поле ZKod). Укажем в качестве результирующих полей соответственно ZNaim, ZAdres и ZTelef, выберем тип String и зададим размеры 18, 20 и 10 символов.

Для НД Splat создадим два подстановочных поля с именами Name и Cena, связав их с помощью поля SpIKod с НД Izdelie (поле IKod) и указав в качестве результирующих полей соответственно INaim (тип поля – String, размер – 25) и ICena (тип поля – Currency). Также создадим вычисляемое поле Summa, для чего в строке Name введем имя Summa, в строке Type выберем тип Currency и установим переключатель Calculated.

Щелкнем один раз на НД Snakl и напишем обработчик события OnCalcFields:

procedure TDM.SnaklCalcFields(DataSet: TDataSet);

begin

SnaklSumma.Value:=SnaklCena.Value*SnaklSnOtgKol.Value;

end;

Щелкнем один раз на НД Splat и напишем обработчик события OnCalcFields:

procedure TDM.SplatCalcFields(DataSet: TDataSet);

begin

SplatSumma.Value:=SplatCena.Value*SplatSpOplKol.Value;

end;