Лабораторная работа: Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase
Проектування
дволанкової розподіленої інформаційної системи для роботи з БД із використанням
SQL Interbase
Мета:
• створення БД;
• створення
використання індексів та переглядів БД;
• створення
використання тригерів, генераторів та збережених процедур на боці SQL-сервера;
• отримання
практичних навичок обміну даними між прикладенням і БД.
Завдання:
Засобами SQL Interbase
необхідно створити БД, декілька індексованих таблиць БД (головну і підлеглі)
декілька їх переглядів, а також зв’язати їх між собою.
Засобами С++Builder
створити оригінальне(!) прикладення, яке повинне надавати мож-ливість:
• перегляду
записів зв’язаних таблиць БД, у тому числі попередніх і наступних записів та із
використанням створених переглядів;
• фільтрац
записів БД із виведенням на екран записів, обраних у діалозі за вказаними
критеріями;
• інкрементального
пошуку даних у БД за вказаними критеріями;
• додавання
видалення записи таблиці БД, у тому числі із використанням створених на боц
SQL-сервера тригерів, генераторів та збережених процедур;
• корегування
полів поточного запису таблиці БД, у тому числі із використанням створе-ної на
боці SQL-сервера збереженої процедури.
Вказівки до створення
БД:
Для створення БД із
використанням SQL Interbase необхідно:
• завантажити на
виконання прикладення InterBase Windows ISQL, яке за звичай зберігає-ться за
маршрутом "<диск>:\Program Files\InterBase Corp\ InterBase\
Bin\wisql32.exe", наприклад, “E:\Program Files\InterBase Corp\ InterBase\
Bin\wisql32.exe";
• виконати
команду File | Create Database … і у віконці, яке з’явилося (мал. 1.1), вказати
наведені параметри (параметри можуть бути довільними);
• виконати
команду Metadata | Show … і у віконці, яке з’явилося (мал. 1.2), у полі View
Information On: обрати з меню альтернативу Database. Якщо БД було успішно
створено, то у вікні InterBase Windows ISQL з’явиться відповідне повідомлення
(мал. 1.3).
• виконати
команду File | Commit Work для збереження результатів роботи на диску;
• далі (вже
засобами С++ Builder) командою Database | Explore завантажити на виконання
прикладення Database Explore, командою Object | New | INTRBASE створити аліас
dbP, обрати його на вкладинці Databases і вказати параметри, які наведено на
мал. 1.4; потім виконати команду Object | Apply для збереження зроблених змін;
• у прикладенн
InterBase Windows ISQL виконати команду File | Run an ISQL Script … і у вікні,
що з’явилося (мал. 1.5), вказати ім’я файлу Createdb.sql, в якому набрано
скрипт для створення таблиць БД;


Малюнок 1.1 Малюнок 1.2

Малюнок 1.3

Малюнок 1.4

