viernes, 3 de diciembre de 2021

Jcl - ICETOOL XSUM

En los pasos de sort estamos acostumbrados a eliminar repetidos, de hecho, esto lo explicamos en una entrada anterior que puedes ver pinchando aquí.

Ahora bien, ¿qué sucede cuando queremos dejar en un fichero los registros (sin repetidos) del fichero origen y todos los repetidos en otro fichero distinto? Pues es muy sencillo, fíjate en el siguiente paso de jcl:

     //SORT0001    EXEC PGM=ICETOOL
     //TOOLMSG  DD SYSOUT=*
     //DFSMSG     DD SYSOUT=*
     //SORTIN        DD DSN=XX.XX.XXXXXXXX.XXXXXXXX.ENT,DISP=SHR
     //SORTOUT     DD DSN=YY.YY.YYYYYYYY.YYYYYYYY.SAL1,
     //                   DISP=(,CATLG,DELETE),
     //                   SPACE=(CYL,1,1)
     //SORTXSUM DD DSN=YY.YY.YYYYYYYY.YYYYYYYY.SAL2,
     //                   DISP=(,CATLG,DELETE),
     //                   SPACE=(CYL,1,1)
     //TOOLIN      DD *
         SELECT FROM(SORTIN) TO(SORTOUT) -
                     ON(1,9,ZD) FIRST DISCARD(SORTXSUM)


Como habrás observado he marcado en azul y amarillo ciertas cosas que se diferencian con el típico paso de SORT:

          ICETOOL sustituye a SORT
          TOOLMSG no existe en el típico paso de sort
          DFSMSG no existe en el típico paso de sort
          SORTXSUM es un fichero de más que el SORT no suele tener a
                 menos que no dividamos el fichero origen en dos ficheros
                 distintos tal y como se explica en el post titulado JCL: Obtener
                 dos ficheros mediante SORT (pinchar aquí para leer dicho
                 post)
          TOOLIN sustituye a SYSIN

           SELECT FROM(SORTIN) TO(SORTOUT) -
                       ON(1,9,ZD) FIRST DISCARD(SORTXSUM)

               Lo anterior sustituye a las típicas cláusulas que van detrás del
               SYSIN en el SORT. Con esto conseguimos realizar lo que
               planteamos en la pregunta realizada al inicio de este post.

Espero que os haya sido de utilidad.

viernes, 5 de noviembre de 2021

COBOL - utilizar un switch

En Cobol solemos utilizar un switch para saber si estamos ante una determinada situación o ante otra.

Empecemos, por ejemplo, por los ficheros. Tenemos un programa que usa dos ficheros: uno de entrada y otro de salida. Dichos ficheros serán FENTRADA y FSALIDA.

Para esos ficheros podremos definir los siguientes switches:

     01 SWITCHES.
          05 FS-FENTRADA        PIC X(02) VALUE ZEROES.
               10 FENTRADA-OK                 VALUE '00'.
               10 FENTRADA-FIN                VALUE '10'.
          05 SW-FIN-FENTRADA PIC X(01).
               10 SI-FIN-FENTRADA            VALUE 'S'.
               10 NO-FIN-FENTRADA           VALUE 'N'.
          05 FS-FSALIDA           PIC X(02) VALUE ZEROES.
               10 FSALIDA-OK                     VALUE '00'.
               10 FSALIDA-FIN                    VALUE '10'.


Cuando definamos los ficheros FENTRADA y FSALIDA en el FILE-CONTROL del área INPUT-OUTPUT SECTION indicaremos lo siguiente con respecto al file status de los ficheros:

     FILE STATUS IS FS-FENTRADA.
     FILE STATUS IS FS-FSALIDA.

Pues bien, vayamos al meollo del asunto. ¿Cómo podemos utilizar estos switch? En el caso del fichero de entrada, cuando abramos dicho fichero (OPEN INPUT FENTRADA) podemos controlar el file status devuelto:

     IF FENTRADA-OK
         <<fichero abierto>>
     ELSE
         <<error lógico>>
     END-IF.

Cuando se lea de dicho fichero (READ FENTRADA INTO COPY) también podemos controlar el file status:

     SET NO-FIN-FENTRADA TO TRUE
*-------------------------------------------------------
     IF FENTRADA-OK
         <<lectura correcta>>
     ELSE
         IF FENTRADA-FIN
             SET SI-FIN-FENTRADA TO TRUE
         ELSE
             <<error lógico>>
         END-IF
     END-IF.

Tras la lectura del fichero de entrada podemos hacer una cosa u otra en función de si se ha llegado o no al final del mismo:

     IF SI-FIN-FENTRADA
         <<se ha llegado al final de FENTRADA, se hará lo que corresponda>>
     ELSE
         <<no se ha llegado al final de FENTRADA, se hará lo que corresponda>>
     END-IF.

