lunes, 30 de mayo de 2011

Lo mejor de la semana: lunes 23 a domingo 29.

Vuelve a ser lunes (por desgracia^^) y toca hacer recuento de visitas de la última semana. Y ha ido muy bien! Más de 1000 visitas y 2600 páginas visitadas.
Y ahora a ver el top 10:

  1. Sort vol.2: OUTREC.
  2. WORKING-STORAGE: definiendo variables.
  3. Esquema de un programa cobol.
  4. Sort vol.1: SORT, INCLUDE.
  5. Programas con DB2 II: CURSOR.
  6. Comandos TSO vol.1: comandos del editor.
  7. Programas con DB2 I: SELECT, INSERT, UPDATE y DELETE.
  8. Consultiras
  9. Sort vol.5: SUM.
  10. Utilidades REXX II: editar fichero desde JCL.

Hoy empezamos la saga de "JCL Avanzado", aunque todavía quedan algunos artículos de la de "JCL Básico" para darlo por terminado.

Buena semana a todos : )

viernes, 27 de mayo de 2011

IBM vs Microsoft

La semana pasada felicitábamos a IBM por sus 100 años de vida y parece que no le sientan nada mal ya que ha superado en capitalización bursátil a su competidora Microsoft, algo que no conseguía desde hacía 15 años.

El valor en bolsa de IBM se eleva hasta los 205.270$ millones, comparado con los 203.750$ millones que vale el de Microsoft.

IBM es actualmente la mayor firma tecnológica del mundo por facturación, y en el último año se revalorizó un sólido 34,16 % en bolsa -comparado con la caída del 9,95 % de Microsoft-, y aumentó sus ganancias en 2010 hasta los 14.843$ millones, lo que supone el beneficio más alto jamás logrado por el gigante azul.

Este hecho recuerda a la reciente subida de Apple (hace un año), que con el lanzamiento de su tableta informática iPad logró un incremento del 38% en bolsa, con unas cifras de cotización de 308.070$ millones.

Noticia en iProfesional

jueves, 26 de mayo de 2011

CONSULTIRAS 10: "El que nace en COBOL...."

Si estás leyendo esto, es probable que sea porque eres programador COBOL o PL/I, y por si no lo sabes ya, este peculiar lenguaje te va a marcar de por vida...


(Pincha en la imagen para hacerla más grande)

miércoles, 25 de mayo de 2011

Comandos TSO vol.2

En este artículo continuamos con los comandos TSO, muy útiles tanto para codificar como para editar texto.
Para los que no lo hayan leído, podéis ver los comandos básicos en "Comandos TSO vol.1: Comandos del editor".

OCULTAR / MOSTRAR LINEAS

Ocultar líneas.
El comando para ocultar líneas es la letra 'X'.

Si tecleamos una X sobre la columna de la línea 11:
000010 Texto A
X00011 Texto B
000012 Texto C
000013 Texto D


Ocultaría la línea 11.
000010 Texto A
- - - - - - - - - - - - - - - - - 1 Line(s) not Displayed
000012 Texto C
000013 Texto D


Si tecleamos X2 sobre la columna de la línea 11:
000010 Texto A
X20011 Texto B
000012 Texto C
000013 Texto D


Ocultaría 2 líneas a partir de la linea 11 incluída.
000010 Texto A
- - - - - - - - - - - - - - - - - 2 Line(s) not Displayed
000013 Texto D


Ocultar bloques de líneas.
El comando para ocultar bloques de líneas es 'XX ... XX'.

Si tecleamos una XX ... XX sobre la columna de las líneas 11 y 12:
000010 Texto A
XX0011 Texto B
XX0012 Texto C
000013 Texto D


Ocultaría las líneas que haya enter el primer XX y el último (incluídas las líneas sobre las que hayamos escrito el XX).
000010 Texto A
- - - - - - - - - - - - - - - - - 2 Line(s) not Displayed
000013 Texto D


Mostar líneas.
Los comandos para mostrar líneas son las letras 'S / F / L'.
Veamos cada uno de ellos.

Comando F: Muesta la(s) primera(s) línea(s)

Si tecleamos una F sobre la línea que nos muestra las líneas ocultas:
000010 Texto A
F - - - - - - - - - - - - - - - - 3 Line(s) not Displayed
000014 Texto E


Mostraría la línea 11.
000010 Texto A
000011 Texto B
- - - - - - - - - - - - - - - - - 2 Line(s) not Displayed
000014 Texto E


Si tecleamos F2 sobre la línea que nos muestra las líneas ocultas:
000010 Texto A
F2- - - - - - - - - - - - - - - - 3 Line(s) not Displayed
000014 Texto E


Mostraría 2 líneas a partir de la linea 10 (líneas 11 y 12).
000010 Texto A
000011 Texto B
000012 Texto C
- - - - - - - - - - - - - - - - - 1 Line(s) not Displayed
000014 Texto E


Comando L: Muestra la(s) última(s) línea(s).
Tiene un análogo comportamiento a F, pero en vez de mostrar las primeras líneas muestra las últimas, veamos el ejemplo:

Si tecleamos L2 sobre la línea que nos muestra las líneas ocultas:
000010 Texto A
L2- - - - - - - - - - - - - - - - 3 Line(s) not Displayed
000014 Texto E


Mostraría 2 líneas a partir de la linea 10 (líneas 12 y 13).
000010 Texto A
- - - - - - - - - - - - - - - - - 1 Line(s) not Displayed
000012 Texto C
000013 Texto D
000014 Texto E


Por último tenemos el comando S: Muestra la(s) línea(s) más significativas de un bloque de líneas ocultas.
No vamos a exponer el funcionamiento del mismo. Si alguien tiene interés lo puede preguntar y se lo explicaremos.


OTROS COMANDOS

BNDS. Establece límites de trabajo.

El comando BNDS nos permite fijar los márgenes izquierdo y derecho.
Para poder trabajar con este comando escríbelo sobre la columna que indica el numero de línea BNDS
000010 Texto A
BNDS11 Texto B
000012 Texto C
000013 Texto D


Nos mostraría la siguiente ventana.
000010 Texto A
=BNDS> <                      >
000011 Texto B
000012 Texto C
000013 Texto D


El símbolo < indica la posición del margen izquierdo. Por defecto es la primera posición.
El símbolo > indica la posición del margen derecho. Por defecto es la última posición.

El objetivo del BOUNDS es limitar la acción de los comandos entre el margen izquierdo y el margen derecho.
Lo vemos en un ejemplo:

Si tuviésemos:
=BNDS> <                      >
M00010 Texto A1
OO0011 Texto B
000012 Texto C
OO0013 Texto D


Nos daría el siguiente resultado:
000010 Texto B1
000011 Texto C1
000012 Texto D1


Sin embargo
Si tuviésemos:
=BNDS> <  >
M00010 Texto A1
OO0011 Texto B
000012 Texto C
OO0013 Texto D


Nos daría el siguiente resultado:
000010 Texto B
000011 Texto C
000012 Texto D


El 1 no se llevaría al resto de líneas ya que queda fuera de los márgenes establecidos por el BNDS.


COLS. Es un comando informativo que nos indica el número de columna.

Para poder trabajar con este comando escríbelo sobre la columna que indica el numero de línea COLS
000010 Texto A
COLS11 Texto B
000012 Texto C
000013 Texto D


Nos mostraría la siguiente ventana.
000010 Texto A
=COLS> ---+----1---+----2---+----3---+----4---+----5
000011 Texto B
000012 Texto C
000013 Texto D



MASK. Es un comando que nos permite definir la estrucutura de una linea.

Para poder trabajar con este comando escríbelo sobre la columna que indica el número de línea MASK
000010 Texto A
MASK11 Texto B
000012 Texto C
000013 Texto D


Nos mostraría la siguiente ventana.
000010 Texto A
=MASK>
000011 Texto B
000012 Texto C
000013 Texto D


La máscara por defecto es una línea en blanco. Cada vez que hagamos un insert de una nueva línea nos mostrará una línea en blanco.

Si tecleamos una I sobre la columna de la línea 11:
000010 Texto A
I00011 Texto B
000012 Texto C
000013 Texto D


Insertaría 1 línea para poder escribir nuestro texto a continuación de nuestra línea 11.
000010 Texto A
000011 Texto B
''''''
000012 Texto C
000013 Texto D


