lunes, 26 de septiembre de 2011

COBOL/CICS vol.1: primer contacto.

En este artículo veremos en uso el programa COBOL/CICS más sencillo. Usaremos las sentencias CICS para enviar y recoger texto de la pantalla, pero sin formatear. Este programa será conversacional, es decir, el código se ejecutará de principio a fin sin devolver el control al CICS en ningún momento (salvo al finalizar la ejecución).
Cualquier sentencia CICS debe escribirse entre las etiquetas EXEC CICS y END-EXEC.

Se trata de un programa ONLINE, por lo que ya no hay que usar un JOB para ejecutarlo. Ahora necesitaremos una transacción CICS.

Dependiendo de vuestro sistema, habrá una u otra manera de dar de alta una nueva transacción CICS, que tenga asociado nuestro programa de pruebas. Incluso es probable que muchos de vosotros no tengáis permisos para poder darla de alta en vuestro trabajo.
Para aquellos que tengáis Hércules instalado en vuestro PC de casa, ahí va como generarla:

Transacción CEDA

La transacción CEDA es una transacción del sistema (como la CEMT) que nos permitirá definir nuestra transacción CICS. Una transacción a efectos prácticos, es un código de 4 dígitos que lleva asociado un programa (ya sea COBOL, PL/I, ensamblador...), de tal manera que si la consultamos desde CEMT I TRANS nos mostrará lo siguiente:



Para definirla entraremos en nuestra sesión de CICS y escribiremos CEDA. Nos mostrará la siguiente lista:


Aquí elegimos Define, pues vamos a definir algo nuevo:



Y aquí elegimos Transaction, pues vamos a definir una transacción:


Los campos que debemos rellenar son:
Transaction
Group
Description
Program

Una vez definida la transacción tendremos que hacer lo mismo para el programa:



Y rellenaremos los datos:
Program
Group
Description
Language

Terminada la definición, pasamos a la instalación:
CEDA INSTALL TRANS(ACCQ)
Se debe rellenar el campo Group.


CEDA INSTALL PROG(PGMCICS1)
Se debe rellenar el campo Group.


Hecho esto, ya podemos empezar a codificar nuestro programa.
Nota: Si tenéis algún problema dando de alta la transacción, dejad un comentario y lo vemos.

PROGRAMA:
Por tratarse de un programa COBOL/CICS, tendrá la misma estructura que un programa cobol normal, simplemente incluiremos algunas sentencias CICS en el código.

 IDENTIFICATION DIVISION.
 PROGRAM-ID. PGMCICS1.
 AUTHOR. CONSULTORIO COBOL.
*
*==========================================================*
* MI PRIMER PROGRAMA EN CICS *
* ENVIA UN SALUDO PERSONALIZADO *
*==========================================================*
*
 ENVIRONMENT DIVISION.
*
 CONFIGURATION SECTION.
*
 SPECIAL-NAMES.
    DECIMAL-POINT IS COMMA.
*
 DATA DIVISION.
*
 WORKING-STORAGE SECTION.
*
 01 WX-PREGUNTA-NOMBRE.
    05 WX-PN.
       10 FILLER    PIC X(20) VALUE 'INTRODUCE TU NOMBRE:'.
       10 FILLER    PIC X(10) VALUE '__________'.

 01 WX-RESPUESTA.
    05 WX-RES1.
       10 FILLER    PIC X(3).
       10 FILLER    PIC X(20).
       10 WX-NOMBRE PIC X(10).

 01 WX-SALUDO       PIC X(30).
 01 WX-HOLA         PIC X(5)  VALUE 'HOLA '.
 01 WX-RESTO-SALUDO PIC X(17) VALUE '! YO SOY EL CICS.'.
*
***********************************************************
 PROCEDURE DIVISION.
***********************************************************
*  | 0000 - PRINCIPAL
*--|------------------+----------><----------+-------------* 

* 1| EJECUTA EL INICIO DEL PROGRAMA 
* 2| EJECUTA EL PROCESO DEL PROGRAMA 
* 3| EJECUTA EL FINAL DEL PROGRAMA ************************************************************
 0000-PRINCIPAL. 

     PERFORM 1000-INICIO 
     PERFORM 2000-PROCESO 
     PERFORM 3000-FINAL 
     . 

