一个批量修改文件属性的工具
AS/400上的每个文件都带有大量的属性,文件的属性是在创建文件的时候指定的。在实际应用 过程中,可能会需要改变这些文件属性。以PF文件为例,我们可能需要修改文件的Member Size,Maximum Members,Maximum record wait time等等。修改物理文件(PF)属性命令是CHGPF,修改逻辑文件(LF)命令是 CHGLF,遗憾的是这些命令一次只能修改一个文件。如果假设有一个库,库下面有几千个物理文件需要一次性统一修改文件属性,那该怎么办?AS/400并 没有提供这样的命令。
我做了一个工具命令,可以实现对一个库下的所有文件属性进行批量修改,下面以修改文件Reuse deleted records属性为例来介绍这个工具命令,并附带全部源码。文件Reuse deleted records属性是表示记录在文件物理空间内被插入的方式,缺省情况下Reuse deleted records属性为*NO,这表示新记录将追加到文件尾部,如果Reuse deleted records属性修改为*YES,这表示物理文件中原已删除记录物理空间可以重复使用,当有新记录要加入时,系统会优先把新记录插入到原已删除记录空间 里,只有当所有被删除记录空间都被重新使用后,新加记录才会从文件尾部开始追加。这个属性对于文件记录非常多、重整所费时间很长的情况下,还是很有用的。
制作修改一个库下所有文件属性的思路是首先应把该库下的所有物理文件名取出来,然后才能循环一个个地修改。以下是主要步骤:
1. 提取某库下所有物理文件名
这 主要是通过利用DSPFD来实现的。该命令是用来显示文件描述(File Description)的,它可以一次显示一个库下的一文件描述,也可以一次显示一个库下的所有文件描述。可以在OUTPUT选项里填入 *OUTFILE,并在OUTFILE选项里填入接收文件名,就可以把DSPFD的显示内容输出到一个临时PF文件中。该临时文件就包含有文件名字段 ATFILE以及库名字段ATLIB。例如下面DSPFD命令就是把定义某库下的所有物理文件名及其基本属性(*BASATR)输出到QGPL库下的 TEMPLIBF文件里:
DCL VAR(&CALIB) TYPE(*CHAR) LEN(10) /*定义一个库名变量*/
DSPFD FILE(&CALIB/*ALL) TYPE(*BASATR) +
OUTPUT(*OUTFILE) FILEATR(*PF) +
OUTFILE(QGPL/TEMPLIBF)
2. 对包含有文件名的临时文件进行加工
其实因为上面已经把文件名输出到了一个PF文件里,所以这一步可不要。但为了查看方便,我还是把文件名从TEMPLIBF中提出写入到一个更简单的PF文件中。先创建一个名为DTAFNAME的物理文件,如下:
A R DTANAM
A FILNAM 10A /*PF文件名*/
A FILLIB 10A /*库名*/
再用CRTSRCPF命令在QGPL库下建一个CHGTEST源文件目录,在该文件下创建一个SQL脚本文本文件CHGLIBAF,其内容为:
INSERT INTO DTAFNAME
SELECT ATFILE,ATLIB FROM QGPL/TEMPLIBF
然后在CL程序中,用RUNSQLSTM命令运行SQL脚本文件中的SQL语句:
RUNSQLSTM SRCFILE(QGPL/CHGTEST) SRCMBR(CHGLIBAF)
这样就把文件名及库名从复杂的TEMPLIBF文件倒入到简单的DTAFNAME文件中
3. 循环修改文件属性
循环读DTAFNAME文件,取出文件名,就可以一个个地用CHGPF命令修改文件属性了。
下面是完整的源代码:
文件名:CHGLIBFACL (CLLE)
/*===================================================================*/
/* PROGRAM NAME: CHGLIBFACL */
/* DESCRIPTION : */
/* PROGRAMMER : BLOG LIOU */
/* DATE : */
/*===================================================================*/
PGM PARM(&CALIB &REUSED)
DCLF FILE(DTAFNAME) RCDFMT(DTANAM)
DCL VAR(&CALIB) TYPE(*CHAR) LEN(10)
DCL VAR(&REUSED) TYPE(*CHAR) LEN(4)
CHKOBJ OBJ(QGPL/TEMPLIBF) OBJTYPE(*FILE)
MONMSG MSGID(CPF9801)
CLRPFM FILE(QGPL/TEMPLIBF)
MONMSG MSGID(CPF3142)
DSPFD FILE(&CALIB/*ALL) TYPE(*BASATR) +
OUTPUT(*OUTFILE) FILEATR(*PF) +
OUTFILE(QGPL/TEMPLIBF)
CLRPFM FILE(DTAFNAME)
RUNSQLSTM SRCFILE(QGPL/CHGTEST)
SRCMBR(CHGLIBAF)
LOOP: RCVF RCDFMT(DTANAM) /* Read a file record */
MONMSG MSGID(CPF0864) EXEC(GOTO EOF)
CHGPF FILE(&FILLIB/&FILNAM) WAITFILE(60) +
REUSEDLT(&REUSED)
GOTO CMDLBL(LOOP)
EOF: ENDPGM
命令文件:CHGLIBFA (CMD)
/*===================================================================*/
/* PROGRAM NAME : CHGLIBFA */
/* DESCRIPTION : */
/* PROGRAMMER : BLOG LIOU */
/* DATE : 2003/11/20 */
/*===================================================================*/
CMD PROMPT('Change Database File Attribute')
PARM KWD(CHGLIB) TYPE(*NAME) LEN(10) +
PROMPT('Change Lib')
PARM KWD(REUSEDLT) TYPE(*NAME) LEN(4) +
SPCVAL((*YES) (*NO)) PROMPT('Reused +
Delete Rows')
用 命令CRTCMD CMD(CHGLIBFA) PGM(CHGLIBFACL)创建CHGLIBFA命令,执行CHGLIBFA,就可以输入库名修改该库下的所有文件的Reuse deleted records的属性了。只需要稍对程序进行修改就可以批量修改文件多个其他属性了。