Предположим, мы хотим выводить на экран не все записи БД, а лишь удовлетворяющие некоторому условию. Такое действие известно как фильтрация данных. Давайте отобразим только те записи, у которых в поле YEARF хранится значение 2003.
Первый способ – фильтрация на стороне клиента. Делается это так:
WITH DVD DO
BEGIN
Filter:='YEARF=2003';
Filtered:=True;
…
Filtered:=False
END;
В свойство Filter в виде текстовой строки записывается логическое выражение для отбора записей. Свойство Filtered логического типа включает/выключает фильтрацию.
А как отследить ситуацию, когда в БД нет записей, удовлетворяющих заданному условию? Очень просто:
WITH DVD DO
BEGIN
Filter:='YEARF=2003';
Filtered:=True;
IF BOF AND EOF THEN
MessageDlg('Ничего не найдено',
mtInformation,[mOK],0);
…
Filtered:=False
END;
Если свойства BOF (начало БД) и EOF (конец БД) одновременно истинны, это значит, что база пуста.
Второй способ – "на ходу" изменить SQL-запрос и заставить сервер прислать новую выборку данных. Делается это так:
VAR oldSQL:STRING;
BEGIN
WITH DVD DO
BEGIN
oldSQL:=SQL[0];
Close;
SQL[0]:='SELECT * FROM DVD WHERE YEARF=2003';
Prepare;
Open;
…
{ снятие фильтра }
Close;
SQL[0]:=oldSQL;
Prepare;
Open
END;
В переменную oldSQL запоминается текущий SQL-запрос, он хранится в свойстве SQL. Поскольку свойство SQL– это массив строк, мы обращается к его первому элементу с индексом 0. Запрос закрывается, меняется текст SQL-выражения, а затем он снова открывается. Для снятия фильтрации нужно восстановить старый запрос, хранящийся в переменной oldSQL.
Очень важно, что SQL-выражение можно динамически создавать как текстовую строку. Например, пусть пользователь вводит год с клавиатуры при помощи поля ввода Edit1:
SQL[0]:='SELECT * FROM DVD WHERE '+ 'YEARF='+Form1.Edit1.Text;
Сортировка данных очень часто применятся в БД. Проще всего она делается на стороне серверасредствами SQLпри помощи конструкции ORDER BY. Давайте отсортируем БД по русским названиям (поле TITLE_RUSSIAN):
VAR oldSQL:STRING;
BEGIN
WITH DVD DO
BEGIN
oldSQL:=SQL[0];
Close;
SQL[0]:='SELECT * FROM DVD ORDER BY TITLE_RUSSIAN';
Prepare;
Open;
…
{ снятие сортировки }
Close;
SQL[0]:=oldSQL;
Prepare;
Open
END;