Базы данных
Приступая к решению задач этого раздела, необходимо вспомнить:
- Для того чтобы программа могла работать с базой данных, на компьютере
должен быть установлен процессор баз данных — Borland Database Engine
(BDE). На компьютер программиста BDE устанавливается в процессе установки
Delphi.
- Создать базу данных (таблицу данных) и наполнить ее ин формацией
можно при помощи утилиты Database Desktop, которая входит в состав Delphi.
- Перед тем как приступить к созданию таблицы данных, надо создать
псевдоним (Alias) базы данных. Сделать это можно при помощи утилиты
BDE Administrator или SQL Explorer. Обе эти утилиты входят в состав
Delphi.
- Для того чтобы перенести программу работы с базой данных на другой
компьютер, надо создать установочный CD. Для решения этой задачи Borland
рекомендует использовать ути литу InstallShield Express, которая поставляется
вместе с Delphi.
64. Напишите программу работы с локальной базой данных "Архитектурные
памятники Санкт-Петербурга" (рис. 1.72). Для создания базы данных
используйте утилиту Database Desktop, для создания псевдонима — SQL Explorer
или BDE Administrator. Характеристики полей записей базы данных при ведены
в табл. 1.1, форма программы — на рис. 1.73.
Таблица 1.1. Поля записей базы данных
Поле |
Тип |
Размер |
Информация |
Monument |
А |
60 |
Название памятника |
Architect |
А |
40 |
Архитектор |
Note |
A |
255 |
Краткая историческая справка |
Photo |
A |
12 |
Файл иллюстрации |
Рис. 1.72. Окно программы работы с базой данных "Архитектурные
памятники Санкт-Петербурга"
Рис. 1.73. Форма программы работы с базой данных "Архитектурные
памятники Санкт-Петербурга"
I Программа работы с базой данных "Архитектурные
памятники Санкт-Петербурга".
(с) Культин Н. Б., 2003
Сначала надо создать базу данных типа STANDARD
(таблицу monuments.db), затем — псевдоним
Peterburg. Псевдоним можно создать при помощи
SQL Explorer. }
unit peter_;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, ExtCtrls, StdCtrls, DBCtrls,
Mask, Db, DBTables,
jpeg; // чтобы можно было выводить JPG-иллюстрации
type
TForml = class(TForm)
Tablel: TTable; // база данных - таблица
DataSourcel: TDataSource; // источник данных для полей
// редактирования-просмотра
Labell: TLabel;
Label2: TLabel;
Label3: TLabel;
DBEditl: TDBEdit;
DBEdit2: TDBEdit;
DBMemo1: TDBMemo;
DBEdit3: TDBEdit;
Image1: TImage;
DBNavigatorl: TDBNavigator;
Label4: TLabel;
procedure TablelAfterScroll(DataSet: TDataSet);
procedure DBEdit3KeyPress(Sender: TObject; var Key: Char);
procedure DBNavigatorlClick(Sender: TObject;
Button: TNavigateBtn);
procedure TablelBeforeOpen(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
private
I Private declarations }
public
{ Public declarations )
end;
var
Forml: TForml;
BmpPath: string; // Путь к файлам иллюстраций. Иллюстрации
// находятся в подкаталоге Data каталога
// программы.
implementation
{$R *.DFM}
procedure TForml.FormCreate(Sender: TObject);
begin
Tablel.Active := True; // открыть (таблицу) базу данных
end;
// выводит фотографию в поле Imagel
procedure ShowFoto(foto: string);
begin
try
Forml.Imagel.Picture.LoadFromFile(BmpPath+foto);
Forml.Imagel.Visible:=True;
except
on EFOpenError do
begin
MessageDlg('Файл иллюстрации '+foto+' не найден.',
mtlnformation, [mbOk], 0);
end;
end;
end;
// переход к. другой записи (следующей, предыдущей,
// первой или последней)
procedure TForml.TablelAfterScroll(DataSet: TDataSet);
begin
if forml.DBEdit3.Visible
then
begin
forml.DBEdit3.Visible := False;
forml.Label4.Visible:=False;
...
end;
if Forml.DBEdit3.Text О "
then ShowFoto(Forml.DBEdit3.Text)
else forml.Imagel.Visible:=False;
end;
// нажатие клавиши в поле Фото
procedure TForml.DBEdit3KeyPress(Sender: TObject; var Key: Char);
begin
if (key = #13) then
if Forml.DBEdit3.Text О "
then ShowFoto(Forml.DBEdit3.Text) // показать
// иллюстрацию
else forml.Imagel.Visible:-False;
end;
// щелчок на компоненте Навигатор
procedure TForml.DBNavigatorlClick(Sender: TObject;
Button: TNavigateBtn);
begin
case Button of
nblnsert: begin // добавить запись
Imagel.Visible:=False; // скрыть область
// вывода иллюстрации
DBEdit3.Visible:=True; // показать поле Фото
Label4.Visible:=True; // показать метку Фото
end;
nbEdit: begin // редактирование записи
DBEdit3.Visible:=True; // показать поле Фото
Label4.Visible:=True; // показать метку Фото
end;
end;
end;
// перед тем, как открыть базу данных (таблицу)
procedure TForml.TablelBeforeOpen(DataSet: TDataSet);
begin
// определить каталог, в котором находятся
// иллюстрации
BmpPath:=ExtractFilePath(ParamStr(0)) + 'data/' ;
end;end.
65. Напишите программу, при помощи которой можно создать базу данных
"Архитектурные памятники Санкт-Петербурга". Вид формы программы
приведен на рис. 1.74.
Рис. 1.74. Форма программы Создать таблицу базы данных
// щелчок на кнопке Создать
procedure TForml.ButtonlClick(Sender: TObject);
begin
Queryl.DatabaseName := 'Peterburg';
I Peterburg — псевдоним базы данных,
в которой будет создана таблица. }
with Queryl do begin
SQL.Clear;
SQL.Add('CREATE TABLE pam (');
SQL.Add('Monument CHAR(60),');
SQL.Add('Architect CHAR (40),');
SQL.Add('Note CHAR(255),');
SQL.Add('Photo CHAR(12));');
// в процессе выполнения запроса возможны ошибки,
// например нельзя создать таблицу, которая
// уже есть в базе данных
try
ExecSQL; // выполнить запрос
except
on E: EDBEngineError do
begin
ShowMessage('Ошибка создания таблицы БД.'+
#13 + Е.Message);
Buttonl.Enabled := False;
end;
end;
end;
end;
66. Напишите программу работы с базой данных "Записная книжка".
Для создания базы данных используйте утилиту Database Desktop, для создания
псевдонима — SQL Explorer или BDE Administrator. Характеристики полей
записей базы данных приведены в табл. 1.2, форма программы — на рис. 1.75.
Таблица 1.2. Поля записей базы данных
"Записная книжка"
Поле |
Тип |
Размер |
Информация |
Fam |
A |
15 |
Фамилия |
Name |
A |
20 |
Имя |
Tel |
A |
15 |
Телефон |
Email |
A |
20 |
Адрес электронной почты |
Рис. 1.75. Форма программы Записная книжка
( Программа работы с базой данных
"Записная книжка".}
unit adrbook_;
{ Сначала надо создать таблицу adrbook.db (в формате Paradox)
и псевдоним adrbook. После этого нужно добавить
в форму компонеты Table, DataSource, DBGrid и выполнить
их настройку в соответствии с приведенной ниже таблицей.
Свойство |
Значение |
Tablet .DataBaseName |
adrbook |
Tablel. TableName |
adrbook. db |
Tablel.Active |
True |
DataSourcel.DataSet |
Tablel |
DBGrid.Data Source |
DataSourcel |
interface
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids,
DB, DBTables, StdCtrls;
type
TForml = class(TForm)
Tablel: TTable; // база данных
DataSourcel: TDataSource;
DBGridl: TDBGrid; // компонент отображения
// базы данных
DBNavigatorl: TDBNavigator;
Buttonl: TButton;
Button2: TButton;
Queryl: TQuery;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
implementation
{$R *.dfm)
procedure TForml.FormCreate(Sender: TObject);
begin
Tablel.Active := True; // открыть базу данных
end;
// щелчок на кнопке Запрос
procedure TForml.ButtonlClick(Sender: TObject);
var
buf: string[30]; // критерий запроса
begin
buf := InputBox('Выборка информации из БД',
1 Введите фамилию и щелкните на кнопке ОК','') ;
if buf = '' then exit;
// пользователь ввел критерий запроса
with Queryl do begin
Close; // закрыть результат выполнения
// предыдущего запроса
SQL.Clear; // удалить текст предыдущего запроса
// формируем новый запрос
SQL.Add('SELECT Fam, Name,«Tel, Email1);
SQL.Add('FROM ":adrbook:adrbook.db" ');
SQL.Add('WHERE');
SQL.Add{ ' (Fam ='" + buf + "')');
SQL.Add('ORDER BY Fam, Name');
Open; // выполнить запрос
if RecordCount <> 0
then // отобразить результат выполнения запроса
DataSourcel.DataSet := Queryl
else
ShowMessage('В БД нет записей, удовлетворяющих1 +
#13 + 'критерию запроса.');
end;
end;
// щелчок на кнопке Все записи
procedure TForml.Button2Click(Sender: TObject);
begin
DataSourcel.DataSet := Tablel; // источник данных - таблица
end;end.
67. Напишите программу работы с базой данных "Ежедневник",
каждая запись которой содержит информацию о запланирован ном мероприятии.
В начале работы программа должна вывести список дел, запланированных на
дату запуска программы и ближайшие дни. Псевдоним базы данных должна создавать
про грамма. Таблица данных должна находиться в том же каталоге, что и
выполняемый файл программы. Если таблицы данных нет, то программа должна
ее создать. Рекомендуемый вид формы программы приведен на рис. 1.76, структура
записей БД — в табл. 1.3.
Рис. 1.76. Форма программы Ежедневник
Таблица 1.3. Поля записей базы данных
"Ежедневник"
Поле |
Тип |
Размер |
Информация |
What |
А |
80 |
Мероприятие |
Data |
D |
|
Дата |
// Главный модуль программы "Организатор".
// Чтобы его увидеть, выберите в меню
// Project команду View Source
program org;
uses
Forms,
org_ in 'org_.pas' {Formlj,
SysUtils,Dialogs,
DateUtils, // для доступа к IncDay
DBTables; // для доступа к Session, AddStandardAlias
{$R *.res}
var
Present: TDateTime; // сегодня
NextDay: TDateTime; // следующий день
Year, Month, Day : Word; // год, месяц, день
Query: TQuery; // запрос, обеспечивающий
// создание БД (таблицы)
begin
Application.Initialize;
Application.Title := 'Ежедневник';
Application.CreateForm(TForml, Forml);
l Псевдоним для доступа к базе данных создается
во время запуска программы и существует только
во время работы программы.
База данных находится в том же каталоге, что
и выполняемый файл программы. Имя каталога,
в котором находится выполняемый файл, можно получить
обратившись к функции ParamStr. }
// создадим псевдоним
with Session do
begin
ConfigMode := cmSession;
AddStandardAlias('diary', // псевдоним БД
ExtractFilePath(ParamStr(0)), // каталог
'PARADOX');
end;
// определим текущую дату
Present:= Now; // Wow — функция, возвращает текущую дату
// и время
DecodeDate(Present, Year, Month, Day);
case (dof) DayOfWeek(Present) of
6: NextDay := IncDay(Present,3); // пятница
7: NextDay := IncDay(Present,2); // суббота
else NextDay := IncDay(Present,1)
end;
// запрос к базе данных: есть ли дела, запланированные
// на сегодня и ближайшие дни
Forml.Queryl.SQL[3] :=
'{Data >= '''+
FormatDateTime('dd/mm/yyyy',Present)+''')' + 'and'+
1 (Data <= ' ' ' + FormatDateTime (' dd/mm/yyyy', NextDay) + '")'/
try
Forml.Queryl.Open; // выполнить запрос
except
on E:EDBEngineError do
// Ошибка при выполнении запроса может
// быть вызвана тем, что файла базы данных нет.
// Предложить пользователю создать
// файл базы данных.
begin
MessageDlg('Файл таблицы базы данных не найден .'+#13+
'Таблица будет создана.',mtWarning, [mbYes],0);
Query := TQuery.Create(Forml);
with Query do
begin
// сформируем запрос, обеспечивающий
// создание БД
SQL.Add('CREATE TABLE diary (');
SQL.Add('What CHAR(80),');
SQL.Add('Data DATE);');
ExecSQL;
end;
// таблица создана
Forml.Queryl.Open; // выполним запрос
end;
end;
if Forml.Queryl.RecordCount <> 0 // есть дела,
. // запланированные на ближайшие дни
then
Forml.DataSourcel.DataSet := Forml.Query1
else
begin
Forml.DataSourcel.DataSet := Forml.Tablel;
Forml.Tablel.Open;
ShowMessage('На сегодня и ближайшие дни' +
1 никаких дел не запланировано.');
end;
Application.Run;
end.
unit org_; // модуль формы
{
Сразу после запуска программа посылает запрос к базе
данных, для того чтобы выяснить, есть ли дела, запланированные
на сегодня. Если что-то намечено, то на экране появляется окно
Ежедневник.
Запрос к базе данных в начале работы программы формирует
главная процедура приложения. Чтобы ее увидеть,
выберите из меню Project команду View Source.
1
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, DB, Grids, DBGrids, DBTables,
StdCtrls, DBCtrls, ExtCtrls;
type
TForml = class(TForm)
Tablel: TTable;
DataSourcel: TDataSource;
DBGridl: TDBGrid;
Queryl: TQuery;
Labell: TLabel;
Buttonl: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Label2: TLabel;
DBNavigatorl: TDBNavigator;
procedure FormActivate(Sender: TObject);
procedure ButtonlClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
I Private declarations j
public
{ Public declarations I
end;
var
Forml: TForml;
stDay : array[1..7] of string[ll] =
('воскресенье','понедельник','вторник',
1 среда','четверг','пятница','суббота'),
stMonth : array[1..12] of string[8] =
('января','февраля','марта',
'апреля','мая','июня','июля',
'августа','сентября','октября',
'ноября','декабря');
implementation
{$R *.dfm}
uses DateUtils;
// сегодняшняя дата и день недели
procedure TForml.FormActivate(Sender: TObject);
var
Present: TDateTime;
Year, Month, Day : Word;
begin
Present:= Now; // Now — функция, возвращает текущую дату
// и время
DecodeDate(Present, Year, Month, Day);
Labell.Caption := 'Сегодня ' + IntToStr(Day)+' '
+ StMonth[Month] + ' '+ IntToStr(Year)+' года, '
+ stDay[DayOfWeek(Present)];
Forml.Label2.Caption := 'Сегодня и ближайшие дни';
end;
// щелчок на кнопке Сегодня
procedure TForml.Button2Click(Sender: TObject);
var
st : string; // критерий запроса
begin '
Forml.Label2.Caption := 'Сегодня';
st:= FormatDateTime('dd/ram/yyyy',Now);
Forml. Query 1. SQL [3] := ' (Data = "• +st+ "')';
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else begin
ShowMessage('На сегодня никаких дел не запланировано.1);
//forml.DataSourcel.DataSet := Tablel;
end;
end;
// завтра
procedure TForml.Button3Click(Sender: TObject);
var
Present, // сегодня'
Tomorrow: TDateTime; // завтра
begin
Forml.Label2.Caption := 'Завтра';
Present:= Now; // Now — функция, возвращает текущую дату
// и время
Tomorrow := IncDay(Present); // завтра
Forml.Queryl.SQL[3] : =
'(Data = '''+ FormatDateTime('dd/mm/yyyy',Tomorrow)+''')';
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else
ShowMessage('На завтра никаких дел не запланировано.1);
end;
// на этой неделе
procedure TForml.Button4Click(Sender: TObject);
var
Present: TDateTime;
EndOfWeek: TDateTime;
begin
Forml.Label2.Caption := 'На этой неделе';
Present:= Now; // Now — функция, возвращает текущую дату
// и время
EndOfWeek := StartOfAWeek(YearOf(Present),WeekOf(Present)+1);
Forml.Queryl.SQL[3] :=
'(Data >= '''+
FormatDateTime (' dd/rtim/yyyy', Present) + ''')' + ' and' +
'(Data < ' ' ' +
FormatDateTime ('dd/mm/yyyy', EndOfWeek)+ ' ' ') ' ;
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else
ShowMessage('На эту неделю никаких дел не запланировано.');
end;
// на следующей неделе
procedure TForml.ButtonlClick(Sender: TObject);
var
Present: TDateTime;
dl, d2: TDateTime;
begin
Forml.Label2.Caption := 'На следующей неделе1;
Present:= Now; // Wow — функция, возвращает текущую дату
// и время
dl := StartOfAWeek(YearOf(Present),WeekOf(Present)+1) ;
d2 := StartOfAWeek(YearOf(Present),WeekOf(Present)+2);
Forml.Queryl.SQL[3] :=
'(Data >= '''+ FormatDateTime('dd/mm/yyyy', dl) + ''')' +
'and'+
'(Data < "'+ FormatDateTime ('dd/mm/yyyy',d2)+ 111)';
Forml.Queryl.Open;
if forml.Queryl.RecordCount <> 0 then
forml.DataSourcel.DataSet := Forml.Queryl
else
ShowMessage('На следующую неделю никаких дел
не запланировано.');
end;
// показать все записи
procedure TForml.Button5Click(Sender: TObject);
begin
Forml.Label2.Caption := 'Все, что намечено сделать';
DataSourcel.DataSet := Tablel;
Tablel.Active : = True;
end;
end.
|