Diferencia entre revisiones de «Tarea C: Evolucionando la arquitectura del registro»
(→Véase también) |
|||
(No se muestran 58 ediciones intermedias de 2 usuarios) | |||
Línea 1: | Línea 1: | ||
+ | [[Desarrollar_con_egeasy_paso_a_paso|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. | 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. | ||
+ | |||
+ | |||
+ | [[Imagen:Figura 10.jpg|thumb|250px|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. | ||
+ | |||
+ | |||
+ | |||
+ | __TOC__ | ||
+ | |||
+ | ==Definiendo un tipo "Tercero"== | ||
+ | La definición del tipo '''Tercero es''' inmediata: | ||
+ | |||
+ | {{PR|tipo}} [Tercero] {{PR|es}} {{RE|contenedor}} | ||
+ | [Datos generales] {{PR|es}} {{T|formulario}} | ||
+ | [Nombre/Razón social] {{PR|es}} {{T|texto}} | ||
+ | [Apellidos] {{PR|es}} {{T|texto}} | ||
+ | [CIF/NIF] {{PR|es}} {{T|texto}} | ||
+ | [Dirección] {{PR|es}} {{T|texto}} | ||
+ | [Código postal] {{PR|es}} {{T|texto}} | ||
+ | [Municipio] {{PR|es}} {{T|texto}} | ||
+ | [Provincia] {{PR|es}} {{T|texto}} | ||
+ | [Teléfono 1] {{PR|es}} {{T|texto}} | ||
+ | [Teléfono 2] {{PR|es}} {{T|texto}} | ||
+ | [Fax] {{PR|es}} {{T|texto}} | ||
+ | [Email] {{PR|es}} {{T|texto}} | ||
+ | {{PR|fin}} | ||
+ | {{PR|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] {{PR|es}} {{RE|contenedor}} | ||
+ | [Contenido] {{PR|es}} {{T|coleccion}} | ||
+ | -{{AT|nombre_tabla}} = {{STR|"TC$TERCEROS"}};<br/> | ||
+ | {{PR|contiene}} [Tercero]<br/> | ||
+ | {{PR|columna}} [Denominación] | ||
+ | -{{AT|columna_bd}}.{{AT|nombre}} = {{STR|"DENOMINACION"}}; | ||
+ | -{{AT|origen}} = [Datos generales].[Nombre/Razón social] + {{STR|" "}} + [Datos generales].[Apellidos]; | ||
+ | {{PR|columna}} [CIF/NIF] | ||
+ | -{{AT|columna_bd}}.{{AT|nombre}} = {{STR|"CIF"}}; | ||
+ | -{{AT|origen}} = [Datos generales].[CIF/NIF]; | ||
+ | {{PR|columna}} [Teléfono principal] | ||
+ | -{{AT|columna_bd}}.{{AT|nombre}} = {{STR|"TELEFONO_1"}}; | ||
+ | -{{AT|origen}} = [Datos generales].[Teléfono 1]; | ||
+ | {{PR|columna}} [Email] | ||
+ | -{{AT|columna_bd}}.{{AT|nombre}} = {{STR|"EMAIL"}}; | ||
+ | -{{AT|origen}} = [Datos generales].[Email]; | ||
+ | {{PR|fin}} | ||
+ | {{PR|fin}} | ||
+ | |||
+ | Como ya explicamos en la [[:Tarea_A:_Libros_y_registro_de_entrada_y_salida|Tarea A]], las columnas de una {{T|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] {{PR|es}} {{RE|habitacion}} | ||
+ | {{PR|ubicado}} [Fichero de terceros] | ||
+ | -{{AT|lugar}} = {{STR|"Ficheros"}}; | ||
+ | {{PR|ubicado}} [Libro de entrada] | ||
+ | -{{AT|lugar}} = {{STR|"Libros"}}; | ||
+ | {{PR|ubicado}} [Libro de salida] | ||
+ | -{{AT|lugar}} = {{STR|"Libros"}}; | ||
+ | {{PR|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'''. | ||
<center> | <center> | ||
{| | {| | ||
− | |align="center" |[[Imagen:Figura | + | |align="center" |[[Imagen:Figura 11.jpg|thumb|250px|Ficha de Tercero]] |
|} | |} | ||
</center> | </center> | ||
− | + | ==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 {{T|vinculo}}. Un {{T|vinculo}} representa una relación entre dos [[Contenedores|contenedores]] dentro del sistema. El siguiente código muestra cómo vincular una Entrada con una ficha de Tercero: |
− | + | ||
− | :* | + | {{PR|tipo}} [Entrada] {{PR|es}} {{RE|contenedor}} |
+ | [Datos generales] {{PR|es}} {{T|formulario}} | ||
+ | [Número] {{PR|es}} {{T|timbre}} | ||
+ | -{{AT|certificado}}.{{AT|subsecuencia}}.{{AT|valor}} = $Copiartexto($texto($Año($Hoy)), 3, 2); | ||
+ | -{{AT|certificado}}.{{AT|valor}} = [&Valor_subsecuencia] + {{STR|"/"}} + [&Valor_secuencia]; | ||
+ | -{{AT|certificado}}.{{AT|secuencia}}.{{AT|nombre}} = {{STR|"STR$ENTRADA"}; | ||
+ | -{{AT|certificado}}.{{AT|secuencia}}.{{AT|longitud}} = 4; | ||
+ | [Fecha] {{PR|es}} {{T|fecha}} | ||
+ | -{{AT|edicion}}.{{AT|modo}} = copia; | ||
+ | -{{AT|edicion}}.{{AT|valor}} = [Número].[&Fecha]; | ||
+ | [Remitente] {{PR|es}} {{T|vinculo}} | ||
+ | -{{AT|vinculo}}.{{AT|definicion}} = [Tercero]; | ||
+ | -{{AT|vinculo}}.{{AT|etiqueta}} = [Datos generales].[Nombre/Razón social] + {{STR|" "}} + [Datos generales].[Apellidos]; | ||
+ | -{{AT|vinculo}}.{{AT|valores}} = $matriz([Fichero de terceros].[Contenido]); | ||
+ | [Destinatario] {{PR|es}} {{T|texto}} | ||
+ | {{PR|fin}} | ||
+ | {{PR|fin}} | ||
+ | |||
+ | Como podrás observar, cambiamos el tipo del campo '''Remitente''' de {{T|texto}} a {{T|vinculo}}. Los tres atributos que vienen a continuación nos permiten configurar el comportamiento del {{T|vinculo}}: | ||
+ | :*El atributo {{AT|vinculo.definicion}} indica con qué tipo de [[Contenedores|contenedor]] puede establecerse el vínculo. En este caso indicamos que vincula con un objeto de tipo '''Tercero'''. | ||
+ | :*En el atributo {{AT|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 {{AT|vinculo.valores}} indicamos la fuente de datos de la cuál obtendremos todos los [[Contenedores|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 {{T|coleccion}} y {{T|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 ;). | ||
+ | |||
+ | <center> | ||
+ | {| | ||
+ | |align="center" |[[Imagen:Figura 12.jpg|thumb|250px|Cuadro de búsqueda para vincular. Este cuadro se abre al hacer clic en el icono vincular del campo Remitente.]] | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | 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 {{RE|enumerado}} son una buena opción. | ||
+ | |||
+ | [Departamentos] {{PR|es}} {{RE|enumerado}} | ||
+ | {{AT|valores}} | ||
+ | {{STR|"Secretaría"}}, | ||
+ | {{STR|"Administración"}}, | ||
+ | {{STR|"Contabilidad"}}, | ||
+ | {{STR|"Personal"}}, | ||
+ | {{STR|"Dirección"}} | ||
+ | {{PR|fin}} | ||
+ | |||
+ | Un {{RE|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 {{RE|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: | ||
+ | |||
+ | {{PR|tipo}} [Entrada] {{PR|es}} {{RE|contenedor}} | ||
+ | [Datos generales] {{PR|es}} {{T|formulario}} | ||
+ | [Número] {{PR|es}} {{T|timbre}} | ||
+ | -{{AT|certificado}}.{{AT|subsecuencia}}.{{AT|valor}} = $Copiartexto($texto($Año($Hoy)), 3, 2); | ||
+ | -{{AT|certificado}}.{{AT|valor}} = [&Valor_subsecuencia] + {{STR|"/"}} + [&Valor_secuencia]; | ||
+ | -{{AT|certificado}}.{{AT|secuencia}}.{{AT|nombre}} = {{STR|"STR$ENTRADA"}; | ||
+ | -{{AT|certificado}}.{{AT|secuencia}}.{{AT|longitud}} = 4; | ||
+ | [Fecha] {{PR|es}} {{T|fecha}} | ||
+ | -{{AT|edicion}}.{{AT|modo}} = copia; | ||
+ | -{{AT|edicion}}.{{AT|valor}} = [Número].[&Fecha]; | ||
+ | [Remitente] {{PR|es}} {{T|vinculo}} | ||
+ | -{{AT|vinculo}}.{{AT|definicion}} = [Tercero]; | ||
+ | -{{AT|vinculo}}.{{AT|etiqueta}} = [Datos generales].[Nombre/Razón social] + {{STR|" "}} + [Datos generales].[Apellidos]; | ||
+ | -{{AT|vinculo}}.{{AT|valores}} = $matriz([Fichero de terceros].[Contenido]); | ||
+ | [Destinatario] {{PR|es}} {{T|texto}} | ||
+ | -{{AT|edicion}}.{{AT|valores}} = $matriz([Departamentos]); | ||
+ | {{PR|fin}} | ||
+ | {{PR|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:_Libros_y_registro_de_entrada_y_salida|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 {{T|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. | ||
+ | |||
+ | |||
+ | {{PR|tipo}} [Entrada] {{PR|es}} {{RE|contenedor}} | ||
+ | [Datos generales] {{PR|es}} {{T|formulario}} | ||
+ | [Número] {{PR|es}} {{T|timbre}} | ||
+ | -{{AT|certificado}}.{{AT|subsecuencia}}.{{AT|valor}} = $Copiartexto($texto($Año($Hoy)), 3, 2); | ||
+ | -{{AT|certificado}}.{{AT|valor}} = [&Valor_subsecuencia] + {{STR|"/"}} + [&Valor_secuencia]; | ||
+ | -{{AT|certificado}}.{{AT|secuencia}}.{{AT|nombre}} = {{STR|"STR$ENTRADA"}}; | ||
+ | -{{AT|certificado}}.{{AT|secuencia}}.{{AT|longitud}} = 4; | ||
+ | [Fecha] {{PR|es}} {{T|fecha}} | ||
+ | -{{AT|edicion}}.{{AT|modo}} = copia; | ||
+ | -{{AT|edicion}}.{{AT|valor}} = [Número].[&Fecha]; | ||
+ | [Remitente] {{PR|es}} {{T|vinculo}} | ||
+ | -{{AT|vinculo}}.{{AT|definicion}} = [Tercero]; | ||
+ | -{{AT|vinculo}}.{{AT|etiqueta}} = [Datos generales].[Nombre/Razón social] + {{STR|" "}} + [Datos generales].[Apellidos]; | ||
+ | -{{AT|vinculo}}.{{AT|valores}} = $matriz([Fichero de terceros].[Contenido]); | ||
+ | [Destinatario] {{PR|es}} {{T|texto}} | ||
+ | -{{AT|edicion}}.{{AT|valores}} = $matriz([Departamentos]); | ||
+ | [Documentación presentada] {{PR|es}} {{T|tabla}} | ||
+ | [Documento] {{PR|es}} {{T|texto}} | ||
+ | {{PR|fin}} | ||
+ | {{PR|fin}} | ||
+ | {{PR|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. | ||
+ | |||
+ | <center> | ||
+ | {| | ||
+ | |align="center" |[[Imagen:Figura 13.jpg|thumb|250px|Entrada con la tabla de Documentación presentada]] | ||
+ | |} | ||
+ | </center> | ||
+ | |||
+ | ==¿Qué hemos aprendido?== | ||
+ | :*En ODL todas las definiciones deben declararse antes de su uso. | ||
+ | :*Se pueden establecer vínculos entre [[Contenedores|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 {{AT|apariencia.desplegable}} permite controlar que el conjunto de valores especificado en el atributo {{AT|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 {{AT|edicion.seleccion}} permite controlar que un campo de tipo {{T|texto}} sólo pueda tomar alguno de los valores especificados en el atributo {{AT|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== | ||
+ | |||
+ | :*[[Tarea_D:_Validar_la_introducción_de_datos|Tarea D: Validar la introducción de datos]] | ||
+ | |||
+ | ==Véase también== | ||
+ | |||
+ | :*[[Tarea_A:_Libros_y_registro_de_entrada_y_salida|Tarea A: Libros y registro de entrada y salida]] | ||
+ | :*[[Tarea_B:_Mejorando_la_numeración_del_registro|Tarea B: Mejorando la numeración del registro]] | ||
+ | :*[[Tarea_E:_Utilizar_el_registro_como_un_almacén_de_documentación|Tarea E: Utilizar el registro como un almacén de documentación]] | ||
+ | :*[[Tarea_F:_Abriendo_el_registro_al_resto_de_las_oficinas|Tarea F: Abriendo el registro al resto de las oficinas]] | ||
+ | :*[[Tarea_G:_Evitando_la_replicación_de_código|Tarea G: Evitando la replicación de código]] | ||
+ | :*[[Tarea_H:_Emitir_certificados_de_documentación|Tarea H: Emitir certificados de documentación]] | ||
+ | :*[[Tarea_I:_Creando_una_oficina_sin_papeles|Tarea I: Creando una oficina sin papeles]] | ||
+ | :*[[Tarea_J:_Importar_la_base_de_datos_de_terceros_de_otra_aplicación|Tarea J: Importar la base de datos de terceros de otra aplicación]] |
Revisión actual del 10:22 4 ago 2009
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.
- 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.
Contenido
- 1 Definiendo un tipo "Tercero"
- 2 Crear un "Fichero de terceros"
- 3 Ubicar nuestro "Fichero de terceros" en el "Registro"
- 4 Establecer una relación entre "Entrada" y "Tercero" mediante un campo vínculo
- 5 ¿Qué es un enumerado? Añadiendo un "Destinatario" a las "Entradas"
- 6 ¿Y la documentación presentada? Introducir un campo tabla al formulario
- 7 ¿Qué hemos aprendido?
- 8 Ejercicios
- 9 Siguiente tarea
- 10 Véase también
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.
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 entrecoleccion
ymatriz
con la función $matriz.
- El atributo
Con estas seis líneas ya habremos establecido la relación entre Entrada y Tercero.
(Compila, actualiza y prueba ;).
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.
¿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 atributoedicion.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 tipotexto
sólo pueda tomar alguno de los valores especificados en el atributoedicion.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
- Tarea A: Libros y registro de entrada y salida
- Tarea B: Mejorando la numeración del registro
- Tarea E: Utilizar el registro como un almacén de documentación
- Tarea F: Abriendo el registro al resto de las oficinas
- Tarea G: Evitando la replicación de código
- Tarea H: Emitir certificados de documentación
- Tarea I: Creando una oficina sin papeles
- Tarea J: Importar la base de datos de terceros de otra aplicación