Материал: 2110

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

COMMIT;

GRANT "CONNECT" TO "ADMIN_TREE" WITH ADMIN OPTION; GRANT "DBA" TO "ADMIN_TREE" WITH ADMIN OPTION;

GRANT "EXP_FULL_DATABASE" TO "ADMIN_TREE" WITH ADMIN OPTION;

COMMIT;

Далее от имени пользователя ADMIN_TREE создать табличное пространство и переопределить для пользователя табличное пространство по умолчанию:

CREATE TABLESPACE "DB_TREE" LOGGING DATAFILE 'C:\ORACLE\ORADATA\ORCL\DB_TREE.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL;

ALTER USER "ADMIN_TREE" DEFAULT TABLESPACE "DB_TREE";

Далее создать таблицы БД:

CREATE TABLE ADMIN_TREE.Nodes(Node_id NUMERIC(3) PRIMARY KEY NOT NULL, Node_type VARCHAR2(50), Textlayer VARCHAR2(50), Schematic_layer BLOB, Structural_layer VARCHAR2(50), Math_layer BLOB, Algorithmic_layer VARCHAR2(4000), Procedural_layer VARCHAR2(4000));

CREATE TABLE ADMIN_TREE.Models(Model_id NUMERIC(3) PRIMARY KEY NOT NULL, Root_id NUMERIC(3) NOT NULL, Model_name VARCHAR2(50), Create_date DATE NULL, Author VARCHAR2(50), CONSTRAINT FK_Models_Nodes FOREIGN KEY(Root_id) REFERENCES ADMIN_TREE.Nodes(Node_id));

CREATE TABLE ADMIN_TREE.Versions(Model_id NUMERIC(3) NOT NULL, Parent_version_id NUMERIC(3) NULL, Version NUMERIC(3) NOT NULL, Version_id NUMERIC(3) PRIMARY KEY, Create_date DATE DEFAULT SYSDATE NOT NULL, Version_name VARCHAR2(50), CONSTRAINT FK_Versions_Models FOREIGN KEY(Model_id) REFERENCES ADMIN_TREE.Models(Model_id));

CREATE TABLE ADMIN_TREE.Tree(Relation_id NUMERIC(3) PRIMARY KEY NOT NULL, Model_id NUMERIC(3) NOT NULL, Parent_id NUMERIC(3) NULL, Node_id NUMERIC(3) NOT NULL, Parent_relation_id NUMERIC(3) NULL, Level_ NUMERIC(3) NOT NULL, CONSTRAINT FK_Tree_Models FOREIGN KEY(Model_id) REFERENCES ADMIN_TREE.Models(Model_id), CONSTRAINT FK_Tree_Nodes FOREIGN KEY(Parent_id) REFERENCES ADMIN_TREE.Nodes(Node_id), CONSTRAINT FK_Tree_Nodes1 FOREIGN KEY(Node_id) REFERENCES ADMIN_TREE.Nodes (Node_id), CONSTRAINT FK_Tree_Tree FOREIGN KEY(Parent_relation_id) REFERENCES ADMIN_TREE.Tree(Relation_id));

CREATE TABLE ADMIN_TREE.Operations(Operation_id NUMERIC(3) PRIMARY KEY NOT NULL, Version_id NUMERIC(3), Relation_id NUMERIC(3), Operation char(1), CONSTRAINT FK_Operations_Tree FOREIGN KEY(Relation_id) REFERENCES ADMIN_TREE.Tree(Relation_id), CONSTRAINT FK_Operations_Versions FOREIGN KEY(Version_id) REFERENCES ADMIN_TREE.Versions(Version_id));

Далее создать представление, которое собирает деревья моделей из всей БД:

110

CREATE VIEW ADMIN_TREE.View_Tree AS

SELECT b.model_id, ADMIN_TREE.Models.model_name, b.relation_id, b.Parent_node, ADMIN_TREE.Nodes.textlayer AS Child_node, b.Parent_relation_id, b.level_

FROM ADMIN_TREE.Nodes INNER JOIN

