/* ======================================================= */ /* FlexiObjDB. 04.08.2009 */ /* http://flexiobjdb.narod.ru */ /* ======================================================= */ /* Extract Database C:\FODB\FODB_DB_01.GDB */ CREATE DATABASE "C:\FODB\FODB_DB_01.GDB" PAGE_SIZE 1024 DEFAULT CHARACTER SET WIN1251; /* Domain definitions */ CREATE DOMAIN ID_INT_TYPE AS INTEGER NOT NULL; CREATE DOMAIN TIME_TYPE AS VARCHAR(5) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN TIME_EXT_TYPE AS VARCHAR(8) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN REAL_TYPE AS DOUBLE PRECISION; CREATE DOMAIN MEMO_TYPE AS BLOB SUB_TYPE TEXT SEGMENT SIZE 80 CHARACTER SET WIN1251; CREATE DOMAIN SERVERNAME_TYPE AS VARCHAR(200) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN ALIASBDE5_TYPE AS VARCHAR(64) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN ID_VARCHAR40_TYPE AS VARCHAR(40) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN IDDB_TYPE AS VARCHAR(2) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN IDNODE_TYPE AS VARCHAR(4) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN NAMEMAX_TYPE AS VARCHAR(200) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN NAMEMIN_TYPE AS VARCHAR(84) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN MNEMOCODE_TYPE AS VARCHAR(32) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN NOTE_TYPE AS VARCHAR(200) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN USERNAME_TYPE AS VARCHAR(84) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN PSW_TYPE AS VARCHAR(250) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN SYSCONSTVALUE_TYPE AS VARCHAR(250) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN WHATSYSEVENT_TYPE AS VARCHAR(3) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN PARENTS_ID_TYPE AS VARCHAR(4800) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN NAME_TABLE_FIELD_TYPE AS VARCHAR(64) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN DATESTR_TYPE AS VARCHAR(10) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN TIME_EXT_NOT_NULL_TYPE AS VARCHAR(8) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL; CREATE DOMAIN COORDINATE_TYPE AS VARCHAR(84) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN ID_VARCHAR40_NULL_TYPE AS VARCHAR(40) CHARACTER SET WIN1251 COLLATE PXW_CYRL; CREATE DOMAIN ID_THIS_USER_TYPE AS VARCHAR(84) CHARACTER SET WIN1251 COLLATE PXW_CYRL; /* Table: L_PROPENUM_GRP, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPENUM_GRP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPENUM_LIST, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPENUM_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPENUM_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPENUM_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPENUM_TOP, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPENUM_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPENUM_VAL, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPENUM_VAL (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPNUMBER_GRP, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPNUMBER_GRP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPNUMBER_LIST, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPNUMBER_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, PRECIS INTEGER, ID_UNITMEASURE ID_VARCHAR40_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, YESEDIT_THIS INTEGER, PRIMARY KEY (ID_THIS)); /* Table: L_PROPNUMBER_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPNUMBER_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPNUMBER_TOP, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPNUMBER_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPTEXT_GRP, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPTEXT_GRP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPTEXT_LIST, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPTEXT_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPTEXT_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPTEXT_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_PROPTEXT_TOP, Owner: FLEXIOBJDB */ CREATE TABLE L_PROPTEXT_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: L_TYPEOBJ_GRP, Owner: FLEXIOBJDB */ CREATE TABLE L_TYPEOBJ_GRP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: L_TYPEOBJ_LIST, Owner: FLEXIOBJDB */ CREATE TABLE L_TYPEOBJ_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, ID_KIND INTEGER, ITS_ABSTRACT INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, YESEDIT_THIS INTEGER, ID_SYSTEM INTEGER, ID_IMAGE INTEGER, PRIMARY KEY (ID_THIS)); /* Table: L_TYPEOBJ_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE L_TYPEOBJ_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: L_TYPEOBJ_TOP, Owner: FLEXIOBJDB */ CREATE TABLE L_TYPEOBJ_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_CHOKE, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_CHOKE (ID_THIS ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_PROP_ENUM, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_PROP_ENUM (ID_THIS ID_VARCHAR40_TYPE, ID_OWNER ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_PROP_VAL ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, DATE_1 DATE, TIME_1 TIME_EXT_TYPE, DATE_2 DATE, TIME_2 TIME_EXT_TYPE, ID_PACKET ID_VARCHAR40_TYPE, ID_PROP ID_VARCHAR40_TYPE, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_PROP_ENUM_ATTR, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_PROP_ENUM_ATTR (ID_THIS ID_VARCHAR40_TYPE, ID_OWNER ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_CONDITION ID_VARCHAR40_NULL_TYPE, ID_ANOMAL ID_VARCHAR40_NULL_TYPE, ID_TASK ID_VARCHAR40_NULL_TYPE, ID_COMPLEX ID_VARCHAR40_NULL_TYPE, ID_METHOD ID_VARCHAR40_NULL_TYPE, ID_DEVICE ID_VARCHAR40_NULL_TYPE, ID_AUTHOR ID_VARCHAR40_NULL_TYPE, RELIABILITY_THIS REAL_TYPE, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_PROP_NUMBER, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_PROP_NUMBER (ID_THIS ID_VARCHAR40_TYPE, ID_OWNER ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_PROP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, DATE_1 DATE, TIME_1 TIME_EXT_TYPE, DATE_2 DATE, TIME_2 TIME_EXT_TYPE, PROP_VAL REAL_TYPE, PRECIS INTEGER, ID_UNITMEASURE ID_VARCHAR40_TYPE, ID_PACKET ID_VARCHAR40_TYPE, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_PROP_NUM_ATTR, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_PROP_NUM_ATTR (ID_THIS ID_VARCHAR40_TYPE, ID_OWNER ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_CONDITION ID_VARCHAR40_NULL_TYPE, ID_ANOMAL ID_VARCHAR40_NULL_TYPE, ID_TASK ID_VARCHAR40_NULL_TYPE, ID_COMPLEX ID_VARCHAR40_NULL_TYPE, ID_METHOD ID_VARCHAR40_NULL_TYPE, ID_DEVICE ID_VARCHAR40_NULL_TYPE, ID_AUTHOR ID_VARCHAR40_NULL_TYPE, ERROR_THIS REAL_TYPE, RELIABILITY_THIS REAL_TYPE, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_PROP_TEXT, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_PROP_TEXT (ID_THIS ID_VARCHAR40_TYPE, ID_OWNER ID_VARCHAR40_TYPE, ID_PROP ID_VARCHAR40_TYPE, PROP_VAL MEMO_TYPE, ITS_GLOBAL INTEGER, DATE_1 DATE, TIME_1 TIME_EXT_TYPE, DATE_2 DATE, TIME_2 TIME_EXT_TYPE, ID_PACKET ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_PROP_TEXT_ATTR, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_PROP_TEXT_ATTR (ID_THIS ID_VARCHAR40_TYPE, ID_OWNER ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_CONDITION ID_VARCHAR40_NULL_TYPE, ID_ANOMAL ID_VARCHAR40_NULL_TYPE, ID_TASK ID_VARCHAR40_NULL_TYPE, ID_COMPLEX ID_VARCHAR40_NULL_TYPE, ID_METHOD ID_VARCHAR40_NULL_TYPE, ID_DEVICE ID_VARCHAR40_NULL_TYPE, ID_AUTHOR ID_VARCHAR40_NULL_TYPE, RELIABILITY_THIS REAL_TYPE, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_TREE, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_TREE (ID_THIS ID_VARCHAR40_TYPE, ID_PARENT ID_VARCHAR40_TYPE, ID_TYPE ID_VARCHAR40_TYPE, NUMPP INTEGER, DATE_1 DATE, TIME_1 TIME_EXT_TYPE, DATE_2 DATE, TIME_2 TIME_EXT_TYPE, NAME_MAX NAMEMAX_TYPE, NOTE NOTE_TYPE, ITS_BASE INTEGER, ID_REF ID_VARCHAR40_TYPE, ID_REF_NEAR ID_VARCHAR40_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, YESEDIT_THIS INTEGER, YESUPDATE_CHILD INTEGER, ITS_GLOBAL INTEGER, LEVEL_THIS INTEGER, YES_TREE_UPDATE INTEGER, PARENTS_ID PARENTS_ID_TYPE, ID_PACKET ID_VARCHAR40_TYPE, MNEMO_CODE MNEMOCODE_TYPE, YESUPDATE_REF INTEGER, PRIMARY KEY (ID_THIS)); /* Table: OBJECTS_TREE_ATTR, Owner: FLEXIOBJDB */ CREATE TABLE OBJECTS_TREE_ATTR (ID_THIS ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_CONDITION ID_VARCHAR40_NULL_TYPE, ID_ANOMAL ID_VARCHAR40_NULL_TYPE, ID_TASK ID_VARCHAR40_NULL_TYPE, ID_COMPLEX ID_VARCHAR40_NULL_TYPE, ID_METHOD ID_VARCHAR40_NULL_TYPE, ID_DEVICE ID_VARCHAR40_NULL_TYPE, ID_AUTHOR ID_VARCHAR40_NULL_TYPE, RELIABILITY_THIS REAL_TYPE, PRIMARY KEY (ID_THIS)); /* Table: OTHER_TABLES_LIST, Owner: FLEXIOBJDB */ CREATE TABLE OTHER_TABLES_LIST (ID_THIS ID_INT_TYPE, ID_GRP ID_INT_TYPE, NUMPP INTEGER, TABLE_NAME NAME_TABLE_FIELD_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, PRIMARY KEY (ID_THIS)); /* Table: ROLES_GRP, Owner: FLEXIOBJDB */ CREATE TABLE ROLES_GRP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: ROLES_LIST, Owner: FLEXIOBJDB */ CREATE TABLE ROLES_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, ACCESS_LIST MEMO_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: ROLES_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE ROLES_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: ROLES_TOP, Owner: FLEXIOBJDB */ CREATE TABLE ROLES_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: SPACE_APPARAT_START, Owner: FLEXIOBJDB */ CREATE TABLE SPACE_APPARAT_START (ID_THIS INTEGER NOT NULL, ID_OWNER VARCHAR(40) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL, DATE_START DATE NOT NULL, TIME_START VARCHAR(5) CHARACTER SET WIN1251 COLLATE PXW_CYRL, TRIP_NUM VARCHAR(32) CHARACTER SET WIN1251 COLLATE PXW_CYRL, APPARAT_MODEL VARCHAR(84) CHARACTER SET WIN1251 COLLATE PXW_CYRL, APPARAT_NUM VARCHAR(84) CHARACTER SET WIN1251 COLLATE PXW_CYRL, USEFULL_LOAD VARCHAR(200) CHARACTER SET WIN1251 COLLATE PXW_CYRL, ACTION_RESULT VARCHAR(32) CHARACTER SET WIN1251 COLLATE PXW_CYRL, NUMPP INTEGER, PRIMARY KEY (ID_THIS)); /* Table: STORAGE_LIST, Owner: FLEXIOBJDB */ CREATE TABLE STORAGE_LIST (ID_THIS ID_VARCHAR40_TYPE, NUMPP INTEGER, SERVER_NAME SERVERNAME_TYPE, ALIASBDE5 ALIASBDE5_TYPE, USER_NAME USERNAME_TYPE, NOTE NOTE_TYPE, DATE_CREATE DATE NOT NULL, DATE_UPDATE DATE NOT NULL, INFO MEMO_TYPE, USER_PSW PSW_TYPE, ID_DB IDDB_TYPE, ID_GRP ID_VARCHAR40_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, IDUSER_UPDATE ID_VARCHAR40_TYPE, PRIMARY KEY (ID_THIS)); /* Table: SYS_CALENDAR, Owner: FLEXIOBJDB */ CREATE TABLE SYS_CALENDAR (DATEX DATE NOT NULL, YYYYMMDD INTEGER NOT NULL, DATEX_STR DATESTR_TYPE, DAYTYPE INTEGER, PRIMARY KEY (DATEX)); /* Table: SYS_CONST_GRP, Owner: FLEXIOBJDB */ CREATE TABLE SYS_CONST_GRP (ID_THIS ID_VARCHAR40_TYPE, NUMPP INTEGER, ITS_GLOBAL INTEGER, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, ID_SYSTEM INTEGER, ID_GRP ID_VARCHAR40_TYPE, PRIMARY KEY (ID_THIS)); /* Table: SYS_CONST_LIST, Owner: FLEXIOBJDB */ CREATE TABLE SYS_CONST_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, IS_READONLY INTEGER, NUMPP INTEGER, MNEMO_CODE MNEMOCODE_TYPE, CONST_VALUE SYSCONSTVALUE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, YES_READONLY_RESET INTEGER, PRIMARY KEY (ID_THIS)); /* Table: SYS_CONST_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE SYS_CONST_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: SYS_CONST_TOP, Owner: FLEXIOBJDB */ CREATE TABLE SYS_CONST_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, ID_SYSTEM INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, PRIMARY KEY (ID_THIS)); /* Table: SYS_EVENTS_IN_TABLES, Owner: FLEXIOBJDB */ CREATE TABLE SYS_EVENTS_IN_TABLES (ID_THIS ID_INT_TYPE, DATE_EVENT DATE NOT NULL, IDTABLE ID_INT_TYPE, IDTHIS ID_VARCHAR40_TYPE, WHAT WHATSYSEVENT_TYPE, PRIMARY KEY (ID_THIS)); /* Table: SYS_HHMMSS, Owner: FLEXIOBJDB */ CREATE TABLE SYS_HHMMSS (HH_MM_SS TIME_EXT_NOT_NULL_TYPE, HHMMSS TIME_EXT_NOT_NULL_TYPE, HHMMSS_I INTEGER NOT NULL, PRIMARY KEY (HH_MM_SS)); /* Table: SYS_TABLES_GRP, Owner: FLEXIOBJDB */ CREATE TABLE SYS_TABLES_GRP (ID_THIS ID_INT_TYPE, ID_GRP ID_INT_TYPE, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, PRIMARY KEY (ID_THIS)); /* Table: SYS_TABLES_LIST, Owner: FLEXIOBJDB */ CREATE TABLE SYS_TABLES_LIST (ID_THIS ID_INT_TYPE, ID_GRP ID_INT_TYPE, NUMPP INTEGER, TABLE_NAME NAME_TABLE_FIELD_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, SYS_INFO MEMO_TYPE, YES_SYS_EVENT INTEGER, YES_POST_EVENT INTEGER, PRIMARY KEY (ID_THIS)); /* Table: SYS_TABLES_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE SYS_TABLES_MACRO (ID_THIS ID_INT_TYPE, ID_GRP ID_INT_TYPE, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, PRIMARY KEY (ID_THIS)); /* Table: SYS_TABLES_TOP, Owner: FLEXIOBJDB */ CREATE TABLE SYS_TABLES_TOP (ID_THIS ID_INT_TYPE, ID_GRP ID_INT_TYPE, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, PRIMARY KEY (ID_THIS)); /* Table: SYS_TABLE_FIELDS, Owner: FLEXIOBJDB */ CREATE TABLE SYS_TABLE_FIELDS (ID_THIS ID_INT_TYPE, FIELD_NAME NAME_TABLE_FIELD_TYPE, FIELD_TYPE NOTE_TYPE, NUMPP INTEGER, NOTE NOTE_TYPE, INFO MEMO_TYPE, SYS_INFO MEMO_TYPE, ID_TABLE ID_INT_TYPE, PRIMARY KEY (ID_THIS)); /* Table: USERS_GRP, Owner: FLEXIOBJDB */ CREATE TABLE USERS_GRP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: USERS_LIST, Owner: FLEXIOBJDB */ CREATE TABLE USERS_LIST (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, USER_PSW PSW_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_ROLE ID_VARCHAR40_TYPE, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: USERS_MACRO, Owner: FLEXIOBJDB */ CREATE TABLE USERS_MACRO (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Table: USERS_TOP, Owner: FLEXIOBJDB */ CREATE TABLE USERS_TOP (ID_THIS ID_VARCHAR40_TYPE, ID_GRP ID_VARCHAR40_TYPE, ITS_GLOBAL INTEGER, NUMPP INTEGER, NAME_MAX NAMEMAX_TYPE, NAME_MIN NAMEMIN_TYPE, MNEMO_CODE MNEMOCODE_TYPE, NOTE NOTE_TYPE, INFO MEMO_TYPE, IDUSER_CREATE ID_VARCHAR40_TYPE, DATE_CREATE DATE NOT NULL, IDUSER_UPDATE ID_VARCHAR40_TYPE, DATE_UPDATE DATE NOT NULL, ID_SYSTEM INTEGER, PRIMARY KEY (ID_THIS)); /* Index definitions for all user tables */ CREATE INDEX LPROPENUMGRP_IDGRP ON L_PROPENUM_GRP(ID_GRP); CREATE INDEX LPROPENUMGRP_IDSYS ON L_PROPENUM_GRP(ID_SYSTEM); CREATE INDEX LPROPENUMGRP_IDUSR_CR ON L_PROPENUM_GRP(IDUSER_CREATE); CREATE INDEX LPROPENUMGRP_IDUSR_UPD ON L_PROPENUM_GRP(IDUSER_UPDATE); CREATE INDEX LPROPENUMGRP_ITSGLOB ON L_PROPENUM_GRP(ITS_GLOBAL); CREATE INDEX LPROPENUMGRP_MNEMO ON L_PROPENUM_GRP(MNEMO_CODE); CREATE INDEX LPROPENUMGRP_NUMPP ON L_PROPENUM_GRP(NUMPP); CREATE INDEX LPROPENUMLIST_IDGRP ON L_PROPENUM_LIST(ID_GRP); CREATE INDEX LPROPENUMLIST_IDSYS ON L_PROPENUM_LIST(ID_SYSTEM); CREATE INDEX LPROPENUMLIST_IDUSR_CR ON L_PROPENUM_LIST(IDUSER_CREATE); CREATE INDEX LPROPENUMLIST_IDUSR_UPD ON L_PROPENUM_LIST(IDUSER_UPDATE); CREATE INDEX LPROPENUMLIST_ITSGLOB ON L_PROPENUM_LIST(ITS_GLOBAL); CREATE INDEX LPROPENUMLIST_MNEMO ON L_PROPENUM_LIST(MNEMO_CODE); CREATE INDEX LPROPENUMLIST_NUMPP ON L_PROPENUM_LIST(NUMPP); CREATE INDEX LPROPENUMMACRO_IDGRP ON L_PROPENUM_MACRO(ID_GRP); CREATE INDEX LPROPENUMMACRO_IDSYS ON L_PROPENUM_MACRO(ID_SYSTEM); CREATE INDEX LPROPENUMMACRO_IDUSR_CR ON L_PROPENUM_MACRO(IDUSER_CREATE); CREATE INDEX LPROPENUMMACRO_IDUSR_UPD ON L_PROPENUM_MACRO(IDUSER_UPDATE); CREATE INDEX LPROPENUMMACRO_ITSGLOB ON L_PROPENUM_MACRO(ITS_GLOBAL); CREATE INDEX LPROPENUMMACRO_MNEMO ON L_PROPENUM_MACRO(MNEMO_CODE); CREATE INDEX LPROPENUMMACRO_NUMPP ON L_PROPENUM_MACRO(NUMPP); CREATE INDEX LPROPENUMTOP_IDGRP ON L_PROPENUM_TOP(ID_GRP); CREATE INDEX LPROPENUMTOP_IDSYS ON L_PROPENUM_TOP(ID_SYSTEM); CREATE INDEX LPROPENUMTOP_IDUSR_CR ON L_PROPENUM_TOP(IDUSER_CREATE); CREATE INDEX LPROPENUMTOP_IDUSR_UPD ON L_PROPENUM_TOP(IDUSER_UPDATE); CREATE INDEX LPROPENUMTOP_ITSGLOB ON L_PROPENUM_TOP(ITS_GLOBAL); CREATE INDEX LPROPENUMTOP_MNEMO ON L_PROPENUM_TOP(MNEMO_CODE); CREATE INDEX LPROPENUMTOP_NUMPP ON L_PROPENUM_TOP(NUMPP); CREATE INDEX LPROPENUMVAL_IDGRP ON L_PROPENUM_VAL(ID_GRP); CREATE INDEX LPROPENUMVAL_IDSYS ON L_PROPENUM_VAL(ID_SYSTEM); CREATE INDEX LPROPENUMVAL_IDUSR_CR ON L_PROPENUM_VAL(IDUSER_CREATE); CREATE INDEX LPROPENUMVAL_IDUSR_UPD ON L_PROPENUM_VAL(IDUSER_UPDATE); CREATE INDEX LPROPENUMVAL_ITSGLOB ON L_PROPENUM_VAL(ITS_GLOBAL); CREATE INDEX LPROPENUMVAL_MNEMO ON L_PROPENUM_VAL(MNEMO_CODE); CREATE INDEX LPROPENUMVAL_NUMPP ON L_PROPENUM_VAL(NUMPP); CREATE INDEX LPROPNUMGRP_IDGRP ON L_PROPNUMBER_GRP(ID_GRP); CREATE INDEX LPROPNUMGRP_IDSYS ON L_PROPNUMBER_GRP(ID_SYSTEM); CREATE INDEX LPROPNUMGRP_IDUSR_CR ON L_PROPNUMBER_GRP(IDUSER_CREATE); CREATE INDEX LPROPNUMGRP_IDUSR_UPD ON L_PROPNUMBER_GRP(IDUSER_UPDATE); CREATE INDEX LPROPNUMGRP_ITSGLOB ON L_PROPNUMBER_GRP(ITS_GLOBAL); CREATE INDEX LPROPNUMGRP_MNEMO ON L_PROPNUMBER_GRP(MNEMO_CODE); CREATE INDEX LPROPNUMGRP_NUMPP ON L_PROPNUMBER_GRP(NUMPP); CREATE INDEX LPROPNUMLIST_IDGRP ON L_PROPNUMBER_LIST(ID_GRP); CREATE INDEX LPROPNUMLIST_IDSYS ON L_PROPNUMBER_LIST(ID_SYSTEM); CREATE INDEX LPROPNUMLIST_IDUSR_CR ON L_PROPNUMBER_LIST(IDUSER_CREATE); CREATE INDEX LPROPNUMLIST_IDUSR_UPD ON L_PROPNUMBER_LIST(IDUSER_UPDATE); CREATE INDEX LPROPNUMLIST_ITSGLOB ON L_PROPNUMBER_LIST(ITS_GLOBAL); CREATE INDEX LPROPNUMLIST_MNEMO ON L_PROPNUMBER_LIST(MNEMO_CODE); CREATE INDEX LPROPNUMLIST_NUMPP ON L_PROPNUMBER_LIST(NUMPP); CREATE INDEX LPROPNUMMACRO_IDGRP ON L_PROPNUMBER_MACRO(ID_GRP); CREATE INDEX LPROPNUMMACRO_IDSYS ON L_PROPNUMBER_MACRO(ID_SYSTEM); CREATE INDEX LPROPNUMMACRO_IDUSR_CR ON L_PROPNUMBER_MACRO(IDUSER_CREATE); CREATE INDEX LPROPNUMMACRO_IDUSR_UPD ON L_PROPNUMBER_MACRO(IDUSER_UPDATE); CREATE INDEX LPROPNUMMACRO_ITSGLOB ON L_PROPNUMBER_MACRO(ITS_GLOBAL); CREATE INDEX LPROPNUMMACRO_MNEMO ON L_PROPNUMBER_MACRO(MNEMO_CODE); CREATE INDEX LPROPNUMMACRO_NUMPP ON L_PROPNUMBER_MACRO(NUMPP); CREATE INDEX LPROPNUMTOP_IDGRP ON L_PROPNUMBER_TOP(ID_GRP); CREATE INDEX LPROPNUMTOP_IDSYS ON L_PROPNUMBER_TOP(ID_SYSTEM); CREATE INDEX LPROPNUMTOP_IDUSR_CR ON L_PROPNUMBER_TOP(IDUSER_CREATE); CREATE INDEX LPROPNUMTOP_IDUSR_UPD ON L_PROPNUMBER_TOP(IDUSER_UPDATE); CREATE INDEX LPROPNUMTOP_ITSGLOB ON L_PROPNUMBER_TOP(ITS_GLOBAL); CREATE INDEX LPROPNUMTOP_MNEMO ON L_PROPNUMBER_TOP(MNEMO_CODE); CREATE INDEX LPROPNUMTOP_NUMPP ON L_PROPNUMBER_TOP(NUMPP); CREATE INDEX LPROPTEXTGRP_IDGRP ON L_PROPTEXT_GRP(ID_GRP); CREATE INDEX LPROPTEXTGRP_IDSYS ON L_PROPTEXT_GRP(ID_SYSTEM); CREATE INDEX LPROPTEXTGRP_IDUSR_CR ON L_PROPTEXT_GRP(IDUSER_CREATE); CREATE INDEX LPROPTEXTGRP_IDUSR_UPD ON L_PROPTEXT_GRP(IDUSER_UPDATE); CREATE INDEX LPROPTEXTGRP_ITSGLOB ON L_PROPTEXT_GRP(ITS_GLOBAL); CREATE INDEX LPROPTEXTGRP_MNEMO ON L_PROPTEXT_GRP(MNEMO_CODE); CREATE INDEX LPROPTEXTGRP_NUMPP ON L_PROPTEXT_GRP(NUMPP); CREATE INDEX LPROPTEXTLIST_IDGRP ON L_PROPTEXT_LIST(ID_GRP); CREATE INDEX LPROPTEXTLIST_IDSYS ON L_PROPTEXT_LIST(ID_SYSTEM); CREATE INDEX LPROPTEXTLIST_IDUSR_CR ON L_PROPTEXT_LIST(IDUSER_CREATE); CREATE INDEX LPROPTEXTLIST_IDUSR_UPD ON L_PROPTEXT_LIST(IDUSER_UPDATE); CREATE INDEX LPROPTEXTLIST_ITSGLOB ON L_PROPTEXT_LIST(ITS_GLOBAL); CREATE INDEX LPROPTEXTLIST_MNEMO ON L_PROPTEXT_LIST(MNEMO_CODE); CREATE INDEX LPROPTEXTLIST_NUMPP ON L_PROPTEXT_LIST(NUMPP); CREATE INDEX LPROPTEXTMACRO_IDGRP ON L_PROPTEXT_MACRO(ID_GRP); CREATE INDEX LPROPTEXTMACRO_IDSYS ON L_PROPTEXT_MACRO(ID_SYSTEM); CREATE INDEX LPROPTEXTMACRO_IDUSR_CR ON L_PROPTEXT_MACRO(IDUSER_CREATE); CREATE INDEX LPROPTEXTMACRO_IDUSR_UPD ON L_PROPTEXT_MACRO(IDUSER_UPDATE); CREATE INDEX LPROPTEXTMACRO_ITSGLOB ON L_PROPTEXT_MACRO(ITS_GLOBAL); CREATE INDEX LPROPTEXTMACRO_MNEMO ON L_PROPTEXT_MACRO(MNEMO_CODE); CREATE INDEX LPROPTEXTMACRO_NUMPP ON L_PROPTEXT_MACRO(NUMPP); CREATE INDEX LPROPTEXTTOP_IDGRP ON L_PROPTEXT_TOP(ID_GRP); CREATE INDEX LPROPTEXTTOP_IDSYS ON L_PROPTEXT_TOP(ID_SYSTEM); CREATE INDEX LPROPTEXTTOP_IDUSR_CR ON L_PROPTEXT_TOP(IDUSER_CREATE); CREATE INDEX LPROPTEXTTOP_IDUSR_UPD ON L_PROPTEXT_TOP(IDUSER_UPDATE); CREATE INDEX LPROPTEXTTOP_ITSGLOB ON L_PROPTEXT_TOP(ITS_GLOBAL); CREATE INDEX LPROPTEXTTOP_MNEMO ON L_PROPTEXT_TOP(MNEMO_CODE); CREATE INDEX LPROPTEXTTOP_NUMPP ON L_PROPTEXT_TOP(NUMPP); CREATE INDEX LTYPEOBJGRP_IDGRP ON L_TYPEOBJ_GRP(ID_GRP); CREATE INDEX LTYPEOBJGRP_IDSYS ON L_TYPEOBJ_GRP(ID_SYSTEM); CREATE INDEX LTYPEOBJGRP_IDUSR_CR ON L_TYPEOBJ_GRP(IDUSER_CREATE); CREATE INDEX LTYPEOBJGRP_IDUSR_UPD ON L_TYPEOBJ_GRP(IDUSER_UPDATE); CREATE INDEX LTYPEOBJGRP_ITSGLOB ON L_TYPEOBJ_GRP(ITS_GLOBAL); CREATE INDEX LTYPEOBJGRP_MNEMO ON L_TYPEOBJ_GRP(MNEMO_CODE); CREATE INDEX LTYPEOBJGRP_NUMPP ON L_TYPEOBJ_GRP(NUMPP); CREATE INDEX LTYPEOBJLIST_IDGRP ON L_TYPEOBJ_LIST(ID_GRP); CREATE INDEX LTYPEOBJLIST_IDIMG ON L_TYPEOBJ_LIST(ID_IMAGE); CREATE INDEX LTYPEOBJLIST_IDKIND ON L_TYPEOBJ_LIST(ID_KIND); CREATE INDEX LTYPEOBJLIST_IDSYS ON L_TYPEOBJ_LIST(ID_SYSTEM); CREATE INDEX LTYPEOBJLIST_IDUSR_CR ON L_TYPEOBJ_LIST(IDUSER_CREATE); CREATE INDEX LTYPEOBJLIST_IDUSR_UPD ON L_TYPEOBJ_LIST(IDUSER_UPDATE); CREATE INDEX LTYPEOBJLIST_ITSABSTR ON L_TYPEOBJ_LIST(ITS_ABSTRACT); CREATE INDEX LTYPEOBJLIST_ITSGLOB ON L_TYPEOBJ_LIST(ITS_GLOBAL); CREATE INDEX LTYPEOBJLIST_MNEMO ON L_TYPEOBJ_LIST(MNEMO_CODE); CREATE INDEX LTYPEOBJLIST_NUMPP ON L_TYPEOBJ_LIST(NUMPP); CREATE INDEX LTYPEOBJMACRO_IDGRP ON L_TYPEOBJ_MACRO(ID_GRP); CREATE INDEX LTYPEOBJMACRO_IDSYS ON L_TYPEOBJ_MACRO(ID_SYSTEM); CREATE INDEX LTYPEOBJMACRO_IDUSR_CR ON L_TYPEOBJ_MACRO(IDUSER_CREATE); CREATE INDEX LTYPEOBJMACRO_IDUSR_UPD ON L_TYPEOBJ_MACRO(IDUSER_UPDATE); CREATE INDEX LTYPEOBJMACRO_ITSGLOB ON L_TYPEOBJ_MACRO(ITS_GLOBAL); CREATE INDEX LTYPEOBJMACRO_MNEMO ON L_TYPEOBJ_MACRO(MNEMO_CODE); CREATE INDEX LTYPEOBJMACRO_NUMPP ON L_TYPEOBJ_MACRO(NUMPP); CREATE INDEX LTYPEOBJTOP_IDGRP ON L_TYPEOBJ_TOP(ID_GRP); CREATE INDEX LTYPEOBJTOP_IDSYS ON L_TYPEOBJ_TOP(ID_SYSTEM); CREATE INDEX LTYPEOBJTOP_IDUSR_CR ON L_TYPEOBJ_TOP(IDUSER_CREATE); CREATE INDEX LTYPEOBJTOP_IDUSR_UPD ON L_TYPEOBJ_TOP(IDUSER_UPDATE); CREATE INDEX LTYPEOBJTOP_ITSGLOB ON L_TYPEOBJ_TOP(ITS_GLOBAL); CREATE INDEX LTYPEOBJTOP_MNEMO ON L_TYPEOBJ_TOP(MNEMO_CODE); CREATE INDEX LTYPEOBJTOP_NUMPP ON L_TYPEOBJ_TOP(NUMPP); CREATE INDEX OBJTREECHOKE_IDUSR_CR ON OBJECTS_CHOKE(IDUSER_CREATE); CREATE INDEX OBJTREECHOKE_IDUSR_UPD ON OBJECTS_CHOKE(IDUSER_UPDATE); CREATE INDEX OBJPROPENUM_DATE1 ON OBJECTS_PROP_ENUM(DATE_1); CREATE INDEX OBJPROPENUM_DATE2 ON OBJECTS_PROP_ENUM(DATE_2); CREATE INDEX OBJPROPENUM_ITSGLOB ON OBJECTS_PROP_ENUM(ITS_GLOBAL); CREATE INDEX OBJPROPE_IDOWNER ON OBJECTS_PROP_ENUM(ID_OWNER); CREATE INDEX OBJPROPE_IDPACKET ON OBJECTS_PROP_ENUM(ID_PACKET); CREATE INDEX OBJPROPE_IDPROP ON OBJECTS_PROP_ENUM(ID_PROP); CREATE INDEX OBJPROPE_IDPROPVAL ON OBJECTS_PROP_ENUM(ID_PROP_VAL); CREATE INDEX OBJPROPE_IDUSR_CR ON OBJECTS_PROP_ENUM(IDUSER_CREATE); CREATE INDEX OBJPROPE_IDUSR_UPD ON OBJECTS_PROP_ENUM(IDUSER_UPDATE); CREATE INDEX OBJPROPEA_IDANOMAL ON OBJECTS_PROP_ENUM_ATTR(ID_ANOMAL); CREATE INDEX OBJPROPEA_IDAUTHOR ON OBJECTS_PROP_ENUM_ATTR(ID_AUTHOR); CREATE INDEX OBJPROPEA_IDCOMPLEX ON OBJECTS_PROP_ENUM_ATTR(ID_COMPLEX); CREATE INDEX OBJPROPEA_IDCONDITION ON OBJECTS_PROP_ENUM_ATTR(ID_CONDITION); CREATE INDEX OBJPROPEA_IDDEVICE ON OBJECTS_PROP_ENUM_ATTR(ID_DEVICE); CREATE INDEX OBJPROPEA_IDMETHOD ON OBJECTS_PROP_ENUM_ATTR(ID_METHOD); CREATE INDEX OBJPROPEA_IDOWNER ON OBJECTS_PROP_ENUM_ATTR(ID_OWNER); CREATE INDEX OBJPROPEA_IDTASK ON OBJECTS_PROP_ENUM_ATTR(ID_TASK); CREATE INDEX OBJPROPEA_IDUSR_CR ON OBJECTS_PROP_ENUM_ATTR(IDUSER_CREATE); CREATE INDEX OBJPROPEA_IDUSR_UPD ON OBJECTS_PROP_ENUM_ATTR(IDUSER_UPDATE); CREATE INDEX OBJPROPNUM_DATE1 ON OBJECTS_PROP_NUMBER(DATE_1); CREATE INDEX OBJPROPNUM_DATE2 ON OBJECTS_PROP_NUMBER(DATE_2); CREATE INDEX OBJPROPNUM_ITSGLOB ON OBJECTS_PROP_NUMBER(ITS_GLOBAL); CREATE INDEX OBJPROPN_IDOWNER ON OBJECTS_PROP_NUMBER(ID_OWNER); CREATE INDEX OBJPROPN_IDPACKET ON OBJECTS_PROP_NUMBER(ID_PACKET); CREATE INDEX OBJPROPN_IDPROP ON OBJECTS_PROP_NUMBER(ID_PROP); CREATE INDEX OBJPROPN_IDUSR_CR ON OBJECTS_PROP_NUMBER(IDUSER_CREATE); CREATE INDEX OBJPROPN_IDUSR_UPD ON OBJECTS_PROP_NUMBER(IDUSER_UPDATE); CREATE INDEX OBJPROPNA_IDANOMAL ON OBJECTS_PROP_NUM_ATTR(ID_ANOMAL); CREATE INDEX OBJPROPNA_IDAUTHOR ON OBJECTS_PROP_NUM_ATTR(ID_AUTHOR); CREATE INDEX OBJPROPNA_IDCOMPLEX ON OBJECTS_PROP_NUM_ATTR(ID_COMPLEX); CREATE INDEX OBJPROPNA_IDCONDITION ON OBJECTS_PROP_NUM_ATTR(ID_CONDITION); CREATE INDEX OBJPROPNA_IDDEVICE ON OBJECTS_PROP_NUM_ATTR(ID_DEVICE); CREATE INDEX OBJPROPNA_IDMETHOD ON OBJECTS_PROP_NUM_ATTR(ID_METHOD); CREATE INDEX OBJPROPNA_IDOWNER ON OBJECTS_PROP_NUM_ATTR(ID_OWNER); CREATE INDEX OBJPROPNA_IDTASK ON OBJECTS_PROP_NUM_ATTR(ID_TASK); CREATE INDEX OBJPROPNA_IDUSR_CR ON OBJECTS_PROP_NUM_ATTR(IDUSER_CREATE); CREATE INDEX OBJPROPNS_IDUSR_UPD ON OBJECTS_PROP_NUM_ATTR(IDUSER_UPDATE); CREATE INDEX OBJTREE_DATE1 ON OBJECTS_TREE(DATE_1); CREATE INDEX OBJTREE_DATE2 ON OBJECTS_TREE(DATE_2); CREATE INDEX OBJTREE_IDPACKET ON OBJECTS_TREE(ID_PACKET); CREATE INDEX OBJTREE_IDPARENT ON OBJECTS_TREE(ID_PARENT); CREATE INDEX OBJTREE_IDREF ON OBJECTS_TREE(ID_REF); CREATE INDEX OBJTREE_IDREFNEAR ON OBJECTS_TREE(ID_REF_NEAR); CREATE INDEX OBJTREE_IDTYPE ON OBJECTS_TREE(ID_TYPE); CREATE INDEX OBJTREE_IDUSR_CR ON OBJECTS_TREE(IDUSER_CREATE); CREATE INDEX OBJTREE_IDUSR_UPD ON OBJECTS_TREE(IDUSER_UPDATE); CREATE INDEX OBJTREE_ITSBASE ON OBJECTS_TREE(ITS_BASE); CREATE INDEX OBJTREE_ITSGLOB ON OBJECTS_TREE(ITS_GLOBAL); CREATE INDEX OBJTREE_LEVEL ON OBJECTS_TREE(LEVEL_THIS); CREATE INDEX OBJTREE_MNEMO ON OBJECTS_TREE(MNEMO_CODE); CREATE INDEX OBJTREE_NUMPP ON OBJECTS_TREE(NUMPP); CREATE INDEX OBJTREEA_IDANOMAL ON OBJECTS_TREE_ATTR(ID_ANOMAL); CREATE INDEX OBJTREEA_IDAUTHOR ON OBJECTS_TREE_ATTR(ID_AUTHOR); CREATE INDEX OBJTREEA_IDCOMPLEX ON OBJECTS_TREE_ATTR(ID_COMPLEX); CREATE INDEX OBJTREEA_IDCONDITION ON OBJECTS_TREE_ATTR(ID_CONDITION); CREATE INDEX OBJTREEA_IDDEVICE ON OBJECTS_TREE_ATTR(ID_DEVICE); CREATE INDEX OBJTREEA_IDMETHOD ON OBJECTS_TREE_ATTR(ID_METHOD); CREATE INDEX OBJTREEA_IDTASK ON OBJECTS_TREE_ATTR(ID_TASK); CREATE INDEX OBJTREEA_IDUSR_CR ON OBJECTS_TREE_ATTR(IDUSER_CREATE); CREATE INDEX OBJTREEA_IDUSR_UPD ON OBJECTS_TREE_ATTR(IDUSER_UPDATE); CREATE INDEX OTHERTABLESLIST_IDGRPP ON OTHER_TABLES_LIST(ID_GRP); CREATE INDEX OTHERTABLESLIST_NUMPP ON OTHER_TABLES_LIST(NUMPP); CREATE UNIQUE INDEX OTHERTABLESLIST_TN ON OTHER_TABLES_LIST(TABLE_NAME); CREATE INDEX ROLESGRP_IDGRP ON ROLES_GRP(ID_GRP); CREATE INDEX ROLESGRP_IDSYS ON ROLES_GRP(ID_SYSTEM); CREATE INDEX ROLESGRP_IDUSR_CR ON ROLES_GRP(IDUSER_CREATE); CREATE INDEX ROLESGRP_IDUSR_UPD ON ROLES_GRP(IDUSER_UPDATE); CREATE INDEX ROLESGRP_ITSGLOB ON ROLES_GRP(ITS_GLOBAL); CREATE INDEX ROLESGRP_MNEMO ON ROLES_GRP(MNEMO_CODE); CREATE INDEX ROLESGRP_NUMPP ON ROLES_GRP(NUMPP); CREATE INDEX ROLESLIST_IDLIST ON ROLES_LIST(ID_GRP); CREATE INDEX ROLESLIST_IDSYS ON ROLES_LIST(ID_SYSTEM); CREATE INDEX ROLESLIST_IDUSR_CR ON ROLES_LIST(IDUSER_CREATE); CREATE INDEX ROLESLIST_IDUSR_UPD ON ROLES_LIST(IDUSER_UPDATE); CREATE INDEX ROLESLIST_ITSGLOB ON ROLES_LIST(ITS_GLOBAL); CREATE INDEX ROLESLIST_MNEMO ON ROLES_LIST(MNEMO_CODE); CREATE INDEX ROLESLIST_NUMPP ON ROLES_LIST(NUMPP); CREATE INDEX ROLESMACRO_IDMACRO ON ROLES_MACRO(ID_GRP); CREATE INDEX ROLESMACRO_IDSYS ON ROLES_MACRO(ID_SYSTEM); CREATE INDEX ROLESMACRO_IDUSR_CR ON ROLES_MACRO(IDUSER_CREATE); CREATE INDEX ROLESMACRO_IDUSR_UPD ON ROLES_MACRO(IDUSER_UPDATE); CREATE INDEX ROLESMACRO_ITSGLOB ON ROLES_MACRO(ITS_GLOBAL); CREATE INDEX ROLESMACRO_MNEMO ON ROLES_MACRO(MNEMO_CODE); CREATE INDEX ROLESMACRO_NUMPP ON ROLES_MACRO(NUMPP); CREATE INDEX ROLESTOP_IDSYS ON ROLES_TOP(ID_SYSTEM); CREATE INDEX ROLESTOP_IDTOP ON ROLES_TOP(ID_GRP); CREATE INDEX ROLESTOP_IDUSR_CR ON ROLES_TOP(IDUSER_CREATE); CREATE INDEX ROLESTOP_IDUSR_UPD ON ROLES_TOP(IDUSER_UPDATE); CREATE INDEX ROLESTOP_ITSGLOB ON ROLES_TOP(ITS_GLOBAL); CREATE INDEX ROLESTOP_MNEMO ON ROLES_TOP(MNEMO_CODE); CREATE INDEX ROLESTOP_NUMPP ON ROLES_TOP(NUMPP); CREATE INDEX SAS_DATESTART ON SPACE_APPARAT_START(DATE_START); CREATE INDEX SAS_IDOWNER ON SPACE_APPARAT_START(ID_OWNER); CREATE INDEX SAS_NUMPP ON SPACE_APPARAT_START(NUMPP); CREATE INDEX STORAGELIST_ABDE5 ON STORAGE_LIST(ALIASBDE5); CREATE INDEX STORAGELIST_IDDB ON STORAGE_LIST(ID_DB); CREATE INDEX STORAGELIST_IDGRP ON STORAGE_LIST(ID_GRP); CREATE INDEX STORAGELIST_IDUSR_CR ON STORAGE_LIST(IDUSER_CREATE); CREATE INDEX STORAGELIST_IDUSR_UPD ON STORAGE_LIST(IDUSER_UPDATE); CREATE INDEX STORAGELIST_NUMPP ON STORAGE_LIST(NUMPP); CREATE INDEX SYSCAL_DATESTR ON SYS_CALENDAR(DATEX_STR); CREATE INDEX SYSCAL_YMD ON SYS_CALENDAR(YYYYMMDD); CREATE INDEX SYSCONSTGRP_IDGRP ON SYS_CONST_GRP(ID_GRP); CREATE INDEX SYSCONSTGRP_IDSYS ON SYS_CONST_GRP(ID_SYSTEM); CREATE INDEX SYSCONSTGRP_IDUSR_CR ON SYS_CONST_GRP(IDUSER_CREATE); CREATE INDEX SYSCONSTGRP_IDUSR_UPD ON SYS_CONST_GRP(IDUSER_UPDATE); CREATE INDEX SYSCONSTGRP_ITSGLOB ON SYS_CONST_GRP(ITS_GLOBAL); CREATE INDEX SYSCONSTGRP_MNEMO ON SYS_CONST_GRP(MNEMO_CODE); CREATE INDEX SYSCONSTGRP_NUMPP ON SYS_CONST_GRP(NUMPP); CREATE INDEX SYSCONST_IDGRP ON SYS_CONST_LIST(ID_GRP); CREATE INDEX SYSCONST_IDSYS ON SYS_CONST_LIST(ID_SYSTEM); CREATE INDEX SYSCONST_IDUSR_CR ON SYS_CONST_LIST(IDUSER_CREATE); CREATE INDEX SYSCONST_IDUSR_UPD ON SYS_CONST_LIST(IDUSER_UPDATE); CREATE INDEX SYSCONST_ITSGLOB ON SYS_CONST_LIST(ITS_GLOBAL); CREATE INDEX SYSCONST_MNEMO ON SYS_CONST_LIST(MNEMO_CODE); CREATE INDEX SYSCONST_NUMPP ON SYS_CONST_LIST(NUMPP); CREATE INDEX SYSCONSTMACRO_IDGRP ON SYS_CONST_MACRO(ID_GRP); CREATE INDEX SYSCONSTMACRO_IDSYS ON SYS_CONST_MACRO(ID_SYSTEM); CREATE INDEX SYSCONSTMACRO_IDUSR_CR ON SYS_CONST_MACRO(IDUSER_CREATE); CREATE INDEX SYSCONSTMACRO_IDUSR_UPD ON SYS_CONST_MACRO(IDUSER_UPDATE); CREATE INDEX SYSCONSTMACRO_ITSGLOB ON SYS_CONST_MACRO(ITS_GLOBAL); CREATE INDEX SYSCONSTMACRO_MNEMO ON SYS_CONST_MACRO(MNEMO_CODE); CREATE INDEX SYSCONSTMACRO_NUMPP ON SYS_CONST_MACRO(NUMPP); CREATE INDEX SYSCONSTTOP_IDGRP ON SYS_CONST_TOP(ID_GRP); CREATE INDEX SYSCONSTTOP_IDSYS ON SYS_CONST_TOP(ID_SYSTEM); CREATE INDEX SYSCONSTTOP_IDUSR_CR ON SYS_CONST_TOP(IDUSER_CREATE); CREATE INDEX SYSCONSTTOP_IDUSR_UPD ON SYS_CONST_TOP(IDUSER_UPDATE); CREATE INDEX SYSCONSTTOP_ITSGLOB ON SYS_CONST_TOP(ITS_GLOBAL); CREATE INDEX SYSCONSTTOP_MNEMO ON SYS_CONST_TOP(MNEMO_CODE); CREATE INDEX SYSCONSTTOP_NUMPP ON SYS_CONST_TOP(NUMPP); CREATE INDEX SEIT_DATEEVENT ON SYS_EVENTS_IN_TABLES(DATE_EVENT); CREATE INDEX SEIT_IDTABLE ON SYS_EVENTS_IN_TABLES(IDTABLE); CREATE INDEX SEIT_IDTHIS ON SYS_EVENTS_IN_TABLES(IDTHIS); CREATE INDEX SEIT_WHAT ON SYS_EVENTS_IN_TABLES(WHAT); CREATE INDEX SYSHHMMSS_HHMMSS ON SYS_HHMMSS(HHMMSS); CREATE INDEX SYSHHMMSS_HHMMSSI ON SYS_HHMMSS(HHMMSS_I); CREATE INDEX SYSTABLESGRP_IDGRP ON SYS_TABLES_GRP(ID_GRP); CREATE INDEX SYSTABLESGRP_MNEMO ON SYS_TABLES_GRP(MNEMO_CODE); CREATE INDEX SYSTABLESGRP_NUMPP ON SYS_TABLES_GRP(NUMPP); CREATE INDEX SYSTABLESLIST_IDGRP ON SYS_TABLES_LIST(ID_GRP); CREATE INDEX SYSTABLESLIST_NUMPP ON SYS_TABLES_LIST(NUMPP); CREATE UNIQUE INDEX SYSTABLESLIST_TN ON SYS_TABLES_LIST(TABLE_NAME); CREATE INDEX SYSTABLESMACRO_IDGRP ON SYS_TABLES_MACRO(ID_GRP); CREATE INDEX SYSTABLESMACRO_MNEMO ON SYS_TABLES_MACRO(MNEMO_CODE); CREATE INDEX SYSTABLESMACRO_NUMPP ON SYS_TABLES_MACRO(NUMPP); CREATE INDEX SYSTABLESTOP_IDGRP ON SYS_TABLES_TOP(ID_GRP); CREATE INDEX SYSTABLESTOP_MNEMO ON SYS_TABLES_TOP(MNEMO_CODE); CREATE INDEX SYSTABLESTOP_NUMPP ON SYS_TABLES_TOP(NUMPP); CREATE INDEX SYSTABLEFIELDS_FN ON SYS_TABLE_FIELDS(FIELD_NAME); CREATE INDEX SYSTABLEFIELDS_ID_TABLE ON SYS_TABLE_FIELDS(ID_TABLE); CREATE INDEX SYSTABLEFIELDS_NUMPP ON SYS_TABLE_FIELDS(NUMPP); CREATE INDEX USERSGRP_IDGRP ON USERS_GRP(ID_GRP); CREATE INDEX USERSGRP_IDSYS ON USERS_GRP(ID_SYSTEM); CREATE INDEX USERSGRP_IDUSR_CR ON USERS_GRP(IDUSER_CREATE); CREATE INDEX USERSGRP_IDUSR_UPD ON USERS_GRP(IDUSER_UPDATE); CREATE INDEX USERSGRP_ITSGLOB ON USERS_GRP(ITS_GLOBAL); CREATE INDEX USERSGRP_MNEMO ON USERS_GRP(MNEMO_CODE); CREATE INDEX USERSGRP_NUMPP ON USERS_GRP(NUMPP); CREATE INDEX USERSLIST_IDLIST ON USERS_LIST(ID_GRP); CREATE INDEX USERSLIST_IDROLE ON USERS_LIST(ID_ROLE); CREATE INDEX USERSLIST_IDSYS ON USERS_LIST(ID_SYSTEM); CREATE INDEX USERSLIST_IDUSR_CR ON USERS_LIST(IDUSER_CREATE); CREATE INDEX USERSLIST_IDUSR_UPD ON USERS_LIST(IDUSER_UPDATE); CREATE INDEX USERSLIST_ITSGLOB ON USERS_LIST(ITS_GLOBAL); CREATE INDEX USERSLIST_MNEMO ON USERS_LIST(MNEMO_CODE); CREATE INDEX USERSLIST_NUMPP ON USERS_LIST(NUMPP); CREATE INDEX USERSMACRO_IDMACRO ON USERS_MACRO(ID_GRP); CREATE INDEX USERSMACRO_IDSYS ON USERS_MACRO(ID_SYSTEM); CREATE INDEX USERSMACRO_IDUSR_CR ON USERS_MACRO(IDUSER_CREATE); CREATE INDEX USERSMACRO_IDUSR_UPD ON USERS_MACRO(IDUSER_UPDATE); CREATE INDEX USERSMACRO_ITSGLOB ON USERS_MACRO(ITS_GLOBAL); CREATE INDEX USERSMACRO_MNEMO ON USERS_MACRO(MNEMO_CODE); CREATE INDEX USERSMACRO_NUMPP ON USERS_MACRO(NUMPP); CREATE INDEX USERSTOP_IDSYS ON USERS_TOP(ID_SYSTEM); CREATE INDEX USERSTOP_IDTOP ON USERS_TOP(ID_GRP); CREATE INDEX USERSTOP_IDUSR_CR ON USERS_TOP(IDUSER_CREATE); CREATE INDEX USERSTOP_IDUSR_UPD ON USERS_TOP(IDUSER_UPDATE); CREATE INDEX USERSTOP_ITSGLOB ON USERS_TOP(ITS_GLOBAL); CREATE INDEX USERSTOP_MNEMO ON USERS_TOP(MNEMO_CODE); CREATE INDEX USERSTOP_NUMPP ON USERS_TOP(NUMPP); CREATE GENERATOR GEN_STORAGE_LIST; CREATE GENERATOR GEN_L_TYPEOBJ_TOP; CREATE GENERATOR GEN_SYSCONST; CREATE GENERATOR GEN_SYSCONSTGRP; CREATE GENERATOR GEN_L_TYPEOBJ_MACRO; CREATE GENERATOR GEN_L_TYPEOBJ_GRP; CREATE GENERATOR GEN_L_TYPEOBJ_LIST; CREATE GENERATOR GEN_OBJTREE; CREATE GENERATOR GEN_OBJTREE_1; CREATE GENERATOR GEN_OBJTREE_2; CREATE GENERATOR GEN_OBJTREE_3; CREATE GENERATOR GEN_L_PROPENUM_TOP; CREATE GENERATOR GEN_L_PROPENUM_MACRO; CREATE GENERATOR GEN_L_PROPENUM_GRP; CREATE GENERATOR GEN_L_PROPENUM_LIST; CREATE GENERATOR GEN_OBJROPE_1; CREATE GENERATOR GEN_OBJROPE_2; CREATE GENERATOR GEN_OBJROPE_3; CREATE GENERATOR GEN_USERS_TOP; CREATE GENERATOR GEN_USERS_MACRO; CREATE GENERATOR GEN_USERS_GRP; CREATE GENERATOR GEN_USERS_LIST; CREATE GENERATOR GEN_L_PROPNUM_TOP; CREATE GENERATOR GEN_L_PROPNUM_MACRO; CREATE GENERATOR GEN_L_PROPNUM_GRP; CREATE GENERATOR GEN_L_PROPNUM_LIST; CREATE GENERATOR GEN_SYSTABLES; CREATE GENERATOR GEN_SYSTABLESGRP; CREATE GENERATOR GEN_SYSTABLESFLDS; CREATE GENERATOR GEN_SYSTABLESMACRO; CREATE GENERATOR GEN_SYSTABLESTOP; CREATE GENERATOR GEN_ROLES_TOP; CREATE GENERATOR GEN_ROLES_MACRO; CREATE GENERATOR GEN_ROLES_GRP; CREATE GENERATOR GEN_ROLES_LIST; CREATE GENERATOR GEN_L_PROPENUM_VAL; CREATE GENERATOR GEN_SYSCONSTMACRO; CREATE GENERATOR GEN_SYSCONSTTOP; CREATE GENERATOR GEN_EVENTINTABLESLOG; CREATE GENERATOR GEN_OBJROPN_1; CREATE GENERATOR GEN_OBJROPN_2; CREATE GENERATOR GEN_OBJROPN_3; CREATE GENERATOR GEN_L_PROPTEXT_TOP; CREATE GENERATOR GEN_L_PROPTEXT_MACRO; CREATE GENERATOR GEN_L_PROPTEXT_GRP; CREATE GENERATOR GEN_L_PROPTEXT_LIST; CREATE GENERATOR GEN_SPACE_APPARAT_START; CREATE GENERATOR GEN_OTHERTABLES; /* Exceptions */ CREATE EXCEPTION DATA_IS_EMPTY "Data is Empty (Данные нулевые)"; CREATE EXCEPTION MNEMOCODE_EXIST "This Mnemo-code exist (Этот мнемокод уже существует !)"; CREATE EXCEPTION DATA_IS_NULL "Data is Null (Данные отсутствуют)"; CREATE EXCEPTION ITS_GLOBAL_NOT_EDIT "Its GLOBAL - not Edit (Это ГЛОБАЛЬНОСТЬ! Нельзя редактир)"; CREATE EXCEPTION ITS_GLOBAL_NOT_DEL "This Item is GLOBAL - not Del (Этот реквизит ГЛОБАЛЬНЫЙ! Нельзя удалять)"; CREATE EXCEPTION ITS_READONLY_NOT_EDIT "Its ReadOnly - not Edit (Это 'Только для Чтения' ! Нельзя редактир)"; CREATE EXCEPTION DATA_IS_NOT_COMPLETE "Data is not Complete (Данные не полные)"; CREATE EXCEPTION ITS_SYS_NOT_DEL "This Item is SYSTEM - not Del (Этот реквизит СИСТЕМНЫЙ! Нельзя удалять)"; CREATE EXCEPTION REF_EXISTS_NOT_DELETE "Referense exist. Not delete (Есть ссылки, нельзя удалять)"; CREATE EXCEPTION ITS_SYS_NOT_EDIT "Its SYSTEM - not Edit (Это СИСТЕМНОСТЬ! Нельзя редактир)"; CREATE EXCEPTION ITS_NOT_DEL "This Item - not Delete (Эту строку нельзя удалять)"; CREATE EXCEPTION USER_NOT_EXIST "This User not exist (Этот Пользователь НЕ существует !)"; CREATE EXCEPTION TYPEOBJECT_NOT_EXIST "This TypeObject not exist (Этот ТипОбъекта НЕ существует !)"; CREATE EXCEPTION ENUM_UM_NOT_EXIST "This UnitMeasure not exist (Эта Ед.Изм. НЕ существует !)"; CREATE EXCEPTION OBJECT_NOT_EXIST "This Object not exist (Этот Объект НЕ существует !)"; CREATE EXCEPTION ITS_READONLY_NOT_DEL "Its ReadOnly - not Del (Это 'Только для Чтения' ! Нельзя удалять)"; CREATE EXCEPTION LPROPENUMVAL_NOT_EXIST "This PropEnumValue not exist (Это Знач_Перчисл_Св-ва НЕ существует !)"; CREATE EXCEPTION LPROPNUMNER_NOT_EXIST "This PropNum not exist (Это Численн_Св-во НЕ существует !)"; CREATE EXCEPTION OBJPROPENUM_NOT_EXIST "This PropEnum not exist (Это Переч_Св-во НЕ существ. у объекта !)"; CREATE EXCEPTION OBJPROPNUM_NOT_EXIST "This PropNum not exist (Это Числ_Св-во НЕ существ. у объекта !)"; CREATE EXCEPTION ENUM_VAL_NOT_EXIST "This EnumsValue not exist (Это знач. Перечисл.св-ва НЕ существует !)"; COMMIT WORK; SET AUTODDL OFF; SET TERM ^ ; /* Stored procedures */ CREATE PROCEDURE GET_ID_THISNODE AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_DELIMITER_IDDB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_DELIMITER_IDNODE AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDTHIS_WITH_NODE AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ID_THISDB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDTHIS_WITH_NODE_DB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDKIND_IS_OBJECT AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDKIND_IS_PROCESS AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDKIND_IS_UNKNOWN AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDTHIS_ISROOT AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDPARENT_ISROOT AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_DELIMITER_IDOBJ AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ID_IS_UNKNOWN AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ID_OBJECT AS BEGIN EXIT; END ^ CREATE PROCEDURE USER_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE EXTRACT_YM_FROM_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE EXTRACT_YEAR_FROM_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE EXTRACT_MONTH_FROM_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE EXTRACT_DAY_FROM_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE CREATE_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE MY_TRUNC AS BEGIN EXIT; END ^ CREATE PROCEDURE INTEGER_IS_ODD AS BEGIN EXIT; END ^ CREATE PROCEDURE YEAR_IS_LEAP AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_SIZEDATE_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE MY_MOD AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_COUNTDAYS_FOR_YM AS BEGIN EXIT; END ^ CREATE PROCEDURE CREATE_DATE_INT AS BEGIN EXIT; END ^ CREATE PROCEDURE CREATE_DATE_STR AS BEGIN EXIT; END ^ CREATE PROCEDURE NUMBERS_IS_DATE AS BEGIN EXIT; END ^ CREATE PROCEDURE YMD_IS_DATE AS BEGIN EXIT; END ^ CREATE PROCEDURE FIRST_YEAR_FOR_GREG AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_SIZEDATE AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_DAYOFWEEK AS BEGIN EXIT; END ^ CREATE PROCEDURE D2YMD_MINUS_D1YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE CONTROL_TYPEOBJ AS BEGIN EXIT; END ^ CREATE PROCEDURE CONTROL_UNITMEASURE AS BEGIN EXIT; END ^ CREATE PROCEDURE DATE_TO_DATE_YMD AS BEGIN EXIT; END ^ CREATE PROCEDURE OBJECT_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE TIME_STR_TO_TIME_INT AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDTOPIC_ENUMLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDMACRO_ENUMLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDGROUP_ENUMLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDLIST_ENUMLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDVAL_ENUMLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDTOPIC_TYPEOBJLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDMACRO_TYPEOBJLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDGROUP_TYPEOBJLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDLIST_TYPEOBJLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE INSERT_SYSEVENTSINTABLES AS BEGIN EXIT; END ^ CREATE PROCEDURE MY_ROUND_2 AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_DELIMITERLEFT_001 AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDTOPIC_NUMBERLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDMACRO_NUMBERLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDGROUP_NUMBERLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDLIST_NUMBERLIB AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_DELIMITERRIGHT_001 AS BEGIN EXIT; END ^ CREATE PROCEDURE SYS_START_INIT_USERS_TOP AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_USER_IS_DB_SUPEREDITOR_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE SYS_START_INIT_USERS_MACRO AS BEGIN EXIT; END ^ CREATE PROCEDURE SYS_START_INIT_USERS_GRP AS BEGIN EXIT; END ^ CREATE PROCEDURE SYS_START_INIT_USERS_LIST AS BEGIN EXIT; END ^ CREATE PROCEDURE SYS_START_INIT_USERS AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_USER_IS_DB_SUPERREADER_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_USER_IS_DB_EMPTYUSER_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_USER_IS_NODE_ADMIN_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_USER_IS_DB_ADMIN_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE THIS_USER_IS_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ROLE_IS_SUPEREDITOR_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ROLE_IS_SUPERREADER_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ID_OBJPROPENUM AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ROLE_IS_EMPTY_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE L_ENUMVAL_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE THIS_ROLE_IS_DEF AS BEGIN EXIT; END ^ CREATE PROCEDURE THIS_ID_IS_EMPTY AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ID_OBJPROPNUMBER AS BEGIN EXIT; END ^ CREATE PROCEDURE CONTROL_LENUMVAL AS BEGIN EXIT; END ^ CREATE PROCEDURE CONTROL_LNUMBER AS BEGIN EXIT; END ^ CREATE PROCEDURE OBJPROPENUM_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE OBJPROPNUM_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_PROP_ENUM_NAME AS BEGIN EXIT; END ^ CREATE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_ID_THISDB_FULL AS BEGIN EXIT; END ^ CREATE PROCEDURE L_NUMPROP_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_UNITMEASURE_FOR_PROPNUMBER AS BEGIN EXIT; END ^ CREATE PROCEDURE CONTROL_USER_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE L_ENUMPROP_EXIST AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_IDPROP_FOR_IDVAL_ENUM AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_OBJ_PROPENUM_VAL_ACTUAL AS BEGIN EXIT; END ^ CREATE PROCEDURE GET_OBJ_PROPNUMBER_VAL_ACTUAL AS BEGIN EXIT; END ^ ALTER PROCEDURE GET_ID_THISNODE RETURNS (ID_NODE VARCHAR(4) CHARACTER SET WIN1251) AS BEGIN /* id this node (unique in tree-nodes) */ /* ID данного узла - уникальное значеник во всем иерархическом дереве узлов распределенного хранилища */ ID_NODE = '0'; SUSPEND; END ^ ALTER PROCEDURE GET_DELIMITER_IDDB RETURNS (DELIMITER_IDDB VARCHAR(1) CHARACTER SET WIN1251) AS BEGIN /* razdelitel megdu ID_DB i ID must be empty */ /* разделитель между значениями ID_DB и ID (при формировании ID_THIS) */ DELIMITER_IDDB = '-'; SUSPEND; END ^ ALTER PROCEDURE GET_DELIMITER_IDNODE RETURNS (DELIMITER_IDNODE VARCHAR(1) CHARACTER SET WIN1251) AS BEGIN /* razdelitel megdu ID_NODE i ID_DB */ /* разделитель между значениями ID_NODE и ID_DB (при формировании ID_THIS) */ DELIMITER_IDNODE = '!'; SUSPEND; END ^ ALTER PROCEDURE GET_IDTHIS_WITH_NODE (ID INTEGER) RETURNS (ID_THIS VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE IDNODE VARCHAR(4); DECLARE VARIABLE DELIMITER_IDNODE VARCHAR(1); BEGIN /* Calc ID_THIS with node */ /* Вычислить значение ID_THIS с учетом только ID узла */ EXECUTE PROCEDURE GET_DELIMITER_IDNODE RETURNING_VALUES :DELIMITER_IDNODE; EXECUTE PROCEDURE GET_ID_THISNODE RETURNING_VALUES :IDNODE; ID_THIS = :IDNODE || :DELIMITER_IDNODE || :ID; SUSPEND; END ^ ALTER PROCEDURE GET_ID_THISDB RETURNS (ID_DB VARCHAR(2) CHARACTER SET WIN1251) AS BEGIN /* id this DB (unique in node) */ /* ID данной базы данные - уникальное значение во всем узле */ /* в контексте узла должен быть = 0 */ ID_DB = '1'; SUSPEND; END ^ ALTER PROCEDURE GET_IDTHIS_WITH_NODE_DB (ID INTEGER) RETURNS (ID_THIS VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE IDNODE VARCHAR(4); DECLARE VARIABLE IDDB VARCHAR(2); DECLARE VARIABLE DELIMITER_IDNODE VARCHAR(1); DECLARE VARIABLE DELIMITER_IDDB VARCHAR(1); BEGIN /* Calc ID_THIS with id-node and id-DB */ /* Вычислить значение ID_THIS с учетом ID узла и id-DB */ EXECUTE PROCEDURE GET_DELIMITER_IDNODE RETURNING_VALUES :DELIMITER_IDNODE; EXECUTE PROCEDURE GET_DELIMITER_IDDB RETURNING_VALUES :DELIMITER_IDDB; EXECUTE PROCEDURE GET_ID_THISNODE RETURNING_VALUES :IDNODE; EXECUTE PROCEDURE GET_ID_THISDB RETURNING_VALUES :IDDB; ID_THIS = :IDNODE || :DELIMITER_IDNODE || :IDDB || :DELIMITER_IDDB || :ID; SUSPEND; END ^ ALTER PROCEDURE GET_IDKIND_IS_OBJECT RETURNS (ID_KIND INTEGER) AS BEGIN /* ID_KIND is Object */ /* Значение для поля ID_KIND = Объект */ ID_KIND = 1; SUSPEND; END ^ ALTER PROCEDURE GET_IDKIND_IS_PROCESS RETURNS (ID_KIND INTEGER) AS BEGIN /* ID_KIND is Process */ /* Значение для поля ID_KIND = Процесс */ ID_KIND = 2; SUSPEND; END ^ ALTER PROCEDURE GET_IDKIND_IS_UNKNOWN RETURNS (ID_KIND INTEGER) AS BEGIN /* ID_KIND is Unknown */ /* Значение для поля ID_KIND = Неизвестно (Неопределенно) */ ID_KIND = 0; SUSPEND; END ^ ALTER PROCEDURE GET_IDTHIS_ISROOT RETURNS (IDTHIS_ISROOT VARCHAR(40) CHARACTER SET WIN1251) AS BEGIN /* ID_THIS for root in OBJECT_TREE */ /* Значение ID_THIS для корневого узла дерева объектов OBJECT_TREE */ EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (0) RETURNING_VALUES :IDTHIS_ISROOT; SUSPEND; END ^ ALTER PROCEDURE GET_IDPARENT_ISROOT RETURNS (IDPARENT_ISROOT VARCHAR(2) CHARACTER SET WIN1251) AS BEGIN /* ID_PARENT for root in OBJECT_TREE */ /* Значение ID_PARENT для корневого узла дерева объектов OBJECT_TREE */ IDPARENT_ISROOT = '0'; SUSPEND; END ^ ALTER PROCEDURE GET_DELIMITER_IDOBJ RETURNS (DELIMITER_IDOBJ VARCHAR(1) CHARACTER SET WIN1251) AS BEGIN /* разделитель внутри ID_THIS для OBJECTS_TREE , OBJECTS_PROP_ENUM , OBJECTS_PROP_NUMBER */ DELIMITER_IDOBJ = '_'; SUSPEND; END ^ ALTER PROCEDURE GET_ID_IS_UNKNOWN RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS BEGIN /* ID is Unknown */ /* Неопределенное значение для любого идентификатора (ID-типа, ID-свойства и т.д. */ ID = '0'; SUSPEND; END ^ ALTER PROCEDURE GET_ID_OBJECT RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID1 INTEGER; DECLARE VARIABLE ID2 INTEGER; DECLARE VARIABLE ID3 INTEGER; DECLARE VARIABLE IDNODE VARCHAR(4); DECLARE VARIABLE IDDB VARCHAR(2); DECLARE VARIABLE DELIMITER_IDNODE VARCHAR(1); DECLARE VARIABLE DELIMITER_IDDB VARCHAR(1); DECLARE VARIABLE DELIMITER_IDOBJ VARCHAR(1); BEGIN /* Calc ID_THIS для OBJECTS_TREE with ID_NODE and ID_DB */ /* Вычислить ID_THIS для OBJECTS_TREE с учетом ID_NODE и ID_DB */ EXECUTE PROCEDURE GET_DELIMITER_IDNODE RETURNING_VALUES :DELIMITER_IDNODE; EXECUTE PROCEDURE GET_DELIMITER_IDDB RETURNING_VALUES :DELIMITER_IDDB; EXECUTE PROCEDURE GET_DELIMITER_IDOBJ RETURNING_VALUES :DELIMITER_IDOBJ; EXECUTE PROCEDURE GET_ID_THISNODE RETURNING_VALUES :IDNODE; EXECUTE PROCEDURE GET_ID_THISDB RETURNING_VALUES :IDDB; ID = ''; ID2 = GEN_ID(GEN_OBJTREE_2,0); /* текущее значение генератора-2 */ ID3 = GEN_ID(GEN_OBJTREE_3,0); /* текущее значение генератора-3 */ /* ------------------------------------------- */ /* Calc ID1 (first value) */ /* Вычисляем значение ID1 (младшее значение) */ ID1 = GEN_ID(GEN_OBJTREE_1,1); /* ------------------------------------------- */ /* =========================================== */ IF (:ID1>2147483640) THEN BEGIN /* ID1 - is very big */ /* Переполнение младшего значения */ /* ------------------------------------------- */ /* Reset gen-1 */ /* Сбрасываем генератор-1 в 0 */ ID1 =GEN_ID(GEN_OBJTREE_1,-GEN_ID(GEN_OBJTREE_1,0)); /* ------------------------------------------- */ /* ------------------------------------------- */ /* Calc ID2 (middle value) */ /* Вычисляем значение ID2 (среднее значение) */ ID2 = GEN_ID(GEN_OBJTREE_2,1); /* ------------------------------------------- */ END /* =========================================== */ /* =========================================== */ IF (:ID2>2147483640) THEN BEGIN /* ID2 - is very big */ /* Переполнение среднего значения */ /* ------------------------------------------- */ /* Reset gen-2 */ /* Сбрасываем генератор-2 в 0 */ ID2 = GEN_ID(GEN_OBJTREE_2,-GEN_ID(GEN_OBJTREE_2,0)); /* ------------------------------------------- */ /* ------------------------------------------- */ /* Calc ID3 ( big value) */ /* Вычисляем значение ID3 (старшее значение) */ ID3 = GEN_ID(GEN_OBJTREE_3,1); /* ------------------------------------------- */ END /* =========================================== */ /* ------------------------------------------- */ /* Calc value ID_THIS */ /* Вычисляем значение ID_THIS */ ID = :IDNODE || :DELIMITER_IDNODE || :IDDB || :DELIMITER_IDDB || :ID3 || DELIMITER_IDOBJ || :ID2 || DELIMITER_IDOBJ || :ID1; /* ------------------------------------------- */ SUSPEND; END ^ ALTER PROCEDURE USER_EXIST (IDUSER VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID VARCHAR(40); BEGIN /* Detect This User */ /* Проверить существование Пользователя (ID_THIS) */ YES = 0; IF (:IDUSER IS NULL) THEN IDUSER = ''; IF (:IDUSER <> '') THEN BEGIN SELECT ID_THIS FROM USERS_LIST WHERE ID_THIS = :IDUSER INTO :ID; IF (:ID IS NULL) THEN ID = ''; IF (:ID = :IDUSER) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE EXTRACT_YM_FROM_YMD (YMD INTEGER) RETURNS (YM INTEGER) AS BEGIN /* This Proc - CONVERT YYYYMMDD to YYMM */ /* Выделить ГодМесяц(YYYYMM) из даты в числовом формате(YYYYMMDD) */ IF (:YMD IS NULL) THEN YMD=0; YM = CAST((:YMD/100) AS INTEGER); IF (:YM IS NULL) THEN YM=0; IF (:YM < 0) THEN YM=0; SUSPEND; END ^ ALTER PROCEDURE EXTRACT_YEAR_FROM_YMD (YMD INTEGER) RETURNS (YE INTEGER) AS BEGIN /* This Proc - Extract YEAR from YYYYMMDD */ /* Выделить ГОД из даты в числовом формате(YYYYMMDD) */ IF (:YMD IS NULL) THEN YMD=0; YE = CAST((:YMD/10000) AS INTEGER); IF (:YE IS NULL) THEN YE=0; IF (:YE < 0) THEN YE=0; SUSPEND; END ^ ALTER PROCEDURE EXTRACT_MONTH_FROM_YMD (YMD INTEGER) RETURNS (MO INTEGER) AS DECLARE VARIABLE YM INTEGER; DECLARE VARIABLE YE INTEGER; BEGIN /* This Proc - Extract MONTH from YYYYMMDD */ /* Выделить МЕСЯЦ из даты в числовом формате(YYYYMMDD) */ EXECUTE PROCEDURE EXTRACT_YM_FROM_YMD (:YMD) RETURNING_VALUES (:YM); EXECUTE PROCEDURE EXTRACT_YEAR_FROM_YMD (:YMD) RETURNING_VALUES (:YE); MO = :YM - :YE*100; IF (:MO IS NULL) THEN MO=0; IF (:MO < 0) THEN MO=0; SUSPEND; END ^ ALTER PROCEDURE EXTRACT_DAY_FROM_YMD (YMD INTEGER) RETURNS (DAY INTEGER) AS DECLARE VARIABLE YM INTEGER; BEGIN /* This Proc - Extract DAY from YYYYMMDD */ /* Выделить ДЕНЬ из даты в числовом формате(YYYYMMDD) */ EXECUTE PROCEDURE EXTRACT_YM_FROM_YMD (:YMD) RETURNING_VALUES (:YM); DAY = :YMD - :YM*100; IF (:DAY IS NULL) THEN DAY=0; IF (:DAY < 0) THEN DAY=0; SUSPEND; END ^ ALTER PROCEDURE CREATE_YMD (YE INTEGER, MO INTEGER, DA INTEGER) RETURNS (YMD INTEGER) AS DECLARE VARIABLE YES INTEGER; BEGIN /* This Proc - Create YYYYMMDD from Year, Month, Day */ /* Создать дату в числовом формате(YYYYMMDD) из чисел YE, MO, DA */ YMD = 0; EXECUTE PROCEDURE NUMBERS_IS_DATE (:YE, :MO, :DA) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN IF (:DA IS NULL) THEN DA=0; IF (:MO IS NULL) THEN MO=0; IF (:YE IS NULL) THEN YE=0; YMD = :YE*10000 + :MO*100 + :DA; IF (:YMD IS NULL) THEN YMD=0; IF (:YMD < 0) THEN YMD=0; END SUSPEND; END ^ ALTER PROCEDURE MY_TRUNC (V DOUBLE PRECISION) RETURNS (RES INTEGER) AS BEGIN /* TRUNC - emulation */ /* Эмуляция TRUNC */ IF (V IS NULL) THEN V = 0; RES = CAST(V AS INTEGER); IF (:RES > :V) THEN RES = :RES - 1; SUSPEND; END ^ ALTER PROCEDURE INTEGER_IS_ODD (NUM INTEGER) RETURNS (YES INTEGER) AS BEGIN /* This Proc - Control NUM - is ODD */ /* Проверка, является ли число NUM - нечетным */ YES = 1; IF (:NUM IS NULL) THEN NUM=0; IF (CAST((:NUM/2) AS INTEGER)*2 = :NUM) THEN YES = 0; SUSPEND; END ^ ALTER PROCEDURE YEAR_IS_LEAP (YE INTEGER) RETURNS (YES INTEGER) AS DECLARE VARIABLE N INTEGER; BEGIN /* This Proc - Control YEAR - is LEAP */ /* Проверка, является ли год - високосным */ YES = 0; /* по умолчанию - нет */ IF (:YE IS NULL) THEN YE=0; N = CAST((:YE/400) AS INTEGER); IF (:N*400 = :YE) THEN BEGIN /* Yes - its leap */ /* Да, этот год високосный */ YES = 1; END ELSE BEGIN N = CAST((:YE/100) AS INTEGER); IF (:N*100 <> :YE) THEN BEGIN N = CAST((:YE/4) AS INTEGER); IF (:N*4 = :YE) THEN BEGIN /* Yes - its leap */ /* Да, этот год високосный */ YES = 1; END END END SUSPEND; END ^ ALTER PROCEDURE GET_SIZEDATE_YMD (YMD INTEGER) RETURNS (SIZEDATE INTEGER) AS DECLARE VARIABLE YE INTEGER; DECLARE VARIABLE MO INTEGER; DECLARE VARIABLE DA INTEGER; DECLARE VARIABLE YES INTEGER; BEGIN /* This Proc - Calc Days for this Date: YYYYMMDD */ /* Вычислить "размер даты" : кол-во дней от нач.даты */ /* Используется для расчета кол-ва дней между датами */ SIZEDATE = 0; EXECUTE PROCEDURE EXTRACT_YEAR_FROM_YMD (:YMD) RETURNING_VALUES (:YE); EXECUTE PROCEDURE EXTRACT_MONTH_FROM_YMD (:YMD) RETURNING_VALUES (:MO); EXECUTE PROCEDURE EXTRACT_DAY_FROM_YMD (:YMD) RETURNING_VALUES (:DA); EXECUTE PROCEDURE NUMBERS_IS_DATE (:YE, :MO, :DA) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN EXECUTE PROCEDURE GET_SIZEDATE (:YE, :MO, :DA) RETURNING_VALUES (:SIZEDATE); END SUSPEND; END ^ ALTER PROCEDURE MY_MOD (X INTEGER, Y INTEGER) RETURNS (RES INTEGER) AS DECLARE VARIABLE N INTEGER; DECLARE VARIABLE Z DOUBLE PRECISION; BEGIN /* MOD - emulation */ /* Эмуляция MOD */ RES = 0; IF (:X IS NULL) THEN X = 0; IF (:Y IS NULL) THEN Y = 0; IF (:Y<>0) THEN BEGIN Z = :X / :Y; EXECUTE PROCEDURE MY_TRUNC (:Z) RETURNING_VALUES (:N); /* N = CAST((:X / :Y) AS INTEGER); */ /* IF ((:N * :Y) > :X) THEN N = :N - 1; */ RES = :X - (:Y * :N); END SUSPEND; END ^ ALTER PROCEDURE GET_COUNTDAYS_FOR_YM (YE INTEGER, MO INTEGER) RETURNS (COUNTDAYS INTEGER) AS DECLARE VARIABLE IS_LEAP INTEGER; BEGIN /* This Proc - Return count days for Year-Month */ /* Определить количество дней в месяце с учетом високосности года */ COUNTDAYS = 0; IF (:YE IS NULL) THEN YE=0; IF (:MO IS NULL) THEN MO=0; IF (:YE>0) THEN BEGIN IF (:MO = 1) THEN COUNTDAYS = 31; IF (:MO = 2) THEN BEGIN COUNTDAYS = 28; EXECUTE PROCEDURE YEAR_IS_LEAP (:YE) RETURNING_VALUES (:IS_LEAP); IF (:IS_LEAP > 0) THEN COUNTDAYS = 29; END IF (:MO = 3) THEN COUNTDAYS = 31; IF (:MO = 4) THEN COUNTDAYS = 30; IF (:MO = 5) THEN COUNTDAYS = 31; IF (:MO = 6) THEN COUNTDAYS = 30; IF (:MO = 7) THEN COUNTDAYS = 31; IF (:MO = 8) THEN COUNTDAYS = 31; IF (:MO = 9) THEN COUNTDAYS = 30; IF (:MO = 10) THEN COUNTDAYS = 31; IF (:MO = 11) THEN COUNTDAYS = 30; IF (:MO = 12) THEN COUNTDAYS = 31; END SUSPEND; END ^ ALTER PROCEDURE CREATE_DATE_INT (YE INTEGER, MO INTEGER, DA INTEGER) RETURNS (YMD INTEGER) AS BEGIN /* This Proc - Create YYYYMMDD from Year, Month, Day */ /* Создать дату в числовом формате(YYYYMMDD) из чисел YE, MO, DA */ EXECUTE PROCEDURE CREATE_YMD (:YE, :MO, :DA) RETURNING_VALUES (:YMD); SUSPEND; END ^ ALTER PROCEDURE CREATE_DATE_STR (YE INTEGER, MO INTEGER, DA INTEGER, DELIM VARCHAR(1) CHARACTER SET WIN1251) RETURNS (DATE_STR VARCHAR(10) CHARACTER SET WIN1251) AS DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE D_STR VARCHAR(2); DECLARE VARIABLE M_STR VARCHAR(2); DECLARE VARIABLE Y_STR VARCHAR(4); BEGIN /* This Proc - Create DD.MM.YYYY from Year, Month, Day */ /* Создать дату в строковом формате(DD.MM.YYYY) из чисел YE, MO, DA */ DATE_STR = ''; EXECUTE PROCEDURE NUMBERS_IS_DATE (:YE, :MO, :DA) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN IF (:DELIM IS NULL) THEN DELIM = ''; IF (:DELIM = '') THEN DELIM = '.'; IF (:DA IS NULL) THEN DA=0; IF (:MO IS NULL) THEN MO=0; IF (:YE IS NULL) THEN YE=0; IF (:DA < 10) THEN BEGIN D_STR = "0" || :DA; END ELSE BEGIN D_STR = :DA; END IF (:MO < 10) THEN BEGIN M_STR = "0" || :MO; END ELSE BEGIN M_STR = :MO; END IF (:YE < 10) THEN BEGIN Y_STR = "000" || :YE; END ELSE BEGIN IF (:YE < 100) THEN BEGIN Y_STR = "00" || :YE; END ELSE BEGIN IF (:YE < 1000) THEN BEGIN Y_STR = "0" || :YE; END ELSE BEGIN Y_STR = :YE; END END END DATE_STR = D_STR || :DELIM || M_STR || :DELIM || Y_STR; END SUSPEND; END ^ ALTER PROCEDURE NUMBERS_IS_DATE (YE INTEGER, MO INTEGER, DA INTEGER) RETURNS (YES INTEGER) AS DECLARE VARIABLE CDAYS INTEGER; BEGIN /* This Proc - Control YE, MO, DA - is date */ /* Проверить числа YE, MO, DA : можно ли из них создать дату */ YES = 0; IF (:DA IS NULL) THEN DA=0; IF (:MO IS NULL) THEN MO=0; IF (:YE IS NULL) THEN YE=0; IF (:YE > 0) THEN BEGIN IF (:DA > 0) THEN BEGIN IF ((:MO > 0) AND (:MO <= 12)) THEN BEGIN EXECUTE PROCEDURE GET_COUNTDAYS_FOR_YM (:YE, :MO) RETURNING_VALUES (:CDAYS); IF (:DA <= :CDAYS) THEN BEGIN YES = 1; END END END END SUSPEND; END ^ ALTER PROCEDURE YMD_IS_DATE (YMD INTEGER) RETURNS (YES INTEGER) AS DECLARE VARIABLE Y INTEGER; DECLARE VARIABLE M INTEGER; DECLARE VARIABLE D INTEGER; BEGIN /* This Proc - Control YE, MO, DA - is date */ /* Проверить числа YE, MO, DA : можно ли из них создать дату */ YES = 0; EXECUTE PROCEDURE EXTRACT_YEAR_FROM_YMD (:YMD) RETURNING_VALUES (:Y); EXECUTE PROCEDURE EXTRACT_MONTH_FROM_YMD (:YMD) RETURNING_VALUES (:M); EXECUTE PROCEDURE EXTRACT_DAY_FROM_YMD (:YMD) RETURNING_VALUES (:D); EXECUTE PROCEDURE NUMBERS_IS_DATE (:Y, :M, :D) RETURNING_VALUES (:YES); SUSPEND; END ^ ALTER PROCEDURE FIRST_YEAR_FOR_GREG RETURNS (YEAR INTEGER) AS BEGIN /* This Proc - Get First Year for Gregorian */ /* Первый год Грегорианского календаря */ YEAR = 1583; SUSPEND; END ^ ALTER PROCEDURE GET_SIZEDATE (YE INTEGER, MO INTEGER, DA INTEGER) RETURNS (SIZEDATE INTEGER) AS DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE BUF1 INTEGER; DECLARE VARIABLE BUF2 INTEGER; DECLARE VARIABLE BUF3 INTEGER; BEGIN /* This Proc - Calc Days for this Date: Year, Month, Day */ /* Вычислить "размер даты" : кол-во дней от нач.даты */ /* Используется для расчета кол-ва дней между двумя датами */ SIZEDATE = 0; EXECUTE PROCEDURE NUMBERS_IS_DATE (:YE, :MO, :DA) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN IF (:DA IS NULL) THEN DA=0; IF (:MO IS NULL) THEN MO=0; IF (:YE IS NULL) THEN YE=0; IF ((:MO>0) AND (:MO<=2)) THEN BEGIN BUF1 = CAST(((:YE-1)/4) AS INTEGER); BUF2 = CAST((3/4*((:YE-1)/100+1)) AS INTEGER); SIZEDATE = :YE*365 + :DA + 31*(:MO-1) + :BUF1 - :BUF2; END ELSE BEGIN BUF1 = CAST((:MO*0.4+2.3) AS INTEGER); BUF2 = CAST((:YE/4) AS INTEGER); BUF3 = CAST((3/4*(:YE/100+1)) AS INTEGER); SIZEDATE = :YE*365 + :DA + 31*(:MO-1) - :BUF1 + :BUF2 - :BUF3; END END SUSPEND; END ^ ALTER PROCEDURE GET_DAYOFWEEK (YE INTEGER, MO INTEGER, DA INTEGER) RETURNS (DW INTEGER) AS DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE A INTEGER; DECLARE VARIABLE Y INTEGER; DECLARE VARIABLE M INTEGER; DECLARE VARIABLE N INTEGER; DECLARE VARIABLE X1 INTEGER; DECLARE VARIABLE X2 INTEGER; DECLARE VARIABLE X3 INTEGER; DECLARE VARIABLE X4 INTEGER; DECLARE VARIABLE Z DOUBLE PRECISION; BEGIN /* Calc day of week (1 .. 7) */ /* Вычислить день недели (1-понед, 7-воскр) */ /* 0 - ошибка */ DW = 0; EXECUTE PROCEDURE NUMBERS_IS_DATE (:YE, :MO, :DA) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN Z = (14 - :MO) / 12; EXECUTE PROCEDURE MY_TRUNC (:Z) RETURNING_VALUES (:A); Y = :YE - :A; M = :MO + :A * 12 - 2; Z = :Y / 4; EXECUTE PROCEDURE MY_TRUNC (:Z) RETURNING_VALUES (:X1); Z = :Y / 100; EXECUTE PROCEDURE MY_TRUNC (:Z) RETURNING_VALUES (:X2); Z = :Y / 400; EXECUTE PROCEDURE MY_TRUNC (:Z) RETURNING_VALUES (:X3); Z = (:M * 31) / 12; EXECUTE PROCEDURE MY_TRUNC (:Z) RETURNING_VALUES (:X4); DW = 7000 + (:DA + :Y + :X1 - :X2 + :X3 + :X4); A = :DW; EXECUTE PROCEDURE MY_MOD (:A , 7) RETURNING_VALUES (:DW); IF (:DW = 0) THEN DW = 7; END SUSPEND; END ^ ALTER PROCEDURE D2YMD_MINUS_D1YMD (YMD1 INTEGER, YMD2 INTEGER) RETURNS (COUNTDAYS INTEGER) AS DECLARE VARIABLE D1 INTEGER; DECLARE VARIABLE D2 INTEGER; DECLARE VARIABLE YES INTEGER; BEGIN /* This Proc - Calc CountDays between dates : YYYYMMDD */ /* Вычислить кол-во дней между двумя датами в формате YYYYMMDD */ /* Если возвращаемое значение меньше 0, то ошибка */ COUNTDAYS = -1; EXECUTE PROCEDURE YMD_IS_DATE (:YMD1) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN EXECUTE PROCEDURE YMD_IS_DATE (:YMD2) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN IF (:YMD1 < :YMD2) THEN BEGIN EXECUTE PROCEDURE GET_SIZEDATE_YMD (:YMD1) RETURNING_VALUES (:D1); EXECUTE PROCEDURE GET_SIZEDATE_YMD (:YMD2) RETURNING_VALUES (:D2); COUNTDAYS = :D2 - :D1; END ELSE BEGIN IF (:YMD1 = :YMD2) THEN COUNTDAYS = 0; END END END SUSPEND; END ^ ALTER PROCEDURE CONTROL_TYPEOBJ (ID_IN VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_OUT VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_BUF VARCHAR(40); DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Control for ID_TYPE */ /* Контроль Типа Объекта */ ID_OUT = :ID_IN; EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); IF (:ID_IN IS NULL) THEN ID_IN = ''; IF (:ID_IN <> '') THEN BEGIN IF (:ID_IN = :ID_EMPTY) THEN BEGIN ID_OUT = :ID_EMPTY; END ELSE BEGIN /* На входе - не пустое значение проверяем его существование в справ. типов объектов */ SELECT ID_THIS FROM L_TYPEOBJ_LIST WHERE L_TYPEOBJ_LIST.ID_THIS = :ID_IN INTO :ID_BUF; IF (:ID_BUF = :ID_IN) THEN BEGIN ID_OUT = :ID_IN; END ELSE BEGIN /* This ID not Exist */ /* Такой ID не существует - инициируем исключение */ EXCEPTION TYPEOBJECT_NOT_EXIST; END END END ELSE BEGIN ID_OUT = :ID_EMPTY; END SUSPEND; END ^ ALTER PROCEDURE CONTROL_UNITMEASURE (ID_IN VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_OUT VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_BUF VARCHAR(40); DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Контроль единицы измерения */ ID_OUT = :ID_IN; EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); IF (:ID_IN IS NULL) THEN ID_IN = ''; IF (:ID_IN <> '') THEN BEGIN IF (:ID_IN = :ID_EMPTY) THEN BEGIN ID_OUT = :ID_EMPTY; END ELSE BEGIN /* На входе - не пустое значение проверяем его существование в справ. переч. св-в */ SELECT ID_THIS FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_THIS = :ID_IN INTO :ID_BUF; IF (:ID_BUF = :ID_IN) THEN BEGIN ID_OUT = :ID_IN; END ELSE BEGIN /* Такой ID не существует - инициируем исключение */ EXCEPTION ENUM_UM_NOT_EXIST; END END END ELSE BEGIN ID_OUT = :ID_EMPTY; END SUSPEND; END ^ ALTER PROCEDURE DATE_TO_DATE_YMD (D DATE) RETURNS (YMD INTEGER) AS BEGIN /* This Proc - CONVERT DATE to YYYYMMDD (integer) */ /* Конвертация Даты в Дату числового формата YYYYMMDD */ YMD = 0; IF (:D IS NOT NULL) THEN BEGIN SELECT YYYYMMDD FROM SYS_CALENDAR WHERE DATEX = :D INTO :YMD; END IF (:YMD IS NULL) THEN YMD = 0; SUSPEND; END ^ ALTER PROCEDURE OBJECT_EXIST (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Control: Object Exists , */ /* Контроль существования */ YES = 0; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN SELECT ID_THIS FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = :ID INTO :ID_BUF; IF (:ID_BUF = :ID) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE TIME_STR_TO_TIME_INT (HH_MM_SS VARCHAR(8) CHARACTER SET WIN1251) RETURNS (HMSI INTEGER) AS BEGIN /* This Proc - CONVERT HH:MM:SS to HHMMSS (integer) */ HMSI = 0; IF (:HH_MM_SS IS NULL) THEN HH_MM_SS = ''; IF (:HH_MM_SS <> '') THEN BEGIN SELECT HHMMSS_I FROM SYS_HHMMSS WHERE SYS_HHMMSS.HH_MM_SS = :HH_MM_SS INTO :HMSI; END IF (:HMSI IS NULL) THEN HMSI = 0; SUSPEND; END ^ ALTER PROCEDURE GET_IDTOPIC_ENUMLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPENUM_TOP with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPENUM_TOP с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPENUM_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDMACRO_ENUMLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPENUM_MACRO with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPENUM_MACRO с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPENUM_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDGROUP_ENUMLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPENUM_GRP with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPENUM_GRP с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPENUM_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDLIST_ENUMLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPENUM_LIST with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPENUM_LIST с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPENUM_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDVAL_ENUMLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPENUM_VAL with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPENUM_VAL с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPENUM_VAL,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDTOPIC_TYPEOBJLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_TYPEOBJ_TOP with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_TYPEOBJ_TOP с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_TYPEOBJ_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDMACRO_TYPEOBJLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_TYPEOBJ_MACRO with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_TYPEOBJ_MACRO с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_TYPEOBJ_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDGROUP_TYPEOBJLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_TYPEOBJ_GRP with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_TYPEOBJ_GRP с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_TYPEOBJ_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDLIST_TYPEOBJLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_TYPEOBJ_LIST with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_TYPEOBJ_LIST с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_TYPEOBJ_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE INSERT_SYSEVENTSINTABLES (ID_TABLE INTEGER, ID_THIS VARCHAR(40) CHARACTER SET WIN1251, WHAT_IS_IT VARCHAR(3) CHARACTER SET WIN1251) AS DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE YES2 INTEGER; DECLARE VARIABLE C12 VARCHAR(12) CHARACTER SET WIN1251; BEGIN /* write to LOG about events in table */ /* запись информации о событии на уровне таблицы базы данных в системный журнал */ /* идентификаторы таблиц ID_TABLE хранятся в таблице SYS_TABLES_LIST */ /* ID_THIS - уникальный ID строки таблицы, где было событие INSERT, UPDATE, DELETE */ /* WHAT_IS_IT - тип события: INS, UPD, DEL */ YES = 1; IF (:ID_TABLE IS NULL) THEN ID_TABLE = 0; IF (:ID_THIS IS NULL) THEN ID_THIS = ''; IF (:WHAT_IS_IT IS NULL) THEN WHAT_IS_IT = ''; IF (:ID_TABLE<=0) THEN YES = 0; IF (:ID_THIS = '') THEN YES = 0; IF (:WHAT_IS_IT = '') THEN YES = 0; IF (:YES>0) THEN BEGIN YES = 0; YES2 = 0; /* ================================================ */ /* detect: can this */ /* определяем, разрешено ли вести LOG вообще */ SELECT CONST_VALUE FROM SYS_CONST_LIST WHERE UPPER(SYS_CONST_LIST.MNEMO_CODE) = UPPER('Yes_LOG_for_Events_in_Tables') INTO :C12; IF (:C12 IS NULL) THEN C12 = ''; IF (:C12 = '') THEN C12 = '0'; IF (CAST(:C12 AS INTEGER)>0) THEN BEGIN YES = 1; END /* ================================================ */ IF (:YES>0) THEN BEGIN /* ================================================ */ /* detect: can this for table */ /* определяем, нужно ли вести LOG избирательно (для каждой таблицы индивидуально) ? */ SELECT CONST_VALUE FROM SYS_CONST_LIST WHERE UPPER(SYS_CONST_LIST.MNEMO_CODE) = UPPER('Yes_LOG_for_Events_in_Tables_I') INTO :C12; IF (:C12 IS NULL) THEN C12 = ''; IF (:C12 = '') THEN C12 = '0'; IF (CAST(:C12 AS INTEGER)>0) THEN BEGIN YES2 = 1; END /* ================================================ */ END IF (:YES2>0) THEN BEGIN /* ================================================ */ /* Разрешено вести LOG избирательно. Проверяем, разрешено ли именно для этой таблицы ? */ SELECT YES_SYS_EVENT FROM SYS_TABLES_LIST WHERE SYS_TABLES_LIST.ID_THIS = :ID_TABLE INTO :YES2; IF (:YES2 IS NULL) THEN YES2 = 0; IF (:YES2 <=0 ) THEN YES = 0; /* Для данной таблицы - запрещено ! */ /* ================================================ */ END IF (:YES>0) THEN BEGIN /* write info */ /* записываем информацию в системный журнал событий */ INSERT INTO SYS_EVENTS_IN_TABLES (ID_THIS,DATE_EVENT,IDTABLE,IDTHIS,WHAT) VALUES (GEN_ID(GEN_EVENTINTABLESLOG,1), "NOW", :ID_TABLE, :ID_THIS, :WHAT_IS_IT); END END END ^ ALTER PROCEDURE MY_ROUND_2 (V DOUBLE PRECISION) RETURNS (RES DOUBLE PRECISION) AS DECLARE VARIABLE I INTEGER; BEGIN /* ROUND - emulation for 2 */ /* Эмуляция ROUND для precis=2 */ IF (V IS NULL) THEN V = 0; I = :V * 100; RES = :I/100; SUSPEND; END ^ ALTER PROCEDURE GET_DELIMITERLEFT_001 RETURNS (DELIMITERLEFT VARCHAR(1) CHARACTER SET WIN1251) AS BEGIN /* "левая" скобка-разделитель внутри поля PARENTS_ID (перечень ID-предков объекта/процесса) */ DELIMITERLEFT = '['; SUSPEND; END ^ ALTER PROCEDURE GET_IDTOPIC_NUMBERLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPNUM_TOP with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPNUM_TOP с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPNUM_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDMACRO_NUMBERLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPNUM_MACRO with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPNUM_MACRO с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPNUM_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDGROUP_NUMBERLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPNUM_GRP with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPNUM_GRP с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPNUM_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_IDLIST_NUMBERLIB RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE C INTEGER; BEGIN /* Calc ID_THIS for L_PROPNUM_LIST with id-node and id-DB */ /* Вычислить значение ID_THIS для таблицы L_PROPNUM_LIST с учетом ID узла и id-DB */ ID = ''; C = GEN_ID(GEN_L_PROPNUM_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (:ID); SUSPEND; END ^ ALTER PROCEDURE GET_DELIMITERRIGHT_001 RETURNS (DELIMITERRIGHT VARCHAR(1) CHARACTER SET WIN1251) AS BEGIN /* "правая" скобка-разделитель внутри поля PARENTS_ID (перечень ID-предков объекта/процесса) */ DELIMITERRIGHT = ']'; SUSPEND; END ^ ALTER PROCEDURE SYS_START_INIT_USERS_TOP AS DECLARE VARIABLE C INTEGER; BEGIN /* Для начальной инициализации системы */ /* Topic */ /* Раздел */ SELECT COUNT ( * ) FROM USERS_TOP WHERE UPPER(MNEMO_CODE) = 'DEFAULT_THIS' INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C<=0) THEN BEGIN INSERT INTO USERS_TOP ( ID_THIS, ID_GRP, ITS_GLOBAL, ID_SYSTEM, NUMPP, NAME_MAX, NAME_MIN, MNEMO_CODE, NOTE ) VALUES ( '_SYS_', '', 0, 1, 1, 'Предопределенные', 'Предопределенные', 'DEFAULT_THIS', 'Создано при инициализации системы' ); END END ^ ALTER PROCEDURE GET_USER_IS_DB_SUPEREDITOR_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* User SuperEditor Default for DB */ /* Значение Мнемокода для "СуперРедактор" Б.Д. по умолчанию */ MNEMO = UPPER('DB_SUPER_EDITOR'); SUSPEND; END ^ ALTER PROCEDURE SYS_START_INIT_USERS_MACRO AS DECLARE VARIABLE ID_TOP VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* Для начальной инициализации системы */ /* MACRO */ /* Макро-группы */ SELECT COUNT ( * ) FROM USERS_MACRO WHERE UPPER(MNEMO_CODE) = 'DEFAULT_THIS' INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C<=0) THEN BEGIN SELECT ID_THIS FROM USERS_TOP WHERE UPPER(MNEMO_CODE) = 'DEFAULT_THIS' INTO :ID_TOP; IF (:ID_TOP IS NULL) THEN ID_TOP = ''; IF (:ID_TOP <> '') THEN BEGIN INSERT INTO USERS_MACRO ( ID_GRP, ITS_GLOBAL, ID_SYSTEM, NUMPP, NAME_MAX, NAME_MIN, MNEMO_CODE, NOTE ) VALUES ( :ID_TOP, 0, 1, 1, 'Предопределенные', 'Предопределенные', 'DEFAULT_THIS', 'Создано при инициализации системы' ); END END END ^ ALTER PROCEDURE SYS_START_INIT_USERS_GRP AS DECLARE VARIABLE ID_MACRO VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* Для начальной инициализации системы */ /* GRP */ /* Группы */ SELECT COUNT ( * ) FROM USERS_GRP WHERE UPPER(MNEMO_CODE) = 'DEFAULT_THIS' INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C<=0) THEN BEGIN SELECT ID_THIS FROM USERS_MACRO WHERE UPPER(MNEMO_CODE) = 'DEFAULT_THIS' INTO :ID_MACRO; IF (:ID_MACRO IS NULL) THEN ID_MACRO = ''; IF (:ID_MACRO <> '') THEN BEGIN INSERT INTO USERS_GRP ( ID_GRP, ITS_GLOBAL, ID_SYSTEM, NUMPP, NAME_MAX, NAME_MIN, MNEMO_CODE, NOTE ) VALUES ( :ID_MACRO, 0, 1, 1, 'Предопределенные', 'Предопределенные', 'DEFAULT_THIS', 'Создано при инициализации системы' ); END END END ^ ALTER PROCEDURE SYS_START_INIT_USERS_LIST AS DECLARE VARIABLE ID_GRP VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* Для начальной инициализации системы */ /* List */ /* Пользователи */ SELECT COUNT ( * ) FROM USERS_LIST WHERE UPPER(MNEMO_CODE) = '_SYS_' INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C<=0) THEN BEGIN SELECT ID_THIS FROM USERS_GRP WHERE UPPER(MNEMO_CODE) = 'DEFAULT_THIS' INTO :ID_GRP; IF (:ID_GRP IS NULL) THEN ID_GRP = ''; IF (:ID_GRP <> '') THEN BEGIN INSERT INTO USERS_LIST ( ID_GRP, ITS_GLOBAL, ID_SYSTEM, NUMPP, NAME_MAX, NAME_MIN, MNEMO_CODE, USER_PSW, ID_ROLE, NOTE ) VALUES ( :ID_GRP, 0, 1, 1, '_SYS_', '_SYS_', '_SYS_', '_SYS_', '', 'Создано при инициализации системы' ); END END END ^ ALTER PROCEDURE SYS_START_INIT_USERS AS DECLARE VARIABLE ID VARCHAR(40); BEGIN /* Для начальной инициализации системы */ /* Справочник Пользователей */ EXECUTE PROCEDURE SYS_START_INIT_USERS_TOP; EXECUTE PROCEDURE SYS_START_INIT_USERS_MACRO; EXECUTE PROCEDURE SYS_START_INIT_USERS_GRP; EXECUTE PROCEDURE SYS_START_INIT_USERS_LIST; SELECT ID_THIS FROM USERS_LIST WHERE UPPER(MNEMO_CODE) = '_SYS_' INTO :ID; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN UPDATE USERS_GRP SET IDUSER_CREATE = :ID WHERE IDUSER_CREATE = '_SYS_'; UPDATE USERS_MACRO SET IDUSER_CREATE = :ID WHERE IDUSER_CREATE = '_SYS_'; UPDATE USERS_TOP SET IDUSER_CREATE = :ID WHERE IDUSER_CREATE = '_SYS_'; END END ^ ALTER PROCEDURE GET_USER_IS_DB_SUPERREADER_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* User SuperReader Default for DB */ /* Значение Мнемокода для "СуперЧитателя" Б.Д. по умолчанию */ MNEMO = UPPER('DB_SUPER_READER'); SUSPEND; END ^ ALTER PROCEDURE GET_USER_IS_DB_EMPTYUSER_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* User Empty Default for DB */ /* Значение Мнемокода для "пустого" Пользователя Б.Д. по умолчанию */ MNEMO = UPPER('DB_EMPTY_USER'); SUSPEND; END ^ ALTER PROCEDURE GET_USER_IS_NODE_ADMIN_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* Admin Default for Node */ /* Значение Мнемокода для администратора узла по умолчанию */ MNEMO = UPPER('NODE_ADMIN_DEFAULT'); SUSPEND; END ^ ALTER PROCEDURE GET_USER_IS_DB_ADMIN_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* Admin Default for DB */ /* Значение Мнемокода для администратора Б.Д. по умолчанию */ MNEMO = UPPER('DB_ADMIN_DEFAULT'); SUSPEND; END ^ ALTER PROCEDURE THIS_USER_IS_DEF (MNEMO_THIS VARCHAR(32) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE MNEMO VARCHAR(32); BEGIN /* This User - Default */ /* проверить мнемокод Пользователя: этот Пользователь по умолчанию ? */ YES = 0; IF (:MNEMO_THIS IS NULL) THEN MNEMO_THIS = ''; IF (:MNEMO_THIS <> '') THEN BEGIN EXECUTE PROCEDURE GET_USER_IS_NODE_ADMIN_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 1; END ELSE BEGIN EXECUTE PROCEDURE GET_USER_IS_NODE_ADMIN_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 2; END ELSE BEGIN EXECUTE PROCEDURE GET_USER_IS_DB_SUPEREDITOR_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 3; END ELSE BEGIN EXECUTE PROCEDURE GET_USER_IS_DB_SUPERREADER_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 4; END ELSE BEGIN EXECUTE PROCEDURE GET_USER_IS_DB_EMPTYUSER_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 5; END ELSE BEGIN YES = 0; END END END END END END SUSPEND; END ^ ALTER PROCEDURE GET_ROLE_IS_SUPEREDITOR_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* Role SuperEditor Default */ /* РОЛЬ: Значение Мнемокода для "СуперРедактор" по умолчанию */ MNEMO = UPPER('ROLE_SUPER_EDITOR'); SUSPEND; END ^ ALTER PROCEDURE GET_ROLE_IS_SUPERREADER_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* Role SuperReader Default */ /* РОЛЬ: Значение Мнемокода для "СуперЧитателя" по умолчанию */ MNEMO = UPPER('ROLE_SUPER_READER'); SUSPEND; END ^ ALTER PROCEDURE GET_ID_OBJPROPENUM RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID1 INTEGER; DECLARE VARIABLE ID2 INTEGER; DECLARE VARIABLE ID3 INTEGER; DECLARE VARIABLE IDNODE VARCHAR(4); DECLARE VARIABLE IDDB VARCHAR(2); DECLARE VARIABLE DELIMITER_IDNODE VARCHAR(1); DECLARE VARIABLE DELIMITER_IDDB VARCHAR(1); DECLARE VARIABLE DELIMITER_IDOBJ VARCHAR(1); BEGIN /* Calc ID_THIS для OBJECTS_PROP_ENUM with ID_NODE and ID_DB */ /* Вычислить ID_THIS для OBJECTS_PROP_ENUM с учетом ID_NODE и ID_DB */ EXECUTE PROCEDURE GET_DELIMITER_IDNODE RETURNING_VALUES :DELIMITER_IDNODE; EXECUTE PROCEDURE GET_DELIMITER_IDDB RETURNING_VALUES :DELIMITER_IDDB; EXECUTE PROCEDURE GET_DELIMITER_IDOBJ RETURNING_VALUES :DELIMITER_IDOBJ; EXECUTE PROCEDURE GET_ID_THISNODE RETURNING_VALUES :IDNODE; EXECUTE PROCEDURE GET_ID_THISDB RETURNING_VALUES :IDDB; ID = ''; ID2 = GEN_ID(GEN_OBJROPE_2,0); /* текущее значение генератора-2 */ ID3 = GEN_ID(GEN_OBJROPE_3,0); /* текущее значение генератора-3 */ /* ------------------------------------------- */ /* Calc ID1 (first value) */ /* Вычисляем значение ID1 (младшее значение) */ ID1 = GEN_ID(GEN_OBJROPE_1,1); /* ------------------------------------------- */ /* =========================================== */ IF (:ID1>2147483640) THEN BEGIN /* ID1 - is very big */ /* Переполнение младшего значения */ /* ------------------------------------------- */ /* Reset gen-1 */ /* Сбрасываем генератор-1 в 0 */ ID1 =GEN_ID(GEN_OBJROPE_1,-GEN_ID(GEN_OBJROPE_1,0)); /* ------------------------------------------- */ /* ------------------------------------------- */ /* Calc ID2 (middle value) */ /* Вычисляем значение ID2 (среднее значение) */ ID2 = GEN_ID(GEN_OBJROPE_2,1); /* ------------------------------------------- */ END /* =========================================== */ /* =========================================== */ IF (:ID2>2147483640) THEN BEGIN /* ID2 - is very big */ /* Переполнение среднего значения */ /* ------------------------------------------- */ /* Reset gen-2 */ /* Сбрасываем генератор-2 в 0 */ ID2 = GEN_ID(GEN_OBJROPE_2,-GEN_ID(GEN_OBJROPE_2,0)); /* ------------------------------------------- */ /* ------------------------------------------- */ /* Calc ID3 ( big value) */ /* Вычисляем значение ID3 (старшее значение) */ ID3 = GEN_ID(GEN_OBJROPE_3,1); /* ------------------------------------------- */ END /* =========================================== */ /* ------------------------------------------- */ /* Calc value ID_THIS */ /* Вычисляем значение ID_THIS */ ID = :IDNODE || :DELIMITER_IDNODE || :IDDB || :DELIMITER_IDDB || :ID3 || DELIMITER_IDOBJ || :ID2 || DELIMITER_IDOBJ || :ID1; /* ------------------------------------------- */ SUSPEND; END ^ ALTER PROCEDURE GET_ROLE_IS_EMPTY_DEF RETURNS (MNEMO VARCHAR(32) CHARACTER SET WIN1251) AS BEGIN /* Role Empty Default */ /* РОЛЬ: Значение Мнемокода для "пустой" Роли по умолчанию */ MNEMO = UPPER('ROLE_EMPTY'); SUSPEND; END ^ ALTER PROCEDURE L_ENUMVAL_EXIST (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Control: PropEnumVal in SET - Exists ? */ /* Проверить, существует ли значение перечислимого свойства в МНОЖЕСТВЕ перечислимых свойств (L_PROPENUM_VAL) */ YES = 0; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN SELECT ID_THIS FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_THIS = :ID INTO :ID_BUF; IF (:ID_BUF = :ID) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE THIS_ROLE_IS_DEF (MNEMO_THIS VARCHAR(32) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE MNEMO VARCHAR(32); BEGIN /* This Role - Default ? */ /* проверить мнемокод Роли: эта Роль по умолчанию ? */ YES = 0; IF (:MNEMO_THIS IS NULL) THEN MNEMO_THIS = ''; IF (:MNEMO_THIS <> '') THEN BEGIN EXECUTE PROCEDURE GET_ROLE_IS_SUPEREDITOR_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 1; END ELSE BEGIN EXECUTE PROCEDURE GET_ROLE_IS_SUPERREADER_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 2; END ELSE BEGIN EXECUTE PROCEDURE GET_ROLE_IS_EMPTY_DEF RETURNING_VALUES :MNEMO; IF (UPPER(:MNEMO_THIS) = UPPER(:MNEMO)) THEN BEGIN YES = 3; END ELSE BEGIN YES = 0; END END END END SUSPEND; END ^ ALTER PROCEDURE THIS_ID_IS_EMPTY (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Control: value of ID_THIS is Empty ? */ /* Проверка, значение ключевого поля ID_THIS - пустое */ YES = 0; IF (:ID IS NULL) THEN BEGIN YES = 1; END ELSE BEGIN IF (:ID = '') THEN BEGIN YES = 2; END ELSE BEGIN IF (UPPER(:ID) = UPPER('empty')) THEN BEGIN YES = 3; END ELSE BEGIN IF (UPPER(:ID) = UPPER('aaa')) THEN BEGIN YES = 4; END ELSE BEGIN /* Контроль "пустого" (по умолчанию) значения */ EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); IF (:ID = :ID_EMPTY) THEN BEGIN YES = 5; END ELSE BEGIN YES = 0; END END END END END SUSPEND; END ^ ALTER PROCEDURE GET_ID_OBJPROPNUMBER RETURNS (ID VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID1 INTEGER; DECLARE VARIABLE ID2 INTEGER; DECLARE VARIABLE ID3 INTEGER; DECLARE VARIABLE IDNODE VARCHAR(4); DECLARE VARIABLE IDDB VARCHAR(2); DECLARE VARIABLE DELIMITER_IDNODE VARCHAR(1); DECLARE VARIABLE DELIMITER_IDDB VARCHAR(1); DECLARE VARIABLE DELIMITER_IDOBJ VARCHAR(1); BEGIN /* Calc ID_THIS для OBJECTS_PROP_NUMBER with ID_NODE and ID_DB */ /* Вычислить ID_THIS для OBJECTS_PROP_NUMBER с учетом ID_NODE и ID_DB */ EXECUTE PROCEDURE GET_DELIMITER_IDNODE RETURNING_VALUES :DELIMITER_IDNODE; EXECUTE PROCEDURE GET_DELIMITER_IDDB RETURNING_VALUES :DELIMITER_IDDB; EXECUTE PROCEDURE GET_DELIMITER_IDOBJ RETURNING_VALUES :DELIMITER_IDOBJ; EXECUTE PROCEDURE GET_ID_THISNODE RETURNING_VALUES :IDNODE; EXECUTE PROCEDURE GET_ID_THISDB RETURNING_VALUES :IDDB; ID = ''; ID2 = GEN_ID(GEN_OBJROPN_2,0); /* текущее значение генератора-2 */ ID3 = GEN_ID(GEN_OBJROPN_3,0); /* текущее значение генератора-3 */ /* ------------------------------------------- */ /* Calc ID1 (first value) */ /* Вычисляем значение ID1 (младшее значение) */ ID1 = GEN_ID(GEN_OBJROPN_1,1); /* ------------------------------------------- */ /* =========================================== */ IF (:ID1>2147483640) THEN BEGIN /* ID1 - is very big */ /* Переполнение младшего значения */ /* ------------------------------------------- */ /* Reset gen-1 */ /* Сбрасываем генератор-1 в 0 */ ID1 =GEN_ID(GEN_OBJROPN_1,-GEN_ID(GEN_OBJROPN_1,0)); /* ------------------------------------------- */ /* ------------------------------------------- */ /* Calc ID2 (middle value) */ /* Вычисляем значение ID2 (среднее значение) */ ID2 = GEN_ID(GEN_OBJROPN_2,1); /* ------------------------------------------- */ END /* =========================================== */ /* =========================================== */ IF (:ID2>2147483640) THEN BEGIN /* ID2 - is very big */ /* Переполнение среднего значения */ /* ------------------------------------------- */ /* Reset gen-2 */ /* Сбрасываем генератор-2 в 0 */ ID2 = GEN_ID(GEN_OBJROPN_2,-GEN_ID(GEN_OBJROPN_2,0)); /* ------------------------------------------- */ /* ------------------------------------------- */ /* Calc ID3 ( big value) */ /* Вычисляем значение ID3 (старшее значение) */ ID3 = GEN_ID(GEN_OBJROPN_3,1); /* ------------------------------------------- */ END /* =========================================== */ /* ------------------------------------------- */ /* Calc value ID_THIS */ /* Вычисляем значение ID_THIS */ ID = :IDNODE || :DELIMITER_IDNODE || :IDDB || :DELIMITER_IDDB || :ID3 || DELIMITER_IDOBJ || :ID2 || DELIMITER_IDOBJ || :ID1; /* ------------------------------------------- */ SUSPEND; END ^ ALTER PROCEDURE CONTROL_LENUMVAL (ID_IN VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_OUT VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_BUF VARCHAR(40); DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Control for ID_PROP_VAL (enum) */ /* Контроль ID значения перечислимого свойства Объекта */ ID_OUT = :ID_IN; EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); IF (:ID_IN IS NULL) THEN ID_IN = ''; IF (:ID_IN <> '') THEN BEGIN IF (:ID_IN = :ID_EMPTY) THEN BEGIN ID_OUT = :ID_EMPTY; END ELSE BEGIN /* На входе - не пустое значение проверяем его существование в справ. перечислимых свойств */ SELECT ID_THIS FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_THIS = :ID_IN INTO :ID_BUF; IF (:ID_BUF = :ID_IN) THEN BEGIN ID_OUT = :ID_IN; END ELSE BEGIN /* This ID not Exist */ /* Такой ID не существует - инициируем исключение */ EXCEPTION LPROPENUMVAL_NOT_EXIST; END END END ELSE BEGIN ID_OUT = :ID_EMPTY; END SUSPEND; END ^ ALTER PROCEDURE CONTROL_LNUMBER (ID_IN VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_OUT VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_BUF VARCHAR(40); DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Control for ID_PROP (number) */ /* Контроль ID численного свойства Объекта */ ID_OUT = :ID_IN; EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); IF (:ID_IN IS NULL) THEN ID_IN = ''; IF (:ID_IN <> '') THEN BEGIN IF (:ID_IN = :ID_EMPTY) THEN BEGIN ID_OUT = :ID_EMPTY; END ELSE BEGIN /* На входе - не пустое значение проверяем его существование в справ. численных свойств */ SELECT ID_THIS FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_THIS = :ID_IN INTO :ID_BUF; IF (:ID_BUF = :ID_IN) THEN BEGIN ID_OUT = :ID_IN; END ELSE BEGIN /* This ID not Exist */ /* Такой ID не существует - инициируем исключение */ EXCEPTION LPROPNUMNER_NOT_EXIST; END END END ELSE BEGIN ID_OUT = :ID_EMPTY; END SUSPEND; END ^ ALTER PROCEDURE OBJPROPENUM_EXIST (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Control: PropEnum_in Object Exists , */ /* Контроль существования Перечислимого свойства у объекта */ YES = 0; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN SELECT ID_THIS FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS = :ID INTO :ID_BUF; IF (:ID_BUF = :ID) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE OBJPROPNUM_EXIST (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Control: PropNum_in Object Exists , */ /* Контроль существования Численного свойства у объекта */ YES = 0; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN SELECT ID_THIS FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS = :ID INTO :ID_BUF; IF (:ID_BUF = :ID) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE GET_PROP_ENUM_NAME (ID_VAL VARCHAR(40) CHARACTER SET WIN1251, NR_WHAT INTEGER) RETURNS (NAME_OUT VARCHAR(200) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Get Prop Enum Name for ID-value */ /* Получить наименование перечислимого свойства по ID его значения */ /* если NR_WHAT<=0, то NAME_MIN, иначе - NAME_MAX */ NAME_OUT = ''; IF (:ID_VAL IS NULL) THEN ID_VAL = ''; IF (:ID_VAL <> '') THEN BEGIN SELECT ID_GRP FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_THIS = :ID_VAL INTO :ID_BUF; IF (:ID_BUF IS NULL) THEN ID_BUF = ''; IF (:ID_BUF <> '') THEN BEGIN IF (:NR_WHAT IS NULL) THEN NR_WHAT = 0; IF (:NR_WHAT<=0) THEN BEGIN SELECT NAME_MIN FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_THIS = :ID_BUF INTO :NAME_OUT; IF (:NAME_OUT IS NULL) THEN NAME_OUT = ''; END ELSE BEGIN SELECT NAME_MAX FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_THIS = :ID_BUF INTO :NAME_OUT; IF (:NAME_OUT IS NULL) THEN NAME_OUT = ''; END END END IF (:NAME_OUT IS NULL) THEN NAME_OUT = ''; IF (:NAME_OUT = '') THEN NAME_OUT = '???'; SUSPEND; END ^ ALTER PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (ID_IN VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_OUT VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_BUF VARCHAR(40); DECLARE VARIABLE ID_EMPTY VARCHAR(40); DECLARE VARIABLE YES_NEXT INTEGER; BEGIN /* Контроль корректности Значения Перечислимого свойства (NULL-допускается) */ ID_OUT = NULL; EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); YES_NEXT = 1; IF (:ID_IN IS NULL) THEN YES_NEXT = 0; IF (:ID_IN = '') THEN YES_NEXT = 0; IF (:ID_IN = :ID_EMPTY) THEN YES_NEXT = 0; IF (:YES_NEXT > 0) THEN BEGIN /* На входе - не пустое значение проверяем его существование в справ. переч. св-в */ SELECT ID_THIS FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_THIS = :ID_IN INTO :ID_BUF; IF (:ID_BUF = :ID_IN) THEN BEGIN ID_OUT = :ID_IN; END ELSE BEGIN /* Такой ID не существует - инициируем исключение */ EXCEPTION ENUM_VAL_NOT_EXIST; END END ELSE BEGIN /* возвращаем входное значение */ ID_OUT = :ID_IN; END SUSPEND; END ^ ALTER PROCEDURE GET_ID_THISDB_FULL RETURNS (ID_DB VARCHAR(7) CHARACTER SET WIN1251) AS DECLARE VARIABLE IDNODE VARCHAR(4); DECLARE VARIABLE IDDB VARCHAR(2); DECLARE VARIABLE DELIMITER_IDNODE VARCHAR(1); BEGIN /* Полный ID базы данных (в контексте дерева узлов) */ EXECUTE PROCEDURE GET_DELIMITER_IDNODE RETURNING_VALUES :DELIMITER_IDNODE; EXECUTE PROCEDURE GET_ID_THISNODE RETURNING_VALUES :IDNODE; EXECUTE PROCEDURE GET_ID_THISDB RETURNING_VALUES :IDDB; ID_DB = :IDNODE || :DELIMITER_IDNODE || :IDDB; SUSPEND; END ^ ALTER PROCEDURE L_NUMPROP_EXIST (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Control: PropNum in SET - Exists ? */ /* Проверить, существует ли численное свойство в МНОЖЕСТВЕ численных свойств (L_PROPNUMBER_LIST) */ YES = 0; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN SELECT ID_THIS FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_THIS = :ID INTO :ID_BUF; IF (:ID_BUF = :ID) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE GET_UNITMEASURE_FOR_PROPNUMBER (ID_PROPNUM VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_UM VARCHAR(40) CHARACTER SET WIN1251, PRECIS INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Прочитать ID - ед.измер и точность для ID численного свойства (справочник) */ EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); ID_UM = :ID_EMPTY; PRECIS = 0; IF (:ID_PROPNUM IS NULL) THEN ID_PROPNUM = ''; IF (:ID_PROPNUM <> '') THEN BEGIN IF (:ID_PROPNUM <> :ID_EMPTY) THEN BEGIN /* На входе - не пустое значение числ.свойства - читаем из справочника ед.измерения */ SELECT ID_UNITMEASURE, PRECIS FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_THIS = :ID_PROPNUM INTO :ID_UM, :PRECIS; END END IF (:ID_UM IS NULL) THEN ID_UM = :ID_EMPTY; IF (:PRECIS IS NULL) THEN PRECIS = 0; SUSPEND; END ^ ALTER PROCEDURE CONTROL_USER_EXIST (IDUSER VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE YES INTEGER; BEGIN /* Control This User Exist */ /* Контроль существование Пользователя (ID_THIS) */ YES = 1; IF (:IDUSER IS NULL) THEN YES = 0; IF (:IDUSER = '') THEN YES = 0; IF (:YES > 0) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (:IDUSER) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END END ^ ALTER PROCEDURE L_ENUMPROP_EXIST (ID VARCHAR(40) CHARACTER SET WIN1251) RETURNS (YES INTEGER) AS DECLARE VARIABLE ID_BUF VARCHAR(40); BEGIN /* Control: PropEnum in SET - Exists ? */ /* Проверить, существует ли перечислимое свойство в МНОЖЕСТВЕ перечислимых свойств (L_PROPENUM_LIST) */ YES = 0; IF (:ID IS NULL) THEN ID = ''; IF (:ID <> '') THEN BEGIN SELECT ID_THIS FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_THIS = :ID INTO :ID_BUF; IF (:ID_BUF = :ID) THEN YES = 1; END SUSPEND; END ^ ALTER PROCEDURE GET_IDPROP_FOR_IDVAL_ENUM (ID_VAL VARCHAR(40) CHARACTER SET WIN1251) RETURNS (ID_PROP VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE ID_EMPTY VARCHAR(40); BEGIN /* Получить ID перечислимого свойства по ID-значению */ EXECUTE PROCEDURE GET_ID_IS_UNKNOWN RETURNING_VALUES (:ID_EMPTY); ID_PROP = :ID_EMPTY; IF (:ID_VAL IS NULL) THEN ID_VAL = :ID_EMPTY; IF (:ID_VAL = '') THEN ID_VAL = :ID_EMPTY; IF (:ID_VAL <> :ID_EMPTY) THEN BEGIN SELECT ID_GRP FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_THIS = :ID_VAL INTO :ID_PROP; IF (:ID_PROP IS NULL) THEN ID_PROP = :ID_EMPTY; END SUSPEND; END ^ ALTER PROCEDURE GET_OBJ_PROPENUM_VAL_ACTUAL (ID_OBJ VARCHAR(40) CHARACTER SET WIN1251, ID_PROP VARCHAR(40) CHARACTER SET WIN1251, DATE1 DATE, DATE2 DATE, YES_EMPTY_IF_NONE INTEGER) RETURNS (ID_PROP_VAL VARCHAR(40) CHARACTER SET WIN1251) AS DECLARE VARIABLE VAL_IS_NULL VARCHAR(40); DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE ID VARCHAR(40); DECLARE VARIABLE DATE_MAX DATE; DECLARE VARIABLE DATE1_MAX DATE; DECLARE VARIABLE DATE2_MAX DATE; BEGIN /* Для объекта ID_OBJ отобрать актуальное значение перечислимого св-ва ID_PROP за указанный период дат DATE1..DATE2 */ /* Версия 1.01 (04.08.2009) - ЕЩЕ НУЖНА ПРОВЕРКА !!! */ /* Пример вызова: EXECUTE PROCEDURE GET_OBJ_PROPENUM_VAL_ACTUAL('0!1-0_0_8', '0!1-31', NULL,NULL,1) */ /* Пример вызова: EXECUTE PROCEDURE GET_OBJ_PROPENUM_VAL_ACTUAL('0!1-0_0_8', '0!1-31', NULL,NULL,1) */ /* EXECUTE PROCEDURE GET_OBJ_PROPENUM_VAL_ACTUAL ('0!1-0_0_797', '0!1-44', NULL, '25.03.1968', 0) */ VAL_IS_NULL = ''; /* вероятно, лучше NULL */ ID_PROP_VAL = :VAL_IS_NULL; YES = 0; EXECUTE PROCEDURE OBJECT_EXIST(:ID_OBJ) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN EXECUTE PROCEDURE L_ENUMPROP_EXIST(:ID_PROP) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN DATE_MAX = NULL; DATE1_MAX = NULL; DATE2_MAX = NULL; ID = NULL; IF (:YES_EMPTY_IF_NONE IS NULL) THEN YES_EMPTY_IF_NONE = 0; IF (:DATE1 IS NULL) THEN BEGIN /* дата начальная не указана */ IF (:DATE2 IS NOT NULL) THEN BEGIN /* ---------------------------------- */ /* вычисляем самую последнюю дату, не позже :DATE2 */ /* т.е., оцениваем знач.св-ва, которые актуальны ДО :DATE2 (включая :DATE2) */ SELECT MAX(DATE_1), MAX(DATE_2) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_ENUM.ID_PROP = :ID_PROP AND ( ((DATE_2 IS NOT NULL) and (DATE_2 >= :DATE2)) OR ((DATE_2 IS NULL) and (DATE_1 <= :DATE2)) ) INTO :DATE1_MAX, :DATE2_MAX; /* ---------------------------------- */ END END ELSE BEGIN IF (:DATE2 IS NULL) THEN BEGIN /* дата конечная не указана */ /* ---------------------------------- */ /* вычисляем самую последнюю дату, не раньше :DATE1 */ /* т.е., оцениваем знач.св-ва, которые актуальны ПОСЛЕ :DATE1 (включая :DATE1) */ SELECT MAX(DATE_1), MAX(DATE_2) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_ENUM.ID_PROP = :ID_PROP AND ( ((DATE_1 IS NOT NULL) and (DATE_1 >= :DATE1)) OR ((DATE_1 IS NULL) and (DATE_2 >= :DATE1)) ) INTO :DATE1_MAX, :DATE2_MAX; /* ---------------------------------- */ END ELSE BEGIN /* задан период дат :DATE1 и DATE2 */ YES_EMPTY_IF_NONE = 0; /* В этом случае значения без дат не учитываем (если ничего не надено за период) */ /* ---------------------------------- */ /* вычисляем самую последнюю дату за период */ SELECT MAX(DATE_1), MAX(DATE_2) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_ENUM.ID_PROP = :ID_PROP AND ( ((DATE_2 IS NOT NULL) and (DATE_2 BETWEEN :DATE1 and :DATE2)) OR ((DATE_2 IS NULL) and (DATE_1 <= :DATE2)) ) INTO :DATE1_MAX, :DATE2_MAX; /* ---------------------------------- */ END END /* ---------------------------------- */ /* Теперь анализируем полученный результат и принимаем решение, что возвращать */ IF (:DATE2_MAX IS NOT NULL) THEN BEGIN DATE_MAX = :DATE2_MAX; /* .......................................................... */ /* Что-то найдено, берем самое последнее значение (по ID_THIS) на дату :DATE2_MAX */ SELECT MAX(ID_THIS) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_ENUM.ID_PROP = :ID_PROP AND DATE_2 = :DATE2_MAX INTO :ID; /* .......................................................... */ END ELSE BEGIN IF (:DATE1_MAX IS NOT NULL) THEN BEGIN DATE_MAX = :DATE1_MAX; /* .......................................................... */ /* Что-то найдено, берем самое последнее значение (по ID_THIS) на дату :DATE1_MAX */ SELECT MAX(ID_THIS) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_ENUM.ID_PROP = :ID_PROP AND DATE_1 = :DATE1_MAX INTO :ID; /* .......................................................... */ END END /* ---------------------------------- */ /* ---------------------------------- */ IF (:ID IS NOT NULL) THEN BEGIN /* если какие-то значения найдены - вычисляем ID значения свойства */ SELECT ID_PROP_VAL FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS = :ID INTO :ID_PROP_VAL; IF (:ID_PROP_VAL IS NULL) THEN ID_PROP_VAL = :VAL_IS_NULL; END /* ---------------------------------- */ /* ---------------------------------- */ IF (:DATE_MAX IS NULL) THEN BEGIN /* Ничего не найдено по условиям */ IF (:YES_EMPTY_IF_NONE > 0) THEN BEGIN /* разрешено использовать значения без дат */ /* .......................................................... */ /* Если ничего не найдено, то берем самое последнее значение без даты (если разрешено) */ SELECT MAX(ID_THIS) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_ENUM.ID_PROP = :ID_PROP AND ((DATE_1 IS NULL) and (DATE_2 IS NULL)) INTO :ID; IF (:ID IS NOT NULL) THEN BEGIN SELECT ID_PROP_VAL FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS = :ID INTO :ID_PROP_VAL; IF (:ID_PROP_VAL IS NULL) THEN ID_PROP_VAL = :VAL_IS_NULL; END /* .......................................................... */ END END /* ---------------------------------- */ END END SUSPEND; END ^ ALTER PROCEDURE GET_OBJ_PROPNUMBER_VAL_ACTUAL (ID_OBJ VARCHAR(40) CHARACTER SET WIN1251, ID_PROP VARCHAR(40) CHARACTER SET WIN1251, DATE1 DATE, DATE2 DATE, YES_EMPTY_IF_NONE INTEGER) RETURNS (PROP_VAL DOUBLE PRECISION) AS DECLARE VARIABLE VAL_IS_NULL DOUBLE PRECISION; DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE ID VARCHAR(40); DECLARE VARIABLE DATE_MAX DATE; DECLARE VARIABLE DATE1_MAX DATE; DECLARE VARIABLE DATE2_MAX DATE; BEGIN /* Для объекта ID_OBJ отобрать актуальное значение численного св-ва ID_PROP за указанный период дат DATE1..DATE2 */ /* Версия 1.00 (04.08.2009) - ЕЩЕ НУЖНА ПРОВЕРКА !!! */ VAL_IS_NULL = 0; /* вероятно, лучше NULL */ PROP_VAL = :VAL_IS_NULL; YES = 0; EXECUTE PROCEDURE OBJECT_EXIST(:ID_OBJ) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN EXECUTE PROCEDURE L_NUMPROP_EXIST(:ID_PROP) RETURNING_VALUES (:YES); IF (:YES>0) THEN BEGIN DATE_MAX = NULL; DATE1_MAX = NULL; DATE2_MAX = NULL; ID = NULL; IF (:YES_EMPTY_IF_NONE IS NULL) THEN YES_EMPTY_IF_NONE = 0; IF (:DATE1 IS NULL) THEN BEGIN /* дата начальная не указана */ IF (:DATE2 IS NOT NULL) THEN BEGIN /* ---------------------------------- */ /* вычисляем самую последнюю дату, не позже :DATE2 */ /* т.е., оцениваем знач.св-ва, которые актуальны ДО :DATE2 (включая :DATE2) */ SELECT MAX(DATE_1), MAX(DATE_2) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_NUMBER.ID_PROP = :ID_PROP AND ( ((DATE_2 IS NOT NULL) and (DATE_2 >= :DATE2)) OR ((DATE_2 IS NULL) and (DATE_1 <= :DATE2)) ) INTO :DATE1_MAX, :DATE2_MAX; /* ---------------------------------- */ END END ELSE BEGIN IF (:DATE2 IS NULL) THEN BEGIN /* дата конечная не указана */ /* ---------------------------------- */ /* вычисляем самую последнюю дату, не раньше :DATE1 */ /* т.е., оцениваем знач.св-ва, которые актуальны ПОСЛЕ :DATE1 (включая :DATE1) */ SELECT MAX(DATE_1), MAX(DATE_2) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_NUMBER.ID_PROP = :ID_PROP AND ( ((DATE_1 IS NOT NULL) and (DATE_1 >= :DATE1)) OR ((DATE_1 IS NULL) and (DATE_2 >= :DATE1)) ) INTO :DATE1_MAX, :DATE2_MAX; /* ---------------------------------- */ END ELSE BEGIN /* задан период дат :DATE1 и DATE2 */ YES_EMPTY_IF_NONE = 0; /* В этом случае значения без дат не учитываем (если ничего не надено за период) */ /* ---------------------------------- */ /* вычисляем самую последнюю дату за период */ SELECT MAX(DATE_1), MAX(DATE_2) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_NUMBER.ID_PROP = :ID_PROP AND ( ((DATE_2 IS NOT NULL) and (DATE_2 BETWEEN :DATE1 and :DATE2)) OR ((DATE_2 IS NULL) and (DATE_1 <= :DATE2)) ) INTO :DATE1_MAX, :DATE2_MAX; /* ---------------------------------- */ END END /* ---------------------------------- */ /* Теперь анализируем полученный результат и принимаем решение, что возвращать */ IF (:DATE2_MAX IS NOT NULL) THEN BEGIN DATE_MAX = :DATE2_MAX; /* .......................................................... */ /* Что-то найдено, берем самое последнее значение (по ID_THIS) на дату :DATE2_MAX */ SELECT MAX(ID_THIS) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_NUMBER.ID_PROP = :ID_PROP AND DATE_2 = :DATE2_MAX INTO :ID; /* .......................................................... */ END ELSE BEGIN IF (:DATE1_MAX IS NOT NULL) THEN BEGIN DATE_MAX = :DATE1_MAX; /* .......................................................... */ /* Что-то найдено, берем самое последнее значение (по ID_THIS) на дату :DATE1_MAX */ SELECT MAX(ID_THIS) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_NUMBER.ID_PROP = :ID_PROP AND DATE_1 = :DATE1_MAX INTO :ID; /* .......................................................... */ END END /* ---------------------------------- */ /* ---------------------------------- */ IF (:ID IS NOT NULL) THEN BEGIN /* если какие-то значения найдены - вычисляем ID значения свойства */ SELECT PROP_VAL FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS = :ID INTO :PROP_VAL; IF (:PROP_VAL IS NULL) THEN PROP_VAL = :VAL_IS_NULL; END /* ---------------------------------- */ /* ---------------------------------- */ IF (:DATE_MAX IS NULL) THEN BEGIN /* Ничего не найдено по условиям */ IF (:YES_EMPTY_IF_NONE > 0) THEN BEGIN /* разрешено использовать значения без дат */ /* .......................................................... */ /* Если ничего не найдено, то берем самое последнее значение без даты (если разрешено) */ SELECT MAX(ID_THIS) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER = :ID_OBJ AND OBJECTS_PROP_NUMBER.ID_PROP = :ID_PROP AND ((DATE_1 IS NULL) and (DATE_2 IS NULL)) INTO :ID; IF (:ID IS NOT NULL) THEN BEGIN SELECT PROP_VAL FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS = :ID INTO :PROP_VAL; IF (:PROP_VAL IS NULL) THEN PROP_VAL = :VAL_IS_NULL; END /* .......................................................... */ END END /* ---------------------------------- */ END END SUSPEND; END ^ SET TERM ; ^ COMMIT WORK ; SET AUTODDL ON; SET TERM ^ ; /* Triggers only will work for SQL triggers */ CREATE TRIGGER BI_SYSTABLESMACRO FOR SYS_TABLES_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_TABLES_MACRO WHERE UPPER(SYS_TABLES_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_TABLES_MACRO WHERE SYS_TABLES_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи */ NEW.ID_THIS = GEN_ID(GEN_SYSTABLESMACRO,1); /* ===================================== */ END ^ CREATE TRIGGER BD_SYSTABLESLIST FOR SYS_TABLES_LIST ACTIVE BEFORE DELETE POSITION 5 AS BEGIN /* ------------------------------------------------------ */ /* delete fields */ /* удаление всех полей из таблицы */ DELETE FROM SYS_TABLE_FIELDS WHERE SYS_TABLE_FIELDS.ID_TABLE = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_LPROPNUMBERLIST FOR L_PROPNUMBER_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPNUMBER_GRP WHERE L_PROPNUMBER_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников во всем списке (по мнемокоду) */ SELECT ID_THIS FROM L_PROPNUMBER_LIST WHERE (UPPER(L_PROPNUMBER_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ------------------------- */ /* Precision */ /* Точность (кол-во знаков после запятой) */ IF (NEW.PRECIS IS NULL) THEN NEW.PRECIS = 0; IF (NEW.PRECIS < 0) THEN NEW.PRECIS = 0; /* ------------------------- */ /* ------------------------- */ /* Unit Measure */ /* Единица измерений */ EXECUTE PROCEDURE CONTROL_UNITMEASURE (NEW.ID_UNITMEASURE) RETURNING_VALUES (NEW.ID_UNITMEASURE); /* ------------------------- */ NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_OBJPROPENUMATR FOR OBJECTS_PROP_ENUM_ATTR ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Control PropEnum in Object Exist */ /* Контроль, чтобы Перечисл. свойство существовало у Объекта в базе данных */ EXECUTE PROCEDURE OBJPROPENUM_EXIST (NEW.ID_THIS) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION OBJPROPENUM_NOT_EXIST; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_CREATE FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_CREATE; /* --------------------------------------- */ END /* ------------------------- */ /* research (exploration)conditions */ /* Условия исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_CONDITION) RETURNING_VALUES (NEW.ID_CONDITION); /* ------------------------- */ /* ------------------------- */ /* anomality in research (exploration) */ /* Аномальность при исследованиях (измерениях) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_ANOMAL) RETURNING_VALUES (NEW.ID_ANOMAL); /* ------------------------- */ /* ------------------------- */ /* research tasks */ /* Задачи исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_TASK) RETURNING_VALUES (NEW.ID_TASK); /* ------------------------- */ /* ------------------------- */ /* integrated explorations forms */ /* Виды комплексных исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_COMPLEX) RETURNING_VALUES (NEW.ID_COMPLEX); /* ------------------------- */ /* ------------------------- */ /* research (exploration) method */ /* Метод исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_METHOD) RETURNING_VALUES (NEW.ID_METHOD); /* ------------------------- */ /* ------------------------- */ /* instruments and systems exploration */ /* Приборы и системы измерений (вычислений */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_DEVICE) RETURNING_VALUES (NEW.ID_DEVICE); /* ------------------------- */ /* ------------------------- */ /* information resource */ /* Источник информации */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_AUTHOR) RETURNING_VALUES (NEW.ID_AUTHOR); /* ------------------------- */ /* ===================================== */ /* --------------------------------------- */ /* Наследуем Владельца свойства */ SELECT ID_OWNER FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS=NEW.ID_THIS INTO NEW.ID_OWNER; /* --------------------------------------- */ IF (NEW.RELIABILITY_THIS IS NULL) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.RELIABILITY_THIS < 0) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS > 1) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_SPACEAPPARATSTART FOR SPACE_APPARAT_START ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control Object Exist */ /* Контроль, чтобы Объект существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_OWNER) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION OBJECT_NOT_EXIST; /* ===================================== */ IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SPACE_APPARAT_START WHERE SPACE_APPARAT_START.ID_OWNER = NEW.ID_OWNER INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи) */ NEW.ID_THIS = GEN_ID(GEN_SPACE_APPARAT_START,1); /* ===================================== */ END ^ CREATE TRIGGER AI_LTYPEOBJMACRO FOR L_TYPEOBJ_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (2, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LTYPEOBJGRP FOR L_TYPEOBJ_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (3, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AU_LTYPEOBJTOP FOR L_TYPEOBJ_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (1, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LTYPEOBJMACRO FOR L_TYPEOBJ_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (2, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LTYPEOBJGRP FOR L_TYPEOBJ_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (3, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_LTYPEOBJLIST FOR L_TYPEOBJ_LIST ACTIVE AFTER INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN SELECT COUNT(ID_THIS) FROM OBJECTS_TREE INTO :C; IF (:C IS NULL) THEN C=0; IF (:C<=0) THEN BEGIN INSERT INTO OBJECTS_TREE (NUMPP, IDUSER_CREATE) VALUES (1, NEW.IDUSER_CREATE); END EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (4, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER BI_LPROPNUMBERTOP FOR L_PROPNUMBER_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPNUMBER_TOP WHERE UPPER(L_PROPNUMBER_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPNUMBER_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPNUM_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER AU_OBJECTSTREE FOR OBJECTS_TREE ACTIVE AFTER UPDATE POSITION 5 AS BEGIN IF (NEW.YESUPDATE_CHILD > 0) THEN BEGIN /* ---------------------------------------- */ /* изменился ID_PARENT - надо обновить все дочерние объекты */ UPDATE OBJECTS_TREE SET OBJECTS_TREE.YESEDIT_THIS = 5, /* Принудительно обновляем */ OBJECTS_TREE.YES_TREE_UPDATE = 99 /* =99 - Обходим контроль глобальности */ WHERE OBJECTS_TREE.ID_PARENT = NEW.ID_THIS; /* все дочерние объекты */ /* ---------------------------------------- */ END IF (NEW.YESUPDATE_REF > 0) THEN BEGIN /* ---------------------------------------- */ /* изменилась информация, которая требует обновления всех ссылочных объектов */ UPDATE OBJECTS_TREE SET OBJECTS_TREE.YESEDIT_THIS = 5, /* Принудительно обновляем */ OBJECTS_TREE.YES_TREE_UPDATE = 99 /* =99 - Обходим контроль глобальности */ WHERE OBJECTS_TREE.ID_REF_NEAR = NEW.ID_THIS /* все ближайшие ссылки */ AND OBJECTS_TREE.ITS_BASE<=0; /* кроме базовых */ /* ---------------------------------------- */ END EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (13, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BD_LPROPNUMBERLIST FOR L_PROPNUMBER_LIST ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if items exists */ /* нельзя удалять, если есть ссылки на эту строку таблицы */ SELECT COUNT ( * ) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_PROP = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_STORAGELIST FOR STORAGE_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info fo Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.SERVER_NAME = '') THEN EXCEPTION DATA_IS_EMPTY; IF (NEW.ALIASBDE5 = '') THEN EXCEPTION DATA_IS_EMPTY; IF (NEW.USER_NAME IS NULL) THEN NEW.USER_NAME = ''; IF (NEW.USER_PSW IS NULL) THEN NEW.USER_PSW = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ===================================== */ IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ID_DB IS NULL) THEN NEW.ID_DB = '00'; IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM STORAGE_LIST INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла) */ C = GEN_ID(GEN_STORAGE_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE(:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BU_STORAGELIST FOR STORAGE_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change ID_THIS */ /* нельзя изменять значение поля ID_THIS */ NEW.ID_THIS = OLD.ID_THIS; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info fo Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.SERVER_NAME = '') THEN EXCEPTION DATA_IS_EMPTY; IF (NEW.ALIASBDE5 = '') THEN EXCEPTION DATA_IS_EMPTY; IF (NEW.USER_NAME IS NULL) THEN NEW.USER_NAME = ''; IF (NEW.USER_PSW IS NULL) THEN NEW.USER_PSW = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ===================================== */ IF (NEW.ID_DB IS NULL) THEN NEW.ID_DB = '00'; IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER AI_OBJPROPNUM FOR OBJECTS_PROP_NUMBER ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (15, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_OBJPROPNUM FOR OBJECTS_PROP_NUMBER ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (15, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_ROLESGRP FOR ROLES_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (37, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BD_SYSTABLESGRP FOR SYS_TABLES_GRP ACTIVE BEFORE DELETE POSITION 5 AS BEGIN /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM SYS_TABLES_LIST WHERE SYS_TABLES_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_SYSTABLESMACRO FOR SYS_TABLES_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM SYS_TABLES_MACRO WHERE UPPER(SYS_TABLES_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER AD_LPROPENUMVAL FOR L_PROPENUM_VAL ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (33, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BU_SYSTABLEFIELDS FOR SYS_TABLE_FIELDS ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE S40 VARCHAR(40); BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.FIELD_NAME IS NULL) THEN NEW.FIELD_NAME = ''; IF (NEW.FIELD_NAME = '') THEN NEW.FIELD_NAME = OLD.FIELD_NAME; IF (NEW.FIELD_TYPE IS NULL) THEN NEW.FIELD_TYPE = ''; IF (NEW.FIELD_TYPE = '') THEN NEW.FIELD_TYPE = OLD.FIELD_TYPE; /* Control if double */ /* Контроль двойников (по имени поля) */ SELECT ID_THIS FROM SYS_TABLE_FIELDS WHERE UPPER(SYS_TABLE_FIELDS.FIELD_NAME) = UPPER(NEW.FIELD_NAME) AND SYS_TABLE_FIELDS.ID_TABLE = NEW.ID_TABLE INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER AI_LPROPENUMVAL FOR L_PROPENUM_VAL ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (33, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER BI_SYSTABLESGRP FOR SYS_TABLES_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_TABLES_GRP WHERE UPPER(SYS_TABLES_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_TABLES_GRP WHERE SYS_TABLES_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи) */ NEW.ID_THIS = GEN_ID(GEN_SYSTABLESGRP,1); /* ===================================== */ END ^ CREATE TRIGGER BU_SYSTABLESGRP FOR SYS_TABLES_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM SYS_TABLES_GRP WHERE UPPER(SYS_TABLES_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER AU_LPROPENUMVAL FOR L_PROPENUM_VAL ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (33, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BI_OBJCHOKE FOR OBJECTS_CHOKE ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Control Object Exist */ /* Контроль, чтобы Объект существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_THIS) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION OBJECT_NOT_EXIST; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_CREATE FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_CREATE; /* --------------------------------------- */ END /* ===================================== */ IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_SYSTABLESMACRO FOR SYS_TABLES_MACRO ACTIVE BEFORE DELETE POSITION 5 AS BEGIN /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM SYS_TABLES_GRP WHERE SYS_TABLES_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AU_OBJPROPENUMATR FOR OBJECTS_PROP_ENUM_ATTR ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (40, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_ROLESGRP FOR ROLES_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (37, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_ROLESGRP FOR ROLES_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (37, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_ROLESLIST FOR ROLES_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (38, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BD_USERSGRP FOR USERS_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM USERS_LIST WHERE USERS_LIST.ID_GRP = OLD.ID_THIS AND USERS_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM USERS_LIST WHERE USERS_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_USERSMACRO FOR USERS_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM USERS_GRP WHERE USERS_GRP.ID_GRP = OLD.ID_THIS AND USERS_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM USERS_GRP WHERE USERS_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_USERSTOP FOR USERS_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM USERS_MACRO WHERE USERS_MACRO.ID_GRP = OLD.ID_THIS AND USERS_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM USERS_MACRO WHERE USERS_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AD_OBJECTSTREE FOR OBJECTS_TREE ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (13, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BU_OBJPROPNUMATR FOR OBJECTS_PROP_NUM_ATTR ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ YES = 0; IF (NEW.IDUSER_UPDATE IS NULL) THEN YES = 1; IF (NEW.IDUSER_UPDATE = '') THEN YES=1; IF (:YES>0) THEN BEGIN IF (OLD.IDUSER_UPDATE <> '') THEN BEGIN NEW.IDUSER_UPDATE = OLD.IDUSER_UPDATE; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_UPDATE FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_UPDATE; /* --------------------------------------- */ END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.IDUSER_UPDATE = '') THEN NEW.IDUSER_UPDATE = OLD.IDUSER_CREATE; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ------------------------- */ /* research (exploration)conditions */ /* Условия исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_CONDITION) RETURNING_VALUES (NEW.ID_CONDITION); /* ------------------------- */ /* ------------------------- */ /* anomality in research (exploration) */ /* Аномальность при исследованиях (измерениях) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_ANOMAL) RETURNING_VALUES (NEW.ID_ANOMAL); /* ------------------------- */ /* ------------------------- */ /* research tasks */ /* Задачи исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_TASK) RETURNING_VALUES (NEW.ID_TASK); /* ------------------------- */ /* ------------------------- */ /* integrated explorations forms */ /* Виды комплексных исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_COMPLEX) RETURNING_VALUES (NEW.ID_COMPLEX); /* ------------------------- */ /* ------------------------- */ /* research (exploration) method */ /* Метод исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_METHOD) RETURNING_VALUES (NEW.ID_METHOD); /* ------------------------- */ /* ------------------------- */ /* instruments and systems exploration */ /* Приборы и системы измерений (вычислений */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_DEVICE) RETURNING_VALUES (NEW.ID_DEVICE); /* ------------------------- */ /* ------------------------- */ /* information resource */ /* Источник информации */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_AUTHOR) RETURNING_VALUES (NEW.ID_AUTHOR); /* ------------------------- */ /* ===================================== */ /* --------------------------------------- */ /* Наследуем Владельца свойства */ SELECT ID_OWNER FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS=NEW.ID_THIS INTO NEW.ID_OWNER; /* --------------------------------------- */ IF (NEW.RELIABILITY_THIS IS NULL) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS < 0) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS > 1) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.ERROR_THIS IS NULL) THEN NEW.ERROR_THIS = 0; IF (NEW.ERROR_THIS < 0) THEN NEW.ERROR_THIS = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER AI_ROLESLIST FOR ROLES_LIST ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (38, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_ROLESLIST FOR ROLES_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (38, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_ROLESMACRO FOR ROLES_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (36, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BU_USERSLIST FOR USERS_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE ITS_USERDEF INTEGER; DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE MNEMO VARCHAR(32); BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.USER_PSW IS NULL) THEN NEW.USER_PSW = ''; IF (NEW.ID_ROLE IS NULL) THEN NEW.ID_ROLE = ''; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; ITS_USERDEF = 0; IF (OLD.MNEMO_CODE <> '') THEN BEGIN /* Control Users Def */ /* Контролируем Пользователей по умолчанию */ EXECUTE PROCEDURE THIS_USER_IS_DEF(OLD.MNEMO_CODE) RETURNING_VALUES :ITS_USERDEF; END IF (:ITS_USERDEF >0) THEN BEGIN /* not change THIS for Admin or User Default */ /* для админов и польз. по умолчанию не позволяем редактировать эти поля */ NEW.MNEMO_CODE = OLD.MNEMO_CODE; NEW.NAME_MAX = OLD.NAME_MAX; NEW.NAME_MIN = OLD.NAME_MIN; NEW.NOTE = OLD.NOTE; NEW.INFO = OLD.INFO; END IF (:ITS_USERDEF <=0) THEN BEGIN IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM USERS_LIST WHERE UPPER(USERS_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; END /* ===================================== */ NEW.DATE_UPDATE = "NOW"; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER BD_USERSLIST FOR USERS_LIST ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE MNEMO VARCHAR(32); BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ C = 0; EXECUTE PROCEDURE THIS_USER_IS_DEF(OLD.MNEMO_CODE) RETURNING_VALUES :C; IF (:C>0) THEN BEGIN /* Cannot delete Users Default */ /* нельзя удалять Пользователей по умолчанию */ EXCEPTION ITS_NOT_DEL; END /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if items exists */ /* нельзя удалять, если есть ссылки на эту строку таблицы */ /* .................................................. */ SELECT COUNT ( * ) FROM OBJECTS_TREE WHERE OBJECTS_TREE.IDUSER_CREATE = OLD.ID_THIS OR OBJECTS_TREE.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.IDUSER_CREATE = OLD.ID_THIS OR OBJECTS_PROP_ENUM.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM STORAGE_LIST WHERE STORAGE_LIST.IDUSER_CREATE = OLD.ID_THIS OR STORAGE_LIST.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.IDUSER_CREATE = OLD.ID_THIS OR SYS_CONST_LIST.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM SYS_CONST_GRP WHERE SYS_CONST_GRP.IDUSER_CREATE = OLD.ID_THIS OR SYS_CONST_GRP.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.IDUSER_CREATE = OLD.ID_THIS OR SYS_CONST_MACRO.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM SYS_CONST_TOP WHERE SYS_CONST_TOP.IDUSER_CREATE = OLD.ID_THIS OR SYS_CONST_TOP.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.IDUSER_CREATE = OLD.ID_THIS OR L_PROPENUM_LIST.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.IDUSER_CREATE = OLD.ID_THIS OR L_PROPENUM_GRP.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.IDUSER_CREATE = OLD.ID_THIS OR L_PROPENUM_MACRO.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_PROPENUM_TOP WHERE L_PROPENUM_TOP.IDUSER_CREATE = OLD.ID_THIS OR L_PROPENUM_TOP.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_TYPEOBJ_LIST WHERE L_TYPEOBJ_LIST.IDUSER_CREATE = OLD.ID_THIS OR L_TYPEOBJ_LIST.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.IDUSER_CREATE = OLD.ID_THIS OR L_TYPEOBJ_GRP.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.IDUSER_CREATE = OLD.ID_THIS OR L_TYPEOBJ_MACRO.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* .................................................. */ SELECT COUNT ( * ) FROM L_TYPEOBJ_TOP WHERE L_TYPEOBJ_TOP.IDUSER_CREATE = OLD.ID_THIS OR L_TYPEOBJ_TOP.IDUSER_UPDATE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_LPROPENUMLIST FOR L_PROPENUM_LIST ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_GRP = OLD.ID_THIS AND L_PROPENUM_VAL.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_GRP = OLD.ID_THIS AND L_PROPENUM_VAL.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_LTYPEOBJTOP FOR L_TYPEOBJ_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_TYPEOBJ_TOP WHERE UPPER(L_TYPEOBJ_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_TYPEOBJ_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_TYPEOBJ_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BD_LPROPENUMTOP FOR L_PROPENUM_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.ID_GRP = OLD.ID_THIS AND L_PROPENUM_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.ID_GRP = OLD.ID_THIS AND L_PROPENUM_MACRO.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete const now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_LPROPENUMTOP FOR L_PROPENUM_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* *************************************** */ /* Временная мера - потом удалить !!! */ IF (NEW.IDUSER_CREATE = '') THEN NEW.IDUSER_CREATE = NEW.IDUSER_UPDATE; /* *************************************** */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPENUM_TOP WHERE UPPER(L_PROPENUM_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_LPROPENUMMACRO FOR L_PROPENUM_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_TOP WHERE L_PROPENUM_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* *************************************** */ /* Временная мера - потом удалить !!! */ IF (NEW.IDUSER_CREATE = '') THEN NEW.IDUSER_CREATE = NEW.IDUSER_UPDATE; /* *************************************** */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPENUM_MACRO WHERE UPPER(L_PROPENUM_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_OBJPROPENUMATR FOR OBJECTS_PROP_ENUM_ATTR ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ YES = 0; IF (NEW.IDUSER_UPDATE IS NULL) THEN YES = 1; IF (NEW.IDUSER_UPDATE = '') THEN YES=1; IF (:YES>0) THEN BEGIN IF (OLD.IDUSER_UPDATE <> '') THEN BEGIN NEW.IDUSER_UPDATE = OLD.IDUSER_UPDATE; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_UPDATE FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_UPDATE; /* --------------------------------------- */ END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.IDUSER_UPDATE = '') THEN NEW.IDUSER_UPDATE = OLD.IDUSER_CREATE; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ------------------------- */ /* research (exploration)conditions */ /* Условия исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_CONDITION) RETURNING_VALUES (NEW.ID_CONDITION); /* ------------------------- */ /* ------------------------- */ /* anomality in research (exploration) */ /* Аномальность при исследованиях (измерениях) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_ANOMAL) RETURNING_VALUES (NEW.ID_ANOMAL); /* ------------------------- */ /* ------------------------- */ /* research tasks */ /* Задачи исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_TASK) RETURNING_VALUES (NEW.ID_TASK); /* ------------------------- */ /* ------------------------- */ /* integrated explorations forms */ /* Виды комплексных исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_COMPLEX) RETURNING_VALUES (NEW.ID_COMPLEX); /* ------------------------- */ /* ------------------------- */ /* research (exploration) method */ /* Метод исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_METHOD) RETURNING_VALUES (NEW.ID_METHOD); /* ------------------------- */ /* ------------------------- */ /* instruments and systems exploration */ /* Приборы и системы измерений (вычислений */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_DEVICE) RETURNING_VALUES (NEW.ID_DEVICE); /* ------------------------- */ /* ------------------------- */ /* information resource */ /* Источник информации */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_AUTHOR) RETURNING_VALUES (NEW.ID_AUTHOR); /* ------------------------- */ /* ===================================== */ /* --------------------------------------- */ /* Наследуем Владельца свойства */ SELECT ID_OWNER FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_THIS=NEW.ID_THIS INTO NEW.ID_OWNER; /* --------------------------------------- */ IF (NEW.RELIABILITY_THIS IS NULL) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS < 0) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS > 1) THEN NEW.RELIABILITY_THIS = 1; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_OBJPROPENUM FOR OBJECTS_PROP_ENUM ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE D1 DATE; DECLARE VARIABLE D2 DATE; DECLARE VARIABLE T1 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE T2 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE DELIM_LEFT VARCHAR(1) CHARACTER SET WIN1251; DECLARE VARIABLE DELIM_RIGHT VARCHAR(1) CHARACTER SET WIN1251; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Control Object Exist */ /* Контроль, чтобы Объект существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_OWNER) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION OBJECT_NOT_EXIST; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ------------------------- */ /* Control PropEnumVal exist */ /* Контроль, чтобы значение ID_PROP_VAL было корректным */ EXECUTE PROCEDURE CONTROL_LENUMVAL (NEW.ID_PROP_VAL) RETURNING_VALUES (NEW.ID_PROP_VAL); /* Вычисляем для данного ID значения - ID свойства */ EXECUTE PROCEDURE GET_IDPROP_FOR_IDVAL_ENUM (NEW.ID_PROP_VAL) RETURNING_VALUES (NEW.ID_PROP); /* ------------------------- */ IF (NEW.ID_PACKET IS NULL) THEN NEW.ID_PACKET = ''; /* ===================================== */ /* ------------------------- */ /* разделители (правая и левая квадратные скобки) */ EXECUTE PROCEDURE GET_DELIMITERLEFT_001 RETURNING_VALUES :DELIM_LEFT; EXECUTE PROCEDURE GET_DELIMITERRIGHT_001 RETURNING_VALUES :DELIM_RIGHT; /* ------------------------- */ IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; YES = 0; IF (NEW.DATE_1 IS NULL) THEN YES = 1; IF (NEW.DATE_2 IS NULL) THEN YES = 2; IF (NEW.TIME_1 IS NULL) THEN YES = 3; IF (NEW.TIME_2 IS NULL) THEN YES = 4; IF (:YES>0) THEN BEGIN /* ------------------------------------------ */ /* Наследуем у Владельца нужную нам информацию */ SELECT DATE_1, TIME_1, DATE_2, TIME_2 FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = NEW.ID_OWNER INTO :D1, :T1, :D2, :T2; /* ------------------------------------------ */ IF (:T1 IS NULL) THEN T1 = ''; IF (:T2 IS NULL) THEN T2 = ''; IF (NEW.DATE_1 IS NULL) THEN BEGIN /* Значение нач.даты не указано - берем у Владельца */ NEW.DATE_1 = :D1; NEW.TIME_1 = :T1; END IF (NEW.DATE_2 IS NULL) THEN BEGIN /* Значение кон.даты не указано - берем у Владельца */ NEW.DATE_2 = :D2; NEW.TIME_2 = :T2; END /* ------------------------------------------ */ /* берем у Владельца, если Даты были заданы в ПО, а Время нет */ IF (NEW.TIME_1 IS NULL) THEN NEW.TIME_1 = :T1; IF (NEW.TIME_2 IS NULL) THEN NEW.TIME_2 = :T2; /* ------------------------------------------ */ END EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :YES; /* Проверяем, задан ли ID в ПО */ IF (:YES>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ EXECUTE PROCEDURE GET_ID_OBJPROPENUM RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_OBJPROPNUMATR FOR OBJECTS_PROP_NUM_ATTR ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Control PropEnum in Object Exist */ /* Контроль, чтобы Числен. свойство существовало у Объекта в базе данных */ EXECUTE PROCEDURE OBJPROPNUM_EXIST (NEW.ID_THIS) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION OBJPROPNUM_NOT_EXIST; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_CREATE FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_CREATE; /* --------------------------------------- */ END /* ------------------------- */ /* research (exploration)conditions */ /* Условия исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_CONDITION) RETURNING_VALUES (NEW.ID_CONDITION); /* ------------------------- */ /* ------------------------- */ /* anomality in research (exploration) */ /* Аномальность при исследованиях (измерениях) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_ANOMAL) RETURNING_VALUES (NEW.ID_ANOMAL); /* ------------------------- */ /* ------------------------- */ /* research tasks */ /* Задачи исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_TASK) RETURNING_VALUES (NEW.ID_TASK); /* ------------------------- */ /* ------------------------- */ /* integrated explorations forms */ /* Виды комплексных исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_COMPLEX) RETURNING_VALUES (NEW.ID_COMPLEX); /* ------------------------- */ /* ------------------------- */ /* research (exploration) method */ /* Метод исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_METHOD) RETURNING_VALUES (NEW.ID_METHOD); /* ------------------------- */ /* ------------------------- */ /* instruments and systems exploration */ /* Приборы и системы измерений (вычислений */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_DEVICE) RETURNING_VALUES (NEW.ID_DEVICE); /* ------------------------- */ /* ------------------------- */ /* information resource */ /* Источник информации */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_AUTHOR) RETURNING_VALUES (NEW.ID_AUTHOR); /* ------------------------- */ /* ===================================== */ /* --------------------------------------- */ /* Наследуем Владельца свойства */ SELECT ID_OWNER FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_THIS=NEW.ID_THIS INTO NEW.ID_OWNER; /* --------------------------------------- */ IF (NEW.RELIABILITY_THIS IS NULL) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.RELIABILITY_THIS < 0) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS > 1) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.ERROR_THIS IS NULL) THEN NEW.ERROR_THIS = 0; IF (NEW.ERROR_THIS < 0) THEN NEW.ERROR_THIS = 0; IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LPROPENUMMACRO FOR L_PROPENUM_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.ID_GRP = OLD.ID_THIS AND L_PROPENUM_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.ID_GRP = OLD.ID_THIS AND L_PROPENUM_GRP.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_LPROPNUMBERGRP FOR L_PROPNUMBER_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_GRP = OLD.ID_THIS AND L_PROPNUMBER_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_GRP = OLD.ID_THIS AND L_PROPNUMBER_LIST.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AU_LTYPEOBJLIST FOR L_TYPEOBJ_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (4, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AD_LPROPNUMBERTOP FOR L_PROPNUMBER_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (9, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AD_LPROPNUMBERMACRO FOR L_PROPNUMBER_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (10, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BD_SYSTABLESTOP FOR SYS_TABLES_TOP ACTIVE BEFORE DELETE POSITION 5 AS BEGIN /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM SYS_TABLES_MACRO WHERE SYS_TABLES_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_SYSTABLESTOP FOR SYS_TABLES_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_TABLES_TOP WHERE UPPER(SYS_TABLES_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_TABLES_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи */ NEW.ID_THIS = GEN_ID(GEN_SYSTABLESTOP,1); /* ===================================== */ END ^ CREATE TRIGGER BD_LPROPNUMBERMACRO FOR L_PROPNUMBER_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPNUMBER_GRP WHERE L_PROPNUMBER_GRP.ID_GRP = OLD.ID_THIS AND L_PROPNUMBER_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPNUMBER_GRP WHERE L_PROPNUMBER_GRP.ID_GRP = OLD.ID_THIS AND L_PROPNUMBER_GRP.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPNUMBER_GRP WHERE L_PROPNUMBER_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_SYSCONSTTOP FOR SYS_CONST_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_CONST_TOP WHERE UPPER(SYS_CONST_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_CONST_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_SYSCONSTTOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BU_LPROPNUMBERMACRO FOR L_PROPNUMBER_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPNUMBER_TOP WHERE L_PROPNUMBER_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPNUMBER_MACRO WHERE UPPER(L_PROPNUMBER_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_SYSCONSTTOP FOR SYS_CONST_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.ID_GRP = OLD.ID_THIS AND SYS_CONST_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.ID_GRP = OLD.ID_THIS AND SYS_CONST_MACRO.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete const now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_LPROPNUMBERTOP FOR L_PROPNUMBER_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPNUMBER_MACRO WHERE L_PROPNUMBER_MACRO.ID_GRP = OLD.ID_THIS AND L_PROPNUMBER_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPNUMBER_MACRO WHERE L_PROPNUMBER_MACRO.ID_GRP = OLD.ID_THIS AND L_PROPNUMBER_MACRO.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete const now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPNUMBER_MACRO WHERE L_PROPNUMBER_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_LPROPNUMBERTOP FOR L_PROPNUMBER_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPNUMBER_TOP WHERE UPPER(L_PROPNUMBER_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_SYSCONSTTOP FOR SYS_CONST_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM SYS_CONST_TOP WHERE UPPER(SYS_CONST_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_LTYPEOBJTOP FOR L_TYPEOBJ_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_TYPEOBJ_TOP WHERE UPPER(L_TYPEOBJ_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LTYPEOBJTOP FOR L_TYPEOBJ_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.ID_GRP = OLD.ID_THIS AND L_TYPEOBJ_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.ID_GRP = OLD.ID_THIS AND L_TYPEOBJ_MACRO.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete const now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_LTYPEOBJMACRO FOR L_TYPEOBJ_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.ID_GRP = OLD.ID_THIS AND L_TYPEOBJ_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.ID_GRP = OLD.ID_THIS AND L_TYPEOBJ_GRP.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_LTYPEOBJMACRO FOR L_TYPEOBJ_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_TYPEOBJ_TOP WHERE L_TYPEOBJ_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_TYPEOBJ_MACRO WHERE UPPER(L_TYPEOBJ_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LTYPEOBJGRP FOR L_TYPEOBJ_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_TYPEOBJ_LIST WHERE L_TYPEOBJ_LIST.ID_GRP = OLD.ID_THIS AND L_TYPEOBJ_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_TYPEOBJ_LIST WHERE L_TYPEOBJ_LIST.ID_GRP = OLD.ID_THIS AND L_TYPEOBJ_LIST.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_TYPEOBJ_LIST WHERE L_TYPEOBJ_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_SYSCONSTMACRO FOR SYS_CONST_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM SYS_CONST_GRP WHERE SYS_CONST_GRP.ID_GRP = OLD.ID_THIS AND SYS_CONST_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM SYS_CONST_GRP WHERE SYS_CONST_GRP.ID_GRP = OLD.ID_THIS AND SYS_CONST_GRP.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM SYS_CONST_GRP WHERE SYS_CONST_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_SYSCONSTGRP FOR SYS_CONST_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM SYS_CONST_GRP WHERE UPPER(SYS_CONST_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_LTYPEOBJGRP FOR L_TYPEOBJ_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_TYPEOBJ_GRP WHERE UPPER(L_TYPEOBJ_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LTYPEOBJLIST FOR L_TYPEOBJ_LIST ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if items exists */ /* нельзя удалять, если есть ссылки на эту строку таблицы */ SELECT COUNT ( * ) FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_TYPE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_SYSTABLESTOP FOR SYS_TABLES_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM SYS_TABLES_TOP WHERE UPPER(SYS_TABLES_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER BU_LPROPENUMGRP FOR L_PROPENUM_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* *************************************** */ /* Временная мера - потом удалить !!! */ IF (NEW.IDUSER_CREATE = '') THEN NEW.IDUSER_CREATE = NEW.IDUSER_UPDATE; /* *************************************** */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPENUM_GRP WHERE UPPER(L_PROPENUM_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LPROPENUMVAL FOR L_PROPENUM_VAL ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if items exists */ /* нельзя удалять, если есть ссылки на эту строку таблицы */ /* Справочник численных свойств (единицы измерений) */ SELECT COUNT ( * ) FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_UNITMEASURE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* Перечислимые свойства объектов */ SELECT COUNT ( * ) FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_PROP_VAL = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* Сисленные свойства объектов (единицы измерений) */ SELECT COUNT ( * ) FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_UNITMEASURE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BU_LPROPNUMBERGRP FOR L_PROPNUMBER_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPNUMBER_MACRO WHERE L_PROPNUMBER_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPNUMBER_GRP WHERE UPPER(L_PROPNUMBER_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_SYSCONSTLIST FOR SYS_CONST_LIST ACTIVE BEFORE DELETE POSITION 5 AS BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AD_LTYPEOBJTOP FOR L_TYPEOBJ_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (1, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BU_SYSCONSTMACRO FOR SYS_CONST_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM SYS_CONST_TOP WHERE SYS_CONST_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM SYS_CONST_MACRO WHERE UPPER(SYS_CONST_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER AD_LTYPEOBJMACRO FOR L_TYPEOBJ_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (2, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BD_ROLESGRP FOR ROLES_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM ROLES_LIST WHERE ROLES_LIST.ID_GRP = OLD.ID_THIS AND ROLES_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM ROLES_LIST WHERE ROLES_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_ROLESMACRO FOR ROLES_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM ROLES_GRP WHERE ROLES_GRP.ID_GRP = OLD.ID_THIS AND ROLES_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM ROLES_GRP WHERE ROLES_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_LTYPEOBJMACRO FOR L_TYPEOBJ_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_TYPEOBJ_MACRO WHERE UPPER(L_TYPEOBJ_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from TOP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_TYPEOBJ_TOP WHERE L_TYPEOBJ_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_TYPEOBJ_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_LTYPEOBJGRP FOR L_TYPEOBJ_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_TYPEOBJ_GRP WHERE UPPER(L_TYPEOBJ_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from MACRO (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_TYPEOBJ_MACRO WHERE L_TYPEOBJ_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_TYPEOBJ_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_LTYPEOBJLIST FOR L_TYPEOBJ_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников во всем списке (по мнемокоду) */ SELECT COUNT ( * ) FROM L_TYPEOBJ_LIST WHERE (UPPER(L_TYPEOBJ_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ITS_ABSTRACT IS NULL) THEN NEW.ITS_ABSTRACT = 0; IF (NEW.ID_KIND IS NULL) THEN EXECUTE PROCEDURE GET_IDKIND_IS_OBJECT RETURNING_VALUES NEW.ID_KIND; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_TYPEOBJ_LIST WHERE L_TYPEOBJ_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from GRP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_TYPEOBJ_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BD_ROLESTOP FOR ROLES_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM ROLES_MACRO WHERE ROLES_MACRO.ID_GRP = OLD.ID_THIS AND ROLES_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM ROLES_MACRO WHERE ROLES_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_OBJPROPENUM FOR OBJECTS_PROP_ENUM ACTIVE BEFORE DELETE POSITION 10 AS BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Enum Props Attr */ /* Удаляем атрибуты перечислимого св-ва объекта */ DELETE FROM OBJECTS_PROP_ENUM_ATTR WHERE OBJECTS_PROP_ENUM_ATTR.ID_THIS=OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BD_OBJPROPNUM FOR OBJECTS_PROP_NUMBER ACTIVE BEFORE DELETE POSITION 10 AS BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Number Props Attr */ /* Удаляем атрибуты численного св-ва объекта */ DELETE FROM OBJECTS_PROP_NUM_ATTR WHERE OBJECTS_PROP_NUM_ATTR.ID_THIS=OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_LPROPNUMBERMACRO FOR L_PROPNUMBER_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPNUMBER_MACRO WHERE UPPER(L_PROPNUMBER_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPNUMBER_MACRO WHERE L_PROPNUMBER_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from TOP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPNUMBER_TOP WHERE L_PROPNUMBER_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPNUM_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_LPROPNUMBERLIST FOR L_PROPNUMBER_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников во всем списке (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPNUMBER_LIST WHERE (UPPER(L_PROPNUMBER_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ------------------------- */ /* Precision */ /* Точность (кол-во знаков после запятой) */ IF (NEW.PRECIS IS NULL) THEN NEW.PRECIS = 0; IF (NEW.PRECIS < 0) THEN NEW.PRECIS = 0; /* ------------------------- */ /* ------------------------- */ /* Unit Measure */ /* Единица измерений */ EXECUTE PROCEDURE CONTROL_UNITMEASURE (NEW.ID_UNITMEASURE) RETURNING_VALUES (NEW.ID_UNITMEASURE); /* ------------------------- */ NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPNUMBER_LIST WHERE L_PROPNUMBER_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from GRP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPNUMBER_GRP WHERE L_PROPNUMBER_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPNUM_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_LPROPNUMBERGRP FOR L_PROPNUMBER_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPNUMBER_GRP WHERE UPPER(L_PROPNUMBER_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPNUMBER_GRP WHERE L_PROPNUMBER_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from MACRO (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPNUMBER_MACRO WHERE L_PROPNUMBER_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPNUM_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_ROLESGRP FOR ROLES_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM ROLES_GRP WHERE UPPER(ROLES_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM ROLES_GRP WHERE ROLES_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_ROLES_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BD_ROLESLIST FOR ROLES_LIST ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE MNEMO VARCHAR(32); BEGIN /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* Cannot delete if items exists */ /* нельзя удалять, если есть ссылки на эту строку таблицы */ /* .................................................. */ SELECT COUNT ( * ) FROM USERS_LIST WHERE USERS_LIST.ID_ROLE = OLD.ID_THIS INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; /* .................................................. */ END ^ CREATE TRIGGER AI_OBJECTSTREE FOR OBJECTS_TREE ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (13, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_OBJECTSCHOKE FOR OBJECTS_CHOKE ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (39, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AI_ROLESMACRO FOR ROLES_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (36, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_ROLESMACRO FOR ROLES_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (36, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_ROLESTOP FOR ROLES_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (34, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_ROLESTOP FOR ROLES_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (34, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_ROLESTOP FOR ROLES_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (34, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_SYSCONSTGRP FOR SYS_CONST_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (16, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_SYSCONSTGRP FOR SYS_CONST_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (16, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_SYSCONSTGRP FOR SYS_CONST_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (16, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_SYSCONSTLIST FOR SYS_CONST_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (19, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_SYSCONSTLIST FOR SYS_CONST_LIST ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (19, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_SYSCONSTLIST FOR SYS_CONST_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (19, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_SYSCONSTMACRO FOR SYS_CONST_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (30, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_SYSCONSTMACRO FOR SYS_CONST_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (30, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_SYSCONSTMACRO FOR SYS_CONST_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (30, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_SYSCONSTTOP FOR SYS_CONST_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (32, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BD_LPROPENUMGRP FOR L_PROPENUM_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_GRP = OLD.ID_THIS AND L_PROPENUM_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_GRP = OLD.ID_THIS AND L_PROPENUM_LIST.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AI_OBJECTSCHOKE FOR OBJECTS_CHOKE ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (39, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_SYSCONSTTOP FOR SYS_CONST_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (32, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_SYSCONSTTOP FOR SYS_CONST_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (32, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_USERSGRP FOR USERS_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (23, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_OBJECTSCHOKE FOR OBJECTS_CHOKE ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (39, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BI_SYSTABLESLIST FOR SYS_TABLES_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.TABLE_NAME IS NULL) THEN NEW.TABLE_NAME = ''; IF (NEW.TABLE_NAME = '') THEN NEW.TABLE_NAME = '???'; /* ===================================== */ IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.YES_SYS_EVENT IS NULL) THEN NEW.YES_SYS_EVENT = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_TABLES_LIST WHERE SYS_TABLES_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи) */ NEW.ID_THIS = GEN_ID(GEN_SYSTABLES,1); /* ===================================== */ END ^ CREATE TRIGGER BU_SPACEAPPARATSTART FOR SPACE_APPARAT_START ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control Object Exist */ /* Контроль, чтобы Объект существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_OWNER) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION OBJECT_NOT_EXIST; /* ===================================== */ IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER AI_USERSGRP FOR USERS_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (23, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_USERSGRP FOR USERS_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (23, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_USERSLIST FOR USERS_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (24, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BU_SYSTABLESLIST FOR SYS_TABLES_LIST ACTIVE BEFORE UPDATE POSITION 5 AS BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.TABLE_NAME IS NULL) THEN NEW.TABLE_NAME = ''; IF (NEW.TABLE_NAME = '') THEN NEW.TABLE_NAME = OLD.TABLE_NAME; /* ===================================== */ IF (NEW.YES_SYS_EVENT IS NULL) THEN NEW.YES_SYS_EVENT = 0; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER AI_OBJPROPENUMATR FOR OBJECTS_PROP_ENUM_ATTR ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (40, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER BI_SYSCONSTGRP FOR SYS_CONST_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_CONST_GRP WHERE UPPER(SYS_CONST_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_CONST_GRP WHERE SYS_CONST_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from MACRO (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_SYSCONSTGRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BI_SYSCONSTMACRO FOR SYS_CONST_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_CONST_MACRO WHERE UPPER(SYS_CONST_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_CONST_MACRO WHERE SYS_CONST_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from TOP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM SYS_CONST_TOP WHERE SYS_CONST_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_SYSCONSTMACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BD_SYSCONSTGRP FOR SYS_CONST_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.ID_GRP = OLD.ID_THIS AND SYS_CONST_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.ID_GRP = OLD.ID_THIS AND SYS_CONST_LIST.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if ReadOnly items exists */ /* нельзя удалять, если внутри группы есть ReadOnly */ SELECT COUNT ( * ) FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.ID_GRP = OLD.ID_THIS AND SYS_CONST_LIST.IS_READONLY > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_READONLY_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER BI_SYSCONSTLIST FOR SYS_CONST_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.YES_READONLY_RESET IS NULL) THEN NEW.YES_READONLY_RESET = 0; IF (NEW.IS_READONLY IS NULL) THEN NEW.IS_READONLY = 0; IF (NEW.CONST_VALUE IS NULL) THEN NEW.CONST_VALUE = ''; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE = '') THEN EXCEPTION DATA_IS_NOT_COMPLETE; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников во всем списке (по мнемокоду) */ SELECT COUNT ( * ) FROM SYS_CONST_LIST WHERE UPPER(SYS_CONST_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from GRP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM SYS_CONST_LIST WHERE SYS_CONST_LIST.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ NEW.YES_READONLY_RESET = 0; /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_SYSCONST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BU_SYSCONSTLIST FOR SYS_CONST_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.YES_READONLY_RESET IS NULL) THEN NEW.YES_READONLY_RESET = 0; IF (NEW.IS_READONLY IS NULL) THEN NEW.IS_READONLY = 0; IF (NEW.YES_READONLY_RESET<=0) THEN BEGIN /* Cannot edit if ReadOnly */ /* нельзя редактировать "Только для чтения" */ IF (NEW.IS_READONLY>0) THEN EXCEPTION ITS_READONLY_NOT_EDIT; END IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM SYS_CONST_GRP WHERE SYS_CONST_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE = '') THEN EXCEPTION DATA_IS_NOT_COMPLETE; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников во всем списке (по мнемокоду) */ SELECT ID_THIS FROM SYS_CONST_LIST WHERE UPPER(SYS_CONST_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.CONST_VALUE IS NULL) THEN NEW.CONST_VALUE = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.YES_READONLY_RESET = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER AD_LTYPEOBJGRP FOR L_TYPEOBJ_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (3, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AD_LTYPEOBJLIST FOR L_TYPEOBJ_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (4, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AI_LTYPEOBJTOP FOR L_TYPEOBJ_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (1, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_LPROPNUMBERGRP FOR L_PROPNUMBER_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (11, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AD_LPROPNUMBERLIST FOR L_PROPNUMBER_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (12, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AI_LPROPNUMBERTOP FOR L_PROPNUMBER_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (9, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LPROPNUMBERMACRO FOR L_PROPNUMBER_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (10, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LPROPNUMBERGRP FOR L_PROPNUMBER_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (11, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LPROPNUMBERLIST FOR L_PROPNUMBER_LIST ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (12, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AU_LPROPNUMBERTOP FOR L_PROPNUMBER_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (9, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LPROPNUMBERMACRO FOR L_PROPNUMBER_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (10, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LPROPNUMBERGRP FOR L_PROPNUMBER_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (11, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LPROPNUMBERLIST FOR L_PROPNUMBER_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (12, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AD_LPROPENUMTOP FOR L_PROPENUM_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (5, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AD_LPROPENUMMACRO FOR L_PROPENUM_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (6, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AD_LPROPENUMGRP FOR L_PROPENUM_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (7, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AD_LPROPENUMLIST FOR L_PROPENUM_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (8, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AI_LPROPENUMTOP FOR L_PROPENUM_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (5, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LPROPENUMMACRO FOR L_PROPENUM_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (6, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LPROPENUMGRP FOR L_PROPENUM_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (7, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AI_LPROPENUMLIST FOR L_PROPENUM_LIST ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (8, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AU_LPROPENUMTOP FOR L_PROPENUM_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (5, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LPROPENUMMACRO FOR L_PROPENUM_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (6, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LPROPENUMGRP FOR L_PROPENUM_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (7, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AU_LPROPENUMLIST FOR L_PROPENUM_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (8, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BI_SYSTABLEFIELDS FOR SYS_TABLE_FIELDS ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.FIELD_NAME IS NULL) THEN NEW.FIELD_NAME = ''; IF (NEW.FIELD_NAME = '') THEN NEW.FIELD_NAME = '???'; IF (NEW.FIELD_TYPE IS NULL) THEN NEW.FIELD_TYPE = ''; IF (NEW.FIELD_TYPE = '') THEN NEW.FIELD_TYPE = '???'; /* Control if double */ /* Контроль двойников (по имени поля) */ SELECT COUNT ( * ) FROM SYS_TABLE_FIELDS WHERE UPPER(SYS_TABLE_FIELDS.FIELD_NAME) = UPPER(NEW.FIELD_NAME) AND SYS_TABLE_FIELDS.ID_TABLE = NEW.ID_TABLE INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; /* ===================================== */ IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM SYS_TABLE_FIELDS WHERE SYS_TABLE_FIELDS.ID_TABLE = NEW.ID_TABLE INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи) */ NEW.ID_THIS = GEN_ID(GEN_SYSTABLESFLDS,1); /* ===================================== */ END ^ CREATE TRIGGER AD_OBJPROPENUMATR FOR OBJECTS_PROP_ENUM_ATTR ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (40, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_OBJPROPNUMATR FOR OBJECTS_PROP_NUM_ATTR ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (41, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_USERSLIST FOR USERS_LIST ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (24, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_USERSLIST FOR USERS_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (24, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_USERSMACRO FOR USERS_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (22, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BI_ROLESLIST FOR ROLES_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM ROLES_LIST WHERE UPPER(ROLES_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM ROLES_LIST WHERE ROLES_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_ROLES_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BI_LPROPENUMVAL FOR L_PROPENUM_VAL ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников в группе (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPENUM_VAL WHERE (UPPER(L_PROPENUM_VAL.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) AND (L_PROPENUM_VAL.ID_GRP=NEW.ID_GRP) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPENUM_VAL WHERE L_PROPENUM_VAL.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from GRP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPENUM_VAL,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER AI_OBJPROPNUMATR FOR OBJECTS_PROP_NUM_ATTR ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (41, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_OBJPROPNUMATR FOR OBJECTS_PROP_NUM_ATTR ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (41, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BI_LPROPENUMTOP FOR L_PROPENUM_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPENUM_TOP WHERE UPPER(L_PROPENUM_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPENUM_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPENUM_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER AU_OBJPROPENUM FOR OBJECTS_PROP_ENUM ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (14, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_OBJPROPENUM FOR OBJECTS_PROP_ENUM ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (14, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER BI_ROLESTOP FOR ROLES_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM ROLES_TOP WHERE UPPER(ROLES_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM ROLES_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_ROLES_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BU_USERSTOP FOR USERS_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM USERS_TOP WHERE UPPER(USERS_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_USERSMACRO FOR USERS_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM USERS_MACRO WHERE UPPER(USERS_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_ROLESMACRO FOR ROLES_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM ROLES_MACRO WHERE UPPER(ROLES_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM ROLES_MACRO WHERE ROLES_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_ROLES_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BU_USERSGRP FOR USERS_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM USERS_GRP WHERE UPPER(USERS_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_ROLESTOP FOR ROLES_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM ROLES_TOP WHERE UPPER(ROLES_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_ROLESMACRO FOR ROLES_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM ROLES_MACRO WHERE UPPER(ROLES_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_ROLESLIST FOR ROLES_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE S40 VARCHAR(40); BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM ROLES_LIST WHERE UPPER(ROLES_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; /* ===================================== */ NEW.DATE_UPDATE = "NOW"; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER BU_ROLESGRP FOR ROLES_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM ROLES_GRP WHERE UPPER(ROLES_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_USERSTOP FOR USERS_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM USERS_TOP WHERE UPPER(USERS_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM USERS_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_USERS_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BI_USERSMACRO FOR USERS_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM USERS_MACRO WHERE UPPER(USERS_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM USERS_MACRO WHERE USERS_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_USERS_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BI_USERSLIST FOR USERS_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.USER_PSW IS NULL) THEN NEW.USER_PSW = ''; IF (NEW.ID_ROLE IS NULL) THEN NEW.ID_ROLE = ''; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM USERS_LIST WHERE UPPER(USERS_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM USERS_LIST WHERE USERS_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_USERS_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER BI_USERSGRP FOR USERS_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM USERS_GRP WHERE UPPER(USERS_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM USERS_GRP WHERE USERS_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_USERS_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END ^ CREATE TRIGGER AD_OBJPROPENUM FOR OBJECTS_PROP_ENUM ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (14, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BU_OBJCHOKE FOR OBJECTS_CHOKE ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END ELSE BEGIN IF (OLD.IDUSER_UPDATE<>'') THEN BEGIN NEW.IDUSER_UPDATE = OLD.IDUSER_UPDATE; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_UPDATE FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_UPDATE; /* --------------------------------------- */ END END /* ===================================== */ NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_LPROPENUMLIST FOR L_PROPENUM_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* ------------------------------------------------- */ /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE CONTROL_USER_EXIST (NEW.IDUSER_UPDATE); /* ------------------------------------------------- */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников в группе (по мнемокоду) */ SELECT ID_THIS FROM L_PROPENUM_LIST WHERE (UPPER(L_PROPENUM_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) AND (L_PROPENUM_LIST.ID_GRP=NEW.ID_GRP) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_LPROPTEXTTOP FOR L_PROPTEXT_TOP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPTEXT_TOP WHERE UPPER(L_PROPTEXT_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPTEXT_TOP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPTEXT_TOP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BU_LPROPTEXTTOP FOR L_PROPTEXT_TOP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.ID_GRP IS NULL) THEN NEW.ID_GRP = ''; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* *************************************** */ /* Временная мера - потом удалить !!! */ IF (NEW.IDUSER_CREATE = '') THEN NEW.IDUSER_CREATE = NEW.IDUSER_UPDATE; /* *************************************** */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPTEXT_TOP WHERE UPPER(L_PROPTEXT_TOP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LPROPTEXTTOP FOR L_PROPTEXT_TOP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPTEXT_MACRO WHERE L_PROPTEXT_MACRO.ID_GRP = OLD.ID_THIS AND L_PROPTEXT_MACRO.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPTEXT_MACRO WHERE L_PROPTEXT_MACRO.ID_GRP = OLD.ID_THIS AND L_PROPTEXT_MACRO.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete const now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPTEXT_MACRO WHERE L_PROPTEXT_MACRO.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AI_LPROPTEXTTOP FOR L_PROPTEXT_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (44, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER BI_LPROPENUMMACRO FOR L_PROPENUM_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPENUM_MACRO WHERE UPPER(L_PROPENUM_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from TOP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_TOP WHERE L_PROPENUM_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPENUM_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_LPROPENUMLIST FOR L_PROPENUM_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников в группе (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPENUM_LIST WHERE (UPPER(L_PROPENUM_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) AND (L_PROPENUM_LIST.ID_GRP=NEW.ID_GRP) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from GRP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPENUM_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BI_LPROPENUMGRP FOR L_PROPENUM_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPENUM_GRP WHERE UPPER(L_PROPENUM_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPENUM_GRP WHERE L_PROPENUM_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from MACRO (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_MACRO WHERE L_PROPENUM_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPENUM_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER AU_OBJPROPNUM FOR OBJECTS_PROP_NUMBER ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (15, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_USERSMACRO FOR USERS_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (22, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_USERSMACRO FOR USERS_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (22, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_USERSTOP FOR USERS_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (21, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_USERSTOP FOR USERS_TOP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (21, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_USERSTOP FOR USERS_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (21, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_OBJATTR FOR OBJECTS_TREE_ATTR ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (43, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AI_OBJATTR FOR OBJECTS_TREE_ATTR ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (43, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_OBJATTR FOR OBJECTS_TREE_ATTR ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (43, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BU_OBJECTSTREE FOR OBJECTS_TREE ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE IDTHIS_ISROOT VARCHAR(40) CHARACTER SET WIN1251; DECLARE VARIABLE D1 DATE; DECLARE VARIABLE D2 DATE; DECLARE VARIABLE T1 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE T2 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE NAMEMAX VARCHAR(200) CHARACTER SET WIN1251; DECLARE VARIABLE DELIM_LEFT VARCHAR(1) CHARACTER SET WIN1251; DECLARE VARIABLE DELIM_RIGHT VARCHAR(1) CHARACTER SET WIN1251; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ IF (NEW.YES_TREE_UPDATE IS NULL) THEN NEW.YES_TREE_UPDATE = 0; IF (NEW.YES_TREE_UPDATE >0) THEN BEGIN /* Обработка дерева */ /* ------------------------- */ /* разделители (правая и левая квадратные скобки) */ EXECUTE PROCEDURE GET_DELIMITERLEFT_001 RETURNING_VALUES :DELIM_LEFT; EXECUTE PROCEDURE GET_DELIMITERRIGHT_001 RETURNING_VALUES :DELIM_RIGHT; /* ------------------------- */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.YES_TREE_UPDATE <> 99) THEN BEGIN /* <> 99 - Контроль глобальности */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; END /* ------------------------------------------------- */ /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE CONTROL_USER_EXIST (NEW.IDUSER_UPDATE); /* ------------------------------------------------- */ /* ------------------------- */ /* Контроль ссылочности */ NEW.ITS_BASE = 1; /* Признак: что это базовый объект */ NEW.ID_REF = ''; /* ссылка на базовый объект */ IF (NEW.ID_REF_NEAR IS NULL) THEN NEW.ID_REF_NEAR = ''; /* ссылка на ближайший объект */ IF (NEW.ID_REF_NEAR = '') THEN NEW.ID_REF_NEAR = NEW.ID_THIS; /* если ссылка разорвана - ссылаемся на себя */ IF (NEW.ID_REF_NEAR = NEW.ID_THIS) THEN BEGIN NEW.ID_REF = NEW.ID_REF_NEAR; /* ссылка на базовый объект */ END ELSE BEGIN NEW.ITS_BASE = 0; /* Признак: что это ссылочный объект */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_REF_NEAR) RETURNING_VALUES (:C); /* проверка существования объекта, на кот. ссылаемся */ IF (:C <= 0) THEN BEGIN /* Такой объект не существует - генерируем исключение */ EXCEPTION OBJECT_NOT_EXIST; END ELSE BEGIN /* ------------------------------------------ */ /* Берем у Объекта, на кот. ссылаемся нужную нам информацию */ SELECT ID_REF, ID_TYPE, MNEMO_CODE, NAME_MAX FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = NEW.ID_REF_NEAR INTO NEW.ID_REF, NEW.ID_TYPE, NEW.MNEMO_CODE, :NAMEMAX; /* ------------------------------------------ */ IF (NEW.ID_REF IS NULL) THEN NEW.ID_REF = ''; /* ссылка на базовый объект */ IF (:NAMEMAX IS NULL) THEN NAMEMAX = ''; NEW.NAME_MAX = :NAMEMAX; END END /* ------------------------- */ /* ------------------------- */ /* Control TypeObj exist */ /* Контроль, чтобы значение ID_TYPE было корректным */ EXECUTE PROCEDURE CONTROL_TYPEOBJ (NEW.ID_TYPE) RETURNING_VALUES (NEW.ID_TYPE); /* ------------------------- */ /* Уникальность Мнемо-кода - НЕ котнролируем */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF(NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; NEW.DATE_UPDATE = "NOW"; /* ------------------------------------------ */ /* Читаем ID родителя корневого объекта (родитель у корневого объекта не существует) */ IDTHIS_ISROOT = ''; EXECUTE PROCEDURE GET_IDPARENT_ISROOT RETURNING_VALUES (:IDTHIS_ISROOT); /* ------------------------------------------ */ IF (NEW.ID_PARENT = :IDTHIS_ISROOT) THEN BEGIN /* Это корневой объект */ NEW.LEVEL_THIS = 0; NEW.PARENTS_ID = :DELIM_LEFT || NEW.ID_PARENT || :DELIM_RIGHT; IF(NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF(NEW.MNEMO_CODE = '') THEN NEW.MNEMO_CODE = 'Root_Object'; /* ------------------------------------------ */ /* в этом случае ссылаемся сами на себя */ NEW.ID_REF_NEAR = NEW.ID_THIS; NEW.ID_REF = NEW.ID_REF_NEAR; NEW.ITS_BASE = 1; /* Признак: что это базовый объект */ /* ------------------------------------------ */ END ELSE BEGIN /* Это НЕ корневой объект */ /* Control Parent Exist */ /* Контроль, чтобы Родитель существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_PARENT) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION OBJECT_NOT_EXIST; /* ------------------------------------------ */ /* Берем у Родителя нужную нам информацию */ SELECT LEVEL_THIS, PARENTS_ID FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = NEW.ID_PARENT INTO NEW.LEVEL_THIS, NEW.PARENTS_ID; /* ------------------------------------------ */ IF (NEW.LEVEL_THIS IS NULL) THEN NEW.LEVEL_THIS = 0; NEW.LEVEL_THIS = NEW.LEVEL_THIS + 1; /* это НЕ для корневого объекта */ IF (NEW.PARENTS_ID IS NULL) THEN NEW.PARENTS_ID = ''; /* ------------------------------------------ */ /* перечисляем всех предков */ NEW.PARENTS_ID = NEW.PARENTS_ID || :DELIM_LEFT || NEW.ID_PARENT || :DELIM_RIGHT; /* ------------------------------------------ */ END /* ------------------------------------------ */ END NEW.YESUPDATE_CHILD = 0; NEW.YESUPDATE_REF = 0; IF (NEW.YESEDIT_THIS = 99) THEN BEGIN /* ПРИНУДИТЕЛЬНО ОБНОВИТЬ ВСЕ */ NEW.YESUPDATE_CHILD = 1; NEW.YESUPDATE_REF = 1; END ELSE BEGIN /* ------------------------------------------------------------------------------ */ /* изменилась иерархия, надо обновить дочерние для пересчета LEVEL_THIS, PARENTS_ID и прочего */ IF (NEW.ID_PARENT<>OLD.ID_PARENT) THEN NEW.YESUPDATE_CHILD = 1; IF (NEW.PARENTS_ID<>OLD.PARENTS_ID) THEN NEW.YESUPDATE_CHILD = 1; IF (NEW.LEVEL_THIS<>OLD.LEVEL_THIS) THEN NEW.YESUPDATE_CHILD = 1; /* ------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------ */ /* изменилась ссылочность, надо обновить ссылающиеся объекты для пересчета ID_TYPE, ID_REF и прочего */ IF (NEW.ID_REF_NEAR<>OLD.ID_REF_NEAR) THEN NEW.YESUPDATE_REF = 1; IF (NEW.ID_REF<>OLD.ID_REF) THEN NEW.YESUPDATE_REF = 1; /* ------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------ */ /* изменился важная инфа об объекте, надо обновить ссылающиеся объекты для пересчета ID_TYPE и прочего */ IF (NEW.ID_TYPE<>OLD.ID_TYPE) THEN NEW.YESUPDATE_REF = 1; IF (NEW.NAME_MAX<>OLD.NAME_MAX) THEN NEW.YESUPDATE_REF = 1; IF (NEW.MNEMO_CODE<>OLD.MNEMO_CODE) THEN NEW.YESUPDATE_REF = 1; /* ------------------------------------------------------------------------------ */ END NEW.YES_TREE_UPDATE = 1; NEW.YESEDIT_THIS = 0; END ^ CREATE TRIGGER BI_OBJECTSTREE FOR OBJECTS_TREE ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; DECLARE VARIABLE IDTHIS_ISROOT VARCHAR(40) CHARACTER SET WIN1251; DECLARE VARIABLE D1 DATE; DECLARE VARIABLE D2 DATE; DECLARE VARIABLE T1 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE T2 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE NAMEMAX VARCHAR(200) CHARACTER SET WIN1251; DECLARE VARIABLE DELIM_LEFT VARCHAR(1) CHARACTER SET WIN1251; DECLARE VARIABLE DELIM_RIGHT VARCHAR(1) CHARACTER SET WIN1251; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.ID_PACKET IS NULL) THEN NEW.ID_PACKET = ''; IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; /* Уникальность Мнемо-кода - НЕ котнролируем */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; /* ------------------------- */ /* разделители (правая и левая квадратные скобки) */ EXECUTE PROCEDURE GET_DELIMITERLEFT_001 RETURNING_VALUES :DELIM_LEFT; EXECUTE PROCEDURE GET_DELIMITERRIGHT_001 RETURNING_VALUES :DELIM_RIGHT; /* ------------------------- */ /* ------------------------- */ /* Контроль ссылочности */ NEW.ITS_BASE = 1; /* Признак: что это базовый объект */ NEW.ID_REF = ''; /* ссылка на базовый объект */ IF (NEW.ID_REF_NEAR IS NULL) THEN NEW.ID_REF_NEAR = ''; /* ссылка на ближайший объект пустая */ IF (NEW.ID_REF_NEAR = '') THEN NEW.ID_REF_NEAR = NEW.ID_THIS; /* ссылка на ближайший объект не существует, значит это Базовый объект */ IF (NEW.ID_REF_NEAR <> NEW.ID_THIS) THEN BEGIN /* Ссылочный объект */ NEW.ITS_BASE = 0; /* Признак: что это ссылочный объект */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_REF_NEAR) RETURNING_VALUES (:C); /* проверка существования объекта, на кот. ссылаемся */ IF (:C <= 0) THEN BEGIN /* Такой объект не существует - генерируем исключение */ EXCEPTION OBJECT_NOT_EXIST; END ELSE BEGIN /* ------------------------------------------ */ /* Наследуем у Объекта, на кот. ссылаемся нужную нам информацию */ SELECT ID_REF, ID_TYPE, MNEMO_CODE, NAME_MAX FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = NEW.ID_REF_NEAR INTO NEW.ID_REF, NEW.ID_TYPE, NEW.MNEMO_CODE, :NAMEMAX; /* ------------------------------------------ */ IF (NEW.ID_REF IS NULL) THEN NEW.ID_REF = ''; /* ссылка на базовый объект */ IF (NEW.ID_REF = '') THEN NEW.ID_REF = NEW.ID_REF_NEAR; IF (:NAMEMAX IS NULL) THEN NAMEMAX = ''; NEW.NAME_MAX = :NAMEMAX; END END ELSE BEGIN NEW.ID_REF = NEW.ID_REF_NEAR; END /* ------------------------- */ /* ===================================== */ /* ------------------------- */ /* Control TypeObj exist */ /* Контроль, чтобы значение ID_TYPE было корректным */ EXECUTE PROCEDURE CONTROL_TYPEOBJ (NEW.ID_TYPE) RETURNING_VALUES (NEW.ID_TYPE); /* ------------------------- */ IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF(NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_PARENT = NEW.ID_PARENT INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ NEW.LEVEL_THIS = 0; NEW.YESUPDATE_CHILD = 0; NEW.YESUPDATE_REF = 0; NEW.YESEDIT_THIS = 0; IF (NEW.ID_PARENT IS NULL) THEN NEW.ID_PARENT = ''; IF (NEW.ID_PARENT = '') THEN BEGIN /* если Родитель не задан - значит это КОРНЕВОЙ объект */ /* назначаем ID */ EXECUTE PROCEDURE GET_IDTHIS_ISROOT RETURNING_VALUES (:IDTHIS_ISROOT); NEW.ID_THIS = :IDTHIS_ISROOT; IDTHIS_ISROOT = ''; EXECUTE PROCEDURE GET_IDPARENT_ISROOT RETURNING_VALUES (:IDTHIS_ISROOT); NEW.ID_PARENT = :IDTHIS_ISROOT; NEW.LEVEL_THIS = 0; IF(NEW.NAME_MAX = '') THEN NEW.NAME_MAX = 'Корневой объект'; IF(NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF(NEW.MNEMO_CODE = '') THEN NEW.MNEMO_CODE = 'Root_Object'; /* ------------------------------------------ */ /* Включаем в перечень НЕ существующего предка */ NEW.PARENTS_ID = :DELIM_LEFT || NEW.ID_PARENT || :DELIM_RIGHT; /* ------------------------------------------ */ /* ------------------------------------------ */ /* в этом случае ссылаемся сами на себя */ NEW.ID_REF_NEAR = NEW.ID_THIS; NEW.ID_REF = NEW.ID_REF_NEAR; NEW.ITS_BASE = 1; /* Признак: что это базовый объект */ /* ------------------------------------------ */ END ELSE BEGIN /* Это не корневой объект */ /* Control Parent Exist */ /* Контроль, чтобы Родитель существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_PARENT) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION OBJECT_NOT_EXIST; /* ------------------------------------------ */ /* Берем у Родителя нужную нам информацию */ SELECT LEVEL_THIS, DATE_1, TIME_1, DATE_2, TIME_2, PARENTS_ID FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = NEW.ID_PARENT INTO NEW.LEVEL_THIS, :D1, :T1, :D2, :T2, NEW.PARENTS_ID; /* ------------------------------------------ */ /* ------------------------------------------ */ /* вычисляем наш уровень иерархии в дереве */ IF (NEW.LEVEL_THIS IS NULL) THEN NEW.LEVEL_THIS = 0; NEW.LEVEL_THIS = NEW.LEVEL_THIS + 1; /* ------------------------------------------ */ /* ------------------------------------------ */ /* перечисляем всех предков */ NEW.PARENTS_ID = NEW.PARENTS_ID || :DELIM_LEFT || NEW.ID_PARENT || :DELIM_RIGHT; /* ------------------------------------------ */ IF (:T1 IS NULL) THEN T1 = ''; IF (:T2 IS NULL) THEN T2 = ''; IF (NEW.DATE_1 IS NULL) THEN BEGIN /* Значение нач.даты не указано - берем у Предка */ NEW.DATE_1 = :D1; NEW.TIME_1 = :T1; END IF (NEW.DATE_2 IS NULL) THEN BEGIN /* Значение кон.даты не указано - берем у Предка */ NEW.DATE_2 = :D2; NEW.TIME_2 = :T2; END IF (NEW.TIME_1 IS NULL) THEN NEW.TIME_1 = :T1; IF (NEW.TIME_2 IS NULL) THEN NEW.TIME_2 = :T2; EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ EXECUTE PROCEDURE GET_ID_OBJECT RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END END ^ CREATE TRIGGER AU_LPROPTEXTTOP FOR L_PROPTEXT_TOP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (44, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AD_LPROPTEXTTOP FOR L_PROPTEXT_TOP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (44, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BI_LPROPTEXTMACRO FOR L_PROPTEXT_MACRO ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPTEXT_MACRO WHERE UPPER(L_PROPTEXT_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPTEXT_MACRO WHERE L_PROPTEXT_MACRO.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from TOP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPTEXT_TOP WHERE L_PROPTEXT_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPTEXT_MACRO,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BU_LPROPTEXTMACRO FOR L_PROPTEXT_MACRO ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPTEXT_TOP WHERE L_PROPTEXT_TOP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; */ IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* *************************************** */ /* Временная мера - потом удалить !!! */ IF (NEW.IDUSER_CREATE = '') THEN NEW.IDUSER_CREATE = NEW.IDUSER_UPDATE; /* *************************************** */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPTEXT_MACRO WHERE UPPER(L_PROPTEXT_MACRO.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LPROPTEXTMACRO FOR L_PROPTEXT_MACRO ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPTEXT_GRP WHERE L_PROPTEXT_GRP.ID_GRP = OLD.ID_THIS AND L_PROPTEXT_GRP.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPTEXT_GRP WHERE L_PROPTEXT_GRP.ID_GRP = OLD.ID_THIS AND L_PROPTEXT_GRP.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPTEXT_GRP WHERE L_PROPTEXT_GRP.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AI_LPROPTEXTMACRO FOR L_PROPTEXT_MACRO ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (45, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AD_LPROPTEXTMACRO FOR L_PROPTEXT_MACRO ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (45, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER AU_LPROPTEXTMACRO FOR L_PROPTEXT_MACRO ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (45, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER BI_LPROPTEXTGRP FOR L_PROPTEXT_GRP ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPTEXT_GRP WHERE UPPER(L_PROPTEXT_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPTEXT_GRP WHERE L_PROPTEXT_GRP.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from MACRO (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPTEXT_MACRO WHERE L_PROPTEXT_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPTEXT_GRP,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BU_LPROPTEXTGRP FOR L_PROPTEXT_GRP ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPTEXT_MACRO WHERE L_PROPTEXT_MACRO.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END /* *************************************** */ /* Временная мера - потом удалить !!! */ IF (NEW.IDUSER_CREATE = '') THEN NEW.IDUSER_CREATE = NEW.IDUSER_UPDATE; /* *************************************** */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников (по мнемокоду) */ SELECT ID_THIS FROM L_PROPTEXT_GRP WHERE UPPER(L_PROPTEXT_GRP.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LPROPTEXTGRP FOR L_PROPTEXT_GRP ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если внутри группы есть глобальности */ SELECT COUNT ( * ) FROM L_PROPTEXT_LIST WHERE L_PROPTEXT_LIST.ID_GRP = OLD.ID_THIS AND L_PROPTEXT_LIST.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM items exists */ /* нельзя удалять, если внутри группы есть системности */ SELECT COUNT ( * ) FROM L_PROPTEXT_LIST WHERE L_PROPTEXT_LIST.ID_GRP = OLD.ID_THIS AND L_PROPTEXT_LIST.ID_SYSTEM > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* delete now, if OK */ /* теперь, если все OK, удаление всех единиц из группы */ DELETE FROM L_PROPTEXT_LIST WHERE L_PROPTEXT_LIST.ID_GRP = OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AI_LPROPTEXTGRP FOR L_PROPTEXT_GRP ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (46, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AU_LPROPTEXTGRP FOR L_PROPTEXT_GRP ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (46, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AD_LPROPTEXTGRP FOR L_PROPTEXT_GRP ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (46, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BI_LPROPTEXTLIST FOR L_PROPTEXT_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников в группе (по мнемокоду) */ SELECT COUNT ( * ) FROM L_PROPTEXT_LIST WHERE (UPPER(L_PROPTEXT_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) AND (L_PROPTEXT_LIST.ID_GRP=NEW.ID_GRP) INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION MNEMOCODE_EXIST; END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM L_PROPTEXT_LIST WHERE L_PROPTEXT_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ------------------------------------------------- */ /* read from GRP (ID_SYSTEM) */ /* При вводе новой строки Системность наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPTEXT_GRP WHERE L_PROPTEXT_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; /* ------------------------------------------------- */ EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :C; /* Проверяем, задан ли ID в ПО */ IF (:C>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ C = GEN_ID(GEN_L_PROPTEXT_LIST,1); EXECUTE PROCEDURE GET_IDTHIS_WITH_NODE_DB (:C) RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BU_LPROPTEXTLIST FOR L_PROPTEXT_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPTEXT_GRP WHERE L_PROPTEXT_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:C); IF (:C<=0) THEN EXCEPTION USER_NOT_EXIST; END IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников в группе (по мнемокоду) */ SELECT ID_THIS FROM L_PROPTEXT_LIST WHERE (UPPER(L_PROPTEXT_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) AND (L_PROPTEXT_LIST.ID_GRP=NEW.ID_GRP) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_LPROPTEXTLIST FOR L_PROPTEXT_LIST ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if SYSTEM */ /* нельзя удалять системность */ IF (OLD.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if items exists */ /* нельзя удалять, если есть ссылки на эту строку таблицы */ /* Текстовые свойства объектов */ /* SELECT */ /* COUNT ( * ) */ /* FROM */ /* OBJECTS_PROP_TEXT */ /* WHERE */ /* OBJECTS_PROP_TEXT.ID_PROP = OLD.ID_THIS */ /* INTO */ /* :C; */ /* IF (:C IS NULL) THEN C = 0; */ /* IF (:C>0) THEN EXCEPTION REF_EXISTS_NOT_DELETE; */ /* ------------------------------------------------------ */ END ^ CREATE TRIGGER AI_LPROPTEXTLIST FOR L_PROPTEXT_LIST ACTIVE AFTER INSERT POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (47, NEW.ID_THIS, "INS"); END ^ CREATE TRIGGER AU_LPROPTEXTLIST FOR L_PROPTEXT_LIST ACTIVE AFTER UPDATE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (47, NEW.ID_THIS, "UPD"); END ^ CREATE TRIGGER AD_LPROPTEXTLIST FOR L_PROPTEXT_LIST ACTIVE AFTER DELETE POSITION 5 AS BEGIN EXECUTE PROCEDURE INSERT_SYSEVENTSINTABLES (47, OLD.ID_THIS, "DEL"); END ^ CREATE TRIGGER BI_OBJPROPNUM FOR OBJECTS_PROP_NUMBER ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE YES INTEGER; DECLARE VARIABLE D1 DATE; DECLARE VARIABLE D2 DATE; DECLARE VARIABLE T1 VARCHAR(8) CHARACTER SET WIN1251; DECLARE VARIABLE T2 VARCHAR(8) CHARACTER SET WIN1251; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Control Object Exist */ /* Контроль, чтобы Объект существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_OWNER) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION OBJECT_NOT_EXIST; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ------------------------- */ /* Control PropEnumVal exist */ /* Контроль, чтобы значение ID_PROP_ было корректным */ EXECUTE PROCEDURE CONTROL_LNUMBER (NEW.ID_PROP) RETURNING_VALUES (NEW.ID_PROP); /* ------------------------- */ /* ------------------------- */ /* Читаем Ед.Изм и точность для данного свойства из справочн. */ EXECUTE PROCEDURE GET_UNITMEASURE_FOR_PROPNUMBER (NEW.ID_PROP) RETURNING_VALUES (NEW.ID_UNITMEASURE, NEW.PRECIS); /* ------------------------- */ /* ------------------------- */ /* Unit Measure */ /* Единица измерений */ EXECUTE PROCEDURE CONTROL_UNITMEASURE (NEW.ID_UNITMEASURE) RETURNING_VALUES (NEW.ID_UNITMEASURE); /* ------------------------- */ IF (NEW.ID_PACKET IS NULL) THEN NEW.ID_PACKET = ''; /* ===================================== */ /* ------------------------- */ /* Precision */ /* Точность (кол-во знаков после запятой) */ IF (NEW.PRECIS IS NULL) THEN NEW.PRECIS = 0; IF (NEW.PRECIS < 0) THEN NEW.PRECIS = 0; /* ------------------------- */ /* Значение численного свойства */ IF (NEW.PROP_VAL IS NULL) THEN NEW.PROP_VAL = 0; IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; YES = 0; IF (NEW.DATE_1 IS NULL) THEN YES = 1; IF (NEW.DATE_2 IS NULL) THEN YES = 2; IF (NEW.TIME_1 IS NULL) THEN YES = 3; IF (NEW.TIME_2 IS NULL) THEN YES = 4; IF (:YES>0) THEN BEGIN /* ------------------------------------------ */ /* Наследуем у Владельца нужную нам информацию */ SELECT DATE_1, TIME_1, DATE_2, TIME_2 FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS = NEW.ID_OWNER INTO :D1, :T1, :D2, :T2; /* ------------------------------------------ */ IF (:T1 IS NULL) THEN T1 = ''; IF (:T2 IS NULL) THEN T2 = ''; IF (NEW.DATE_1 IS NULL) THEN BEGIN /* Значение нач.даты не указано - берем у Владельца */ NEW.DATE_1 = :D1; NEW.TIME_1 = :T1; END IF (NEW.DATE_2 IS NULL) THEN BEGIN /* Значение кон.даты не указано - берем у Владельца */ NEW.DATE_2 = :D2; NEW.TIME_2 = :T2; END /* ------------------------------------------ */ /* берем у Владельца, если Даты были заданы в ПО, а Время нет */ IF (NEW.TIME_1 IS NULL) THEN NEW.TIME_1 = :T1; IF (NEW.TIME_2 IS NULL) THEN NEW.TIME_2 = :T2; /* ------------------------------------------ */ END EXECUTE PROCEDURE THIS_ID_IS_EMPTY(NEW.ID_THIS) RETURNING_VALUES :YES; /* Проверяем, задан ли ID в ПО */ IF (:YES>0) THEN BEGIN /* ID не задан - вычисляем */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи (с учетом ID-узла и id-DB) */ EXECUTE PROCEDURE GET_ID_OBJPROPNUMBER RETURNING_VALUES (NEW.ID_THIS); /* ===================================== */ END END ^ CREATE TRIGGER BU_OBJPROPNUM FOR OBJECTS_PROP_NUMBER ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ID_OWNER = OLD.ID_OWNER; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ------------------------- */ /* Control PropNumber exist */ /* Контроль, чтобы значение ID_PROP_ было корректным */ EXECUTE PROCEDURE CONTROL_LNUMBER (NEW.ID_PROP) RETURNING_VALUES (NEW.ID_PROP); /* ------------------------- */ /* ------------------------- */ /* Читаем Ед.Изм и точность для данного свойства из справочн. */ EXECUTE PROCEDURE GET_UNITMEASURE_FOR_PROPNUMBER (NEW.ID_PROP) RETURNING_VALUES (NEW.ID_UNITMEASURE, NEW.PRECIS); /* ------------------------- */ /* ------------------------- */ /* Unit Measure */ /* Единица измерений */ EXECUTE PROCEDURE CONTROL_UNITMEASURE (NEW.ID_UNITMEASURE) RETURNING_VALUES (NEW.ID_UNITMEASURE); /* ------------------------- */ /* ===================================== */ /* ------------------------- */ /* Precision */ /* Точность (кол-во знаков после запятой) */ IF (NEW.PRECIS IS NULL) THEN NEW.PRECIS = 0; IF (NEW.PRECIS < 0) THEN NEW.PRECIS = 0; /* ------------------------- */ /* Значение численного свойства */ IF (NEW.PROP_VAL IS NULL) THEN NEW.PROP_VAL = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_LPROPENUMVAL FOR L_PROPENUM_VAL ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_PROPENUM_LIST WHERE L_PROPENUM_LIST.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* ------------------------------------------------- */ /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE CONTROL_USER_EXIST (NEW.IDUSER_UPDATE); /* ------------------------------------------------- */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double in GRP */ /* Контроль двойников в группе (по мнемокоду) */ SELECT ID_THIS FROM L_PROPENUM_VAL WHERE (UPPER(L_PROPENUM_VAL.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) AND (L_PROPENUM_VAL.ID_GRP=NEW.ID_GRP) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_LTYPEOBJLIST FOR L_TYPEOBJ_LIST ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE S40 VARCHAR(40); DECLARE VARIABLE C INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.ID_SYSTEM IS NULL) THEN BEGIN /* ------------------------------------------------- */ /* read from TOP, if NULL or 0 */ /* если Системность не указана - читаем наследуем от "предка" */ SELECT ID_SYSTEM FROM L_TYPEOBJ_GRP WHERE L_TYPEOBJ_GRP.ID_THIS = NEW.ID_GRP INTO NEW.ID_SYSTEM; /* ------------------------------------------------- */ END IF (NEW.ID_SYSTEM IS NULL) THEN NEW.ID_SYSTEM = 0; IF (NEW.ID_SYSTEM < 0) THEN NEW.ID_SYSTEM = 0; IF (OLD.ID_SYSTEM>0) THEN BEGIN /* Cannot edit if SYSTEM */ /* нельзя редактировать системность */ IF (NEW.ID_SYSTEM>0) THEN EXCEPTION ITS_SYS_NOT_EDIT; END /* ------------------------------------------------- */ /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE CONTROL_USER_EXIST (NEW.IDUSER_UPDATE); /* ------------------------------------------------- */ IF (NEW.MNEMO_CODE IS NULL) THEN NEW.MNEMO_CODE = ''; IF (NEW.MNEMO_CODE <> '') THEN BEGIN /* Control if double */ /* Контроль двойников во всем списке (по мнемокоду) */ SELECT ID_THIS FROM L_TYPEOBJ_LIST WHERE (UPPER(L_TYPEOBJ_LIST.MNEMO_CODE) = UPPER(NEW.MNEMO_CODE)) INTO :S40; IF (:S40 IS NULL) THEN S40 = ''; IF (:S40 <> '') THEN BEGIN IF (:S40<>NEW.ID_THIS) THEN EXCEPTION MNEMOCODE_EXIST; END END /* ===================================== */ IF (NEW.NAME_MAX IS NULL) THEN NEW.NAME_MAX = ''; IF (NEW.NAME_MIN IS NULL) THEN NEW.NAME_MIN = ''; IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; IF (NEW.ITS_ABSTRACT IS NULL) THEN NEW.ITS_ABSTRACT = 0; IF (NEW.ID_KIND IS NULL) THEN EXECUTE PROCEDURE GET_IDKIND_IS_OBJECT RETURNING_VALUES NEW.ID_KIND; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_OBJCHOKE FOR OBJECTS_CHOKE ACTIVE BEFORE DELETE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* Загрушка для обеспечения ссылочной целостности с другими таблицами (сторонними) */ YES = 0; /* ========================================= */ /* Сторонняя таблица: Результаты запусков космических аппаратов */ DELETE FROM SPACE_APPARAT_START WHERE SPACE_APPARAT_START.ID_OWNER = OLD.ID_THIS; /* ========================================= */ END ^ CREATE TRIGGER BI_OTHERTABLESLIST FOR OTHER_TABLES_LIST ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE C INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.TABLE_NAME IS NULL) THEN NEW.TABLE_NAME = ''; IF (NEW.TABLE_NAME = '') THEN NEW.TABLE_NAME = '???'; /* ===================================== */ IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; /* ===================================== */ /* Calc NUMPP for new-record */ /* Вычислить значение поля NUMPP по умолчанию (порядок сортировки) */ IF (NEW.NUMPP = 0) THEN BEGIN SELECT MAX(NUMPP) FROM OTHER_TABLES_LIST WHERE OTHER_TABLES_LIST.ID_GRP = NEW.ID_GRP INTO :C; IF (:C IS NULL) THEN C = 0; NEW.NUMPP = :C+1; END /* ===================================== */ /* ===================================== */ /* Calc ID_THIS for new-record */ /* Вычислить значение поля ID_THIS для новой записи) */ NEW.ID_THIS = GEN_ID(GEN_OTHERTABLES,1); /* ===================================== */ END ^ CREATE TRIGGER BU_OTHERTABLESLIST FOR OTHER_TABLES_LIST ACTIVE BEFORE UPDATE POSITION 5 AS BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.TABLE_NAME IS NULL) THEN NEW.TABLE_NAME = ''; IF (NEW.TABLE_NAME = '') THEN NEW.TABLE_NAME = OLD.TABLE_NAME; /* ===================================== */ IF (NEW.NOTE IS NULL) THEN NEW.NOTE = ''; IF (NEW.NUMPP IS NULL) THEN NEW.NUMPP = 0; IF (NEW.NUMPP < 0) THEN NEW.NUMPP = 0; END ^ CREATE TRIGGER BU_OBJPROPENUM FOR OBJECTS_PROP_ENUM ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.ID_OWNER = OLD.ID_OWNER; NEW.ITS_GLOBAL = OLD.ITS_GLOBAL; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ IF (NEW.ITS_GLOBAL IS NULL) THEN NEW.ITS_GLOBAL = 0; /* Cannot edit if GLOBAL */ /* нельзя редактировать глобальность */ IF (NEW.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_EDIT; IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ------------------------- */ /* Control PropEnumVal exist */ /* Контроль, чтобы значение ID_PROP_VAL было корректным */ EXECUTE PROCEDURE CONTROL_LENUMVAL (NEW.ID_PROP_VAL) RETURNING_VALUES (NEW.ID_PROP_VAL); /* Вычисляем для данного ID значения - ID свойства */ EXECUTE PROCEDURE GET_IDPROP_FOR_IDVAL_ENUM (NEW.ID_PROP_VAL) RETURNING_VALUES (NEW.ID_PROP); /* ------------------------- */ /* ===================================== */ NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BI_OBJATTR FOR OBJECTS_TREE_ATTR ACTIVE BEFORE INSERT POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ /* Control Object Exist */ /* Контроль, чтобы Объект существовал в базе данных */ EXECUTE PROCEDURE OBJECT_EXIST (NEW.ID_THIS) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION OBJECT_NOT_EXIST; IF (NEW.IDUSER_CREATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_CREATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_CREATE FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_CREATE; /* --------------------------------------- */ END /* ===================================== */ /* ------------------------- */ /* research (exploration)conditions */ /* Условия исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_CONDITION) RETURNING_VALUES (NEW.ID_CONDITION); /* ------------------------- */ /* ------------------------- */ /* anomality in research (exploration) */ /* Аномальность при исследованиях (измерениях) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_ANOMAL) RETURNING_VALUES (NEW.ID_ANOMAL); /* ------------------------- */ /* ------------------------- */ /* research tasks */ /* Задачи исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_TASK) RETURNING_VALUES (NEW.ID_TASK); /* ------------------------- */ /* ------------------------- */ /* integrated explorations forms */ /* Виды комплексных исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_COMPLEX) RETURNING_VALUES (NEW.ID_COMPLEX); /* ------------------------- */ /* ------------------------- */ /* research (exploration) method */ /* Метод исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_METHOD) RETURNING_VALUES (NEW.ID_METHOD); /* ------------------------- */ /* ------------------------- */ /* instruments and systems exploration */ /* Приборы и системы измерений (вычислений */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_DEVICE) RETURNING_VALUES (NEW.ID_DEVICE); /* ------------------------- */ /* ------------------------- */ /* information resource */ /* Источник информации */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_AUTHOR) RETURNING_VALUES (NEW.ID_AUTHOR); /* ------------------------- */ IF (NEW.RELIABILITY_THIS IS NULL) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.RELIABILITY_THIS < 0) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS > 1) THEN NEW.RELIABILITY_THIS = 1; IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; NEW.DATE_CREATE = "NOW"; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BU_OBJATTR FOR OBJECTS_TREE_ATTR ACTIVE BEFORE UPDATE POSITION 5 AS DECLARE VARIABLE YES INTEGER; BEGIN /* =================================== */ /* not change THIS */ /* нельзя изменять значения этих полей */ NEW.ID_THIS = OLD.ID_THIS; NEW.DATE_CREATE = OLD.DATE_CREATE; NEW.IDUSER_CREATE = OLD.IDUSER_CREATE; /* =================================== */ /* ===================================== */ /* Control info for Error */ /* Контроль важной информации на предмет ошибок */ YES = 0; IF (NEW.IDUSER_UPDATE IS NULL) THEN YES = 1; IF (NEW.IDUSER_UPDATE = '') THEN YES=1; IF (:YES>0) THEN BEGIN IF (OLD.IDUSER_UPDATE <> '') THEN BEGIN NEW.IDUSER_UPDATE = OLD.IDUSER_UPDATE; END ELSE BEGIN /* --------------------------------------- */ /* Наследуем */ SELECT IDUSER_UPDATE FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_THIS=NEW.ID_THIS INTO NEW.IDUSER_UPDATE; /* --------------------------------------- */ END IF (NEW.IDUSER_UPDATE IS NULL) THEN NEW.IDUSER_UPDATE = ''; IF (NEW.IDUSER_UPDATE = '') THEN NEW.IDUSER_UPDATE = OLD.IDUSER_CREATE; END IF (NEW.IDUSER_UPDATE IS NOT NULL) THEN BEGIN /* Control User Exist */ /* Контроль, чтобы Пользователь существовал в базе данных */ EXECUTE PROCEDURE USER_EXIST (NEW.IDUSER_UPDATE) RETURNING_VALUES (:YES); IF (:YES<=0) THEN EXCEPTION USER_NOT_EXIST; END /* ===================================== */ /* ------------------------- */ /* research (exploration)conditions */ /* Условия исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_CONDITION) RETURNING_VALUES (NEW.ID_CONDITION); /* ------------------------- */ /* ------------------------- */ /* anomality in research (exploration) */ /* Аномальность при исследованиях (измерениях) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_ANOMAL) RETURNING_VALUES (NEW.ID_ANOMAL); /* ------------------------- */ /* ------------------------- */ /* research tasks */ /* Задачи исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_TASK) RETURNING_VALUES (NEW.ID_TASK); /* ------------------------- */ /* ------------------------- */ /* integrated explorations forms */ /* Виды комплексных исследований */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_COMPLEX) RETURNING_VALUES (NEW.ID_COMPLEX); /* ------------------------- */ /* ------------------------- */ /* research (exploration) method */ /* Метод исследований (измерений) */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_METHOD) RETURNING_VALUES (NEW.ID_METHOD); /* ------------------------- */ /* ------------------------- */ /* instruments and systems exploration */ /* Приборы и системы измерений (вычислений */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_DEVICE) RETURNING_VALUES (NEW.ID_DEVICE); /* ------------------------- */ /* ------------------------- */ /* information resource */ /* Источник информации */ EXECUTE PROCEDURE CONTROL_PROP_ENUM_VAL_YES_NULL (NEW.ID_AUTHOR) RETURNING_VALUES (NEW.ID_AUTHOR); /* ------------------------- */ IF (NEW.RELIABILITY_THIS IS NULL) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS < 0) THEN NEW.RELIABILITY_THIS = 0; IF (NEW.RELIABILITY_THIS > 1) THEN NEW.RELIABILITY_THIS = 1; NEW.DATE_UPDATE = "NOW"; END ^ CREATE TRIGGER BD_OBJECTSTREE FOR OBJECTS_TREE ACTIVE BEFORE DELETE POSITION 10 AS DECLARE VARIABLE C INTEGER; BEGIN /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL */ /* нельзя удалять глобальность */ IF (OLD.ITS_GLOBAL>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если среди дочерних есть глобальности */ SELECT COUNT ( * ) FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_PARENT=OLD.ID_THIS AND OBJECTS_TREE.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Cannot delete if GLOBAL items exists */ /* нельзя удалять, если среди ссылочных есть глобальности */ SELECT COUNT ( * ) FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_REF_NEAR=OLD.ID_THIS AND OBJECTS_TREE.ID_THIS<>OLD.ID_THIS AND OBJECTS_TREE.ID_REF_NEAR<>OBJECTS_TREE.ID_THIS AND OBJECTS_TREE.ITS_GLOBAL > 0 INTO :C; IF (:C IS NULL) THEN C = 0; IF (:C>0) THEN EXCEPTION ITS_GLOBAL_NOT_DEL; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Enum Props */ /* Удаляем перечислимые св-ва объекта */ DELETE FROM OBJECTS_PROP_ENUM WHERE OBJECTS_PROP_ENUM.ID_OWNER=OLD.ID_THIS; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Number Props */ /* Удаляем численные св-ва объекта */ DELETE FROM OBJECTS_PROP_NUMBER WHERE OBJECTS_PROP_NUMBER.ID_OWNER=OLD.ID_THIS; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Text Props */ /* Удаляем текстовые св-ва объекта */ DELETE FROM OBJECTS_PROP_TEXT WHERE OBJECTS_PROP_TEXT.ID_OWNER=OLD.ID_THIS; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Referense */ /* Удаляем ссылочные объекты */ DELETE FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_REF_NEAR=OLD.ID_THIS AND OBJECTS_TREE.ID_THIS<>OLD.ID_THIS AND OBJECTS_TREE.ID_REF_NEAR<>OBJECTS_TREE.ID_THIS; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Childs */ /* Удаляем дочерние объекты */ DELETE FROM OBJECTS_TREE WHERE OBJECTS_TREE.ID_PARENT=OLD.ID_THIS; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Attr */ /* Удаляем Атрибуты объекта */ DELETE FROM OBJECTS_TREE_ATTR WHERE OBJECTS_TREE_ATTR.ID_THIS=OLD.ID_THIS; /* ------------------------------------------------------ */ /* ------------------------------------------------------ */ /* Delete Choke */ /* Удаляем "Заглушки" */ DELETE FROM OBJECTS_CHOKE WHERE OBJECTS_CHOKE.ID_THIS=OLD.ID_THIS; /* ------------------------------------------------------ */ END ^ COMMIT WORK ^ SET TERM ; ^ /* Grant permissions for this database */