Поля синхронного просмотра

В практике программирования часто применяются поля синхронного просмотра (Lookup), которые часто называют связными полями.

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

Свойство

property LookupDataSet: TDataSet;

задает набор данных синхронного просмотра.

Свойство

property LookupResultField: String;

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

Свойство

property LookupKeyFields: String;

содержит поле (или поля) из набора данных синхронного просмотра, по значению которого выбирается значение из поля LookupResultField.

Свойство

property KeyFields: String;

определяет поле (или поля) из исходного набора данных, для которого создается поле синхронного просмотра.

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

Для создания нового поля синхронного просмотра нужно в списке полей компонентов набора данных щелкнуть правой кнопкой и выбрать создание нового поля (new field). В появившемся диалоговом окне выбираем тип вновь выбираемого поля – Lookup (рис. 5). Остальные поля соответствуют свойствам созданного поля синхронного просмотра.

Рисунок 5 Диалоговое окно для задания свойств поля синхронного просмотра

 

Вычисляемые поля

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

Метод OnCalcFields выполняется при открытии набора данных, при переходе в режим редактирования, при передаче фокуса между компонентами отображения данных или колонок сетки, при удалении записи.

Примечание

 

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

Для создания вычисляемого поля достаточно в диалоге создания нового поля Редактора полей в качестве типа поля задать "вычисляемое", в остальном процесс совпадает с созданием поля данных.

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

Параметры запросов

В Delphi, для создания SQL-запроса на лету можно использовать запросы с параметрами. Для определения параметра в запросе используется двоеточие (:), за которым следует имя параметра. Ниже приведен пример SQL-запроса с использованием параметра:

 

select * from AIRPORT where AP_CT_CODE = :CtCode

 

Примечание

Обратите внимание, что после двоеточия не должно быть никакого пробела.

Для изменения SQL-запроса во время выполнения приложения, параметры необходимо связать (bind). Параметры могут изменяться, запрос выполняться повторно, а данные обновляться. Для непосредственного редактирования значения параметра используется свойство Params или метод ParamByName.

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

property Items[Index: Word]: TParam;

а к значениям параметров — через свойство

property ParamValues[const ParamName: String]: Variant;

При работе с параметрами для их идентификации полезно использовать обращение по имени, т. к. при работе с хранимыми процедурами после их выполнения порядок следования может измениться. Также и при использовании динамических запросов (их текст SQL может изменяться во время выполнения).

Для обращения к параметру по имени используется метод

function ParamByName(const Value: String): TParam;

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

Класс TParam инкапсулирует свойства отдельного параметра. Имя параметра определяется свойством

property Name: String;

Тип данных параметра задает свойство

property DataType: TFieldType;

Тип данных параметра и связанного поля должны совпадать.

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

property IsNull: Boolean;

Свойство возвращает значение True, если параметр не имеет значения или имеет значение Null.

Свойство

property Bound: Boolean;

возвращает значение True только тогда, когда параметру не присваивалось значение вообще.

Метод

procedure Clear;

присваивает параметру значение Null.

Само значение параметра задается свойством

property Value: Variant;

Но использование вариантов не очень эффективно, когда требуется обеспечить максимальную скорость. В таких случаях можно обратиться к целому набору свойств As ..., которые не только возвращают значение, но и приводят его к некоторому типу. Например, свойство AsInteger читает данные как тип Integer (название говорит само за себя). Это не обязательно должно указывать но то, что поле имеет тип Integer. Например, если тип поля VARCHAR(10), Delphi осуществит преобразование данных.

Набор свойств As ..., для TParam такой же, как для TField

property AsString : String;

property AsInteger : Integer;

property AsDateTime : TDateTime;

property AsBoolean: Boolean;

property AsCurrency :Currency;

property AsFloat : Double;

 

Примечание

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

Для нашего SQL-запроса значение параметра будет присваиваться так:

 

Query1.Params[0].AsInteger := 9;

 

или так:

 

Query1.ParamByName('CtCode').AsInteger := 9;

 

Пример практического применения запросов с параметрами приведен в разделе ….