Cambiamos la máscara:
000010 Texto A
=MASK> *                 *
000011 Texto B
000012 Texto C
000013 Texto D


Si tecleamos una I sobre la columna de la línea 11:
000010 Texto A
I00011 Texto B
000012 Texto C
000013 Texto D


Insertaría 1 línea para poder escribir nuestro texto a continuación de nuestra línea 11.
000010 Texto A
000011 Texto B
'''''' *                 *
000012 Texto C
000013 Texto D


Nos puede ser útil en casos como añadir un párrafo de comentarios.

También dentro de este bloque podemos añadir el comando TABS que nos permite ver y cambiar la tabulación por defecto.
En este articulo no vamos a explica su fucionamiento, si alguien tiene interés lo puede preguntar y se lo explicaremos.

Con esto finalizamos este segundo volumen de comandos TSO.
Continuaremos explicando otros comandos, pero ahora ya desde la linea de comandos, en siguientes entregas.

lunes, 23 de mayo de 2011

Lo mejor de la semana: lunes 16 a domingo 22.

Después de unas merecidas vacaciones, vuelve el recuento semanal de visitas:

  1. Sort vol.2: OUTREC.
  2. WORKING-STORAGE: definiendo variables.
  3. Esquema de un programa cobol.
  4. ICETOOL(I): SPLICE; cruce de ficheros.
  5. Programas con DB2 III: COUNT, MAX y FOR UPDATE.
  6. Sort vol.1: SORT, INCLUDE.
  7. JCL básico: IDCAMS, IEFBR14, IEBGENER.
  8. Sort vol.5.1: SUM. Averiguar registros duplicados
  9. Programas con DB2 II: CURSOR.
  10. Ejemplo 3: leer de fichero y escribir en fichero.

Esta semana volvemos con más OUTREC, por si no llenaba ya las estadísticas con uno...^^
Ánimos para esta semana que empieza : )

Sort vol.2.1: OUTREC. IFTHEN

Ampliando un poco las funciones del OUTREC os voy a explicar como incluir condiciones. Es muy sencillo y puede evitar tener que crear programas en un momento dado.

Pongamos el caso de que tenemos el siguiente fichero con los datos de unos clientes:

----+----1----+----2----+----3----+----4----+----5----+----
***************************** Top of Data *****************
000000001JOSE      LOPEZ     PITA     AUTONOMO        47001
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      47001
000000003CARLOS    PEREZ     FANO     AUTONOMO        47001
000000004CARLOS    POLO      DEL BARROAUTONOMO        47001
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        47001
000000006ANTONIO   VILLA     SUSO     AUTONOMO        47001
000000007FULANITO  VILLA     SUSO     AUTONOMO        47001


Un buen día nos dicen que quieren añadir al final de cada registro un indicador que nos marque lo siquiente:

Si es un AUTONOMO añadir el indicador 'A'
Si es un ASALARIADO añadir el indicador 'S'

Utlizaremos el siguiente paso de jcl donde aplicamos la condición:

//OUTREC   EXEC SORTD
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=Nombre_Fichero_De_Entrada,DISP=SHR
//SORTOUT  DD DSN=Nombre_Fichero_De_Salida,
//            DISP=(,CATLG),
//            SPACE=(CYL,(100,100),RLSE)
//SYSIN    DD *
 SORT FIELDS=COPY
 OUTREC IFTHEN=(WHEN=(39,11,CH,EQ,C'AUTONOMO   '),
          OVERLAY=(1,59,C'A')),
        IFTHEN=(WHEN=NONE,
          OVERLAY=(1,59,C'S'))


El resultado obtenido será el siguiente:

----+----1----+----2----+----3----+----4----+----5----+----6
***************************** Top of Data ******************
000000001JOSE      LOPEZ     PITA     AUTONOMO        47001A
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      47001S
000000003CARLOS    PEREZ     FANO     AUTONOMO        47001A
000000004CARLOS    POLO      DEL BARROAUTONOMO        47001A
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        47001A
000000006ANTONIO   VILLA     SUSO     AUTONOMO        47001A
000000007FULANITO  VILLA     SUSO     AUTONOMO        47001A


