lunes, 24 de enero de 2011

JCL básico V: IDCAMS, IEFBR14, IEBGENER.

En este artículo vamos a describir algunos utilidades MVS básicas que pueden sernos útiles/necesarias al codificar un JCL.

IDCAMS:
El programa IDCAMS puede utilizarse para borrar ficheros, copiar ficheros y crear ficheros VSAM.
Veamos algunos pasos de ejemplo:

//******************************************************
//*
//**************************** BORRADO *****************
//BORRADO   EXEC PGM=IDCAMS
//SYSPRINT  DD SYSOUT=*
//SYSIN DD *
       DEL NOMBRE.DE.FICHERO
 SET MAXCC = 0


Borra los ficheros que le indiquemos en la SYSIN.
Añadimos el "SET MAXCC = 0" para que en caso de que no exista el fichero no nos de error y continúe la ejecución del JCL.

Opciones de borrado:
* CLUSTER: indica que se tiene que borrar un fichero VSAM. Cuando se elimina el CLUSTER, se borran también los DATA e INDEX asociados al fichero.
* PURGE: permite borrar un fichero aunque no haya llegado su fecha de caducidad.
* ERASE: se machacan los datos del fichero con ceros binarios.


//******************************************************
//*
//********************** COPIA DE FICHEROS *************
//COPIA    EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//ENTRADA  DD DSN=FICHERO.DE.ENTRADA,DISP=SHR
//SALIDA   DD DSN=FICHERO.DE.SALIDA,DISP=SHR
//SYSIN DD *
  REPRO -
  INFILE(ENTRADA) -
  OUTFILE(SALIDA)
