Рефетека.ру / Информатика и програм-ие

Лабораторная работа: Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням 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, в якому набрано скрипт для створення таблиць БД;


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL InterbaseПроектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

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


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.3

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.4


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 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)

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 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):


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 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;


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 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.


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.10

Вказівки до створення першого прикладення:

Для маніпулювання таблицями треба створити проект прикладення (мал. 1.11).


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.11


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


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.12


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 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

TitleFont.Height = -11

TitleFont.Name = 'Times New Roman'

TitleFont.Style = [fsItalic]

OnCellClick = pr_DBGridCellClick

Columns = <

item

Expanded = False

FieldName = 'FAM'

Title.Caption = 'Прізвище'

Width = 59

Visible = True

end

item

Expanded = False

FieldName = 'NAM'

Title.Caption = 'ім'#39'я'

Width = 57

Visible = True

end

item

Expanded = False

FieldName = 'PAR'

Title.Caption = 'по батькові'

Width = 67

Visible = True

end

item

Alignment = taCenter

Expanded = False

FieldName = 'YEAR_B'

Title.Caption = 'рік народження'

Width = 85

Visible = True

end

item

Alignment = taCenter

Expanded = False

FieldName = 'SEX'

Title.Caption = 'стать'

Visible = True

end

item

Expanded = False

FieldName = 'AGE'

Title.Caption = 'вік'

Width = 38

Visible = True

end

item

Expanded = False

FieldName = 'CHARACT'

Title.Caption = 'характеристика'

Visible = True

end

item

Expanded = False

FieldName = 'PHOTO'

Title.Caption = 'фото'

Visible = True

end>

end

object pr_Button: TButton

Left = 326

Top = 319

Width = 75

Height = 20

Hint = 'Характеристика, фотография'

Caption = '&Більше ...'

Font.Charset = RUSSIAN_CHARSET

Font.Color = clWindowText

Font.Height = -13

Font.Name = 'Times New Roman'

Font.Style = [fsBold, fsItalic]

ParentFont = False

ParentShowHint = False

ShowHint = True

TabOrder = 2

OnClick = pr_ButtonClick

end

object pr_DBNavigator: TDBNavigator

Left = 73

Top = 319

Width = 244

Height = 20

DataSource = pr_DataSource

VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast]

TabOrder = 3

end

end

object dp_DataSource: TDataSource

DataSet = dp_Query

Left = 140

Top = 55

end

object pr_DataSource: TDataSource

DataSet = pr_Query

Left = 298

Top = 268

end

object dp_Query: TQuery

DatabaseName = 'dbP'

RequestLive = True

SQL.Strings = (

'Select * from Dep where DEP = :PDEP')

Left = 169

Top = 55

ParamData = <

item

DataType = ftString

Name = 'PDEP'

ParamType = ptUnknown

end>

object dp_QueryDEP: TStringField

FieldName = 'DEP'

Origin = 'DEP.DEP'

Size = 15

end

object dp_QueryPROISV: TStringField

FieldName = 'PROISV'

Origin = 'DEP.PROISV'

Size = 15

end

end

object update_Query: TQuery

DatabaseName = 'dbP'

DataSource = pr_DataSource

RequestLive = True

Left = 356

Top = 268

end

object pr_Query: TQuery

BeforePost = pr_QueryBeforePost

AfterScroll = pr_QueryAfterScroll

OnCalcFields = pr_QueryCalcFields

DatabaseName = 'dbP'

RequestLive = True

SQL.Strings = (

'Select * from Pers where DEP = :DEP order by FAM,NAM,PAR')

Left = 327

Top = 268

ParamData = <

item

DataType = ftString

Name = 'DEP'

ParamType = ptUnknown

end>

object pr_QueryNUM: TSmallintField

FieldName = 'NUM'

Origin = 'PERS.NUM'

end

object pr_QueryDEP: TStringField

FieldName = 'DEP'

Origin = 'PERS.DEP'

Size = 15

end

object pr_QueryFAM: TStringField

FieldName = 'FAM'

Origin = 'PERS.FAM'

end

object pr_QueryNAM: TStringField

FieldName = 'NAM'

Origin = 'PERS.NAM'

end

object pr_QueryPAR: TStringField

FieldName = 'PAR'

Origin = 'PERS.PAR'

end

object pr_QueryYEAR_B: TSmallintField

FieldName = 'YEAR_B'

Origin = 'PERS.YEAR_B'

end

object pr_QuerySEX: TStringField

FieldName = 'SEX'

Origin = 'PERS.SEX'

Size = 1

end

object pr_QueryCHARACT: TBlobField

FieldName = 'CHARACT'

Origin = 'PERS.CHARACT'

BlobType = ftMemo

Size = 1

end

object pr_QueryPHOTO: TBlobField

FieldName = 'PHOTO'

Origin = 'PERS.PHOTO'

BlobType = ftGraphic

Size = 1

end

object pr_QueryAGE: TSmallintField

Alignment = taCenter

DisplayLabel = 'Возраст'

DisplayWidth = 7

FieldKind = fkCalculated

FieldName = 'AGE'

Calculated = True

end

end

end


Підлеглу форму character_Form наведено на мал. 1.14.

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.14


Текстовий опис цієї форми наведено нижче:


object character_Form: Tcharacter_Form

Left = 237

Top = 95

Width = 318

Height = 226

Caption = 'Характеристика'

Color = clBtnFace

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'MS Sans Serif'

Font.Style = []

FormStyle = fsStayOnTop

OldCreateOrder = True

Position = poDefaultPosOnly

PixelsPerInch = 96

TextHeight = 13

object character_DBMemo: TDBMemo

Left = 0

Top = 0

Width = 195

Height = 194

Align = alClient

Alignment = taCenter

DataField = 'Charact'

DataSource = main_Form.pr_DataSource

ScrollBars = ssVertical

