Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Поля(встать на какую-то запись)

Поиск

1) Locate - Осуществляет поиск записи в наборе данных. Locate Этот универсальный метод поиска устанавливает текущую запись как первую строку, удовлетворяющую набору критериев поиска. Используя метод Locate мы можем искать значения одного или более полей, расположенных в массиве переменных.

(если значений много, то используем параметр типа Variant, туда можно просто записывать значения разных типов

Если значений много то мы пишем: Var array of [пишем все значения, которые буду помещены(которые будут искаться)] – это он сказал на консультации.)

 

function Locate (const KeyFields r string,- const KeyValues:

Variant; Options: TLocateOptions): Boolean;

 

Получает в качестве параметров список полей, по которым будет

выполняться поиск, список значений для каждого из полей и набор вспомогатель-

ных настроек поиска (тип TLocateOptions).

Например, поиск значения 5 в индексированном поле Playability может выполняться

следующим образом.

 

DataModule2.Games.Locate('Playability1, VarArrayOf([5]), []);

 

Обратите внимание на то, как множество [5] преобразуется к типу Variant.

 

Пример.

AdoTable1.Locate('Name','Zoom',[]);

{...или...}

var ffield, fvalue: string;

opts: TLocateOptions;

ffield:= 'Name';

fvalue:= 'zoom';

opts:= [loCaseInsensitive];

if not AdoTable1.Locate(ffield, fvalue, opts) then ShowMessage(fvalue + ' not found in ' + ffield);

 

еще вариант:

Метод Locate

 

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

function Locate (const KeyFields: String; const KeyValues: Variant;

Options: TLocateOptions): Boolean;

 

Параметр KeyFields задает поле или список полей, по которым ведется поиск. Если имеется несколько полей, их разделяют точкой с запятой.

 

Параметр KeyValues является вариантным массивом, в котором задаются критерии поиска. При этом первое значение KeyValues ставится в соответствие с первым полем, указанным в KeyFields. Второе - со вторым, и так далее.

 

Третий параметр Options позволяет задать некоторые опции поиска:

loCaseInsensitive - поиск ведется без учета высоты букв, то есть, считаются одинаковыми строки "строка", "Строка" или "СТРОКА".

loPartialKey - запись будет удовлетворять условию, если ее часть содержит искомый текст. То есть, если мы ищем "ст", то удовлетворять условию будут "строка", "станция", "стажер" и т.п.

Пустой набор [] указывает, что настройки поиска игнорируются. То есть, строка ищется "как есть".

 

Примеры использования метода Locate:

Table1.Locate('Фамилия', Edit1.Text, []);

Table1.Locate('Фамилия;Имя',

VarArrayOf(['Иванов', 'Иван']), [loCaseInsensitive]);

 

Как видно из примера, если для поиска вы используете одно поле, то значение может передаваться напрямую из компонента Edit. Если же вы используете список полей, то должны передать в метод массив вариантов, в которых содержатся искомые значения, по одному на каждое поле. При установке компонента ADOTable в раздел uses прописывается модуль ADODB, который содержит описания всех свойств, методов и событий компонента. Желательно использовать метод в том модуле, где установлен этот компонент.

 

Рассмотрим применение этого метода на примере. Откройте проект. Перейдите на модуль DM, где у нас хранятся компоненты доступа к базе данных. Процедуру поиска реализуем в этом модуле, а чтобы с ней можно было работать из других форм, опишем ее в разделе public:

public

{ Public declarations }

procedure MyLocate(s: String);

 

Как видите, в процедуру передается параметр - строка. В ней мы будем передавать искомую фамилию. Если курсор находится на описании нашей процедуры, то нажмите <Ctrl + Shift + C>, чтобы сгенерировать процедуру автоматически. Процедура будет иметь следующий код:

procedure TfDM.MyLocate(s: String);

begin

TLichData.Locate('Фамилия', s, [loPartialKey]);

end;

 

Таким образом, при нахождении подходящей записи курсор будет перемещаться к ней.

 

На главной форме выделите компонент Edit, предназначенный для поиска по фамилии. Создайте для него событие onChange, которое наступает при изменении текста в поле компонента. В созданной процедуре пропишите вызов поиска:

fDM.MyLocate(Edit1.Text);

 

Сохраните пример, скомпилируйте и опробуйте результаты поиска. Метод Locate рекомендуется использовать везде, где это возможно, поскольку он всегда пытается применить наиболее быстрый поиск. Если поле индексировано, и использование индекса ускорит процесс поиска, Locate использует индекс. Если поле не имеет индекса, Locate все равно ищет данные наиболее быстрым способом. Это делает вашу программу независимой от индексов.

 

2) Lookup - Осуществляет поиск записи в наборе данных самым быстрым методом и возвращает значения ее полей

