深渊野鱼

Blog主题:.net 访问as400 iSeries方案,iSeries编译工具,db2/400性能优化,Oracle胡乱入门
心 态 :不怨天,不尤人,如果我过得不开心,肯定有原因。好心态第一 原 则 :做一个让别人尊敬的中国人
posts - 234, comments - 56, trackbacks - 0, articles - 0

2008年1月9日

因为一个客户要把虚拟主机转成另外一种类型 ,结果需要转移服务器,迁移到另外一台机器,log4net死活生成不了日志,并且sqlite的写入一直是失败的。后来查了下,肯定是权限缺失。比如asp.net无法写入,后来让虚拟主机的技术支持把权限设置成完全,才彻底搞定。不过他们公司有一台服务器死活就是不行,这个也够汗的,或许那台服务器死活就是要和我作对。。。

另外不晓得为什么公司服务器最近权限更改后,log4net日志怎么都没法子写入.........

posted @ 2008-08-07 15:22 深渊野鱼 阅读(7) | 评论 (0)编辑

这几天新装的系统,把一应齐全都给装了,norton 360safe U盾 开发软件,还有一堆乱七八糟的软件。
貌似没有问题的情况下,做了一个ghost.
没想到这两天,发现输入东西的时候,当前窗口的焦点老是丢失,哇咔咔,以前曾经碰到问题是由于杀毒软件引起的,
于是乎决定试着把罪怪到norton.不料删除的时候,建欣说他好像也遇见过,似乎是一个叫hhukcert的进程引起的,于是咔嚓了那个进程,没问题了。5555,norton已经没法子停止删除。哎,只能再次装了,再次更新病毒库。消耗了一个小时。
这个罪魁祸首的hhukcert就是工行U盾的华虹的驱动带的,想起来一个堂堂的中国工行下的人做出来的程序居然没测试通过就发布,极大的损害了我们对工行的信任。
于是乎,系统重启后,把hhukcert的服务给关了,下次要用U盾的时候再打开即可~~。
工商银行做出来也不保障,失败啊,失败啊。

posted @ 2008-07-22 22:32 深渊野鱼 阅读(86) | 评论 (0)编辑

iframe是一个一个的打开
有时候客户有不同的要求,就必须得用iframe
但是iframe的打开速度实在是那个慢啊,后来搜搜搜,终于发现终极之道-javascipt在body 的onload的时候指定frame的location,发现速度快的不是一般的多.
for example:
 1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2<html xmlns="http://www.w3.org/1999/xhtml">
 3<head>  
 4  <script language="javascript" type="text/javascript">
 5        function bodyLoad()
 6        {
 7            mp3.location ="mp3.htm";
 8            myblog.location ="Default.aspx";
 9        }

10    
11    </script>
12
13</head>
14<body onload="bodyLoad();">
15    <iframe border="0" name="mp3" scrolling="no" marginwidth="0" framespacing="0" marginheight="0"
16        frameborder="0" noresize width="100%" height="77px" vspale="0" allowtransparency>
17    </iframe>
18    <iframe border="0" name="myblog" scrolling="no" marginwidth="0" framespacing="0"
19        marginheight="0" frameborder="0" noresize width="100%" height="1200" vspale="0"
20        allowtransparency></iframe>
21</body>
22</html>

posted @ 2008-05-06 14:48 深渊野鱼 阅读(93) | 评论 (1)编辑

 如何向远程系统提交命令?
解答 我们知道,在分布式数据处理的环境下,对远程系统上文件内容的操作可以有很多方式,但是如果想简单地在本地对远程系统进行文件管理方面的操作,则可以由一条命令实现: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 深渊野鱼 阅读(100) | 评论 (0)编辑

 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使用英文Win98,并且不需要用户和口令。

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 深渊野鱼 阅读(133) | 评论 (0)编辑

 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 深渊野鱼 阅读(104) | 评论 (0)编辑

编辑---键盘---自定义
          定制---点C--功能:编辑复制 --〉到CTRL
               点V--功能:编辑粘贴 --〉到CTRL
保存,然后指定键盘的方式