TabOrder = 0

end

object PPhoto: TPanel

Left = 195

Top = 0

Width = 115

Height = 194

Align = alRight

Caption = 'PPhoto'

TabOrder = 1

object photo_DBImage: TDBImage

Left = 5

Top = 42

Width = 105

Height = 105

DataField = 'Photo'

DataSource = main_Form.pr_DataSource

TabOrder = 0

end

end

end


Для функціонування прикладення розроблено програму:


Файл Udb.h


#ifndef UdbH

#define UdbH

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include <DBCtrls.hpp>

#include <DBGrids.hpp>

#include <ExtCtrls.hpp>

#include <Grids.hpp>

#include <Mask.hpp>

#include <Db.hpp>

#include <DBTables.hpp>

#include "cspin.h"

#include "CSPIN.h"

#include <jpeg.hpp>

#include <Buttons.hpp>

#include <Graphics.hpp>

class Tmain_Form : public TForm

{

__published: // IDE-managed Components

TPageControl *PageControl;

TTabSheet *find_TabSheet;

TRadioGroup *sex_RadioGroup;

TEdit *speedfind_Edit;

TDataSource *dp_DataSource;

TDataSource *pr_DataSource;

TTabSheet *TabEdit;

TComboBox *chdp_ComboBox;

TEdit *chfam_Edit;

TEdit *chname_Edit;

TEdit *chgrand_Edit;

TRadioGroup *sex2_RadioGroup;

TButton *chadd_Button;

TButton *chdelete_Button;

TButton *chpost_Button;

TCSpinEdit *chyear_CSpinEdit;

TCSpinEdit *minage_CSpinEdit;

TCSpinEdit *maxage_CSpinEdit;

TPanel *left_Panel;

TPanel *find_TPanel;

TLabel *find_Label;

TGroupBox *dp_GroupBox;

TGroupBox *dp2_GroupBox;

TGroupBox *pr_GroupBox;

TDBGrid *pr_DBGrid;

TButton *pr_Button;

TDBNavigator *pr_DBNavigator;

TGroupBox *ch_GroupBox;

TLabel *chdp_Label;

TLabel *chname_Label;

TLabel *chgrand_Label;

TLabel *chyear_Label;

TLabel *chfam_Label;

TGroupBox *age_GroupBox;

TLabel *minage_Label;

TLabel *maxage_Label;

TGroupBox *speedfind_GroupBox;

TLabel *speedfind_Label;

TImage *speedfind_Image;

TImage *minage_Image;

TImage *maxage_Image;

TAnimate *find_Animate;

TBitBtn *select_BitBtn;

TGroupBox *select_GroupBox;

TQuery *dp_Query;

TQuery *update_Query;

TQuery *pr_Query;

TComboBox *dp_ComboBox;

TDBEdit *dp2_DBEdit;

TStringField *dp_QueryDEP;

TStringField *dp_QueryPROISV;

TSmallintField *pr_QueryNUM;

TStringField *pr_QueryDEP;

TStringField *pr_QueryFAM;

TStringField *pr_QueryNAM;

TStringField *pr_QueryPAR;

TSmallintField *pr_QueryYEAR_B;

TStringField *pr_QuerySEX;

TBlobField *pr_QueryCHARACT;

TBlobField *pr_QueryPHOTO;

TSmallintField *pr_QueryAGE;

TLabel *pr_Label;

TBevel *Bevel1;

TGroupBox *GroupBox1;

TLabel *sql_Label;

TAnimate *Animate1;

TBevel *oper_Bevel;

TShape *oper_Shape;

TImage *Image1;

void __fastcall FormCreate(TObject *Sender);

void __fastcall dp_ComboBoxChange(TObject *Sender);

void __fastcall pr_ButtonClick(TObject *Sender);

void __fastcall speedfind_EditChange(TObject *Sender);


void __fastcall pr_QueryCalcFields(TDataSet *DataSet);

void __fastcall pr_QueryAfterScroll(TDataSet *DataSet);

void __fastcall pr_QueryBeforePost(TDataSet *DataSet);

void __fastcall chadd_ButtonClick(TObject *Sender);

void __fastcall chdelete_ButtonClick(TObject *Sender);

void __fastcall chpost_ButtonClick(TObject *Sender);

void __fastcall PageControlChange(TObject *Sender);

void __fastcall minage_CSpinEditChange(TObject *Sender);

void __fastcall select_BitBtnClick(TObject *Sender);

void __fastcall pr_DBGridCellClick(TColumn *Column);

private: // User declarations

public: // User declarations

__fastcall Tmain_Form(TComponent* Owner);

unsigned short Year;

unsigned short Month;

unsigned short Day;

bool CanPost;

int AllPers, CurrentPers;

AnsiString sql_Operator;

void __fastcall Delay(unsigned long int mSeconds);

};

extern PACKAGE Tmain_Form *main_Form;

#endif


Файл Udb.cpp


#include <vcl.h>

#pragma hdrstop

#include "Udb.h"

#include "Udba.h"

#pragma package(smart_init)

#pragma link "cspin"

#pragma link "CSPIN"

#pragma resource "*.dfm"


Tmain_Form *main_Form;

__fastcall Tmain_Form::Tmain_Form(TComponent* Owner)

: TForm(Owner)

{}

void __fastcall Tmain_Form::FormCreate(TObject *Sender)

