страница 1 ... страница 2 | страница 3 страница 4 страница 5 | страница 6
<значение>} – список полей и значений, которые задаются этим полям.
[WHERE <условие отбора>] – оператор, задающий условие отбора тех
записей, в которых следует обновить данные.
4.Запрос на удаление.
Этот запрос позволяет удалить из таблицы записи, удовлетворяющие
заданным условиям. Конструкция запроса следующая:
DELETE FROM «<файл с таблицей>»
[WHERE <условие отбора>].
Запрос к БД (Query)
Использование одной компоненты Table позволяет работать только с
одной таблицей. Поэтому, когда необходимо работать с несколькими
связанными таблицами, нужно создавать соответствующее число компонент
Table. В этом случае целесообразно взять компоненту Query класса TQuery,
являющегося потомком класса TDBDataSet. Эта компонента позволяет
определить набор данных на основе нескольких таблиц с помощью SQL-
запроса. Ее также удобно применять, когда таблица БД чрезмерно велика; в
этом случае с помощью запроса можно ограничить набор рассматриваемых
данных. Использование этой компоненты связано со знанием языка SQL.
Отметим сразу, что можно создать оператор Delphi SQL при помощи
компоненты Query следующим образом:
1) поместить на форму объекты Query, DataSource и связать их вместе;
2) присвоить псевдоним объекта TQuery свойству DataBaseName;
3) с помощью свойства SQL ввести указание SQL;
3) установить свойство Active в значение True.
Если каждый шаг был завершен правильно и если BDE установлено
корректно, сетка должна будет содержать записи из указанной таблицы.
Delphi позволяет создавать SQL-запросы к БД как статические, в
которых текст запроса остается неизменным, так и динамические (или
запросы с параметрами). Динамические SQL-запросы содержат параметры,
определенные в условиях отбора записей, которые в процессе выполнения
программы могут изменяться. Таким образом, с помощью одного
динамического запроса можно получать различные результаты при
выполнении приложения. Синтаксическая конструкция динамических
запросов аналогична статическим, за исключением того, что у них в секции,
определяющей условия отбора записи, вместо значения записывается
<параметр>, где параметр – имя параметра, вместо которого при выполнении
приложения будет подставляться значение.
У класса 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 изменим на «Ограниченный просмотр».
Изменим немного вид u1092 формы 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
Проектирование меню
Практически все достаточно сложные программы в настоящее время
обладают системой меню, предназначенной для выбора того или иного пути
выполнения программы. Интерфейс, основанный на использовании меню,
становится очень удобным и позволяет быстро достигнуть необходимого
результата.
В Delphi имеется стандартная компонента, входящая в семейство класса
TMenu. Она содержит структуру меню в виде объекта класса TMenuItem.
Каждый из элементов меню, в свою очередь, также является объектом класса
TMenuItem. Все элементы меню в явном виде размещаются в форме и
непосредственно доступны через свои идентификаторы. Сделано это для
того, чтобы упростить доступ к их обработчикам события OnClick и
опубликованным свойствам.
Элемент меню класса TMenuItem
Элемент меню может представлять собой либо подменю, либо команду,
либо разделительную линию. К какой категории относится конкретный
элемент, зависит от его характеристик. Несмотря на это, любой элемент
меню принадлежит к одному и тому же классу – TmenuItem, и каждый может
рассматриваться как самостоятельное меню.
Для того чтобы элемент меню представлял собой подменю, необходимо,
чтобы свойство Items содержало _________соответствующие компоненты этого подменю. Если это свойство пустое (не содержит ни одного элемента), элемент меню является либо командой, либо разделительной линией.
Для того, чтобы элемент меню представлял собой разделительную линию, следует его свойству Caption задать значение «-». Элементы меню могут объединяться в группы. Информация о принадлежности элементов к группам может использоваться при слиянии меню нескольких форм и при использовании взаимосвязанных элементов меню. При этом группы элементов меню должны идти в определенном порядке – по возрастанию их номеров.
Характеристики элемента меню задают его внешний вид и место в структуре меню. Среди его свойств отметим следующие:
Break – свойство, определяющее наличие разбиения меню на столбцы на
текущем элементе.
Caption – свойство типа string, содержащее текст элемента меню. Здесь
можно задать клавишу быстрого перехода с помощью символа &,
помещаемого перед соответствующим символом текста.
Checked – свойство логического типа, определяющее, является ли
элемент меню отмеченным (если имеет значение True, элемент помечается
«галочкой»).
Default – свойство логического типа; если оно имеет значение True, текст элемента меню выделяется полужирным шрифтом, а двойное нажатие мышью старшего элемента приводит к появлению у текущего элемента события OnClick. По умолчанию имеет значение False.
Enabled – свойство логического типа; если оно имеет значение True, элемент меню реагирует на события от мыши и клавиатуры (элемент меню разрешен).
GroupIndex – свойство целого типа, содержащее номер группы, к которой принадлежит элемент меню. По умолчанию имеет нулевое значение.
Items[Index] – свойство-массив типа TMenuItem (индекс Index – целого типа), задающее младшие элементы меню по отношению к текущему элементу. Число элементов определяется свойством Count. Нумерация начинается с нуля и используется только для чтения.
MenuIndex – свойство целого типа, содержащее индекс текущей компоненты в списке Items старшей компоненты.
RadioItem – свойство логического типа; если оно имеет значение True, элемент меню выполняет роль переключателя, т.е. помеченным может быть только один элемент одной группы.
ShortCut – свойство целого типа, определяющее код клавиш быстрого управления, при нажатии которых активизируется элемент
меню. Для работы с кодами клавиш быстрого управления используются подпрограммы ShortCut, ShortCutToKey, ShortCutToText, TextToShortCut.
Visible – свойство логического типа; если оно имеет значение True,
элемент меню отображается на экране, если False – нет.
В классе TMenuItem определено одно событие – OnClick. Класс имеет ряд методов, в основном связанных с корректировкой структур. Add(Item) – процедура, добавляющая элемент Item (класса TMenuItem) в список младших элементов.
Delete(Index) – процедура, удаляющая из списка младших элементов элемент с индексом Index. При этом элемент из динамической памяти не
удаляется и может быть повторно использован.
На стадии проектирования тому или иному элементу меню можно задать
клавишу (клавиши) быстрого управления, используя свойство ShortCut, выбрав из выпадающего списка подходящее сочетание либо набрав их
непосредственно с помощью клавиатуры.
Можно эту операцию осуществить и на стадии выполнения программы,
но, сделать это несколько труднее. Для этой цели можно воспользоваться
специальными стандартными подпрограммами, позволяющими выполнять различные преобразования (ShortCut, ShortCutToKey, ShortCutToText, TextToShortCut).
страница 1 ... страница 2 | страница 3 страница 4 страница 5 | страница 6
|