posted @ 2008-01-09 15:07 深渊野鱼 阅读(87) | 评论 (0)编辑

 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在运行的时候属于哪个ActiveGroup。如果指定*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 深渊野鱼 阅读(75) | 评论 (0)编辑

 用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 require 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 深渊野鱼 阅读(129) | 评论 (0)编辑

 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 深渊野鱼 阅读(116) | 评论 (0)编辑

 用户经常发送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_REVERSE 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 深渊野鱼 阅读(114) | 评论 (0)编辑

 如何将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 深渊野鱼 阅读(128) | 评论 (0)编辑

 从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 深渊野鱼 阅读(84) | 评论 (0)编辑

 命令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 深渊野鱼 阅读(67) | 评论 (0)编辑

STRJRNPF FILE(OBJECT/OBJ LIBRARY) JRN(JOURNAL LIBRARY /JOURNAL FILE)

posted @ 2008-01-09 15:02 深渊野鱼 阅读(28) | 评论 (0)编辑

1。首先用户必须具备
 WRKDIR的权限
授权方法: wrkdir 添加该用户
2. 目录授权
WRKFLR
F6=新怎目录  注意:要对每一层的目录进行对该用户的授权,一般是*ALL

posted @ 2008-01-09 15:01 深渊野鱼 阅读(27) | 评论 (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为描述文件);
另一种方法:
将UNDEL.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 深渊野鱼 阅读(213) | 评论 (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://testcase.software.ibm.com/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 深渊野鱼 阅读(60) | 评论 (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 深渊野鱼 阅读(37) | 评论 (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 深渊野鱼 阅读(41) | 评论 (0)编辑

 在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 深渊野鱼 阅读(84) | 评论 (0)编辑

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 深渊野鱼 阅读(32) | 评论 (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 深渊野鱼 阅读(29) | 评论 (0)编辑

 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) TEXT('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 深渊野鱼 阅读(48) | 评论 (0)编辑

在使用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 深渊野鱼 阅读(51) | 评论 (0)编辑

chgdevdsp 设备名

posted @ 2008-01-09 14:54 深渊野鱼 阅读(23) | 评论 (0)编辑

控制用户使用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 深渊野鱼 阅读(24) | 评论 (0)编辑

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 深渊野鱼 阅读(50) | 评论 (0)编辑

用 wrkactjob seq(*cpupct) 查看哪些JOB耗费大量CPU
用 wrkactjob seq(*auxio) 查看哪些JOB大量存取硬盘
要的话先杀掉!

posted @ 2008-01-09 14:52 深渊野鱼 阅读(39) | 评论 (0)编辑

当用户使用命令WRKACTJOB查看作业运行状态时,经常会发现一些系统作业,但是不清楚这些系统作业有什么用途,本文将对一些主要的系统作业的用途进行介绍。
正文 系统作业是由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 深渊野鱼 阅读(65) | 评论 (0)编辑

如何确定哪一个作业锁定QDLS下的一个目标
解答 1、使用命令DSPDLONAM DLO(flrobjname) FLR(flrdirname),此命令可以显示出FOLDER中的目标对应的系统 目标的名称。


2、使用命令WRKOBJLCK OBJ(QDOC/sysobjname) OBJTYPE(*DOC),其中,sysobjname为上一条命令输出 结果中的System object name值。

posted @ 2008-01-09 14:51 深渊野鱼 阅读(18) | 评论 (0)编辑

大多数情况下,系统管理员键入WRKACTJOB命令后,直接回车,而没有去尝试该命令提供的一些有用功能。

-----------------------------------------------------------------------
----------------------Work with Active Jobs ------------------S102xxxx
-----------------------------------------------------11/30/03 13:24:38
CPU %: .3 ---Elapsed time: 00:13:10 ---Active jobs: 116

Type options, press Enter.
2=Change 3=Hold 4=End 5=Work with 6=Release 7=Display message
8=Work with spooled files 13=Disconnect ...

Opt Subsystem/Job -User ---Type --CPU % -Function ------Status
QBATCH ------------QSYS ---SBS --- .0 ----------------- DEQW
QCMN --------------QSYS ---SBS --- .0 ------------------DEQW
QCTL --------------QSYS ---SBS --- .0 ------------------DEQW
QSYSSCD -----------QPGMR --BCH --- .0 ---PGM-QEZSCNEP --EVTW
QINTER ------------QSYS ---SBS --- .0 ------------------DEQW
QPADEV000F --------test ---INT --- .1 ---CMD-WRKACTJOB -RUN
QSERVER -----------QSYS ---SBS --- .0 ------------------DEQW
QPWFSERVSD ------- QUSER --BCH --- .0 ------------------SELW
QSERVER -----------QPGMR --ASJ --- .0 ------------------EVTW
More...
Parameters or command
===>
F3=Exit F5=Refresh F7=Find F10=Restart statistics
F11=Display elapsed data F12=Cancel F23=More options F24=More keys
---------------------------------------------------------------------

在WRKACTJOB命令输出界面:
1、自动排序:
缺省情况,输出结果按子系统来排序,用户可以将光标移到其它列上,然后按PF16,则输出就根据该列来排序。
例,将光标移到CPU%下,按PF16,则输出作业的信息将按CPU的使用情况来排序。
同时,在WRKACTJOB命令行参数SEQ(Sequence),可以指定输出的排序标准:
例如:
*SBS -- 按子系统
*AUXIO -- 硬盘I/O量
*CPU -- CPU使用时间
*CPUPCT -- CPU使用率百分比
*USER -- 用户名
等...


2、强大的PF功能键
使用PF24,用户可以发现,WRKACTJOB提供一些有用的PF功能:

例,PF7 用于发现含某些字符的作业
---------------------------------------------------------------------
Find a string

String . . . . . . . . SHANJD
Column . . . . . . . . *USER ---*SBS, *JOB, *USER, *NUMBER,
--------------------------------*TYPE, *STS, *FUNCTION, *PTY
--------------------------------*POOL


F8=Repeat find F12=Cancel F17=Top F18=Bottom
----------------------------------------------------------------------

PF20 用于只列出符合条件的作业:
----------------------------------------------------------------------- ------------------------Subset Active Jobs

Type choices, press Enter.
Sequence . . . . . . . . *SBS --------F4 for list
Job name . . . . . . . . *ALL --------Name, *ALL, *SYS, *SBS
CPU percent limit . . . . *NONE ------.1-99.9, *NONE
Response time limit . . . *NONE ------.1-999.9, *NONE
Subsystems
*ALL

------------------------------------------------------------------------

posted @ 2008-01-09 14:50 深渊野鱼 阅读(79) | 评论 (0)编辑

备份JOB SCHEDULE ENTRY的简单方法
解答 用WRKJOBSCDE命令看到的各条ENTRY存放在QUSRSYS/QDFTJOBSCD中,
所以可以备份此目标:SAVOBJ OBJ(QDFTJOBSCD) LIB(QUSRSYS) OBJTYPE(*JOBSCD) DEV(TAPxx)。

posted @ 2008-01-09 14:50 深渊野鱼 阅读(24) | 评论 (0)编辑

如何从PC 传送 SAVF 到AS/400
解答 在Windows中启动DOS窗口:

1. FTP AS400-IP 地址
2. 输入用户名, 回车, 再输入口令.
3. CD /qsys.lib/***.lib, *** 为AS/400 存放SAVF库名.
4. LCD PC 机本地存放SAVF的目录
5. BIN
6. QUOTE SITE NA 1
7. PUT pcSAVF.savf asSAVF.savf , 其中: pcSAVF 为 PC 中SAVF 文件名;asSAVF 为AS/400中文件名.
8. QUIT

posted @ 2008-01-09 14:47 深渊野鱼 阅读(24) | 评论 (0)编辑

如何使用CA/400批处理的方式传输数据
解答 用户可以用CA/400的数据传输功能交互式地在PC与AS/400之间传输数据,但对于频繁执行的数据传输,交互式的方式会带来不方便,而用批处理的方 式只要在DOS命令行执行一条命令即可,方法如下: 1、首先要产生一个传输请求,用户若熟练请求文件的格式可以直接用编辑工具产生一个请求文件:.TTO(下传请求)或.TFR(上传请求)。另有一简单方 法可以帮助对请求文件格式不熟的用户,即先用交互式方式产生一个请求并用FILE菜单中的SAVE AS存盘。

2、若从AS/400传输数据到PC,在DOS命令行使用RTOPCB requester.TTO;若从PC传输数据到AS/400,使用RFROMPCB requester.TFR;命令中reqester为请求文件名。

3、RTOPCB.EXE及RFROMPCB.EXE在CA/400的安装目录下,用户可以根据需要拷贝到其它的目录下执行。

4、RTOPCB / RFROMPCB 命令可跟多个 .TTO / .TFR 文件, 从而一次实现多个传输请求。

posted @ 2008-01-09 14:47 深渊野鱼 阅读(55) | 评论 (0)编辑

FBIUSRBLDL1UF E K DISK rename(BIUSRR:ByModel) Prefix(Z)

posted @ 2008-01-09 14:46 深渊野鱼 阅读(10) | 评论 (0)编辑

C*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
/free

// Loop through all records of file
read file;

dow not %eof(file); // Process until end of file
if %error;
dsply 'Read error: process aborting.';
leave;
else;
pos = %scan (',': name);
if pos > 0;
firstname = %trimr(%subst(name:1:pos-1));
update file;
endif;
read file;
enddo;

/end-free
C*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

posted @ 2008-01-09 14:46 深渊野鱼 阅读(21) | 评论 (0)编辑

C*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
C* $DispSFL01 - Survey Type LookUp
C*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
C $DispSFL01 begsr
C*
C exsr $ClearSFL01
C exsr $LoadSFL01
C exsr $CLRMSG
C*
C dow @Scrn01 = 'Y'
C*
C write SUB01FKEY
C write MSGCTL 99
C exfmt SUB01CTL
C*
C if CURREC <> *zeros
C eval RRn01 = CURREC
C eval ScRRn01 = CURREC
C endif
C*
C eval SavScRRn01 = 1
C if ScRRn01 > 0
C eval SavScRRn01 = ScRRn01
C endif
C*
C exsr $CLRMSG
C*
C select
C*
C* F3 pressed end the program
C*
C when *in03 = *on
C eval @Scrn01 = 'N'
C*
C* F6=Add
C*
C when *in06 = *on
C eval ChangedRecord = 'Y'
C eval ScreenMode = 'ADD'
C exsr $Screen01
*
* F12=Return
*
C when *in12 = *on
C eval @Scrn01 = 'N'
*
* other
*
C other
C if RRn01 > 0
C exsr $Process01
C endif
*
C endsl
*
C if ChangedRecord = 'Y' and ScreenError = 'N'
C exsr $ClearSFL01
C exsr $LoadSFL01
C eval ScreenError = 'N'
C eval ChangedRecord = 'N'
C eval ScRRn01 = SavScRRn01
C endif
*
C enddo
*
C endsr
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

posted @ 2008-01-09 14:44 深渊野鱼 阅读(20) | 评论 (0)编辑

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
H DftActGrp(*No) Option(*SrcStmt : *NoDebugIO)
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* Program Name:
* Description :
* Date Written:
* Modification:
* ~~~~~~
*
*
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
FINBOX if e k disk prefix(x)
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*
* Program Information
* ~~~~~~~~~~
D @PgmInfo sds
D @PgmNam 1 10
D @Parms 37 39 0
D @MsgId 40 46
D @MsgDta 91 170
D @JobNam 244 253
D @UserId 254 263
D @JobNum 264 269 0
*
* Constants
* ~~~~~
D UpperCase C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
D LowerCase C 'abcdefghijklmnopqrstuvwxyz'
*
* Define Variables
* ~~~~~~~~
D XMLField s 1000 inz(*blanks)
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
* M A I N L I N E
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*
C eval *inlr = *on
C return
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
*
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
C *inzsr begsr
*
C read INBOX
C dow not %eof(INBOX)
*
C eval XMLField = %xlate(LowerCase : UpperCase :
C %trim(xSRCDTA))
*
C read INBOX
C enddo
*
C endsr

posted @ 2008-01-09 14:44 深渊野鱼 阅读(32) | 评论 (0)编辑

*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* $GetComNam - Get Company Information
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
P$GetComNam b
D $GetComNam pi 30a
D LenStr s 3 0 inz(0)
D ComNum s 3 0 inz(1)
D ComNam s 30 inz(*blanks)
D TmpComNam s 30 inz(*blanks)
*
C if not %open(CCFILEL)
C open CCFILEL
C endif
*
C eval ComNum = 001.
C ComNum Chain CCFILEL
C if %found(CCFILEL)
C eval TmpComNam = %trim(CCCONM)
C endif
*
C if %open(CCFILEL)
C close CCFILEL
C endif
*
C eval LenStr = ((%len(TmpComNam) -
C %len(%trim(TmpComNam))) / 2) + 1
C eval %subst(ComNam:LenStr) = %trim(TmpComNam)
*
C return ComNam
*
P$GetComNam e

posted @ 2008-01-09 14:44 深渊野鱼 阅读(7) | 评论 (0)编辑

设程序 PgmA 有参数 Parm1, Parm2:

1)parm1(7S 0) = 276,parm2(7S 2) = 15.73

传递方式:CALL PGMA PARM('0000276' '0001573')

2)parm1(7S 0) = -276,parm2(6S 2) = -15.73

传递方式:CALL PGMA PARM('-000276' '-01573')

3)parm1(7P 0) = 276, parm2(7P 2) = 15.73

传递方式:CALL PGMA PARM( X'0000276F' X'0001573F')

4)parm1(6P 0) = 276 , parm2(6P 2)=15.73

传递方式:CALL PGMA PARM( X'F000276F' X'F001573F')

5)parm1(7P 0) = -276 , parm2(6P 2)=-15.73

传递方式:CALL PGMA PARM( X'0000276B' X'F001573B')

总结:

对于S类型的参数,只要按照字符串的形式,在没有数字的位置补0,不用输入小数点,就可以得到正确的结果,如果是负数,在第一位输入负号 - 即可,但是会占用一个数字位,7位的负数就只能输入6位数字了。

对 于P类型的参数,数字部分按照S类型的一样输入,还需要在字符串前加 X,并且如果长度为奇数,需要给字符串加 F 后缀,如果长度为偶数,需要在字符串的前后都加 F。如果是负数的,需要把字符串后面的F变为B。(X表示按16进制取值,由于P类型的数据存储方式是半个字节存储一个数字,所以需要在前后加其它的字母 补齐空位。)

posted @ 2008-01-09 14:43 深渊野鱼 阅读(22) | 评论 (0)编辑

*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* $LoadSFL01 - Load subfile display
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
C $LoadSFL01 begsr
*
C eval S01CNAM = CompName
C eval S01CDAY = $GetDoW(%date())
*
C if SavRRn01 > *zeros
C eval RRn01 = SavRRn01
C eval ScRRn01 = SavRRn01
C endif
C eval ScRRn01 = (SavRRn01 + 1)
*
* Load the subfile fields
*
C *start setll MONITORL2
C read MONITORL2 89
C dow not %eof(MONITORL2)
*
C reset SUB01
C eval S01SPLF = SFILE
C eval S01UDTA = SUSERDATA
C eval S01HTML = HTML
C eval S01PDF = PDF
C eval S01JNAM = SJOB
*
C eval RRn01 = (RRn01 + 1)
C write SUB01
*
C read MONITORL2 89
C enddo
*
C if RRn01 = 0
C eval RRn01 = 1
C eval *in50 = *off
C endif
C if RRn01 > 0 and *in89 = *on
C eval ScRRn01 = (SavRRn01 + 1)
C endif
C eval SavRRn01 = RRn01
*
C endsr
*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

posted @ 2008-01-09 14:42 深渊野鱼 阅读(31) | 评论 (0)编辑

在这些表表达式的用途当中,有些您可能是熟悉的,而有些可能就不熟悉了。我将分别讨论表表达式每种用途的实例,以展示其强大性。

我应邀在全球范围内宣传 SQL 技巧。我相信您将至少学到表表达式的一种用法,而您所学到的东西将对您的应用产生一定的影响,所以还请继续读下去。

预过滤全外连接


最近几年来,随着工作文件的移除和并行性的加入,全外连接在性能方面已得到了增强。然而,其语法并没有得到像左连接和右连接所得到的那样的魔力,
例如自动谓语下推和谓语传递闭包。图 1 中所显示的全外连接没有产生预期的结果,例如,给出在指定日期范围内的所有订单,
不管这些订单是否具有少于 40 个字符的描述,以及给出所有少于 40 个字符的描述,而不管是否有与之对应的订单:

图 1. 该语句不会产生预期的结果

SELECT    COALESCE(O.ORDER_NO, 'Order Number not Available')
      , COALESCE(D.DESC, 'Description not Available')
FROM    ORDER O
FULL JOIN
   DESCRIPTIONS D
ON   O.ORDER_NO = D.ORDER_NO
WHERE    O.ORDER_DATE BETWEEN '1999-01-01' AND CURRENT DATE
AND   LENGTH(D.DESC < 40)

相反,以上 SQL 的结果看上去像是一个内连接(inner join),因为 图 1 中所使用的语法迫使局部过滤在第二阶段才应用 —— 换句话说,是在连接 之后 才应用。
这意味着很多将要参与连接操作的行其实在后面的阶段就要被删除。为了强制性地在连接(第一阶段)之前 应用局部过滤,可以使用表表达式,如 图 2 中所示。

图 2. 在连接之前强制执行过滤,以获得正确结果

SELECT