{

CanPost = false;

Date().DecodeDate(&Year,&Month,&Day);


// підрахування кількості записів у таблиці PERS

pr_Query->SQL->Clear();

sql_Operator = "Select * from PERS order by NUM";

sql_Label->Caption = sql_Operator;

pr_Query->SQL->Add(sql_Operator);

pr_Query->Open();

pr_Query->First();

AllPers = 0;

while (!pr_Query->Eof) {

++AllPers;

pr_Query->Next();

}

pr_Query->First();


dp_Query->SQL->Clear();

sql_Operator = "Select * from DEP";

sql_Label->Caption = sql_Operator;

dp_Query->SQL->Add(sql_Operator);

dp_Query->Open();

dp_Query->First();


// Заповнення ComboBox dp_ComboBox та chdp_ComboBox наймуваннями відділків

dp_ComboBox->Clear();

chdp_ComboBox->Clear();

while (!dp_Query->Eof) {

dp_ComboBox->Items->Add(dp_QueryDEP->AsString);

chdp_ComboBox->Items->Add(dp_QueryDEP->AsString);

dp_Query->Next();

}

dp_ComboBox->Items->Add("усі відділки");

dp_ComboBox->ItemIndex = dp_ComboBox->Items->Count - 1;

dp_ComboBoxChange(Sender);

chdp_ComboBox->ItemIndex = dp_ComboBox->ItemIndex;

PageControl->ActivePage = find_TabSheet;

}

void __fastcall Tmain_Form::dp_ComboBoxChange(TObject *Sender)

{

dp_Query->Close();

dp_Query->SQL->Clear();

sql_Operator = "Select * from DEP where DEP=:PDEP";

sql_Label->Caption = sql_Operator;

Delay(5000);

dp_Query->SQL->Add(sql_Operator);

dp_Query->Params->Items[0]->AsString = dp_ComboBox->Text;

dp_Query->Open();

dp_Query->First();


pr_Query->Close();

pr_Query->SQL->Clear();

if (dp_ComboBox->ItemIndex == dp_ComboBox->Items->Count - 1) {

sql_Operator = "Select * from PERS order by NUM";

sql_Label->Caption = sql_Operator;

Delay(5000);

pr_Query->SQL->Add(sql_Operator);

} else {

sql_Operator = "Select * from PERS where DEP = :DEP order by NUM";

sql_Label->Caption = sql_Operator;

Delay(5000);

pr_Query->SQL->Add(sql_Operator);

pr_Query->Params->Items[0]->AsString = dp_ComboBox->Text;

}

pr_Query->ExecSQL();

pr_Query->Open();

pr_Query->First();

}

void __fastcall Tmain_Form::pr_ButtonClick(TObject *Sender)

{

if (!character_Form->Visible) character_Form->Show();

}

void __fastcall Tmain_Form::speedfind_EditChange(TObject *Sender)

{

TLocateOptions SearchOptions;

pr_Query->Locate("FAM", speedfind_Edit->Text,

SearchOptions << loPartialKey << loCaseInsensitive);

}

void __fastcall Tmain_Form::pr_QueryCalcFields(TDataSet *DataSet)

{

pr_QueryAGE->Value = Year - pr_QueryYEAR_B->Value;

}

void __fastcall Tmain_Form::pr_QueryAfterScroll(TDataSet *DataSet)