************************************************************ 
*  | 10000 - INICIO 
*--|------------+----------><----------+-------------------* 
*  | SE REALIZA EL TRATAMIENTO DE INICIO: 
* 1| INICIALIZACIóN DE ÁREAS DE TRABAJO 
* 2| PRIMERA LECTURA DE SYSIN ************************************************************ 
 1000-INICIO.
*
     INITIALIZE WX-RESPUESTA 
                WX-SALUDO 
     . 

************************************************************ 
*  | 20000 - PROCESO 
*--|------------------+----------><------------------------* 
*  | SE REALIZA EL TRATAMIENTO DE LOS DATOS: 
* 1| REALIZA EL TRATAMIENTO DE CADA REGISTRO RECUPERADO DE 
*  | LA ENTRADA ************************************************************ 
 2000-PROCESO. 
*
     PERFORM 2100-PEDIR-DATOS 
     PERFORM 2200-ENVIA-SALUDO 
     . 

************************************************************ 
* 2100 PEDIR DATOS 
*--|------------------+----------><----------+-------------* 
* ENVIA UN MENSAJE A LA PANTALLA ************************************************************
 2100-PEDIR-DATOS. 
* POSICIONAMOS EL CURSOR EN LA POSICION 21 
     MOVE 21   TO EIBCPOSN 
*
* ENVIAMOS UN TEXTO A LA VENTANA 
     EXEC CICS SEND TEXT 
               FROM (WX-PREGUNTA-NOMBRE) 
               ERASE 
               CURSOR (EIBCPOSN) 
               LENGTH (LENGTH OF WX-PREGUNTA-NOMBRE) 
     END-EXEC 

* RECOGEMOS LA RESPUESTA EN WX-RESPUESTA 

     EXEC CICS RECEIVE 
               INTO (WX-RESPUESTA) 
               LENGTH (LENGTH OF WX-RESPUESTA) 
     END-EXEC 
     .
*
************************************************************ 
* 2200 ENVIAMOS SALUDO 
*--|------------------+----------><----------+-------------* 
* FORMATEA EL NOMBRE PARA QUITAR LOS GUIONES BAJOS 
* ENVIA EL SALUDO PERSONALIZADO A LA PANTALLA 
************************************************************ 
 2200-ENVIA-SALUDO. 

     INSPECT WX-NOMBRE REPLACING ALL '_' BY SPACES 

     STRING WX-HOLA DELIMITED BY SIZE 
            WX-NOMBRE DELIMITED BY SPACES 
            WX-RESTO-SALUDO DELIMITED BY SIZE 
       INTO WX-SALUDO 

     EXEC CICS SEND TEXT 
               FROM (WX-SALUDO) 
               ERASE LENGTH (LENGTH OF WX-SALUDO) 
     END-EXEC 
     . 

************************************************************ 
*  | 30000 - FINAL 
*--|------------------+----------><----------+-------------* 
*  | FINALIZA LA EJECUCION DEL PROGRAMA Y DEVUELVE EL 
*  | CONTROL AL CICS 
************************************************************ 
 3000-FINAL. 

     EXEC CICS RETURN 
     END-EXEC
     . 
*

En el programa podemos ver las siguientes divisiones/secciones:
IDENTIFICATION DIVISION: existirá siempre.
ENVIRONMENT DIVISION: existirá siempre.
  CONFIGURATION SECTION: existirá siempre.
  INPUT-OUTPUT SECTION: en este ejemplo no exisitrá porque no vamos a usar ficheros.
DATA DIVISION: existirá siempre.
  FILE SECTION: en este ejemplo no exisitrá porque no vamos a usar ficheros.
  WORKING-STORAGE SECTION: exisitirá siempre.
  En este caso NO exisistirá la LINKAGE SECTION pues se trata de un programa conversacional en el que el CICS inmobiliza áreas de memoria para guardar los datos intercambiados.
PROCEDURE DIVISION: exisitirá siempre.