(SELECT ADMIN_TREE.Tree.model_id, ADMIN_TREE.Tree.relation_id, a.textlayer AS Parent_node, ADMIN_TREE.Tree.Node_id, ADMIN_TREE.Tree.Parent_relation_id, ADMIN_TREE.Tree.level_ FROM (ADMIN_TREE.Nodes a) RIGHT OUTER JOIN ADMIN_TREE.Tree ON a.Node_id = ADMIN_TREE.Tree.Parent_id) b

ON ADMIN_TREE.Nodes.Node_id = b.Node_id INNER JOIN ADMIN_TREE.Models ON ADMIN_TREE.Models.model_id = b.model_id ORDER BY b.model_id, b.level_, b.Parent_node, Child_node;

Далее создать таблицу для временного хранения информации о наборе версий в процессе работы процедуры ADMIN_TREE.TreeVersion_Model:

CREATE TABLE ADMIN_TREE.temp (ver NUMERIC(3)); commit;

Далее создать таблицу для временного хранения результата работы процедуры ADMIN_TREE.TreeVersion_Model:

CREATE TABLE ADMIN_TREE.TreeVersion_Temp(version_id NUMERIC(3), parent_version_id NUMERIC(3), version NUMERIC(3), operation_id NUMERIC(3), relation_id NUMERIC(3), operation CHAR(1), Parent_relation_id NUMERIC(3), level_ NUMERIC(3), Parent_Node VARCHAR2(50), Child_Node VARCHAR2(50));

Далее создать процедуру, которая из единой базы данных по запросу клиентского приложения по указанной модели и ее версии может выбрать интересующую версию конкретной модели и представить в удобном для клиентского приложения виде:

CREATE PROCEDURE ADMIN_TREE.TreeVersion_Model (idModel IN NUMERIC, VersionIN IN NUMERIC)

IS

parent_version NUMERIC(3); version_id NUMERIC(3); versionIN_ NUMERIC(3);

BEGIN

DELETE FROM ADMIN_TREE.temp;

DELETE FROM ADMIN_TREE.TreeVersion_Temp; commit;

INSERT INTO ADMIN_TREE.temp VALUES(VersionIN);

SELECT Parent_version_id INTO parent_version FROM ADMIN_TREE.Versions WHERE model_id=idModel AND version=VersionIN;

WHILE NOT(parent_version IS NULL) LOOP

SELECT version INTO versionIN_ FROM ADMIN_TREE.Versions WHERE model_id=idModel AND version_id=parent_version;

INSERT INTO ADMIN_TREE.temp VALUES(versionIN_);

SELECT Parent_version_id INTO parent_version FROM ADMIN_TREE.Versions

111

WHERE model_id=idModel AND version= versionIN_; End LOOP;

сommit;

insert into ADMIN_TREE.TreeVersion_Temp

SELECT S.version_id, S.parent_version_id, S.version, S.operation_id, S.relation_id, S.operation, S.Parent_relation_id, S.level_, NP.textlayer as Parent_Node, S.Child_Node

FROM ADMIN_TREE.Nodes NP, (SELECT V.parent_version_id, V.version_id,V.version, O.operation_id, O.relation_id, O.operation, t.Parent_id, t.Parent_relation_id, t.level_, N.textlayer AS Child_Node FROM ADMIN_TREE.Versions V, ADMIN_TREE.Operations O, ADMIN_TREE.Tree T, ADMIN_TREE.Nodes N

WHERE V.version_id=O.version_id AND T.relation_id=O.relation_id AND N.Node_id=T.Node_id AND V.model_id=idModel AND V.version in

(SELECT ver from ADMIN_TREE.TEMP) ) S WHERE NP.Node_id=S.Parent_id ORDER BY S.operation_id ASC;

END TreeVersion_Model;

Для проверки работы системы в целом нужно заполнить БД тестовыми данными с помощью следующих команд:

INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(2, 'узел 2'); INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(3, 'узел 3'); INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(4, 'узел 4'); INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(5, 'узел 5'); INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(6, 'узел 6'); INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(7, 'узел 7'); INSERT INTO ADMIN_TREE.Nodes(Node_id, textlayer) VALUES(8, 'узел 8');

INSERT INTO ADMIN_TREE.Models(model_id, root_id,model_name,create_date,author) VALUES(1, 2, 'модель 1', NULL, NULL);

