Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы по Delphi

.pdf
Скачиваний:
62
Добавлен:
05.06.2015
Размер:
768.49 Кб
Скачать

<параметр>, где параметр – имя параметра, вместо которого при выполнении приложения будет подставляться значение.

У класса TQuery отметим следующие наиболее важные свойства, которые он добавляет к наследуемым от классов TDataSet, TBDEDataSet и TDBDataSet:

Local – определяет расположение таблиц (True – локальные таблицы, False – таблицы на SQL-сервере); свойство только для чтения.

RequestLive – свойство логического типа (по умолчанию имеет значение False), определяет возможность изменять набор данных, полученный в результате выполнения запроса. Эта возможность имеется, если свойство имеет значение True, и у запросов, которые основаны на одной таблице и не используют сортировку и агрегатные функции. У остальных запросов результат доступен только для чтения независимо от значения данного свойства. В этих случаях можно посмотреть свойство CanModify для того чтобы увидеть, успешен ли запрос, если же нужно откорректировать таблицу с помощью запроса SQL, то следует использовать команду SQL Update.

SQL – свойство типа TStrings, определяет текст SQL-запроса, который используется при выполнении методов Open или ExecSQL.

UniDirectional – определяет направление перемещения курсора по набору данных, полученному в результате выполнения запроса.

UpdateMode – свойство типа TUpdateMode, определяет способ обновления записей из промежуточного буфера.

Следующие свойства компоненты TQuery используются в динамических SQL-запросах. Приведем некоторые из них:

DataSource – свойство типа TDataSource, определяет источник данных, значения полей которого используются как параметры для динамического запроса.

Params[Index] – свойство типа TParams, задает список элементов типа TParams, которые определяют параметры в динамическом запросе. С помощью этого свойства в редакторе значений параметров задаются начальные величины параметров. Чтобы перейти к редактору значений параметров запроса, нужно активизировать мышью значение этого свойства.

Класс TQuery добавляет к наследуемым от классов TDataSet, TBDEDataSet и TDBDataSet следующие методы (некоторые из них):

ExecSQL – процедура выполняет SQL-запрос.

Prepare – процедура посылает запрос в BDE для проверки синтаксиса и оптимизации. Рекомендуется выполнять для динамических запросов.

События, которые обрабатываются компонентой TQuery, полностью наследуются от класса TDataSet.

При подстановке переменных связи в динамический запрос программным методом с помощью свойства Params выполняются обычно следующие шаги:

1) необходимо убедиться в том, что таблица закрыта;

2)подготавливается объект TQuery с помощью выдачи команды Prepare;

3)Свойству Params присваиваются конкректные значения;

4) Открывается запрос.

Пример № 1. Создание запроса для вывода записей, имеющих фамилию, начинающуюся с одной и той же буквы, из БД «Телефонная книжка»

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

1. Загрузим заготовку проекта, созданную в лабораторной работе № 2. Зададим свойству Caption формы значение «Информация о людях (запрос)». Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры «5» в конце имени: MyExUnitDB5.pas, MyExampleDB5.dpr.

2.Со страницы DataAccess поместим на форму Form1 компоненту Query (Запрос).

Выберем компоненту Query1, активизируем свойство SQL и в появившемся текстовом редакторе введем следующие строки, которые задают запрос на языке SQL:

SELECT D.*, D1.*

FROM “<путь к файлу>\People.db” D, “<путь к файлу>\Tel.db” D1 WHERE

(D.IDPeople = D1.IDPeople) AND (D.Family Like :FirstChar).

Оператор Like позволяет отобрать записи, которые определяются параметром FirstChar в поле Family. Затем активизируем свойство Params и в появившемся окне редактора параметров запроса Form1.Query1 Parameters выполним следующее. Выберем из списка Parameter Name (Название параметра) FirstChar, в строке ввода со списком DataType (тип данных) выберем String и в строке Value (Значение) введем А% - начальное значение. Завершим настройку нажатием кнопки ОК.

3.Установим у свойств Active и RequestLive компоненты Query1 значение True, используя инспектор объектов.

4.Со страницы DataAccess палитры компонент поместим на форму Form1 еще одну компоненту DataSource. Активизируем ее и установим свойство

DataSet в Query1.

5.Перейдем к форме Form1. Справа от компоненты DBGrid1 поместим со страницы Standart палитры компонент две компоненты Label. Свойству Caption компоненты Label6 зададим значение Постраничный, а свойству Caption компоненты Label7 – Просмотр.

6.Ниже, под компонентами Label6 и Label7, поместим со страницы Standart кнопку Button. Изменим ее свойство Caption на Просмотр. При нажатии на эту кнопку будет происходить переход на новую форму, на которой будет реализован постраничный просмотр БД «Телефонная книжка». Активизируем ее и в появившемся обработчике события OnClick введем следующее:

procedure TForm1.Button1Click(Sender: TObject);

begin

Form2.Visible := True; end;

Свойство Visible обеспечивает отображение формы на экране после своего создания.

7.Добавим в форму Form1 со страницы Additional палитры компонент компоненту Bevel. Поместим ее позади компонент Label6, Label7 и Button1. Теперь эта группа компонент будет выделяться на форме. Изменим ее свойство Style на bsRaised (она будет выпуклой).

8.Создадим теперь вышеуказанную форму. Для этого выполним следующие действия:

8.1.Добавим в проект форму командой главного меню File|New Form.

8.2.Изменим свойство Caption формы Form2 на «Постраничный просмотр» и сохраним форму под именем MyExUnitQuery.pas.

8.3.В тексте модуля Form2 в секции implementation напишем следующую строчку для связи данной формы с Form1:

USES MyExUnitDB5;

Перейдем снова к форме Form1. В тексте ее модуля установим связь с Form2, для чего в секции implementation допишем:

USES MyExUnitQuery;

8.4.В верхний левый угол формы поместим компоненту ComboBox со страницы Standart палитры компонент. Изменим ее свойство Text на A. Затем активизируем свойство Items и в появившемся окне редактора введем на каждой строке последовательно по одной букве от «А» до «Я», за исключением, быть может, букв «Ь» и «Ъ». Завершим ввод нажатием кнопки ОК.

8.5.Со страницы Standart палитры компонент с помощью мыши поместим рядом с компонентой ComboBox1 компоненту Button. Изменим ее свойство Caption на «Страница». Затем активизируем кнопку и в появившемся обработчике события OnClick введем оператор, задающий отображение в форме результатов выполнения запроса в компоненте Query1. Обработчик будет иметь следующий вид:

procedure TForm2.Button1ClickSender: TObject);

begin

WITH Form1.Query1 DO

BEGIN

Close;

Prepare;

Params[0].AsString := ComboBox1.Text + ‘%’; Open;

END; end;

9. Поместим на форму Form2 еще одну компоненту Button, справа от компоненты Button1. Изменим ее свойство Caption на Назад. При помощи

этой кнопки мы сможем вернуться к форме Form1 во время работы приложения. Активизируем кнопку Button2 и в открывшемся обработчике события OnClick введем следующее:

procedure TForm2.Button2Click(Sender: TObject); begin

Close; end;

10. Ниже помещенных нами компонент разместим на всю оставшуюся часть формы компоненту DBGrid со страницы DataControls палитры компонент. Зададим свойству DataSourse значение Form1.DataSource3. При помощи редактора списка полей Editing DBGrid1.Columns определим поля, которые будут отображаться в таблице (эти действия были описаны в лаб./раб. №2): Family, Name, SecName, Number, Type, задавая при этом через сложное свойство Titel заголовки столбцов в DBGrid1: Фамилия, Имя, Отчество, Номер, Тип соответственно.

11. Поместим в низ формы Form1, приблизительно в центр, еще одну кнопку Button, которая в тексте модуля будет иметь имя Button2. Изменим ее свойство Caption на Выход (выход из приложения). Активизируем ее и в обработчике события напишем:

procedure TForm1.Button2Click(Sender: TObject); begin

Close;

end;

12. Запустим программу командой Run|Run. В результате появится окно, в котором при нажатии на кнопку Просмотр появится еще одно окно, где, выбирая в выпадающем списке разные буквы и нажимая кнопку Страница, можем видеть, как меняется набор отображаемых записей в таблице DBGrid в соответствии с первой буквой значения фамилии.

13. Завершим работу нажатием кнопки Выход в основном окне. 14.Сохраним все изменения в проекте.

При программном использовании TQuery следует сначала закрыть текущий запрос и удалить все строки, которые уже могут находиться в свойстве SQL:

Query1.Close; Query1.SQL.Clear;

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

Query1.SQL.Add(‘Select * From People.db’);

Можно использовать свойство Add для добавления в запрос SQL от одной до x строк.

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

Query1.Open;

Если возвращать курсор не обязательно, то можно сделать вызов ExecSQL. Вызывать ExecSQL также требуется, если происходит вставка, исключение и корректировка данных, т.е. вместо строки Query1.Open нужно будет записать:

Query1.ExecSQL;

Query1.Refresh;

Отметим также, что операторы Select возвращают курсор и поэтому требуют вызова Open. Delete, Insert и Update не возвращают курсор и поэтому сопровождаются вызовом ExecSQL.

Если требуется составить серию операторов, то ускорить работу можно за счет использования динамических запросов.

Пример № 2. Создание запроса для ограничения числа отображаемых записей из БД «Телефонная книжка» (программный путь)

В телефонной книжке, как правило, располагается много записей и просмотр всех их последовательно затруднителен. Рассмотрим простейшее разбиение таких записей на следующие две части: в первую войдут те, которые содержат фамилии, начинающиеся на буквы от «А» до «М», а во вторую – от «Н» до «Я», причем записи будут выводиться в алфавитном порядке. Будем использовать TQuery программно.

1. Загрузим заготовку проекта, созданную в предыдущем примере. Зададим свойству Caption формы Form1 значение «Информация о людях (запрос 2)». Сразу же сохраним все составные части проекта в файлах с теми же именами, что и прежние, но с добавлением цифры 6 в конце имени: MyExUnitDB6.pas, MyExUnitQuery6.pas и MyExampleDB6.dpr. В тексте модуля формы Form1

заменим раздел объявления используемых модулей в секции implementation USES MyExUnitQuery;

на раздел

USES MyExUnitQuery6;

Ав тексте модуля формы Form2 заменим раздел объявления используемых модулей в секции implementation

USES MyExUnitDB5;

на раздел

USES MyExUnitDB6;

Аее свойство Caption изменим на «Ограниченный просмотр».

Изменим немного вид формы Form1: свойство Caption у компоненты Label6 с Постраничный на Ограниченный.

2. Перейдем к форме Form2. Удалим из нее две компоненты – ComboBox1 и Button1 (кнопка Страница).

На место удаленных компонент поместим со страницы Standart две компоненты Button, а у компоненты DBGrid1 свойство DataSource сделаем пустым, чтобы первоначально в ней не было никаких записей.

3. Выберем кнопку Button1 и изменим ее свойство Caption на «А – М». Активизируем ее и в появившемся обработчике события OnClick введем следующие строки:

procedure TForm2.Button1Click(Sender: TObject); begin

WITH Form1.Query1 DO

BEGIN

Close;

SQL.Clear; SQL.Add('SELECT D.*, D1.*');

SQL.Add('FROM "People.db" D, "Tel.db" D1'); SQL.Add('WHERE');

SQL.Add('(D1.IDPeople = D.IDPeople)AND(D.Family < "Н")'); SQL.Add('ORDER BY D.Family ASC');

Open;

END;

Form1.DataSource3.DataSet := Form1.Query1;

DBGrid1.DataSource := Form1.DataSource3; end;

4. Выберем кнопку Button3 и изменим ее свойство Caption на «Н – Я». Активизируем ее и в появившемся обработчике события OnClick внесем следующее:

procedure TForm2.Button3Click(Sender: TObject); begin

WITH Form1.Query1 DO

BEGIN

Close;

SQL.Clear; SQL.Add('SELECT D.*, D1.*');

SQL.Add('FROM "People.db" D, "Tel.db" D1'); SQL.Add('WHERE');

SQL.Add('(D1.IDPeople = D.IDPeople)AND(D.Family >= "Н")'); SQL.Add('ORDER BY D.Family ASC');

Open;

END;

Form1.DataSource3.DataSet := Form1.Query1;

DBGrid1.DataSource := Form1.DataSource3; end;

5.Запустим программу командой Run|Run.

6.Перейдем ко второй форме, нажав кнопку Просмотр. Нажимая кнопки «А

– М» и «Н – Я», можем видеть, как меняется набор отображаемых записей.

7.Завершим работу приложения.

8.Сохраним все изменения в проекте.

Задание к лабораторной работе № 4.

Используя приложение, созданное в лабораторной работе № 2, спроектируйте и создайте запрос следующего вида:

Вариант 1.

Запрос для вывода списка деталей, хранящихся в Москве, с указанием уникального номера детали, ее веса, цвета, фамилии поставщика.

Вариант 2.

Запрос, для вывода списка участников конкурса, приехавших из Ульяновска, содержащий фамилию, имя, отчество участника, фамилию тренера.

Вариант 3.

Запрос для вывода списка студентов, у которых оценка выше или равна 0,5, с указанием ФИО студента, номера группы, названия дисциплины, варианта задания и коэффициента его сложности.

Вариант 4.

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

Вариант 5.

Запрос для вывода списка изделий за каждый день недели с указанием типа изделия и его стоимости.

Вариант 6.

Запрос для вывода списка рабочих в каждом цехе с указанием количества изделий по категориям, выполненных каждым рабочим.

Вариант 7.

Создайте отчет, содержащий номера телефонов абонентов, у которых есть льготы, с указанием ФИО и адреса владельца, года установки. Отчет создайте на основе компоненты TQuery.

Вариант 8.

Запрос для вывода списка игрушек, предназначенных для одной и той же возрастной категории, с указанием названия игрушки, ее цены и количества.

Вариант 9.

Запрос для вывода списка студентов, у которых есть своя семья.

Вариант 10.

Запрос для вывода списка Российских спортсменов, с указанием фамилии, имени, отчества спортсмена, пола, года рождения.

Вариант 11.

Создайте отчет, содержащий номера всех рейсов, у которых есть хотя бы одно свободное место, с указанием пункта назначения, времени вылета и времени прибытия. Отчет создайте на основе компоненты TQuery.

Вариант 12.

Запрос для вывода списка наименований обуви, имеющей один и тот же размер, с указанием артикула, стоимости, названия фабрики-изготовителя и количества пар.

Вариант 13.

Запрос для вывода списка нападающих, у которых количество сыгранных матчей больше трех, а число заброшенных шайб больше 15, с указанием ФИО нападающего и названия команды.

Вариант 14.

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

Вариант 15.

Создайте отчет, содержащий названия и адреса коммерческих организацийполучателей. Отчет создайте на основе компоненты TQuery.

Вариант 16.

Запрос для вывода списка фирм, когда-либо покупавших товары.

Вариант 17.

Запрос для вывода списка наименований лекарств, произведенных на какойлибо фабрике.

Вариант 18.

Запрос для ограничения числа отображаемых записей по фамилиям ветеранов спорта с указанием пола спортсмена, его возрастной группы, города, в котором он проживает, и вида спорта.

Вариант 19.

Запрос для вывода списка рожениц, лечащихся у одного и того же врача, с указанием ФИО матери, номера палаты, в которой она лежит, и даты рождения ребенка.

Вариант 20.

Запрос для вывода списка слушателей, которые не сдали хотя бы одну дисциплину, с указанием ФИО слушателя и названия организации.

Вариант 21.

Создайте отчет, содержащий список студентов, получающих стипендию, с указанием группы и размера стипендии Отчет создайте на основе компоненты TQuery.

Вариант 22.

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

Вариант 23.

Запрос для вывода списка призывников, не пригодных к службе, с указанием ФИО призывника и года его рождения.

Вариант 24.

Запрос для вывода списка изделий, выполненных одним и тем же мастеромювелиром, с указанием вида изделия, его веса, пробы и стоимости.

Лабораторная работа № 5 Проектирование меню