
Продолжение... Начало в статье - Как правильно делать поиск в ADO? Часть 1
BDE (вовсе не ADO) Дельфи нам предоставляет для работы с нашими таблицами базы данных определённые функции, позволяющие поиск производить нужных значений...
Давайте приведем несколько из них – это Goto, GoToNearest, GoToKey, Find, Find Nearest, FindKey…
Если Вы хотите полную справку по данным методам, следует в справке посмотреть Дельфи, в разделе под названием: Searching for records based on indexed fields. ADO же наоборот, не поддерживает данные варианты. Вместо него ADO представляет методику Seek.
Seek
В ADO, методика Seek, индекс использует именно для поиска данных.
Узнать больше о дом 2 можно на ресурсе allaborisevich.ru!
К примеру, при поиске в самой базе данных Access, в том случае если индекс не задать, то Seek для поиска записей используется с указанным значением в поле, основан на которых именно текущий индекс.
В том случае, когда Seek нужную строку не находит, то не выдаётся вообще никакой ошибки, а курсор именно в конец данных устанавливается.
Метод Seek, значение boolean возвращает, которое указывает на успешность нашего поиска: True - когда запись найдена была или False, когда записей наших требований удовлетворяющих найдено не было.
Методика же GetIndexNames в TADOTable – компоненте, список возвращает (к примеру: ячеек combo box) индексов доступных для таблицы.
ADOTable1.GetIndexNames(ComboBox1.Items);
Данный список доступен пока только в режиме разработки именно в свойстве IndexName самого компонента под названием TADOTable.
Свойство же IndexFieldNames без проблем использоваться может как метод альтернативный для определения индекса, который используется в таблице.
В самом же IndexFieldNames, мы имя каждого поля указываем для использования в нашей таблице.
Метод Seek следующее имеет определение:
function Seek(const KeyValues: Variant; SeekOption:
TSeekOption = soFirstEQ): Boolean;
KeyValues представляет собой массив значений Variant. Так как состоит индекс из одного либо больше столбцов, то массив значения содержит, которые сравниваться будут с идентичными столбцами.
SeekOption на тип сравнивания указывает между колонками индекса и идентичным KeyValues.
SeekOption - Назначение
soFirstEQ Указатель на запись, в первую запись позиционируется, которая удовлетворяет требования, в том случае когда она найдена, или в конец таблицы, в том случае когда не найдена.
soLastEQ Указатель на запись, на последнюю запись позиционируется, которая удовлетворяет требованиям, в том случае когда она найдена, или же в конец таблицы если наоборот.
soAfterEQ Указатель на запись, на удовлетворяющую требованиям запись позиционируется, в том случае когда такая найдена, или же сразу после той, была которая найдена.
soAfter Указатель на запись, сразу после той позиционируется, была которая найдена.
soBeforeEQ Указатель на запись, удовлетворяющую требованиям позиционируется на запись, если найдена такая, или перед той, была которая найдена.
soBefore Указатель на запись, перед той записью позиционируется, была которая найдена.
Несколько примечаний:
1 - методика Seek курсоры поддерживает исключительно на стороне сервера (server-side). Seek и вовсе работать не будет, в случае значение свойства CursorLocation = clUseClient. С этой целью метод Supports используется для определения главного провайдера, который поддерживает Seek.
2 – в том случае, когда используется методика Seek именно для нескольких полей, то Seek поля быть должны в порядке том же самом как и поля в главной таблице. В том случае, когда это не так, Seek покажет нам ошибку.
3 - Вы использовать не сможете методику Seek в компоненте под названием TADOQuery.
С целью определения, была ли запись соответствующая найдена, используем мы свойства BOF либо EOF (это зависит от направления нашего поиска). Следующий код индекс использует, который указанный в ComboBox, чтобы смочь значение найти, которое содержится в окне редактирования Edit1.
var strIndex: string;
strIndex := ComboBox1.Text; // это из примера выше
if ADOTable1.Supports(coSeek) then begin
with ADOTable1 do begin
Close;
IndexName := strIndex;
CursorLocation := clUseServer;
Open;
Seek (Edit1.Text, soFirstEQ);
end;
if ADOTable1.EOF then
ShowMessage ('Record value NOT found');
end;
+0