Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции. РАзработка БД в среде Delphi.doc
Скачиваний:
24
Добавлен:
12.06.2015
Размер:
315.39 Кб
Скачать

6.3. Поля компонента Table

Как уже указывалась (см. Лекция 5), для дополнительных возможностей работы с полями таблицы БД к компоненту Table, представляющему таблицу, можно добавить описания полей таблицы как классов объектов. Для этого следует дважды щелкнуть по компоненту Table, представляющему таблицу, затем на появившемся окне нажать правую кнопку мыши и выбрать команду Add all fields. После этого в блок описаний программного модуля вставляются описания добавленных полей как классов объектов, наследников класса TField. Для доступа к значениям полей таблицы БД, представленных в компоненте Table, можно использовать свойство Value класса TField в виде: <Имя компонента TTable><Имя поля>.Value. Возвращаемое значение имеет тип Variant и преобразуется, если это возможно, к требуемому типу.

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

ShowMessage('Оценка: '+Table1Mark.Value);

Создание объектов, представляющих поля физической таблицы БД через компонент Table, не только позволяет упростить доступ к значениям полей, но и обеспечивает для поля:

  • представление значения в нужном формате и выравнивании (свойства Alignment, DisplayFormat, EditMask);

  • формирование значения по умолчанию (свойство DefaultExpression);

  • формирование требования на обязательное значение (свойство Required установлено в Тrue).

Кроме этого, с помощью компонента Table можно создать поля специального типа, которые не являются полями заданной таблицы БД, но значения которых формируются в процессе работы приложения на основе значений других полей, в том числе из других таблиц БД, и могут отображаться на визуальных компонентах. Это «вычисляемые» (calculated) и «связанные» (lookup) поля.

6.4. Вычисляемые и связанные поля

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

Пусть компонент с именем taMarks представляет таблицу БД Marks.db, с полями: Id типа S* (код оценки) и Name типа A (наименование оценки), а компонент taStudents представляет таблицу БД Students.db, имеющую поле Id_Mark (код оценки). Требуется создать поле Name_Mark для taStudents, в котором отображалось бы наименование оценки, в зависимости от кода оценки в таблице Students.db.

Для создания требуемого lookup поля необходимо:

1. Щелкнуть дважды по компоненту taStudents, нажать правую кнопку мыши и в появившемся коротком меню выбрать команду New Field.

2. В появившемся окне New Field (рис. 6.2) задать значения следующих реквизитов:

Field properties/Nameимя нового поля, Name_Mark;

Field properties/Typeтип нового поля, String;

Field properties/Sizeнаибольшая длина строки, например, 20;

Field type выбрать значение Lookup;

Lookup Definition/Key Fieldsвыбрать из списка полей таблицы taStudents поле Id_Mark (данное поле

используется для связи с

таблицей-справочником); Рис. 6.2

Lookup Definition/DataSetвыбрать из списка таблицу taMarks (компонент Table, представляющий таблицу-справочник).

Lookup Definition/Lookup Keysвыбрать из списка полей таблицы taMarks поле Id (данное поле используется для связи с исходной таблицей: связываются записи, в которых значения выбранных полей исходной таблицы и таблицы-справочника совпадают).

Lookup Definition/Result Field – выбрать из списка полей таблицы taMarks поле Name.

Значение поля Name таблицы БД Marks.db будет доступно для отображения через компонент taStudents.

Новое поле появляется не в физической таблице БД, а только в компоненте, ее представляющем!

Это поле можно удалить без изменения информации в физической таблице БД. Связь осуществляется только по значению поля Id_Mark.

Вычисляемое поле (calculated fields) позволяет использовать значения полей физической таблицы БД для вычисления значений выражений и их представления в визуальных компонентах, связанных с таблицей. Значение вычисляемого поля формируется заново каждый раз, когда изменяются значения соответствующих полей таблицы. Программный код, реализующий алгоритм формирования значения вычисляемого поля, вставляется в обработчик события OnСalcFields визуального компонента Table, представляющего таблицу.

Для создания вычисляемого поля необходимо:

  1. Дважды щелкнуть по компоненту Table соответствующей таблицы.

  2. Нажать правую кнопку мыши и в появившемся меню выбрать командуNew Field (рис. 6.3).

Рис. 6.3

  1. Ввести наименование вычисляемого поля в строке Field properties/Name.

  2. Выбрать нужный тип в строке Field properties/Type.

  3. Выбрать значение Calculated в строке Field type и нажать кнопку OK.

  4. Вставить в событие OnСalcFields визуального компонента Table, представляющего таблицу, программный код, определяющий значение вычисляемого поля.

Пусть, например, таблица БД Products.db содержит поля Price тип $ (цена за единицу товара) и Amount тип N (количество закупленного товара в единицах, в которых установлена цена). Требуется создать поле для вычисления стоимости всего приобретенного товара. Для этого необходимо:

  • ввести имя поля Sum в строку Field properties/Name;

  • выбрать тип поля Currency в строке Field properties/Type;

  • выбрать значение Calculated в строке Field type;

  • вставить в событие OnСalcFields визуального компонента Table1 следующий программный код:

Table1Sum.Value:=Table1Price.Value*Table1Amount.Value

Подведем итоги. Объект класса TTable или TQuery (см. Лекция 7) может содержать совокупность объектов класса TField. Существует три типа объектов:

  • объект, представляющий реальное поле физической таблицы БД, с которой связан объект TTtable, или поле, указанное в операторе SELECT запроса, связанного с объектом класса TQuery;

  • вычисляемое поле, представляющее значение некоторого выражения, связывающего поля таблиц или запросов с учетом их типов;

  • связанное поле, представляющее поле другой таблицы или запроса.

    1. Мультиформы

Часто возникает необходимость на одной форме отобразить информацию из двух связанных содержательно таблиц: реквизиты студента и его оценки; наименование фирмы-поставщика и список товаров; автор и список его произведений и т.д. Для этого необходимо между таблицами установить связь один-ко-многим. Эта связь подразумевает, что каждой записи главной таблицы (master table) может соответствовать несколько записей подчиненной таблицы (detailed table) и каждой записи подчиненной таблицы соответствует не более одной записи главной таблицы. Соответствие устанавливается по равенству значений выбранных полей двух таблиц.

Для создания такой связи между таблицами необходимо:

  • для компонента Table подчиненной таблицы выбрать для свойства MasterSource имя источника данных (TDataSource), связанного с главной таблицей;

  • всвойствеMasterFields компонента Table подчиненной таблицы определить для полей подчиненной таблицы соответствующие поля главной таблицы. Соответствие может устанавливаться по первичному или вторичным индексам, но необходимо, чтобы по каждой записи подчиненной таблицы однозначно определялась запись главной таблицы (рис. 6.4).

Рис. 6.4

Такая связь между таблицами позволяет для текущей записи главной таблицы отображать на форме только связанные с ней записи подчиненной таблицы. Обычно для обеспечения удобного интерфейса пользователя на форме представляются «идентификационные» поля главной таблицы (фамилия, наименование, номер счета и т.д.) в виде TDBEdit и поля подчиненной таблицы в виде TDBGrid. Поля, по которым реализуется связь (они имеют одинаковые значения для двух таблиц), целесообразно отображать на форме только один раз для главной таблицы (рис. 6.5).

Рис. 6.5