Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки 11-12 лекция.doc
Скачиваний:
1
Добавлен:
23.11.2019
Размер:
229.89 Кб
Скачать

Var n: integer;

begin

for n := 0 to Tablel.FieldCount - 1 do

ListBoxl.Items.Add(Tablel.Fields[n].AsString);

end;

Здесь содержимое каждого поля текущей записи интерпретируется как строковое значение и добавляется к списку ListBox1

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

Поэтому для доступа к полям чаще используют методы FindField и FieldByName.

FindField (const FieldName: String) : TField возвращает для набора данных поле, имя которого указывает параметр FieldName.

В отличие от номера в массиве полей, имя поля более статично и изменяется реже. Если заданное параметром FieldName поле не найдено, то метод FindField возвращает значение Nil.

На практике чаще используется метод FieldByName, который отличается от метода FindField тем, что если заданное поле не найдено, то не генерируется исключительная ситуация.

Свойство Fields и методы FindField и FieldByName используются для доступа к значению поля текущей записи совместно с такими свойствами объекта Field, как

AsString, Aslnteger, AsFloat или AsBoolean,

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

Так, в коде:

Var x: integer; ………………..

Label1.Caption := Table1.FieldByName('FIO').AsString;

x := Table1.FieldByName('Num').AsInteger;

строковое значение поля FIO отображается в надписи Label1, а переменной x присваивается целочисленное значение поля Num.

Если же поле Num содержит значение, которое нельзя интерпретировать как целое число, то генерируется исключительная ситуация.

Непосредственно в поля таблицы изменения не вносят, только через формы ввода.

Например:

Var х: integer; ……………. // Перевод набора данных в режим редактирования

Table1.Edit; // Изменение значений полей

Table1.FieldByName ('FIO').AsString := Edit1.Text;

Table1.FieldByName ('Num').Aslnteger := x; // Сохранение изменений

Table1.Post;

Сортировка набора данных

Сортировка заключается в упорядочивании записей по определенному полю или нескольким полям (ускоряет поиск).

Сортировка набора данных Table выполняется автоматически по индексу.

Задать индекс можно при проектировании приложения в пункте Secondary Indexes списка Table properties:

  • нажать кнопку Define и

  • в открывшемся диалоговом окне Define Secondary Index выделить поле индексации и сохранить имена индексов.

Компонент Table имеет свойства:

  • IndexName – содержит список созданных индексов,

  • IndexFieldNameсписок всех полей, из которых можно создать индекс (если забыли в Database Desktop).

Если необходимо менять индексы при работе приложения, то лучше сделать это программно:

procedure TForm1.RadioGroup1Click(Sender:TObject);

begin

Case RadioGroup1.ItemIndex of

0: Table1.IndexName := 'nameindex1' ;

1: Table1.IndexName := 'nameindex2';

2: Table1.IndexName := 'nameindex3';

end;

end;

Фильтрация данных

Фильтрация – выделение подмножества данных по какому-либо условию.

Записи можно отфильтровать по выражению либо диапазону.

Свойство Filtered компонента Table включает и отключает фильтрацию, а сам фильтр записывается в свойство Filter строкового типа:

Table1.Filter := '<имя_поля>=<значение>';

Можно записать:

case RadioGroup1.ItemIndex of

0: Table1.Filter := 'Adres=''Пермь''';

1: Table1.Filter := 'Adres=''Москва''';

2: Table1.Filter := 'Adres=''Ижевск''';

end;

И в зависимости от выбранной кнопки будет произведена фильтрация по тому или иному значению.

Пример: удалить из связанных таблиц указанный товар

s := Table1.FieldByName('Tovar').AsString;//выделено наименова

//по данному наименованию фильтруют подчиненную таблицу

Table2.Filtered := True;

Table2.Filter := 'Tovar=' + '''' + s + '''' ; //если там записей нет, то выходит

If Table2.RecordCount = 0 then exit;

//если есть записи, то удаляет весь отфильтрованный набор данных

if Table2.RecordCount > 0 then

begin

For i :=1 to Table2.RecordCount do Table2.Delete;

end;

Table1.Delete; //удаляют запись в главной таблице

end;

Table2.Filtered := false; //отключает фильтр

Поиск данных

LookUp (const KeyFields : string;

const KeyValues : variant;

const ResultFields : String) : Variant; -

метод предназначен для поиска значения ResultFields в записи с ключевым полем KeyFields = KeyValues.

Res := Table1.Lookup('Id', 2, 'Name');

Если ни одна запись набора не удовлетворяет заданному условию, то результат NULL.

Locate (const KeyFields : string;

const KeyValues : variant;

Options : TLocateOptions ) : Boolean; -

метод делает текущей самую первую запись набора данных, для которой выполнились условия совпадения значения KeyValues ключевого (индексированного!!!) поля KeyFields при опциях

loCaseInsensitive – без учета регистра,

loPartialKey – частичного совпадения.

Пример: