Tarea B: Mejorando la numeración del registro
Construir una aplicación 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!.
Contenido
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 cambiar 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 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.
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 Entrada obtendrás un resultado similar al siguiente.
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.
¿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 campocertificado.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 atributocertificado.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.
- Realiza en el objeto Salida las mismas modificaciones que hemos realizado en Entrada. Ten en cuenta que el valor del atributo