OBCOM Record Wizard
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;