Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000555.doc
Скачиваний:
31
Добавлен:
30.04.2022
Размер:
19.12 Mб
Скачать

10.2. Форма для реализация sql-запроса

Создав компонент для SQL-запроса, реализуем теперь поиск с помощью SQL-запроса.

Для этого в нашем приложении создадим новую форму, в которой будет отображаться результат поиска.

Назовем новую форму FindResultForm и изменим у нее следующие свойства:

  • Caption — изменим на Результат поиска;

  • Position - - установим в poMainFormCenter, чтобы наше окно отображалось по центру главного окна.

Чтобы окно видело таблицы, к нему надо подключить модуль данных —DataModuleUnit вручную или используя уже знакомое меню File | Use Unit.

Далее установим на форму ceтку DBGrid, с вкладки Data Controls палитры инструментов, и растянем ее по всей форме.

Перейдем в объектный инспектор и изменим свойство DataSource на DataModulel.FindSource, чтобы увидеть в сетке результат запроса.

Теперь сохраним форму под ранее названным именем FindResultUnit.

Не всегда заранее известно, по каким полям нужно будет производить поиск.

Улучшим нашу главную форму так, чтобы можно было производить поиск по двум произвольным полям.

Для этого в левом верхнем углу главной формы установим рядом два компонента Label (Надписи) с текстами Имя 1-го поля и Имя 2-го поля.

Так как имена всех полей обеих таблиц заранее известны, то выбор имен полей будем делать с помощью компонента ComboBox.

Кроме этого, вторая таблица имеет поле Оценка, значения которого также заранее известны. Таким образом, В случае выбора имени этого поля, для задания его значения также можно использовать компонент ComboBox.

Таким образом, ниже компонентов Label (Надписи) установим рядом два компонента ComboBox.

Еще ниже установим рядом два компонента Label (Надписи) с текстами Значение 1-го поля и Значение 2-го поля и под ними рядом слева установим еще один компонент Edit и и рядом с ним справа один компонент ComboBox, который можно использовать по прямому назначению, если вторым полем выбрано имя Оценка, в других случаях он используется как обычный компонент Edit.

И, наконец, под ними установим компонент SpeedButton (кнопка с рисунком), назвав ее Найти список.

Поиск можно производить и по одному полю (первому), задав имя и значение только этого поля.

Общий вид окна Главной формы показан на рис 10.2.

Из этого рисунка видно, что прежде чем нажать кнопку Найти список, нужно выбрать из предложенных списков имена первого и второго полей, задать значение первого поля (номер учебной группы) и выбрать из предложенного списка значение второго поля (оценки).

Рис. 10.2

Рассмотренный вариант поиска подразумевает выбор некоторого списка и поэтому для создания обработчика событий onClick кнопки Найти список метод Locate не подходит.

Для события onClick кнопки Найти список создадим следующий код в виде SQL-запроса:

DataModule1.FindQuery.Active:=False;

DataModule1.FindQuery.SQL.Clear;

DataModule1.FindQuery.SQL.Add('select*');

DataModule1.FindQuery.SQL.Add('FROM Итоги');

DataModule1.FindQuery.SQL.Add('WHERE '+ ComboBox1.Text + ' LIKE '+''''+Edit4.Text+'''');

if ComboBox2.Text <> '' then

DataModule1.FindQuery.SQL.Add(' AND '+ ComboBox2.Text + ' LIKE '+''''+ ComboBox3.Text+'''');

DataModule1.FindQuery.SQL.Add('ORDER by 2’);

DataModule1.FindQuery.Active:=true;

FindResultForm.ShowModal;

В первой строке кода мы делаем компонент запроса неактивным.

После надо заполнить свойство sql компонента FindQuery запросом на поиск данных. Это свойств имеет тип TStrings.

Но прежде чем заполнять новыми значениями свойство sql, нужно очистить его от старого запроса, который мог остаться после последнего вызова. Для очистки свойства sql вызываем метод Clear.

Далее идет заполнение свойства sql текстом запроса. Нам нужно внести следующий запрос:

SELECT *

FROM Список

WHERE '+ ComboBox1.Text + ' LIKE '+''''+Edit4.Text+'''');

(и если компонент ComboBox2 (Имя 2-го поля)заполнен, т.е.)

if ComboBox2.Text <> '' then

DataModule1.FindQuery.SQL.Add(' AND '+ ComboBox2.Text + ' LIKE '+''''+ ComboBox3.Text+'''');

DataModule1.FindQuery.SQL.Add('ORDER by 2’);

DataModule1.FindQuery.Active:=true;

FindResultForm.ShowModal;

Здесь написано примерно следующее — выбрать все поля из таблицы Список, где поле ComboBox1.Text равно значению, указанному в компоненте Edit4.Text.

Параметр-значение, с которым происходит сравнение (текст из Edit4) должен быть заключен в одинарные кавычки. Но так как одинарные кавычки используются в Delphi для ограничения строк, то чтобы внутри строки поставить одинарную кавычку, ее нужно поставить дважды. Более подробно смотри подраздел 8.5.1.

Далее с помощью оператора if идет проверка заполнения поля ComboBox1.Text, и если да, то выполняется следующий оператор, в противном случае он пропускается.

Строка

DataModule1.FindQuery.SQL.Add('ORDER by 2’);

позволяет сортировать данные запроса по второй колонке запрашиваемых данных.

Следующая строка запроса делает компонент FindQuery активным, чтобы запрос мог выполняться.

И, наконец, чтобы отобразить результат, в последней строке запроса вызываем окно FindResultForm которое будет главным при печати результатов с помощью QuickReport.

Для выполнения запроса чаще всего достаточно сделать компонент FindQuery активным. Это прекрасно работает, если вы запрашиваете данные из таблицы базы данных. Но если в запросе удаляются строки или изменяется структура таблицы (в запросе есть такие операторы, как Insert, UpDate, Delete или CreateTable), необходимо вызывать метод ExecSQL компонента FindQuery.

Определить, когда для выполнения запроса достаточно сделать компонент FindQuery активным, а когда запрос нужно выполнять с помощью метода ExecSQL просто — если запрос возвращает данные, то достаточно активировать компонент, а если запрос изменяет данные, то запрос нужно выполнять с помощью метода ExecSQL.