Publicado el Martes 22 de Mayo del 2007 @ 3:51 por Kujaku.
Bueno, en el tocho de hoy, vamos a centrarnos en como crear un programa COBOL que mediante una transacción CICS, se ejecute y nos saque por pantalla un “Hola Mamones”.
Pero antes de meternos en el rollo de programar, primero hay que aclarar una serie de conceptos de CICS.
Para empezar, una transacción CICS puede ser de muy diversa índole y puede ser lanzada de muchas maneras: La puedes teclear en tu terminal, la puedes lanzar por un socket, o incluso puedes hacer un FTP y lanzar un JCL que a su vez lance una transacción, siempre y cuando se cumplan los requisitos de seguridad, y demás que obviaremos porque me eternizaría (aun mas). En nuestro caso, vamos a centrarnos en la parte más tradicional del CICS, es decir, que un usuario teclee una transacción y le salga por pantalla un mensaje.
Ni que decir tiene que CICS es un sistema muy robusto, tanto, que se queja por todo. Pero por TO-DO. Esa es una de las razones por las que es muy difícil que se cuelgue un programa, porque tienes que tener en cuenta todas las variables posibles de error y codificarlas, porque de lo contrario, CICS cancela la transacción así por las buenas, y con un bonito ABEND de regalo. Así que hay que tener cuidado a la hora de programar, pero no os preocupéis, el programa que vamos a codificar es tan sencillo que no hará falta realizar ningún tipo de control de errores. De hecho, ni siquiera lo haremos pseudo-conversacional, porque solo haremos que se muestre un mensaje y saldremos del programa, con lo que el CICS finalizará la transacción. No obstante, si os animáis, en una entrega posterior, podemos complicar un poco el programa para que veáis más conceptos de CICS.
Así que vamos al meollo de la cuestión: Hemos hablado de Transacciones, de Programas y de Pantallas de usuario. Pues en CICS hay que crear las 3 cosas: Hay que crear un programa, hay que crear la transacción que llamará al programa, y hay que crear la pantalla del usuario. Empezaremos por este último paso.
Una Pantalla de usuario, o, en la jerga CICSera, mapa BMS (Basic Mapping Support), es una plantilla de lo que queremos que aparezca por la pantalla del terminal cuando invoques a la transacción: Puede ser un título, o unos campos a rellenar, o cualquier cosa que se te ocurra en 24 lineas por 80 columnas. En nuestro caso, pondremos un cuadrado mas o menos centrado y su interior, el texto Hola Mamones, y podemos utilizar alguna característica 3270, como poner un color, por ejemplo. Todo esto lo voy a hacer a mano, pero existen muchas herramientas como VisualAge por ejemplo que te hacen las pantallas automáticamente. Pero a mi me gusta mas hacerlo a mano, porque se optimiza mucho mas el código (si, también me gusta escribir HTML en el Notepad, ¿pasa algo? xDDD).
Un MAPSET es un conjunto de mapas, que, al igual que los <div> de las webs, pueden definir regiones dentro de la pantalla que cada una tenga características distintas, pero en nuestro caso, vamos a crear un mapset y un mapa que ocupe toda la pantalla, para hacerlo mas fácil. El código que yo he hecho ha sido este:
HOLAMP DFHMSD TYPE=DSECT,MODE=INOUT,TERM=ALL,STORAGE=AUTO,LANG=COBOL
HOLAMP DFHMDI SIZE=(24,80),LINE=1,COLUMN=1,COLOR=GREEN,HILIGHT=OFF, X
MAPATTS=(COLOR,HILIGHT),DSATTS=HILIGHT,CTRL=FREEKB
DFHMDF POS=(10,10),LENGTH=20,INITIAL='********************', X
COLOR=BLUE,ATTRB=(ASKIP,NORM)
DFHMDF POS=(11,10),LENGTH=20,INITIAL='* *', X
COLOR=BLUE,ATTRB=(ASKIP,NORM)
DFHMDF POS=(12,10),LENGTH=20,INITIAL='* HOLA, MAMONES! *', X
COLOR=BLUE,ATTRB=(ASKIP,NORM)
DFHMDF POS=(13,10),LENGTH=20,INITIAL='* *', X
COLOR=BLUE,ATTRB=(ASKIP,NORM)
DFHMDF POS=(14,10),LENGTH=20,INITIAL='********************', X
COLOR=BLUE,ATTRB=(ASKIP,NORM)
DFHMSD TYPE=FINAL
END
Tanto al mapset como al mapa, lo he llamado HOLAMP. También guardaremos el fichero con el mismo nombre, ya que el CICS va a ir a buscar ese fichero y debe coincidir con el nombre del mapa. Como podréis ver, hay 3 tipos de “instrucciones”:
DFHMSD, hace referencia al MAPSET. Tiene una serie de variables que no comentaré aquí porque me alargaría todavía más, pero ya veis que el subtipo TYPE da la referencia de donde empieza y donde acaba.
DFHMDI, hace referencia al MAPA en cuestión, y como podréis ver entre otros parámetros, muestra el tamaño de dicho mapa.
DFHMDF, hace referencia a los CAMPOS de ese mapa. Cada campo puede ser editable o no, y podría cada uno tener colores distintos, etc. También se le indica la posición de ese campo dentro del mapa con el parámetro POS. En nuestro caso, este mapa solo va a mostrar datos, nada mas, por lo que en el campo INITIAL pondremos el contenido que queramos poner, en nuestro caso, el banner, y queremos que sea de color azul.
Con esto, ya tenemos los datos que saldrán por pantalla. Lo siguiente que haríamos, será compilar dicho mapa con el compilador de COBOL, con un JCL, finalizado el cual dejará dos ficheros: Uno, el mapa compilado y linkeditado que usará el CICS para mostrarlo por pantalla, y el otro, la COPY del mapa. Este último fichero sirve para que, añadiéndolo al programa en la WORKING-STORAGE SECTION, el programa tenga la referencia de a que llamar para que el CICS lo llame.
Generalmente, este fichero si tuviera campos editables y para rellenar, sería muy larga, porque todo mapa tiene un campo que se trata como entrada (I) que es cuando el usuario ha introducido algo, y otro que se trata como Salida(O) que es cuando el CICS le debe responder en un campo. Por ejemplo, si tuviéramos un campo llamado DNI para rellenar, el compilador haría 2 Redefines de ese campo: DNII cuando el usuario Introduzca el DNI, y DNIO cuando el programa quiera escribir ahí un DNI de una base de datos, por ejemplo. El caso es que nos ha salido un churro como este:
01 HOLAMP PIC X(100).
01 HOLAMPI REDEFINES HOLAMP.
02 FILLER PIC X(12).
01 HOLAMPO REDEFINES HOLAMPI.
02 FILLER PIC X(12).
Traduciendo, el mapa ocupará 100 bytes, y luego deja 12 bytes (no me digáis para que, que no tengo ni idea), y como no tiene campos editables de entrada ni de salida, el mapa de entrada HOLAMPI es redefinido con el de salida (HOLAMPO). Pues esas 5 líneas las pegaremos en nuestro programa COBOL cuando lo escribamos, en la zona WORKING-STORAGE SECTION.
Lo malo del COBOL, es que es estricto de narices en su escritura y su estructura, y un espacio de más o de menos en ciertas columnas puede hacer que el programa (por ejemplo, los comentarios empiezan con asterisco en la columna 8, y solo en la 8) dé mil quebraderos de cabeza. Lo bueno, es que una vez superada esa tocada de narices, programas líneas una detrás de otra como si estuvieras manteniendo una conversación en ingles, y es tremendamente fácil y potente. Para mí, mucho más fácil que JAVA o C.
Sin mas, el programa sería algo tan sencillo como esto:
*************************************************
*
* PROGRAMA HOLA MAMONES DE CICS-COBOL
*
*************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. HOLA.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 HOLAMP PIC X(1000).
01 HOLAMPI REDEFINES HOLAMP.
02 FILLER PIC X(12).
01 HOLAMPO REDEFINES HOLAMPI.
02 FILLER PIC X(12).
*
PROCEDURE DIVISION.
*
MOSTRAR-MAPA.
EXEC CICS SEND MAP('HOLAMP')
MAPONLY
ERASE
NOHANDLE
END-EXEC.
FIN-PGM.
EXEC CICS RETURN
END-EXEC.
GOBACK.
Lo cojonudo del caso es que casi hay más líneas de código de la “estructura” obligatoria a seguir de COBOL, que lo que realmente hace el programa. Pero vamos, lo que hemos puesto es lo siguiente:
En la Working, hemos pegado la copy del mapa que hemos hecho antes.
Hemos escrito un procedimiento llamado MOSTRAR-MAPA que no hace más que un EXEC CICS enviando el mapa. Con la opción MAPONLY, te curas en salud y te pasas por el forro la gestión de errores porque con esto le dices al CICS que solo va a mostrar un mapa, y que el usuario no va a teclear nada más.
Y hemos escrito otro procedimiento llamado FIN-PGM que lo que hace es devolver el control al CICS. Como van seguidos, una vez ejecutado el MOSTRAR-MAPA, ejecutará este y por lo tanto, saldrá del CICS.
Con otro JCL, compilaremos dicho programa y su programa “linkeditado” se quedará en una librería que el CICS tenga configurada como de carga de programas (al igual que el mapa), y deberá llamarse igual que el PROGRAM-ID que hemos puesto (en nuestro caso, el fichero se llamará HOLA).
Bueno, estamos en la recta final del tocho. Ahora que tenemos el programa y el mapa compilados, hay que molestar al CICS para decirle que tiene disponibles un programa y un mapa para que vía una transacción, muestre todo. Para ello, la herramienta que utilizaremos para molestar al CICS es la transacción CEDA.
Usando la CEDA (no tiene nada que ver con ceder el paso xDDD), definiremos la transacción, el programa y el mapa. CICS, para poder administrarse mejor, esta dividido en Grupos de aplicaciones, ya que si no, nos volveríamos locos si tenemos miles de programas y hay que buscar alguno en concreto. Es por ello, que crearemos un grupo llamado HOLA, en el que definiremos el programa, la transacción y el mapa. Decir también que el grupo se crea cuando creemos el primer miembro del grupo, por ejemplo, si empezamos definiendo el programa, y siempre que tengamos los permisos adecuados para ejecutar la transacción CEDA, haremos lo siguiente:
CEDA DEF PROG (HOLA) GROUP (HOLA)
Ahora, definiremos el mapa con el comando siguiente:
CEDA DEF MAP (HOLAMP) GROUP (HOLA)
Y por último, definiremos la transacción, la llamaremos HOLA (como tiene 4 caracteres, va que ni pintado) y le pondremos como parámetro cual es el programa que tiene que llamar en primer lugar, que, como en nuestro caso es HOLA, pues lo pondremos así:
CEDA DEF TRANS(HOLA) PROG(HOLA) GROUP(HOLA)
Bien, hasta aquí tenemos todo definido. Si hacemos un CEDA DI GROUP (HOLA), aparecerá una lista tal que esta:
DI GROUP(HOLA) ENTER COMMANDS NAME TYPE GROUP DATE TIME HOLAMP MAPSET HOLA 07.137 13.00.01 HOLA PROGRAM HOLA 07.137 12.59.45 HOLA TRANSACTION HOLA 07.137 12.59.32
Pero faltan dos pasos todavía: Hay que INSTALAR lo definido para que el CICS lo recuerde siempre a partir de ahora, y eso con poner una I a continuación del grupo en las tres líneas, y damos al enter, se instalará todo, y debería quedarse la pantalla algo como esto:
DI GROUP(HOLA) ENTER COMMANDS NAME TYPE GROUP DATE TIME HOLAMP MAPSET HOLA i INSTALL SUCCESSFUL HOLA PROGRAM HOLA i INSTALL SUCCESSFUL HOLA TRANSACTION HOLA i INSTALL SUCCESSFUL
¿Ya estamos listos? No. Falta un último paso: Cargar el programa. Con la CEDA, hemos definido el programa y lo hemos instalado, pero con eso no basta, el código binario del programa se debe cargar en la región del CICS, para así poder ser ejecutado. Con el mapa no es necesario, porque es el programa quien llama al mapa, pero el programa debe estar siempre cargado. Así que haremos uso de la transacción CEMT para cargarlo.
Si hacemos un CEMT S PROG(HOLA), tendría que salir algo similar a esto:
S PROG(HOLA)
STATUS: RESULTS - OVERTYPE TO MODIFY
Prog(HOLA ) Leng(0000000000) Cob Pro Ena Pri Ced
Res(000) Use(0000000000) Bel Uex Ful Qua
Como podréis observar, el campo Leng está a ceros, es decir, el CICS sabe que tiene algo reservado, pero no está ocupado. Así que si ponemos el cursor entre el campo Pri y el campo Ced, y tecleamos una N (Newcopy), al pulsar Enter el valor de Leng debe cambiar y mostrar el tamaño en bytes del programa, quedando algo así como esto:
S PROG(HOLA)
STATUS: RESULTS - OVERTYPE TO MODIFY
Prog(HOLA ) Leng(0000004736) Cob Pro Ena Pri N Ced NORMAL
Res(000) Use(0000000000) Bel Uex Ful Qua
Pues bien, ya está todo preparado. Si tecleamos en nuestra pantalla, la transacción HOLA, veremos lo siguiente:
******************** * * * HOLA, MAMONES! * * * ********************
Y con esto, se acaba la transacción, y evidentemente ha sido instantánea.
Si lo pedís y estáis interesados, podría escribir en otra entrega la manera de complicar un poquito el programa y hacer que interactúe el usuario, de tal forma, que según la opción que teclee, le salga un mensaje u otro, y todo de manera conversacional.
Buenisimo Kujaku, mas claro no lo podias explicar y si estoy muy interesado en ver un ejemplo con interacción del usuario. También me interesaria si puedes en algún momento explicar algo de RACF.
Saludos y Gracias.
Como estímulo extra para la consecución de una serie de artículos relacionados con la programación en COBOL tendrías(is) que comentar los pelotazos que puedes conseguir en este mundillo.
Conozco un caso de un chaval que se mudó de Barcelona a Madrid, pasando de cobrar 42.000 sencillamente por saber programar en cobol.
Más allá de allí …
mierda de preview en IE … lo correcto era:
“pasando de cobrar 42.000″
Hola, yo trabaje en RM-COBOL y
MS-COBOL hace casi 20 años!!!
ahora veo que estan solicitando
gente que conozca de COBOL CICs
y COBOL VAX, como posteriormente
trabaje en ORACLE y visual BASIC
tengo una idea de lo que has explicado, pero que es COBOL VAX o
cual es su diferencia con el CICS
crees que seria muy dificil aprender
estos teniendo como base el cobol
que aprendi….
Gracias.
Ah, tu explicacion me parecio muy
buena.
Me parece muy bien aunque me falta por entender mucho aun
acerca de Cobol, de CICS y de JVL.
Espero siga explicando claros ejemplos y donde conseguir
los mas actuales compiladores para Cobol.
Muchas Gracias y saludos a todos.
Soy de Perú y yo se cobol vax, quisiera aprender cobol cics
y me parecio muy ilustrativo tu ejemplo.
Podrias hacer uno pero utilizando archivos…
gracias
oye recurro a ustedes para ver si me pueden ayudar con urgencia. necesito hacer un programa en cobol. y el enunciado dice asi. lo que nesecito entregar deba mostrar un menu de 4 opciones un consulta para solicitar un presupuesto para un vehiculo el monto del vehiculo es de 10.000.000, la inicial es de 5.000.000, el saldo deudor es de 5.000.000, financiamiento es de 12, 24, 36, 48 meses y los intereses son de 1.500.000 . les sabria agradecer porfavor .. gracias
Hola ..tu ejemplo estuvo claro pero hay algunas cosas que quedaron sueltas como la definición CEDA y cargar el programa con CEMt necesito mas detalle de esto y si siempre se tiene que hacer
esto para todos los programas cobol cics
todo ok yo quiciera saber como se imprime en
cics en toso caso como se usa el spooll
gracias
tengo el mayor interes de aprender cobol, por lo interesante q es en el ambito laboral. tiene mucha dificultad? soy ignorante en el tema y quiero dominarlo. se puede en breve.?
Muy buena explicacion Kujaku, podrias por favor dar otros ejemplos. Se te saluda desde Venezuela. Gracias
Hola gracias por tus aportes al mundo mainframe, justo estoy postulando a un trabajo nuevo en una multinacional y hacia mas de 10 años que no veia nada de mainframe.
Espero que continues con tus articulos ya que son muy utiles.
Saludos desde Chile
Geniales notas !!!!!
Hola buenos días, trabajo para una consultora y estamos buscando programadores de Cobol/Cics/db2 que vivan en Madrid (España) Si estas interesado mándame tu currículo a la siguiente dirección :
alazne@loyalinfinity.com REF:trabajo cobol madrid,
Un saludo,
Estas explicaciones son geniales. Ayudan un montón a hacerse una idea más clara de todo esto. Gracias
Me interesaria tener el programa COBOL para poder estudiar en mi ordenador particular. Decidme como lo puedo conseguir.i
podrias enviarme alguna informacion referida a las colas TS y su tratamiento.
saludos
Estan buenos los ejemplos, existe software para PC que simule un MAINFRAME con COBOL, CICS Y JCL’S
Buenas , me adhiero a un comentario, es muy complicado el paso ce cobol rm a cobol cics, quisiera mas informaciòn… gracias
Muy buen artículo, siento haberlo descubierto tan tarde “lo digo por fechas”, estoy bastante interesado en la administración del Cics si puedes pasarme algo te estaré muy agradecido.
Kujaku te cuento que llevo dias estudiando los manuales oscuros de cics y revisando comandos en la terminal y programas de la empresa. Estoy de acuerdo en que se necesita saber y querer transmitir el conocimiento. Lo haces muy bien, no se de quien fue la idea pero con entregas sencillas y claras podemos entender con facilidad temas algo reservados. Las cosas son difíciles cuando no las conocemos, pero cuando lo sabemos se tornan faciles aunque mantengan su complejidad.
Pienso que la funcion del ser humano en el universo es el servicio a los demas y en general. Te imaginas donde estariamos si nuestro motor de vida fuera el amor? A donde habriamos alcanzado a llegar sin egoismos ni temores? En lo que te pueda servir por aca (bogota - colombia) por favor escribe mas entregas de ejemplos en programacion cics. Un abrazo y muchisimas gracias.
Hola necesito saber como se usa el linkage section en un mapa, si alguien me pued ayudar gracias!!!!!!!!!!!!!!!!!!!!1
Kujaku, es muy buena tu iniciativa de comunicar lo que sabes, tambien yo lo hago ejerciendo docencia. Conozco bastante de cobol, rm, ms, wow, mainframe, etc, me interesa seguir conociendo mas sobre cics. Existos. Argentina al habla.
Hola muchas gracias por el articulo no he tenido tiempo de leerlo con tiempo pero ya esta en los favoritos. Yop estoy trabajando en el mundo oscuro del cobol y pense que estaba perdiendo el tiempo y todo lo aprendido en la U, pero me di cuenta que es una muy buena fuente de ingresos a explotar, cualquier cosas en que pueda colaborar con gusto.
Pero no un poco más de delicadeza al pedirlo y que se note un poco de esfuerzo de quien lo pide.
CARLOS
Hola, yo trabaje en RM -OBOL y
MS-COBOL hace casi 20 años!!!
ahora veo que estan solicitando
gente que conozca de COBOL CICs
y COBOL VAX, como posteriormente
CONCRETAMENTE PARA QUE SIRVE EL CICS
crees que seria muy dificil aprender
estos teniendo como base el cobol
que aprendi….
Gracias.
Hola Kujaku mucho gusto, soy mexicano y estoy estudiando algo de CICS y la verdad es que tu entraga no es buena, es buenisima, o como decimos en Mexico (Chingonsisima) ya que en tres patadas has definido todo el puto manual, felicidades por tu estilo y por tu apoyo gracias. De ser posible me gustaria me enviaras la siguiente entrega que mencionas, la de interactar con usuario, de tal forma, que según la opción que teclee, le salga un mensaje u otro, y todo de manera conversacional. De antemano gracias
Que recuerdos el cobol, de mi época estudiantil, ahora estoy con el SAP/ABAP, y tiene mucho más futuro que el Cobol, por eso recomiendo a la gente que de aprender, se vayan al ABAP