Vemos como a los AUTONOMOS les marca con una A y a los ASALARIADOS con una S.

Notas:
- Para añadir más condiciones se deben añadir más IFTHEN al OUTREC.
- Esto es válido también para el INREC.

viernes, 20 de mayo de 2011

Happy birthday!!!


Este lunes, 16 de mayo, el gigante azul ha cumplido 100 años desde su fundación en 1911.

Uno de los años descatados en toda la historía de la multinacional es 1964, cuando IBM lanzó el primer sistema mainframe (360 System).

Los 360 fueron la primera familia de ordenadores diseñados para cubrir las aplicaciones independientemente de su tamaño o ambiente (científico, comercial). Los modelos S/360 anunciados en 1964 variaban en velocidad de 0,034 MIPS a 1,700 MIPS (50 veces la velocidad) y entre 8 KB y 8 MB de memoria principal.

El 360 fue un gran éxito en el mercado, permitía a los clientes comprar un sistema más pequeño sabiendo que siempre podrían migrar hacia un sistema de mayor capacidad. Muchos consideran el diseño de este sistema como uno de los más importantes en la historia, ya que ha influido en el diseño de los ordenadores de años posteriores.

Este solo fue uno de los grandes logros de IBM, al que precedieron otros como las tarjetas perforadas (1923) o el Automatic Sequence Controlled Calculator (ASCC) (1944). Otros posteriores han sido el disco flexible y el estándar de los códigos de barras (años 70), el primer PC (1981) o la derrota a Gary Kasparov por el superordenador Deep Blue (1997).

Desde "Consultorio Cobol" nos sumamos a las múltiples felicitaciones!

Noticia en El Mundo

jueves, 19 de mayo de 2011

CONSULTIRAS 9: "Cinéfilo"

En la mayoría de puestos de trabajo en los que nos movemos los coboleros, suele haber una cafetería o lugar de descanso para, los que como yo "guiño" "guiño" nos partimos el lomo dándole a la tecla.
Otra de las cosas que caracterizan nuestros puestos de trabajo, y que sin ellos este mundo no sería lo que es ahora mismo, son los compañeros. Sí, hablo de esas personas que tienes sentadas a tu lado, con las que pasas el 33% de tus días (o más), a las que incluso ves fuera del trabajo y pasan a formar parte de tu círculo de amigos (o llegas a hacer tu círculo de amigos con ell@s). Es sin duda alguna el punto de apoyo de todo este sistema, y por eso en las cafeterías se habla de todo con ellos: trabajo, deportes, sexo, cine... (ya dije sexo, ¿verdad?).


(Pincha en la imagen para verla más grande)

Este texto pretende ser (que lo mismo no lo he conseguido), un pequeño homenaje a los compañeros que he tenido, a los que tengo y a los que quedan por llegar (a estos últimos, tened cuidado que yo estoy muy loco...), y para ellos acabo de inventarme una palabra: COBOLÑEROS.

lunes, 16 de mayo de 2011

Sort vol.5.1: SUM. Averiguar registros duplicados

Hola. Os dejo un jcl que os puede sacar de un apuro en más de una ocasión (a mí me salvó más de una vez).
Se trata de un procesito fácil, barato y para toda la familia, que nos permite averiguar que registros de un fichero están duplicados, cuales no y cuantos son.

Como siempre, para que quede más claro seguiré un ejemplo práctico, válido para cualquier caso:

Supongamos que tenemos el siguiente fichero con los duplicados:


----+----1----+----2----+----3----+----4----+----5----
***************************** Top of Data ************
000000001JOSE      LOPEZ     PITA     AUTONOMO        
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      
000000003CARLOS    PEREZ     FANO     AUTONOMO        
000000004CARLOS    POLO      DEL BARROAUTONOMO        
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        
000000006ANTONIO   VILLA     SUSO     AUTONOMO        
000000007FULANITO  VILLA     SUSO     AUTONOMO 
...


Vemos que Javier y Yolanda salen repetidos, Yolanda icluso viene 3 veces. A simple vista los vemos porque el ejemplo está preparado para ello, pero imaginate que el fichero tuviera 100.000 registros y solo 2 duplicados, se complica la búsqueda no? continuamos:

