文档库 最新最全的文档下载
当前位置:文档库 › rpg经验总结

rpg经验总结

as400 总结
=============
如何向远程系统提交命令?
解答 我们知道,在分布式数据处理的环境下,对远程系统上文件内容的操作可以有很多方式,但是如果想简单地在本地对远程系统进行文件管理方面的操作,则可以由一条命令实现:SBMRMTCMD。现在介绍该命令的用法:

1. 首先确保双方系统上的分布式处理服务已启动:
STRTCPSVR SERVER(*DDM)

2. 为目标系统创建DDM文件:
CRTDDMF FILE(Lib/TESTAAA) RMTFILE(Lib/AAA) RMTLOCNAME(s102rncm *IP)
其中:TESTAAA是DDM文件名; AAA是远程系统s102rncm上要操作的文件的名称。

3. 在本地系统上运行文件管理方面的命令,例如:撤消用户USERBBB对文件AAA的所有权限:
SBMRMTCMD CMD('RVKOBJAUT OBJ(LIB/AAA) OBJTYPE(*FILE) USER(USERBBB) AUT(*ALL)') DDMFILE(LIB/TESTAAA)
这样,我们就能很方便地在本地系统上,实现远程系统上文件操作方面的管理。

posted @ 2008-01-09 15:14 深渊野鱼 阅读(129) | 评论 (0) | 编辑
RUNRMTCMD命令使用
RUNRMTCMD命令使用
解答 能够向client access发送命令的系统包括AS/400,VM,AIX以及其他版本的UNIX。

发送的命令应当预先在PC的DOS窗口运行,如果有输出,在把输出内容传送到OS/400并产生相应的spool file(QSYSPRT,使用的print file为QSYSPRT);如果命令本身并不产生输出则也会产生一个spool file,内容是无输出。

从OS/400使用RUNRMTCMD命令性client access发送远程命令。PC端可以同时处理多个命令请求,按接收的顺序运行这些命令。

入局远程命令的目的是运行非交互式命令和程序。交互式命令或WINDOWS程序可以运行,并且看起来好象已经从请求系统运行成功,但可能仍在PC运行并等待与用户进行人机对话。

入局远程命令可以使用TCP/IP和SNA,不适用于IPX。

CWBRXD.EXE 用于使用TCP/IP通信时启动入局远程命令精灵程序。
CWBRXDSD.EXE 用于使用TCP/IP通信时停止入局远程命令精灵程序。
AREXECDW.EXE 用于象PCOM那样的WINCPIC兼容栈
AREXECDN.EXE 用于NetSoft栈

语法:
RUNRMTCMD CMD(’pc 命令‘)
----RMTLOCNAME('xxx.xxx.xxx.xxx' *IP)
----RMTUSER(remote user-id)
----RMTPWD(xxxxxx)
----CCSID(pc ccsid)

其中RMTUSER必须时PC上设定的有效用户[注1]。
如果用户和密码有小写,则必须用单引号',否则全部转换成大写处理(NT是大小写敏感的)。
CCSID必须和PC端操作系统的语言相匹配,例如中文Win98、中文NT为1381,而英文Win98、英文NT为437。(用CHCP这个DOS命令看到的PC语言代码不十分可靠)

APPC格式:
RUNRMTCMD CMD(’pc 命令')
----RMTLOCNAME(appn.系统名 *SNA)
----RMTUSER(远程用户 ID)
----RMTPWD(‘口令’)
----CCSID(pc ccsid)

例:
RUNRMTCMD CMD(‘dir c:\/w') RMTLOCNAME('4.17.19.95' *IP) CCSID(437)
要求PC使用英文Win

98,并且不需要用户和口令。

RUNRMTCMD CMD('copy c:\config.sys c:\config.bak') RMTLOCNAME('7.19.19.93' *IP)
RMTUSER(MOKCK) RMTPWD('ibmas400') CCSID(437)
spool file结果为’1 file copied'.

ADDJOBSCDE JOB(MYJOBD) CMD(RUNRMTCMD CMD("c:\mydir\daily.bat')
RMTLOCNAME(APPN.PC01 *SNA)) FRQ(*WEEKLY) SCDDAY(*ALL)
SCDTIME(180000)

RUNRMTCMD CMD('c:\progra~1\IBM\RTOPCB c:\MYDATA\MYTFR.TTO')
RMTLOCNAME(YOURNET.PC01 *SNA) RMTUSER(MOKCK)

RUNRMTCMD CMD('c:\windows\calc.exe') RMTLOCNAME(MYPC *IP) CCSID(437)
PC端的计算器会被激活,同时400端出现pending(等待),直到把PC端计算器关闭,400端作业才被释放。

[注1]
CHGPRTF FILE(QSYSPRT) IGCDTA(*YES)
在中文DBCS环境下运行RUNRMTCMD命令时,必须使得spool file的打印摸板QSYSPRT支持DBCS。
[注2]
在NT上运行RUNRMTCMD时必须指定要运行程序的全称路径,默认路径是C:\

用户设定:
在Win98端

默认情况下PC端没有任何关于‘入局远程命令的’设置。单击‘添加’

系统和用户支持*通配符。
系统名应当和DSPNETA中指定的系统名相同,用户则可以任意设置。
第2步:

如果不使用WIN95口令高速缓冲,则必须指定client access入局远程命令。

在NT中把登录client access入局远程命令的管理全部委托给NT的安全管理程序来管理,但要求有效的用户名不能超过10个字符。

启动入局远程命令:
Win98平台运行 c:\windows\cwbrxd.exe
NT把入局远程命令放到[control]==>[service]中,使用start即可激活。

停止入局远程命令:
Win98平台运行 c:\windows\cwbrxdsd.exe
NT把入局远程命令放到[control]==>[service]中,使用stop即可停止。


失败原因检查:

1、执行RUNRMTCMD调用NT端应用,返回‘无效的密码或用户’
检查该用户在NT上是否存在。
RUMRMTCMD中该用户的password是否大小写正确,是否使用了单引号。
在Win98上最好使用system = *,user=*的基本配置

2、RUNRMTCMD返回‘客户端没有启动’
检查RUNRMTCMD在PC端的server精灵程序是否已经启动。

3、SNA,anynet也可以使用RUNRMTCMD

4、如果NT支持GUEST 用户而且没有口令,则RUNRMTCMD时可以设置PWD(*NONE)。

5、在中国5250键盘的仿真中,\被解析成Y(人民币符号),无法通过客户化键盘的方式进行
修正,但在VT100的模式下可以不受影响。

posted @ 2008-01-09 15:13 深渊野鱼 阅读(182) | 评论 (0) | 编辑
OS/400与UNIX功能相似的部分命令
OS/400与UNIX功能相似的部分命令
解答 对于大多数SAP的用户,比较习惯UNIX及WINDOWS命令,而对于OS/400的命令缺少使用经验,这里结合SAP系统经常用到的命令,比较OS/400与UNIX功能相似的命令及其格式。

1.与文件系统有关的命令:

unix命令 对应的AS/400的命令
--------------------------------------------
cd ------CD (

后跟路径名用单引号括起来)
ls ------WRKLNK
ls -l ---WRKLNK 命令,再用8,9或12选择项
more ----DSPSTMF
tail ----DSPSTMF 并按F17功能键
vi ------EDTF
cp ------CPY (拷贝的目标文件必须不存在)
mv ------MOV (目标文件必须不存在)
ren -----REN
rm ------DEL 删除文件;RD 删除目录
chgmod --CHUAUT
mount/ln ADDLNK
bdf -----WRKSYSSTS 或WRKDSKSTS查看存储空间

2.与进程有关的命令:

unix命令 对应的AS/400的命令
--------------------------------------------
ps ------WRKACTJOB 用来查看系统上所有的作业,WRKUSRJOB用来查看某个用户的作业;WRKSMBJOB *JOB 查看用户提交的所有作业
kill -9 -ENDJOB OPTION(*IMMED) LOGLMT(0)
执行程序 -CALL PGM(程序) PARM('参数')
程序& ---SMBJOB
exit ----SIGNOFF ENDCNN(*YES)

3.与用户有关的命令:

passwd - CHGPWD用来修改自己的口令;CHGUSRPRF用来修改指定用户的口令

4.其它命令:
ftp ------FTP
telnet ---TELNET
ping -----PING
sqlplus --strsql 或SQLUTIL

posted @ 2008-01-09 15:08 深渊野鱼 阅读(151) | 评论 (0) | 编辑
在5250上面实现复制粘贴
编辑---键盘---自定义
定制---点C--功能:编辑复制 --〉到CTRL
点V--功能:编辑粘贴 --〉到CTRL
保存,然后指定键盘的方式
posted @ 2008-01-09 15:07 深渊野鱼 阅读(129) | 评论 (0) | 编辑
关于文件的ShareODP和USROPN
1.ShareODP:
在PF或者LF编译的时候,有个SHARE(Share Open Data Path)的参数,控制该文件是否共享其打开路径。
如果指定SHARE为*NO的话,程序在每次打开一个文件的时候,都会为该文件建立一次访问路径;如果指定SHARE为*YES的话,程序在第一次打开该文件的时候,系统建立该文件的访问路径,在同一个ActiveGroup中再打开该文件时,就不再重新建立该文件的访问路径,而是共享使用之前建立的路径,从而提高了程序运行的速度。
一般在编译的时候该参数设置为*NO,即不是共享打开。在需要共享打开的时候,使用OVRDBF对该参数进行更改。

使用ShareODP需要注意的一些东西:
1).由于在不同的ActiveGroup之间不能ShareODP,所以如果几个程序在编译的时候没有加入到同一个ActivationGroup中,ShareODP就不会有什么效果。
2). 如果PGMA打开FILEA并定位到了第一条记录,然后PGMA调用PGMB;PGMB也打开了FILEA并直接读FILEA,将读到第二条记录; PGMB运行完后PGMA又继续读FILEA下一条记录,此时它读到的将是第三条记录。而如果没有ShareODP的话,PGMA两次读到的会是第一条和第二条记录,PGMB读到的会是第一条记录。

ActiveGroup:
在CRTPGM 的时候,有个参数ACTGRP(ActivationGroup),控制该PGM在运行的时候属于哪个Ac

tiveGroup。如果指定*NEW,则该 PGM会重新建立一个ActiveGroup;如果指定为*CALLER,则该PGM会与调用它的PGM使用同一个ActiveGroup。

2.UserOpen:
RPG程序在使用F表引用外部文件的时候,有一个KeyWords是USROPN。
在没有使用USROPN的时候:系统会在每次运行该程序的时候自动打开所引用的文件;一般可以通过设置*LR为*ON来自动关闭文件,但是如果是SubProcedure,系统不会自动关闭所打开的文件。
如果指定了USROPN:则系统不再控制文件的打开与关闭,由用户手工进行文件的OPEN与CLOSE;如果一个模块已经打开还没有关闭文件的情况下,该模块将不能再对该文件做打开的操作。
USROPN比系统自动打开文件要慢一些。在打开同一个文件5000次的情况下,USROPN使用了400毫秒,系统自动打开只用了4毫秒。

使用UserOpen需要注意的一些东西:
1).在OPEN之前最好使用 %OPEN(FileName) 检查要打开的文件是否已经打开,如果没有打开再执行OPEN的操作。
2). CLOSE *ALL的命令可以关闭本模块打开的所有文件。如果一个文件没有指定为USROPN,Close *ALL也将关闭该文件。并且如果该模块是不参与RPG Cycle的程序,如一个SubProcedure,则在第二次运行本模块的时候,该文件将不会再自动打开,此时如果再对该文件做操作,就会出错。所以最好指定文件名来CLOSE,并注意只关闭USROPN的文件。

