|
 |
 |
Lo que fue el año 2.000
página(s) : 2/2 (4083 palabras totales en este texto) (13094 Lecturas) 
DATA DIVISION. (Variables)
Para todo el proceso he creado 5 rutinas pequeñas que serán llamadas tantas veces como sea necesario
desde los programas.
Puesto que van a ir en todos los
programas os aconsejo que las pongais en un archivo y luego copy en todos los programas, si ya tenis algún archivo
pequeño que realice alguna tarea común y sea llamado desde los programas, pues lo implementais en éste y os
evitais poner otra copy .
Las variables necesarias para aplicar las
rutinas son las siguientes:
WORKING-STORAGE SECTION.
........
........
01 FECA PIC 9(6). (fecha 6 dígitos en castellano
DDMMAA).
01 FECO REDEFINES FECA.
02 FDIA PIC 99. (dia)
02 FMES PIC 99. (mes)
02 FANO PIC 99. (año)
01 FESPA
PIC 9(8). (fecha 8 dígitos en castellano DDMMAAAA).
01 FEXPA REDEFINES FESPA.
02 FPDIA PIC 99. (dia)
02 FPMES PIC 99. (mes)
02 FPSIG PIC 99. (siglo)
02 FPANO PIC 99. (año)
01 FEREV
PIC 9(8). (fecha 8 dígitos en inglés SSAAMMDD).
01 FEREX REDEFINES FEREV.
02 FRSIG PIC 99. (dia)
02 FRANO PIC 99. (mes)
02 FRMES PIC 99. (siglo)
02 FRDIA PIC 99. (año).
Si no utilizais
una Working común para todos vuestros programas, es conveniente introducir las variables
en un archivo y que sea llamado desde los programas dentro de la Working. Por supuesto los
nombre de las variables podeis cambiarlos, teniendo en cuenta cambiar también las
rutinas.
PROCEDURE DIVISION. (Rutinas)
A continuación os detallo las rutinas y una explicación de lo que hacen:
PROCEDURE
DIVISION.
........
........
A2000.
IF FANO < 90 MOVE 20 TO FPSIG FRSIG
ELSE MOVE 19 TO FPSIG
FRSIG.
MOVE FDIA TO FPDIA FRDIA.
MOVE FMES TO FPMES FRMES.
MOVE FANO TO FPANO FRANO. |
Esta rutina se encarga de adaptarnos una fecha de 6 dígitos con
formato DDMMAA a dos variables de 8 dígitos, FESPA en formato DDMMAASS y FEREV con
formato SSAAMMDD. (Comunmente llamo FESPA a un formato en castellano y a FEREV a uno en
inglés.
Observamos que la fecha que le damos siempres va en formato castellano DDMMAA. |
C2000.
MOVE FPDIA TO FRDIA.
MOVE FPMES TO FRMES.
MOVE FPANO TO FRANO.
MOVE FPSIG TO FRSIG. |
Partiendo de un formato de 8 dígitos en castellano y en la
variable FESPA, nos devuelve la variable FEREV con el formato inglés
SSAAMMDD. |
C2000R.
MOVE FRDIA TO FPDIA.
MOVE FRMES TO FPMES.
MOVE FRANO TO FPANO.
MOVE FRSIG TO FPSIG. |
Partiendo de un formato de 8 dígitos en inglés y en la variable
FEREV, nos devuelve la variable FESPA con el formato castellano
DDMMSSAA. |
DE8A6.
MOVE FPDIA TO FDIA.
MOVE FPMES TO FMES.
MOVE FPANO TO FANO. |
Partiendo de un formato de 8 dígitos en castellano y en la
variable FESPA, nos devuelve la variable FECA con el formato DDMMAA con 6 dígitos. |
DE8A6R.
MOVE FRDIA TO FDIA.
MOVE FRMES TO FMES.
MOVE FRANO TO FANO. |
Partiendo de un formato de 8 dígitos en inglés y en la variable
FEREV, nos devuelve la variable FECA con el formato DDMMAA con 6 dígitos. |
Ya veis que las rutinas son muy simples, pero si os acostumbrais, funcionan de maravilla.
El motivo de utilizar los dos formatos de fechas, es porque cuando el campo fecha de algún fichero
solo es informativo y no voy a operar con el lo pongo en formato castellano
DDMMSSAA, quizás no sea una buena opción pero como ya lo tenía así, no lo he cambiado. Si
utilizais siempre la fecha en formato inglés SSAAMMDD, os sobrarán algunas rutinas.
ANALISIS.
Llegados a éste punto, solo queda explicar los pasos y poner un sencillo ejemplo. Principalmente se
puede decir que tenemos dos pasos, la conversión de los archivos y la de los programas.
1. Conversión de archivos.
Para cada archivo generamos un pequeño programa que lea el archivo y lo genere en otro
con el campo fecha de 8 dígitos y el formato que hayamos elegido DDMMSSAA o
SSAAMMDD.
Movemos todos los campos de un fichero a otro y al campo fecha le aplicamos la primera
rutina la llamada A2000 , grabamos el nuevo registro y una vez concluido
cambiamos los nombres de los archivos.
IDENTIFICATION DIVISION.
PROGRAM-ID. CAMBIO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT ARCHIVOANTIGUO ASSIGN TO RANDOM
"ANTIGUO.DAT" ORGANIZATION INDEXED ACCESS DYNAMIC RECORD KEY
KEYANTIGUO.
SELECT ARCHIVONUEVO ASSIGN TO RANDOM "NUEVO.DAT" ORGANIZATION INDEXED
ACCESS DYNAMIC RECORD KEY KEYNUEVO.
DATA DIVISION.
FILE SECTION.
FD ARCHIVOANTIGUO BLOCK 8 RECORDS RECORD 64 CHARACTERS
LABEL RECORD STANDARD.
01 REGANTIGUO.
02 KEYANTIGUO.
03 ANTFECHA PIC 9(6). (formato
inglés AAMMDD)
03 ANTPRODUCTO PIC 9(4).
02 ANTKILOS PIC 9(8).
02 ANTPRECIO PIC 9(6).
02 FILLER PIC X(40).
FD ARCHIVONUEVO BLOCK 8 RECORDS
RECORD 64 CHARACTERS
LABEL RECORD STANDARD.
01 REGNUEVO.
02 KEYNUEVO.
03 NUEFECHA PIC 9(8). (formato
inglés SSAAMMDD).
03 NUEPRODUCTO PIC 9(4).
02 NUEKILOS PIC 9(8).
02 NUEPRECIO PIC 9(6).
02 FILLER PIC X(38).
WORKING-STORAGE SECTION.
COPY "variables_para_las_rutinas".
PROCEDURE DIVISION.
INICIO.
OPEN OUTPUT ARCHIVONUEVO CLOSE
ARCHIVONUEVO.
OPEN INPUT ARCHIVOANTIGUO I-O ARCHIVONUEVO.
UNO.
READ ARCHIVOANTIGUO NEXT RECORD AT END GO FIN.
MOVE ANTPRODUCTO TO NUEPRODUCTO.
MOVE ANTKILOS TO NUEKILOS.
MOVE ANTPRECIO TO NUEPRECIO.
MOVE ANTFECHA TO FECA MOVE FDIA TO VARIABLE_PIC 99.
MOVE FANO TO FDIA MOVE VARIABLE_PIC 99 TO FANO.
PERFORM A2000 MOVE FEREV TO NUEFECHA.
WRITE REGNUEVO INVALID KEY DISPLAY "CAMBIO MAL".
GO UNO.
FIN.
CLOSE ARCHIVONUEVO ARCHIVOANTIGUO.
STOP RUN.
COPY "rutinas".
Como veis es muy simple, he tenido que
cambiar el orden del campo NUEFECHA , porque la rutina espera el campo fecha de 6 dígitos en formato
DDMMAA.
Una vez terminado el proceso cambiamos el nombre a NUEVO.DAT por ANTIGUO.DAT
y también la FD correspondiente para que el campo fecha tenga 8 dígitos.
Al comienzo os dije que todo esto se hiciera en un directorio aparte para poder probarlo bien antes de ponerlo definitivamente,
por lo que ésta conversión no será valida hasta que la hagamos sobre los datos reales.
2. Conversión de programas.
Una vez concluida la conversión de los archivos, nos disponemos a la de los programas,
ésta será mas compleja cuanto mas utilicemos los campos de fecha. Como queremos seguir
manteniendo en pantalla la fecha a 6 dígitos, cada vez que se introduzca una y la hayamos
validado la movemos a la variable FECA y le pasamos la rutina A2000 , con lo que obtendremos las dos variables
FESPA y FEREV , en castellano y en inglés para moverlas donde queramos.
Asimismo, cuando queramos mostrar una fecha de un archivo guardada en 8 dígitos la movemos a las variables FESPA o FEREV
dependiendo del formato y le pasamos la rutina DE8A6 o DE8A6R respectivamente, devolviendonos la fecha en 6 dígitos en la
variable FECA, siempre en formato castellano DDMMAA dispuesta para ser mostrada. Cuando hayamos convertido todos los
programas y verificados con los archivos, estaremos dispuestos para hacerlo con los datos
reales y poner fin al problema del año 2.000.
Hemos llegado al final, solo queda recordaros que todo esto es lo que yo he hecho y os aseguro que me
funciona, habrá mas soluciones y mejores seguro. Si teneis alguna duda os podeis poner en
contacto conmigo.
En mi empresa tenemos unos 260 programas y 85 archivos en los que existen campos fecha y la conversión
definitiva tardó 3 horas y media, en la que logicamente ningún usuario pudo trabajar, ya
veis que fue poco tiempo comparado con los calentamientos de cabeza que nos vamos a
quitar.
Como final os voy a poner algunos consejos muy importantes:
- Todo debe de estar probado, reprobado y vuelto a probar antes de hacerlo definitivamente.
- Introduce albaranes o facturas o lo que sea con fechas de 1999 y 2000 para comprobar que realmente funciona y que con las fechas
se puede operar bien.
- Vuelve a compilar todos los programas en los que estén incluidos los archivos con el problema de la fecha y no se utilice el campo
fecha, ya que la FD ha cambiado y por lo tanto la posición interna de los campos.
Si habeis llegado hasta aquí, FELICIDADES y MUCHAS GRACIAS, eso es que
os ha interesado y ese era el fin de ésta página.
| (1/2) | |
|
|