• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

AS/400开发经验点滴(二):一个批量修改文件属性的工具

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 73次 | 进入软件测试论坛讨论

领测软件测试网
AS/400开发经验点滴(二)

四.一个批量修改文件属性的工具

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文件里:

[code:1:b3ca3ab88b]DCL        VAR(&CALIB) TYPE(*CHAR) LEN(10)  /*定义一个库名变量*/

DSPFD      FILE(&CALIB/*ALL) TYPE(*BASATR) +  
             OUTPUT(*OUTFILE) FILEATR(*PF) +  
             OUTFILE(QGPL/TEMPLIBF)       [/code:1:b3ca3ab88b]

2. 对包含有文件名的临时文件进行加工

其实因为上面已经把文件名输出到了一个PF文件里,所以这一步可不要。但为了查看方便,我还是把文件名从TEMPLIBF中提出写入到一个更简单的PF文件中。先创建一个名为DTAFNAME的物理文件,如下:

[code:1:b3ca3ab88b]A          R DTANAM            
A            FILNAM           10A    /*PF文件名*/
A            FILLIB            10A    /*库名*/[/code:1:b3ca3ab88b]
再用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)
[code:1:b3ca3ab88b]/*===================================================================*/ 
/*       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                             [/code:1:b3ca3ab88b]                    

命令文件:CHGLIBFA  (CMD)
[code:1:b3ca3ab88b]
/*===================================================================*/
/*       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')     [/code:1:b3ca3ab88b]
用命令CRTCMD CMD(CHGLIBFA) PGM(CHGLIBFACL)创建CHGLIBFA命令,执行CHGLIBFA,就可以输入库名修改该库下的所有文件的Reuse deleted records的属性了。只需要稍对程序进行修改就可以批量修改文件多个其他属性了。

 xuguopeng 回复于:2003-12-06 09:51:47
很好 很好 继续继续~~~

 yokel 回复于:2003-12-08 10:07:37
太感谢了

 wildfish 回复于:2003-12-08 11:38:32
谢谢,:)

 kevingao 回复于:2003-12-08 16:24:21
我顶。。。。

 dfangyang 回复于:2003-12-09 17:01:58
不错,有帮助

 hanyu 回复于:2003-12-10 13:17:04
原创精华
谢谢!

 andrewleading_he 回复于:2004-01-05 17:24:00
不錯!繼續!

 stephenxie2003 回复于:2004-01-06 11:00:15
谢谢大虾!
继续吧! :)

 PPhan 回复于:2004-01-06 11:52:40
这位前辈真堪称楷模!谢了!!

 riancy1106 回复于:2004-01-07 11:25:41
支持,顶一下

 fairyboy 回复于:2004-12-01 08:04:03
支持楼主,继续

 Red_Crow 回复于:2004-12-01 08:52:33
支持,加油。

 thursday 回复于:2004-12-01 09:39:21
收藏,帮顶!

 old400 回复于:2004-12-01 21:03:06
不错,写得好。
用PDM的用户自定义OPTION 实现起来也很容易。不过有可能生产系统没有装PDM。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网