viernes, 29 de mayo de 2009

Include Vs Copy

Hoy voy a contestar una pregunta que me llego.

Cual es la diferencia entre la sentencia Include y la sentencia Copy?

Si bien las dos sirven para incluir codigo de otro archivo en el programa, la diferencia esta en que la sentencia include se ejecuta con el precompilador DB2 mientras que la sentecia Copy se ejecuta en la compilacion COBOL, entonces si quisieramos incluir variables de una tabla que usamos con la sentecia COPY, el precompilador nos informaria error ya que al compilar las sentencias SQL ve que estan usando variables todavia no incluidas.

Un saludo

Desafio Cobol

Hoy paso a dejarles un link de un desafio apra todos los que trabajen sobre mainframe en sistemas operativos OS390 o Z/OS. Es un enigma en forma de webs html, en el cual para apsar de nivel debes encontrar el nombre de la siguiente pagina y cambiarlo en la url.

El nombre de la pagina es www.desafiocobol.com.ar

Saludos

viernes, 24 de abril de 2009

Tutorial REXX 2°

Operadores.
= igual
>mayor
>=mayor o igual
<=menor o igual <>distinto
& and
| or
&& or exclusivo
Ciclos y condiciones en REXX.
Como ya todos saben programar esta clase la voy a hacer mas rapida limitandome anda mas a mostrar las sintaxys mediante ejemplos dejandole a ustedes la interpretacion. Si surgiera una duda no tituveenen postear su pregunta.
/* REXX EJEMPLO 3 */
/* DO WHILE */
SAY "Ingrese un numero, corte con el -1"
pull A
DO WHILE A <> -1
SAY "NUMERO " A
SAY "Ingrese un numero, corte con el -1"
PULL A
END
/* REXX EJ 4*/
DO I=0 TO 10 BY 2
SAY "NUMERO PAR: " I
END
/* REXX EJ 5*/
PULL I
IF I=0 THEN
DO
SAY "I=0"
END

Tutorial REXX 1°

Hoy voy a empezar con un tutorial REXX empezando desde 0 haciendo nuestro primer "HOLA MUNDO" y luego en posteriores clases llegando a hacer nuestras propias aplicaciones con pantallas para el ISPF.

El REXX bajo mainframe funciona como un lenguaje interpretado. Al igual que otros lenguajes como JavaScript, etc...
Su sintaxis es muy similar al COBOL por lo que no creo que tengan demasiados problemas.

Sin mas preambulos vamos a hacer neustra primera aplicacion REXX y a explicarla.


Creemos en nuestra libreria un dataset con el nombre "Ejemplo1".
Dentro del dataset en la linea de comandos escribimos Highlight REXX, del mismo modo que lo ahce con COBOL nos resaltara las sentecias del REXX.
Y dentro de el vamos a escribir lo siguiente.

/* REXX NUESTRO PRIMER PROGRAMA*/
SAY "HOLA MUNDO"

Los comentarios dentro de un programa rexx se escrima entre /* esto es un comentario */
La primera linea de un programa REXX siempre debe contener la palabra REXX en un comentario.
En la segunda linea estamos usando la sentencia SAY, que al igual que el DISPLAY en cobol sirve como salida por pantalla y entre comillas ponemos el string a mostrar.

Bastante sencillo no?

Vamos con otro ejemplo.
/* REXX EJEMPLO 2*/
SAY "INGRESAR UN NUMERO"
PULL A
SAY "INGRESAR OTRO"
PULL B
C=A+B
SAY "LA SUMA DE " A " MAS " B " DA " C "."

Como veran el pull sirve apra leer del teclado.
Esto fue todo por hoy, espero les haya servido ya se que fue muy sencillo pero ya vendran cosas mas dificiles.

Comandos TSO

