中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 操作系统 > IBM Server
AS/400开发经验点滴(二):一个批量修改文件属性的工具
作者:未知 时间:2005-09-13 15:42 出处:ChinaUnix.net 责编:chinaitpower
              摘要:AS/400开发经验点滴(二):一个批量修改文件属性的工具

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。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有