Tarea C: Evolucionando la arquitectura del registro

De Egeasy
Saltar a: navegación, buscar

Desarrollar con egeasy paso a paso

En nuestro registro, cada vez que un interesado presenta documentación, tenemos que escribir su nombre en el campo Remitente. Este sistema es válido, pero presenta algunas carencias. Si la misma persona presenta documentación en varias ocasiones, tendremos que estar repitiendo su nombre con el riesgo de equivocarnos, arriesgándonos a perder la coherencia de los datos. Además, tenemos muy poca información sobre esa persona. Si está iniciando un procedimiento administrativo y tenemos que ponernos en contacto con ella, no tenemos ni su DNI, ni su teléfono, ni su dirección. Tampoco podemos poner estos campos en el formulario del objeto Entrada ya que la introducción de datos sería muy tediosa. ¿Qué podemos hacer? Comencemos por abstraer el concepto de Tercero en el diagrama que propusimos al comienzo del tutorial.


Abstraemos el concepto Tercero y lo relacionamos con las entradas y las salidas
En esta figura lo que decimos es:
  • Un Fichero de terceros se compone de muchos terceros. Un Tercero representa una persona (física o jurídica) y contiene los datos jurídicos y de contacto de dicha persona.
  • Un Libro de entrada se compone de muchas entradas. Cada Entrada tiene Número, Fecha y Destinatario (a qué departamento de la organización se dirige). También se relaciona con una ficha de Tercero; esta relación expresa que el Tercero es el Remitente de la documentación. Adicionalmente, puede tener uno o más documentos adjuntos.
  • Un Libro de salida se compone de muchas salidas. Cada Salida tiene Número, Fecha y Origen (departamento de la organización de donde sale el documento). También se relaciona con una ficha de Tercero; esta relación expresa que el Tercero es el Destinatario de la documentación de salida. Además, puede tener uno o más documentos adjuntos.


Definiendo un tipo "Tercero"

La definición del tipo Tercero es inmediata:

tipo [Tercero] es contenedor
   [Datos generales] es formulario
       [Nombre/Razón social] es texto
       [Apellidos] es texto
       [CIF/NIF] es texto
       [Dirección] es texto
       [Código postal] es texto
       [Municipio] es texto
       [Provincia] es texto
       [Teléfono 1] es texto
       [Teléfono 2] es texto
       [Fax] es texto
       [Email] es texto
   fin
fin

Crear un "Fichero de terceros"

Ahora tenemos que definir el Fichero de terceros como un objeto de sistema. La definición es muy parecida a la del Libro de entrada.

[Fichero de terceros] es contenedor
   [Contenido] es coleccion
       -nombre_tabla = "TC$TERCEROS";
contiene [Tercero]
columna [Denominación] -columna_bd.nombre = "DENOMINACION"; -origen = [Datos generales].[Nombre/Razón social] + " " + [Datos generales].[Apellidos]; columna [CIF/NIF] -columna_bd.nombre = "CIF"; -origen = [Datos generales].[CIF/NIF]; columna [Teléfono principal] -columna_bd.nombre = "TELEFONO_1"; -origen = [Datos generales].[Teléfono 1]; columna [Email] -columna_bd.nombre = "EMAIL"; -origen = [Datos generales].[Email]; fin fin

Como ya explicamos en la Tarea A, las columnas de una coleccion no tienen por qué tener una correspondencia directa con los campos de los objetos que contiene. En esta ocasión, hemos definido la columna Denominación como una concatenación del Nombre y los Apellidos, para no tener que diferenciar entre personas físicas y jurídicas (que no tendrían apellidos).

En ODL, todo recurso debe definirse antes de que se haga uso de él o de su definición. Como más adelante haremos uso tanto del tipo Tercero como del Fichero de terceros para establecer la relación, debemos asegurarnos de que las definiciones aparecen antes de que se definan los objetos Entrada o Salida.

Ubicar nuestro "Fichero de terceros" en el "Registro"

Por último, para hacer este fichero accesible para los usuarios, tenemos que ubicarlo en el Registro de entrada y salida. En este caso lo ubicaremos en Ficheros, en vez de en Libros.

[Registro de entrada y salida] es habitacion
   ubicado [Fichero de terceros]
       -lugar = "Ficheros";
   ubicado [Libro de entrada]
       -lugar = "Libros";
   ubicado [Libro de salida]
       -lugar = "Libros";
fin

