Copyright © OBCOM INGENIERIA S.A. (Chile)
Un registro (Record o Message) es una estructura de datos que representa una secuencia de cero o más bytes de data. Los registros son utilizados por programas (o controles) Clientes para enviar transacciones y/o recibir mensajes dinámicos desde programas Servidores. Estos programas Clientes y Servidores se comunican por medio de un servidor EcuLink®, y existen bibliotecas de rutinas nativas (API) disponibles para construir estos programas Clientes y Servidores en COBOL, ANSI-C, Visual Basic 6, .NET y Java.
Un registro puede tener asociado un formato (Layout), el cual define un conjunto de campos. Cada campo (Field) tiene un nombre, un tipo, y representa una secuencia contigua de bytes de la data del registro. Cuando se solicita el valor de un campo, su secuencia de bytes es interpretada de acuerdo a su tipo, y su valor es retornado. Inversamente, cuando se modifica el valor de un campo, su secuencia de bytes es modificada para representar el nuevo valor. Los campos permiten manipular los bytes de la data de un registro en forma simple, sin necesidad que el programador conozca los detalles de su representación, tamaño o posición. Esto es especialmente importante en la comunicación con programas COBOL, los cuales manipulan la data de los registros a través de variables de la WORKING STORAGE.
OBCOM Record Wizard permite definir formatos de registros (Layouts). Cada formato tiene un nombre único, una descripción, y pertenece a una biblioteca. Las bibliotecas representan una agrupación lógica de uno o más registros, y también poseen un nombre único y una descripción. Adicionalmente, las bibliotecas pueden tener un propietario, el cual es el único usuario que puede modificar la definición de la biblioteca o de los registros (formatos) que esta contiene. OBCOM Record Wizard mantiene toda esta información en una base de datos en un servidor SQL (DB2, Oracle, MS-SQL o Sybase), a la cual se puede tener acceso simultáneo desde distintas estaciones de trabajo.
Nota: OBCOM Record Wizard almacena la información de formatos de registros en tres (3) tablas SQL. Las instrucciones necesarias para crear estas tablas en MS-SQL y Oracle se entregan en el Apéndice A y en el Apéndice B, respectivamente.
OBCOM Record Wizard también tiene la capacidad de generar los archivos necesarios para descargar los formatos de registros dinámicamente vía protocolo HTTP. En particular, genera los archivos ASP requeridos por programas Clientes y Servidores escritos en ANSI-C, Visual Basic 6, .NET y Java, y genera las bibliotecas necesarias para compilar programas escritos en COBOL. También genera archivos de texto con instrucciones SQL para cargar las definiciones de formatos en las bases de datos de los distintos ambientes de trabajo (desarrollo, prueba o producción).
OBCOM Record Wizard está implementado como un control ActiveX que se descarga y utiliza con el programa navegador Microsoft Internet Explorer. La siguiente figura muestra los distintos elementos de la interfaz gráfica de esta herramienta. Estos elementos, así como su forma de uso, son explicados más adelante en este documento.
OBCOM Record Wizard posee una barra de herramientas que le permite al usuario realizar las siguientes operaciones (de izquierda a derecha en la figura anterior):
El botón de conexión de la barra de herramientas de OBCOM Record Wizard muestra una ventana como la que se muestra en la siguiente figura. Esta ventana solicita la siguiente información: (1) tipo del servidor de base de datos, (2) nombre DNS o número IP del computador donde ejecuta el motor de base de datos (o SID en caso de Oracle), (3) nombre del usuario, (4) su contraseña, y (5) el nombre de la base de datos. Este último parámetro es opcional, y sólo se requiere cuando la base de datos predeterminada del usuario es distinta de la que contiene las tablas donde almacena la información OBCOM Record Wizard.
Importante: OBCOM Record Wizard se conecta al motor de base de datos utilizando la biblioteca ADO de Microsoft (MDAC), versión 2.5 ó superior. ADO establece la conexión haciendo uso de la biblioteca OLEDB específica al motor de base de datos seleccionado. La biblioteca OLEDB requerida debe estar instalada en el computador donde ejecuta OBCOM Record Wizard. Normalmente, la biblioteca OLEDB de Microsoft SQL Server se encuentra disponible en todos los computadores Windows. La biblioteca OLEDB del motor de bases datos DB2, Oracle o Sybase debe ser instalada manualmente. Estas bibliotecas pueden ser descargadas de los sitios Internet de las empresas IBM, Oracle y Sybase, respectivamente.
La figura siguiente muestra el árbol de navegación de OBCOM Record Wizard. Este árbol de navegación le permite al usuario seleccionar un elemento de la base de datos para poder visualizar su definición en el Panel de detalle (el panel de detalle no se muestra en esta figura, y será explicado en las próximas secciones).
Como se observa en la figura, el árbol de navegación representa una jerarquía de tres niveles. En el nivel superior se encuentra el nodo del árbol denominado “Bibliotecas”. Debajo de este nodo hay una lista de nodos marcados con la letra “L”, cada uno de los cuales representa una biblioteca de registros. A su vez, cada nodo de biblioteca posee una lista de nodos marcados con la letra “R” que representan los formatos (o registros) que la biblioteca posee.
Nodos no modificables del árbol
Como se explicó anteriormente, una biblioteca puede tener un propietario, el cual es el único usuario que puede modificar la información de la biblioteca o de los formatos que ésta posee. Aquellas bibliotecas o formatos que el usuario no puede modificar (es decir, que le pertenecen a otro usuario) son mostradas en el árbol de navegación con nodos marcados con un círculo rojo (por ejemplo, la biblioteca “GTWMIR” en la figura anterior).
Filtro de bibliotecas y formatos
El árbol de navegación posee, en su parte superior, un campo que le permite al usuario filtrar la lista de bibliotecas o formatos que se muestran en el árbol y el panel de detalle. Si este campo está vacío, se muestran todos los elementos que existen en la base de datos. Por el contrario, si el usuario digita un texto en el campo, sólo se muestran aquellos elementos (bibliotecas o formatos) cuyo nombre comience con el texto digitado. OBCOM Record Wizard recuerda los filtros utilizados de una sesión de trabajo a la otra.
Cuando se selecciona en el árbol de navegación el nodo denominado “Bibliotecas”, el Panel de detalle de OBCOM Record Wizard muestra la lista de bibliotecas definidas en la base de datos. Como se observa en la siguiente figura, esta lista entrega el nombre, descripción, propietario, e información de modificación de todas de las bibliotecas de la base de datos, o sólo de aquellas filtradas (ver explicación del filtro en el árbol de navegación).
La columna “Propietario” aparece vacía cuando una biblioteca no tiene un propietario, es decir, cuando la biblioteca puede ser modificada por cualquier usuario. Por otra parte, la columna “Modificación” indica la fecha y hora en que la biblioteca, o alguno de sus formatos, fue modificada. Esta columna indica, adicionalmente, el nombre del usuario que realizó la modificación, y el nombre del computador en que la hizo.
Columnas no editables
Las columnas que no pueden ser editadas en el panel de detalle se muestran con color de fondo amarillo. OBCOM Record Wizard actualiza la información de estas columnas no editables cuando el usuario realiza otras operaciones. Específicamente, la columna “Propietario” se modifica desde la barra de herramientas (detalles más adelante), y la columna “Modificación” se actualiza cada vez que el usuario modifica la biblioteca o alguno de sus formatos.
Cuando se selecciona en el árbol de navegación un nodo de biblioteca (tipo “L”), el Panel de detalle de OBCOM Record Wizard muestra la lista de formatos contenidos en la biblioteca seleccionada. Como se observa en la siguiente figura, esta lista entrega el nombre, tipo, descripción, e información de modificación de todos los formatos de la biblioteca, o sólo de aquellos filtrados (ver explicación del filtro en el árbol de navegación).
La columna “Dinámico” indica si el formato se utiliza en registros de envío de mensajes dinámicos. Estos registros requieren de algunos campos predefinidos que son agregados automáticamente por OBCOM Record Wizard a la definición del formato. Por otra parte, la columna “Modificación” indica la fecha y hora en que el formato fue modificado. Esta columna indica, adicionalmente, el nombre del usuario que realizó la modificación, y el nombre del computador en que la hizo.
Cuando se selecciona en el árbol de navegación un nodo de formato (tipo “R”), el Panel de detalle de OBCOM Record Wizard muestra la lista de campos del formato seleccionado. Como se observa en la siguiente figura, esta lista entrega el nombre, tipo, largo, escala, valor default, y descripción de todos los campos del formato (siempre se muestran todos los campos debido a que no existe filtro de campos).
La columna “Tipo” indica el tipo del campo, y los valores que puede tomar son:
OBCOM Record Wizard permite editar los tres paneles de detalle antes descritos: bibliotecas, biblioteca y formato, respectivamente. El usuario puede editar directamente las celdas escribiendo el texto deseado, o seleccionado una opción de menú, según corresponda. También puede agregar filas, borrarlas, o moverlas de lugar haciendo uso de los botones que se encuentra en la parte inferior del panel de detalle, los cuales se muestran en la siguiente figura.
OBCOM Record Wizard mantiene todos los cambios realizados en memoria, y sólo los actualiza en la base de datos cuando el usuario selecciona el botón “Guardar”. Si, por el contrario, el usuario selecciona el botón “Cancelar”, todos los cambios realizados son descartados, y el panel de detalle retorna a los valores originales. El botón “Insertar” agrega una fila en memoria, la cual puede ser posteriormente editada. Por su parte, el botón “Borrar” marca la fila seleccionada como borrada en memoria. Por último, los botones “Arriba” y “Abajo” cambian de posición la fila seleccionada en memoria, y están disponibles sólo en el panel de detalle de campos de un formato.
Como se explicó anteriormente, OBCOM Record Wizard tiene un botón en la barra de herramientas que permite generar los archivos ASP, LBR y SQL asociados a una o más bibliotecas de registros. Cuando el usuario selecciona este botón, aparece una ventana como la que se muestra en la figura siguiente. Esta ventana le permite seleccionar (o crear, si no existe) una carpeta donde OBCOM Record Wizard dejará los archivos ASP, LBR y SQL. También le permite seleccionar distintas opciones de generación.
OBCOM Record Wizard siempre genera todos los archivos asociados a una biblioteca. No es posible generar, por ejemplo, sólo una página ASP de un formato en particular. Para generar los archivos de más de una biblioteca en forma simultánea, el usuario debe seleccionar las filas de las bibliotecas en el panel de detalle de “Bibliotecas”, y luego presionar el botón de generación de la barra de herramientas.
El número de formatos (o registros) definidos en una base de datos puede llegar a ser muy grande. Cuando se conoce el nombre del formato, pero no el nombre de la biblioteca a la cual pertenece, se puede utilizar el botón de búsqueda de la barra de herramientas. Este botón muestra una ventana como la que se muestra en la figura siguiente. Esta ventana permite al usuario escribir el prefijo de un nombre, y luego listar todos aquellos formatos cuyos nombres comiencen con este prefijo. Si el usuario selecciona un formato en la lista, y luego presiona “Aceptar”, OBCOM Record Wizard cerrará la ventana de búsqueda, desplegará la definición del formato, y actualizará el árbol de navegación para mostrar la biblioteca a la que pertenece.
También es posible buscar formatos en la base de datos cuyos nombres se comporten de acuerdo a un patrón. Por ejemplo, si el usuario digita “REA-%-POS”, el OBCOM Record Wizard listará todos aquellos formatos cuyos nombres comiencen con los caracteres “REA-” y terminen con los caracteres “-POS”. El carácter especial “%” significa “cualquier secuencia de cero o más caracteres”. Para más detalles de este y otros caracteres especiales, referirse a la documentación del operador “LIKE” de Microsoft SQL Server.
OBCOM Record Wizard tiene un botón en la barra de herramientas que genera una vista preliminar de impresión, y otro botón que imprime la información del panel de detalle vigente. La siguiente figura muestra un ejemplo de una vista preliminar de un panel de detalle de formato (o registro). Como se observa, esta ventana pertenece a Microsoft Internet Explorer, y en ella se muestra un documento HTML con la información asociada a los campos del registro “ACC-LISUS” de la biblioteca “ACCSER”.
OBCOM Record Wizard posee una barra de estado que muestra la siguiente información (de izquierda a derecha en la figura anterior):
--------------------------------------------------------------------------------
-- Copyright (c) OBCOM INGENIERIA S.A. (Chile) All
rights reserved.
--
-- All rights to this product are owned by OBCOM
INGENIERIA S.A. and may only be
-- used under the terms of its
associated license document. You may NOT copy,
-- modify, sublicense, or distribute this source file
or portions of it unless
-- previously authorized in writing by OBCOM
INGENIERIA S.A. In any event, this
-- notice and above copyright must always be included
verbatim with this file.
--------------------------------------------------------------------------------
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id =
OBJECT_ID(N'[dbo].[EcuSdbField_FK]')
AND OBJECTPROPERTY(id,
N'IsForeignKey') = 1)
ALTER TABLE
[dbo].[EcuSdbField]
DROP
CONSTRAINT EcuSdbField_FK
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id =
OBJECT_ID(N'[dbo].[EcuSdbRecord_FK]')
AND OBJECTPROPERTY(id,
N'IsForeignKey') = 1)
ALTER TABLE
[dbo].[EcuSdbRecord]
DROP CONSTRAINT
EcuSdbRecord_FK
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id =
object_id(N'dbo.EcuSdbField_TR')
AND OBJECTPROPERTY(id,
N'IsTrigger') = 1)
DROP
TRIGGER dbo.EcuSdbField_TR
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id =
object_id(N'dbo.EcuSdbRecord_TR')
AND OBJECTPROPERTY(id,
N'IsTrigger') = 1)
DROP
TRIGGER dbo.EcuSdbRecord_TR
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id =
object_id(N'dbo.EcuSdbLibrary_TR')
AND OBJECTPROPERTY(id, N'IsTrigger')
= 1)
DROP
TRIGGER dbo.EcuSdbLibrary_TR
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = object_id(N'dbo.EcuSdbField')
AND OBJECTPROPERTY(id,
N'IsUserTable') = 1)
DROP TABLE
dbo.EcuSdbField
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id = object_id(N'dbo.EcuSdbRecord')
AND OBJECTPROPERTY(id,
N'IsUserTable') = 1)
DROP TABLE
dbo.EcuSdbRecord
GO
IF EXISTS (SELECT * FROM dbo.sysobjects
WHERE id =
object_id(N'dbo.EcuSdbLibrary')
AND OBJECTPROPERTY(id,
N'IsUserTable') = 1)
DROP TABLE
dbo.EcuSdbLibrary
GO
--------------------------------------------------------------------------------
-- Create the EcuSdbLibrary table ----------------------------------------------
--------------------------------------------------------------------------------
CREATE TABLE dbo.EcuSdbLibrary
(
ID
DECIMAL(12)
IDENTITY(1,1) NOT
NULL,
Name
VARCHAR(50) DEFAULT '
' NOT
NULL,
Description
VARCHAR(255) DEFAULT '
' NOT
NULL,
LockUser
VARCHAR(50) DEFAULT '
' NOT
NULL,
EditUser
VARCHAR(50) DEFAULT USER_NAME()
NOT NULL,
EditHost
VARCHAR(50) DEFAULT HOST_NAME()
NOT NULL,
EditTime
DATETIME DEFAULT
GETDATE() NOT NULL,
TS
DECIMAL(9) DEFAULT
0
NOT NULL,
CONSTRAINT EcuSdbLibrary_PK PRIMARY
KEY NONCLUSTERED (ID),
CONSTRAINT EcuSdbLibrary_UX UNIQUE
CLUSTERED (Name)
)
GO
CREATE TRIGGER EcuSdbLibrary_TR
ON EcuSdbLibrary
FOR UPDATE AS
BEGIN
UPDATE EcuSdbLibrary SET
EditTime =
GETDATE(),
TS = e.TS +
1
FROM EcuSdbLibrary e, INSERTED i
WHERE e.ID = i.ID
END
GO
--------------------------------------------------------------------------------
-- Create the EcuSdbRecord table
-----------------------------------------------
--------------------------------------------------------------------------------
CREATE TABLE dbo.EcuSdbRecord
(
ID
DECIMAL(12)
IDENTITY(1,1) NOT
NULL,
LibID
DECIMAL(12) DEFAULT
0
NOT NULL,
Name
VARCHAR(50) DEFAULT '
' NOT
NULL,
Dynamic
DECIMAL(1) DEFAULT
0
NOT NULL,
Description
VARCHAR(255) DEFAULT '
' NOT
NULL,
EditUser
VARCHAR(50) DEFAULT USER_NAME()
NOT NULL,
EditHost
VARCHAR(50) DEFAULT HOST_NAME()
NOT NULL,
EditTime
DATETIME DEFAULT
GETDATE() NOT NULL,
TS
DECIMAL(9) DEFAULT
0
NOT NULL,
CONSTRAINT EcuSdbRecord_PK PRIMARY KEY
NONCLUSTERED (ID),
CONSTRAINT EcuSdbRecord_UX UNIQUE
CLUSTERED (Name),
CONSTRAINT EcuSdbRecord_FK FOREIGN
KEY (LibID)
REFERENCES
dbo.EcuSdbLibrary (ID) ON DELETE CASCADE
)
GO
CREATE TRIGGER EcuSdbRecord_TR
ON EcuSdbRecord
FOR UPDATE AS
BEGIN
UPDATE EcuSdbRecord SET
EditTime =
GETDATE(),
TS = e.TS +
1
FROM EcuSdbRecord e, INSERTED i
WHERE e.ID = i.ID
END
GO
--------------------------------------------------------------------------------
-- Create the EcuSdbField table
------------------------------------------------
--------------------------------------------------------------------------------
CREATE TABLE dbo.EcuSdbField
(
ID
DECIMAL(12) IDENTITY(1,1)
NOT NULL,
RecID
DECIMAL(12) DEFAULT
0
NOT NULL,
Name
VARCHAR(50) DEFAULT '
' NOT
NULL,
DataType
DECIMAL(9) DEFAULT
0
NOT NULL,
Length
DECIMAL(9) DEFAULT 0
NOT NULL,
NumScale
DECIMAL(9) DEFAULT
0
NOT NULL,
DefValue
VARCHAR(255) DEFAULT '
' NOT
NULL,
Description
VARCHAR(255) DEFAULT '
' NOT
NULL,
SortID DECIMAL(9)
DEFAULT
0
NOT NULL,
TS
DECIMAL(9) DEFAULT
0
NOT NULL,
CONSTRAINT EcuSdbField_PK PRIMARY
KEY NONCLUSTERED (ID),
CONSTRAINT EcuSdbField_UX UNIQUE
CLUSTERED (RecID,Name,DataType),
CONSTRAINT EcuSdbField_FK FOREIGN
KEY (RecID)
REFERENCES
dbo.EcuSdbRecord (ID) ON DELETE CASCADE
)
GO
CREATE TRIGGER EcuSdbField_TR
ON EcuSdbField
FOR UPDATE AS
BEGIN
UPDATE EcuSdbField SET
TS = e.TS +
1
FROM EcuSdbField e, INSERTED i
WHERE e.ID = i.ID
END
GO
--------------------------------------------------------------------------------
-- Copyright (c) OBCOM INGENIERIA S.A. (Chile). All
rights reserved.
--
-- All rights to this product are owned by OBCOM
INGENIERIA S.A. and may only be
-- used under the terms of its
associated license document. You may NOT copy,
-- modify, sublicense, or distribute this source file
or portions of it unless
-- previously authorized in writing by OBCOM
INGENIERIA S.A. In any event, this
-- notice and above copyright must always be included
verbatim with this file.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Drop Tables, Constraints and Sequences
--------------------------------------
--------------------------------------------------------------------------------
DROP TABLE EcuSdbField
CASCADE CONSTRAINTS;
DROP TABLE EcuSdbRecord
CASCADE CONSTRAINTS;
DROP TABLE EcuSdbLibrary CASCADE
CONSTRAINTS;
DROP SEQUENCE EcuSdbField_SQ;
DROP SEQUENCE EcuSdbRecord_SQ;
DROP SEQUENCE EcuSdbLibrary_SQ;
--------------------------------------------------------------------------------
-- Create the EcuSdbLibrary table
----------------------------------------------
--------------------------------------------------------------------------------
CREATE TABLE EcuSdbLibrary
(
ID
NUMBER(12) DEFAULT
0 NOT NULL,
Name
VARCHAR2(50) DEFAULT '
' NOT NULL,
Description
VARCHAR2(255) DEFAULT '
' NOT NULL,
LockUser
VARCHAR2(50) DEFAULT '
' NOT NULL,
EditUser
VARCHAR2(50) DEFAULT
USER NOT NULL,
EditHost
VARCHAR2(50) DEFAULT SYS_CONTEXT('USERENV','HOST') NOT NULL,
EditTime
DATE DEFAULT
SYSDATE NOT NULL,
TS
NUMBER(9) DEFAULT
0 NOT NULL,
CONSTRAINT EcuSdbLibrary_PK PRIMARY
KEY (ID)
);
CREATE UNIQUE INDEX EcuSdbLibrary_UX
ON EcuSdbLibrary (Name);
CREATE SEQUENCE EcuSdbLibrary_SQ
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
CREATE OR REPLACE TRIGGER EcuSdbLibrary_ID
BEFORE INSERT ON EcuSdbLibrary
FOR EACH ROW
BEGIN
SELECT EcuSdbLibrary_SQ.NEXTVAL
INTO :NEW.ID FROM DUAL;
END;
/
CREATE OR REPLACE TRIGGER EcuSdbLibrary_TS
BEFORE UPDATE ON EcuSdbLibrary
FOR EACH ROW
BEGIN
:NEW.TS := :OLD.TS + 1;
:NEW.EditTime := SYSDATE;
END;
/
--------------------------------------------------------------------------------
-- Create the EcuSdbRecord table
-----------------------------------------------
--------------------------------------------------------------------------------
CREATE TABLE EcuSdbRecord
(
ID
NUMBER(12) DEFAULT
0 NOT NULL,
LibID
NUMBER(12) DEFAULT
0 NOT NULL,
Name
VARCHAR2(50) DEFAULT '
' NOT NULL,
Dynamic
NUMBER(1) DEFAULT
0 NOT NULL,
Description
VARCHAR2(255) DEFAULT '
' NOT NULL,
EditUser
VARCHAR2(50) DEFAULT
USER NOT NULL,
EditHost
VARCHAR2(50) DEFAULT SYS_CONTEXT('USERENV','HOST') NOT NULL,
EditTime
DATE DEFAULT
SYSDATE NOT NULL,
TS
NUMBER(9) DEFAULT
0 NOT NULL,
CONSTRAINT EcuSdbRecord_PK PRIMARY
KEY (ID),
CONSTRAINT EcuSdbRecord_FK FOREIGN
KEY (LibID)
REFERENCES
EcuSdbLibrary (ID) ON DELETE CASCADE
);
CREATE UNIQUE INDEX EcuSdbRecord_UX
ON EcuSdbRecord (Name);
CREATE SEQUENCE EcuSdbRecord_SQ
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
CREATE OR REPLACE TRIGGER EcuSdbRecord_ID
BEFORE INSERT ON EcuSdbRecord
FOR EACH ROW
BEGIN
SELECT EcuSdbRecord_SQ.NEXTVAL INTO
:NEW.ID FROM DUAL;
END;
/
CREATE OR REPLACE TRIGGER EcuSdbRecord_TS
BEFORE UPDATE ON EcuSdbRecord
FOR EACH ROW
BEGIN
:NEW.TS := :OLD.TS + 1;
:NEW.EditTime := SYSDATE;
END;
/
--------------------------------------------------------------------------------
-- Create the EcuSdbField table
------------------------------------------------
--------------------------------------------------------------------------------
CREATE TABLE EcuSdbField
(
ID
NUMBER(12) DEFAULT
0 NOT NULL,
RecID
NUMBER(12) DEFAULT
0 NOT NULL,
Name
VARCHAR2(50) DEFAULT '
' NOT NULL,
DataType
NUMBER(9) DEFAULT
0 NOT NULL,
Length
NUMBER(9) DEFAULT
0 NOT NULL,
NumScale
NUMBER(9) DEFAULT
0 NOT NULL,
DefValue VARCHAR2(255)
DEFAULT ' ' NOT NULL,
Description
VARCHAR2(255) DEFAULT '
' NOT NULL,
SortID
NUMBER(9) DEFAULT
0 NOT NULL,
TS
NUMBER(9) DEFAULT 0
NOT NULL,
CONSTRAINT EcuSdbField_PK PRIMARY
KEY (ID),
CONSTRAINT EcuSdbField_FK FOREIGN
KEY (RecID)
REFERENCES
EcuSdbRecord (ID) ON DELETE CASCADE
);
CREATE UNIQUE INDEX EcuSdbField_UX
ON EcuSdbField
(RecID,Name,DataType);
CREATE SEQUENCE EcuSdbField_SQ
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
CREATE OR REPLACE TRIGGER EcuSdbField_ID
BEFORE INSERT ON EcuSdbField
FOR EACH ROW
BEGIN
SELECT EcuSdbField_SQ.NEXTVAL INTO
:NEW.ID FROM DUAL;
END;
/
CREATE OR REPLACE TRIGGER EcuSdbField_TS
BEFORE UPDATE ON EcuSdbField
FOR EACH ROW
BEGIN
:NEW.TS := :OLD.TS + 1;
END;
/
--------------------------------------------------------------------------------
COMMIT;