Les dejo a continuacion una lista util de comando TSO con su explciacion en ingles.
#
Invokes a command processor located in a load library allocated to file CMDLIB.
AD
Puts a discrete RACF profile on a specific dataset.
ALias
Gives alias names to members of partitioned datasets. Because use of this command on a load library produces unpredictable results, it is advisable to use LINK in this situation.
ALLOCate
Allocates or creates temporary datasets, associates a file name with a data set, or designates files for output.
ATTRib
Defines DCB parameters to be used with a subsequent ALLOCATE command.
CALL
Executes load modules (programs already compiled and link edited) at the terminal.
CHANGE
Changes the name of a member of a partitioned dataset which is allocated SHR (allocated to more than one user or job at a time). Use of this command on a load library produces unpredictable results.
CODE
Produces an explanation of system completion codes and FORTRAN error codes.
CONCAT
Concatenates (combines) two or more datasets under a single file name. The ALLOCATE command can also perform this function.
DCF
Invokes IBM's Document Composition Facility (DCF) text formatting program.
DD
Deletes the RACF profile for a dataset
DELete
Deletes a data set or a member of a partitioned dataset.
DISASSEM
Disassembles a load module.
DUPlicat
Prints the contents of a dataset.
Edit
Invokes the IBM line editor.
EXec
Executes a clist (command procedure).
FREE
Frees data sets and files allocated to the user's TSO session and deletes attribute lists.
Free All
Frees all data sets and files allocated to the user's TSO session except those allocated by the LOGON procedure.
GI
Invokes ISPF (Interactive Systems Productivity Facility).
HELP
Obtain help about TSO commands.
HELPJCL
Lists the statements necessary to use a catalogued procedure.
HEX
Performs hexadecimal addition or subtraction at the terminal.
IOF
Allows you to show the status of jobs and to browse, print, or cancel the output from jobs.
JOURNAL
List amount of money charged to an account or computer ID.
KERMIT
Transfer a file between a microcomputer and the OS/390 mainframe system.
LD
Lists the RACF profile for a dataset.
LINK
Executes the linkage editor from the terminal.
List
Lists the contents of a sequential dataset or of a member of a partitioned dataset.
LISTAlc
Lists the names of datasets and files currently allocated to the user.
LISTBc
Lists messages saved in the broadcast dataset.
LISTCat
Lists the names of catalogued datasets.
LISTDs
Lists DCB attributes of a dataset or of the members of a partitioned dataset.
LISTHEX
Lists the contents of a dataset in hexadecimal.
LISTLOAD
Lists the names of members of a load library, along with the size and attributes of each load module.
LOADgo
Executes the loader, which loads an object deck (compiled program), resolves external references, and executes the program, from the terminal.
LOGOFF
Ends a TSO session.
LOGON
Initiates a TSO session.
PDS
Access and manipulate the directory and members of a PDS (partitioned dataset).
PE
Provides another user RACF access to specified datasets.
PROFile
Defines certain user characteristics which control the flow of information to and from the user's terminal.
REName
Changes the name of a sequential dataset, of a partitioned dataset, or of a member of a partitioned dataset, or creates an alias for a member of a partitioned dataset. This will not work for load modules (DO NOT rename a permanent dataset).
Run
Compiles, loads, and executes the source statements in a data set.
SAS
Invokes interactive SAS.
SCAN
Searches a load module for a specified hexadecimal string.
SCRatch
Deletes a member of a partitioned dataset.
SEnd
Sends messages to other TSO users.
SHow
Shows the status of a particular job, the status of all jobs belonging to the user, the number of jobs awaiting execution, or the different output files for a particular job.
SIZE
Displays amount of space allocated to a dataset and how much of that space is used.
SPACE
Lists the names of disk packs available to house temporary datasets and how much space is available on them.
SPEAKEZ
Invokes the SPEAKEASY processor.
SUBmit
Submits a job from the terminal (NOTE: SUB is the alias for this command).
TERMinal
Defines terminal characteristics (such as number of lines per screen).
TEST
Debugs assembler language programs at the terminal.
TIME
Displays cumulative CPU time, cumulative session time, service units used, local time of day, and today's date.
TYPE
Prints a message at the user's terminal.
US
Lists all TSO users currently logged on and displays the number of such users.
WhatLine
Lists all TSO users currently logged on together with their line numbers and terminal names.
WHEN
Tests the system return code from a previously executed command.
WHOGOT
Determines to what user or to what job a particular dataset is allocated.
?
Displays additional information if a user has just received a message terminating with a plus sign (+).