PASO1 - Lo primero que haremos será ordenar el fichero por la clave (en este caso son las primeras 9 posiciones) y después poner un 1 al final de cada uno de los registros del fichero, para ello:


//PASO001  EXEC SORTD
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=nombre_fichero_con_diplicados1,DISP=SHR
//SORTOUT  DD DSN=nombre_fichero_salida1_paso001,
//            DISP=(,CATLG),
//            SPACE=(CYL,(100,100),RLSE)
//SYSIN    DD *
 SORT FIELDS=(1,9,ZD,A)
 OUTREC FIELDS=(1,54,C'1')


El fichero quedará del siguiente modo:


----+----1----+----2----+----3----+----4----+----5----+
***************************** Top of Data *************
000000001JOSE      LOPEZ     PITA     AUTONOMO        1
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      1
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      1
000000003CARLOS    PEREZ     FANO     AUTONOMO        1
000000004CARLOS    POLO      DEL BARROAUTONOMO        1
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        1
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        1
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        1
000000006ANTONIO   VILLA     SUSO     AUTONOMO        1
000000007FULANITO  VILLA     SUSO     AUTONOMO        1
...


PASO2 - Ahora lo que haremos será agrupar los registros por clave y utilizar el numeríto (1) que hemos introducido para sumar los registros que agrupemos:


//PASO002  EXEC SORTD
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=nombre_fichero_salida1_paso001,DISP=SHR
//SORTOUT  DD DSN=nombre_fichero_salida,
//            DISP=(,CATLG),
//            SPACE=(CYL,(100,100),RLSE)
//SYSIN    DD *
 SORT FIELDS=(1,9,ZD,A)
 SUM FIELDS=(55,1,ZD)


Obtendremos el resultado siguiente:


----+----1----+----2----+----3----+----4----+----5----+
***************************** Top of Data *************
000000001JOSE      LOPEZ     PITA     AUTONOMO        1
000000002JAVIER    MARTINEZ  CARRETEROASALARIADO      2
000000003CARLOS    PEREZ     FANO     AUTONOMO        1
000000004CARLOS    POLO      DEL BARROAUTONOMO        1
000000005YOLANDA   LOPEZ     ALONSO   AUTONOMO        3
000000006ANTONIO   VILLA     SUSO     AUTONOMO        1
000000007FULANITO  VILLA     SUSO     AUTONOMO        1
...


Bien, ahora simplemente hacemos busquedas en el fichero teniendo en cuenta lo siguiente:
- Si el numerito introducido al final de cada registro no ha variado (si vale 1), quiere decir que el registro no está duplicado
- Si ha variado el valor querra decir que el registro estaba duplicado y nos dirá el número de veces que está duplicado.

Según el ejemplo vemos como Javier tiene un 2 porque está repetido dos veces, Yolanda tiene un 3 porque está repetida 3 veces, y el resto tienen un 1 porque no están repetidos.

Así de facil!

Otros casos útiles:

En algunas ocasiones queremos camparar dos ficheros para encontrar las direfencias, por ejemplo, suponte que deberían de ser iguales pero uno de ellos tiene 3 registros más que el otro, y que esto pueda ser debido algún registro duplicado.
Para resolverlo, podéis aplicar este mismo método, aplicando el PASO1 a los dos ficheros y luego metiendo los dos ficheros en el PASO2. Te dirá que registros son únicos(tanto de un fichero como del otro), cuales no lo són y el número de los que estén repetidos.

Espero que os haya servido, no obstante cualquier duda comentarla.

jueves, 12 de mayo de 2011

Micro Focus y Microsoft migrando mainframes

Micro Focus y Microsoft apuestan por la creación de entornos distribuidos para persuadir a la gran empresa en la migración de aplicaciones mainframe a Windows Server x64.

Los ‘entornos de referencia’ serán creados en Reino Unido y EEUU, respectivamente. El primero se realizará sobre un sistema hardware Dell PowerEdge R910, mientras que en el segundo las pruebas y demostraciones se efectuarán sobre equipos Hewlett-Packard ProLiant DL580.