posted @ 2008-01-09 15:07 深渊野鱼 阅读(98) | 评论 (0) | 编辑
如何以某一关键字快速搜索AS/400 中的Message file
用DSPMSGD命令可以查看某个已知某一个的Message ID的内容,但是它不能按照某个关键字查看一个message file中的所有message id,如何按某个关键字搜索整个Message file中的所有message id 呢?
解答 1.在AS/400命令行上输入命令:
DSPMSGD RANGE(*ALL) MSGF(QSYS/QCPFMSG) DETAIL(*BASIC) OUTPUT(*PRINT)
参数说明:
RANGE(*ALL): 列出所有的message id。

MSGF(QSYS/QCPFMSG): 查看QSYS目录下的QCPFMSG message file。

DETAIL(*BASIC): DETAIL参数有两个选项,*FULL -> 列出message的所有信息;
*BASIC -> 仅列出message id,message的严重级别和message描述。

OUTPUT(*PRINT): 将命令的执行结果生成一个Spool file。

2.命令执行完成之后,生成Spool file:QPMSGD。

3.在AS/400命令行上执行命令:
-----------WRKSPLF

4.在QPMSGD文件前输入 5(display),打开这个文件。

5.在“Find”处输入要搜索的关键字,如:艘索“password”关键字,按功能键F16,即可搜索所有Message file的内容。如下图所示:

File . . . . . : -QPMSGD -----------Page/Line --21/33
Control . . . . . ------------------Columns ----1 - 75
Find . . . . . . -password
*...+...1...+...2...+...3...+...4...+...5...+...6...+...7...+
CPC1E75 -0 -Some system options not changed. Some changed and req

uire I
CPC1E76 -0 -Some passwords not changed. Try again later.
CPC1E77 -0 -Passwords successfully changed.
CPC1E78 -0 -System options successfully changed; IPL required.
CPC1E79 -0 -System options successfully changed.
CPC1115 50 -CPC1115 Class &1 in library &2 not found.
CPC1116 50 -CPC1116 Program &1 in library &2 not found.
CPC1117 50 -CPC1117 Routing data does not match routing entry.
CPC1118 50 -CPC1118 Maximum number active jobs for routing entry reache
CPC1119 50 -CPC1119 No authority to class &1 in &2.
CPC1120 50 -CPC1120 No authority to program &1 in &2.
CPC1121 50 -CPC1121 No storage requested for storage pool.
CPC1122 50 -CPC1122 Function check occurred while trying to start job.
CPC1123 60 -Subsystem &1 cannot start prestart job &2.
CPC1124 50 -ENDJOBABN issued against job &3/&2/&1 by user &4.
CPC1125 50 -Job &3/&2/&1 was ended by user &4.
--------------------------------------------------------------------More.

posted @ 2008-01-09 15:06 深渊野鱼 阅读(187) | 评论 (0) | 编辑
如何查看QTEMP的内容?可以查看别人的QTEMP的
1. 显示自己作业的QTEMP的内容:
(1) 用DSPLIB显示所有外部对象(操作系统之上的可操作的对象):
DSPLIB LIB(QTEMP);

(2) 用DMPLIB显示所有内部对象:
DMPOBJ OBJ(QTEMP) OBJTYPE(*LIB)
结果位于假脱机文件QPSRVDMP中:(如图所示)

2. 显示别人作业的QTEMP的内容:
(1). 用WRKACTJOB找出所要查看的作业的名称,例如:123315/USERxxx/QPADEV0003

(2). STRSRVJOB JOB(123315/USERxxx/QPADEV0003)
DMPOBJ OBJ(QTEMP) OBJTYPE(*LIB)
ENDSRVJOB
结果位于假脱机文件QPSRVDMP中.

posted @ 2008-01-09 15:05 深渊野鱼 阅读(145) | 评论 (0) | 编辑
如何在AS/400上发送带有颜色的MESSAGE
用户经常发送MESSAGE,MESSAGE的颜色往往是绿色的,其实是可以发送彩色的MESSAGE的。


解答 1.创建SNDCOLMSG CLP程序。
SNDCOLMSG: PGM PARM(&MSG &COLOR &MSGTYPE)

DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
DCL VAR(&COLOR) TYPE(*CHAR) LEN(1)
DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10)
DCL VAR(&LASTBYTE) TYPE(*CHAR) LEN(1) VALUE(X'20')
DCL VAR(&TEXT) TYPE(*CHAR) LEN(82)

CHGVAR VAR(&TEXT) VALUE(&COLOR *CAT &MSG *TCAT
&LASTBYTE)

SNDPGMMSG MSG(&TEXT) TOPGMQ(*EXT) MSGTYPE(&MSGTYPE)
SNDPGMMSG MSG(&TEXT) MSGTYPE(&MSG)

END: ENDPGM

2.创建命令SNCCOLMSG
CRTCMD CMD(SNDCOLMSG) PGM(SNDCOLMSGC)


SNDCOLMSG: CMD PROMPT('Send colored message')

PARM KWD(MSG) TYPE(*CHAR) LEN(80) PROMPT('Message')

