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:
estoy empezando en esto del IBM y es dificil encontrar este tipo de ayuda.
Grax
De nada, intentamos echar una mano : )
Y si necesitas alguna cosa que no encuentres aquí, pregunta sin problema!
Talli.
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.
Buen día, podrias agregar más ejemplo de archivos VSAM?
Haremos un artículo de ejemplo de un programa que use archivos VSAM para el manual de Cobol : )
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.
Hola! tengo un problem... como puedo borrar por jcl todos los registros que empiecen de una determinada manera.
Gracias!
ah! perdón quiero decir ficheros en vez de registros, lo que quiero borrar son muchos ficheros que empiecen de una determinda manera
Gracias.
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.
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
Gracias a ti por leernos : )
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
Genial vuestras explicaciones!!!
Muchas gracias
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
/*
Agregué:
- DISP=SHR
- Cambié DISP=DUMMY por DUMMY
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.
Hola Daniel.
Para los KSDS VSAM la clave tiene que ser consecutiva.
Un saludo.
Hola, se puede alocar un fichero con un registro determidado con una leyenda determinada mediante un sort?