Una rutina típica que suele tener todo programa Cobol es la de recuperación de la fecha y la hora actual del sistema. Se trata de una información muy útil generalmente precisada para su inclusión en los informes solicitados por el usuario o para indicar la fecha de actualización de los datos en las tablas DB2 (TIMESTAMP).
Aunque hay varias alternativas, una forma estándar de obtener la fecha en Cobol es mediante la utilización de los comandos CICS ASKTIME y FORMATTIME. Con unas pocas operaciones, estas instrucciones nos permiten disponer de una variable fecha (y hora) formateada según las necesidades de nuestra aplicación.
A continuación, vamos a ver un ejemplo en Cobol de cómo se podría recuperar la fecha y dejarla cargada en una variable de trabajo. Supongamos, en primer lugar, que tenemos definidas las siguientes variables en nuestra WORKING-STORAGE SECTION.
05 W-FECHA-HORA-SISTEMA PIC S9(15) COMP-3 VALUE 0.
05 W-ANNO-SISTEMA PIC S9(8) COMP VALUE 0.
05 W-MES-SISTEMA PIC S9(8) COMP VALUE 0.
05 W-DIA-SISTEMA PIC S9(8) COMP VALUE 0.
05 W-HORA-SISTEMA.
10 W-HH-SISTEMA PIC 9(2) VALUE 0.
10 FILLER PIC X VALUE '.'.
10 W-MM-SISTEMA PIC 9(2) VALUE 0.
10 FILLER PIC X VALUE '.'.
10 W-SS-SISTEMA PIC 9(2) VALUE 0.
05 W-FECHA-SISTEMA.
10 W-ANNO PIC 9(4) VALUE 0.
10 FILLER PIC X VALUE '-'.
10 W-MES PIC 9(2) VALUE 0.
10 FILLER PIC X VALUE '-'.
10 W-DIA PIC 9(2) VALUE 0.
05 W-TIMESTAMP.
10 W-FECHA-SYS PIC X(10) VALUE SPACES.
10 FILLER PIC X(1) VALUE '-'.
10 W-HORA-SYS PIC X(8) VALUE SPACES.
10 FILLER PIC X(1) VALUE '-'.
10 W-MILISEG-SYS PIC 9(6) VALUE 0.
La idea es recuperar la fecha del CICS en el parámetro W-FECHA-HORA-SISTEMA y, tras las operaciones pertinentes, dejar preparada la fecha/hora del sistema en W-TIMESTAMP. Esta última variable podrá ser utilizada para provisionar los campos TIMESTAMP de los registros de las tablas DB2 que sean modificados por nuestro programa.
A continuación, mostramos un código que podría ser incluido en una rutina Cobol para realizar la transformación comentada. Obviamente, no es la única solución que podría ser implementada.
EXEC CICS
ASKTIME
ABSTIME(W-FECHA-HORA-SISTEMA)
END-EXEC
EXEC CICS
FORMATTIME
ABSTIME(W-FECHA-HORA-SISTEMA)
YEAR(W-ANNO-SISTEMA)
MONTHOFYEAR(W-MES-SISTEMA)
DAYOFMONTH (W-DIA-SISTEMA)
TIME(W-HORA-SISTEMA)
TIMESEP('.')
END-EXEC.
MOVE W-DIA-SISTEMA TO W-DIA
MOVE W-MES-SISTEMA TO W-MES
MOVE W-ANNO-SISTEMA TO W-ANNO.
MOVE W-FECHA-SISTEMA TO W-FECHA-SYS
MOVE W-HORA-SISTEMA TO W-HORA-SYS
MOVE W-FECHA-HORA-SISTEMA TO W-MILISEG-SYS.
Una vez visto el código completo, pasamos a detallar un poco cuál sería el objetivo de cada uno de los bloques desarrollados.
1º) En primer lugar, se emplea el comando CICS ASKTIME para recuperar la fecha y hora actual del sistema.
2º) La cláusula ABSTIME permite almacenar (en una variable) la fecha del sistema con un formato conocido como tiempo absoluto. Dicho formato especifica la cantidad de milisegundos transcurridos desde el inicio del año 1900 hasta el momento actual.
3º) El comando FORMATTIME transforma una fecha de tiempo absoluto en una fecha y hora con el formato que deseemos.
4º) En el ejemplo anterior se obtienen varios elementos de la variable de tiempo absoluto. Con YEAR, MONTHOFYEAR y DAYOFMONTH se extraen de ella el año, el mes y el día, respectivamente. Finalmente, con TIME extraemos la hora del reloj y con TIMESEP especificamos el separador deseado entre horas, minutos y segundos.
5º) A continuación, transferimos los datos extraídos de día, mes y año a una variable W-FECHA-SISTEMA donde guardaremos la información con el formato que deseemos.
6º) Finalmente, movemos la fecha del sistema, la hora del sistema y el tiempo absoluto en milisegundos a una variable W-TIMESTAMP. Esta variable será la que se use para almacenar el TIMESTAMP en los registros que nuestro programa Cobol precise modificar en las tablas DB2.
Aunque aparentemente parecen demasiados pasos para la elaboración de una rutina tan básica, la realidad es que, una vez codificada, podremos ir copiándola sin más de un programa a otro. Se trata de un párrafo que no necesitará modificaciones adicionales, salvo que queramos cambiar el formato de la fecha obtenida.
Como vemos, aquí tenemos un método estándar para crear una fecha/hora de sistema y para disponer de un TIMESTAMP en los programas Cobol. La primera funcionalidad es muy útil para mostrar información a los usuarios y la segunda resulta imprescindible si queremos mantener una trazabilidad de las modificaciones que se vayan realizando en las tablas DB2. Si todavía no estáis de acuerdo con ello, os aseguramos que tarde o temprano lo estaréis.
Pues nada, eso es todo lo que queríamos comentaros por hoy. Esperamos que esta rutina de captura de fecha de sistema os sea útil y que podáis emplearla frecuentemente en vuestros propios objetos.
Saludos.
Muchas gracias por tu aportación José.
ResponderEliminarMuy clara y perfectamente ejemplificada.
Me sirvió para construir una solución muy eficiente.
Muchas gracias por tu aportación José.
ResponderEliminarMuy clara y perfectamente ejemplificada.
Me sirvió para construir una solución muy eficiente.
Como se le puede sumar minutos al timestamp ?
ResponderEliminarComo se puede sumar minutos al timestamp ??
ResponderEliminar