Малюнок 1.5
Вміст цього файлу
наведено нижче:
/*
з’єднання
з
БД
*/
CONNECT
"e:\Lr2\dbP\dbP.gdb" USER "SYSDBA" PASSWORD
"masterkey";
/*
створення
таблиц
PERS */
create
table pers(
Num
smallint Not Null Primary Key,
Dep
char(15),
Fam
char(20) Not Null,
Nam char(20) Not Null,
Par
char(20) Not Null,
Year_b
smallint,
Sex
char(1),
Charact
blob,
Photo
blob
);
/*
створення
таблиц
DEP */
create
table dep(
Dep
char(15) Not Null Primary Key,
Proisv
char(15)
);
/*
заповнення
таблиц
PERS */
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(1,
"Бухгалтерія",
"Іванов",
"Іван",
"Іванович",
1950, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(2,
"Цех 1", "Петров", "Петро", "Петрович",
1960, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(3,
"Цех 2", "Сидоров", "Сидор",
"Сидорович", 1955, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(4,
"Цех
1", "Іванова",
"Ірина",
"Іванівна",
1971, "ж");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(5,
"Бухгалтерія",
"Миколаєв",
"Микола",
Миколайович",
1930, "ч”);
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(6,
"Цех
2", "Андрієв",
"Андрій",
"Андрійович",
1930, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(7,
"Цех 1", "Борисов", "Борис",
"Борисович", 1937, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(8,
"Цех 1", "Павлов", "Павло", "Павлович",
1975, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(9,
"Бухгалтерія", "Антонова", "Антоніна",
"Антонівна", 1965, "ж");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(10,
"Цех 2", "Харитонов", "Харитон",
"Харитонович", 1962, "ч");
Insert
Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)
Values(11,
"Цех 2", "Іванников", "Іван",
"Іванович", 1975, "ч");
/* заповнення таблиц
DEP */
Insert Into DEP(
Dep,Proisv) Values("Бухгалтерія", "управління");
Insert
Into DEP( Dep,Proisv) Values("Цех
1", "виробництво");
Insert
Into DEP( Dep,Proisv) Values("Цех
2", "виробництво");
Commit;
Після натискання кнопки
Открыть треба вказати, що результати виконання скрипту необхідно зберігати у файл
Result.txt.
Скрипт виконується.
Оглянути схему
створеної таблиці (наприклад, таблиці PERS) можна командою Meta-data
| Show … (мал. 1.6)

Малюнок
1.6
SHOW
TABLE PERS
NUM
SMALLINT Not Null
DEP
CHAR(15) Nullable
FAM
CHAR(20) Not Null
NAM
CHAR(20) Not Null
PAR
CHAR(20) Not Null
YEAR_B
SMALLINT Nullable
SEX
CHAR(1) Nullable
CHARACT
BLOB segment 80, subtype UNKNOWN Nullable
PHOTO
BLOB segment 80, subtype UNKNOWN Nullable
CONSTRAINT
INTEG_2:
Primary
key (NUM)
Оглянути
вміст
створено
таблиц
(наприклад,
таблиц
PERS) можна
набором
запиту
Select * from PERS у вікн
InterBase Windows ISQL, або ж
за
допомогою
Database Explore (мал.
1.7):

Малюнок
1.7
• створити
ндекси
таблиц
PERS, для
чого
виконати
скрипт,
що
міститься
у
файл
CreateINDEXESdbP.sql:
/*
З'єднання
з
БД
*/
CONNECT
"e:\Lr3\dbP\dbP.gdb" USER "SYSDBA" PASSWORD
"masterkey";
/*
Створення
ндексів
*/
create
index Person On PERS Fam,Nam,Par;
create
index DepPerson On PERS Dep,Fam,Nam,Par;
create
index Year On PERS Year_b;
• створити
перегляди
таблиц
PERS, для
чого
виконати
скрипт,
що
міститься
у
файл
CreateVIEWSdbP.sql:
/*
З'єднання
з
БД
*/
CONNECT
"e:\Lr3\dbP\dbP.gdb" USER "SYSDBA" PASSWORD
"masterkey";
/* Створення переглядів
таблиці PERS за підрозділами */
Create
VIEW dep_1 as
select
Dep, Num, Fam, Nam, Par, Year_b, Sex from Pers
where
Dep = "Бухгалтерія";
Create
VIEW dep_2 as
select
Dep, Num, Fam, Nam, Par, Year_b, Sex from Pers
where
Dep = "Цех 1";
Create
VIEW dep_3 as
select
Dep, Num, Fam, Nam, Par, Year_b, Sex from Pers
where
Dep = "Цех 2";
• дал
засобами
С++
Builder командою
Database | Explore завантажити
на
виконання
прикладення
Database Explore і з
його
допомогою
створити
генератор
PERSGEN, як показано
на
мал.
1.8;

Малюнок
1.8
• створити
триггер
PERSSWITCH таблиці PERS, для
чого
виконати
скрипт,
що
місти-ться
у
файл
CreateTRIGGERdbP.sql:
CONNECT
"e:\Lr3\dbP\dbP.gdb" USER "SYSDBA" PASSWORD "masterkey";
/* Створення триггера
PERSSWITCH для збільшення номера запису під час вставки запису у таблицю */
SET
TERM ^;
CREATE
TRIGGER PERSSWITCH FOR PERS
BEFORE
INSERT AS
BEGIN
NEW.NUM
= GEN_ID(PERSGEN, 1);
END;^
SET
TERM ;^
COMMIT;
• створити на боц
SQL-сервера виконуємі процедури вставки
(INSERTdbP), видалення (DELETEdbP)
та корегування (UPDATEdbP)
таблиці PERS, для чого:
• виконати скрипт,
що міститься у файлі CreateProcINSERTdbP.sql:
CONNECT
"e:\Lr3\dbP\dbP.gdb" USER "SYSDBA" PASSWORD
"masterkey";
/*
Виконуєма
процедура
INSERTdbP. Додає дан
про
співробітника,
верта
номер
запису
*/
SET
TERM ^;
CREATE
PROCEDURE INSERTdbP
(
pDEP
CHAR(15),
pFAM
CHAR(20),
pNAM
CHAR(20),
pPAR
CHAR(20),
pYEAR_B
INTEGER,
pSEX
CHAR(1)
)
AS
BEGIN
Insert
into PERS (DEP, FAM, NAM, PAR, YEAR_B, SEX)
VALUES
(:pDEP, :pFAM, :pNAM, :pPAR, :pYEAR_B, :pSEX);
END;^
SET
TERM ;^
COMMIT;
•
виконати
скрипт,
що
міститься
у
файл
CreateProcDELETEdbP.sql:
CONNECT
"e:\Lr3\dbP\dbP.gdb" USER "SYSDBA" PASSWORD
"masterkey";
/* Виконуєма процедура
DELETEdbP знищення даних про співробітника */
SET
TERM ^;
CREATE
PROCEDURE DELETEdbP
(
pNUM
INTEGER
)
AS
BEGIN
DELETE
FROM PERS WHERE NUM = :pNUM;
END;^
SET
TERM ;^
COMMIT;
• виконати скрипт,
що міститься у файлі CreateProcUPDATEdbP.sql:
CONNECT
"e:\Lr3\dbP\dbP.gdb" USER "SYSDBA" PASSWORD
"masterkey";
/*
Виконуєма
процедура
UPDATEdbP.
Зміню
дан
про
співробітника,
верта
номер
запису
чи
0, якщо
співробітника
нема
*/
SET
TERM ^;
CREATE
PROCEDURE UPDATEdbP
(
pDEP
CHAR(15),
pFAM
CHAR(20),
pNAM
CHAR(20),
pPAR
CHAR(20),
pYEAR_B
INTEGER,
pSEX
CHAR(1)
)
RETURNS
(number
integer)
AS
BEGIN
number
= 0;
Select
NUM From PERS
Where
(FAM = :pFAM) and (NAM = :pNAM) and (PAR = :pPAR)
Into
number;
if
(number > 0) then
Update
PERS Set DEP = :pDEP, YEAR_B = :pYEAR_B, SEX = :pSEX
Where
(FAM = :pFAM) and (NAM = :pNAM) and (PAR = :pPAR);
END;^
SET TERM ;^
COMMIT;
У результаті виконання
цих дій буде створено БД зі структурою, що наведено на мал. 1.10.

Малюнок 1.10
Вказівки до створення
першого прикладення:
Для маніпулювання
таблицями треба створити проект прикладення (мал. 1.11).

Малюнок 1.11
Головну форму main_Form
наведено на мал. 1.12 і мал. 1.13.

Малюнок 1.12

Малюнок 1.13
Текстовий опис форми
main_Form:
object
main_Form: Tmain_Form
Left
= 147
Top
= 103
Width
= 709
Height
= 460
Caption
= 'Лабораторна
робота
2'
Color
= clBtnFace
Font.Charset
= DEFAULT_CHARSET
Font.Color
= clWindowText
Font.Height
= -11
Font.Name
= 'System'
Font.Style
= [fsBold]
OldCreateOrder
= True
Position
= poScreenCenter
OnCreate
= FormCreate
PixelsPerInch
= 96
TextHeight
= 16
object
PageControl: TPageControl
Left
= 421
Top
= 0
Width
= 280
Height
= 428
ActivePage
= find_TabSheet
Align
= alClient
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clWindowText
Font.Height
= -13
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
MultiLine
= True
ParentFont
= False
TabOrder
= 0
OnChange
= PageControlChange
object
find_TabSheet: TTabSheet
Caption
= 'Відбір'
object
select_GroupBox: TGroupBox
Left
= 1
Top
= 5
Width
= 268
Height
= 212
Caption
= 'Відбір
за
...'
TabOrder
= 7
end
object
sex_RadioGroup: TRadioGroup
Left
= 8
Top
= 120
Width
= 257
Height
= 53
Caption
= ' статтю
'
Columns
= 2
ItemIndex
= 0
Items.Strings
= (
'чоловіча'
'жіноча')
TabOrder
= 0
OnClick
= minage_CSpinEditChange
end
object
speedfind_GroupBox: TGroupBox
Left
= 0
Top
= 224
Width
= 257
Height
= 169
Caption
= ' Швидкий
пошук
за
прізвищем
'
TabOrder
= 5
object
Image1: TImage
Left
= 8
Top
= 16
Width
= 105
Height
= 145
Picture.Data
= { }
Stretch
= True
end
object
speedfind_Label: TLabel
Left
= 154
Top
= 42
Width
= 56
Height
= 16
Caption
= 'Прізвище'
end
object
speedfind_Image: TImage
Left
= 32
Top
= 48
Width
= 57
Height
= 73
Picture.Data
= { }
Stretch
= True
end
end
object
age_GroupBox: TGroupBox
Left
= 8
Top
= 32
Width
= 257
Height
= 81
Caption
= ' віком
'
Enabled
= False
TabOrder
= 4
object
minage_Label: TLabel
Left
= 65
Top
= 15
Width
= 28
Height
= 16
Caption
= 'від
...'
end
object
maxage_Label: TLabel
Left
= 192
Top
= 15
Width
= 25
Height
= 16
Caption
= 'до
...'
end
object
minage_Image: TImage
Left
= 8
Top
= 24
Width
= 41
Height
= 49
Picture.Data
= { }
Stretch
= True
Transparent
= True
end
object
maxage_Image: TImage
Left
= 136
Top
= 24
Width
= 41
Height
= 49
Picture.Data
= { }
Stretch
= True
Transparent
= True
end
end
object
speedfind_Edit: TEdit
Left
= 120
Top
= 296
Width
= 129
Height
= 22
Hint
= 'Ввод
фамилии'
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clWindowText
Font.Height
= -11
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
ParentShowHint
= False
ShowHint
= True
TabOrder
= 1
OnChange
= speedfind_EditChange
end
object
minage_CSpinEdit: TCSpinEdit
Left
= 62
Top
= 66
Width
= 65
Height
= 26
TabStop
= True
MaxValue
= 80
MinValue
= 16
ParentColor
= False
TabOrder
= 2
Value
= 16
OnChange
= minage_CSpinEditChange
end
object
maxage_CSpinEdit: TCSpinEdit
Left
= 190
Top
= 66
Width
= 65
Height
= 26
TabStop
= True
MaxValue
= 80
MinValue
= 16
ParentColor
= False
TabOrder
= 3
Value
= 30
OnChange
= minage_CSpinEditChange
end
object
select_BitBtn: TBitBtn
Left
= 8
Top
= 184
Width
= 257
Height
= 25
Cursor
= crHandPoint
Caption
= 'Поновити
відбір'
TabOrder
= 6
OnClick
= select_BitBtnClick
Kind
= bkOK
end
end
object
TabEdit: TTabSheet
Caption
= 'Корегування'
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clBlack
Font.Height
= -13
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
object
ch_GroupBox: TGroupBox
Left
= 2
Top
= 5
Width
= 269
Height
= 388
Caption
= ' Загальн
відомост
'
TabOrder
= 9
object
chdp_Label: TLabel
Left
= 12
Top
= 38
Width
= 50
Height
= 16
Caption
= 'Відділок'
FocusControl
= chdp_ComboBox
end
object
chname_Label: TLabel
Left
= 12
Top
= 138
Width
= 25
Height
= 16
Caption
= 'Ім'#39'я'
FocusControl
= chname_Edit
end
object
chgrand_Label: TLabel
Left
= 12
Top
= 188
Width
= 73
Height
= 16
Caption
= 'По
батькові'
FocusControl
= chgrand_Edit
end
object
chyear_Label: TLabel
Left
= 12
Top
= 232
Width
= 95
Height
= 16
Caption
= 'Рік
народження'
end
object
chfam_Label: TLabel
Left
= 12
Top
= 87
Width
= 56
Height
= 16
Caption
= 'Прізвище'
FocusControl
= chfam_Edit
end
object
oper_Bevel: TBevel
Left
= 18
Top
= 282
Width
= 251
Height
= 96
end
object
oper_Shape: TShape
Left
= 19
Top
= 283
Width
= 248
Height
= 94
Brush.Color
= clBlack
end
object
Animate1: TAnimate
Left
= 24
Top
= 291
Width
= 60
Height
= 80
Active
= True
FileName
= 'Frage.avi'
StopFrame
= 31
Transparent
= False
end
end
object
sex2_RadioGroup: TRadioGroup
Left
= 185
Top
= 218
Width
= 77
Height
= 41
Caption
= 'Стать'
Columns
= 2
ItemIndex
= 0
Items.Strings
= (
'ч'
'ж')
TabOrder
= 4
end
object
chdp_ComboBox: TComboBox
Left
= 101
Top
= 40
Width
= 162
Height
= 22
Style
= csDropDownList
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clBlack
Font.Height
= -11
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ItemHeight
= 0
ParentFont
= False
TabOrder
= 0
end
object
chfam_Edit: TEdit
Left
= 101
Top
= 90
Width
= 162
Height
= 22
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clBlack
Font.Height
= -11
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
TabOrder
= 1
Text
= 'chfam_Edit'
end
object
chname_Edit: TEdit
Left
= 101
Top
= 140
Width
= 162
Height
= 22
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clBlack
Font.Height
= -11
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
TabOrder
= 2
Text
= 'chname_Edit'
end
object
chgrand_Edit: TEdit
Left
= 101
Top
= 190
Width
= 162
Height
= 22
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clBlack
Font.Height
= -11
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
TabOrder
= 3
Text
= 'chgrand_Edit'
end
object
chadd_Button: TButton
Left
= 88
Top
= 294
Width
= 169
Height
= 25
Hint
= 'Новая
запись'
Caption
= '&Додати'
ParentShowHint
= False
ShowHint
= True
TabOrder
= 5
OnClick
= chadd_ButtonClick
end
object
chdelete_Button: TButton
Left
= 88
Top
= 322
Width
= 169
Height
= 25
Hint
= 'Удаление
записи'
Caption
= '&Видалити'
ParentShowHint
= False
ShowHint
= True
TabOrder
= 6
OnClick
= chdelete_ButtonClick
end
object
chpost_Button: TButton
Left
= 88
Top
= 351
Width
= 169
Height
= 25
Hint
= 'Фиксация
изменений'
Caption
= '&Поновити'
ParentShowHint
= False
ShowHint
= True
TabOrder
= 7
OnClick
= chpost_ButtonClick
end
object
chyear_CSpinEdit: TCSpinEdit
Left
= 119
Top
= 233
Width
= 50
Height
= 23
TabStop
= True
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clBlack
Font.Height
= -11
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
MaxValue
= 2000
MinValue
= 1900
ParentColor
= False
ParentFont
= False
TabOrder
= 8
Value
= 1950
end
end
end
object
left_Panel: TPanel
Left
= 0
Top
= 0
Width
= 421
Height
= 428
Align
= alLeft
BevelInner
= bvLowered
Caption
= 'left_Panel'
TabOrder
= 1
object
find_TPanel: TPanel
Left
= 6
Top
= 5
Width
= 406
Height
= 420
Caption
= 'find_TPanel'
TabOrder
= 1
object
find_Label: TLabel
Left
= 110
Top
= 20
Width
= 265
Height
= 24
Alignment
= taCenter
Caption
= 'ПОШУК
СПІВРОБІТНИКІВ'
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clRed
Font.Height
= -21
Font.Name
= 'Arial Cyr'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
end
object
dp_GroupBox: TGroupBox
Left
= 8
Top
= 56
Width
= 393
Height
= 57
Caption
= ' Відділок
'
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clWindowText
Font.Height
= -13
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
TabOrder
= 0
object
dp_ComboBox: TComboBox
Left
= 8
Top
= 24
Width
= 177
Height
= 24
ItemHeight
= 16
Items.Strings
= (
'Бухгалтерия')
TabOrder
= 0
OnChange
= dp_ComboBoxChange
end
end
object
dp2_GroupBox: TGroupBox
Left
= 200
Top
= 66
Width
= 193
Height
= 41
Caption
= ' підрозділ
'
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clWindowText
Font.Height
= -13
Font.Name
= 'Times New Roman'
Font.Style
= [fsItalic]
ParentFont
= False
TabOrder
= 1
object
dp2_DBEdit: TDBEdit
Left
= 5
Top
= 15
Width
= 182
Height
= 23
Color
= clSilver
DataField
= 'PROISV'
DataSource
= dp_DataSource
Enabled
= False
TabOrder
= 0
end
end
object
pr_GroupBox: TGroupBox
Left
= 8
Top
= 115
Width
= 393
Height
= 226
Caption
= ' Співробітники
'
Font.Charset
= RUSSIAN_CHARSET
Font.Color
= clWindowText
Font.Height
= -13
Font.Name
= 'Times New Roman'
Font.Style
= [fsBold, fsItalic]
ParentFont
= False
TabOrder
= 2
object
Bevel1: TBevel
Left
= 10
Top
= 197
Width
= 41
Height
= 24
end
object
pr_Label: TLabel
Left
= 16
Top
= 201