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!
Mostrando entradas con la etiqueta dudas. Mostrar todas las entradas
Mostrando entradas con la etiqueta dudas. Mostrar todas las entradas
jueves, 31 de mayo de 2012
lunes, 21 de mayo de 2012
Respuestas de la semana II
Recordad que podéis escribirnos con vuestras dudas concretas y os responderemos lo antes posible : )
Pregunta 1:
como saber si una fecha es valida o no en db2
Respuesta 1:
Una fecha DB2 es un campo definido como DATE, que a los efectos de un programa cobol es un campo alfanumérico con PIC X(10).
El formato de la fecha será AAAA-MM-DD, donde AAAA es el año, MM el mes y DD el día. Los guiones son guiones normales.
En el blog hay un artículo sobre los diferentes formatos de fechas que podéis consultar:
Fechas: Juliana, Gregoriana, DB2...
Pregunta 2:
como validar variables alfanumericas en cobol
Respuesta 2:
Así como existe una sentencia "IS NUMERIC" para comprobar que un campo sólo lleva números, para los campos alfanuméricos tendremos también la opción de preguntar por "IS ALPHABETIC" para comprobar que solo lleva caracteres de la A a la Z.
Para el resto de caracteres:
Nuestra variable.
01 WX-ALFANUM PIC X(10) VALUE 'ABCD;EFGH1'.
01 INDICE PIC S9(4) COMP.
Definimos un switch con los los caracteres que queramos detectar.
01 SW-VALIDAR PIC X.
88 CAMPO-SIMBOLOS VALUE ';', '@', '#', '$',
'%', '&', '/', '(',
')', '='.
01 SW-BUCLE PIC X.
88 SALIR-BUCLE VALUE 'S'.
Montamos un bucle para recorrer todas las posiciones de nuestra variable alfanumérica.
PERFORM VARYING INDICE FROM 1 BY 1 UNTIL INDICE > 10
OR SALIR-BUCLE
MOVE WX-ALFANUM(INDICE:1) TO SW-VALIDAR
IF NOT CAMPO-SIMBOLOS
CONTINUE
ELSE
SET SALIR-BUCLE TO TRUE
END-IF
END-PERFORM
De tal forma que si al salir del bucle el switch SALIR-BUCLE está activado significa que la variable contiene caracteres especiales (en el ejemplo al llegar al punto y coma ';' activará SALIR-BUCLE).
La validación podéis montarla al gusto, siempre que comprobéis cada una de las posiciones:
WX-ALFANUM(INDICE:1) donde INDICE va cambiando de 1 en 1 y solo cogemos una posición (:1).
Pregunta 3:
agregar consecutivos desde jcl
Respuesta 3:
Se me ocurre que lo que estaba buscando esta persona era la manera de añadir un número secuencial a un registro de un fichero por JCL (que lo mismo no, pero bueno, yo os lo cuento).
Hay una opción de OUTREC para generar un número secuencial que podremos colocar donde queramos.
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(SEQNUM,10,ZD,START=0000000001,INCR=1,1,300)
Se trata de la opción SEQNUM. En el ejemplo vemos que indicamos lo siguiente:
SEQNUM: número secuencial
10: tendrá 10 posiciones
ZD: será de tipo numérico sin comprimir
START=0000000001: comenzará con el valor 0000000001
INCR=1: iremos incrementando de 1 en 1
1,300: son las demás posiciones del fichero de entrada que queremos incluir en salida (aquí podríamos poner lo que quisiéramos)
El SEQNUM podemos colocarlo en cualquier posición del registro, no hace falta que sea en la primera posición.
Pregunta 4:
declarar variables que no permite negativos en cobol
Respuesta 4:
Una variable definida sin signo nunca podrá ser negativa. Por ejemplo:
01 WX-CAMPO-POSITIVO PIC 9(8)V9(3).
No lleva el signo (la S delante del 9) por lo que nunca podrá ser menor que cero.
En las variables signadas podemos comprobar si son negativas preguntando si la variable es menor que cero:
IF WX-CAMPO-SIGNADO LESS THAN ZERO
Pregunta 5:
host utilidad comparar dos ficheros tso
Respuesta 5:
La utilidad para comparar ficheros está en la opción 3.13 del ISPF: SuperCE
En ella indicaremos los 2 ficheros a comparar y en el resultado veremos las filas que no coinciden (nos mostrará la fila de ambos ficheros). Lo malo es que si el fichero es muy largo, el final del registro no lo veremos (por mucho que demos F11 para que muestre más pantallas a la derecha).
Pregunta 1:
como saber si una fecha es valida o no en db2
Respuesta 1:
Una fecha DB2 es un campo definido como DATE, que a los efectos de un programa cobol es un campo alfanumérico con PIC X(10).
El formato de la fecha será AAAA-MM-DD, donde AAAA es el año, MM el mes y DD el día. Los guiones son guiones normales.
En el blog hay un artículo sobre los diferentes formatos de fechas que podéis consultar:
Fechas: Juliana, Gregoriana, DB2...
Pregunta 2:
como validar variables alfanumericas en cobol
Respuesta 2:
Así como existe una sentencia "IS NUMERIC" para comprobar que un campo sólo lleva números, para los campos alfanuméricos tendremos también la opción de preguntar por "IS ALPHABETIC" para comprobar que solo lleva caracteres de la A a la Z.
Para el resto de caracteres:
Nuestra variable.
01 WX-ALFANUM PIC X(10) VALUE 'ABCD;EFGH1'.
01 INDICE PIC S9(4) COMP.
Definimos un switch con los los caracteres que queramos detectar.
01 SW-VALIDAR PIC X.
88 CAMPO-SIMBOLOS VALUE ';', '@', '#', '$',
'%', '&', '/', '(',
')', '='.
01 SW-BUCLE PIC X.
88 SALIR-BUCLE VALUE 'S'.
Montamos un bucle para recorrer todas las posiciones de nuestra variable alfanumérica.
PERFORM VARYING INDICE FROM 1 BY 1 UNTIL INDICE > 10
OR SALIR-BUCLE
MOVE WX-ALFANUM(INDICE:1) TO SW-VALIDAR
IF NOT CAMPO-SIMBOLOS
CONTINUE
ELSE
SET SALIR-BUCLE TO TRUE
END-IF
END-PERFORM
De tal forma que si al salir del bucle el switch SALIR-BUCLE está activado significa que la variable contiene caracteres especiales (en el ejemplo al llegar al punto y coma ';' activará SALIR-BUCLE).
La validación podéis montarla al gusto, siempre que comprobéis cada una de las posiciones:
WX-ALFANUM(INDICE:1) donde INDICE va cambiando de 1 en 1 y solo cogemos una posición (:1).
Pregunta 3:
agregar consecutivos desde jcl
Respuesta 3:
Se me ocurre que lo que estaba buscando esta persona era la manera de añadir un número secuencial a un registro de un fichero por JCL (que lo mismo no, pero bueno, yo os lo cuento).
Hay una opción de OUTREC para generar un número secuencial que podremos colocar donde queramos.
//SYSIN DD *
SORT FIELDS=COPY
OUTREC FIELDS=(SEQNUM,10,ZD,START=0000000001,INCR=1,1,300)
Se trata de la opción SEQNUM. En el ejemplo vemos que indicamos lo siguiente:
SEQNUM: número secuencial
10: tendrá 10 posiciones
ZD: será de tipo numérico sin comprimir
START=0000000001: comenzará con el valor 0000000001
INCR=1: iremos incrementando de 1 en 1
1,300: son las demás posiciones del fichero de entrada que queremos incluir en salida (aquí podríamos poner lo que quisiéramos)
El SEQNUM podemos colocarlo en cualquier posición del registro, no hace falta que sea en la primera posición.
Pregunta 4:
declarar variables que no permite negativos en cobol
Respuesta 4:
Una variable definida sin signo nunca podrá ser negativa. Por ejemplo:
01 WX-CAMPO-POSITIVO PIC 9(8)V9(3).
No lleva el signo (la S delante del 9) por lo que nunca podrá ser menor que cero.
En las variables signadas podemos comprobar si son negativas preguntando si la variable es menor que cero:
IF WX-CAMPO-SIGNADO LESS THAN ZERO
Pregunta 5:
host utilidad comparar dos ficheros tso
Respuesta 5:
La utilidad para comparar ficheros está en la opción 3.13 del ISPF: SuperCE
En ella indicaremos los 2 ficheros a comparar y en el resultado veremos las filas que no coinciden (nos mostrará la fila de ambos ficheros). Lo malo es que si el fichero es muy largo, el final del registro no lo veremos (por mucho que demos F11 para que muestre más pantallas a la derecha).
lunes, 23 de abril de 2012
Respuestas de la semana
Revisando las búsquedas que llevan a la gente a visitar el Consultorio Cobol, se nos ocurrió crear un artículo semanal en respuesta a esas búsquedas que puede que no hayan encontrado solución a su problema.
Contestaremos a aquellas cuestiones que no necesiten de un artículo entero para ser explicadas, es decir, que la solución se pueda dar en un par de frases.
Vamos con las de esta semana : )
Pregunta 1:
se puede validar una variable numerica y alfanumerica en cobol
Respuesta 1:
En cobol se puede comprobar si una variable contiene solo números (es numérica) o no con la siguiente sentencia:
01 WX-VARIABLE-NUM PIC 9(4) VALUE 1234.
...
IF WX-VARIABLE-NUM IS NOT NUMERIC
DISPLAY 'ERROR'
END-IF
Nota: la validación de IS NUMERIC e IS NOT NUMERIC es válida sólo para campos numéricos o numéricos comprimidos, es decir, PIC 9(X) y PIC 9(X) COMP-3.
Pregunta 2:
quitar numeracion amarrilla cobol
Respuesta 2:
Los números amarillos que aparecen a izquierda y derecha de un programa cobol se puden quitar escribiendo en la linea de comandos (Command ===>) los siguiente:
Primero escribimos NUM STD COB y pulsamos intro. Veréis que el código se mueve hacia la izquierda.
Luego escribimos UNNUM y pulsamos intro. Veréis que el código se vuelve a centrar y los números han desaparecido.
Pregunta 3:
indexed by in cobol como incrementar
Respuesta 3:
Cuando un índice en cobol está definido en una cláusula INDEXED BY, la manera de incrementarlo sería:
SET WI-INDICE UP BY 1
Esto sería para incrementarlo en 1, si le indicamos otro número se incrementaría en esa cantidad.
Pregunta 4:
cargar campos de longitud variable con load bmc vachar position
Respuesta 4:
Supongamos que tenemos un fichero de longitud variable (VB) donde el VARCHAR es el último campo del fichero, de tal modo que es el que hace que la longitud varíe.
Supongamos ahora que con ese fichero queremos hacer una LOAD a la tabla correspondiente. Pueden pasar dos cosas:
1- En la tabla, el campo VARCHAR no es el último:
En este caso tendremos que formatear el fichero con un OUTREC, para colocar el VARCHAR de modo que coincida con la posición en la tabla DB2. Para ello podemos pasar el fichero de VB a FB y después hacer el OUTREC (por ejemplo).
2- En la tabla, el campo VARCHAR también es el último:
Si la LOAD directamente del fichero VB no funciona, podemos pasarlo a FB y funcionará.
Para pasar de VB a FB podemos hacerlo por JCL o, más a lo bestia, hacer una copia y cuando nos pregunte si queremos copiar los atributos del fichero original le diremos que no, que se los queremos indicar (opción 2 de la imagen). Cambiaremos el Record Format de VB a FB, el Record Length a la longitud del fichero con el VARCHAR al máximo, y el Block size a algo coherente con la longitud.
No dudéis en enviarnos vuestras dudas directamente al correo del consultorio o a través del formulario de contacto.
Contestaremos a aquellas cuestiones que no necesiten de un artículo entero para ser explicadas, es decir, que la solución se pueda dar en un par de frases.
Vamos con las de esta semana : )
Pregunta 1:
se puede validar una variable numerica y alfanumerica en cobol
Respuesta 1:
En cobol se puede comprobar si una variable contiene solo números (es numérica) o no con la siguiente sentencia:
01 WX-VARIABLE-NUM PIC 9(4) VALUE 1234.
...
IF WX-VARIABLE-NUM IS NOT NUMERIC
DISPLAY 'ERROR'
END-IF
Nota: la validación de IS NUMERIC e IS NOT NUMERIC es válida sólo para campos numéricos o numéricos comprimidos, es decir, PIC 9(X) y PIC 9(X) COMP-3.
Pregunta 2:
quitar numeracion amarrilla cobol
Respuesta 2:
Los números amarillos que aparecen a izquierda y derecha de un programa cobol se puden quitar escribiendo en la linea de comandos (Command ===>) los siguiente:
Primero escribimos NUM STD COB y pulsamos intro. Veréis que el código se mueve hacia la izquierda.
Luego escribimos UNNUM y pulsamos intro. Veréis que el código se vuelve a centrar y los números han desaparecido.
Pregunta 3:
indexed by in cobol como incrementar
Respuesta 3:
Cuando un índice en cobol está definido en una cláusula INDEXED BY, la manera de incrementarlo sería:
SET WI-INDICE UP BY 1
Esto sería para incrementarlo en 1, si le indicamos otro número se incrementaría en esa cantidad.
Pregunta 4:
cargar campos de longitud variable con load bmc vachar position
Respuesta 4:
Supongamos que tenemos un fichero de longitud variable (VB) donde el VARCHAR es el último campo del fichero, de tal modo que es el que hace que la longitud varíe.
Supongamos ahora que con ese fichero queremos hacer una LOAD a la tabla correspondiente. Pueden pasar dos cosas:
1- En la tabla, el campo VARCHAR no es el último:
En este caso tendremos que formatear el fichero con un OUTREC, para colocar el VARCHAR de modo que coincida con la posición en la tabla DB2. Para ello podemos pasar el fichero de VB a FB y después hacer el OUTREC (por ejemplo).
2- En la tabla, el campo VARCHAR también es el último:
Si la LOAD directamente del fichero VB no funciona, podemos pasarlo a FB y funcionará.
Para pasar de VB a FB podemos hacerlo por JCL o, más a lo bestia, hacer una copia y cuando nos pregunte si queremos copiar los atributos del fichero original le diremos que no, que se los queremos indicar (opción 2 de la imagen). Cambiaremos el Record Format de VB a FB, el Record Length a la longitud del fichero con el VARCHAR al máximo, y el Block size a algo coherente con la longitud.
No dudéis en enviarnos vuestras dudas directamente al correo del consultorio o a través del formulario de contacto.
Suscribirse a:
Entradas (Atom)