Si compilamos y actualizamos ya podremos comenzar a crear fichas de Tercero en nuestro sistema. Observa cómo en la barra de navegación lateral la plataforma crea un nuevo grupo con el nombre Ficheros.

Ficha de Tercero

Establecer una relación entre "Entrada" y "Tercero" mediante un campo vínculo

Ahora nos falta establecer la relación entre la ficha de Tercero y las Entradas y las Salidas. Esto lo logramos haciendo uso de los campos de tipo vinculo. Un vinculo representa una relación entre dos contenedores dentro del sistema. El siguiente código muestra cómo vincular una Entrada con una ficha de Tercero:

tipo [Entrada] es contenedor
   [Datos generales] es formulario
       [Número] es timbre
           -certificado.subsecuencia.valor = $Copiartexto($texto($Año($Hoy)), 3, 2);
           -certificado.valor = [&Valor_subsecuencia] + "/" + [&Valor_secuencia];
           -certificado.secuencia.nombre = {{STR|"STR$ENTRADA"};
           -certificado.secuencia.longitud = 4;
       [Fecha] es fecha
           -edicion.modo = copia;
           -edicion.valor = [Número].[&Fecha];
       [Remitente] es vinculo
           -vinculo.definicion = [Tercero];
           -vinculo.etiqueta = [Datos generales].[Nombre/Razón social] + " " + [Datos generales].[Apellidos];
           -vinculo.valores = $matriz([Fichero de terceros].[Contenido]);
       [Destinatario] es texto
   fin
fin

Como podrás observar, cambiamos el tipo del campo Remitente de texto a vinculo. Los tres atributos que vienen a continuación nos permiten configurar el comportamiento del vinculo:

  • El atributo vinculo.definicion indica con qué tipo de contenedor puede establecerse el vínculo. En este caso indicamos que vincula con un objeto de tipo Tercero.
  • En el atributo vinculo.etiqueta indicamos una expresión con el texto que debe aparecer en el campo cuando se establece el vínculo. En este caso, queremos que aparezca el nombre y los apellidos concatenados.
  • Por último, en el atributo vinculo.valores indicamos la fuente de datos de la cuál obtendremos todos los contenedores con los que podremos vincular. En nuestro caso indicamos que es la colección Contenido del Fichero de terceros. Como este atributo espera una matriz, realizamos una conversión entre coleccion y matriz con la función $matriz.

Con estas seis líneas ya habremos establecido la relación entre Entrada y Tercero.

(Compila, actualiza y prueba ;).

Cuadro de búsqueda para vincular. Este cuadro se abre al hacer clic en el icono vincular del campo Remitente.

Como podrás observar, al final del campo Remitente aparece un triángulo. Si haces clic se abrirá un cuadro, similar al de la figura anterior, mostrando todas las fichas de Tercero que hay en la colección Contenido del Fichero de terceros. Si haces doble clic en alguna de las fichas que te muestra, podrás observar cómo queda el objeto vinculado.

¿Qué es un enumerado? Añadiendo un "Destinatario" a las "Entradas"

Ahora ya tenemos las entradas vinculadas con fichas de Tercero, enriqueciendo el conjunto de la información almacenada y garantizando la coherencia en el sistema. ¿Podremos hacer algo con el campo Destinatario? La mayoría de las organizaciones tienen un conjunto de departamentos bien conocido y relativamente reducido. Siempre que se presente alguna documentación, ésta irá dirigida a un departamento concreto. Sería bastante cómodo disponer de la lista de departamentos para seleccionar uno, aunque quizás no merece la pena (al menos de momento) abstraerlos como un concepto del sistema. Los recursos de tipo enumerado son una buena opción.

[Departamentos] es enumerado
   valores
       "Secretaría",
       "Administración",
       "Contabilidad",
       "Personal",
       "Dirección"
fin

Un enumerado es un recurso que actúa como una fuente de datos. Los valores que proporciona un enumerado pueden ponerse en una lista de cadenas separadas por comas (como en el ejemplo anterior) o bien pueden obtenerse de un fichero CSV (commasepareted values). En la declaración anterior, definidos el objeto de sistema Departamentos de tipo enumerado y definimos cinco valores con los nombres (hipotéticos) de los departamentos de la organización.

Ahora debemos modificar la definición del campo Destinatario en el formulario de Entrada para hacer uso del enumerado:

tipo [Entrada] es contenedor
   [Datos generales] es formulario
       [Número] es timbre
           -certificado.subsecuencia.valor = $Copiartexto($texto($Año($Hoy)), 3, 2);
           -certificado.valor = [&Valor_subsecuencia] + "/" + [&Valor_secuencia];
           -certificado.secuencia.nombre = {{STR|"STR$ENTRADA"};
           -certificado.secuencia.longitud = 4;
       [Fecha] es fecha
           -edicion.modo = copia;
           -edicion.valor = [Número].[&Fecha];
       [Remitente] es vinculo
           -vinculo.definicion = [Tercero];
           -vinculo.etiqueta = [Datos generales].[Nombre/Razón social] + " " + [Datos generales].[Apellidos];
           -vinculo.valores = $matriz([Fichero de terceros].[Contenido]);
       [Destinatario] es texto
           -edicion.valores = $matriz([Departamentos]);
   fin
fin

Al compilar y actualizar, observarás cómo al final del campo Destinatario aparece un cuadrado doble. Haciendo clic te aparecerá la lista de valores.

¿Y la documentación presentada? Introducir un campo tabla al formulario

Un asunto que dejamos pendiente en la Tarea A fue incluir en la definición del tipo Entrada la documentación presentada. Ahora que ya tenemos algo más de experiencia con ODL, es un buen momento para abordarlo.

Para reflejar la documentación que el Remitente presenta utilizaremos los campos de tipo tabla. Este tipo de campo permite definir una tabla en el formulario. Dentro de la tabla se definen campos (al igual que en el formulario) que actuarán como las columnas de la tabla.


tipo [Entrada] es contenedor
   [Datos generales] es formulario
       [Número] es timbre
           -certificado.subsecuencia.valor = $Copiartexto($texto($Año($Hoy)), 3, 2);
           -certificado.valor = [&Valor_subsecuencia] + "/" + [&Valor_secuencia];
           -certificado.secuencia.nombre = "STR$ENTRADA";
           -certificado.secuencia.longitud = 4;
       [Fecha] es fecha
           -edicion.modo = copia;
           -edicion.valor = [Número].[&Fecha];
       [Remitente] es vinculo
           -vinculo.definicion = [Tercero];
           -vinculo.etiqueta = [Datos generales].[Nombre/Razón social] + " " + [Datos generales].[Apellidos];
           -vinculo.valores = $matriz([Fichero de terceros].[Contenido]);
       [Destinatario] es texto
           -edicion.valores = $matriz([Departamentos]);
       [Documentación presentada] es tabla
           [Documento] es texto
       fin
   fin
fin

En el código anterior, añadimos la tabla Documentación presentada con una columna de tipo texto Documento. Si compilamos y actualizamos, ya podremos reflejar en el objeto Entrada cuál ha sido la documentación presentada en el Registro.

Entrada con la tabla de Documentación presentada

¿Qué hemos aprendido?

  • En ODL todas las definiciones deben declararse antes de su uso.
  • Se pueden establecer vínculos entre contenedores haciendo uso de los campos de tipo vínculo.
  • Se pueden definir recursos de tipo enumerado, que actúan como fuentes de datos. Estos datos pueden especificarse en la definición o proporcionarse mediante un fichero CSV.
  • Los campos de tipo tabla permiten incrustar tablas en los formularios con el número de columnas que necesitemos.

Ejercicios

  • Traslada las modificaciones que hemos realizado sobre la definición de Entrada al tipo Salida. Ten en cuenta que, en este caso, el campo Origen hace referencia a un departamento de la organización y el Destinatario es un Tercero.
  • El atributo apariencia.desplegable permite controlar que el conjunto de valores especificado en el atributo edicion.valores se muestre como un desplegable en lugar de mostrar un cuadro. Prueba a agregar este atributo al campo Destinatario de la Entrada (debes poner apariencia.desplegable = verdadero).
  • El atributo edicion.seleccion permite controlar que un campo de tipo texto sólo pueda tomar alguno de los valores especificados en el atributo edicion.valores. Prueba a incluir este atributo al campo Destinatario de la Entrada (debes poner edicion.seleccion = verdadero) y comprueba que ya no puedes introducir texto libre en dicho campo.
  • Define una nueva ficha, Trabajador, que represente a un trabajador de la organización. Esta ficha debe almacenar Nombre, Apellidos, Cargo, Sexo (a elegir entre Hombre y Mujer), Teléfono y Departamento del trabajador. Crea también un fichero de Trabajadores que contenga todas las fichas. Por último añade a la definición de Entrada un campo que sea Trabajador destinatario. Este campo debe vincular con alguna de las fichas de Trabajador.

Siguiente tarea

Véase también