Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase
Проектування дволанкової розподіленої інформаційної системи для роботи з БД із використанням SQL Interbase
Мета:
• створення БД;
• створення і використання індексів та переглядів БД;
• створення і використання тригерів, генераторів та збережених процедур на боці SQL-сервера;
• отримання практичних навичок обміну даними між прикладенням і БД.
Завдання:
Засобами SQL Interbase необхідно створити БД, декілька індексованих таблиць БД (головну і підлеглі) і декілька їх переглядів, а також зв’язати їх між собою.
Засобами С++Builder створити оригінальне(!) прикладення, яке повинне надавати мож-ливість:
• перегляду записів зв’язаних таблиць БД, у тому числі попередніх і наступних записів та із використанням створених переглядів;
• фільтрації записів БД із виведенням на екран записів, обраних у діалозі за вказаними критеріями;
• інкрементального пошуку даних у БД за вказаними критеріями;
• додавання і видалення записи таблиці БД, у тому числі із використанням створених на боці SQL-сервера тригерів, генераторів та збережених процедур;
• корегування полів поточного запису таблиці БД, у тому числі із використанням створе-ної на боці SQL-сервера збереженої процедури.
Вказівки до створення БД:
Для створення БД із використанням SQL Interbase необхідно:
• завантажити на виконання прикладення InterBase Windows ISQL, яке за звичай зберігає-ться за маршрутом "<диск>:Program FilesInterBase Corp InterBase Binwisql32.exe", наприклад, “E:Program FilesInterBase Corp InterBase Binwisql32.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:Lr2dbPdbP.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:Lr3dbPdbP.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:Lr3dbPdbP.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:Lr3dbPdbP.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:Lr3dbPdbP.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:Lr3dbPdbP.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:Lr3dbPdbP.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
Width = 29
Height = 16
Alignment = taCenter
AutoSize = False
end
end
object find_Animate: TAnimate
Left = 32
Top = 8
Width = 48
Height = 45
Active = True
CommonAVI = aviFindComputer
StopFrame = 8
end
object GroupBox1: TGroupBox
Left = 8
Top = 340
Width = 393
Height = 77
Caption = 'Поточний оператор SQL'
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Times New Roman'
Font.Style = [fsBold, fsItalic]
ParentFont = False
TabOrder = 4
object sql_Label: TLabel
Left = 11
Top = 16
Width = 372
Height = 57
AutoSize = False
Color = clBtnFace
Font.Charset = RUSSIAN_CHARSET
Font.Color = clRed
Font.Height = -13
Font.Name = 'Times New Roman'
Font.Style = [fsBold, fsItalic]
ParentColor = False
ParentFont = False
WordWrap = True
end
end
end
object pr_DBGrid: TDBGrid
Left = 22
Top = 144
Width = 379
Height = 169
DataSource = pr_DataSource
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Times New Roman'
Font.Style = [fsItalic]
Options = [dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit]
ParentFont = False
TabOrder = 0
TitleFont.Charset = RUSSIAN_CHARSET
TitleFont.Color = clWindowText