Continuamos con otros ejemplo de switch. Sobretodo uno que resulta muy interesante para hacer las condiciones de los IF más sencillas. Veamos el siguiente IF:

     IF (campo = 2 or 4 or 6 or 8 or 10)
         DISPLAY 'ES PAR.'
     ELSE
         DISPLAY 'ES IMPAR.'
     END-IF.

Si declaramos un switch como el siguiente:


     01 SWITCHES.
          05 SW-PAR-O-IMPAR       PIC 9(02).
               10 ES-PAR                 VALUE 2,4,6,8,10.
               10 ES-IMPAR              VALUE 1,3,5,7,9.

Y si se realiza un MOVE como este otro:

     MOVE campo TO SW-PAR-O-IMPAR

La condición del IF anterior quedará tan sencilla como la que viene a continuación:

     IF ES-PAR
         DISPLAY 'ES PAR.'
     ELSE
         DISPLAY 'ES IMPAR.'
     END-IF.

Pues esto es todo lo que puedo contar sobre el fascinante mundo de los switches. Espero que os resulte de utilidad.

sábado, 9 de octubre de 2021

Caída facebook, instagram y whatsapp

Esta semana ha habido una caída de facebook, instagram y whatsapp que ha durado horas.

Me gustaría que leyérais el siguiente artículo pinchando aquí.

Estoy totalmente de acuerdo con la conclusión: "somos adictos a la tecnología digital". Sobretodo unos más que otros ya que los que no tienen ni facebook ni instagram (o lo tienen pero casi ni lo usan) les ha dado igual la caída de ambas redes sociales. Y otros no tienen whatsapp, aunque no os lo creáis hay gente así, y toda esta gente que no tiene absolutamente nada de esto, ¿cómo créeis que han vivido la caída de todo eso? Pues FELICES porque han seguido con su vida con toda normalidad sin estar mirando cada 5 minutos si ya hay conexión y sin sufrir el estrés (ni la angustia) de que no funcione todo eso. Y, ojo, siendo capaces de estar en contacto con la gente que conocen. Y, ¿cómo? Muy fácil, con lo que se ha hecho siempre: llamada o hablando cara a cara con la gente. Con las malditas redes sociales estamos más en contacto con los demás cada uno en su casa o cada uno en calles distintas, si estamos paseando, y nos estamos olvidando de quedar con la gente para hablar cara a cara.

Al hilo de todo esto, siempre recordaré a una persona que dijo: "Whatsapp me ha salvado la vida en más de una ocasión". WHAAAT??? ¿Estoy oyendo bien? Teniendo en cuenta que whatsapp llevará con nosotros, como mucho, 10 años, mi pregunta es: ¿cómo ha funcionado esta persona antes de la existencia del whatsapp? Ha tenido que ser un completo incompetente porque la gente ágil, dinámica y con recursos no necesita de una aplicación de mensajería para funcionar. Y mucho menos para que le salve la vida.

Moraleja, dadle a las redes sociales y a las aplicaciones de mensajería la importancia justa que tienen y nunca dependáis de todo eso para funcionar. Ya que la caída que ha habido de todo eso nos demuestra que si somos totalmente dependientes y no tenemos un plan B, no sólo lo pasamos mal (estrés y angustía por no usar redes sociales y aplicaciones de mensajería) sino que además la total dependencia de algo así como la ausencia de un plan B ante la ausencia de ese algo nos convierte en auténticos seres inútiles que no saben cómo funcionar sin todo eso.

Acordaros de cómo eramos capaces de quedar con gente y hablar con ella en la década de los 80 y de los 90 del siglo pasado. Si nos acordásemos y eso fuese nuestro plan B ante caída de redes sociales y aplicaciones de mensajería, seríamos más felices puesto que podríamos seguir adelante con nuestra vida ante una futura caída.

viernes, 1 de octubre de 2021

QA Tester

Os presento un canal de Youtube llamado The QA Testing Channel: https://www.youtube.com/channel/UCrNuRcUWDHc-gV8-8GgRhGw

A todos los que sois QA Tester, espero que os sea de utilidad.

viernes, 3 de septiembre de 2021

HOST - colas MQ

Hoy vamos a adentrarnos en el fascinante mundo de las colas MQ.

Empezaremos con manuales que tienen la teoría:


Y cualquier otra cosa que vea interesante la iré incorporando a este post mediante sucesivas actualizaciones.

viernes, 2 de julio de 2021

CICS (2): comandos de interés