El Centro de Tecnología de Microsoft (MTC) ofrece a las empresas la oportunidad de experimentar con una demo mainframe en un entorno no mainframe. Los dos centros ofrecen una infraestructura a escala real x64 que utiliza software de Micro Focus, Microsoft, CA Technologies, Syncsort, Levi Ray y Shoup, que trabajan conjuntamente para ofrecer las capacidades necesarias que aseguran el pleno funcionamiento de las aplicaciones de misión crítica en un entorno distribuido.

Sin duda es una noticia a seguir de cerca para comprobar que resultados arrojan estas simulaciones de migración de entornos mainframe a entornos distribuidos. Intentaremos conseguir declaraciones de primera mano, pero no prometemos nada! Atentos en las próximas semanas.

Noticia en techweek

lunes, 9 de mayo de 2011

Lo mejor de la semana: lunes 02 a domingo 08.

Esta semana llegamos puntuales para hacer el recuento de visitas:

  1. WORKING-STORAGE: definiendo variables.
  2. Sort vol.2: OUTREC.
  3. JCL básico: IDCAMS, IEFBR14, IEBGENER.
  4. ICETOOL(I): SPLICE; cruce de ficheros.
  5. Esquema de un programa cobol.
  6. Sort vol.1: SORT, INCLUDE.
  7. Programas con DB2 III: COUNT, MAX y FOR UPDATE.
  8. Comandos TSO vol.1: Comandos del editor.
  9. CONSULTIRAS 7 y 3/4: "Despedidas..."
  10. Programas con DB2 II: CURSOR.

Bieeeeeen!!! Chúpate esa OUTREC!!!
ejem...

Los próximos días os quedáis a cargo de mis compis, porque yo me las piro de vacaciones!!! ¿Adivináis a dónde? :D

Fechas: Juliana, Gregoriana, DB2...

Para aquellos que habéis estado en más de un proyecto, seguro que os ha pasado que en cada sitio almacenan las fechas de una manera distinta. En este artículo vamos a ver las formas más comunes de almacenar fechas y como pasarlas de uno a otro formato.

Fecha DB2
Es aquella que tiene formato "DATE" en la correspondiente tabla.
Su definición sería: AAAA-MM-DD

Ejemplos
COBOL: 01  WX-FECHA-DB2 PIC X(10) VALUE '2011-01-01'.
PL/I : DCL WX_FECHA_DB2 CHAR(10)  INIT ('2011-01-01');


Fecha Juliana
En tabla se tendría formato DECIMAL (7), pues se trata de un número de 7 dígitos. La información que almacena es el año de 4 dígitos, y el día del año entre 1 y 365. Su definición sería: AAAADDD

Ejemplos
COBOL: 01  WX-FECHA-JUL PIC 9(7)   VALUE 2011001.
PL/I : DCL WX_FECHA_JUL PIC '(7)9' INIT (2011001);


Fecha gregoriana
En tabla tendría formato DECIMAL (8), pues se trata de un número de 8 dígitos. La información que se almacena es el año de 4 dígitos, el mes y el día del mes.
Su definición sería: AAAAMMDD

Ejemplos
COBOL: 01  WX-FECHA-GREG PIC 9(8)   VALUE 20110101.
PL/I : DCL WX_FECHA_GREG PIC '(8)9' INIT (20110101);


Pero a la hora de mostrar una fecha por pantalla, no se usa ninguno de esos formatos, sino el más entendible por el usuario: el mítico DD-MM-AAAA (01-01-2011).
Ya sea con guiones o con barras, la transformación a este formato suele ser común en los programas online.
Vamos a ver como transformaríamos cada uno de los formatos anteriores al formato de pantalla.

De AAAA-MM-DD a DD-MM-AAAA
(...)
WORKING-STORAGE SECTION.
01 WX-FECHA-DB2.
   05 WX-AAAA-DB2    PIC 9(4).
   05 FILLER         PIC X.
   05 WX-MM-DB2      PIC 9(2).
   05 FILLER         PIC X.
   05 WX-DD-DB2      PIC 9(2).

01 WX-FECHA-ONLINE.
   05 WX-DD-ONLINE   PIC 9(2).
   05 FILLER         PIC X VALUE '-'.
   05 WX-MM-ONLINE   PIC 9(2).
   05 FILLER         PIC X VALUE '-'.
   05 WX-AAAA-ONLINE PIC 9(4).

