Cobol en español
MANUALES
TEMATICOS
BASES DE DATOS
COBOL / WINDOWS
COBOL / UNIX
HISTORIA /DOCS
PROGRAMANDO-Dos
TRUCOS
AÑO 2.000
TEORIA POWCOB-3
PROG. POWCOB-3
TEORIA POWCOB-5
PROG. POWCOB-5
OCX-ESCOBOL
Año 2.000
TEMARIOLo que fue el año 2.000

Lo que fue el año 2.000

página(s) : 2/2
(4083 palabras totales en este texto)
(13094 Lecturas)   Versión Imprimible



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) Anterior |    Inicio de Página   
Sitio desarrollado con PHP-Nuke. Todos los Derechos Reservados.
PHP-Nuke es un Software Libre realizado con licencia GNU/GPL.
Página creada en Junio de 1.998, con el proposito de difundir el lenguaje Cobol en nuestra lengua.
Andres Montes [98/11]