Diferencia entre revisiones de «Tarea B: Mejorando la numeración del registro»

De Egeasy
Saltar a: navegación, buscar
(Véase también)
 
(No se muestran 102 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
 +
[[Desarrollar_con_egeasy_paso_a_paso|Desarrollar con egeasy paso a paso]]
 +
 
El sistema anterior es suficiente para dar soporte para un Registro de entrada y salida, pero podemos mejorarlo bastante. Por ejemplo, ahora mismo tenemos que introducir el número de entrada a mano; por lo tanto, para cada vez que queramos hacer una nueva, tenemos que saber cuál era el último número. Parece un poco lioso, ¿no?. Lo mejor sería que la aplicación autonumerase la entrada cada vez que creásemos una nueva. Pues...¡manos a la obra!.
 
El sistema anterior es suficiente para dar soporte para un Registro de entrada y salida, pero podemos mejorarlo bastante. Por ejemplo, ahora mismo tenemos que introducir el número de entrada a mano; por lo tanto, para cada vez que queramos hacer una nueva, tenemos que saber cuál era el último número. Parece un poco lioso, ¿no?. Lo mejor sería que la aplicación autonumerase la entrada cada vez que creásemos una nueva. Pues...¡manos a la obra!.
  
tipo [Entrada] es contenedor
 
    [Datos generales] es formulario
 
        [Número] es timbre
 
            -certificado.valor = [&Valor_secuencia];
 
            -certificado.secuencia.nombre = "STR$ENTRADA";
 
            -certificado.secuencia.longitud = 4;
 
        [Fecha] es fecha
 
            -edicion.modo = copia;
 
            -edicion.valor = [Número].[&Fecha];
 
        ...
 
    fin
 
fin
 
  
Como podrás ver, hemos cambiado el tipo del campo #úmero de texto a timbre. En ODL, un campo timbre es un tipo de campo que tiene la propiedad de ser autonumerado. En el atributo certificado.valor especificamos el valor que aparecerá en el campo #úmero cuando la entrada se autonumere. En el atributo certificado.secuencia.nombre especificamos el nombre de la secuencia en la base de datos. Por último, en el atributo certificado.secuencia.longitud especificamos cuántos dígitos queremos que tenga la secuencia. En nuestro ejemplo, al poner longitud 4, el primer número será 0001, el segundo 0002, etc. También, hemos cambiado el tipo del campo Fecha de texto a fecha. Además, hemos configurado este campo para que tome la fecha en que se numera el objeto. ¿Cómo? El atributo edicion permite configurar diversas opciones de comportamiento para los campos de un formulario (no importa de qué tipo sean). Al campo fecha le asignamos valor mediante las declaraciones edicion.modo y edicion.valor.
+
__TOC__
 +
 
 +
==Autonumerar "Entradas". Definición del campo timbre==
 +
Como podrás ver, hemos cambiado el tipo del campo '''Número''' de {{T|texto}} a {{T|timbre}}. En ODL, un campo {{T|timbre}} es un tipo de campo que tiene la propiedad de ser autonumerado.
 +
 
 +
{{PR|tipo}} [Entrada] {{PR|es}} {{RE|contenedor}}
 +
    [Datos generales] {{PR|es}} {{T|formulario}}
 +
        [Número] {{PR|es}} {{T|timbre}}
 +
            -{{AT|certificado}}.{{AT|valor}} = [&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|texto}}
 +
        [Destinatario] {{PR|es}} {{T|texto}}
 +
    {{PR|fin}}
 +
{{PR|fin}}
 +
 
 +
En el atributo {{AT|certificado.valor}} especificamos el valor que aparecerá en el campo '''Número''' cuando la entrada se autonumere.
 +
 
 +
En el atributo {{AT|certificado.secuencia.nombre}} especificamos el nombre de la secuencia en la base de datos.
 +
 
 +
Por último, en el atributo {{AT|certificado.secuencia.longitud}} especificamos cuántos dígitos queremos que tenga la secuencia. En nuestro ejemplo, al poner longitud 4, el primer número será 0001, el segundo 0002, etc.
 +
 
 +
También, hemos cambiado el tipo del campo '''Fecha''' de {{T|texto}} a {{T|fecha}}. Además, hemos configurado este campo para que tome la fecha en que se numera el objeto. ¿Cómo? El atributo edicion permite configurar diversas opciones de comportamiento para los campos de un formulario (no importa de qué tipo sean). Al campo fecha le asignamos valor mediante las declaraciones {{AT|edicion.modo}} y {{AT|edicion.valor}}.
 +
 
 +
