Метод Lookup
function Lookup(const KeyFields: string; const Key Values: Variant;
const ResultFields: string): Variant;
Метод Lookup находит запись, удовлетворяющую условию, но не делает ее текущей, а возвращает значения некоторых полей этой записи. Тип результата - Variant или вариантный массив. Независимо от успеха поиска записи, указатель текущей записи в НД не изменяется.
Lookup осуществляет поиск только на точное соответствие критерия поиска и значения полей записи. Такой режим, как loPartialKey метода Locate (поиск по частичному соответствию значений), отсутствует.
Параметры:
В KeyFields указывается список полей, по которым необходимо осуществить поиск. При наличии в этом списке более чем одного поля, соседние поля разделяются точкой с запятой.
Key Values
указывает поисковые значения полей, список которых содержится в KeyFields. Если имеется несколько поисковых полей каждому i-му полю в списке KeyFields ставится в соответствие i-oe значение в списке Key Values. При наличии одного поля, его поисковое значение можно указывать в качестве Key Values непосредственно; в случае нескольких полей - их необходимо приводить к типу вариантного массива при помощи Var-Array'Of.В качестве поисковых полей можно указывать поля как входящие в какой-либо индекс, так и не входящие в него; тип текущего индекса не имеет значения. Если поисковые поля входят в какие-либо индексы, их использование производится автоматически; в противном случае используются фильтры BDE.
Если запись в результате поиска не найдена, метод Lookup возвращает Null, что выявляется при помощи предложения
IF VarType(LookupResults) = varNull THEN ...
В противном случае Lookup возвращает из этой записи значения полей, список которых указан в ResultFields. При этом размерность результата зависит от того, сколько результирующих полей указано в ResultFields'.
• указано одно поле - результатом будет значение соответствующего типа или Null, если поле в найденной записи содержит пустое значение;
указано несколько полей - результатом будет вариантный массив, число элементов в котором меньше или равно числу результирующих полей;
меньше потому, что некоторые поля найденной записи могут содержать пустые значения. Рассмотрим несколько вариантов.
Пример
А. Одно результирующее поле (результат - значение типа Variant) Будем осуществлять поиск в ТБД "Сотрудники" по полю 'FIO'. Поисковое значение будем вводить в Edit I. В качестве результата будем выдавать значение поля "UchStepen' (ученая степень) найденной записи.procedure TFormX.LookuplButtonClick(Sender: TObject);
var
LookupResults : Variant; // результат
begin
// осуществить поиск
LookupResults := Tablel.Lookup('FIO', Editl.Text, 'UchStepen') ;
Label 1.Caption := ";
// содержит ли результат пустое значение или Null?
CASE VarType(LookupResults) OF
varEmpt : Labell.Caption := 'Пустой результат';
varNull : Labell.Caption := 'Запись не найдена';
ELSE
// нет, результат содержит какое-то значение
Labell.Caption := LookupResults;
END; //case
end;
Заметим,что в присваивании
Labell.Caption := LookupResults;
имеет место приведение вариантного типа к строковому. Более подробно о приведении вариантных типов см. описание вариантного типа в документации и встроенной системе помощи Delphi.
Пример Б.
Несколько результирующих полей (результат - вариантный массив)Некоторые сведения по использованию вариантного массива:
Если переменная типа Variant является вариантным массивом, функция VarIsArray(LookupResults) возвращает True.
При работе с переменным числом возвращаемых полей, в конкретном случае верхнюю и нижнюю границы массива LookupResults можно определить при помощи функций VarArrayLowBound(LookupResults, 1) и VarArrayHigh-Bound( LookupResults, 1).
Тип i-го элемента вариантного массива можно определить как VarType (LookupResults [ i]).
Будем осуществлять поиск в ТБД "Сотрудники" по полю 'FIO\ Поисковое значение будем вводить в Editi. В качестве результата будем выдавать значения полей "TabNum,DolJnost,UchStepen' найденной записи (табельный номер, должность, ученая степень).
procedure TFormX.LookupButtonClick(Sender: TObject) ;
var
LookupResults : Variant; // результат
begin
// осуществить поиск
LookupResults := Tablel.Lookup('FIO', Editl.Text, '' TabNum;Doljnost;UchStepen') ;
// будем показывать значения результирующих полей в TLabel
Labell.Caption := ";
Label2.Caption := ";
Label3.Caption := ";
// результат - вариантный массив ?
IF VarIsArray(LookupResults) THEN
begin
Labell.Caption := LookupResults[0];
IF LookupResults[1] 0 Null THEN
Label2.Caption := LookupResults [1];
IF LookupResults[2] о Null THEN
Label3.Caption := LookupResults [2];
end // then
ELSE
// результат - не вариантный массив, а единичное значение
CASE VarType(LookupResults) OF
varEmpty : Labell.Caption := 'Пустой результат';
varNull : Labell.Caption := 'Запись не найдена';
END; //case
end;
Если запись не найдена, VarType (LookupResults) возвращает значение varNull; если поиск по какой-либо причине не был произведен, VarType (LookupResults) возвращает значение varEmpty. Если какое-либо из полей, чьи значения возвращаются в результате поиска в вариантном массиве, содержит пустое значение, соответствующий элемент вариантного массива также будет содержать пустое значение (Null). В этом случае обращение к нему возбудит исключительную ситуацию, поэтому нужна предварительная проверка.