PL/I和COBOL如何取得当天的日期

在Mainframe上做开发会经常遇到用PL/I或者COBOL取得当天的日期,对于PL/I,一般的公司都采取如下的做法:

DCL PIC_TODAY            PIC'999999' INIT(0);
PIC_TODAY  = DATE;
IF SUBSTR(DATE,1,2) > '50'                
  THEN TODAYS_DATE = 19000000 + PIC_TODAY;
  ELSE TODAYS_DATE = 20000000 + PIC_TODAY;

我所在的公司也是这种写法来获得YYYYMMDD格式的当日日期,很明显这种写法代码的寿命只有几十年了,相比之下COBOL获得YYYYMMDD格式的当日日期就显得方便得多,一个ACCEPT语句即可:

WORKING-STORAGE SECTION.
01 TODAYS-DATE                          PIC 9(08).
.
.
.
PROCEDURE DIVISION.
ACCEPT TODAYS ...
more ...

PLI 动态数组的例子

新写了一个PL/I程序,需要在程序里面用到动态数组来提高效率,所以总结了一下PL/I中动态数组(Dynamic Array)的用法:
1.申明一个Controlled的数组叫做WT_TMPARRAY_INFO,此时并不知道该数组的长度:

DCL  INPUTFIL FILE RECORD INPUT;
DCL  TMPARRAY_CTR         FIXED BIN(31)   INIT(0);                             
DCL  TMPARRAY_SUB         FIXED BIN(31)   INIT(1);  
DCL 01 TMPARRAY_RECORD,                                                        
        05 INPUT_CUR     CHAR(03)             INIT(' '),                          
        05 INPUT_ACCT    CHAR(05)             INIT(' '); 

/*******定义未知长度的动态数组WT_TMPARRAY_INFO*************************/
DCL ...
more ...

PLI打印出PIC类型输出

使用PLI打印输出信息,最常见的是:

PUT SKIP(1) EDIT ('CODE = ',ERR_CODE)(A,A);

这里是打印PIC类型的输出,不怎么常用。今天用到了,所以记在这:

PUT EDIT('ACCOUNT PROCESSED : ',ACCOUNT_CTR)      
                  (SKIP(1),COL(1),A,P'999999999'); 

PUT SKIP FILE(OUTFILE) EDIT('CHENGDU: ',SOURCE) 
      (A,P'ZZ,ZZZV.ZZ');
more ...