==Modos de edición de un campo==
 
En ODL, un campo de un formulario puede tener cuatro modos de edición:
 
En ODL, un campo de un formulario puede tener cuatro modos de edición:
Página 11 de 32
+
 
· normal: es el modo de edición por defecto. Permite que los usuarios editen los
+
:*'''normal''': es el modo de edición por defecto. Permite que los usuarios editen los campos libremente.
campos libremente.
+
:*'''copia''': especifica que el valor del campo se recalcula cuando cambia el valor de otros campos, de acuerdo a la expresión indicada en el atributo {{AT|edicion.valor}}.
· copia: especifica que el valor del campo se recalcula cuando cambiar el valor de
+
:*'''sugerencia''': especifica que el valor se calcula en base al valor de otros campos, de acuerdo a la expresión indicada en el atributo {{AT|edicion.valor}}, pero sólo cuando lo desea el usuario. El modo copia y sugerencia son muy parecidos; la diferencia radica en que el primero es automático y el segundo bajo petición del usuario.
otros campos, de acuerdo a la expresión indicada en el atributo edicion.valor.
+
:*'''referencia''': tiene el mismo comportamiento que un campo de copia, con la diferencia de que este campo es de sólo lectura y no se almacena en el sistema; se utiliza únicamente para mostrar datos dinámicos al usuario.
· sugerencia: especifica que el valor se calcula en base al valor de otros campos,
+
 
de acuerdo a la expresión indicada en el atributo edicion.valor, pero sólo
+
==Relación entre campo fecha y campo timbre==
cuando lo desea el usuario. El modo copia y sugerencia son muy parecidos; la
+
En el ejemplo anterior, al campo '''Fecha''' se le asigna la fecha actual cuando cambia el valor del campo '''Número''' (la fecha la obtenemos a partir de la propiedad Fecha que tienen los campos timbres, que nos devuelven la fecha en la que fue emitido el timbre).
diferencia radica en que el primero es automático y el segundo bajo petición del
+
 
usuario.
+
· referencia: tiene el mismo comportamiento que un campo de copia, con la
+
diferencia que este campo es de sólo lectura y no se almacena en el sistema; se
+
utiliza únicamente para mostrar datos dinámicos al usuario.
+
En el ejemplo anterior, al campo Fecha se le asigna la fecha actual cuando cambia el
+
valor del campo #úmero (la fecha la obtenemos a partir de la propiedad Fecha que
+
tienen los campos timbres, que nos devuelven la fecha en la que fue emitido el timbre).
+
 
Compilamos, actualizamos y comprobamos los cambios.
 
Compilamos, actualizamos y comprobamos los cambios.
 +
 +
Para ello hacemos clic en el '''Libro de entradas''' y, a continuación, clic en Nuevo.
 +
 +
<center>
 +
{|
 +
|align="center" |[[Imagen:Figura 7.jpg|thumb|250px|Formulario de entrada con el campo timbre]]
 +
|}
 +
</center>
 +
 +
Observa que el campo '''Número''' aparece ahora con un triángulo al final y que el campo '''Fecha''' aparece con dos botones. Uno con un cuadrado dentro de otro y otro con un desplegable. Haciendo clic en el triángulo al final del campo '''Número''' obtendrás un resultado similar al siguiente.
 +
 +
<center>
 +
{|
 +
|align="center" |[[Imagen:Figura 8.jpg|thumb|250px|Entrada numerada mediante el campo timbre]]
 +
|}
 +
</center>
 +
 +
El campo '''Fecha''' toma automáticamente la fecha actual y el campo '''Número''' aparece con el texto '''Numerado'''. '''Al guardar obtendrá el valor'''. Guardando la entrada, el sistema asignará un número definitivo a la entrada y hará el campo '''Número''' no editable, de modo que garantizará que ese número es único y no se puede cambiar.
 +
 +
==Añadir una subsecuencia al campo timbre==
 +
Supongamos ahora que nuestro cliente quiere que las numeraciones de entrada y salida se reinicien cada año y que, además, los dos dígitos del año deben aparecer antes del número.
 +
 +
Para lograrlo, debemos definir una subsecuencia para el campo {{T|timbre}} y hacer que dependa del año actual. De esta forma, cada vez que cambie el valor de la subsecuencia, se reiniciará la numeración.
 +
 +
{{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|texto}}
 +
        [Destinatario] {{PR|es}} {{T|texto}}
 +
    {{PR|fin}}
 +
{{PR|fin}}
 +
 +
