OBCOM Record Wizard

Copyright © OBCOM INGENIERIA S.A. (Chile)

1.  Introducción

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.

 

2.  Barra de herramientas

 

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):

 

  1. Conectarse o desconectarse de una base de datos de un Servidor SQL.
  2. Generar los archivos (ASP, LBR y SQL) de una o más bibliotecas de registros.
  3. Importar uno o más archivos ASP a una biblioteca de registros.
  4. Bloquear (o tomar posesión) de una o más bibliotecas de registros.
  5. Desbloquear (o liberar) una o más bibliotecas de registros.
  6. Refrescar la vista actual de información.
  7. Copiar la información seleccionada al porta papeles (clipboard).
  8. Pegar información del porta papeles (clipboard) a la vista actual.
  9. Buscar registros en la base de datos.
  10. Vista preliminar de impresión.
  11. Imprimir la vista actual.
  12. Mostar ayuda en línea.

3.  Conexión al Servidor SQL

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.

4.  Árbol de navegación

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.

5.  Lista de bibliotecas en la base de datos

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.

6.  Lista de registros de una biblioteca

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.

7.  Lista de campos de un registro

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:

 

  1. Alpha: secuencia de caracteres alfa-numérico del largo especificado.
  2. Date: fecha de largo 8 (DDMMAAAA), 6 (DDMMAA) ó 4 (MMAA).
  3. ListBegin: comienzo de lista. El largo indica el número de elementos de la lista.
  4. ListEnd: fin de lista. El largo es ignorado, pero debe ser mayor que cero.
  5. Number: número sin signo. El largo indica parte entera, y la escala los decimales.
  6. Rut: Rol Único Tributario. El largo debe ser 10, y la escala 1 (dígito verificador).
  7. Signed: número con signo. El largo indica parte entera, y la escala los decimales.
  8. Text: secuencia de caracteres del largo especificado.

8.  Edición del panel de detalle

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.

9.  Generación de archivos ASP, LBR y SQL

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.

10.      Búsqueda de registros

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.

11.      Vista preliminar e impresión

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”.

 

12.      Barra de estado

 

OBCOM Record Wizard posee una barra de estado que muestra la siguiente información (de izquierda a derecha en la figura anterior):

 

  1. Nombre del usuario que está actualmente “logon” en Windows.
  2. Nombre del computador donde está ejecutando OBCOM Record Wizard.
  3. Nombre del usuario con que se conectó al servidor de base de datos.
  4. Nombre del servidor de base de datos al cual se está conectado.
  5. Nombre de la base de datos (o esquema) con que se está trabajando.
  6. Área de mensajes respecto de la última operación realizada.
  7. Versión de la biblioteca ADO utilizada para conectarse.
  8. Versión de la herramienta OBCOM Record Wizard.

13.      Creación de tablas MS-SQL para OBCOM Record Wizard

--------------------------------------------------------------------------------

-- 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

14.      Creación de tablas Oracle para OBCOM Record Wizard

--------------------------------------------------------------------------------

-- 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;