PROCEDURE DIVISION.
 

     MOVE '1999-31-12' TO WX-FECHA-DB2

     MOVE WX-AAAA-DB2  TO WX-AAAA-ONLINE
     MOVE WX-MM-DB2    TO WX-MM-ONLINE
     MOVE WX-DD-DB2    TO WX-DD-ONLINE

     DISPLAY 'FECHA ONLINE:' WX-FECHA-ONLINE

     STOP RUN
     .



Como veis este cambio no tiene mucha ciencia^^

De AAAAMMDD a DD-MM-AAAA
(...)
WORKING-STORAGE SECTION.
01 WX-FECHA-GREG.
   05 WX-AAAA-8      PIC 9(4).
   05 WX-MM-8        PIC 9(2).
   05 WX-DD-8        PIC 9(2).

01 WX-FECHA-ONLINE.
   05 WX-DD-ONLINE   PIC 9(2).
   05 FILLER         PIC X VALUE '-'.
   05 WX-MM-ONLINE   PIC 9(2).
   05 FILLER         PIC X VALUE '-'.
   05 WX-AAAA-ONLINE PIC 9(4).

PROCEDURE DIVISION.

     MOVE 19991231  TO WX-FECHA-8
 
     MOVE WX-AAAA-8 TO WX-AAAA-ONLINE
     MOVE WX-MM-8   TO WX-MM-ONLINE
     MOVE WX-DD-8   TO WX-DD-ONLINE

     DISPLAY 'FECHA ONLINE:' WX-FECHA-ONLINE

     STOP RUN
     .


Veis que es prácticamente lo mismo que en el caso anterior.

También puede ser necesario transformar las fechas entre el formato juliano y el gregoriano:

De AAAAMMDD a AAAADDD
(...)
WORKING-STORAGE SECTION.
01 WX-FECHA-JUL.
   05 WX-AAAA-JUL PIC 9(4).
   05 WX-DDD-JUL  PIC 9(3).

01 WX-FECHA-GREG.
   05 WX-AAAA-8   PIC 9(4).
   05 WX-MM-8     PIC 9(2).
   05 WX-DD-8     PIC 9(2).

PROCEDURE DIVISION.

     MOVE 20111231  TO WX-FECHA-GREG

     MOVE WX-AAAA-8 TO WX-AAAAA-JUL
     MOVE WX-DD-8   TO WX-DD-JUL

     IF WX-MM-8 EQUAL 12
        ADD 30      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 11
        ADD 31      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 10
        ADD 30      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 9
        ADD 31      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 8
        ADD 31      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 7
        ADD 30      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 6
        ADD 31      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 5
        ADD 30      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 4
        ADD 31      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     IF WX-MM-8 EQUAL 3
        ADD 28      TO WX-DD-JUL
        SUBSTRACT 1 FROM WX-MM-8
     END-IF

     DIVIDE WX-AAAA-8 BY 4 GIVING WX-AAAA-8 REMAINDER WX-RESTO

     IF WX-RESTO EQUAL ZEROES
        ADD 1       TO WX-DDD-JUL
     END-IF

     IF WX-MM-8 EQUAL 2
        ADD 31      TO WX-DD-JUL
     END-IF

     DISPLAY 'FECHA JULIANA (YYYYDDD):' WX-FECHA-JUL

     STOP RUN
     .



Aquí ya se complica un poco la cosa. Normalmente suelen existir rutinas generales para hacer este formateo. Por ejemplo, una rutina que recibe la fecha en formato AAAAMMDD por linkage y la devuelve en formato AAAADDD.

De AAAADDD a AAAAMMDD
(...)
WORKING-STORAGE SECTION.
01 TABLA-MM-DD.
   05 MM-01       PIC 9(3) COMP-3 VALUE 0.
   05 MM-02       PIC 9(3) COMP-3 VALUE 31.
   05 MM-03       PIC 9(3) COMP-3 VALUE 59.
   05 MM-04       PIC 9(3) COMP-3 VALUE 90.
   05 MM-05       PIC 9(3) COMP-3 VALUE 120.
   05 MM-06       PIC 9(3) COMP-3 VALUE 151.
   05 MM-07       PIC 9(3) COMP-3 VALUE 181.
   05 MM-08       PIC 9(3) COMP-3 VALUE 212.
   05 MM-09       PIC 9(3) COMP-3 VALUE 243.
   05 MM-10       PIC 9(3) COMP-3 VALUE 273.
   05 MM-11       PIC 9(3) COMP-3 VALUE 304.
   05 MM-12       PIC 9(3) COMP-3 VALUE 334.

