jueves, 31 de mayo de 2012

Respuestas de la semana III

Pregunta 1:
llamadas estaticas y dinamicas

Respuesta 1:
Las llamadas a módulos se realizan mediante la sentencia CALL. Estas llamadas pueden realizarse de dos formas:
Estática: lleva el nombre del módulo entre comillas.
CALL 'PROGRAMA' USING XXXXX
Después de la llamada el módulo queda residente en memoria, porque se integra en el programa objeto. Lo que quiere decir que el código de la rutina queda integrado dentro del objeto del programa llamante. Si se modificase la rutina, habría que recompilar todos los programas que la llaman para que integren el nuevo código y no se queden con el viejo.

Dinámica: utiliza una variable que contiene el nombre del programa.
CALL WX-PROGRAMA USING XXXX
donde
01 WX-PROGRAMA PIC X(8) VALUE 'PROGRAMA'.

Después de la llamada el módulo es descargado de la memoria. Son objetos independientes de los programas llamantes.


Pregunta 2
perform thru

Respuesta 2:
En los ejemplos del consultorio siempre utilizamos la sentencia PERFORM para llamar a un párrafo, sin utilizar el THRU. La razón es que en los clientes en los que hemos trabajado es la norma.
Un PERFORM/THRU se codificaría de este modo:
PERFORM 1000-INICIO
   THRU 1000-INICIO-EXIT

Donde
1000-INICIO.
    código cobol

1000-INICIO-EXIT.
    EXIT.


El párrafo 1000-INICIO-EXIT sólo contiene la sentencia EXIT.

Otra opción sería:
PERFORM PARRAFO1
   THRU PARRAFO3


Y ejecutaría todo el código que hubiese entre ambos párrafos, y PARRAFO3 contendría la sentencia EXIT.

Hoy día se podría decir que no se utilizan del mismo modo que no se utiliza el GO TO. Evitas riesgos. Para un cliente grande puede haber cientos de programadores codificando cada día, y seguro que no todos somos unos craks... Así que mejor no arriesgar! Sin olvidar que lo normal es que el párrafo del THRU vaya justo después del párrafo indicado en el PERFORM (como en el ejemplo 1), por lo que su utilidad sería dudosa cuando menos. Además, ahorramos líneas de código y tiempo si pasamos del THRU :P


Pregunta 3:
enviar sysout a archivo

Respuesta 3:
Cuando estamos probando un programa (ya sea batch u online), solemos ir a la cola SYSOUT a ver los DISPLAYs que hayamos puesto (o los mensajes de error, o lo que sea). Esta información a veces es útil guardarla en fichero para no perderla (y no tener que copiar pantalla a pantalla a un txt...).
Para ello:
Entramos con ? en nuestra ejecución (nombre del job para batch, cola del CICS/IMS para online).
Nos posicionamos en la cola SYSOUT que contiene los mensajes y escribimos SE.


Ahora en la línea de comandos escribimos CREATE y un nombre de fichero (el que sea) y copiamos todo el código (C9999).


Elegimos la opción 2 para indicar los atributos del fichero y rellenamos los campos necesarios (podemos abrir otro fichero que ya exista y ver sus atributos escribiendo una S delante del nombre del fichero).
Y listo, tenemos nuestra información guardada en fichero^^


Pregunta 4:
error b37 cobol

Respuesta 4:
El error B37 aparece en el artículo de Errores de sistema y nos indica que un fichero se ha quedado sin espacio.
Esto puede ocurrir porque hemos definido un fichero como TRK y necesitamos un CYL, o incluso un TAPE. Por ejemplo:
SPACE=(TRK,(100,50)) si aumentamos pistas: SPACE=(TRK,(500,50))
SPACE=(CYL,(100,50)) si aumentamos cilindros: SPACE=(CYL,(500,50))
Y sino habremos llegado al UNIT=TAPE^^

Pero si estamos probando algo nuevo, puede ser que haya un error en el programa y estemos escribiendo en el fichero indefinidamente (nos hemos embuclado y estamos llamando al párrafo que hace el WRITE indefinidamente). Por si acaso, antes de aumentar las pistas o los cilindros, revisad el código no vaya a ser!

3 comentarios:

Facundo dijo...

Para descargar el SYSOUT a un archivo secuencial también se puede usar el comando XDC, es decir en lugar de poner ? ponemos XDC y saldrá una pantalla solicitando un nombre para el archivo.

Saludos muy buena página.

Tallian dijo...

Gracias Facundo! Muy buen aporte!

dante rodik darkus dijo...

hola que tal se puede llamar a un perform de otor programa