Contenedores

De Egeasy
Saltar a: navegación, buscar

¿Qué es un contenedor?

Un contenedor es un recurso fundamental que ofrece ODL y que nos permite crear objetos en un sistema de información. ¿Qué podemos entender por objeto? Pues aquellos elementos o conceptos físicos que intervienen en el sistema de información de una organización. Elementos como fichas, ficheros, informes, registros, documentación, etc., son ejemplos de elementos que puede generar y necesitar un sistema de información.

¿Qué definiciones podemos realizar?

En ODL, existen dos formas de definir un contenedor:

Definiciones de tipo

Una definición de tipo nos permite crear objetos en un sistema de información. Es un concepto basado en POO, donde se define una clase con su posterior creación de objetos u otras clases derivadas.

La estructura del objeto vendrá definida, valga la redundancia, en la definición de tipo. Formularios, secciones o campos son algunos de los componentes que podremos incluir en la definición y que nos permitirán introducir la información que almacenará el objeto. Una vez creado el objeto, podrá ser editado o eliminado por el usuario, siempre y cuando tenga los permisos necesarios para poder realizar dichas operaciones.

Definiciones de sistema

Una definición de sistema permite crear objetos al crear un centro. Los objetos creados en la instalación de un centro los denominaremos objetos de sistema.

Aunque en ODL se puede definir cualquier componente en un contenedor, en los objetos de sistema normalmente se suele utilizar la componente colección para realizar visualizaciones de objetos, ó, en su defecto, catálogos. Estos componentes nos permitirán realizar visualizaciones personalizadas de los tipos de objetos que se quiera, especificando la información a mostrar. A diferencia de las definiciones de tipo, el usuario no podrá crear, modificar o eliminar los objetos de sistema; será una tarea exclusiva del programador.

Veamos un ejemplo

Vamos a realizar un sencillo ejemplo de forma que podamos reflejar los conceptos anteriormente explicados en un caso práctico.

Imaginemos que tenemos una estantería vacía. Y en esa estantería iremos insertando libros con el transcurso del tiempo. Veamos pues como podemos trasladar este caso a lenguaje ODL usando contenedores.

¿Cómo implementamos una definición de tipo?

Como ya hemos dicho, ODL nos ofrece una serie de componentes que podremos utilizar para la definición de un tipo. Los componentes más comunes son formularios, secciones y campos. Un campo es la unidad más básica para la introducción de datos. Una sección es un cojunto de campos y un formulario es un conjunto de secciones y campos.

Por tanto, para el concepto de "Libro" realizaremos una definición de tipo, usando los componentes antes mencionados, que nos permitirá crear un objeto por cada libro que insertemos en la estantería:
tipo [Libro] es contenedor
   [Datos] es formulario
      [Código] es timbre
         -certificado.valor = [&Valor_secuencia];
         -certificado.secuencia.nombre = "STR$LIBRO";
         -certificado.secuencia.longitud = 4;
      [Título] es texto
      [Autor] es texto
      [Edición] es texto
      [Editorial] es texto
[Contenido] es seccion [Tipo] es texto -edicion.valores = $Matriz("Literario","Biografía","Científico","Infantil"); -apariencia.desplegable = verdadero; [Sinopsis] es texto -edicion.longitud = 1000; fin fin fin
Nuestra definición de tipo ya está creada. Como podrás observar, hemos definido un formulario dentro del contenedor, que a su vez contiene varios campos y una sección que nos va a permitir introducir la información perteneciente a cada libro. Existe un campo timbre que se utiliza para autonumerar, en este caso, los libros que vayamos registrando. Los demás campos son todos de tipo texto.

Otro elemento que aparece en la definición que no hemos comentado son los atributos. Los atributos intervienen en todas las definiciones de ODL, y sirven para configurar el comportamiento de las definiciones. Los atributos que aquí se contemplan son relativos a campos y no nos detendremos en explicar su funcionamiento. En este mismo documento, abordaremos con mayor profundidad los atributos que afectan directamente a los contenedores.

Ahora, veamos cómo se refleja el código en la aplicación egExplorer de forma que nos permite crear objetos de tipo "Libro":
Crear un objeto en egExplorer

Una vez rellenado los campos, guardaremos el objeto. Pero, ¿cómo puedo obtener un listado de los libros que voy introduciendo? ¿Cómo puedo "ver mi estantería"?

¿Cómo implementamos una definición de sistema?

Nos disponemos a crear una instancia del sistema, un elemento estático en el que podremos visualizar los objetos que hemos creado. La forma de definir un objeto de sistema es similar a la definición de tipo pero sin incluir la palabra reservada tipo. Es decir, [nombre] es contenedor. Sin más preámbulos, veamos como se define nuestra "estantería":