/*


Copia el fichero de entrada en el fichero de salida.
Opciones de copiado:
# SKIP: número de registros que deben saltarse desde el inicio del fichero antes de comenzar el proceso de copiado. También se pueden codificar:
# COUNT: número de registros que queremos copiar.

Comprobar si un fichero está vacío con PRINT + COUNT:
//**=======================================================*
//** PASO01 - COMPRUEBA SI EL FICHERO TIENE DATOS O ESTÁ VACIO
//**=======================================================*
//PASO01   EXEC PGM=IDCAMS
//IN       DD DSN=nombre.fichero.prueba1,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  PRINT INFILE(IN) COUNT(1)
  IF MAXCC=12 THEN SET MAXCC=4

- Si existe y tiene datos --> Todo es correcto (MAXXCC=0) 
- Si existe pero está vacío --> da un MAXXCC=4 
- Si no existe --> El jcl abenda dando un FLUSH


Creación de VSAM:

//****************************************************
//*
//******************** DEFINICION DE VSAM ************
//PASOXXXX EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
  DELETE NOMBRE.FICHERO -
  CLUSTER
  SET MAXCC = 0
  DEFINE CLUSTER( -
      NAME(NOMBRE.FICHERO) -
      INDEXED -
      VOL(BCT668) -
      TRACKS(300 50) -
      RECSZ(4800 4800) -
      CISZ(12288) -
      KEY(16 0) -
      SHR(2 3) -
      FSPC(15 15)

Crea el fichero VSAM NOMBRE.FICHERO.
Opciones:
* DELETE: Es la instrucción de borrado.
* CLUSTER: Indica que borre todos los ficheros que componen el VSAM
(índice y datos).
* DEFINE CLUSTER: Definición del fichero VSAM.
* NAME: Nombre físico del fichero.
* INDEXED: Indica que el fichero es indexado.
* VOL: El nombre del volumen/disco donde se quiere que resida. En
nuestra instalación no es necesario ponerlo, ya que la asignación es
automática.
* TRACKS, CYLS, RECORDS: Determina el espacio en pistas, cilindros
o registros. La primera magnitud indica el espacio de la extensión
primaria y la segunda el espacio para las extensiones secundarias.
* RECSZ: Longitud del registro. La primera magnitud indica la longitud.
* CISZ:: Control Interval Size, longitud Intervalo de control. El intervalo de
control es el equivalente al bloque en los ficheros VSAM.
* KEY: Indica la información necesaria para ubicar la clave. La primera
magnitud indica la longitud de la clave y la segunda el desplazamiento
de la misma respecto del principio del registro.
* SHR: Indica el grado de accesibilidad concurrente al fichero. (2 3) son
los valores más usuales e indican que sólo puede haber un acceso
concurrente de actualización y es de libre acceso de lectura.
* FSPC: Free Space. Indica la distribución del espacio libre en el fichero,
la primera magnitud indica el espacio libre en cada intervalo de control
y la segunda indica el número de intervalos de control libres en el Area
de Control.


IEFBR14:
Sirve para catalogar ficheros en vacío,borrarlos, etc. utilizando la sentencia DISP.

//******************************************************
//*
//******************** CATALOGACION VACIO **************
//PASO040  EXEC PGM=IEFBR14
//*
//FILEOUT  DD  DSN=NOMBRE.DE.FICHERO,
//             DISP=(NEW,CATLG,DELETE),
//             UNIT=SYSDA,
//             SPACE=(350,(169,50),RLSE),
//             RECFM=FB,LRECL=350
/*

Cataloga un fichero en vacío.
Incluiremos en el DISP la información que consideremos.

//*******************************************************
//**** BORRADO DE FICHEROS TEMPORALES
//*******************************************************
//BORRADO  EXEC PGM=IEFBR14
//DD1      DD DSN=FICHERO.A.BORRAR,DISP=(OLD,DELETE,KEEP)
/*

Borra el fichero indicado.


IEBGENER:

Sirve para copiar ficheros secuenciales de uno a otro.

//*******************************************************
//**** COPIA DE FICHERO SECUENCIAL
//*******************************************************
//PASOXXXX EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DSN=FICHERO.DE.ENTRADA
//SYSUT2   DD DSN=FICHERO.DE.SALIDA
//SYSIN  DD DSN=DUMMY
/*

Cuando es una copia simple en la SYSUT1 se codifica el fichero de entrada.
Si en el SYSUT1 indicamos NULLFILE crearemos el fichero indicado en SYSUT2 en vacío.

18 comentarios:

Anónimo dijo...

estoy empezando en esto del IBM y es dificil encontrar este tipo de ayuda.

Grax

Tallian dijo...

De nada, intentamos echar una mano : )
Y si necesitas alguna cosa que no encuentres aquí, pregunta sin problema!
Talli.

Anónimo dijo...

En el borrado de ficheros es muy útil la disposición DISP=(MOD,DELETE) así en caso que no exista el fichero no da JCL_ERR.

Anónimo dijo...

Buen día, podrias agregar más ejemplo de archivos VSAM?

Tallian dijo...

Haremos un artículo de ejemplo de un programa que use archivos VSAM para el manual de Cobol : )

Anónimo dijo...

Buen Día! alguna pregunta, estoy utilizando utilerias jcl, lo que se requiere hacer es mediante la utileria iebcopy la seleccion de totos los miembro que contengan en su nombre las letras 'rba', alguien me puede decir como hacerlo, o bien alguna otra utileria.

Anónimo dijo...

Hola! tengo un problem... como puedo borrar por jcl todos los registros que empiecen de una determinada manera.
Gracias!

Anónimo dijo...

ah! perdón quiero decir ficheros en vez de registros, lo que quiero borrar son muchos ficheros que empiecen de una determinda manera
Gracias.

Tallian dijo...

Hola Anónimo. Lo que se me ocurre ahora mismo es ejecutar un REXX que te borre los ficheros que empiezen por ABC.* por ejemplo.
Si te interesa te lo cuelgo.

Anónimo dijo...

Disculpa mi anonimato, mi firma es jar8, y estuve buscando algo tan simple para entender y los manuales son tan complicados y hechos bolas que la verdad termina uno como en la secundaria, "pa que estudio", sin embargo lo mas simple resulta siempre la solución, fue mucho choro para decir GRACIAS

Tallian dijo...

Gracias a ti por leernos : )

Anónimo dijo...

Hola, yo tambien estoy buscando informacion sobre como barrar registros de un fichero que contengan determinada cadena, nos lo puedo hacer por sort ya que la posicion de la cadena varia en el archivo.

Espero me puedan apoyar al respecto. ya que estaba buscando informacion para realizarlo por utileria pero no es posible.

De antemano gracias.

Saludos

Invitado dijo...

Genial vuestras explicaciones!!!

Muchas gracias

Richard Romero dijo...

Hola Tallian, cuando intenté utilizar la utilidad IEBGENER para copia de fichero secuancial tuve problemas, pero lo corregí de la siguiente forma:
//*******************************************************
//**** COPIA DE FICHERO SECUENCIAL
//*******************************************************
//PASOXXXX EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=FICHERO.DE.ENTRADA,DISP=SHR
//SYSUT2 DD DSN=FICHERO.DE.SALIDA,DISP=SHR
//SYSIN DD DUMMY
/*

Richard Romero dijo...

Agregué:
- DISP=SHR
- Cambié DISP=DUMMY por DUMMY

Daniel Ropero dijo...

Cómo podría definir un VSAM en JCL en el que la clave fueran de dos partes de cada registro.
La clave sería: KEY (17 0) (26 561)
Es decir, las 17 primeras posiciones de cada registro + las 26 posiciones siguientes a la 561.
No sé como hacerlo.
Un saludo.

Tallian dijo...

Hola Daniel.
Para los KSDS VSAM la clave tiene que ser consecutiva.
Un saludo.

Diego Knack dijo...

Hola, se puede alocar un fichero con un registro determidado con una leyenda determinada mediante un sort?