1

「データセット名の前の月-年の JCL」の質問に似たリクエストがあります。その質問への答えは、日付の知識を前提とした ALTER ステートメントを使用しました。DSN に年を追加する JCL がありますが、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)              
/*                                                           
@@          
4

1 に答える 1

4

実際、最初に参照した質問への回答には、「これに対する最善の解決策は、ジョブ スケジューラの機能を使用することです」と記載されています。 それが最良の答えのままです。何かを実行 する方法を示したからといって、それが最良の、または最も維持しやすい方法であると私が考えたことを意味するものではありません。

RexxUnix 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 

                                                     

Rexx プログラム MCALTR を実行する JCL

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

                

シェルスクリプト 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\)

シェル スクリプト mkaltr を実行する JCL

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

                                        

awkを使用したシェルスクリプトmkaltr

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 )
}'

                                               

シェル スクリプト mkaltr を実行する JCL

//*
// 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); 

     

Perl プログラム mkaltr を実行する JCL

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

                                                 
于 2012-12-21T22:37:48.537 に答える