PARM KWD(COLOR) TYPE(*CHAR) LEN(1) RSTD(*YES)
DFT(*GREEN) SPCVAL(
(*GREEN X'20')
(*GREEN_REVERSE X'21')
(*WHITE X'22')
(*WHITE_REVERSE X'23')
(*GREEN_UNDERSCORE X'24')
(*GREEN_UNDERSCORE_REVERSE X'25')
(*WHITE_UNDERSCORE X'26')
(*RED X'28')
(*RED_REVERSE X'29')
(*RED_BLINK X'2A')
(*RED_REVERSE_BLINK X'2B')
(*RED_UNDERSCORE X'2C')
(*RED_UNDERSCORE_REVERSE X'2D')
(*RED_UNDERSCORE_BLINK X'2E')
(*TURQUOISE X'30')
(*TURQUOISE_REVERSE X'31')
(*YELLOW X'32')
(*YELLOW_REV

ERSE X'33')
(*TURQUOISE_UNDERSCORE X'34')
(*TURQUOISE_UNDERSCORE_REVERSE X'35')
(*YELLOW_UNDERSCORE X'36')
(*PINK X'38')
(*PINK_REVERSE X'39')
(*BLUE X'3A')
(*BLUE_REVERSE X'3B')
(*PINK_UNDERSCORE X'3C')
(*PINK_UNDERSCORE_REVERSE X'3D')
(*BLUE_UNDERSCORE X'3E')
) PROMPT('Color')

PARM KWD(MSGTYPE) TYPE(*CHAR) LEN(10) RSTD(*YES) +
DFT(*INFO) VALUES(*INFO *COMP) +
PROMPT('Message type')
3.执行
sndcolmsg msg('sgdsad') color(*blue)
SNDCOLMSG MSG('sgdsad') COLOR(*YELLOW_REVERSE)
sndcolmsg msg('sgdsad') color(*blue)
sndcolmsg msg('sgdsad') color(*pink)
xqlib/sndcolmsg msg('sgdsad') color(*pink)

posted @ 2008-01-09 15:04 深渊野鱼 阅读(138) | 评论 (0) | 编辑
如何将AS/400英文界面改为中文界面?
如何将AS/400英文界面改为中文界面?
解答 前提:系统必须安装第二语言(2989)。

具体步骤如下:
1.用CHGSYSLIBL命令修改系统的库列表。
CHGSYSLIBL LIB(QSYS2989) OPTION(*ADD)
2.GO MAIN 就可看到中文界面。

将中文界面改回英文界面:
1.用CHGSYSLIBL命令修改系统的库列表。
CHGSYSLIBL LIB(QSYS2989) OPTION(*REMOVE)
2.GO MAIN 就可看到英文界面

posted @ 2008-01-09 15:04 深渊野鱼 阅读(174) | 评论 (1) | 编辑
如何从OS/400里直接发送电子邮件到Internet
从OS/400 V4R1开始,即使您的i系列400服务器上没有安装邮件服务器软件(如Domino),也可以通过设置 SMTP Gateway, 指向一个外部邮件服务器(Lotus Domino, Miscrosoft Exchange 等), 帮助转发Internet邮件, 即i系列400将邮件自动发到您指定的MailServer,再由这个MailServer把邮件发向Internet. 实现步骤如下:

(1)设定TCP/IP环境,用命令CFGTCP:
选择10(Work with TCP/IP host table entries),把外部MailServer名称和对应IP地址登记注册进HostTable.

(2)使用命令CHGSMTPA, 确认参数设置:
AUTOSTART(*YES) 和 MAILROUTER(mail-server-name).

(3)注册用户:
ADDDIRE USRID(INTERNET SMTPRTE) USRD(‘Internet SMTP gateway’) SYSNAME(INTERNET) PREFADR(NETUSRID *IBM ATCONTXT)

(4)修改份发属性:
CHGDSTA SMTPRTE(INTERNET SMTPRTE)

(5)重启TCP的SMTP服务:
ENDTCPSVR *SMTP, STRTCPSVR *SMTP

(6)使用 WRKDIRE ,确认要使用这个功能的用户也注册加入了 Directory Entry.

(7)测试:
SNDDST TYPE(*LMSG) TOINTNET(E-mail address) DSTD(‘Mail test message’) LMSG(‘Mail test message’)