En esta nueva entrada sobre el CICS trataremos los comandos que podemos usar. Cada vez que me acuerde de otro comando o aprenda uno nuevo actualizaré esta entrada.

Comencemos...

CEMT I PROG(<<pgm-cob-online>>)
CEMT S PROG(<<pgm-cob-online>>)
CEMT FI PROG(<<pgm-cob-online>>)

Vemos si el programa cobol online se ha ejecutado o no.

Desde aquí se hace el NEWCOPY (con N), sólo si se ha ejecutado previamente y estamos en el CICS por el que ha corrido la transacción asociada al programa.

XPED <<pgm-cob-online>>

Xpediter online. Consultar el post dedicado a este comando pinchando aquí.

viernes, 4 de junio de 2021

Apple ha sido hackeada (2)

Como ya sabéis por una entrada anterior, a la que podéis acceder pinchando aquí, apple fue hackeada por un joven de 16 años.

Con una noticia así, no puedo evitar acordarme de todas aquellas personas que creen que Apple es de lo más seguro que hay. Si es tan fácil hackearlo (véase la noticia del joven de 16 años), ¿por qué no hay más ataques a Apple? A lo mejor la respuesta no es tan sencilla pero a primera vista, podría decirse que, si partimos de la premisa de que los hackers buscan hacer el mayor daño posible (por ejemplo, atacando al mayor número de personas posible), y a ello le añadimos que hay más dispositivos con sistema operativo android que con sistema operativo ios, pues diría que está claro: los hackers van a atacar aquellos dispositivos con sistema android pues son la mayoría.

Relativo a este tema, os recomiendo ver el siguiente vídeo en el que Chema Alonso, experto en ciberseguridad, asegura que tu iphone es tan (in)seguro como tu windows:


Bien es verdad que dicho vídeo fue incluido en la entrada que se menciona al inicio de este post pero no está mal que lo veáis si no lo habéis visto todavía. Os lo recomiendo 100%.

sábado, 22 de mayo de 2021

Internet Explorer, adios a partir de Agosto de 2021

A continuación os dejo un enlace acerca del "fin" de Internet Explorer:

https://www.elconfidencial.com/tecnologia/2020-08-18/microsoft-adios-internet-explorer-soporte-2021_2717679/?utm_source=twitter&utm_medium=social&utm_campaign=TeknautasDiarioAutomatico

Como habréis leído, Microsoft dejará de dar soporte a Internet Explorer a partir de Agosto de este año.

Adios Internet Explorer, adios. Para muchos fuiste nuestro primer explorador de internet, te acabamos sustituyendo por otros exploradores y ahora (bueno, en pocos meses) serás historia para todos nosotros.

viernes, 7 de mayo de 2021

COBOL - cláusula REPLACING

Partamos del siguiente ejemplo, en donde tenemos una copy llamada PERSONAS cuya estructura es la siguiente:

     01 :REG:.
          05 :REG:-NOMBRE       PIC X(20).
          05 :REG:-APELLIDOS   PIC X(50).
          05 :REG:-DIRECCION   PIC X(50).
          05 :REG:-LOCALIDAD   PIC X(20).
          05 :REG:-PROVINCIA    PIC X(20).
          05 :REG:-TLF-FIJO       PIC 9(09).
          05 :REG:-TLF-MOVIL    PIC 9(09).
          05 :REG:-EMAIL           PIC X(30).

Al tener una copy con una estructura definida con :REG: nos facilita mucho las cosas porque podemos usar la misma copy tanto en un fichero de entrada como en un fichero de salida dentro del mismo programa. Para diferenciar una copy de otra sólo tendremos que hacer lo siguiente:

          COPY PERSONAS REPLACING ==:REG:== BY ==FE-PERSONA==.
          COPY PERSONAS REPLACING ==:REG:== BY ==FS-PERSONA==.

Los ficheros de entrada y salida estarán definidos así:

-> "INPUT-OUTPUT SECTION"/"FILE CONTROL":
     SELECT FENTRADA ASSIGN TO FENTRADA
         ORGANITAZION     IS SEQUENTIAL
         ACCESS MODE       IS SEQUENTIAL
         FILE STATUS         IS FS-FENTRADA.
     SELECT FSALIDA ASSIGN TO FSALIDA
         ORGANITAZION     IS SEQUENTIAL
         ACCESS MODE       IS SEQUENTIAL
         FILE STATUS         IS FS-FSALIDA.

-> "DATA DIVISION"/"FILE SECTION":
     FD FENTRADA
          BLOCK CONTAINS 0 RECORDS
          RECORD 0 CHARACTERS
          DATA RECORD R-FENTRADA.
     01 R-FENTRADA        PIC X(208).
     FD FSALIDA
          BLOCK CONTAINS 0 RECORDS
          RECORD 0 CHARACTERS
          DATA RECORD R-FSALIDA.
     01 R-FSALIDA           PIC X(208).