Mediante la sentencia '''$Copiartexto($Texto($Año($Hoy)), 3, 2)''' obtenemos los dos últimos dígitos del año actual. Esta expresión se evaluará cada vez que se cree una nueva '''Entrada'''. Al cambiar el año, también cambiará el valor de la subsecuencia. Cuando esto ocurra, se reiniciará la numeración.
 +
 +
También hemos modificado el atributo {{AT|certificado.valor}} para que primero aparezca el valor de la subsecuencia (es decir, el año con dos dígitos), a continuación una barra (/) y, por último, el valor actual de la secuencia.
 +
 +
<blockquote style="background: #ffffcc; border: 1px solid black; padding: 1em;">
 +
 +
'''Funciones en ODL'''<br/><br/>
 +
 +
'''$Copiartexto''', '''$Texto''', '''$Año''' y '''$Hoy''' son funciones del lenguaje. '''$Hoy''' devuelve la fecha actual; '''$Año''' recibe como entrada una fecha y devuelve un entero con el año; la función '''$texto''' convierte el parámetro de entrada en una cadena de texto; por último, la función '''$Copiartexto''' recibe como entrada una texto y dos enteros, y devuelve una subcadena.
 +
 +
ODL ofrece una amplia biblioteca de funciones que permiten realizar diversas operaciones sobre el sistema de información que van de tareas simples, como la conversión de tipos, hasta operaciones más complejas, como lanzar sentencias SQL contra la base de datos y tratar el resultado devuelto.
 +
 +
En el documento Funciones de librería encontrarás una descripción detallada de todas las funciones que ofrece el lenguaje.</blockquote>
 +
 +
Compila y actualiza. Al crear y guardar una nueva entrada podrás ver cómo pone primero los dos dígitos del año. Prueba a cambiar la fecha del servidor para poner otro año. Verás cómo la numeración se reinicia.
 +
 +
<center>
 +
{|
 +
|align="center" |[[Imagen:Figura 9.jpg|thumb|250px|Entrada con subsecuencia]]
 +
|}
 +
</center>
 +
 +
==¿Qué hemos aprendido?==
 +
:*En ODL existen cuatro modos de edición para los campos de un formulario: normal, copia, sugerencia y referencia. Estos modos de edición permiten automatizar la asignación de valores a los campos.
 +
:*El modo referencia sólo sirve para mostrar datos dinámicos al usuario y no tiene persistencia en el sistema.
 +
:*El campo {{T|timbre}} nos permite definir campos autonumerados. Mediante el campo {{AT|certificado.valor}} especificamos el texto que aparecerá cuando el campo se autonumere.
 +
:*Para hacer que la numeración se reinicie en un campo timbre, debemos definir una subsecuencia a través del atributo {{AT|certificado.subsecuencia.valor}}.
 +
:*ODL ofrece una amplia librería de funciones para manipular el sistema de información, y todas se invocan precedidas del carácter dólar ($).
 +
 +
==Ejercicios==
 +
:*Realiza en el objeto '''Salida''' las mismas modificaciones que hemos realizado en '''Entrada'''. Ten en cuenta que el valor del atributo {{AT|certificado.secuencia.nombre}} tiene que ser diferente para que las numeraciones sean independientes.
 +
:*El atributo {{AT|edicion.regla}} permite controlar cuando un campo es editable. Debes asignarle una expresión lógica. Si la expresión se evalúa a verdadero, el campo podrá editarse. Si la expresión se evalúa a falso, el campo no se podrá editar. Añade la sentencia edicion.regla = falso a la definición del campo '''Fecha''' y prueba a ver qué ocurre.
 +
:*El atributo {{AT|certificado.estado}} de un campo timbre permite bloquear el objeto completo una vez el campo se haya numerado, de modo que el usuario no pueda modificar nada. Prueba añadir este atributo al campo '''Número''' de la '''Entrada''' (tienes que añadir certificado.estado = protegido) y comprueba qué es lo que ocurre.
 +