Метод Lookup не перемещает курсор в соответствующую строку, а только возвращает её значение. Lookup возвращает массив переменных, содержащих значения из полей, указанных в разделённом точкой с запятой списке имён, значения которых должны быть возвращены из интересующей нас строки. Если соответствующих нашему запросу строк не найдено, то Lookup вернёт пустую (Null) переменную.

function Lookup (const KeyFields: string,- const KeyValues:

Variant; const ResultFields: string): Variant;

 

В дополнение к поиску возвращает массив значений полей (типа Variant), названия которых указаны в параметре ResultFields.

 

DataModule2.Games.Lookup('Playability1, VarArrayOf([5]), 'Sound');

 

Пример.

Следующий пример заполняет заполняет массив переменных LookupRes

var LookupRes: Variant;

LookupRes:= ADOTable1.Lookup

('Name', 'Zoom', 'Author; Description');

if not VarIsNull(LookupRes) then ShowMessage(VarToStr(LookupRes[0])) //имя автора

 

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

(Возвращается значение типа Variant, если это будет несколько полей то Variant массив(сказал он на консультации))

 

Еще вариант:

 

Метод Lookup

 

Метод Lookup, в отличие от Locate, не меняет положение курсора в таблице. Вместо этого он возвращает значения некоторых ее полей. Причем в отличие от Locate, этот метод осуществляет поиск лишь на точное соответствие. Такой способ поиска востребован реже, однако в иных случаях этим методом очень удобно пользоваться. Рассмотрим синтаксис этого метода.

function Lookup (const KeyFields: String;

const KeyValues: Variant;

const ResultFields: String): Variant;

 

 

Как вы видите, первые два параметра такие же, как у Locate. А вот третий параметр и возвращаемое значение отличаются. В строке ResultFields через точку с запятой перечисляются поля таблицы, значения которых метод должен вернуть. Возвращаются эти значения в виде вариантного массива. Проблема в том, что вернуться может значение Null, то есть, ничего, или Empty (пустой) и это нужно проверять. Рассмотрим работу метода Lookup на примере нашей программы.

 

Прежде всего, вспомним, как работает тип данных Variant. В переменную типа Variant можно поместить любое значение, в том числе и массив. Этот тип данных обычно используют, когда не известно заранее, данные какого типа нам понадобятся на этапе выполнения программы. Когда переменной типа Variant присвоено значение, имеется возможность проверить тип данных этого значения. Для этого служит функция VarType():

function VarType(const V: Variant): TVarType;

 

В качестве параметра в функцию передается переменная вариантного типа. Функция возвращает значение типа TVarType. Это значение указывает, какого типа данные содержаться в переменной. Значение может быть varSmallint (короткое целое), varInteger (целое), varCurrency (денежный формат) и так далее. Чтобы увидеть полный список возвращаемых функцией значений, в редакторе кода установите курсор на название функции и нажмите <Ctrl + F1>, вызвав контекстный справочник. Нас же в данном примере интересуют всего два значения: varNull (записи нет) и varEmpty (запись пустая). Если в программе мы заранее не проведем проверку на эти значения, то вполне можем вызвать ошибку программы. Если же поиск прошел успешно, то будет возвращен массив вариантных значений, элементы которого начинаются с нуля. Каждый элемент массива будет содержать данные одного из указанных полей.

 

Загрузите проект программы. Для поиска воспользуемся кнопкой с надписью "Найти", расположенной в верхней части главной формы. Идея такова: пользователь вводит в поле Edit1 какую то фамилию и нажимает кнопку "Найти". Событие onClick этой кнопки собирает в строковую переменную значения четырех указанных полей найденной записи. Причем после каждого значения в строку добавляется символ "#13" (переход на новую строку), формируя многострочный отчет. Затем эту строку мы выведем на экран функцией ShowMessage().

 

Итак, в окне главной формы дважды щелкните по кнопке "Найти", генерируя событие onClick. Полный листинг процедуры приведен ниже:

{щелкнули по кнопке Найти}

procedure TfMain.BitBtn1Click(Sender: TObject);

var

myLookup: Variant; //для получения результата

s: String; //для отчета

begin

//получаем результат:

myLookup:= fDM.TLichData.Lookup('Фамилия', Edit1.Text,

'Фамилия;Имя;Отчество;Образование');

//проверяем, не Null ли это:

if VarType(myLookup) = varNull then

ShowMessage('Сотрудник с такой фамилией не найден!')

else if VarType(myLookup) = varEmpty then

ShowMessage('Запись не найдена!')

//если это массив, то из его элементов собираем

//многострочную строку:

else if VarIsArray(myLookup) then begin

s:= myLookup[0] + #13 + myLookup[1] + #13 +

myLookup[2] + #13 + myLookup[3];

//и выводим ее на экран:

ShowMessage(s);

end; //else if

end;

 

 

Комментарии достаточно подробны, чтобы вы разобрались с кодом. Сохраните проект, скомпилируйте его и запустите. Опробуйте этот способ поиска.

 

Работа с Данными

Следующие методы позволяют Вам изменить данные, связанные с TTable:

 

procedure Append;

procedure Insert;

procedure Cancel;

procedure Delete;

procedure Edit;

procedure Post;

 

Все эти методы - часть TDataSet, они унаследованы и используются TTable и TQuery.

 

Всякий раз, когда Вы хотите изменить данные, Вы должны сначала перевести DataSet в режим редактирования. Как Вы увидите, большинство визуальных компонент делают это автоматически, и когда Вы используете их, то совершенно не будете об этом заботиться. Однако, если Вы хотите изменить TTable программно, Вам придется использовать вышеупомянутые функции.

 

Имеется a типичная последовательность, которую Вы могли бы использовать при изменении поля текущей записи:

 

Table1.Edit;

Table1.FieldByName(‘CustName’).AsString:= ‘Fred’;

Table1.Post;

 

Первая строка переводит БД в режим редактирования. Следующая строка присваивает значение ‘Fred’ полю ‘CustName’. Наконец, данные записываются на диск, когда Вы вызываете Post.

 

При использовании такого подхода, Вы всегда работаете с записями. Сам факт перемещения к следующей записи автоматически сохраняет ваши данные на диск. Например, следующий код будет иметь тот же самый эффект, что и код показанный выше, плюс этому будет перемещать Вас на следующую запись:

 

Table1.Edit;

Table1.FieldByName(‘CustNo’).AsInteger:= 1234;

Table1.Next;

 

Общее правило, которому нужно следовать - всякий раз, когда Вы сдвигаетесь с текущей записи, введенные Вами данные будут записаны автоматически. Это означает, что вызовы First, Next, Prior и Last всегда выполняют Post, если Вы находились в режиме редактирования.

 

 

http://www.helloworld.ru/texts/comp/lang/delphi/delphi1/les35.htm почитать можно=)

 

 

Основные свойства TDataSet

Active - Открывает (True) и закрывает (False) набор данных

AutoCalcFields - Определяет способ вычислений с использованием полей

Bof - Возвращает True, если курсор находится на первой записи базы данных, и False в противном случае

CachedUpdates - Если установлено значение True, изменения сохраняются в кэше на компьютере клиента до полного завершения транзакции В противном случае все изменения в базе данных производятся при завершении работы с текущей записью

CanModify - Определяет, может ли пользователь редактировать данные

DataSource - Имя компонента DataSource, связанного с набором данных

DatabaseName - Имя базы данных, используемой в настоящий момент

Eof - Возвращает True, если курсор находится на конце файла, и False в противном случае

FieldCount - Количество полей в наборе данных. Поскольку набор данных может быть динамическим (например, результат запроса), количество полей может варьироваться от запроса к запросу

Fields - Массив объектов TFields, которые содержат информацию о полях базы данных

FieldValues - Возвращает значение указанного поля текущей записи. Значение имеет тип Variant

Filter - Выражение, используемое для фильтрации записей

Filtered - Если установлено значение True, фильтрация набора данных осуществляется в зависимости от свойства Filter или события OnFilter-Record В противном случае возвращается весь набор данных

FilterOptions - Управляет работой фильтров

Found - Показывает, была ли успешной операция поиска

Handle - Дескриптор курсора BDE Используется только при прямых обращениях к BDE

Modified - Показывает, была ли текущая запись изменена

RecNo - Номер текущей записи в наборе данных

RecordCount - Возвращает количество записей в наборе данных

State - Возвращает текущее состояние набора данных (dsEdit, dsBrowse, dslnsert и т д)

UpdateOb^ect - Указывает компонент TUpdateOb^ect, используемый для кэшируе-мых изменений

Updates Pending - Значение True указывает, что буфер кэшируемых изменений содержит данные, не сохраненные в базе данных

 

Основные методы TDataSet

 

Append - Создает пустую запись и добавляет ее в конец набора данных

AppendRecord - Добавляет запись в конец набора данных, используя заданные значения полей

ApplyUpdates - Указывает базе данных на необходимость сохранения всех кэшированных изменений Реальное обновление базы данных не происходит до вызова метода CommitUpdates

Cancel - Отменяет все изменения в текущей записи, если они еще не были сохранены

CancelUpdates - Отменяет отложенные изменения, занесенные в кэш

ClearFields - Очищает все поля текущей записи

CommitUpdates - Сохраняет в базе данных все изменения и очищает буфер кэшируемых изменений

Close - Закрывает набор данных

Delete - Удаляет текущую запись

DisableControls - Запрещает ввод из всех компонентов, связанных с набором данных

Edit - Разрешает редактирование текущей записи

EnableControls - Разрешает ввод из всех компонентов, связанных с набором данных

FetchAll - Считывает и локально сохраняет все записи от курсора до конца набора данных

FieldByName - Возвращает указатель TField по заданному имени поля

FindFirst - Осуществляет поиск первой записи, удовлетворяющей текущему критерию фильтрации

PindNext - Осуществляет поиск следующей записи, удовлетворяющей текущему критерию фильтрации

FindLast - Осуществляет поиск последней записи, удовлетворяющей текущему критерию фильтрации

FindNex t - Осуществляет поиск предыдущей записи, удовлетворяющей текущему критерию фильтрации

FindField - function FindField(count FieldName: string): TField; Метод FindField возвращает объект TField (в массиве Fields TDataSet), свойство FieldName которого равно имени поля, заданного в качестве параметра. Если поле не найдено, то возвращается Nil. Заметьте, что метод FieldByName является удобной оболочкой вокруг FindField. Достоинство FieldByName заключается в том, что если указанное поле не найдено, метод возбуждает исключение и предоставляет возможность реализации более живучего кода в случае, когда структура основной таблицы должна измениться (когда поля должны быть переименованы или удалены). Вы можете использовать FindField в ситуациях, когда не хотите возбуждения исключения и знаете, как обработать случай, если поле не найдено (или хотите самостоятельно возбудить другое исключение).

First - Перемещает курсор на первую запись набора данных

FreeBookmark - Удаляет закладку, установленную с помощью GetBookmark, и освобождает память, выделенную для закладки

GetBookmark - Устанавливает закладку на текущей записи

GetFieldNames - Возвращает список имен полей набора данных

GotoBookmark - Устанавливает курсор на запись, отмеченную закладкой

Insert - Вставляет запись и переводит набор данных в режим редактирования

InsertRecord - Вставляет запись в набор данных, используя заданные значения полей

Last - Устанавливает курсор на последнюю запись набора данных

Locate - Осуществляет поиск записи в наборе данных. Locate Этот универсальный метод поиска устанавливает текущую запись как первую строку, удовлетворяющую набору критериев поиска. Используя метод Locate мы можем искать значения одного или более полей, расположенных в массиве переменных.

Lookup - Осуществляет поиск записи в наборе данных самым быстрым методом и возвращает значения ее полей

MoveBy - Перемещает курсор на заданное количество строк

Next - Перемещает курсор на следующую запись

Open - Открывает набор данных

Post - Записывает измененную запись в базу данных или в буфер кэшируемых изменений

Prior - Перемещает курсор на предыдущую запись

Refresh - Обновляет набор данных

RevertRecord - При использовании кэширования этот метод отменяет все ранее сделанные изменения, еще не сохраненные в базе данных

SetFields - Устанавливает значения для всех полей записи

UpdateStatus - При использовании кэширования возвращает текущий статус изменений

Основные события TDataSet

 

AfterCancel - Генерируется после отмены редактирования записи

AfterClose - Генерируется при закрытии набора данных

AfterDelete - Генерируется после удаления записи из набора данных

AfterEdit - Генерируется после редактирования записи

Afterlnsert - Генерируется после вставки записи

AfterOpen - Генерируется после открытия набора данных

AfterPost - Генерируется после отправления изменений в базу данных или кэш

BeforeCancel - Генерируется перед отменой редактирования

BeforeClose - Генерируется перед закрытием набора данных

BeforeDelete - Генерируется перед удалением записи

BeforeEdit - Генерируется перед переходом набора данных в режим редактирования

Beforelnsert - Генерируется перед вставкой записи

BeforeOpen - Генерируется непосредственно перед открытием набора данных (между установкой Active в True и действительным открытием)

BeforePost - Генерируется перед тем, как изменения будут отправлены в базу данных (или кэш изменений)

OnCalcField - Генерируется при выполнении вычислений с использованием полей

OnDeleteError - Генерируется при ошибке удаления записи

OnEditError - Генерируется при ошибке редактирования записи

OnFilterRecord - Генерируется при доступе к новой записи, если для свойства Field установлено значение True

OnNewRecord - Генерируется при добавлении новой записи к набору данных

OnPostError - Генерируется при ошибке сохранения изменений

OnUpdateError - Генерируется при ошибке во время сохранения кэшированных изменений в базе данных

OnUpdateRecord - Генерируется при сохранении кэшированных изменений

 



Поделиться:


Последнее изменение этой страницы: 2017-02-21; просмотров: 322; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.195.82 (0.009 с.)