Смекни!
smekni.com

Проектування дволанкової розподіленої інформаційної системи для роботи з базами даних із використанням (стр. 1 из 6)

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

Мета:

• створення БД;

• створення і використання індексів та переглядів БД;

• створення і використання тригерів, генераторів та збережених процедур на боці SQL-сервера;

• отримання практичних навичок обміну даними між прикладенням і БД.

Завдання:

Засобами SQL Interbase необхідно створити БД, декілька індексованих таблиць БД (головну і підлеглі) і декілька їх переглядів, а також зв’язати їх між собою.

Засобами С++Builder створити оригінальне(!) прикладення, яке повинне надавати мож-ливість:

• перегляду записів зв’язаних таблиць БД, у тому числі попередніх і наступних записів та із використанням створених переглядів;

• фільтрації записів БД із виведенням на екран записів, обраних у діалозі за вказаними критеріями;

• інкрементального пошуку даних у БД за вказаними критеріями;

• додавання і видалення записи таблиці БД, у тому числі із використанням створених на боці SQL-сервера тригерів, генераторів та збережених процедур;

• корегування полів поточного запису таблиці БД, у тому числі із використанням створе-ної на боці SQL-сервера збереженої процедури.

Вказівки до створення БД:

Для створення БД із використанням SQL Interbase необхідно:

• завантажити на виконання прикладення InterBase Windows ISQL, яке за звичай зберігає-ться за маршрутом "<диск>:&bsol;Program Files&bsol;InterBase Corp&bsol; InterBase&bsol; Bin&bsol;wisql32.exe", наприклад, “E:&bsol;Program Files&bsol;InterBase Corp&bsol; InterBase&bsol; Bin&bsol;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:&bsol;Lr2&bsol;dbP&bsol;dbP.gdb" USER "SYSDBA" PASSWORD "masterkey";

/* створеннятаблиці PERS */

create table pers(

Num smallint Not Null Primary Key,

Dep char(15),

Fam char(20) Not Null,

Nam char(20) Not Null,

Par char(20) Not Null,

Year_b smallint,

Sex char(1),

Charact blob,

Photo blob

);

/* створеннятаблиці DEP */

create table dep(

Dep char(15) Not Null Primary Key,

Proisv char(15)

);

/* заповненнятаблиці PERS */

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(1, "Бухгалтерія", "Іванов", "Іван", "Іванович", 1950, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(2, "Цех 1", "Петров", "Петро", "Петрович", 1960, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(3, "Цех 2", "Сидоров", "Сидор", "Сидорович", 1955, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(4, "Цех 1", "Іванова", "Ірина", "Іванівна", 1971, "ж");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(5, "Бухгалтерія", "Миколаєв", "Микола", “Миколайович", 1930, "ч”);

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(6, "Цех 2", "Андрієв", "Андрій", "Андрійович", 1930, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(7, "Цех 1", "Борисов", "Борис", "Борисович", 1937, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(8, "Цех 1", "Павлов", "Павло", "Павлович", 1975, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(9, "Бухгалтерія", "Антонова", "Антоніна", "Антонівна", 1965, "ж");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(10, "Цех 2", "Харитонов", "Харитон", "Харитонович", 1962, "ч");

Insert Into PERS(Num, Dep, Fam, Nam, Par, Year_b, Sex)

Values(11, "Цех 2", "Іванников", "Іван", "Іванович", 1975, "ч");

/* заповнення таблиці DEP */

Insert Into DEP( Dep,Proisv) Values("Бухгалтерія", "управління");

Insert Into DEP( Dep,Proisv) Values("Цех 1", "виробництво");

Insert Into DEP( Dep,Proisv) Values("Цех 2", "виробництво");

Commit;

Після натискання кнопки Открыть треба вказати, що результати виконання скрипту необхідно зберігати у файлі Result.txt. Скрипт виконується.

Оглянути схему створеної таблиці (наприклад, таблиці PERS) можна командою Meta-data | Show … (мал. 1.6)

Малюнок 1.6

SHOW TABLE PERS

NUM SMALLINT Not Null

DEP CHAR(15) Nullable

FAM CHAR(20) Not Null

NAM CHAR(20) Not Null

PAR CHAR(20) Not Null

YEAR_B SMALLINT Nullable

SEX CHAR(1) Nullable

CHARACT BLOB segment 80, subtype UNKNOWN Nullable

PHOTO BLOB segment 80, subtype UNKNOWN Nullable

CONSTRAINT INTEG_2:

Primary key (NUM)

Оглянутивмістствореноїтаблиці (наприклад, таблиці PERS) можнанаборомзапиту Select * from PERS увікні InterBase Windows ISQL, абожзадопомогою Database Explore (мал. 1.7):

Малюнок 1.7

• створитиіндекситаблиці PERS, длячоговиконатискрипт, щоміститьсяуфайлі CreateINDEXESdbP.sql:

/* З'єднаннязБД */

CONNECT "e:&bsol;Lr3&bsol;dbP&bsol;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:&bsol;Lr3&bsol;dbP&bsol;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:&bsol;Lr3&bsol;dbP&bsol;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:&bsol;Lr3&bsol;dbP&bsol;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:&bsol;Lr3&bsol;dbP&bsol;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:&bsol;Lr3&bsol;dbP&bsol;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