Во многих случаях БД можно и не выводить на экран, но нужно искать в ней информацию, изменять данные, добавлять и удалять записи и т.д. Как это сделать?
Если БД вообще не выводится на экран, компонент DataSource не нужен. Достаточно компонента Query. Научимся выбирать требуемую запись в БД и обращаться к отдельным полям.
Возможны два способа выполнения поиска, сортировки и пр. операций: на стороне клиента и на стороне сервера. В первом случае всю работу выполняет компьютер клиента, а сервер "знать не знает" про ваши поиски. Во втором случае на сервер просто направляется SQL-запрос на поиск (скажем, команда SELECT с условием WHERE) и собственно поиск осуществляется сервером.
Поиск записи по условию на стороне клиента выполняет метод Locate объекта Query. Вот его общий вид:
LOCATE(список_полей, массив_значений, [режимы])
В списке полей их имена разделяются символом ";". Пусть мы хотим найти первую запись в БД dvd.db, у которой в поле YEARF хранится значение 2003. Поместите на форму кнопку и в ее обработчике события OnClick напишите следующий код:
BEGIN
dm.DVD.Locate('YEARF','2003',[])
END;
Разумеется, искомое значение можно вводить как переменную. Например, можно запросить год с клавиатуры. Параметр "режим" представляет собой множество, в которое могут быть включены следующие константы:
loCaseInsensitive – поиск текста без учета регистра;
loPartialKey – поиск по части выражения. Если начало текста в поле БД совпадает с выражением, считается, что запись найдена.
Если режим поиска менять не нужно, все равно следует написать пустое множество – [].
Если надо выполнять поиск по нескольким полям, придется использовать один трюк. Давайте найдем все фильмы с субтитрами, выпущенные в 2002г. Команда поиска будет иметь вид:
dm.DVD.Locate('YEARF;SUBTITLES',VarArrayOf(['2003',TRUE]),[])
Функция VarArrayOf объединяет свои аргументы различного типа в псевдо-массив.
Метод Locateвозвращает значение True или False в зависимости от того, найдена запись или нет:
IF NOT(dm.DVD.Locate('YEARF;SUBTITLES',
VarArrayOf(['2003',TRUE]),[])) THEN
MessageDlg('Не найдено',mtInformation,[mbOK],0);
Итак, нужная строчка найдена. Чтобы получить значение конкретного поля в текущей строке БД, можно воспользоваться методом FieldByName:
VAR s:STRING;
BEGIN
dm.DVD.Locate('YEARF','2003',[]);
s:=dm.DVD.FieldByName('TITLE_RUSSIAN').AsString
END;
В приведенном примере в переменную s записывается значение поля TITLE_RUSSIAN. Обратите внимание на конструкцию AsString. При использовании метода FieldByName необходимо явно указывать тип значения, извлекаемого из поля. Основные варианты таковы:
AsFloat – вещественное число;
AsInteger – целое число;
AsBoolean – логическое значение;
AsString – текстовая строка.
Занесение значения в поле выполняется несколько сложнее. Во-первых, у компонента Query свойство RequestLive должно быть установлено в True. Во-вторых, перед изменением поля нужно вызывать метод Edit, а после изменения – метод Post:
WITH dm.DVD DO
BEGIN
Edit;
FieldByName('TITLE_RUSSIAN').AsString:='Терминатор 2';
Post
END;
Между Edit и Post можно менять содержимое нескольких полей сразу.
Еще несколько полезных методов:
Append – добавляет новую записи в конец БД, делает ее текущей и переводит БД в режим редактирования.
Delete – удаляет текущую запись из базы.
EmptyTable – страшный метод. Удаляет все строки из БД.
Предположим, нам нужно подсчитать количество фильмов в БД, выпущенных в 2001г. Организуем цикл по всем записям:
USES …., DB;
…
VAR cnt:WORD; b:TBookMark;
BEGIN
CNT:=0;
WITH dm.DVD DO
BEGIN
DisableControls;
b:=GetBookMark;
First;
WHILE NOT(EOF) DO
BEGIN
IF FieldByName('YEARF').AsString='2001' THEN
INC(cnt);
Next
END;
GotoBookMark(b);
EnableControls
END;
В USES надо вручную добавить модуль DB. Метод DisableControls временно отключает БД от ее отображения на экране. Если этого не сделать, то при выполнении цикла курсор в DBGrid начнет "бегать", что не только странно выглядит, но и заметно тормозит работу. Самое главное – не забыть в конце включить отображение БД методом EnableControls.
Перед началом цикла в переменную b при помощи метода GetBookMark запоминается текущая запись. После окончания цикла метод GotoBookMark снова делает текущей. Запись хранится в переменной типа BookMark.
Методы для перемещения по записям БД следующие:
First – на первую запись;
Last – на последнюю запись;
Next – на следующую запись;
Prior – на предыдущую запись.
Свойство EOF возвращает логическое значение в зависимости от того, достигнута последняя запись в БД или нет.