01 TABLA-MM-DD-R REDEFINES TABLA-MM-DD.
   05 MM-DIAS OCCURS 12 TIMES
                  PIC 9(3) COMP-3.
01 WX-ANO-BIS     PIC S9(3) COMP-3.
   88 ANO-BIS-SI                  VALUE 0.
01 WX-FIL9        PIC S9(3) COMP-3.
01 WX-FECHA-JUL.
   05 WX-AAAA-JUL PIC 9(4).
   05 WX-DDD-JUL  PIC 9(3). 

01 WX-FECHA-GREG.
   05 WX-AAAA-8   PIC 9(4).
   05 WX-MM-8     PIC 9(2).
   05 WX-DD-8     PIC 9(2).

PROCEDURE DIVISION.
     DISPLAY 'FECHA JULIANA: 2011059'

     MOVE 2011059     TO WX-FECHA-JUL
     MOVE WX-AAAA-JUL TO WX-AAAA-8 


*--- COMPROBAR AÑO BISIESTO: RESTO = 0 = AÑO BISIESTO
     DIVIDE WX-AAAA-JUL BY 4 GIVING WX-FIL9 REMAINDER WX-ANO-BIS

*--- CORREGIR VALORES MM-DD PARA AÑO BISIESTO
     IF ANO-BIS-SI
        ADD 1 TO MM-03
                 MM-04
                 MM-05
                 MM-06
                 MM-07
                 MM-08
                 MM-09
                 MM-10
                 MM-11
                 MM-12
     END-IF

*--- DETERMINA EN QUE MES ESTAMOS
     PERFORM VARYING WX-MM-8 FROM 12 BY -1
        UNTIL MM-DIAS(WX-MM-8) < WX-DDD-JUL 

     END-PERFORM 

*--- EL RESTO DE DDD SON LOS DIAS DENTRO DEL MES 
     SUBTRACT MM-DIAS(WX-MM-8) FROM WX-DDD-JUL GIVING WX-DD-8 

     DISPLAY 'FECHA AAAAMMDD:' WX-FECHA-GREG

     STOP RUN 
     .



Por supuesto puede haber otras maneras de hacer estos cambios. Existen también funciones intrínsecas de COBOL que hacen la transformación, pero normalmente no dejan usarlas porque consumen muchos recursos.

viernes, 6 de mayo de 2011

CONSULTIRAS 8: "Guardias 24x7"

Todo programador tarde o temprano termina haciendo guardias 24x7 (que para el que no lo sepa, son 24 horas al día por 7 días a la semana). En nuestro caso, en el consultorio tenemos un mono las 24 horas que es el encargado de publicar los artículos, cosa que hace realmente mal y tenemos que revisar cuando nos levantamos (a eso de la hora de comer...).

El caso, es que esas guardias, muchas (muchas, muchas, muchas....) veces, no son tal y como tú te las imaginas.

Os dejo con la consultira de la semana, pero antes, os muestro al mono que tenemos contratado (1 plátano a la semana, que trabaja en el SEACODE y nos sale muy barato).



(Pinchad en la imagen para hacerla más grande)

jueves, 5 de mayo de 2011

CONSULTIRAS 7 y 3/4: "Despedidas..."

Esta consultira, la número 7 y 3/4 (casi como el andén a Hogwarts), es un pequeño homenaje a todas las despedidas vividas en las empresas, despedidas que seguramente más de un lector ha vivido o sufrido (y seguramente hace bien poco).

Siempre hay gente que se va, compañeros, amigos, hermanos...pero la vida sigue, y hay que sacar los proyectos adelante. Así que sólo queda decir HASTA PRONTO.

Como siempre, pinchando en la imagen se abrirá en una pantalla más grande.