Практическая работа №21
Тема: «Базы данных в Delphi»
База данных «Школа»
1. С помощью утилиты DataBase Desktop создайте таблицу для хранения информации об учениках школы. Пусть файл School.db содержит поля:
N – личный номер ученика (числовое поле с автоувеличением)
Name – имя (строковый тип)
Fam – фамилия (строковый тип)
Class – класс (строковый тип)
Adr – адрес (строковый тип)
2. Псевдоним Школа (или какой- либо свой псевдоним) создайте при помощи BDE Administrator.
3. Создайте форму приложения в Delphi. На форму поместите компоненты Table1 (вкладка BDE) и DataSource1(вкладка Data Access), которые обеспечивают доступ к файлу данных, и установите следующие значения их свойств:
Свойство | Значение |
Table1.DatadaseName | Школа |
Table1.TableName | School.db |
Table1.Active | True |
DataSource1.Dataset | Table1 |
4. Для просмотра и редактирования данных в режиме таблицы в форму надо добавить компонент DBGrid1 (вкладка Data Controls).
5. Чтобы задать, какая информация будет отображаться в таблице DBGrid1, необходимо задать источник данных для таблицы (значение свойства DataSource = DataSource1). Свойство
Options.dgTitles разрешает вывод строки заголовка столбцов, Options.dgIndicator разрешает вывод колонки индикатора во время работы с базой данных (треугольник – текущая запись, звездочка – новая запись).
6. Значения уточняющих параметров свойства Columns задаются в окне Editing DBGrid1.Columns. Добавьте в компонент DBGrid1 4 колонки с помощью команды Добавить новый(Ins).Свойство Columns представляет собой массив компонентов типа TColumn. Каждой колонке соответствует элемент массива.
Таблица Свойства компонента column
Свойство | Определяет |
FieldName | Поле записи, содержимое которого выводится в колонке |
Width | Ширину колонки в пикселах |
Font | Шрифт, используемый для вывода текста в ячейках колонки |
Color | Цвет фона колонки |
Alignment | Способ выравнивания текста в ячейках колонки. Текст может быть выровнен по левому краю (taLeftJustify), по центру (taCenter) или по правому краю (taRightJustify) |
Title.Caption | Заголовок колонки. Значением по умолчанию является имя поля записи |
Title.Alignment | Способ выравнивания заголовка колонки. Заголовок может быть выровнен по левому краю (taLeftJustify), по центру (taCenter) ИЛИ ПО правому краю (taRightJustify) |
Title.Color | Цвет фона заголовка колонки |
Title.Font | Шрифт заголовка колонки |
В простейшем случае для каждой колонки достаточно установить значение свойства FieldName, которое определяет имя поля записи, содержимое которого будет отображаться в колонке, а также значение свойства Title.caption, определяющего заголовок колонки.
7. Добавить к форме компонент DBNavigator, настроив его на работу с таблицей-источником данных (свойству DataSource нужно присвоить значениеDataSource 1).
8. Откомпилируйте и запустите программу. Следует обратить внимание, что для того чтобы после запуска программы в окне появилась информация или, если база данных пустая, можно было вводить новую информацию, свойство Active таблицы-источника данных должно иметь значение True.
Используя клавиши перемещения курсора вверх и вниз, а также клавиши листания текста страницами (<Page Up> и <Page Down>), можно, перемещаясь от строки к строке, просматривать записи базы данных. Нажав клавишу <Ins>, можно добавить запись, а нажав клавишу <Del> — удалить запись. Для того чтобы внести изменения в поле записи, нужно, используя клавиши перемещения курсора влево и вправо, выбрать необходимое поле и нажать клавишу <F2>.
Выбор информации из базы данных
При работе с базой данных пользователя, как правило, интересует не все ее содержимое, а некоторая конкретная информация. Найти нужные сведения можно последовательным просмотром записей. Однако такой способ поиска неудобен и малоэффективен.
Большинство систем управления базами данных позволяют произвести выборку нужной информации путем выполнения запросов. Пользователь в соответствии с определенными правилами формулирует запрос, указывая, каким критериям должна удовлетворять интересующая его информация, а система выводит записи, удовлетворяющие запросу.
Для выборки из базы данных записей, удовлетворяющих некоторому критерию, предназначен компонент Query (вкладка BDE).
Компонент Query похож на компонент Table, но, в отличие от последнего, он представляет не всю базу данных (все записи), а только ее часть — записи, удовлетворяющие критерию запроса. В табл. 17.18 перечислены некоторые свойства компонента Query.
Таблица. Свойства компонента Query
Свойство | Определяет |
Name | Имя компонента. Используется компонентом Datasource для связи результата выполнения запроса (набора записей) с компонентом, обеспечивающим просмотр записей, например DBGrid |
SQL | Записанный на языке SQL запрос к базе данных (к таблице) |
Active | При присвоении свойству значения True активизирует выполнение запроса |
Для того чтобы во время разработки программы задать, какая информация будет выделена из базы данных в результате выполнения запроса, свойство sql должно содержать представленный на языке SQL запрос на выборку данных.
Например, запрос
SELECT Fam, Name
FROM ':Школа:school.db'
WHERE (Class = '11а')
ORDER BY Name, Fam
обеспечивает выборку из базы данных "Школа" (из таблицы School.db) списка учеников 11-а класса.
Следующий запрос:
SELECT Fam, Name FROM ":Школа:school.db"
WHERE (Fam > 'K'} and (Fam < 'Л')
ORDER BY Name, Fam
обеспечивает выбор информации об учениках, фамилии которых начинаются на букву К.
Запрос может быть сформирован и записан в свойство sql во время разработки формы или во время работы программы.
Для записи запроса в свойство sql во время разработки формы используется редактор списка строк, окно которого открывается в результате щелчка на кнопке с тремя точками в строке свойства sql окна Object Inspector.
Свойство sql представляет собой список строк. Поэтому чтобы сформировать запрос во время работы программы, нужно, используя метод Add, добавить строки (Sql- инструкции) в список sql.
Ниже приведен фрагмент кода, который формирует запрос на поиск информации о конкретном человеке (критерий выбора — содержимое поля Fam должно совпадать со значением переменной fam).
with form1.Query1 do
Begin
Close; // закрыть файл — результат выполнения предыдущего запроса
SQL.Clear; // удалить текст предыдущего запроса
// записываем новый запрос в свойство SQL
SQL.Add('SELECT Fam, Name, Class');
SQL.Add('FROM ":Школа:school.db"'};
SQL.Add{'WHERE');
SQL.Add('(Fam = "' + fam + '")');
SQL.Add('ORDER BY Fam');
Open; // активизируем выполнение запроса
end;
Следующая программа (диалоговое окно приведено на рисунке), демонстрирует возможность изменения запроса, точнее, критерия запроса, во время работы программы. Программа обеспечивает вывод как всего списка учеников, так и его части. Например, посредством выполнения запроса выводится информация только о конкретном ученике.
Рис. Форма приложения База данных Школа
Button1 Button2
Листинг модуля:
unit school2_;
Interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls;
Type
TForm1 = class(TForm)
Table1: TTable;
Query1: TQuery;
DataSource1: TdataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
DBText1: TDBText;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
end;
Var
Form1: TForm1;
Implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
fam: string[30];
begin
fam:=InputBox('Выборка информации', 'Укажите фамилию и нажмите OK.', '');
if fam <> '' then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add('SELECT Fam, Name, Class');
SQL.Add('FROM ":Школа:school.db"');
SQL.Add('WHERE');
SQL.Add('(Fam = "'+ fam + '")');
SQL.Add('ORDER BY Name, Fam');
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage('В базе нет данных, удовлетворяющих критерию запроса'); DataSource1.DataSet:=Table1;
end;
end;
end; // конец proc
procedure TForm1.Button2Click(Sender: TObject);
begin DataSource1.DataSet:=Table1; // задается источник данных - таблица
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
DataSource1.DataSet:= Table1;
Table1.Active:= True;
end; end. // end unit
Задание.
1. Создайте новый запрос отбора списка учеников заданного класса. Для этого добавьте новую кнопку Поиск по классу.
2. Создайте новую форму для добавления новых записей в вашу индивидуальную таблицу, созданную на лабораторной работе №1 с помощью соответствующих навигационных методов. Эта форма должна содержать свободные поля, в которые должны заноситься корректные данные, затем должны заполняться соответствующие поля таблицы. Предусмотрите кнопку подтверждения и отмены сделанных действий.
3. Сделайте вызов формы из первой формы, содержащей данный в DBGrid, нажатием на клавишу Добавить ученика.
4. Сделайте компонент DBGrid недоступным для редактирования данных.
5. Предусмотрите обновление текущей записи формы 1 с использованием уже созданной формы 2. Для этого создайте кнопку Редактировать, нажатие на которую будет открывать форму 2 для редактирования текущей записи.
1.