PerroCobolero

PerroCobolero

ADS

lunes, 14 de enero de 2019

FICHEROS - ORGANIZACION Y TIPOS DE REGISTRO


INTRODUCCION

                La inquietud se plantea desde el punto de vista de qué tipo de archivo se construye al final del paso de descarga de la tabla.
                Tiene mucho que ver con el utilitario que trabajemos. Pasemos a ver dos ejemplos concretos y sus resultados.

Usando el utilitario IKJEFT01

//P002D002 EXEC  PGM=IKJEFT01,                         
//             DYNAMNBR=200                            
//SYSPRINT DD  SYSOUT=*                                 
//SYSTSPRT DD  SYSOUT=*                                
//SYSTSIN  DD  *                                       
 DSN SYSTEM(DSN)                                       
 RUN  PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) -           

domingo, 25 de noviembre de 2018

Jcl define ficheros VSAM


Jcl define ficheros VSAM

Lo publico abajo:


//P010 EXEC SYSCMD,COND=(0,NE)
//SYSIN DD *
F CICSPFOR,'CEMT S FI(ULTCTA) CLO DIS'
/*
//*****************************************************
//P030 EXEC PGM=IDCAMS,COND=(0,NE)
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEL PRO.TRC.ASIGCTA.POSI.KSDS PURGE CL
SET MAXCC = 0

DEF CLUSTER -
(NAME(PRO.TRC.ASIGCTA.POSI.KSDS) -
RECORDS (500 50) -
RECORDSIZE (61 61) -
VOLUME (PRO004) -
KEYS (17 0) -
SHR (2 3) -
FREESPACE (01 01) -
NONSPANNED -
REPLICATE -
SPEED -

sábado, 8 de septiembre de 2018

JOINKEY - JCL



La orden Joinkey es de las ordenes más potentes y útiles en la creación de código JCL, puesto que es la base en la que se basa cualquier cruce o comparación de registros de dos ficheros.

Lo que hace básicamente esta orden es comparar los dos ficheros que recibe por la clave que se especifica y crear ficheros de salida con:

1) Registros que solo estén en el fichero 1

2) Registros que solo estén en el fichero 2

3) Registros que estén en ambos ficheros.

4) Combinaciones de los puntos anteriores.



Partes Joinkeys (1)

SORTJNK1 y SORTJNF2: Primer y segundo fichero de entrada, respectivamente. De ahora en adelante los llamaremos F1 y F2.

INCLUDE & OMIT - JCL



Los pasos Include y Omit como su nombre indica sirven para filtrar los ficheros según las especificaciones de los mismos. Ya sea incluyendo o descartando los que creamos oportunos. 



El fichero de salida contendrá los registros que tengan el carácter ‘A’ en la posición 1.



El fichero de salida contendrá los registros que NO tengan el carácter ‘A’ en la posición 1.




Otra manera de usar las utilidades Include y Omit es junto con la palabra SAVE, que introducirá los registros que no se hayan metido en el fichero con la orden Include/Omit.



El fichero Salida1 contendrá los registros que contengan el carácter ‘A’ en la posición 1, y el fichero Salida2 contendrá el resto de registros.

La utilidad INCLUDE no lleva la palabra COND al estar dentro cuando va dentro de un OUTFIL !

COMPROBACIÓN FICHEROS - LISTCAT jcl



Dos herramientas de IDCAMS que usareis muy a menudo en la creación de JCL´s son REPRO y LISTCAT.

Aunque ambas tienen varios usos, los mas útiles y comunes son los que os explicamos a continuación.

LISTCAT

El uso más común de la herramienta LISTCAT es la comprobación de si un fichero existe o no


ADUMAIN aplicatido - Descarga de tabla


JCL - Descarga de tabla con aplicativo ADUMAIN

Se muestra paso de descarga de tabla generando esta en el fichero ENT.SB0HBB.UNLOAD01.SYSREC00.


Codigo

//**********************************************************************
//* UNLOAD01 - DESCARGA DE LA TABLA DE EMISIONES POR ENTIDAD           *
//**********************************************************************
//UNLOAD01 EXEC PGM=ADUUMAIN,
//             PARM=(DBD4,'YYSB0HBB','NEW')
//STEPLIB  DD DSN=DBD4.BMCDB2.LOAD,DISP=SHR
//****** LINEA DE STEPLIB ELIMINADA POR JTRA **
//SYSUDUMP DD SYSOUT=*
//SYSUDUMP DD  SYSOUT=*
//SYSPRINT DD SYSOUT=*
//UTPRINT  DD SYSOUT=*
//SY

martes, 30 de agosto de 2016

Cobol: redefines

Cobol: redefines

El redefines en cobol es muy útil cuando a un tipo de dato le queremos dar un determinado formato o cambiarlo a otro tipo de dato. También se usa para crearnos "arrays" de elementos.

Ejemplo 1: es muy corriente que un dato que sea un PIC X lo queramos pasar a un PIC 9 -> esto se consigue mediante la cláusula redefines tal y como se indica a continuación:
             01  WS-CADENA          PIC X(3).
             01  WS-CADENA-R REDEFINES WS-CADENA PIC 9(3).

Ejemplo 2: a veces queremos pasar un dato definido como PIC X a una estructura con varios campos -> esto se consigue mediante la cláusularedefines tal y como se indica a continuación:

             01  WS-FEC             PIC X(10).
             01  WS-FECHA  REDEFINES WS-FEC.
                  05  WS-FEC-A      PIC X(4).
                  05  WS-FILLER     PIC X(1) VALUE '-'.
                  05  WS-FEC-M      PIC X(2).
                  05  WS-FILLER     PIC X(1) VALUE '-'.
                  05  WS-FEC-D      PIC X(2).


Ejemplo 3: para crearnos tablas de elementos -> esto se consigue mediante la cláusula redefines tal y como se indica a continuación:

             01  TABLA-D.
                  05 FILLER     PIC X(9) VALUE "LUNES    ".
                  05 FILLER     PIC X(9) VALUE "MARTES   ".
                  05 FILLER     PIC X(9) VALUE "MIERCOLES".
                  05 FILLER     PIC X(9) VALUE "JUEVES   ".
                  05 FILLER     PIC X(9) VALUE "VIERNES  ".
                  05 FILLER     PIC X(9) VALUE "SABADO   ".
                  05 FILLER     PIC X(9) VALUE "DOMINIGO ".
             01  TABLA-DIAS  REDEFINES TABLA-D.
                  05  DIA        PIC X(9) OCCURS 7 TIMES.


Cuando queramos hacer referencia a alguno de los días de la semana tenemos que hacer lo siguiente: DIA(X) siendo X un valor entre 1 y 7. Hay que tener mucho cuidado de no poner cosas como por ejemplo DIA(0) o poner cualquier otro valor mayor a 7 pues estaríamos haciendo referencia a posiciones de la tabla que no existen y el programa daría error de ejecución. Has leído bien, error de ejecución. No da error de compilación porque el compilador es incapaz de detectar que se está accediendo a una posición errónea.

Hay que tener en cuenta dos cosas:
1) La tabla de este ejemplo es una tabla 'cerrada', es decir, no se va a aumentar con más elementos pero nos podemos enfrentar en alguna ocasión a tablas que tengan que ser modificadas para incluir nuevos elementos. ¿Cómo se actuaría en este caso? Imagínate que tenemos la siguiente tabla con sólo 3 elementos:

             01  TABLA-T.
                  05 FILLER     PIC X(10) VALUE "VISA ORO  ".
                  05 FILLER     PIC X(10) VALUE "VISA GOLD ".
                  05 FILLER     PIC X(10) VALUE "MASTERCARD".
             01  TABLA-TARJETAS  REDEFINES TABLA-T.
                  05 TARJETA   PIC X(10) OCCURS 3 TIMES.


Y queremos incluir una nueva tarjeta. El hecho de incluir una nueva tarjeta supone que se deben incluir los cambios que se han marcado en rojo:

             01  TABLA-T.
                  05 FILLER     PIC X(10) VALUE "VISA ORO  ".
                  05 FILLER     PIC X(10) VALUE "VISA GOLD ".
                  05 FILLER     PIC X(10) VALUE "MASTERCARD".
                  05 FILLER     PIC X(10) VALUE "PLATINUM  ".             
            01  TABLA-TARJETAS  REDEFINES TABLA-T.
                  05 TARJETA   PIC X(10) OCCURS 4 TIMES.


2) Hay que tener en cuenta el tema de índices. En este caso, para hacer referencia a un elemento de la tabla hay que hacer lo siguiente:

             TARJETA(X)

             siendo X -> un valor entre 1 y 3 (antes  de añadir el elemento)
                              un valor entre 1 y 4 (tras añadir el nuevo elemento)

Es decir, la tabla se ha incrementado en una posición por lo que el índice que se emplea para acceder a la tabla puede acceder a una (y sólo a UNA!!!) posición más. Mucho ojo con acceder a la posición 0 o a posiciones superiores al máximo número de elementos existentes en la tabla pues vamos a provocar un error de ejecución en cuanto se ejecutase el programa.