BLKSIZE=0,DSORG=PS

//SORTOUT  DD  DSN=&&IBNRDAT0,DISP=(NEW,PASS),            
//             DCB=(DSORG=PS,RECFM=FB,LRECL=53,BLKSIZE=0),
//             UNIT=(SYSDA,20),SPACE=(CYL,(50,50),RLSE)   

如上,始终用BLKSIZE=0,让系统为JOB分配最优的BLKSIZE。这是一个好习惯!

more ...

JCL发送EMAIL

//IBMUSER JOB 0R                A1011000010TEST,CLASS=3,        
//        MSGCLASS=R,REGION=0M                                   
//*                                                              
//STEP01   EXEC PGM=IEBGENER  
//SYSOUT DD SYSOUT= *                                                                          
//SYSUT1   DD  *                                                 
HELO MVS                                                         
MAIL FROM:<54XIAOWONIU@SINA.CN>                               
RCPT TO:<54XIAOWONIU@SINA.CN>                                  
DATA                                                             
FROM:<54XIAOWONIU@SINA.CN>                                       
TO:<54XIAOWONIU@SINA.CN>                                         
SUBJECT: JOB IBMUSERJ HAS ...
more ...

使用UNIT=(SYSDA,20)

好几次production abend都是因为JCL中分配的dataset太大,恰好一个volume上面的剩余空间都分配完了。
这里是DBA给的建议:

"Always code UNIT=(SYSDA,20) for all disk datasets.It will allow the dataset to go to multiple volumes automatically."

000001 //STEP001  EXEC PGM=SYNCSORT,REGION=4096K,COND=(0,NE)                  
000002 //SYSOUT   DD  SYSOUT=*                                                
000003 //SYSPRINT DD  SYSOUT=*                                                
000004 //SORTIN   DD  DSN=IBMUSER ...
more ...

ABENDED S000 U4088 REASON CODE=000003EC

Sub一个job遇到错误:

ABENDED S000 U4088 REASON CODE=000003EC

Abend原因:

The U4088 RC=3EC abend in CEEPLPKA occurred because C:D 4.8.00 ran out of below the line storage

解决办法:

Change region to REGION=0M

000001 //IBMUSER JOB  0RQ00XXXXX                                00010TEST,    
000002 // 'IBMUSER',CLASS=3,MSGCLASS=R,REGION=0 ...
more ...

常用的CICS命令

我们可以在COBOLPL/IAssembler等应用程序中写CICS命令,在COBOLPL/I中,格式分别如下所示:

COBOL
EXEC CICS function[option[(arg)]]... END-EXEC
PL/I
EXEC CICS function[option[(arg)]]... ; (末尾有分号)

CICS的命令很多,不过最常用的也就是如下几个。所以,只要熟悉这几个的用法就好了,其他的当做了解即可,需要的时候再去查 IBM CICS command summary或者CICS手册。

EXEC CICS ABEND [ABCODE(arg)]
EXEC CICS ASKTIME ...
more ...

JCL提交REXX脚本

来说说如何用JCL提交REXX脚本。

1、写一个最简单的显示有一行提示的REXX脚本叫SAYHELLO

1 EDIT       IBMUSER.REXX.EXEC(SAYHELLO) - 01.00           Member SAYHELLO saved 
2 Command ===>                                                  Scroll ===> CSR  
3 ****** ***************************** Top of Data ******************************
4 000001 /******************************REXX*********************************/                
5 000002 SAY "I WILL PRINT 'HELLO' IN SYSTSPRT BY SUBMITTING JCL" 

2、写一个JCL如下IBMUSER.TEST.JCL(SAYHELLO):

EDIT       IBMUSER.TEST.JCL(SAYHELLO) - 01 ...
more ...

REXX怎么保存"Find ALL"的结果

最近的项目经常跟MQ打交道,将输入数据填在一个dataset里面提交给MQ解析,字段之间用逗号隔开。所以在测试MQ接口的时候会经常一边对着FSD文档,一边数dataset里面的逗号个数的情况。数多了就烦了。其实到今天才想起来可以用一个"FIND ALL"的ISPF命令。

FIND ',' ALL

这样,逗号的个数就不用数了,直接显示在屏幕右上角。
既然这样,利用REXX应该可以保存这个“FIND ',' ALL'的结果。 研究了一下,可以这样:
编辑 IBMUSER.REXX.EXEC(CHECK)这个member,输入如下的macro:

1  ADDRESS  ISPEXEC                       
2  "ISREDIT SEEK ALL ','"                 
3  "ISREDIT (COUNT) = SEEK_COUNTS"        
4  SAY "Comma number: "!! COUNT !! "'!'"  
5 EXIT 0 

打开MQ的DATASET,比如 ...

more ...

Rexx顺序处理文件所有行

这是典型的自上而下扫描一个dataset中每一行,而做相应处理的Rexx脚本,几乎所有的处理文件I/O的Rexx脚本都会涉及到:

ADDRESS TSO                                                             
  indataset = 'IBMUSER.REXX.EXEC(INFILE)'  /*read in input file */      
  "alloc f(fin) ds('"indataset"') shr reuse"   
  "execio * diskr fin (finis stem in."                                  
  "free f(fin)"                                                         
 do i=1 to in.0        /*loop in file until the last line reached */           
    one_line = strip(in.i)                                                    
    call ...
more ...

ISPF下如何去掉程序的第72至80列

个人不是很喜欢ISPF 3.13提供的两个Dataset比较的功能,总觉得看得不是很直观。平时还是比较习惯用windows下面的winmerge这个软件来比较。但是有个问题,就是比较的两个程序经常在第72列至80列的行号不一致,导致没法比较。所以这里就来总结一下如何去掉DATASET的中烦人的第72列至80列内容。

方法一:直接在ISPF下面用命令去掉

这是最直接最快的办法。去掉第72列至80列的命令有下面两个:

NUM ON; UNNUMB
C P'^'   73 80 ALL    /* Changes all non-space characters to spaces in col 73 to 80*/

方法二:用第三方脚本实现

上面的方法如果是只有少数几个程序,那么手动命令去掉第72列至80列没什么。但是如果你一下子需要对几百个dataset或者同一个PDS下面的所有member去掉第72列至80列,则最好最快的办法是将所有代码通过FTP下载到本地,然后用第三方脚本语言(如VB,Phthon,Ruby,JS等)来解决。
这里是一段自己的Ruby脚本,作用是将C:\prod ...

more ...

REXX学习笔记

最近在学习Rexx脚本,打算做一些自动化。归纳了些点总结下放在这里以备查询。

一些基本概念

  • REXX: REstructured eXtended eXecutor (REXX) language 扩充结构化执行语言
  • REXX中变量无需事前定义
  • Debug REXX:用REXX TRACE或者用interactive debug facility来定位error
  • SAA Procedures Language:REXX的子集,在TSO/E,CICS,IMS等多种环境中应用
  • 要运行REXX exec,必须至少有一种可用的Host command environments。默认的是TSO。还有MVS,LINK,LINKMVS,LINKPGM,ATTACH,ATTCHMVS,ATTCHPGM,ISPEXEC,ISREDIT,CONSOLE,CPICOMM,LU62,APPCMVS等等,常用的有 ...
more ...