(若传送中文,只能以附件的形式 SNDDST TYPE(*DOC) 发送:
CRTFLR FLR(CHSFILE)
CPYTOPCD FROMFILE(XXXX) TOFLR(CHSFILE) FROMMBR(XXX) TODOC(XXXX.TXT) TRNTBL(*NONE) TRNIGC(*SCGS)
SNDDST TYPE(*DOC) TOINTNET(E-mail address) DSTD(‘Test message’) DOC(XXXX.TXT) FLR(TEMP)

posted @ 2008-01-09 15:03 深渊野鱼 阅读(107) | 评论 (0) | 编辑
关于命令RGZPFM
命令RGZPFM做什么? 什么情况下运行? 影响命令RGZPFM执行时间的因素有哪些?
解答 命令RGZPFM应该在文件中被删除的记录超过20%时执行. 该命令执行后,系统的性能会改

善。 因为系统在检索时不必再去读那些已经被删除的记录索引, 并且被删除记录所占有的硬盘空间会被释放而变 为可用。
影响命令RGZPFM执行时间的因素有很多, 最基本的有以下一些:o 在执行RGZPFM命令时, 系统会使用内部命令CPYF把数据部分拷贝到一个新的数据区, 如果文件 不是排序的(KEYFILE参数), 那么拷贝的频率是8K。由此可以估算出大致需要花费的时间。
o 在执行RGZPFM命令时用KEYFILE参数, 那么运行时间取决于记录在硬盘上的分布状况。 系统会 用现存的访问路径(ACCESS PATH)去读取数据。
o 访问路径(ACCESS PATH)的维护也是因素之一。 重建访问路径(ACCESS PATH), 在最坏的情况下 是每分钟10,000条记录。

注:内部命令CPYF是不被指定库的, 这是内部对象, 通过WEKOBJ命令看不到的。它所用到的中间文 件的大小和被拷贝的文件的大小是相同的。

如果你准备用RGZPFM命令来增加硬盘的可用空间, 不妨使用下列步骤: o 确认物理文件有可用的副本
o 将与之相关的逻辑文件保存到磁带上
o 用CPYTOTAP命令把物理文件(没有被删除的记录)保存到磁带上
o 删除相关的逻辑文件
o 清除物理文件
o 用CPYFRMTAP命令把保存在磁带上的物理文件备份会系统
o 恢复逻辑文件 (用EDTRBDAP命令去浏览和维护访问路径的重建)
注:o 如果硬盘上还有可用空间, RGZPFM命令会在同一ASP中创建物理文件的副本, 并随后重建逻辑 文件。 整个访问路径必须重建。 因此在执行该命令之前, 硬盘上必须要有足够的空间容纳 逻辑文件的索引。
o 如果打算一次对多个物理文件进行重整, 应该对逻辑文件有一个全盘的考虑。因为有些逻辑 文件是基于多个物理文件,如果是这样话, 就可以一次性在所有物理文件重整后重建逻辑访 问路径。

posted @ 2008-01-09 15:02 深渊野鱼 阅读(89) | 评论 (0) | 编辑
启动日志
STRJRNPF FILE(OBJECT/OBJ LIBRARY) JRN(JOURNAL LIBRARY /JOURNAL FILE)
posted @ 2008-01-09 15:02 深渊野鱼 阅读(36) | 评论 (0) | 编辑
folder的操作
1。首先用户必须具备
 WRKDIR的权限
授权方法: wrkdir 添加该用户
2. 目录授权
WRKFLR
F6=新怎目录 注意:要对每一层的目录进行对该用户的授权,一般是*ALL
posted @ 2008-01-09 15:01 深渊野鱼 阅读(36) | 评论 (0) | 编辑
如何重新找回物理文件中已经被删除的记录
序言:
这是一个允许查看/拷贝/找回物理文件中已经被删除的记录的工具。你可以交互地显示活动的和被删除的
记录,扫描到被删除的记录,并将它们恢复回来。此外,你还可以通过这个工具将记录拷贝并打印出来,或者
输出到一个输出文件,或者是在不显示记录的情况下,直接恢复被删除的记录。
与其他恢复被删

除的记录的工具不同,UNDEL并不会把物理文件拷贝到SAVF中,而是直接在物理文件的记录
上直接操作,这对于有着很多记录的物理文件来说,速度会快很多。
UNDEL可以运行在RISC系统上:V3R7及以上版本,同时系统安全级别(系统值QSECURITY)设为40或50。

工作原理:
当一个应用程序删除了物理文件里的一条记录(例如:通过RPG语言中的DELETE代码),OS/400并不会真正
从存储介质上将其除去,而仅仅是在记录中设置一个数位来标明记录已经被删除。一旦这个数位被设置,通过
通常的数据库操作,OS/400将永远不会访问到这些记录。但是,你可以通过提交一个"通过RRN写数据"的操作,
重新使用这些记录,例如:在RPG程序中一条带RECNO参数的WRITE命令。这时,OS/400将回置标明被删除的哪
个数位,并且将新的记录覆盖在原来已经删除的这条记录的位置上。
这就是UNDEL的工作原理,其实它并不是恢复已删除的记录,而是在它之上重新写一个新的记录。重点在
于:UNDEL首先找回被删除的数据,然后将数据写回新的记录。由于OS/400拒绝回收旧记录中的数据,UNDEL就
跳过数据库的操作,它找到文件中的记录在数据库中的位置,然后通过简单的数位移动命令将记录恢复。
请注意,UNDEL并不真正修改物理文件中的内容,更新记录信息的操作是通过应用程序提交一个合法的
WRITE操作来实现的。(事实上,提交WRITE操作的是一个COBOL程序。)

内容:
UNDELRIS.ZIP文件包含以下内容:
-- README
-- UNDEL.LIB AS/400上名为UNDEL的库,SAVF格式。
-- PF528.FDF 528位物理文件RFROMPC的描述文件。
-- TOSAVF.REX 将物理文件拷贝成SAVF文件的源代码

UNDEL.LIB包含以下内容:
-- UNDEL 命令
-- UNDELR 命令调用的CPP
-- UNDELM MI层的程序
-- UNDELCB 写记录的COBOL程序
-- UNDELC CL功能
-- UNDELMC CL功能的消息处理
-- UNDELD 显示文件
-- UNDELP 打印文件
-- UNDELMF 信息文件
-- UNDELA 数据区域
-- UNDELU UNDEL命令的帮助信息
-- UNDELDU UNDELD显示文件的帮助信息

返回

安装步骤:
在AS/400上安装:
最简单的方法是通过FTP(如果你有到AS/400的FTP连接)。
A. 在AS/400上库mylib下创建一个SAVF -- mysavf;
B. 在PC端,打开FTP通讯;
C. 输入以下命令:
FTP> bin
FTP> cd mylib
FTP> put undel.lib mysavf
FTP> quit
(其中mysavf是步骤A中创建的SAVF。)
D. 直接跳到第D步;

如果你的系统上不能FTP,那么可以通过以下步骤:

A. 创建一个记录长度为528的物理文件:
CRTPF MYLIB/PF528 RCDLEN(528) SIZE(*NOMAX)

B. 将UNDEL.LIB放入长度为528的物理文件:
一种方法:
使用Client Access的程序RFROMPC将UNDEL.LIB拷贝到物理文件PF528中(指定PF528.FDF为描述文件);
另一种方法:
将UND

EL.LIB拷贝到一个共享文件夹,然后执行命令:
CPYFRMPCD FROMFLR(MYFLR) TOFILE(MYLIB/PF528)
FROMDOC(UNDEL.LIB) TRNTBL(*NONE)

C. 将528位的物理文件拷贝成SAVF:
一种方法:
使用QUSRTOOL命令CPYTOSAVF:
CPYTOSAVF FROMDBF(MYLIB/PF528) TOSAVF(MYLIB/MYSAVF)

另一种方法:
将REXX程序TOSAVF装入文件QREXSRC:
STRREXPRC SRCMBR(TOSAVF) SRCFILE(MYLIB/QREXSRC)
PARM('pf528 mylib mysavf mylib')

D. 从SAVF中恢复UNDEL库:
RSTLIB SAVLIB(UNDEL) DEV(*SAVF) SAVF(MYLIB/MYSAVF)
如果你愿意,也可以将这些对象恢复到另一个库中:
RSTLIB SAVLIB(UNDEL) DEV(*SAVF) SAVF(MYLIB/MYSAVF) RSTLIB(NOTHERLIB)
UNDEL命令中唯一对库有要求的对象是参数PRDLIB,所以你可以将该参数改为自己的库:
CHGCMD CMD(MYLIB/UNDEL) PRDLIB(NOTHERLIB)

返回

5. 执行方法:
输入UNDEL命令就会交互地进入显示物理文件的画面,记录是用字符表格显示的,你可以用F19或F20扫描
删除的记录,或者输入你所知道的相对记录号(RRN)。使用F23恢复已经删除的记录,系统会提示你再按一次
F23键来确认你的选择。
你还可以使用OUTFILE参数将恢复的记录拷贝到另一个文件中,如果你指定的OUTFILE不存在,命令会自动
创建,如果OUTFILE已存在,那该文件的记录格式必须与原来的文件相同。
此外,在显示画面中,还包含UNDEL命令的帮助信息(F1键显示帮助信息)。

posted @ 2008-01-09 15:00 深渊野鱼 阅读(326) | 评论 (0) | 编辑
如何在各种环境中处理多成员的物理文件
SQL是与平台无关的数据库操作语言,虽然它无法处理iSeries上包含多成员的物理文件(表),但是它与RPG/COBOL一样,是可以处理写入数据库文件的物理文件成员。所以,您可以通过命令OVRDBF和SQL一起来处理多成员的物理文件:

OVRDBF FILE( name ) TOFILE( toname ) MBR( name ) OVRSCOPE( *JOB )

这里有几点值得注意的地方:
1. 您只能OVERRIDE一个成员,而不是所有成员;
2. 参数OVRSCOPE( *JOB )保证了OVERRIDE的动作即使在不同的activation group中执行,也能被识别;
3. 建议使用参数OVRSCOPE( *JOB ),除非您希望明确的限定OVERRIDE的范围。

要解除OVERRIDE,请使用命令DLTOVR:

DLTOVR FILE( name ) LVL( *JOB )

参数LVL的意义相当于OVRDBF命令中的参数OVRSCOPE,指定了OVERRIDE的范围。

根据您使用SQL的不同方法,OVERRIDE成员的方法也不尽相同:

1. iSQL环境:

在iSQL环境中,最简单的方法是在进入SQL环境之前在5250命令行运行命令OVRDBF,如果您已经进入了iSQL环境,您也可以使用以下的命令启动5250命令行:

CALL QCMD

在执行完OVRDBF命令后,按F3就可以退出5250命令行,返回iSQL环境,注意,如果您指定的参数OVRSCOPE( *JOB ),系统仍然能够识别您要OVERRIDE的内容。

2. 嵌入式SQL环境:


在嵌入式SQL环境中,要想OVERRIDE一个成员,就要使用QCMDEXC,举例说明,在ILE RPG中,您定义的QCMDEXC原型为:

d runCommand pr extpgm( 'QCMDEXC' )
d command_ 999 const
d size_ 15p 5 const
d commandSize s 15p 5 inz( 999 )

接着, 在执行SQL语句之前运行以下的OVERRIDE:

/free
runCommand( 'OVRDBF FILE(name) TOFILE(name) ' 'MBR(name) OVRSCOPE(*JOB)': commandSize )
/end-free

3. ODBC/OLE DB环境:

3.1 通过存储过程调用来实现OVRDBF

在ODBC中是可以通过调用要运行的命令的系统API来执行该命令。通过这种技术,就可以在执行SQL之前将您希望使用的成员使用OVRDBF命令来OVERRIDE。例如:

CALL QSYS.QCMDEXC('OVRDBF FILE(USER1) TOFILE(MYLIB/USER1) MBR(COMPANY) OVRSCOPE(*JOB)', 0000000066.00000)

其中:0000000066.00000分别是10位/5位的固定长度的十进制字段,在例子中的值66是单引号中全部字符的长度,包括空格。注意:剩下的数字位必须为0。

下面的URL上有一个Visual Basic ODBC的例子,请参阅:

ftp://https://www.wendangku.net/doc/b83848278.html,/as400/fromibm/ApiSamples/

3.2 通过SQL别名来实现OVRDBF

在OS/400 R430及以上版本支持SQL有关别名的语句。为每一个您需要访问的成员创建一个别名,并通过在ODBC中访问这些别名来达到访问不同成员的目的。由于别名是固定的,所以只需要创建一次,任何SQL工具,例如:iSQL,3.1中提到的ODBC例程,等等,都可以用来创建这些别名。例如:

CREATE ALIAS MYLIB.FILE1MBR1 FOR MYLIB.MYFILE(MBR1)
CREATE ALIAS MYLIB.FILE1MBR2 FOR MYLIB.MYFILE(MBR2)

创建了不同的别名后,PC上的应用就可以指定MYLIB.FILE1MBR1 或 MYLIB.FILE1MBR2 来访问您想要访问的成员了。

在ODBC中使用别名的注意事项:
1. 一个别名被ODBC目录功能返回的类型是"ALIAS"。有一些应用可能不会把别名当成可用的表名显示在数据库中;
2. 即使物理文件,库不存在了,别名依然可以独立存在(类似于符号连接);
3. 在SQL语句中使用别名参照的成员是有一些限制的,具体内容参照DB2 for AS/400 SQL Reference (SC41-5612)
书中的详细描述。

参考资料:
DB2 for AS/400 SQL Reference (SC41-5612)

posted @ 2008-01-09 15:00 深渊野鱼 阅读(80) | 评论 (0) | 编辑
如何恢复包含损坏记录的物理文件
在物理文件在没有激活日志的状态下,如果出现了损坏的记录如何恢复该物理文件。
解答 请按照以下步骤,尽量恢复物理文件中没有损坏的记录:

1、在OS/400命令行键入以下命令:

OVRDBF FILE(LIBA/File) SEQONLY(*YES 1)

注: 该命令确保该物理文件被顺序地处理,同时只有一个记录在处理。

2、接着,执行以下命令:

CPYF FROMFILE(LIBA/File) TOFILE(QTEMP/x) CRTFILE(*YES) +
FROMRCD(1) ERRLVL(999) COMPRESS(*YES)

注: 同时将文件QTEMP/X保存在磁带上。


3、删除包含损坏记录的物理文件:

DLTF FILE(LIBA/File)

注: 如果由于该物理文件有逻辑文件相关,先将相关的逻辑文件更名,
存放在相同的库中。

4、将保存在QTEMP中的文件放回原来的库:

MOVOBJ OBJ(QTEMP/x) OBJTYPE(*FILE) TOLIB(LIBA)

注: 如果由于该物理文件有逻辑文件相关,请在新的物理文件上重建
相应的逻辑文件。

5、删除所有旧的逻辑文件和物理文件:
DLTF FILE(LIBA/all_logicals_over_renamed_physical)
DLTF FILE(LIBA/renamed_physical)

注解:
- 用命令CPYF得到一个包含所有可以访问的记录文件,而损坏的记录将会被写入作业日志(JOBLOG)。
参数ERRLVL将被视为一个可以容忍的最多损坏记录的阀值,超过该阀值时,CPYF命令将停止。 - 命令CPYF执行结束后,您可以比较两个文件(QTEMP/x和LIBA/File)的记录的数量,如果记录数相同,
说明物理文件中的数据没有丢失。如果记录数不同,说明有数据丢失,此时就需要从其他途径来
恢复这些数据,例如:备份的磁带等。

- 当指定命令CPYF中的参数COMPRESS为*NO时,旧文件中被删除的记录也会被拷贝到新的文件中。

- 指定命令CPYF中的参数FROMRCD(1)是为了避免运行该命令时,物理文件的访问路径被破坏。

posted @ 2008-01-09 14:59 深渊野鱼 阅读(47) | 评论 (0) | 编辑
如何找出物理文件中损坏的记录
如何找出物理文件中损坏的记录?
解答 下面提供的CL源程序可以帮助您找出物理文件中损坏的记录,但是不支持其他文件
系统中的文件类型,例如:/QNTS,/QOPT等。也不支持OS/400上其他类型的对象。

如果您的操作系统版本在R420以上,则该程序需要一个逻辑文件来支持:
/**********************************/
R RECORD PFILE(QSYS/QADBXREF)
DBXFIL
DBXLIB
DBXATR
DBXRDL
K DBXLIB
K DBXFIL
/**********************************/

以下就是CL源程序,将该程序编译成可执行代码,就可以运行了。
**********************************************************************
** 特别提示: ----------------------------------------------------- -**
** 请不要在生产机器上运行该程序!!请先在测试机器上充分测试后再运行!! -**
**********************************************************************

/* ACCEPT TWO PARAMETERS, THE RANGE OF LIBRARIES TO BE SCANNED ---- -*/
/* DO NOT FORGET TO CHECK FILES STARTING WITH $,@, # -------------- -*/
/* IF YOU WANT TO SCAN EVERYTHING, START WITH $ AND --------------- -*/
/* END WITH Z999999999 -------------------------------------------- -*/

/* WARNING: - A SMALL SPOOLED FILE WILL BE CREATED FOR EACH ----------*/
/* FILE TESTED. IF NO ERRORS ARE FOUND, THE SPOOL */ /* FILE IS EMPTY.*/

PGM PARM(&START &END)

/* LIBRARY TO START WITH --------------------------------------------*/
DCL VAR(&START

) TYPE(*CHAR) LEN(10)

/* LIBRARY TO STOP AFTER --------------------------------------------*/
DCL VAR(&END) TYPE(*CHAR) LEN(10)
DCL VAR(&NBRRCDS) TYPE(*DEC) LEN(6)
DCLF FILE(CHECKLF) ALWNULL(*YES)

CHGJOB LOG(4 30 *SECLVL) LOGCLPGM(*NO)
OVRPRTF FILE(*PRTF) HOLD(*YES)

/* POSITION IN THE FILE TO THE PARTIAL KEY LIBRARY NAME------------ */
OVRDBF FILE(CHECKLF) POSITION(*KEYAE 1 RECORD + &START) OPNSCOPE(*JOB)
RCF: RCVF
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDP))
CHGVAR VAR(&NBRRCDS) VALUE(32000 / &DBXRDL)
OVRDBF FILE(&DBXFIL) OPNSCOPE(*JOB) SEQONLY(*YES + &NBRRCDS)
IF COND(&DBXLIB > &END) THEN(GOTO CMDLBL(ENDP))
IF COND(&DBXATR = 'PF' │ &DBXATR = 'TB') THEN(DO)
IF COND(&DBXRDL > 4) THEN(DO)
CPYF FROMFILE(&DBXLIB/&DBXFIL) TOFILE(*PRINT) +
FROMMBR(*ALL) FROMRCD(1) INCCHAR(*RCD 1 + *EQ '[-')
MONMSG MSGID(CPF0000)
ENDDO
ENDDO
DLTOVR FILE(&DBXFIL)
GOTO CMDLBL(RCF)
ENDP:
ENDPGM

