Сегодня
Сделать стартовой   |   Добавить в Избранное

Рубрики:
Главная
Программирование
Downloads
Компоненты
Юмор
Ссылки
Обратная связь

                                  Базы данных

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

  • Для того чтобы программа могла работать с базой данных, на компьютере должен быть установлен процессор баз данных — 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.

Назад

Используются технологии uCoz