Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания / LAB4.DOC
Скачиваний:
14
Добавлен:
15.06.2014
Размер:
5.35 Mб
Скачать

Лабораторная работа № 4

Тема: Работа с наборами данных (компонент TTable)

Открытие и закрытие НД (набор данных)

Состояние НД определяется его свойством State, доступным только для чтения на этапе прогона программы. Оно может принимать следующие значения: dsInactive – НД закрыт; dsBrowse – находится в состоянии просмотра; dsEdit – в состоянии редактирования; dsInsert – в состоянии вставки; dsSetKey – в состоянии поиска записи; dsCalcFields – в состоянии установки значений вычисляемых полей; dsFilter – в состоянии фильтрации записей и др.

Начальное состояние любого НД – dsInactive. Чтобы открыть НД, используется его метод Open или свойство Active, в которое нужно поместить значение True. После успешного открытия НД переходит в состояние dsBrowse, a его курсор устанавливается на первую запись.

Чтобы закрыть НД вызывается метод Close. Замечу, что если НД закрывается, находясь в режимах dsInsert или dsEdit, изменения, сделанные в текущей записи, не запоминаются. Закрыть НД можно также, поместив значение False в его свойство Active.

Доступ к записям

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

Например:

Table1.Open;

If not Table1.IsEmpty then

Repeat

{используем информацию из текущей записи или редактируем ее}

Until not Table1.FindNext;

Table1.Close;

или

Table1.Open;

While not table1.EOF do

Begin

{используем информацию из текущей записи или редактируем ее}

Table1.Next;

End;

Table1.Close;

Перед редактированием текущей записи НД необходимо перевести в состояние dsEdit методом Edit, а после редактирования сохранить сделанные изменения в соответствующей ТБД, вызвав метод Post:

Table1.Edit;

Table1[‘Number’]:=12345;

Table1.Post;

По такой же схеме осуществляется вставка или добавление новой записи, при этом вместо Edit вызывается Insert (вставка записи) или Append (добавление записи). Вместо

Table1.Insert;

{наполнение пустой записи нужными значениями}

Table1[‘Number’]:=12345;

Table1[‘Name’]:=’Иванов И.И.’;

Table1[‘Children’]:=False;

Table1.Post;

можно использовать единственный оператор, вызвав метод InsertRecord или AppendRecord:

Table1.InsertRecord([12345],’Иванов И.И.’,False]);

Вставленная запись становится текущей.

Навигация по набору данных

С помощью методов First, Last, Next, Prior, MoveBy, FindFirst, FindLast, FindNext, FindPrior можно изменять положение курсора и, следовательно, выбирать нужную запись.

Для выполнения действии при последовательном переборе записей начиная от некоторой стартовой записи и до конца набора данных используют циклы while…do или repeat…until:

With Table1 do

Begin

First;

While not EOF do {пока не достигла конца таблицы}

Begin

{Какие-либо действия над очередной

записью}

Next;

End;

End;

With Table1 do

Begin

First;

Repeat

{Какие-либо действия над очередной

записью}

Until not FindNext;

End;

Поиск записей в наборах данных

Метод Locate

Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена, делает ее текущей. В этом случае в качестве результата возвращается True. Если запись не найдена, возвращается False и курсор не меняет своего положения.

function Locate(const KeyFields:String; const KeyValues:Variant;Options:TLocateOptions):Boolean;

Список KeyFields указывает поле или несколько полей, по которым ведется поиск. В случае нескольких полей их названия разделяются точкой с запятой. Критерии поиска задаются в вариантном массиве KeyValues так, что i-ное значение в KeyValues ставится в соответствие i-му полю в KeyFields. Параметр Options позволяет указать необязательные режимы поиска:

loCaseInsensitive – поиск ведется без учета возможной разницы регистра букв в строковых полях и в критерии поиска;

loPartialKey – запись считается удовлетворяющей условию поиска, если она содержит часть строки поиска.

Метод Lookup

Метод Lookup находит запись, удовлетворяющую условию поиска, но не делает ее текущей, а возвращает значение некоторых ее полей. В отличие от Locate Lookup осуществляет поиск только на точное соответствие критерию поиска значения поля поиска записи.

function Lookup(const KeyFields:String; const KeyValues:Variant; const ResultFields:string):Variant;

В ResultFields перечисляются поля, значения которых требуется получить в случае успешного поиска.

Например, в редакторе Name:TEdit задается имя клиента, ищем это имя в поле Name_cl и в качестве результата нам нужны значения полей name_cl и dohod_cl:

Var LookupResult:Variant;

begin

LookupResult:=Table1.Lookup(‘Name_cl’, Name.text, ’Name_cl;Dohod_cl’);

If VarType(LookUpResult)=varNull then

Showmessage(‘Нет такого клиента в базе’)

else if VarType(LookupResult)=varEmpty then

Showmessage(‘Поиск не проведен’)

else if VarIsArray(LookupResult) then

begin

stName.caption:=LookupResult[0];

stDohod.caption:=LookupResult[1];

end;

end;

Свойство Filter

Свойство Filter задает критерий фильтрации. В этом случае НД будет отфильтрован, как только в его свойство Filtered будет помещено значение True. В синтаксисе можно использовать обычные операции отношения и логические операторы AND, NOT и OR, например:

(KOD_ZAKAZA>0) and (KOLVO_TOVA<30)

Строку критерия фильтрации можно ввести во время прогона программы или на этапе конструирования формы. Например, с помощью такого обработчика события OnClick компонента Button1 (класс TButton) критерий фильтрации считывается из редактора edFilter и помещается в свойство Filter компонента Table1.

procedure TForm1.Button1Click(Sender: TObject);

begin

if edFilter.Text<>’’ then

with Table1 do

begin

Filter:=edFilter.Text;

Filtered:=True;

end;

end;

C помощью свойства

type TFilterOption=(foCaseInsensitive, foNoPartialCompare);

property FilterOptions:TFilterOptions;

программист может определить дополнительные условия фильтрации строковых полей:

foCaseInsensitive – фильтрация производится без учета разницы в регистре букв;

foNoPartialCompare – поиск производится на точное соответствие.

Соседние файлы в папке Задания