Использование компонента TFieldDefs
Компонент TFieldDefs содержит информацию о полях, объявленных в составе ТБД, ассоциированной с данным НД.
Для НД типа TTable компонент TFieldDefs содержит информацию обо всех полях, объявленных в структуре ТБД, ассоциированной с данным TTable. He следует путать это свойство с свойством Fields, которое содержит информацию о всех компонентах типа TField, объявленных для данного набора данных с использованием редактора полей.
Для НД типа TQuery компонент TFieldDefs содержит информацию обо всех полях, объявленных в качестве возвращаемых полей в операторе SELECT. Подробнее см. замечание, помещенное в конце данного подраздела. Свойство набора данных
property FieldDefs: TFieldDefs;
в качестве результата возвращает указатель на объект типа TFieldDefs данного НД и, таким образом, с его помощью можно использовать свойства и методы
компонента TFieldDefs для определения числа и характеристик полей, объявленных в таблице базы данных, ассоциированной с данным НД. Рассмотрим свойства и методы компонента TFieldDefs.
Свойства компонента TFieldDefs
• property Count: Integer;
Возвращает количество компонентов типа TIndexDef, каждый из которых содержит информацию о конкретном поле в составе ТБД.• property Items[Index: Integer]: TFieldDef;
Данное свойство является набором объектов типа TFieldDef, каждый из которых содержит информацию о конкретном поле, объявленном в составе ТБД. Доступ к конкретному объекту осуществляется через указание Items[Index], где Index лежит в диапазоне Q..Count-\.Объект типа TFiezldDef обладает следующими свойствами:
• property DataType: TFieldType;
Свойство DataType возвращает тип поля как значение из перечислимого типа TFieldType:TFieldType = (ftString, ftSmallint, ftlnteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary);
• property FieldNo: Integer;
Свойство FieldNo возвращает физический номер поля, использующийся Borland Database Engine (BDE) для доступа к полю.• property Name: string;
Свойство Name возвращает физическое имя поля в ТБД.• property Required: Boolean;
Данное свойство возвращает True, если поле требует обязательного заполнения каким-либо значением, и False в противном случае.• property Size: Integer;
Данное свойство возвращает размер поля. Он важен для полей типов: ftString, ftBCD, ftBytes, ftVarBytes, ftBlob, ftMemo or ftGraphic. Для полей всех остальных типов размер поля определяется его типом. Для полей BCD возвращается число знаков после десятичной точки.Пример.
Считать сведения о полях ТБД, ассоциированной с Table 1, и поместить в ListBox1 информацию об имени каждого поля, его типе, размере и значении его свойства Required (результат работы приводимого кода на рис.7.38):var i : Integer;
TipPolja : String; // тип поля
Tmp : String; // результат форматирования
TmpReq : String[3];//рабочая переменная
begin
ListBoxl.Clear;
Tablel.FieldDefs.Update;
// считываем поля и заносим в ListBoxl сведения об
//их имени, типе, размере и свойстве Required
FOR i := О ТО Tablel.FieldDefs.Count - 1 do begin
CASE Tablel.FieldDefs.Items[i].DataType OF
ftString TipPolja = 'String';
ftSmallint TipPolja = 'Smallint' ;
ftlnteger TipPolja == 'Integer';
ftWord TipPolja = 'Word';
ftBoolean TipPolja = 'Boolean';
ftFloat TipPolja = 'Float';
ftCurrency TipPolja = 'Currency' ;
ftBCD TipPol;a = 'BCD';
ftDate TipPolja = 'Date';
ftTime TipPolja = 'Time';
ftDateTime TipPolja = 'DateTime';
ftBytes TipPolja = 'Bytes' ;
ftVarBytes TipPolja = 'VarBytes' ;
ftAutoInc TipPolja = 'AutoInc';
ftBlob TipPolja = 'Blob';
ftMemo TipPolja = 'Memo';
ftGraphic TipPolja = 'Graphic';
ftFmtMemo TipPolja = 'FmtMemo' ;
ftParadoxOle TipPolja = 'ParadoxOle';
ftDBaseOle TipPolja = 'DBaseOle';
ftTypedBinary TipPolja = 'TypedBinary';
END;
IF Tablel.FieldDefs.Items[i].Required THEN
TmpReq := 'Req'
ELSE
TmpReq := ' - ';
Tmp := Format('%-16s %-10s %-5s %4d', [Tablel.FieldDefs.Items[i].Name, TipPol]a, TmpReq, Tablel.FieldDefs.Items[i].Size]) ;
ListBoxl.Items.Add(Tmp);
END;
Методы компонента TFieldDefs
procedure Add(const Name: string; DataType: TFieldType; Size: Word; Required: Boolean);
Метод Add добавляет в список Items новый элемент- поле.
Параметр Name определяет имя нового поля.
Параметр DataType определяет тип поля как одно из значений перечислимого типа TFieldType (см. выше описание свойства TTable. TFieldDefs.Items [Index].DataType).
Параметр Si:e указывает размер поля или 0 в случае, когда размер поля явно определяется его типом (например, ftlnteger определяет целочисленное поле длиной в слово).
Параметр Required определяет, должно ли поле в обязательном порядке содержать какое-либо значение, или не должно.
procedure Clear;
Метод Clear очищает FieldDefs. Это необходимо, например, при создании новой ТБД (см. метод TTable. CreateTable.function Find(const Name: string): TFieldDef;
Метод Find ищет поле по его имени, определяемому параметром Name. В случае успеха метод возвращает указатель на объект TIndexDefs. Items.•
function Index0f(const Name: string): Integer; Метод Index Of ищет поле по его имени и возвращает индекс объекта TIndexDefs списке Items. У найденного элемента значение свойства Name совпадает с параметром Name метода.procedure Update;
Метод Update обновляет содержимое свойства TFieldDef текущей информацией о полях в составе ТБД. Он также позволяет заносить в TFieldDef информацию о полях неоткрытого НД.ЗАМЕЧАНИЕ.
Для НД типа TQuery в свойстве FieldDefs будет содержаться информация только о тех полях, которые представлены в списке после оператора SELECT:SELECT P.NN, P.DatePrih, P.Tovar
FROM prihod P
WHERE ...
Тогда свойство FieldDefs будет содержать информацию только о полях NN, DatePrih, Tovar таблицы Prihod.
Это правило действует и для случая двух и более таблиц БД, участвующих в запросе:
SELECT P.NN, P.DatePrih, P.Tovar, P.Kolvo, K.KursUSD
FROM prihod P, KursUSD К
WHERE K.Datel= P.DatePrih
В случае использования в качестве полей результирующего запроса агрегированных функций типа SUM, а также результатов выражений, имя вычисляемого или агрегированного поля берется по его псевдониму, следующему после ключевого слова as:
SELECT P.NN, P.DatePrih, P.Tovar, P.Kolvo, K.KursUSD, P.KolVo * K.KursUSD as Zena
FROM prihod P, KursUSD К
WHERE K.Datel= P.DatePrih
В данном случае вычисляемое поле P.KolVo * K.KursUSD имеет в результирующем НД имя ' Zena '.
Если псеводним вычисляемому или агрегированному полю не присвоен, его имя берется как копия арифметического выражения, по которому значение этого поля вычисляется. Например:
SELECT P.NN, P.DatePrih, P.Tovar, P.Kolvo, K.KursUSD,
P.KolVo * K.KursUSD
FROM prihod P, KursUSD К
WHERE K.Datel= P.DatePrih
Имя вычисляемого по выражению P.Kolvo * K.KursUSD поля будет P.KolVo * K.KursUSD '.