:*¿Y si una vez protegido el objeto '''Entrada''' nos interesa editar alguno de los campos del formulario? El atributo {{AT|edicion.proteger}} nos permite indicar que un campo es editable. Este atributo tiene sentido cuando el campo timbre está protegido mediante el atributo {{AT|certificado.estado}}, y por consiguiente, la totalidad de los campos del objeto. Manteniendo el atributo certificado.estado = protegido del campo timbre , prueba a insertar edicion.proteger = falso en el campo '''Destinatario'''. Crea una nueva '''Entrada''', rellena sus campos y guarda el objeto. Vuelve a abrir el objeto creado, e intenta editar el campo '''Destinatario'''. Debería poder editarse.
 +
 +
==Siguiente tarea==
 +
 +
:*[[Tarea_C:_Evolucionando_la_arquitectura_del_registro|Tarea C: Evolucionando 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_D:_Validar_la_introducción_de_datos|Tarea D: Validar la introducción de datos]]
 +
:*[[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

El sistema anterior es suficiente para dar soporte para un Registro de entrada y salida, pero podemos mejorarlo bastante. Por ejemplo, ahora mismo tenemos que introducir el número de entrada a mano; por lo tanto, para cada vez que queramos hacer una nueva, tenemos que saber cuál era el último número. Parece un poco lioso, ¿no?. Lo mejor sería que la aplicación autonumerase la entrada cada vez que creásemos una nueva. Pues...¡manos a la obra!.


Autonumerar "Entradas". Definición del campo timbre

Como podrás ver, hemos cambiado el tipo del campo Número de texto a timbre. En ODL, un campo timbre es un tipo de campo que tiene la propiedad de ser autonumerado.

tipo [Entrada] es contenedor
   [Datos generales] es formulario
       [Número] es timbre
           -certificado.valor = [&Valor_secuencia];
           -certificado.secuencia.nombre = "STR$ENTRADA";
           -certificado.secuencia.longitud = 4;
       [Fecha] es fecha
           -edicion.modo = copia;
           -edicion.valor = [Número].[&Fecha];
       [Remitente] es texto
       [Destinatario] es texto
   fin
fin

En el atributo certificado.valor especificamos el valor que aparecerá en el campo Número cuando la entrada se autonumere.

En el atributo certificado.secuencia.nombre especificamos el nombre de la secuencia en la base de datos.

Por último, en el atributo certificado.secuencia.longitud especificamos cuántos dígitos queremos que tenga la secuencia. En nuestro ejemplo, al poner longitud 4, el primer número será 0001, el segundo 0002, etc.

También, hemos cambiado el tipo del campo Fecha de texto a fecha. Además, hemos configurado este campo para que tome la fecha en que se numera el objeto. ¿Cómo? El atributo edicion permite configurar diversas opciones de comportamiento para los campos de un formulario (no importa de qué tipo sean). Al campo fecha le asignamos valor mediante las declaraciones edicion.modo y edicion.valor.

Modos de edición de un campo

En ODL, un campo de un formulario puede tener cuatro modos de edición:

  • normal: es el modo de edición por defecto. Permite que los usuarios editen los campos libremente.
  • copia: especifica que el valor del campo se recalcula cuando cambia el valor de otros campos, de acuerdo a la expresión indicada en el atributo edicion.valor.
  • sugerencia: especifica que el valor se calcula en base al valor de otros campos, de acuerdo a la expresión indicada en el atributo edicion.valor, pero sólo cuando lo desea el usuario. El modo copia y sugerencia son muy parecidos; la diferencia radica en que el primero es automático y el segundo bajo petición del usuario.
  • referencia: tiene el mismo comportamiento que un campo de copia, con la diferencia de que este campo es de sólo lectura y no se almacena en el sistema; se utiliza únicamente para mostrar datos dinámicos al usuario.

Relación entre campo fecha y campo timbre

En el ejemplo anterior, al campo Fecha se le asigna la fecha actual cuando cambia el valor del campo Número (la fecha la obtenemos a partir de la propiedad Fecha que tienen los campos timbres, que nos devuelven la fecha en la que fue emitido el timbre).

Compilamos, actualizamos y comprobamos los cambios.

Para ello hacemos clic en el Libro de entradas y, a continuación, clic en Nuevo.

Formulario de entrada con el campo timbre

Observa que el campo Número aparece ahora con un triángulo al final y que el campo Fecha aparece con dos botones. Uno con un cuadrado dentro de otro y otro con un desplegable. Haciendo clic en el triángulo al final del campo Número obtendrás un resultado similar al siguiente.

Entrada numerada mediante el campo timbre

El campo Fecha toma automáticamente la fecha actual y el campo Número aparece con el texto Numerado. Al guardar obtendrá el valor. Guardando la entrada, el sistema asignará un número definitivo a la entrada y hará el campo Número no editable, de modo que garantizará que ese número es único y no se puede cambiar.

Añadir una subsecuencia al campo timbre

Supongamos ahora que nuestro cliente quiere que las numeraciones de entrada y salida se reinicien cada año y que, además, los dos dígitos del año deben aparecer antes del número.

Para lograrlo, debemos definir una subsecuencia para el campo timbre y hacer que dependa del año actual. De esta forma, cada vez que cambie el valor de la subsecuencia, se reiniciará la numeración.

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 texto
       [Destinatario] es texto
   fin
fin

Mediante la sentencia $Copiartexto($Texto($Año($Hoy)), 3, 2) obtenemos los dos últimos dígitos del año actual. Esta expresión se evaluará cada vez que se cree una nueva Entrada. Al cambiar el año, también cambiará el valor de la subsecuencia. Cuando esto ocurra, se reiniciará la numeración.

También hemos modificado el atributo certificado.valor para que primero aparezca el valor de la subsecuencia (es decir, el año con dos dígitos), a continuación una barra (/) y, por último, el valor actual de la secuencia.

Funciones en ODL

$Copiartexto, $Texto, $Año y $Hoy son funciones del lenguaje. $Hoy devuelve la fecha actual; $Año recibe como entrada una fecha y devuelve un entero con el año; la función $texto convierte el parámetro de entrada en una cadena de texto; por último, la función $Copiartexto recibe como entrada una texto y dos enteros, y devuelve una subcadena.

ODL ofrece una amplia biblioteca de funciones que permiten realizar diversas operaciones sobre el sistema de información que van de tareas simples, como la conversión de tipos, hasta operaciones más complejas, como lanzar sentencias SQL contra la base de datos y tratar el resultado devuelto.

En el documento Funciones de librería encontrarás una descripción detallada de todas las funciones que ofrece el lenguaje.

Compila y actualiza. Al crear y guardar una nueva entrada podrás ver cómo pone primero los dos dígitos del año. Prueba a cambiar la fecha del servidor para poner otro año. Verás cómo la numeración se reinicia.

Entrada con subsecuencia

¿Qué hemos aprendido?

  • En ODL existen cuatro modos de edición para los campos de un formulario: normal, copia, sugerencia y referencia. Estos modos de edición permiten automatizar la asignación de valores a los campos.
  • El modo referencia sólo sirve para mostrar datos dinámicos al usuario y no tiene persistencia en el sistema.
  • El campo timbre nos permite definir campos autonumerados. Mediante el campo certificado.valor especificamos el texto que aparecerá cuando el campo se autonumere.
  • Para hacer que la numeración se reinicie en un campo timbre, debemos definir una subsecuencia a través del atributo certificado.subsecuencia.valor.
  • ODL ofrece una amplia librería de funciones para manipular el sistema de información, y todas se invocan precedidas del carácter dólar ($).

Ejercicios

  • Realiza en el objeto Salida las mismas modificaciones que hemos realizado en Entrada. Ten en cuenta que el valor del atributo certificado.secuencia.nombre tiene que ser diferente para que las numeraciones sean independientes.
  • El atributo edicion.regla permite controlar cuando un campo es editable. Debes asignarle una expresión lógica. Si la expresión se evalúa a verdadero, el campo podrá editarse. Si la expresión se evalúa a falso, el campo no se podrá editar. Añade la sentencia edicion.regla = falso a la definición del campo Fecha y prueba a ver qué ocurre.
  • El atributo certificado.estado de un campo timbre permite bloquear el objeto completo una vez el campo se haya numerado, de modo que el usuario no pueda modificar nada. Prueba añadir este atributo al campo Número de la Entrada (tienes que añadir certificado.estado = protegido) y comprueba qué es lo que ocurre.
  • ¿Y si una vez protegido el objeto Entrada nos interesa editar alguno de los campos del formulario? El atributo edicion.proteger nos permite indicar que un campo es editable. Este atributo tiene sentido cuando el campo timbre está protegido mediante el atributo certificado.estado, y por consiguiente, la totalidad de los campos del objeto. Manteniendo el atributo certificado.estado = protegido del campo timbre , prueba a insertar edicion.proteger = falso en el campo Destinatario. Crea una nueva Entrada, rellena sus campos y guarda el objeto. Vuelve a abrir el objeto creado, e intenta editar el campo Destinatario. Debería poder editarse.

Siguiente tarea

Véase también