posted @ 2008-01-09 14:59 深渊野鱼 阅读(47) | 评论 (0) | 编辑
如何对37,65535的字段进行中文模糊查询
在5.2版本中如果使用SQL建表并制定字段属性为CCSID 65535,是可以使用中文的模糊查询的但如果使用DDS建表,利用field level keyword来制定字段属性为CCSID
(65535),则无法使用中文的模糊查询,原因是0E/0F控制码也被当作普通字符使用。

例如
R TEST
--NAME --A(20)-- CCSID(65535)

建立PF文件QGPL/TEST

INSERT INTO QGPL/TEST VALUES('中华人民共和国')

使用QUERY进行模糊查询
SELECT * FROM QGPL/TEST WHERE NAME LIKE '中%‘
系统返回0行纪录

如果要实现对65535字段的模糊查询,必须修改QUERY的写法:
SELECT * FROM QGPL/TEST WHERE HEX(NAME) LIKE SUBST(HEX('中'),1,3)||'%'
返回的结果为
--------中华人民共和国
返回结果正确。

这里充分考虑了在单字节环境下对简体中文的处理过程,即把一个双字节字符(加上0E/0F控制码)当作4个字节来处理,而这些字节包含的数据是无法在单字节环境下正确解析的。所以,必须使用16进制的方式来处理。

如果用户要检索的是“中华“,则检索的条件必须写成:
SELECT * FROM QGPL/TEST WHERE HEX(NAME) LIKE SUBST(HEX('中'),1,5)||'%'

因为0E/0F只出现在双字节字符串的开头和结尾,所以两个汉字需要检索的字符个数是5个。

posted @ 2008-01-09 14:58 深渊野鱼 阅读(112) | 评论 (0) | 编辑
rpgle的source可以retrieve回来吗?
1、在CLP是通过RTVCLSRC这个命令来实现Retrieve CL Source ,前提是在Compile CLP时让Allow RTVCLSRC参数选*YES 。
2、但在RPGLE里头IBM没有提供这样的CL,到目前为止估计也没有现成的工具提供这个Retrieve RPG Source功能。
我们在Compile RPG时,可以有2种编译途径,一是先编译成moudle,然后再转成PGM;另外一种就是直接编译成PGM。
在编译过程中,有时候为了调试程序执行情况,会以Debug方式,然后

