Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням 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, sub>type UNKNOWN Nullable

PHOTO BLOB segment 80, sub>type 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

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.

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

Малюнок 1.15

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

Малюнок 1.16

Малюнок 1.17

Малюнок 1.18

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

Малюнок 1.19

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

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

Малюнок 1.21

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

Малюнок 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. Дайте докладні пояснення до розробленої програми.