Cuando se haga referencia a estas copys tendremos que:

     Leer del fichero de entrada:
          READ FENTRADA INTO FE-PERSONA.

     Escribir en el fichero de entrada:
          WRITE R-FSALIDA FROM FS-PERSONA.

Y cuando hagamos referencia a uno de los campos de la copy PERSONAS, en función de si es del fichero de entrada o del fichero de salida, lo diferenciaremos de la siguiente manera:

     FE-PERSONA-NOMBRE -> Campo NOMBRE de la copy del fichero de entrada
     FS-PERSONA-NOMBRE -> Campo NOMBRE de la copy del fichero de salida

Basándonos en la misma copy del ejemplo, ¿cómo se hace para inicializar dicha copy? Muy fácil, de la siguiente manera:

     INITIALIZE PERSONAS
          REPLACING ALPHANUMERIC DATA BY SPACES
          NUMERIC DATA BY ZEROES

Pues esto ha sido todo por hoy. Espero que os haya sido de utilidad este post.

viernes, 16 de abril de 2021

Crear un blog con blogger

En un post anterior te contamos cómo crear un blog con blogger (pinchar aquí para verlo).

Pues bien, os presentamos Blog de Pruebas de PIF, un blog dedicado a la creación de un blog, así como a su mantenimiento y realización de trucos para que podáis hacer lo que queráis.

viernes, 2 de abril de 2021

viernes, 5 de marzo de 2021

Jcl - tratamiento de fechas (3)

Vamos a ver cómo se puede realizar tratamiento de fechas en un jcl. Para ello vamos a partir de la fecha del sistema y a suponer que la fecha del día es 8 de Agosto de 2017 (08-08-2017).


//* %%SET %%FECHAX = %%$ODATE
//*------------------------------------------------------------------------
//* %%SET %%AAAA     = %%SUBSTR %%FECHAX 1 4
//* %%SET %%MM        = %%SUBSTR %%FECHAX 5 2
//* %%SET %%DD         = %%SUBSTR %%FECHAX 7 2
//* %%SET %%FECDIA   = %%AAAA-%%MM-%%DD
//*------------------------------------------------------------------------
//* %%SET %%FECHAD  = %%$OYEAR-%%OMONTH-%%ODAY
//*------------------------------------------------------------------------

ODATE - contiene la fecha del día que según el ejemplo dado sería 20170808 (OJO!!!! fíjate en el formato, va primero el año y a continuación el mes y el día, todo junto, sin ningún tipo de separación).

La variable FECHAX contendrá la fecha del sistema, es decir, el ODATE (20170808).

La variable AAAA contendrá el año de la fecha existente en FECHAX (2017).

La variable MM contendrá el mes de la fecha existente en FECHAX (08).

La variable DD contendrá el día de la fecha existente en FECHAX (08).

La variable FECDIA contendrá la unión de las tres variables antes mencionadas separadas por guiones (2017-08-08).

La variable FECHAD contendrá la fecha del sistema en el formato AAAA-MM-DD (20170808). Si os fijáis se obtiene el mismo resultado que el obtenido en la variable FECDIA pero en una sola línea.

viernes, 8 de enero de 2021

Jcl - error SB37

Cuando un jcl falla en un paso de sort dando un error SB37 significa que el fichero que se está intentando generar en dicho paso necesita más espacio.

¿Recuerdas el post File Status 34 en Cobol publicado en este mismo blog? Si no te acuerdas puedes acceder al mismo pinchando aquí.

¿Por qué hacemos referencia a dicho post? Muy sencillo. Ambos errores son primos hermanos, es decir, el error SB37 en un jcl es lo que el file status 34 en un programa Cobol. Por lo tanto, se aplica la misma solución. Se debe aumentar el espacio al fichero que se está intentando alocar en el paso de sort.

Ejemplo, tenemos lo siguiente en la cláusula SORTOUT del paso de sort:



     //SORTOUT DD DSN=<<fichero_salida>>
     //                    DISP=(,CATLG,DELETE)
     //                    SPACE=(CYL,(500,50))

Si nos diera un error SB37 habría que aplicar la siguiente modificación:



     //SORTOUT DD DSN=<<fichero_cabecera>>
     //                    DISP=(,CATLG,DELETE)
     //                    SPACE=(CYL,(1000,100))

Se ha marcado en otro color el lugar en el que se ha aplicado la modificación y, si se compara con lo que se tenía previamente, se observa que se ha aumentado el espacio con el que se pretende alocar el fichero generado en el paso de sort.