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