通过设置断点来进行跟踪,但自始自终RPG的代码都保存在MOUDLE或PGM里头,无法反编译回来。
而为什么CLP可以,从IBM角度来说他们认为程序的核心部分还是在RPG这块,同时也是出于保护软件厂商产权问题了。。。
posted @ 2008-01-09 14:56 深渊野鱼 阅读(56) | 评论 (0) | 编辑
从一个终端如何跟踪另一终端的画面
从一个终端如何跟踪另一终端的画面
解答 OS/400系统支持从一个显示画面跟踪另一个显示画面的功能,是一个异地协助解决问题的好帮手,方法如下(这里假设两个显示器都已经有用户注册): 1、 在画面跟踪请求端DSPB显示器使用命令STRCPYSCN SRCDEV(DSPA) OUTDEV(DSPB),按执行键后画面处于执行状态,用户需要等待。命令中DSPA为被跟踪的显示器名,DSPB为跟踪请求显示器名。
2、 在被跟踪显示器终端DSPA会收到一条信息提示让用户回答(c或g),用户需要给以相应的回答:g表示允许被跟踪,c表示不允许被跟踪。
3、 得到跟踪允许后,DSPB的画面将变为不可操作,显示内容为被跟踪显示器的画面,但画面要比DSPA晚一屏。
4、 DSPA端可以随时使用ENDCPYSCN命令终止此操作。
posted @ 2008-01-09 14:56 深渊野鱼 阅读(34) | 评论 (0) | 编辑
关于备份的话题SAVOBJ
AS/400 全系统备份需要在专属模式(restrictive state)下及需要在中控台(console)上执行备份指令才能完成,
由于专属模式下,所有的使用者作业及所有子系统均已被停止,
只有系统作业及从中控台进入系统(SignOn)的线上实时作业可以正常执行,
所以我们可以利用中控台上的线上实时作业(interactive job)自动执行全系统备份作业。
做法是:1:从中控台进入系统(SignOn),执行下列的指令,在程序中会从讯息队列 (message queue)中读取讯息,
讯息队列若没有讯息时,程序会等待有讯息时才读取,并判断是否执行全系统备份作业。
2:于排程作业中设定某时间传送讯息至讯息队列,以激活或终止备份作业。
File : QCLSRCMember: FULSAVCType : CLPUsage :
1. 新增讯息队列 SAVSYSMSGQ: Yourlib - 指定您自己的 Library
CRTMSGQ MSGQ(Yourlib/SAVSYSMSGQ) TEXT('Message Queue for Unattended full save')
2. 修改程序中 Yourlib - 指定您自己的 Library 及 console DSP01 --指定您自己的 console 名称
CRTCLPGM FULSAVC CRTCMD CMD(FULSAV) PGM(Yourlib/FULSAVC)
3. 新增自动工作排程传送激活备份讯息 Yourlib - 指定您自己的 Library
此范例指定,此作业于每个星期天 16:55 执行:
ADDJOBSCDE JOB(BIGSAV) CMD(SNDMSG MSG('STRSAVSYS') TOMSGQ(Yourlib/SAVSYSMSGQ))
 FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*SUN) SCDTIME('16:55:00') JOBQ(QGPL/QBASE)
USER(QSECOFR) TEX

