包括DSN中使用JCL中上个月日期的年份



我有一个类似于"数据集名称中前一个月-年的JCL "问题的请求。这个问题的答案使用了ALTER语句,该语句假定知道日期。我有JCL将年份追加到DSN,但是在1月份,我需要上一年。我认为在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)              
/*                                                           
@@          

实际上,您首先引用的问题的答案是"最佳解决方案是使用作业调度器的功能"。这仍然是最好的答案。我展示了如何能够完成,并不意味着我认为这是最好的或最可维护的方法。

您可以使用Rexx、Unix System Services shell脚本、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脚本mkaltr

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运行shell脚本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=*                             
//*     
                                        

Shell script mktr using 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运行shell脚本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程序mkaltr

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=*                                  
//* 
                                                 

相关内容

  • 没有找到相关文章

最新更新