En el programa podemos ver las siguientes sentencias:
PERFORM: llamada a párrafo
INITIALIZE: para inicializar variable
MOVE/TO: movemos la información de un campo a otro.
EXEC CICS/END-EXEC: Etiquetas entre las que se codifica una sentencia CICS
SEND TEXT: envía un mensaje de texto al CICS.
RECEIVE: recibe un mensaje de texto desde el CICS.
INSPECT/REPLACING: recorre todos los caracteres de una cadena sustituyendo el carácter indicado en "ALL" por el carácter indicado en "BY".
STRING/INTO: concatena los campos indicados en STRING y los guarda en la variable indicada en INTO. La explicación completa en PROCEDURE DIVISION: proceso del programa.
RETURN: Sentencia de finalización de ejecución. Devuelve el control al CICS.

Descripción del programa:
En el inicio del programa, inicializamos las variables de trabajo WX-RESPUESTA y WX-SALUDO.

En el proceso tenemos los siguientes párrafos:
2100-PEDIR-DATOS.
En este párrafo colocamos el cursor en la posición 21, posición donde empieza la línea para escribir el nombre, informando la variable EIBCPOSN con un 21.
Enviamos el mensaje WX-PREGUNTA-NOMBRE a la ventana con la instrucción SEND TEXT.
En "FROM" indicamos la variable que contiene el texto, en este caso WX-PREGUNTA-NOMBRE.
ERASE limpia la pantalla.
CURSOR posiciona el cursor en la posición indicada en EIBCPOSN.
En LENGTH indicamos la longitud del texto a enviar con "LENGTH OF".

Recogemos la información de la pantalla con la sentencia RECEIVE.
En "INTO" indicamos la variable donde guardaremos la información.
En LENGTH indicamos la longitud de la variable con "LENGTH OF".

2200-ENVIA-SALUDO.
En este párrafo formateamos el mensaje recibido:
INTRODUCE TU NOMBRE:TALLI______
En WX-NOMBRE tendremos el texto "TALLI______". La sentencia INSPECT WX-NOMBRE recorrerá todos los caracteres almacenados en WX-NOMBRE. La sentencia REPLACING ALL '_' BY SPACES sustiruitá todos los guiones bajos por espacios, quedándonos en WX-NOMBRE el texto "TALLI      ".

Con la sentencia STRING concatenaremos el texto "HOLA ", WX-NOMBRE, y "! YO SOY EL CICS." dentro de la variable WX-SALUDO. Con DELIMITED BY SPACES eliminamos los espacios sobrantes en WX-NOMBRE.

Ahora con un nuevo SEND TEXT enviamos WX-SALUDO a la pantalla.

En el párrafo de final codificamos la sentencia CICS RETURN que finaliza la ejecución y devuelve el control al CICS.

Nota para usuarios de Hércules: para que CICS coja la última compilación de nuestro programa (si hemos compilado más de una vez) debemos "refrescarla" desde CEMT:
CEMT SET PROG(PGMCICS1) NEW

RESULTADO:
Ejecutamos el programa escribiendo el código de la transacción y pulsando Intro:


Se muestra el mensaje:


Introducimos nuestro nombre y pulsamos Intro:


Se muestra el saludo:



Como veis esto es una chorrada de programa^^ pero hay que empezar por lo fácil.
En próximos artículos veremos como actualizar ficheros indexados desde un programa COBOL/CICS conversacional. Más adelante veremos el uso de mapas para dar formato a la ventana. Paciencia!

Como siempre, cualquier duda que tengáis... dejad un comentario : )

19 comentarios:

Anónimo dijo...

eres una crack!

Anónimo dijo...

Ya nos podemos hace una idea de cómo funciona el Cobol junto con el Cics; ¿habrá alguna extensión de estás caracetrísticas con más artículos?

Tallian dijo...

Hola Anónimo.

Efectivamente habrá más artículos sobre el tema. Primero un ejemplo de actualización de ficheros desde CICS, y después nos meteremos a los mapas y el CICS pseudo-conversacional.

Saludos!

Anónimo dijo...

Parece que el tema se ha detenido bastante; ya casi estamos en diciembre y no hay nuevo material

Tallian dijo...

Cierto, esperemos ponernos al día en breve. El tiempo libre ha sido escaso últimamente y estas cosas llevan tiempo!
Gracias por la paciencia : )