Iniciar ISPF Automaticamente con REXX

Buenos dias, hoy les voy a contar como generar un sencillo script en REXX que inicie automaticamente el ISPF cuando nos logueamos al TSO.
Esto en varias implementaciones del ISPF ya viene echo, pero como no sucede en todas considero bueno mostrar como hacerlo.

Cuando uno se loguea al TSO luego de pasar la validacion RACF el puntero se queda en un pantalla negra titilando seguido de la palabra READY. En este momento si ingresamos ISPF y enter se abrira el ISPF.

Para evitar esto lo que podemos ahcer es allocar en la SYSPROC o SYSEXEC un pequeño script que lo haga por nostros.

Para los que no saben cuando uno se loguea al systema se carga automaticamente el archivo de logon guardado en la SYSEXEC de no encontrarlo ahy lo busca en la SYSPROC. Si no saben que libreria esta identificada como SYSPROC O SYSEXEC en su tso pueden ejecutar el comando "LISTALC STATUS" y verificarlo ahy.

Bueno dicho esto les voy a pasar a mostrar el pequeño script, el cual luego debemos guardar con el nombre "LOGON" dentro de la libreria mensionada.
Script

/* REXX */
"ISPF"

Fin script

Asi es tan corto como eso, la primera linea nos indica q es un programa REXX, y la segunda linea al estar entre comillas lo considera comando TSO y lo ejecuta.

Entonces guardando este pequeño script en la libreria con el nombre de LOGON, cada vez que iniciemos el tso se abrira automaticamente el ISPF.

Espero haber sido claro cualquier cosa no duden en preguntar y los invito a dejar comentarios diciedno que les parecio y sobre que quieren escuchar.

viernes, 3 de abril de 2009

ISPF 5 Tips

Buenos días, hoy les hago llegar 10 tips para ISPF que fueron publicados en el foro de ibm hace un tiempo. Como los considero utiles e interesante les dejo la traduccion a continuacion para ustedes.

TIP # 001

ISPF

Si estas editando un programa y queres saver los cambios que hiciste desde la ultima ves que salvaste.

Respuesta:

usar COMPARE SESSION en la linea de commando

- Puede ser usado como la opcion 3.13


TIP # 002

ISPF

Cuando se modifica o se crea un PDS se registra el id del usuario que realizo la ultima modificacion.

Pero es posible cambiar este id?

Respuesta:

Si es posible!! Eligiendo el elemento con la letra G, se desplegara un pop up para cambiar el id que lo edito.


TIP # 003

ISPF

Suponte que estas en una ventana de ISPF y quieres saber en que region TSO te encuentras.

Respuesta:

Tipea en la linea de commandos: SAREA

Se abrira ISPF STATISTICS Pop-up mostrandote la region y mas informacion.


TIP # 004

ISPF

Todos los comandos entrados en la linea de comandos luego de ejectarse se borran.

Pero si quieres repetir el comando varias veces puedes usar el simbolo &. Los comandos precedidos pro este simbolo permaneceran en la linea de comandos para que puedan volverse a usar.

Ejemplo:

COMMAND ===> &C '110-PARA' '220-PARA' SCROLL ===> CSR

****** ************************ TOP OF DATA **************

000001 IDENTIFICATION DIVISION.

000002 PROGRAM-ID. COBOLSAMY.

000003 DATE-WRITTEN. APRIL 2004.


TIP # 005

ISPF

Cuando se intenta abrrir algun elemento aveces sucede que nos informa "member in use" si queremos saber que usuario lo esta usando solo tenemos que presionar dos veces la tecla F1.


Proximamente pondre mas un saludo

jueves, 26 de marzo de 2009

Donde ocurrio un 0C7

Hoy vamos a ver como detectar donde se produjo un error 0C7
(CEE3207S System detected a data exception(Code=0C7))

Cuando un programa finaliza con un error 0C7 quiere decir que en alguna parte del mismo se esta intentando asignar datos de un tipo no aceptado por la variable destino. Como podría ser intentar pasar letras a una variable numérica.... etc