T('Send a message to start full system save.')
如果要取消份作业,上述指令 CMD 参数更改如下:
SNDMSG MSG( 'ENDSAVSYS' ) TOMSGQ( Yourlib/SAVSYSMSGQ)
4. 于星期五下班前,从 Console Sign On 进入系统,于命令列输入 FULSAV,系统即进入等待上述激活备份讯息
当每个星期天 16:55 时间到达时,系统会收到讯息判断是否激活备份作业。
附注: 由于资料量及磁带容量与磁带机设备不同,所以有可能需要一卷以上的磁带做备份,若由于设备不足,您还是
要由人工换磁带。使用此范例前,请先测试无问题后,在正式实施。
* ***************************************************************** */
/* * * */
/* * * */
/* * TITLE........: Weekly Savsys & Full Nonsys Save (FULSAVC) * */
/* * * */
/* * * */
/* ***************************************************************** */
/* * * */
/* * To run an unattended SAVSYS, you can add a job scheduler * */
/* * entry as follows: * */
/* * * */
/* * SNDMSG MSG( 'STRSAVSYS' ) TOMSGQ( Yourlib/SAVSYSMSGQ) * */
/* * * */
/* * Specify the date and time you want the message to be sent. * */
/* * You should call this program from the console, and when the * */
/* * job scheduler sends the message the program will continue * */
/* * and perform the SAVSYS & full *NONSYS save followed by IPL. * */
/* * * */
/* * Note that by sending message ENDSAVSYS you can cause this * */
/* * program to end without performing the SAVSYS etc. * */
/* * * */
/* ***************************************************************** */
PGM
/* ***************************************************************** */
/* Declare Program Variables * */
/* ***************************************************************** */
DCL VAR(&MSG) TYPE(*CHAR) LEN(9)
/* Message */
DCL VAR(&JOB) TYPE(*CHAR) LEN(10)
/* This Job */
DCL VAR(&COUNT) TYPE(*DEC) LEN(4 0) VALUE(0)
/* Retry */
/* ***************************************************************** */
/* Main Processing * */
/* ***************************************************************** */
/* Allocate the message queue to this job so it has exclusive ' */
/* use of the message queue so we can receive and remove ' */
/* messages from the queue. If we're unable to obtain the ' */
/* exclusive lock, then another job is using the queue and ' */
/* this job will cancel. ' */
ALCOBJ OBJ((Yourlib/SAVSYSMSGQ *MSGQ *EXCL)) WAIT(0)
MONMSG MSGID(CPF0000) EXEC(SNDPGMMSG MSGID(CPF9897) +
MSGF(QCPFMSG) MSGDTA('Unable to allocate +
SAVSYS message queue.') TOUSR(*SYSOPR) +
MSGTYPE(*ESCAPE))
/* Make sure that we are running on DSP01 (The Console)' */
/* If we're not, this job will end when we do ENDSBS *ALL *IMMED! */
RTVJOBA JOB(&JOB)
IF COND(&JOB *NE 'DSP01 ') THEN(SNDPGMMSG +
MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA('DO +
IT ON THE CORRECT SCREEN YOU MUPPET!!!!') +
MSGTYPE(*ESCAPE

))
/* Remove any old messages from message queue */
RMVMSG MSGQ(Yourlib/SAVSYSMSGQ) CLEAR(*ALL)
/* Change this job's message queues to *Hold so we don't get any. */
CHGJOB LOGCLPGM(*YES) BRKMSG(*NOTIFY)
CHGMSGQ MSGQ(*USRPRF) DLVRY(*HOLD)
MONMSG MSGID(CPF2451)
CHGMSGQ MSGQ(*WRKSTN) DLVRY(*NOTIFY)
/* Receive messages in the queue. WAIT(*MAX) tells the system */
/* to wait for a message forever if no messages are in the */
/* queue. Once the message is received, it will be removed. */
Loop: SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Waiting for somebody to tell me +
to start save of entire system........') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
RCVMSG MSGQ(Yourlib/SAVSYSMSGQ) MSGTYPE(*ANY) +
WAIT(*MAX) RMV(*YES) MSG(&MSG)
CHGJOB STSMSG(*SYSVAL)
/* If the message is neither STRSAVSYS or ENDSAVSYS, ignore */
IF COND((&MSG *NE 'STRSAVSYS') *AND (&MSG *NE +
'ENDSAVSYS')) THEN(GOTO CMDLBL(LOOP))
/* If the message is STRSAVSYS, continue with Saves */
IF COND(&MSG *EQ 'STRSAVSYS') THEN(DO)
/* Send Start of wait Message to Qsysopr */
SNDPGMMSG MSG(SAVSYS starting in 5 mins.) +
TOMSGQ(*SYSOPR)
/* Send message to all users telling them to sign off */
SNDPGMMSG +
MSG(' -
****** The Backups for tonight will start in 5 minutes... +
Please sign off the AS/400 +
Immediately. *******')
TOUSR(*ALLACT)
/* Delay job for next five minutes */
SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Waiting for five minutes while +
users sign off........................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
DLYJOB DLY(300)
CHGJOB STSMSG(*SYSVAL)
/* End all the subsystems */
Loop3: SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Ending all the subsystems.....') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
ENDSBS SBS(*ALL) OPTION(*IMMED)
/* Delay job for next four minutes */
CHGJOB STSMSG(*SYSVAL) SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Waiting for four minutes while +
Subsystems are ended..................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE) DLYJOB DLY(240)
/* Start SAVSYS */
CHGJOB STSMSG(*SYSVAL) SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Saving the system (SAVSYS)... +
......................................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
/* Loop 2 tries to do a savsys. If the system is not yet in */
/* restricted state, a count is incremented, and the program waits */
/* another two minutes and tries again. */
LOOP2: SAVSYS DEV(TAP03) ENDOPT(*LEAVE) OUTPUT(*PRINT) +
CLEAR(*ALL)
MONMSG MSGID(CPF3785) EXEC(DO)
CHGVAR VAR(&COUNT) VALUE(&COUNT + 1)
/* If we have retried 12 times (24 minutes), NYCOMSGR is started and */
/* a message is sent to QSYSOPR to be paged out. The program then */
/* loops to LOOP3 to attempt Endsbs *all *immed again. */
IF COND(&COUNT *GE 12) THEN

(DO)
STRSBS SBSD(NYCOMSGR)
DLYJOB DLY(120)
SNDMSG MSG('The system wont go down on me!!') +
TOUSR(*SYSOPR)
GOTO CMDLBL(LOOP3)
ENDDO
DLYJOB DLY(120)
GOTO CMDLBL(LOOP2)
ENDDO
CHGJOB STSMSG(*SYSVAL)
/* Start SAVLIB *NONSYS */
SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Saving all the user libraries +
(SAVLIB *NONSYS).....................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
SAVLIB LIB(*NONSYS) DEV(TAP03) ENDOPT(*LEAVE) +
CLEAR(*AFTER) ACCPTH(*YES) OUTPUT(*PRINT)
MONMSG MSGID(CPF3777) EXEC(SNDMSG MSG('Not All +
objects Saved On Sunday Night!!!! Look at +
log of job DSP01') TOMSGQ(GSKELTON +
ACUSWORTH JBARRY DCOLAM DSTEER))
CHGJOB STSMSG(*SYSVAL)
/* Start SAVDLO */
SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Saving all Document libraries +
(SAVDLO DLO(*ALL)....................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
SAVDLO DLO(*ALL) FLR(*ANY) DEV(TAP03) +
ENDOPT(*LEAVE) OUTPUT(*PRINT) CLEAR(*AFTER)
CHGJOB STSMSG(*SYSVAL)
/* Start save of all directory objects */
SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Saving all Directory objects (SAV +
OBJ((''/*'')......................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE) SAV DEV('/QSYS.LIB/TAP03.DEVD') OBJ(('/*') +
('/QSYS.LIB' *OMIT) ('/QDLS' *OMIT)) +
OUTPUT(*PRINT) ENDOPT(*UNLOAD) +
UPDHST(*YES) CLEAR(*AFTER)
CHGJOB STSMSG(*SYSVAL)
/* Apply PTFs permanently */
SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Applying PTFs.................... +
..................................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
APYPTF LICPGM(*ALL) APY(*PERM) DELAYED(*YES)
MONMSG MSGID(CPF3660)
CHGJOB STSMSG(*SYSVAL)
/* Power Down the System */
SNDPGMMSG MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +
MSGDTA('Powering down the system......... +
..................................') +
TOPGMQ(*EXT) MSGTYPE(*STATUS)
CHGJOB STSMSG(*NONE)
PWRDWNSYS OPTION(*IMMED) RESTART(*YES)
CHGJOB STSMSG(*SYSVAL)
ENDDO
/* The program would not normally get to this point. If it does, */
/* it is because the message 'ENDSAVSYS' has been received. */
/* The job will now sign off for security. */
SIGNOFF LOG(*LIST)
ENDPGM
/* ***************************************************************** */
posted @ 2008-01-09 14:56 深渊野鱼 阅读(63) | 评论 (0) | 编辑
AS/400 PDM使用中的小技巧
在使用PDM(编程开发管理器)时,会遇到屏幕滚动、字体大小写、修改行序号的步长、全屏显示等一些问题,这里提供一些小技巧。
解答 1.修改屏幕滚动属性。
用PDM打开源文件,按功能键F13(Shift+F1),弹出画面“Change Session Defaults”
在参数Amount to roll位置输入要修改的值,下面列出了所有Amount to roll的参数解释:
H=Half -> 按PgUp或PgDn键后,屏幕滚动半页。

F=Full -> 按PgUp或PgDn键后,屏幕滚动整页。

C=Cursor -> 按PgUp、PgDn键或F19、F20后,屏幕按照光标位置进

行滚动。

D=Data -> 按PgUp、PgDn键或F19、F20后,屏幕按照数据位置进行滚动。

1-999 -> 按PgUp、PgDn键或F19、F20后,屏幕按照选定的具体值进行滚动,例如,若此值为10,则进行翻页时,一次翻10行。

2.修改字体大小写输入方式。
在缺省情况,PDM只可按大写方式输入,但有时要输入小写字符,可以按F13进入“Change Session Defaults”

画面。修改“Uppercase input only”参数为N,即大小写都准许。

3.修改行序号的步长
在“Increment of insert record”位置添入行序号的步长。
例如:
Increment of insert record . . . . . --2.00 --0.01-999.99
如下图所示:修改前的步长为1,修改后的补偿为2。

4.全屏显示
在“Full screen mode” 位置输入“Y”,PDM的编辑画面变成全屏显示。

posted @ 2008-01-09 14:55 深渊野鱼 阅读(83) | 评论 (0) | 编辑
改变用户设备默认对应的打印机
chgdevdsp 设备名
posted @ 2008-01-09 14:54 深渊野鱼 阅读(31) | 评论 (0) | 编辑
控制用户使用spool file的权力
控制用户使用spool file的权力
解答 1、 拥有*SPLCTL权限的用户,可以处理任意outq中的spool file.
2、 spool file owner有权处理自己outq中的所有spool file.
3、 拥有*JOBCTL的用户,outq参数为OPRCTL(*YES),可以处理该outq中的所有spool file.
4、 用户对outq 拥有*read,*add,*dlt的权限,指定outq为AUTCHK(*DTAAUT).
5、 outq指定AUTCHK(*OWNER),则该用户必须是outq的owner.
6、 outq指定为DSPDTA(*YES),用户必须有*READ权限才能使用DSPSPLF,CPYSPLF,SNDNETSPLF等命令。
posted @ 2008-01-09 14:54 深渊野鱼 阅读(42) | 评论 (0) | 编辑
如何理解Library List
library list是AS400的独特的概念,用于在用户登录的时候设置搜索库列表,相当于UNIX和DOS的PATH环境变量。当用户使用对象时不指定所在库名称,则系统在library list指定的库中搜索该对象,找到第一个名称相同的就结束搜索过程,因此各个库在library list中的顺序非常重要。
library list分为system libraries; product libraries; current library; user library四个部分。其中,system libraries可以用QSYSLIBL系统值决定,也可以用CHGSBSD进行修改;user library可以用QUSRLIBL决定,也可以用CHGJOBD进行修改。current Library一般由user profile决定,也可以在sign on时进行指定。而product libraries是在执行CL程序的时候由系统自动引入的,例如在编译RGP程序的时候会自动引入QRPG库等。

posted @ 2008-01-09 14:53 深渊野鱼 阅读(69) | 评论 (0) | 编辑
查看job
用 wrkactjob seq(*cpupct) 查看哪些JOB耗费大量CPU
用 wrkactjob seq(*auxio) 查看哪些JOB大量存取硬盘
要的话先杀掉!
posted @ 2008-01-09 14:52 深渊野鱼 阅读(62) | 评论 (0) | 编辑
OS/400主要的系统作业的用途
当用户使用命令WRKACTJ

OB查看作业运行状态时,经常会发现一些系统作业,但是不清楚这些系统作业有什么用途,本文将对一些主要的系统作业的用途进行介绍。
正文 系统作业是由OS/400创建并控制的,用于控制系统资源并处理系统级的请求。在命令
WRKACTJOB中显示的作业中,系统作业是按照字母排序在所有用户子系统和作业之后的。
系统作业是在系统IPL时初始化的,但是,只要OS/400系统处于活动状态,作业
QWCBTCLNUP和QDCPOBJx也将与之同样保持活动。系统作业不能被用户启动,停止或改变(除了少数系统作业可以用命令CHGSYSJOB来改变,并且唯一可以由该命令改变的属性就是这些系统作业的运行优先级。)

以下就是介绍所有系统作业的详细信息:

-- QALERT - Alert Manager 报警管理
该系统作业使作业能够处理报警,包括处理从其他系统上接收到的报警,本机产生 的报警,并且维护系统的控制。QALERT的作业运行优先级可以用命令CHGSYSJOB改变。该作业在OS/400 R220时就被加入到操作系统中,用于支持报警信息的处理。

-- QCMNARBxx - Communications Arbiters
通讯仲裁器处理的仲裁不仅仅对通讯设备,还包括所有类型的其他设备。处理的工作包含通讯连接,断开,设备锁定,和错误恢复。所有设备相关的工作分散在系统作QCMNARBxx和QSYSARB中。

系统值QCMNARB决定有多少通讯仲裁作业启动。如果QCMNARB设置成*CALC,系统将为每一个处理器启动两个通讯仲裁作业,如果QCMNARB设置成0,该作业将在QSYSARB中运行。QCMNARBxx的作业运行优先级可以用命令CHGSYSJOB改变。在作业QCMNARBxx被加入 OS/400 R420以前,这些工作是在QSYSARB中运行的。

-- QDBSRVXR - Database Cross-Reference 数据库交叉参照
该作业是用于维护QSYS中的文件级的系统交叉参照文件,这些文件中存放着数据库文件的交叉参照信息,并且这些文件是库QSYS中以QADB开头的。首要被维护的文件是文件交叉参照文件QADBXREF,它包含了数据库中每一个物理文件,逻辑文件,DDM文件,ALIAS文件的记录。当一个文件被创建,改变,删除,恢复,更名,或者改变所有权时,作业QDBSRVXR就会被激活。该作业在OS/400 R310被加入操作系统。

-- QDBSRVXR2 - Database Cross-Reference 数据库交叉参照
该作业是用于维护两个字段级的系统交叉参照文件,库QSYS中的QADBIFLD是字段交叉参照文件,库QSYS中的QADBKFLD是键字交叉参照文件。当一个文件被创建,改变,或删除,运行键字相关的工作时,作业QDBSRVXR2就会被激活。QDBSRVXR2由PTF在OS/400 R310时被加入操作系统中。QDBSRVXR2的作业运行优先级可以用命令CHGSYSJOB改变。

-- QDBSRV01 - Database Server 数据库服务器
该作业可以被视为数据库维护任务

的分配器。通常地,当恢复一个包含数据库文件的库时,QDBSRV01将立刻被激活。它的功能包括:
* 发信号给SMAPP(系统管理的访问路径保护机制),告知新的访问路径被恢复,并且由AMAPP来决定是否需要被保护。
* 由于访问路径没有被恢复时,该作业准备需要被重新创建的访问路径的列表。该列表可以用命令EDTRBDAP浏览。

数据库服务器作业的数量是(1+2*CPU数)与(1+2*ASP数)两者中较大的那一个。最少启动的数量是5。QDBSRV01是主要的系统作业,用于分配其他作业工作,剩下的作业,一半是用来处理高优先级的请求,另一半是用来处理低优先级的请求。例如:在一个有4路CPU的系统上,应该有9个 QDBSRVxx作业,由QDBSRV01来分配工作,QDBSRV02-05用来处理高优先级的作业,QDBSRV06-09用来处理低优先级的作业。该作业是在OS/400 R210被加入操作系统的。

-- QDBSRVxx - Database Server (high priority)
这些作业维护系统的日志和提交控制。

-- QDBSRVxx - Database Server (low priority)
这些作业用于维护用户的数据库文件的访问路径。这些作业通常不活动,但是,在特定的条件下,它们被激活用于访问路径的重建。这些被重建的访问路径可以用命令EDTRBDAP浏览。这些作业被激活的原因包括:
* 恢复那些没有保存访问路径的数据库文件;
* 恢复那些没有物理文件的逻辑文件;
* 取消正在运行的命令RGZPFM;
* 由于被破坏而成为无效的索引;
* 加速OS/400安装来完成交叉参照,或者其他DB2升级的动作;
* 验证约束。用命令EDTCPCST可以显示那些正在等待验证的约束。

-- QDCPOBJx - Decompress System Object 系统对象解压缩
这些作业是用于对新安装的操作系统对象进行解压缩的,它们的运行是需要一定的空间的。当剩余您的系统空间低到一定程度,这些作业就会结束。系统对象解压缩作业的数量=CPU数+1。该作业是在OS/400 R210被加入操作系统的。

-- QFILESYS1 - File System 文件系统
该作业用于支持文件系统作业的后台运行,它保证对文件的改动都写入存储介质中,并执行常规的文件系统清除活动。该作业是在OS/400 R210被加入操作系统的。

-- QJOBSCD - Job Schedule 作业调度
该作业控制作业调度功能,并由系统监控作业调度项的计时器和调度的作业。
该作业是在OS/400 R220被加入操作系统的。

-- QLUR - LU 6.2 Resynchronization(LU 6.2 重新同步)
该作业处理两段式提交的重新同步。该作业是在OS/400 R310被加入操作系统的,并作为LU 6.2通讯协议的一部分。

-- QLUS - Logical Unit Services 逻辑单元服务
该作业处理为逻辑单元设备(通讯设备)处理的事件,它还负责将设备定位到正确的通讯子系统中去。QLUS是AS/400上原始的系

统作业之一。

-- QPFRADJ - Performance Adjustment 性能调整
性能调整系统作业管理存储池大小和活动级别的变化。所有要求改变存储池大小的请求都有该作业处理。此外,如果系统值QPFRADJ设为2或3,该作业将动态地改变存储池大小和活动级别,由此提高系统的性能。在OS/400 R430,IPL性能调整(系统值QPFRADJ设为1或2)是由QPFRADJ来处理的,在OS/400 R430前,IPL性能调整由SCPF处理。QPFRADJ是在OS/400 R210被加入操作系统的。

-- QQQTEMP1 and QQQTEMP2 - Database Parallelism 数据库并行
该作业用于实现多个DB2系统的数据库同步功能。如果用户对分布式文件进行查询,该作业可以通过执行并行处理从而达到加快处理速度的目的。是在OS/400 R370作为DB2多系统支持功能被加入操作系统的。

-- QSPLMAINT - System Spool Maintenance 假脱机管理
该作业实现维护系统假脱机的功能。

-- QSYSARB - System Arbiter 系统仲裁
系统仲裁提供运行高优先权功能的环境,它处理系统资源并保持对系统状态的追踪。QSYSARB是操作系统核心作业。系统仲裁负责系统一级的,需要立即处理和能更有效地被一个作业处理的任务,系统仲裁还负责处理通讯请求,设备锁定,线/控制器/设备的配置。系统仲裁是OS/400最原始的作业之一。

-- QSYSCOMM1 - System Communications 系统通讯
该作业处理系统通讯和I/O。QSYSCOMM1的作业优先权可以用命令CHGSYSJOB改变,它是在OS/400 R320中被加入操作系统的。

-- QWCBTCLNUP - Job Table Cleanup 作业表清空
QWCBTCLNUP 是用于在IPL过程中确保作业结构可以被使用。通常在IPL结束时,该作业也结束处理了,但是,如果有许多作业结构需要清除,它可以在IPL结束后继续运行。该系统作业在处理完成后就结束了。QWCBTCLNUP是在OS/400 R210中当作业表的清除从SCPF中被移走后加入系统的。

-- Q400FILSVR - Remote File System Communications 远程文件系统通讯
该作业处理远程文件系统APPN/APPC的通用编程接口通讯。Q400FILSVR是在OS/400
R360中作为远程文件支持被加入操作系统的。

-- SCPF - Start Control Program Function 启动控制程序功能
该作业是操作系统IPL是的中心处理任务,提供启动OS/400的环境和所直接需要的功能。SCPF启动所有其他系统作业(除了QLUS),并将系统带入可用状态。SCPF是OS/400最原始的作业之一。

posted @ 2008-01-09 14:52 深渊野鱼 阅读(96) | 评论 (0) | 编辑
如何确定哪一个作业锁定QDLS下的一个目标
如何确定哪一个作业锁定QDLS下的一个目标
解答 1、使用命令DSPDLONAM DLO(flrobjname) FLR(flrdirname),此命令可以显示出FOLDER中的目标对应的系统 目标的名称。

2、使用命令WRKOBJLCK OBJ(QDOC/sysobjname) OBJTYPE(*DOC),其中,sysobjname为上一条命令

相关文档