felipe rosillo dijo...

Hola Tallian gracias por tu tiempo y sobre todo por los detalles en tu explicacion, pero una cosa que no me ha quedado clara es que si vamos a hacer algo nuevo, supongo que los 4 digitos de la transacción , así como el nombre del programa los creo como nuevos ¿no es así?

Tallian dijo...

Hola Felipe, gracias por leernos!

Los 4 dígitos de la transacción serán nuevos (no pueden existir dos iguales) y se generan al hacer el defina trans. Si usas un código de transacción que ya existe no te dejará definirla.
El programa puede ser nuevo o no, pues varias transacciones pueden apuntar al mismo programa.

Nosotros hemos creado primero el programa en una librería host, y después lo hemos definido en CICS.

Espero que te sirva!

brasilianista dijo...

Prezados.
A partir dessa parte: "CEMT SET PROG(PGMCICS1) NEW", aqui da erro, não consigo executar esse programa

Tallian dijo...

brasilianista, esa parte serve para "refrescar" coa derradeira compilación. Para executar tes que teclear o código da túa transación.
saúdos

brasilianista dijo...

ainda continua dando erro:
S PROG(PGMCICS1)
STATUS: RESULTS - OVERTYPE TO MODIFY
Prog(PGMCICS1) Leng(0000000000) Cob Pro Ena Pri Ced LOAD FAILED
Res(000) Use(0000000000) Bel Uex Ful Qua Cic

El Betto dijo...

El famoso Cobol CICS, po ejemplo yo nunca trabajé en Cobol pero si veo que lo piden bastante, lleve el curso pero ya me olvide un poco. Alguién que pueda avisarme de algún curso en Línea?

Nicolas Luca dijo...

Hola buenas, sigue activo?

Tallian dijo...

Hola Nicolas, tan activo como podemos :-)

Nicolas Luca dijo...

Hola como te va Tallian, estoy interesado en aprender todo lo relacionado a Cobol CICS, pero realmente estoy perdido dado que yo trabajo con otros tipos de COBOL y sus metodos de acceso,

Estoy intentando compilar el ejemplo de CICS que realizaste pero me sale el siguiente mensaje:

IGYPS0228-S An "EXEC CICS" statement was found, but the "CICS" compiler option was not in effect. The statement was discarded.

Yo lo trato de compilar mediante la opcion Compilers->1. Foreground Compilers, no ejecuto ningun JCL para compilarlo,

Me podras dar una mano? estoy utilizando un terminal creado con el Hercules,

Muchas gracias!
Saludos.

Pablo Blas dijo...

Hola buen dia, como puedo dar de alta una rutina nueva, ya se compilo pero no la lee el cics me arroja el siguiente error.

S PROG (PS060)
STATUS: RESULTS - OVERTYPE TO MODIFY
Prog(PS060 ) NOT FOUND

Tallian dijo...

Buenas! Comprended que el job de compilación para un programa cobol+cics no es el mismo que para cobol solo, o para cobol+db2.
El error de Pablo, la primera vez debemos hacer CEDA INSTALL PROG(xxxx), después refrescaremos las compilaciones con CEMT SET PROG(xxxxx) NEW
Si el refresco da error, hay varias causas posibles, habría que verlo en directo...

Nicolas Luca dijo...

Si tenes razon pequeño detalle, al intentar compilarlo con el compilador de IBM no esta preparado para compilar cics, me arme un JCL para que haga la traduccion, linkee y compile, lo que me faltaria es subirlo para ejecutarlo

Nicolas Luca dijo...

Hola!! buen dia!, cuando quiero ejecutar la transaccion me arroja CICS Transaction ABGP cannot run because program CBLCICS2 is not available, defini la transaccion, el programa, los implemente, recompile el programa y cuando hago el CEMT SET PROG(CBLCICS2) NEW me arroja LOAD FAILED, que puede ser??? puede ser alguna parametria a la hora de traducir, compilar y linkear el CICS?? muchas gracias!!

Cesar Hernandez dijo...

Wow! Brother. Muchas gracias! por compartir información tan valiosa. La explicación del Ejemplo del Programa-CICS muy completa y puntual. Good! Job.