Укажите год с даты прошлого месяца в DSN с помощью JCL
У меня есть запрос, похожий на вопрос "JCL за предыдущий месяц-год в имени набора данных". В ответе на этот вопрос использовалось утверждение ALTER, предполагающее знание даты. У меня есть JCL, чтобы добавить год к DSN, однако в январе мне нужен предыдущий год. Я думаю, что это возможно с помощью SYNCSORT или DFSORT, но у меня нет опыта ни с одним из них. Любая помощь приветствуется.
Вот текущий JCL:
//B999999X JOB (80594,XXX),'MAKE DATE',
// CLASS=C,MSGCLASS=C,NOTIFY=&SYSUID
//STEP0100 EXEC PGM=EZACFSM1
//SYSOUT DD SYSOUT=(*,INTRDR)
//SYSIN DD DATA,DLM=@@
//B8025501 JOB (,9999),'TESTING',
// CLASS=A,MSGCLASS=C,MSGLEVEL=(1,1),NOTIFY=&SYSUID
//STEP01 EXEC PGM=IEFBR14
//FILE01 DD DSN=B999999.TEST.MYFILE.FUEL&YR2,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(10,10),RLSE),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=0)
/*
@@
1 ответ
На самом деле, ответ на вопрос, на который вы ссылаетесь, сначала гласит: "Лучшее решение для этого - использовать функции вашего планировщика заданий". Это остается лучшим ответом. То, что я показал, как можно что-то сделать, не подразумевало, что я думал, что это лучший или наиболее приемлемый метод.
Вы можете сделать это с помощью Rexx, или сценария оболочки Unix System Services, или сценария awk, или Perl, снова создавая оператор ALTER, который будет использоваться на следующем шаге, чтобы переименовать набор данных со статическим именем в набор, содержащий желаемый квалификатор даты.,
Здесь есть и другие техники.
Но если у вас есть пакет планировщика заданий, вам действительно следует использовать его возможности.
Примеры предложенных выше решений приведены ниже.
Программа Rexx MKALTR
dsn = Arg(1)
Parse Value Date('O') With yy '/' mm '/' dd
If mm = 1 Then
If yy > 0 Then
yy = yy - 1
Else
yy = 99
outLine.1 = ' ALTER ' || dsn || ' - '
outLine.2 = ' NEWNAME(' || dsn || yy || ')'
outLine.0 = 2
Address TSO 'EXECIO * DISKW OUTPUT01 ( STEM' outLine. 'FINIS )'
Exit
JCL для запуска программы Rexx MKALTR
//*
// SET &DS=MY.DATASET.NAME
//*
//CATLG EXEC PGM=IEFBR14
//STDOUT DD DISP=(,CATLG),
// DSN=&DS,
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(1,1))
//*
//MKALTER EXEC PGM=IKJEFT1B,PARM='MKALTR &DS'
//SYSEXEC DD DISP=SHR,DSN=dataset.where.rexx.code.resides
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSTSIN DD DUMMY
//OUTPUT01 DD DISP=(,PASS),
// AVGREC=K,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(2,1))
//*
//DOALTER EXEC PGM=IDCAMS
//SYSIN DD DISP=(OLD,DELETE),DSN=*.MKALTER.OUTPUT01
//SYSPRINT DD SYSOUT=*
//*
Shell скрипт мкалтр
let "mon=`date +'%m'`"
let "yr=`date +'%y'`"
if [ $mon -eq 01 ]
then
let "outyr=$yr-1"
fi
echo \ ALTER $1 -
echo \ \ NEWNAME\($1$outyr\)
JCL для запуска сценария оболочки mkaltr
//*
// SET &DS=MY.DATASET.NAME
//*
//CATLG EXEC PGM=IEFBR14
//STDOUT DD DISP=(,CATLG),
// DSN=&DS,
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(1,1))
//*
//MKALTER EXEC PGM=BPXBATCH,
// PARM='SH /path/to/script/mkaltr &DS'
//STDOUT DD DISP=(,PASS),
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(2,1))
//STDERR DD SYSOUT=*
//*
//DOALTER EXEC PGM=IDCAMS
//SYSIN DD DISP=(OLD,DELETE),DSN=*.MKALTER.STDOUT
//SYSPRINT DD SYSOUT=*
//*
Сценарий оболочки mkaltr с использованием awk
date +"$1 %m %y" | awk '
{
yr = $3
if ( $2 = 1 ) yr -= 1
if ( yr > 100 ) yr -= 100
printf( " ALTER %s -\n NEWNAME(%s%2d)\n", $1, $1, yr )
}'
JCL для запуска сценария оболочки mkaltr
//*
// SET &DS=MY.DATASET.NAME
//*
//CATLG EXEC PGM=IEFBR14
//STDOUT DD DISP=(,CATLG),
// DSN=&DS,
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(1,1))
//*
//MKALTER EXEC PGM=BPXBATCH,
// PARM='SH /path/to/script/mkaltr &DS'
//STDOUT DD DISP=(,PASS),
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(2,1))
//STDERR DD SYSOUT=*
//*
//DOALTER EXEC PGM=IDCAMS
//SYSIN DD DISP=(OLD,DELETE),DSN=*.MKALTER.STDOUT
//SYSPRINT DD SYSOUT=*
//*
Perl программа Мкалтр
if ( @ARGV ) {
$dsn = shift( @ARGV );
} else {
die "dataset name required";
}
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if ($mon == 0) {
$year -= 1
}
if ($year >= 100) {
$year -= 100;
}
printf (" ALTER %s -\n NEWNAME(%s%2d)\n", $dsn, $dsn, $year);
JCL для запуска Perl-программы mkaltr
//*
// SET &DS=MY.DATASET.NAME
//*
//CATLG EXEC PGM=IEFBR14
//STDOUT DD DISP=(,CATLG),
// DSN=&DS,
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(1,1))
//*
//MKALTER EXEC PGM=BPXBATCH,
// PARM='SH perl /path/to/perl/program/mkaltr &DS'
//STDOUT DD DISP=(,PASS),
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(2,1))
//STDERR DD SYSOUT=*
//*
//DOALTER EXEC PGM=IDCAMS
//SYSIN DD DISP=(OLD,DELETE),DSN=*.MKALTER.STDOUT
//SYSPRINT DD SYSOUT=*
//*