[Estantería 1] es contenedor
   [Contenido] es coleccion
      -nombre_tabla = "TC$LIBROS";
contiene [Libro]
columna [Código] -columna_bd.nombre = "CÓDIGO"; -origen = [Datos].[Código];
columna [Título] -columna_bd.nombre = "TÍTULO"; -origen = [Datos].[Título];
columna [Autor] -columna_bd.nombre = "AUTOR"; -origen = [Datos].[Autor];
columna [Sinopsis] -columna_bd.nombre = "SINOPSIS"; -origen = [Datos].[Contenido].[Sinopsis]; fin fin

Como ya hemos dicho, un contenedor puede almacenar componentes, además de otros contenedores. En este caso, se utiliza la componente colección para visualizar los objetos creados. En la colección especificamos los campos que queremos visualizar además de especificar el tipo de objetos. Por eso decimos que la definición puede contener componentes (una colección en este caso) u otros contenedores (contiene [Libro] dentro de la componente colección).

A continuación veremos el contenido de nuestra estantería:
Abrir un objeto de sistema

Al hacer clic en "Estantería 1" abrimos el objeto de sistema, y se visualiza el listado de objetos creados. Dentro de ella, podremos crear aquellos contenedores que estén en el dominio del objeto de sistema, en este caso, sólo podremos crear contenedores "Libro".

Crear un nuevo contenedor dentro de un objeto de sistema

Propiedades de un contenedor

En ODL, cada contenedor que sea crea en el sistema adquiere una serie de propiedades. Éstas almacenan información relativa a cada contenedor creado, que puede resultar útil en tareas de mantenimiento del sistema de información. Algunas de estas propiedades pueden ser asignables, y otras no, desde el punto de vista del programador, nunca del usuario:

  • Nombre: es el nombre que adquiere el objeto. Si no se especifica, adquiere el nombre de la definición.
  • ID: RRC del contenedor. Valor entero único para cada contenedor generado por el sistema.
  • Tipo: tipo del contenedor.
  • Dominio: informa de la ubicación del recurso.
  • Creado: fecha de creación del contenedor.
  • Creador: usuario que ha creado el contenedor.
  • Modificado: fecha de la última modificación del contenedor.
  • Modificador: usuario que ha realizado la última modificación del contenedor.
  • Protegido: evita que un objeto se pueda "mover", por ejemplo, a otras colecciones. Además, no permite la edición del objeto. Se puede asignar o desasignar.

Veamos la forma de modificar la propiedad Nombre:

tipo [Libro] es contenedor
   -nombre = "Libros de la biblioteca"; 
   ...
   ...
   ...
fin

O incluso la propiedad Nombre permite la posibilidad de definir una expresión. Por ejemplo:

tipo [Libro] es contenedor
   -nombre = {{STR|"$si([Datos].[Contenido].[Tipo]{{{1}}} Científico, 'Libro sobre ciencia', 'Libro'";
   ...
   ...
   ...
fin

Si la condición se cumple, la propiedad Nombre tendrá el valor "Libro sobre ciencia", si no se cumple, su valor será "Libro".

Validaciones en un contenedor

ODL ofrece una operación llamada validación que permite definir condiciones en un contenedor. ¿Pero condiciones para qué?

Cuando creamos un objeto, es necesario garantizar la integridad de la información introducida. Pero además de introducir una información, puede ser necesario introducirla con un formato determinado. Aquí es donde intervienen las validaciones. Se incluirán condiciones en el contenedor sobre ciertas entradas de información (campos), de manera que al querer guardar el objeto, no se llevará a cabo esta operación si no se cumplen las condiciones definidas.

Antes de definir una condición debemos saber qué atributos tenemos que incluir. El atributo regla indicará el campo sobre el que queremos que se evalúe la condición. El tipo indicará el carácter de la condición, si es estricta sera de tipo error, y si no, será de tipo advertencia. Finalmente indicaremos un mensaje de error en el atributo mensaje, y una localización del campo afectado en forma de enlace en el atributo localizacion.componente.

Utilizando el ejemplo anterior, definiremos condiciones en el contenedor Libro, y veremos su comportamiento a la hora de crear un objeto de tipo Libro.

tipo [Libro] es contenedor
   [Datos] es formulario
      [Código] es timbre
         -certificado.valor = [&Valor_secuencia];
         -certificado.secuencia.nombre = "STR$LIBRO";
         -certificado.secuencia.longitud = 4;
      [Título] es texto
      [Autor] es texto
      [Edición] es texto
      [Editorial] es texto
[Contenido] es seccion [Tipo] es texto -edicion.valores = $Matriz("Literario","Biografía","Científico","Infantil"); -apariencia.desplegable = verdadero; [Sinopsis] es texto -edicion.longitud = 1000; fin fin
condicion [Campo Título, está vacío] -regla = [Datos].[Título] = vacio; -localizacion.componente = [Datos].[Título]; -tipo = error; -mensaje = "Debe introducir el título del Libro";
condicion [Año de la edición con 4 dígitos] -regla = $longitudTexto([Datos].[Año de la edición]) < 4; -localizacion.componente = [Datos].[Año de la edición]; -tipo = advertencia; -mensaje = "Formato del año incorrecto, debe tener 4 dígitos como mínimo. En caso de ser un año inferior a 4 dígitos, añadir ceros a la izquierda";
condicion [Tipo de libro no aceptado] -regla = ([Datos].[Contenido].[Tipo] <> "Literario") y ([Datos].[Contenido].[Tipo] <> "Biografía") y ([Datos].[Contenido].[Tipo] <> "Científico") y ([Datos].[Contenido].[Tipo] <> "Infantil"); -localizacion.componente = [Datos].[Contenido].[Tipo]; -tipo = error; -mensaje = "Por favor, seleccione uno de los valores del desplegable. Este campo no puede tener otro valor"; fin
Comportamiento de las distintas condiciones

Ciclo de eventos de un contenedor

Aprovechando que en el apartado anterior hemos creado un objeto definiendo condiciones en la definición de tipo, es un buen momento para entender los eventos que se producen al almacenar un objeto.

El primer evento que se produce es la verificación de validaciones, es decir, que antes de que se guarde el objeto, la integridad de la información introducida tiene que ser la exigida en su definición. Si esto se cumple, el siguiente evento es guardar el objeto. Una vez almacenado, el tercer evento es actualizar las tablas de colección, de forma que el objeto creado aparezca en aquellas colecciones donde esté incluído el tipo del objeto. Y finalmente, se ejecutan las exportaciones asociadas a ese contenedor.

Herencia en contenedores

ODL permite la herencia entre contenedores...

Atributos

A la hora de definir un contenedor, es probable que queramos configurar ciertos aspectos en su definición de forma que satisfagan las necesidades del sistema de información. Para esto, existen los atributos.

En ODL existen atributos generalizados sobre los recursos (contenedores, tareas, habitaciones, enumerados y roles) y otros atributos exclusivos de los contenedores. Entre ellos, se distinguen dos tipos de atributos, asignables y ocultos (el programador no puede asignarle un valor, esa tarea la realiza el compilador). A continuación listaremos todos los atributos que afectan a los contenedores y su especificación, para finalmente realizar un ejemplo con aquellos atributos que pueden ser asignables por el programador.

Atributos de los recursos

Atributo Tipo Valor por defecto Observaciones
Ayuda Texto Marcador dentro de la ayuda
Descripcion Texto [Nombre] Comentario sobre el recurso
Etiqueta Texto [Nombre] Etiqueta del recurso
Grupo Texto Grupo de recursos en el que se clasifica
Icono Texto Identificar del icono
Plantilla_impresion Texto Nombre del fichero de la plantilla de impresión (.ar)
Publico Lógico Verdadero Indica que al recurso pueden acceder todos los usuarios
Registrar_accesos Texto Nada Registran los accesos al recurso (.log). Nunca (Nada), cuando se accede (Lectura) o cuando se modifique (Escritura)
Mostrar_propiedades Lógico Verdadero Se desea mostrar la pestaña de propiedades del recursos


Atributo oculto Tipo Observaciones
Asistente Definicion asistente Asistente asociado al recurso
Habitaciones {Definicion recurso} Habitaciones a las que se puede enviar el recurso
Impresiones Definicion impresion Formatos de impresión que se pueden realizar del contenedor
Verificación Definicion verificacion Verificación a realizar sobre el recurso


Atributos de los contenedores

Atributo Tipo Valor por defecto Observaciones
Nombre Expresión / Texto [Nombre de la definición] Fórmula para sugerir un nombre para el contenedor
Referencia Expresión / Texto Fórmula para calcular la referencia de un contenedor
Asunto Texto


Atributo oculto Tipo Observaciones
Colecciones {Definición colección} Colecciones en las que se puede almacenar el contenedor
Exportaciones {Definición exportación} Exportaciones que tiene definidas el contenedor
Asistentes {Definición asistente} Asistentes que tiene definidos el contenedor
Asistente_automatico {Definición asistente} Asistente que se ejecuta automáticamente al crear el contenedor
Tareas {Definición tarea} Tipos de tareas que se pueden lanzar sobre el contenedor
Referencias.Definicion {Definición} Referencias que se realizan de manera indirecta al contenedor, tanto colecciones como exportaciones.
Referencias.Columna Texto Nombre de la columna donde se almacena la referencia indirecta

Ejemplo: uso de atributos