En programas grandes suele ser muy dificultoso darse cuenta cual es la variable en conflicto por eso hoy vamos a utilizar datos de la compilación para poder identificar rápido y fácilmente donde se produce el error.

-El primer paso es ejecutar el programa, y luego de producirse el error acceder a la sysout del job y copiar las cifras significativas (6 ultimas) del offset en el que indica que sucede el error.

-Luego volvemos a compilar el programa pero agregando al job de compilacion los parametros LIST, MAP. Estos generaran una referencia cruzada entre los offset y las sentencias.

Ej:
//COBOLMVS EXEC PGM=VIACOBII,
//PARM=('C,RES,RENT,FSRT,NOSEQ,VBREF,TRUNC(OPT),OFF',
//'DATA(31),XREF,APOST,NONUM,LIST,MAP,NOOPT,LIB,F(I ,I)'),
//COND=(7,LT),REGION=4096K
//*STEPLIB DD DSN=SYS1.ADCOB.SIGYCOMP,DISP=SHR

-Finalizada la compilacion accedemos a la salida del Job de compilacion y buscamos el offset que teniamos. Alli nos encontraremos con el tipo de sentencia COBOL que produjo el error y un codigo de linea en el codigo sobre la cual se produjo el error.

Ej:
LINE # HEXLOC VERB
006469 000D6A MOVE
006480 000D8E STOP

-Buscamos ese codigo de linea en la sysout en la que estamos y encontraremos la linea exacta del codigo en la que se produjo el data exception.

Espero les haya sido util, y cualquier cosa no duden en preguntar.

Saludos

I see dead variables

He visto que mucha gente aveces tiene que limpiar el código en búsqueda de variables que no estén en uso y no sabe como hacerlo, se que revisar una a una por todo el código puede llegar a ser muy tedioso, por eso acá les dejo una forma de agilizar lo un poco.

Lo que vamos a hacer es generar en la compilación una lista cruzada entre las variables y las posiciones en las que se están usando, ya con esto solo tendríamos que ver en la lista que variables no se estan usando en ninguna posicion y tendriamos todas las variables sin referencia para borrarlas.

Para generar esta lista debemos editar el job de compilacion que estemos usando y pasarle el parametro XREF. Este parametro es el que se encargara de generar la lista cruzada en la sysout.

Veamos un ejemplo.
En esta procion de Job de compilacion podemos ver los parametros

//COBOLMVS EXEC PGM=VIACOBII,
//PARM=('C,RES,RENT,FSRT,NOSEQ,VBREF,TRUNC(OPT),OFF',
//'DATA(31),XREF,APOST,NONUM,LIST,MAP,NOOPT,LIB,F(I,I)'),
//COND=(7,LT),REGION=4096K
//*STEPLIB DD DSN=SYS1.ADCOB.SIGYCOMP,DISP=SHR

Luego de correr el Job con el parametro XREF, vamos al spool y bsucamos en la salida del Job la leyenda...
'Cross-reference of data names'
Seguido a esto aparecen listadas todas las variables con sus referencias.
Ej:
58 WS-VARIABLE1
63 WS-VARIABLE2. . . . . . . . . 4302
64 WS-VARIABLE3. . . . . . . . . 4301

Como se ve en este ejemplo las variables 2 y 3 son utilizadas en las lineas 4302 y 4301 respectivamente. Pero la variable1 NO ESTA EN USO.

Inicio del Blog

Esta es la primera entrada del blog y por eso no voy a escribir de ningún tema en particular sino dedicar un par de lineas a contar de que se trata y cual es el objetivo de este blog.

Inicio este blog con la intención de compartir con el resto de la comunidad cobolera mis experiencias y aprendizajes en el ambiente del cobol. Llevo trabajando unos años en OS/390 Y Z/OS por ello la mayoria de mis entradas iran orientadas al uso del cobol en estos sistemas, pero los invito a ustedes a mandarme articulos relacionado con COBOL o lenguajes con los que convive para ser subidas al blog.

Espero que juntos podamos aramar una buena base de referencia para todos los coboleros.

Les dejo mi email desafiocobol@gmail.com.

Saudos