{

// поточна персона

CurrentPers = pr_QueryNUM->AsInteger;

pr_Label->Caption = IntToStr(CurrentPers);


if (PageControl->ActivePage == TabEdit) {

// відображення даних про поточну персону

chdp_ComboBox -> ItemIndex =

chdp_ComboBox->Items->IndexOf(pr_QueryDEP->AsString);

chfam_Edit->Text = pr_QueryFAM->AsString;

chname_Edit->Text = pr_QueryNAM->AsString;

chgrand_Edit->Text = pr_QueryPAR->AsString;

chyear_CSpinEdit->Value = pr_QueryYEAR_B->AsInteger;

if (pr_QuerySEX->AsString == "ч") sex2_RadioGroup->ItemIndex = 0;

else sex2_RadioGroup->ItemIndex = 1;

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_QueryBeforePost(TDataSet *DataSet)

{

if (!CanPost) {

DataSet->Cancel();

Abort;

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::chadd_ButtonClick(TObject *Sender)

{ // додавання запису до таблиці PERS

AnsiString NewSex; // визначення статі

if (sex2_RadioGroup->ItemIndex == 0) NewSex = "ч";

else NewSex = "ж";


update_Query->Close();

update_Query->SQL->Clear();

sql_Operator = "Insert into PERS (DEP,FAM,NAM,PAR,YEAR_B,SEX,NUM) values ('"

+ chdp_ComboBox->Text + "','"

+ chfam_Edit->Text + "','"

+ chname_Edit->Text + "','"

+ chgrand_Edit->Text + "','"

+ IntToStr((int)chyear_CSpinEdit->Value) + "','"

+ NewSex + "','"

+ IntToStr(++AllPers) + "')"; // збільшення кількості записів у таблиці PERS

sql_Label->Caption = sql_Operator;

Delay(5000);

update_Query->SQL->Add(sql_Operator);

update_Query->ExecSQL(); // додавання запису

pr_Query->Close(); // поновлення відображення даних таблиці PERS

pr_Query->Open();


PageControlChange(Sender);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::chdelete_ButtonClick(TObject *Sender)

{ // видалення поточного запису з таблиці PERS

if (Application->MessageBox("Ви дійсно бажаєте видалити поточний запис?",

"Підтвердіть видалення запису",

MB_YESNO + MB_ICONEXCLAMATION) == IDYES)

update_Query->Close();

update_Query->SQL->Clear();

sql_Operator = "Delete from PERS where NUM = " + IntToStr(CurrentPers);

sql_Label->Caption = sql_Operator;

Delay(5000);

update_Query->SQL->Add(sql_Operator);

update_Query->ExecSQL(); // видалення запису


pr_Query->Close(); // поновлення відображення даних талиці PERS

pr_Query->Open();

--AllPers; // зменшення кількості записів у таблиці PERS

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::chpost_ButtonClick(TObject *Sender)

{

AnsiString s, sSQL;

const AnsiString s1 = ",";

s = "";

sSQL = "Update PERS set ";

if (pr_QueryDEP->AsString != chdp_ComboBox->Text) {

s = "відділок";

sSQL += "DEP='" + chdp_ComboBox->Text + "'";

}

if (pr_QueryCHARACT->AsString != chfam_Edit->Text) {

if (s != "") { s += s1; sSQL += s1; }

s += " прізвище";

sSQL += "FAM='" + chfam_Edit->Text + "'";

}

if (pr_QueryCHARACT->AsString != chname_Edit->Text) {

if (s != "") { s += s1; sSQL += s1; }

s += " ім'я";

sSQL += "NAM='" + chname_Edit->Text+"'";

}

if (pr_QueryCHARACT->AsString != chgrand_Edit->Text) {

if (s != "") { s += s1; sSQL += s1; }

s += " по батькові";

sSQL += "PAR='" + chgrand_Edit->Text + "'";

}

if (pr_QueryYEAR_B->AsInteger != chyear_CSpinEdit->Value) {

if (s != "") { s += s1; sSQL += s1; }

s += " рік народження";

sSQL += "YEAR_B='" + IntToStr((int)(chyear_CSpinEdit->Value));

}

if (pr_QuerySEX->AsBoolean != (sex2_RadioGroup->ItemIndex == 0)) {

if (s != "") { s += s1; sSQL += s1; }

s += " стать";

sSQL += "SEX='";

if(sex2_RadioGroup->ItemIndex == 0) sSQL += "ч'";

else sSQL += "ж'";

}


if (s != "")

if (Application->MessageBox(

("Дійсно бажаєте змінити " + s + "?").c_str(),

"Підтвердіть занесення змін у базу даних",

MB_YESNO + MB_ICONQUESTION) == IDYES)

{ update_Query->Close();

update_Query->SQL->Clear();

sql_Operator = sSQL + " where NUM=" + IntToStr(pr_QueryNUM->AsInteger);

sql_Label->Caption = sql_Operator;

Delay(5000);

update_Query->SQL->Add(sql_Operator);

update_Query->ExecSQL();

pr_Query->Close();

pr_Query->Open();

CanPost = false;

};

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::PageControlChange(TObject *Sender)

{

character_Form->character_DBMemo->ReadOnly =

!(PageControl->ActivePage == TabEdit);

if (PageControl->ActivePage == TabEdit) pr_QueryAfterScroll(pr_Query);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::minage_CSpinEditChange(TObject *Sender)

{

AnsiString s =

"(YEAR_B<=" + IntToStr(int(Year - minage_CSpinEdit->Value)) +

")and(YEAR_B>=" + IntToStr(int(Year - maxage_CSpinEdit->Value)) +

")and(SEX=";

if (!sex_RadioGroup->ItemIndex) s += "'ч')";

else s += "'ж')";


// автоматичне поновлення відбору записів

select_BitBtn->Kind = bkCancel;

select_BitBtn->Caption = "Відмінити відбір";

pr_Query->Filter = s;

pr_Query->Filtered = true;

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::select_BitBtnClick(TObject *Sender)

{

if (pr_Query->Filtered) { // відміна режиму фільтрації

pr_Query->Filtered = false;

select_BitBtn->Kind = bkYes;

select_BitBtn->Caption = "Поновити відбір";

} else { // встановлення режиму фільтрації

select_BitBtn->Kind = bkCancel;

select_BitBtn->Caption = "Відмінити відбір";

minage_CSpinEditChange(Sender);

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_DBGridCellClick(TColumn *Column)

{

if (PageControl->ActivePage == TabEdit) {

chdp_ComboBox -> ItemIndex =

chdp_ComboBox->Items->IndexOf(pr_QueryDEP->AsString);

chfam_Edit->Text = pr_QueryFAM->AsString;

chname_Edit->Text = pr_QueryNAM->AsString;

chgrand_Edit->Text = pr_QueryPAR->AsString;

chyear_CSpinEdit->Value = pr_QueryYEAR_B->AsInteger;

if (pr_QuerySEX->AsString == "ч") sex2_RadioGroup->ItemIndex = 0;

else sex2_RadioGroup->ItemIndex = 1;

}


// поточна персона

CurrentPers = pr_QueryNUM->AsInteger;

pr_Label->Caption = IntToStr(CurrentPers);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::Delay(unsigned long int mSeconds)

{ // затримка на декілька мілісекунд

unsigned long int FirstTick;


FirstTick = GetTickCount();

do

Application->ProcessMessages();

while (GetTickCount() - FirstTick <= mSeconds);

}


Файл Udba.h


//---------------------------------------------------------------------------

#ifndef UdbaH

#define UdbaH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <DBCtrls.hpp>

#include <ExtCtrls.hpp>

//---------------------------------------------------------------------------

class Tcharacter_Form : public TForm

{

__published: // IDE-managed Components

TDBMemo *character_DBMemo;

TPanel *PPhoto;

TDBImage *photo_DBImage;

private: // User declarations

public: // User declarations

__fastcall Tcharacter_Form(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE Tcharacter_Form *character_Form;

//---------------------------------------------------------------------------

#endif


Файл Udba.cpp


//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop


#include "Udba.h"

#include "Udb.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

Tcharacter_Form *character_Form;

//---------------------------------------------------------------------------

__fastcall Tcharacter_Form::Tcharacter_Form(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

Для виконання прикладення треба попередньо завантажити на виконання прикладення-сервер IBServer.EXE, яке за звичай знаходиться за маршрутом "E:\Program Files\InterBase Corp\InterBase\Bin\" і обслуговує запити до бази даних Interbase. Після завантаження поточ-ного проекту на виконання цей сервер виводить на екран запит (мал.. 1.15) , у полі Password: якого треба ввести пароль доступу masterkey..


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.15


Форми під час функціонування прикладення наведено на мал. 1.16 - 1.18.


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.16

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.17


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.18


Вказівки до створення другого прикладення: Для маніпулювання таблицями можна використати корегований проект попереднього прикладення (мал. 1.19).


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.19

Головну форму main_Form наведено на мал. 1.20.

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.20


Текстовий опис форми main_Form:

object main_Form: Tmain_Form

Left = 63

Top = 22

Width = 709

Height = 461

Caption = 'Лабораторна робота 3'

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 = 429

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 = 50

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 = 310

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 = 14

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 = 429

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 = 109

Top = 16

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 = 48

Width = 393

Height = 65

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 = 14

Top = 22

Width = 155

Height = 24

ItemHeight = 16

Items.Strings = (

'Бухгалтерия')

TabOrder = 0

OnChange = dp_ComboBoxChange

end

end

object dp2_GroupBox: TGroupBox

Left = 216

Top = 58

Width = 169

Height = 46

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 = 156

Height = 23

Color = clSilver

DataField = 'PROISV'

DataSource = dp_DataSource

Enabled = False

TabOrder = 0

end

end

object pr_GroupBox: TGroupBox

Left = 8

Top = 113

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 pr_Panel: TPanel

Left = 9

Top = 196

Width = 66

Height = 26

TabOrder = 0

object pr_Label: TLabel

Left = 9

Top = 3

Width = 47

Height = 20

Alignment = taCenter

AutoSize = False

Caption = '1'

Font.Charset = RUSSIAN_CHARSET

Font.Color = clRed

Font.Height = -13

Font.Name = 'Times New Roman'

Font.Style = [fsBold, fsItalic]

ParentFont = False

Layout = tlCenter

end

end

end

object find_Animate: TAnimate

Left = 40

Top = 4

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 = 136

Width = 378

Height = 173

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

TitleFont.Height = -11

TitleFont.Name = 'Times New Roman'

TitleFont.Style = [fsItalic]

OnCellClick = pr_DBGridCellClick

OnKeyDown = pr_DBGridKeyDown

Columns = <

item

Expanded = False

FieldName = 'FAM'

Title.Caption = 'Прізвище'

Width = 59

Visible = True

end

item

Expanded = False

FieldName = 'NAM'

Title.Caption = 'ім'#39'я'

Width = 57

Visible = True

end

item

Expanded = False

FieldName = 'PAR'

Title.Caption = 'по батькові'

Width = 67

Visible = True

end

item

Alignment = taCenter

Expanded = False

FieldName = 'YEAR_B'

Title.Caption = 'рік народження'

Width = 85

Visible = True

end

item

Alignment = taCenter

Expanded = False

FieldName = 'SEX'

Title.Caption = 'стать'

Visible = True

end

item

Expanded = False

FieldName = 'AGE'

Title.Caption = 'вік'

Width = 38

Visible = True

end

item

Expanded = False

FieldName = 'CHARACT'

Title.Caption = 'характеристика'

Visible = True

end

item

Expanded = False

FieldName = 'PHOTO'

Title.Caption = 'фото'

Visible = True

end>

end

object pr_DBNavigator: TDBNavigator

Left = 96

Top = 320

Width = 304

Height = 18

DataSource = pr_DataSource

VisibleButtons = [nbFirst, nbPrior, nbNext, nbLast]

TabOrder = 2

end

end

object dp_DataSource: TDataSource

DataSet = dp_Query

Left = 110

Top = 58

end

object pr_DataSource: TDataSource

DataSet = pr_Query

Left = 213

Top = 263

end

object dp_Query: TQuery

DatabaseName = 'dbP'

RequestLive = True

SQL.Strings = (

'Select * from Dep where DEP = :PDEP')

Left = 139

Top = 58

ParamData = <

item

DataType = ftString

Name = 'PDEP'

ParamType = ptUnknown

end>

object dp_QueryDEP: TStringField

FieldName = 'DEP'

Origin = 'DEP.DEP'

Size = 15

end

object dp_QueryPROISV: TStringField

FieldName = 'PROISV'

Origin = 'DEP.PROISV'

Size = 15

end

end

object update_Query: TQuery

DatabaseName = 'dbP'

DataSource = pr_DataSource

RequestLive = True

Left = 271

Top = 263

end

object pr_Query: TQuery

ObjectView = True

BeforePost = pr_QueryBeforePost

AfterScroll = pr_QueryAfterScroll

OnCalcFields = pr_QueryCalcFields

DatabaseName = 'dbP'

RequestLive = True

SQL.Strings = (

'Select * from Pers where DEP = :DEP order by FAM,NAM,PAR')

Left = 242

Top = 263

ParamData = <

item

DataType = ftString

Name = 'DEP'

ParamType = ptUnknown

end>

object pr_QueryNUM: TSmallintField

FieldName = 'NUM'

Origin = 'PERS.NUM'

end

object pr_QueryDEP: TStringField

FieldName = 'DEP'

Origin = 'PERS.DEP'

Size = 15

end

object pr_QueryFAM: TStringField

FieldName = 'FAM'

Origin = 'PERS.FAM'

end

object pr_QueryNAM: TStringField

FieldName = 'NAM'

Origin = 'PERS.NAM'

end

object pr_QueryPAR: TStringField

FieldName = 'PAR'

Origin = 'PERS.PAR'

end

object pr_QueryYEAR_B: TSmallintField

FieldName = 'YEAR_B'

Origin = 'PERS.YEAR_B'

end

object pr_QuerySEX: TStringField

FieldName = 'SEX'

Origin = 'PERS.SEX'

Size = 1

end

object pr_QueryAGE: TSmallintField

Alignment = taCenter

DisplayLabel = 'Возраст'

DisplayWidth = 7

FieldKind = fkCalculated

FieldName = 'AGE'

Calculated = True

end

end

object insert_StoredProc: TStoredProc

ObjectView = True

DatabaseName = 'dbP'

StoredProcName = 'INSERTDBP'

Left = 308

Top = 263

ParamData = <

item

DataType = ftString

Name = 'PDEP'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PFAM'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PNAM'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PPAR'

ParamType = ptInput

end

item

DataType = ftInteger

Name = 'PYEAR_B'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PSEX'

ParamType = ptInput

end>

end

object update_StoredProc: TStoredProc

ObjectView = True

DatabaseName = 'dbP'

StoredProcName = 'UPDATEDBP'

Left = 366

Top = 263

ParamData = <

item

DataType = ftString

Name = 'PDEP'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PFAM'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PNAM'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PPAR'

ParamType = ptInput

end

item

DataType = ftInteger

Name = 'PYEAR_B'

ParamType = ptInput

end

item

DataType = ftString

Name = 'PSEX'

ParamType = ptInput

end

item

DataType = ftInteger

Name = 'NUMBER'

ParamType = ptOutput

end>

end

object delete_StoredProc: TStoredProc

ObjectView = True

DatabaseName = 'dbP'

StoredProcName = 'DELETEDBP'

Left = 337

Top = 263

ParamData = <

item

DataType = ftInteger

Name = 'PNUM'

ParamType = ptInput

end>

end

end


Для функціонування прикладення розроблено програму:


Файл Udb.h


//---------------------------------------------------------------------------

#ifndef UdbH

#define UdbH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include <DBCtrls.hpp>

#include <DBGrids.hpp>

#include <ExtCtrls.hpp>

#include <Grids.hpp>

#include <Mask.hpp>

#include <Db.hpp>

#include <DBTables.hpp>

#include "cspin.h"

#include "CSPIN.h"

#include <jpeg.hpp>

#include <Buttons.hpp>

#include <Graphics.hpp>

//---------------------------------------------------------------------------

class Tmain_Form : public TForm

{

__published: // IDE-managed Components

TPageControl *PageControl;

TTabSheet *find_TabSheet;

TRadioGroup *sex_RadioGroup;

TEdit *speedfind_Edit;

TDataSource *dp_DataSource;

TDataSource *pr_DataSource;

TTabSheet *TabEdit;

TComboBox *chdp_ComboBox;

TEdit *chfam_Edit;

TEdit *chname_Edit;

TEdit *chgrand_Edit;

TRadioGroup *sex2_RadioGroup;

TButton *chadd_Button;

TButton *chdelete_Button;

TButton *chpost_Button;

TCSpinEdit *chyear_CSpinEdit;

TCSpinEdit *minage_CSpinEdit;

TCSpinEdit *maxage_CSpinEdit;

TPanel *left_Panel;

TPanel *find_TPanel;

TLabel *find_Label;

TGroupBox *dp_GroupBox;

TGroupBox *dp2_GroupBox;

TGroupBox *pr_GroupBox;

TDBGrid *pr_DBGrid;

TDBNavigator *pr_DBNavigator;

TGroupBox *ch_GroupBox;

TLabel *chdp_Label;

TLabel *chname_Label;

TLabel *chgrand_Label;

TLabel *chyear_Label;

TLabel *chfam_Label;

TGroupBox *age_GroupBox;

TLabel *minage_Label;

TLabel *maxage_Label;

TGroupBox *speedfind_GroupBox;

TLabel *speedfind_Label;

TImage *speedfind_Image;

TImage *minage_Image;

TImage *maxage_Image;

TAnimate *find_Animate;

TBitBtn *select_BitBtn;

TGroupBox *select_GroupBox;

TQuery *dp_Query;

TQuery *update_Query;

TComboBox *dp_ComboBox;

TDBEdit *dp2_DBEdit;

TStringField *dp_QueryDEP;

TStringField *dp_QueryPROISV;

TGroupBox *GroupBox1;

TLabel *sql_Label;

TAnimate *Animate1;

TBevel *oper_Bevel;

TShape *oper_Shape;

TImage *Image1;

TQuery *pr_Query;

TSmallintField *pr_QueryNUM;

TStringField *pr_QueryDEP;

TStringField *pr_QueryFAM;

TStringField *pr_QueryNAM;

TStringField *pr_QueryPAR;

TSmallintField *pr_QueryYEAR_B;

TStringField *pr_QuerySEX;

TSmallintField *pr_QueryAGE;

TStoredProc *insert_StoredProc;

TStoredProc *update_StoredProc;

TStoredProc *delete_StoredProc;

TPanel *pr_Panel;

TLabel *pr_Label;

void __fastcall FormCreate(TObject *Sender);

void __fastcall dp_ComboBoxChange(TObject *Sender);

void __fastcall speedfind_EditChange(TObject *Sender);

void __fastcall pr_QueryCalcFields(TDataSet *DataSet);

void __fastcall pr_QueryAfterScroll(TDataSet *DataSet);

void __fastcall pr_QueryBeforePost(TDataSet *DataSet);

void __fastcall chadd_ButtonClick(TObject *Sender);

void __fastcall chdelete_ButtonClick(TObject *Sender);

void __fastcall chpost_ButtonClick(TObject *Sender);

void __fastcall PageControlChange(TObject *Sender);

void __fastcall minage_CSpinEditChange(TObject *Sender);

void __fastcall select_BitBtnClick(TObject *Sender);

void __fastcall pr_DBGridCellClick(TColumn *Column);

void __fastcall prview_RadioGroupClick(TObject *Sender);

void __fastcall pr_DBGridKeyDown(TObject *Sender, WORD &Key,

TShiftState Shift);

private:// User declarations

public:// User declarations

fastcall Tmain_Form(TComponent* Owner);

unsigned short Year;

unsigned short Month;

unsigned short Day;

bool CanPost;

AnsiString sql_Operator;

void __fastcall Delay(unsigned long int mSeconds);

};

//---------------------------------------------------------------------------

extern PACKAGE Tmain_Form *main_Form;

//---------------------------------------------------------------------------

#endif

Файл Udb.cpp


#include <vcl.h>

#pragma hdrstop

#include "Udb.h"

#pragma package(smart_init)

#pragma link "cspin"

#pragma link "CSPIN"

#pragma resource "*.dfm"


Tmain_Form *main_Form;

fastcall Tmain_Form::Tmain_Form(TComponent* Owner)

TForm(Owner)

{}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::FormCreate(TObject *Sender)

{

CanPost = false;

Date().DecodeDate(&Year,&Month,&Day);


pr_Query->SQL->Clear();

sql_Operator = "Select * from PERS order by NUM";

sql_Label->Caption = sql_Operator;

pr_Query->SQL->Add(sql_Operator);

pr_Query->Open();

pr_Query->First();


dp_Query->SQL->Clear();

sql_Operator = "Select * from DEP";

sql_Label->Caption = sql_Operator;

dp_Query->SQL->Add(sql_Operator);

dp_Query->Open();

dp_Query->First();


// Заповнення ComboBox dp_ComboBox та chdp_ComboBox наймуваннями відділків

dp_ComboBox->Clear();

chdp_ComboBox->Clear();

while (!dp_Query->Eof) {

dp_ComboBox->Items->Add(dp_QueryDEP->AsString);

chdp_ComboBox->Items->Add(dp_QueryDEP->AsString);

dp_Query->Next();

}

dp_ComboBox->Items->Add("усі відділки");

dp_ComboBox->ItemIndex = dp_ComboBox->Items->Count - 1;

dp_ComboBoxChange(Sender);

chdp_ComboBox->ItemIndex = dp_ComboBox->ItemIndex;


PageControl->ActivePage = find_TabSheet;

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::dp_ComboBoxChange(TObject *Sender)

{

dp_Query->Close();

dp_Query->SQL->Clear();

sql_Operator = "Select * from DEP where DEP=:PDEP";

sql_Label->Caption = sql_Operator;

Delay(3000);

dp_Query->SQL->Add(sql_Operator);

dp_Query->Params->Items[0]->AsString = dp_ComboBox->Text;

dp_Query->Open();

dp_Query->First();


pr_Query->Close();

pr_Query->SQL->Clear();


if (dp_ComboBox->ItemIndex == dp_ComboBox->Items->Count - 1) {

// показ всіх записів

sql_Operator = "Select * from PERS order by NUM";

sql_Label->Caption = sql_Operator;

Delay(3000);

pr_Query->SQL->Add(sql_Operator);

} else {

// показ записів за переглядами

sql_Operator =

"Select * from DEP_" + AnsiString(dp_ComboBox->ItemIndex + 1);

sql_Label->Caption = sql_Operator;

Delay(3000);

pr_Query->SQL->Add(sql_Operator);

}


pr_Query->ExecSQL();

pr_Query->Open();

pr_Query->First();

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::speedfind_EditChange(TObject *Sender)

{

TLocateOptions SearchOptions;

pr_Query->Locate("FAM", speedfind_Edit->Text,

SearchOptions << loPartialKey << loCaseInsensitive);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_QueryCalcFields(TDataSet *DataSet)

{

pr_QueryAGE->Value = Year - pr_QueryYEAR_B->Value;

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_QueryAfterScroll(TDataSet *DataSet)

{

if (PageControl->ActivePage == TabEdit) {

// відображення даних про поточну персону

chdp_ComboBox -> ItemIndex =

chdp_ComboBox->Items->IndexOf(pr_QueryDEP->AsString);

chfam_Edit->Text = pr_QueryFAM->AsString;

chname_Edit->Text = pr_QueryNAM->AsString;

chgrand_Edit->Text = pr_QueryPAR->AsString;

chyear_CSpinEdit->Value = pr_QueryYEAR_B->AsInteger;

if (pr_QuerySEX->AsString == "ч") sex2_RadioGroup->ItemIndex = 0;

else sex2_RadioGroup->ItemIndex = 1;

}

pr_Label->Caption = pr_QueryNUM->AsString;

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_QueryBeforePost(TDataSet *DataSet)

{

if (!CanPost) {

DataSet->Cancel();

Abort;

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::chadd_ButtonClick(TObject *Sender)

{ // додавання запису до таблиці PERS


insert_StoredProc->ParamByName("pDEP")->AsString = chdp_ComboBox->Text;

insert_StoredProc->ParamByName("pFAM")->AsString = chfam_Edit->Text;

insert_StoredProc->ParamByName("pNAM")->AsString = chname_Edit->Text;

insert_StoredProc->ParamByName("pPAR")->AsString = chgrand_Edit->Text;

insert_StoredProc->ParamByName("pYEAR_B")->AsInteger = chyear_CSpinEdit->Value;

insert_StoredProc->ParamByName("pSEX")->AsString =

sex2_RadioGroup->Items->Strings[sex2_RadioGroup->ItemIndex];


sql_Operator =

"Insert into PERS (DEP, FAM, NAM, PAR, YEAR_B, SEX)"

" VALUES (:pDEP, :pFAM, :pNAM, :pPAR, :pYEAR_B, :pSEX)";

sql_Label->Caption = sql_Operator;

insert_StoredProc->Prepare();

insert_StoredProc->ExecProc();

dp_ComboBoxChange(Sender);

ShowMessage ("Вставку запису збереженою процедурою INSERTdbP виконано успішно!");

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::chdelete_ButtonClick(TObject *Sender)

{ // видалення поточного запису з таблиці PERS

if (Application->MessageBox("Ви дійсно бажаєте видалити поточний запис?",

"Підтвердіть видалення запису",

MB_YESNO + MB_ICONEXCLAMATION) == IDYES) {

delete_StoredProc->ParamByName("pNUM")->AsInteger =

pr_QueryNUM->AsInteger;

sql_Operator = "Delete from PERS where NUM = :pNUM";

sql_Label->Caption = sql_Operator;

delete_StoredProc->Prepare();

delete_StoredProc->ExecProc();

dp_ComboBoxChange(Sender);

ShowMessage ("Видалення запису збереженою процедурою DELETEdbP виконано успішно!");

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::chpost_ButtonClick(TObject *Sender)

{

update_StoredProc->ParamByName("pDEP")->AsString = chdp_ComboBox->Text;

update_StoredProc->ParamByName("pFAM")->AsString = chfam_Edit->Text;

update_StoredProc->ParamByName("pNAM")->AsString = chname_Edit->Text;

update_StoredProc->ParamByName("pPAR")->AsString = chgrand_Edit->Text;

update_StoredProc->ParamByName("pYEAR_B")->AsInteger = chyear_CSpinEdit->Value;

update_StoredProc->ParamByName("pSEX")->AsString =

sex2_RadioGroup->Items->Strings[sex2_RadioGroup->ItemIndex];


sql_Operator =

"Update PERS Set DEP = :pDEP, YEAR_B = :pYEAR_B, SEX = :pSEX "

" Where (FAM = :pFAM) and (NAM = :pNAM) and (PAR = :pPAR)";

sql_Label->Caption = sql_Operator;

update_StoredProc->Prepare();

update_StoredProc->ExecProc();

dp_ComboBoxChange(Sender);

if (update_StoredProc->ParamByName("NUMBER")->AsInteger == 0)

ShowMessage ("* Помилка поновлення запису!");

else

ShowMessage ("Поновлення запису збережено.процедурою UPDATEdbP виконано успішно!");

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::PageControlChange(TObject *Sender)

{

if (PageControl->ActivePage == TabEdit)

pr_QueryAfterScroll(pr_Query);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::minage_CSpinEditChange(TObject *Sender)

{

AnsiString s =

"(YEAR_B<=" + IntToStr(int(Year - minage_CSpinEdit->Value)) +

")and(YEAR_B>=" + IntToStr(int(Year - maxage_CSpinEdit->Value)) +

")and(SEX=";

if (!sex_RadioGroup->ItemIndex) s += "'ч')";

else s += "'ж')";


// автоматичне поновлення відбору записів

select_BitBtn->Kind = bkCancel;

select_BitBtn->Caption = "Відмінити відбір";

pr_Query->Filter = s;

pr_Query->Filtered = true;

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::select_BitBtnClick(TObject *Sender)

{

if (pr_Query->Filtered) { // відміна режиму фільтрації

pr_Query->Filtered = false;

select_BitBtn->Kind = bkYes;

select_BitBtn->Caption = "Поновити відбір";

} else { // встановлення режиму фільтрації

select_BitBtn->Kind = bkCancel;

select_BitBtn->Caption = "Відмінити відбір";

minage_CSpinEditChange(Sender);

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_DBGridCellClick(TColumn *Column)

{

if (PageControl->ActivePage == TabEdit) {

chdp_ComboBox -> ItemIndex =

chdp_ComboBox->Items->IndexOf(pr_QueryDEP->AsString);

chfam_Edit->Text = pr_QueryFAM->AsString;

chname_Edit->Text = pr_QueryNAM->AsString;

chgrand_Edit->Text = pr_QueryPAR->AsString;

chyear_CSpinEdit->Value = pr_QueryYEAR_B->AsInteger;

if (pr_QuerySEX->AsString == "ч") sex2_RadioGroup->ItemIndex = 0;

else sex2_RadioGroup->ItemIndex = 1;

}

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::Delay(unsigned long int mSeconds)

{ // затримка на декілька мілісекунд

unsigned long int FirstTick;


FirstTick = GetTickCount();

do

Application->ProcessMessages();

while (GetTickCount() - FirstTick <= mSeconds);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::prview_RadioGroupClick(TObject *Sender)

{

dp_ComboBoxChange (Sender);

}

//---------------------------------------------------------------------------

void __fastcall Tmain_Form::pr_DBGridKeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

pr_Label->Caption = pr_QueryNUM->AsString;

}

//---------------------------------------------------------------------------


Для виконання прикладення треба попередньо завантажити на виконання прикладення-сервер IBServer.EXE, яке за звичай знаходиться за маршрутом "E:\Program Files\InterBase Corp\InterBase\Bin\" і обслуговує запити до бази даних Interbase. Після завантаження поточ-ного проекту на виконання цей сервер виводить на екран запит (мал.. 1.21) , у полі Password: якого треба ввести пароль доступу masterkey.:


Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.21


Приклад вигляду форми під час функціонування прикладення наведено на мал. 1.22.

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням SQL Interbase

Малюнок 1.22

Контрольнi запитання:


1. Детально опишіть компоненти RAD: TDataSource, TQuery, TDBMemo, TDBGrid, TDBImage, TDBText, TDBNavigator, TStoredProc.

2. Як створити БД Interbase і призначити їй аліас?

3. Як створити індекси таблиці БД Interbase?

4. Як створити і використати у прикладенні перегляд таблиці БД Interbase?

5. Яким чином створюється і для чого використовується генератор БД Interbase?

6. Як призначити зв’язок компонентів з реальною БД?

7. Яким чином створюється і для чого використовується триггер БД Interbase?

8. Яким чином створюється і для чого використовується збережена процедура БД Inter-base?

9. Для чого використовується оператор SQL “SELECT”, наприклад:

"Select * from DEP where DEP=:PDEP"?

10. Опишіть методику додавання і видалення запису до/з таблиці БД. Чому для цього використовується додатковий компонент TQuery?

11. Опишіть методику додавання, видалення і корегування записів таблиці БД із викорис-танням збережених процедур.

12. Дайте докладні пояснення до розробленої програми.

Рефетека ру refoteka@gmail.com