INSERT INTO ADMIN_TREE.Versions( model_id, parent_version_id, version, version_id, create_date, version_name) VALUES(1, NULL,1, 1, '09.04.2008', 'Версия 1 модели 1');

INSERT INTO ADMIN_TREE.Versions( model_id, parent_version_id, version, version_id, create_date, version_name) VALUES(1, 1, 2, 2, '09.04.2008', 'Версия 2 модели 1');

INSERT INTO ADMIN_TREE.Versions( model_id, parent_version_id, version, version_id, create_date, version_name) VALUES(1, 2, 3, 3, '09.04.2008', 'Версия 3 модели 1');

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(1, 1, 2, 3, 15, 2);

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(2, 1, 2, 4, 15, 2);

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(3, 1, 3, 5, 1, 3);

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(4, 1, 3, 6, 1, 3);

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(5, 1, 5, 7, 3, 4);

112

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(6, 1, 7, 8, 5, 5);

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(15, 1, NULL, 2, NULL, 1);

INSERT INTO ADMIN_TREE.Tree(relation_id, model_id, Parent_id, Node_id, Parent_relation_id, level_) VALUES(18, 1, 3, 8, 4, 3);

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(1, 1, 1, 'i');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(2, 1, 2, 'i');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(3, 1, 3, 'i');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(4, 1, 4, 'i');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(5, 1, 5, 'i');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(6, 1, 6, 'i');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(7, 2, 5, 'd');

INSERT INTO ADMIN_TREE.Operations(operation_id, version_id, relation_id, operation) VALUES(8, 3, 18, 'i');

Клиентское приложение выполнено в Delphi 7. Порядок создания включает в себя следующие этапы:

1. Создать новый проект. Основную форму переименовать в MainForm. В коде формы после раздела implementation описать две пе- ременные, которые будут использоваться всеми процедурами формы:

var

Nodes : TTreeNodes; //компонент набор узлов дерева

Node : TTreeNode; //компонент узел дерева

2. Добавьте на форму компонент ADOConnection (рис. 10.2) и устано- вите ему следующие свойства:

Name на ADOConnection1;

Connected String = нажать кнопку Build\ выбрать По-

ставщик данных – Microsoft OLE DB Provider for Oracle

Источник данных – ORCL Пользователь – ADMIN_TREE

Пароль – worlds

Получится в результате – Provider=MSDAORA.1;User ID=ADMIN_BOOKS;Data Source=Orcl;Persist Security Info=False

3.Добавьте на форму два компонента TreeView (рис. 10.2).

У1-го компонента TreeView изменить следующие свойства:

Name на Tree;

113

У 2-го компонента TreeView изменить следующие свойства:

Name на TV2;

4. Добавьте на форму компонент ADOTable (рис. 10.2) и установите ему следующие свойства:

Name на ADOView_table; Connection на ADOConnection1; TableName на View_Tree;

Active на True.

5. Добавьте на форму 3 компонента ADOTable и 3 компонента

DataSource (рис. 10.2).

У 1-го компонента ADOTable изменить следующие свойства:

Name на ADOModels; Connection на ADOConnection1;

TableName на Models; Active на True.

У 1-го компонента DataSource изменить следующие свойства:

Name на DataModels; DataSet на ADOModels.

У 2-го компонента ADOTable изменить следующие свойства:

Name на ADOVersion; Connection на ADOConnection1;

TableName на Versions; IndexFieldNames на model_id; MasterField на model_id; MasterSource на DataModels; Active на True.

У 2-го компонента DataSource изменить следующие свойства:

Name на DataVersion; DataSet на ADOVersion.

У 3-го компонента ADOTable изменить следующие свойства:

Name на ADOVersii; Connection на ADOConnection1;

TableName на Versions; Active на True.

У 3-го компонента DataSource изменить следующие свойства:

Name на DataSource1; DataSet на ADOVersii.

6. Добавьте на форму два компонента DBLookupComboBox (рис.

10.2).

У 1-го компонента DBLookupComboBox изменить следующие свойства:

Name на DBCombo_Models; ListSource на DataModels;

114