AS400 中系统安全性(五篇模版)

时间:2019-05-12 04:18:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《AS400 中系统安全性》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《AS400 中系统安全性》。

第一篇:AS400 中系统安全性

系统安全性系统安全性是由操作系统提供的一系列保护措施。使系统管理员能够保护和控制系统设备、数据、程序等资源的使用,并且能够防止偶然事故或者蓄意破坏的发生。系统安全性的基本内容包括: • 物理安全性 • 安全级别 • 用户特征文件(User Profile)• 用户级别 • 联机安全(Sign On)• 资源安全

第二篇:第九章,系统安全性

第九章 系统安全性

1.信息资源的安全包括数据机密性,数据完整性,系统可用性三个方面。

2.对称加密算法的优点是加密速度快,而飞对称加密算法的优点则是秘钥管理简单。

3.为了防止口令被攻击者猜出,用户设置的口令必须足够长,而系统则应严格限制用户输入不正确口令的次数。

4.为了实现发送者A 和接受者B之间的保密数字签名,发送者 A对要发送的信息可先用A的私用密钥,再用B的公开密钥进行加密之后再进行发送,而接受者在收到信息后,则先用B的私用密钥,再用A的公开密钥进行数据解密。

5.目前,利用公开密钥进行身份认证的工业标准是SSL协议。在利用该协议时,通信双方必须先申请数字证书,并在通信之前通过其握手协议完成身份认证,协商加密算法和密钥。

6.不少系统中,在文件的FCB中存放有该文件的存取控制信息,这种方法其实是用访问控制表来实现访问控制矩阵的。

7.计算机病毒的主要特征是寄生性,传染性,隐蔽性和破坏性。

8.对计算机病毒的检测有多种方法,其中基于病毒数据库的病毒检测法主要是通过对可执行文件与数据库中的病毒样本的比较来进行的;基于文件改变的病毒检测法则主要是通过检查文件的长度或者文件的修改日期和时间进行判断;而完整性检测法则是通过校验和的检查进行的。

第三篇:中国网上银行系统安全性分析

中国网上银行系统安全性分析

前言:本文是对于一般性质的网上银行系统安全性的技术分析文章,对于目前中国国内具体银行的安全性不具有评测功能,也不对任何第三方评测数据负责。以下是正文。

网络银行是一个比较新的概念,中国的网络银行大多是对现有银行专用网的延伸和对银行传统业务方式的补充,银行增加一些软、硬件设备,使得用户可以通过家用电脑连接银行系统,进行各种普通的银行业务,以弥补传统银行业务中营业网点少和营业时间短的不足。中国的网上银行起步比较早的是深圳招商银行,他们开发过第一个面向最终用户的网银系统。招行的网络银行有大众版和专业版之分。随着网络的大规模普及,中国各个银行也都逐步开启自己的网银系统,有些银行的系统仅局限在账户信息查询方面,有些则包含转账付款等功能,还有的已经涉及贷款、投资等方面的内容。随着网银的普及,网银的安全性成为整个系统中最为至关重要的部分了。

今年以来,大量的关于网上银行发生骗盗的报道不断见诸报端。不法分子通过窃取用户的卡号和密码,大量盗窃资金和冒用消费,因此虽然网银对于银行和用户都有不少好处,但是发生这些情况使得银行在推广网银面临非常巨大的风险,提高网银的安全性也是刻不容缓。

根据一般的报道分析,不法分子窃取用户信息主要通过木马程序来进行,比如,黑客首先在用户电脑系统注入木马程序后,驻留在中招电脑系统里的监控系统就可以截取、监控系统及用户上网时打开的网银密码窗口。也就是说当用户在网银程序里输入卡号或密码时计算机就会自动将相关信息的编码发送给黑客,他们再据此进行反读取以破译,钱便被黑走了。目前的网银系统的主要问题是,用户安全性过于依赖用户本身的素质,对于安全观念较差的用户,其密码很容易被盗取,因此这种“信任用户”的安全模式设计是很不合理的。用户的电脑可能安装木马程序,用户的一举一动都可能被监听和窃取,安全的网银系统应该设计成为这样的:假设网银的管理员是黑客,并在最终用户电脑安装木马并且可以监听用户的一切键盘鼠标操作,网银的管理员还可以进行系统管理和操作,但是网银的管理员依旧无法通过网银系统来窃取最终用户的资金。如果能做到这一点,那么这个网银系统就算是比较安全了。

明天,我将继续介绍,这样的网银系统安全性是如何实现,从那些方面可以保证系统的安全性,以及这样的系统存在什么样的漏洞。

第四篇:RPG AS400程序员培训手册6

CL、CMD

其实有关这一章,以及屏幕文件的,在网上已经有很多人写过了,想了想,还是说一下吧。

5.1 CL 程序

5.1.1 基本认识

简单的理解,CL 程序就是和RPG 相对应的,是控制语言(Control Language)。类型为

CLP、CLLE 的源代码编译出来的程序,都属于CL 程序。

可能还是不够直观,这么说吧,我们在交互式命令行上输入的命令,用程序的方式来执

行,这个执行的程序,就是CL 程序。

学过UNIX 的会比较好懂,CL 程序有点类似于SHELL,不过SHELL 是可以直接执行的,而且不用编译;CL 程序需要编译,而且要用CALL 的方式来执行。不过原理是接近的,都是在程序中直接调用命令行的语句。

所以说,CL 程序其实很好写,只要会输入命令,就可以写CL 程序了。在编辑CL 程

序时,也可以用“命令 + F4”的方式来写,不需要老老实实的整行输入。

CL 程序不像RPGLE 程序,在编写时,可以使用自由格式书写;一行的内容如果太长

要,在最末尾处用“+”表示换行

举个最简单的例子,比如说新建个名为FHS01CL 的CLP 源程序,代码如下:

PGM

WRKACTJOB

ENDPGM

编译此程序,然后CALL 之,系统就会执行命令WRKACTJOB,查看当前的活动作业,效果与在交互式命令行下输入WRKACTJOB 是一样的。

当我们输入F12,退出WRKACTJOB 时,系统就会继续向下执行,发现是ENDPGM,表示程序结束了,于是判定执行完毕,退出至交互式画面。

5.1.2 CL 程序的常用语法及命令:

一、程序的开始与结束:

PGM PARM(&A &B)/* 开始CL 程序 */

ENDPGM /* 结束CL 程序 */

CL 程序,和RPGLE 程序一样,也可以有程序的入口参数,而且程序的入口参数

都是可传递的(也就是输入的参数如果在程序中被修改过,那么原调用的程序中的相应

参数也会进行变化。不过CL 的入口参数只能为字符型,或数字型的单个字段,不能象

RPGLE 程序中那么多样化(字段、结构、数组、指针)。

如果CL 程序没有入口参数时,那么就可以不需要后面的PARM 语句,直接写成PGM

即可。

写CL 程序时,不妨多使用F4,看看系统的帮助,这样就不用记那么多命令的参

数名。

二、变量及其定义

CL程序中的所有变量,都使用&做为前缀,这一点与RPGLE 程序不同。比如说

PGM PARM(&A &B)

就表示入口参数为A、B 这两个变量

在CL 程序中使用到的变量,都必须使用DCL 语句来定义:

DCL VAR(&FLD01)TYPE(*CHAR)LEN(10)

DCL VAR(&FLD02)TYPE(*DEC)LEN(10 2)

上述语句表示:

定义变量FLD01,10 位长的字符型变量

定义变量FLD02,10 长,其中2 位小数的数字型变量

除了字符、数字之外,CL 程序还可以定义逻辑变量(*LGL),逻辑变量允许的值只

能为’1’或’0’。不过通常有字符与数字也就够了。CL 程序的主要功能在于进行命令处理,而不是处理字符串以及数据库

三、CL 常用命令:

CHGVAR--变量赋值

CHGVAR VAR(&FLD01)VALUE(‘ABCD’)

即是将变量FLD01 赋值成为’ABCD’(左对齐),同理,VALUE 的括号中也可

以填写一个变量,即表示将此变量的值赋值到变量FLD01 中。

数字型变量的赋值同样也是使用CHGVAR 语句。

当变量中只包含数字时(0—9),数字型变量与字符型变量可以使用CHGVAR

语句进行转换,这一点与RPGLE 中的MOVE 语句比较类似。

IF--条件判断语句

IF COND(&FLD01 *EQ '1')THEN(CHGVAR VAR(&FLD02)+

VALUE('0'))

当变量FLD01 等于’1’时,将变量FLD02 中的值更改为’0’

THEN 后面,即是当符合条件时,要执行的命令。写起来其实没有看上去那么

复杂,多用F4 就会发现CL 程序写简单。

就比如上例,先写IF,然后按F4,在Condition 处填写条件语句,然后在

Command 处填上CHGVAR,再按F4,再去填相应的处理语句,这样写,就比直

接把整句抄下来就简单多了。

上面这种写法,只能在符合条件时,执行一条CL 语句;如果要执行多条,就

必须写做:

IF COND(&FLD01 *EQ '1')THEN(DO)

CHGVAR VAR(&FLD02)VALUE(‘0’)

其它执行语句

ENDDO 也就是THEN 后面,用DO,表示接下来的语句都是在这个IF 条件成立时才

执行(DO)的。

然后结束处用ENDDO,必须要有。ENDDO 在这里和循环没有任何关系,表

示的是ENDIF 的意思,但是CL 语句里没有ENDIF,只有ENDDO。

IF 语句中,表示判断的关键字与RPGLE 中的Ifxx 操作码类似,有

*EQ *GT *LT *GE *LE *NE

用来表示逻辑关系的关键字有

*AND, *OR, *NOT

GOTO--跳转语句

GOTO 语句与RPGLE 中的GOTO 是一样的,都是跳转的意思。

FHSTAG:

GOTO CMDLBL(FHSTAG)

注意,这里定义标签是用“:” 冒号

MONMSG--监控错误信息

我们使用CL 语句时,执行的命令可能会报出一些异常错误,从而导致整个程

序中断,需要手工干预。MONMSG 命令可以监控我们预定的错误信息,使CL 程

序正常的向下运行。举例而言,如果CL 程序中有如下语句:

CALL PGM(FHS01R)

MONMSG MSGID(CPF4131)

则表示当系统调用程序FHS01R 时,如果发现有CPF4131(声明的文件重新编

译过,但程序未重新编译)的错,那么CL 程序将不会异常中断,仅仅只是不运行

程序FHS01R,然后继续向下执行CL 程序

MONMSG 还可以用于在监控到错误信息之后,进行处理,如下:

CALL PGM(FHS01R)MONMSG MSGID(CPF4131)EXEC(CHGVAR VAR(&FLD01)+

VALUE('0'))

这句话就表示当发现有CPF4131 的错误之时,将变量FLD01 赋值成为’0’

如果要执行多句的话,和IF 语句的方法类似,也是使用DO 与ENDDO

MONMSG MSGID(CPF4131)EXEC(DO)

CHGVAR VAR(&FLD01)VALUE(‘0’)

其它处理语句

ENDDO

5.1.3 不常用的语法

%SST--取字符串

CHGVAR VAR(&FLD01)VALUE(%SST(&FLD02 3 1))

表示将字符变量FLD02,从第3 位开始,取1 位,左对齐赋值到变量FLD01 中。

%SST 的括号的参数中,第一个参数必须为字符型变量,第二个参数表示起始位,第三个参数表示要截取的长度。

*CAT--拼字符串

DCL VAR(&FLD01)TYPE(*CHAR)LEN(10)

CHGVAR VAR(&FLD01)VALUE('A' *CAT 'B')

即表示将10 位长的字符型变量赋值成为’AB ‘

‘A’,‘B’,也可以使用变量,如

CHGVAR VAR(&FLD01)VALUE(&FLD02 *CAT &FLD03)

要注意,*CAT 不能去掉字符串末尾的空,从效果上来看,有点类似于RPGLE 中的EVAL 操作码,而不是CAT 操作码

+、-、*、/--数学运算

数字型变量,可以进行数学运算 CHGVAR VAR(&FLD01)VALUE(&FLD01 + &FLD02)

即等同于RPGLE 程序中的 EVAL FLD01 = FLD01 + FLD0

2同理,-、*、/ 分别对应减、乘、除

不过数学运行常用于RPGLE 程序中,较少用在CL 控制里面,这里只是介绍一下。

读取文件:(From Cuer:P1421)

DCL VAR(&FLD01)TYPE(*CHAR)LEN(2)

DCLF FILE(FHSLIB/PFFHS)

RCVF

CHGVAR VAR(&FLD01)VALUE(&FHS01)

以上这段CL 的意思,就是在CL 程序中读取PFFHS 文件,然后将读到的第一条记

录赋值到CL 的临时变量FLD01 中。

如果要将一个文件从头读到尾,则可以用如下语句来实现:

DCLF FILE(FHSLIB/PFFHS)

LOOP:

RCVF

MONMSG MSGID(CPF0864)EXEC(GOTO CMDLBL(EXIT))

读取到每条记录后的处理语句

GOTO CMDLBL(LOOP)

EXIT:

也就是说,信息CPF0864,即表示未读取到记录。

在CL 程序中声明文件使用DCLF 语句,一个CL 文件中只能声明一个文件,声明

语句必须在CL 控制语句之前。

使用声明的文件中的字段,同样需要在字段名前加上“&” ;

CL 程序中,无法控制游标,无法对记录进行定位操作。所以CL 程序对文件的操 作是比较弱的,通常我最多只用来读取某些只含少量记录的参数文件。

5.2 CMD

CMD 是用来生成命令的,执行后可以像其它系统命令一样,直接输入命令,或是F4,不需要像CLP 一样,要CALL 一下。

其实CMD 本质上也是执行CLP 或RPGLE(在编译时指定),用起来,无非就是好看点,直接一些,除此之外的意义,似乎也就没什么了。

举个例子,比如我们查看一个文件中的内容时,可以使用SQL 来查看,也可以使用命

令RUNQRY 命令来实现(RUNQRY QRYFILE(文件名))。但在我们要频繁查看文件

时,这两种方式似乎都不是很爽,也就是说要输入的内容都不是最少的,那我们可以设计一

个CMD,譬如说叫SEE,希望实现的最终效果,是在命令行输入“SEE 文件名”,就

可以查看PF 文件中的记录。那么,我们按如下步骤来实现:

1.建立一个CLP 程序,比如叫SEECLP,代码如下

PGM PARM(&FILENAME)

RUNQRY QRYFILE(&FILENAME)

ENDPGM

2.编译此程序

3.建立一个CMD 程序(即源代码的属性为CMD),代码如下:

CMD PROMPT(' 显示文件记录 ')

PARM KWD(NAME)TYPE(*CHAR)LEN(10)MIN(1)+

CHOICE(' 显示文件记录内容 ')+

PROMPT('Display file record')

4.编译此CMD,用F4,可见如下画面:

Create Command(CRTCMD)

Type choices, press Enter.Command............> SEE Name

Library...........> FHSLIB Name, *CURLIB

Program to process command...> SEE Name, *REXX

Library...........> *LIBL Name, *LIBL, *CURLIB

Source file..........> FHSFILE Name

Library...........> FHSLIB Name, *LIBL, *CURLIB

Source member.........> SEE Name, *CMD

Threadsafe...........*NO *YES, *NO, *COND

其中,蓝色字体显示的,就是我们需要输入这个CMD 要调用的程序名(默认值与

CMD同名),这里我们将此项内容填为SEECLP,表示SEE 这个CMD,调用的是SEECLP

这个程序

5.编译成功之后,我们在命令行执行“SEE 文件名”,就可以看到指定文件的记录。也可以用SEE + F4 的方式来使用

6.要注意,CMD 中,PARM 表示的就是CMD 命令的参数,参数的个数、类型、长

度都必须与其调用的程序相匹配,但名称可以与其调用的程序中的参数名称不一

样,而且名称前面不能有“&”字符。

7.在PARM 参数中,MIN(1),表示该项参数必须有值(即最小的有效长度为1),当

参数无值时,将会自动出现SEE + F4 的效果,同时该项参数高亮显示。试一试

就知道了

第五篇:RPG AS400程序员培训手册

2.8.4.4 O--R

ON-ERROR(On-Error)

没用过

OPEN {(E)}(Open File for Processing)打开文件

Factory 1 Operation Factory 2 Result HI LO EQ

OPEN 文件名

OPEN 后面的目标,必须是在当前程序中已声明的文件名(不是文件的记录格式名),而且在OPEN 操作之后,在程序结束之前之前,必须有对应的CLOSE 操作。

使用OPEN 操作,文件在声明时,必须使用USROPN 关键字(详见D 行说明)。

ORxx(Or)逻辑判断—或

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 IFGT FLD0

3FLD01 OREQ FLD0

2等价于

IF FLD01>FLD03 OR FLD01=FLD02

与IF、IFxx,AND、ANDxx 类似,RPGLE 的写法OR,比RPG 的写法ORxx 要灵活,而且可以用来表达一些复杂的逻辑关系。有鉴于此,所以通常IF 语句中,我会以OR 为主,基本不用ORxx。如果在编程序方面,公司/项目组无硬性要求,那我觉得还是少用ORxx 吧,总觉得这种写法的逻辑关系看起来不直接,尤其是有很复杂的AND,OR 时。

OTHER(Otherwise Select)分支语句的判断

与分支语句SELECT 一起使用,表示不符合上述所有条件时的操作,如下:

Factory 1 Operation Factory 2 Result HI LO EQ

SELECT

WHEN 条件判断1 处理语句1

WHEN 条件判断

2处理语句2

OTHER

处理语句

3ENDSL

在这个例子中,当满足条件判断1 时,运行处理语句1,运行结束后跳至ENDSL 处;

如果不满足条件判断1,则程序继续向下执行,判断是否满足条件判断2。当满足条件判断2 时,运行处理语句2,跳至ENDSL;当不满足

当不满足条件判断2 时,程序继续向下执下,当读到OTHER 操作码时,无条件运

行处理语句3(即当程序当前不满足以上所以条件判断时,则执行OTHER 之后的语句。

处理语句允许有很多句;

条件判断可以写得很复杂,也允许对不同的字段进行判断;比如说C 语言也有分支语

句switch,但是这个语句只能对一个字段进行分支判断,ILE 语言与它不同,允许对不同的字段进行判断

就我目前掌握的测试情况,上述的SELECT—WHEN--OTHER—ENDSL,其实也可以

写做:

IF 条件判断

1处理语句1

ELSEIF 条件判断2

处理语句2

ELSE

处理语句3

ENDIF 即WHEN 与ELSEIF 是类似的,这样说,应该可以明白了吧。

总之,SELECT—ENDSL 是一个很好用的语法,尤其是在表示很多不同的分支处理时。

OUT {(E)}(Write a Data Area)

没用过,讲数据域的。

PARM(Identify Parameters)定义入口参数

Factory 1 Operation Factory 2 Result HI LO EQR

*ENTRY PLIST

PARM FLD01

关于具体内容讲解,详见前面所说“入口参数”一章。

允许做为入口参数的有:普通变量、结构变量、数组变量

关于PARM、PLIST,还有一种在Factory 1,Factory 2 也填写变量或指示器的用

法,不过我不知道它具体表示什么意思,也不知道该怎么用。请用过的来补充。PLIST(Identify a Parameter List)同上

POST {(E)}(Post)

没用过

READ {(N | E)}(Read a Record)读取记录

1.基本语法:

Factory 1 Operation Factory 2 Result HI LO EQ

READ 文件记录格式名 45 46

READ后面跟的,必须是声明的文件记录格式名;

LO 指示器表示锁表指示器,当在指定的时间(CHGPF,WAITRCD 项可看到),需要读取的记录仍被锁,将会打开LO 指示器,即*IN45=’1’;

EQ指示器为是否读到指示器。当未读到仸何记录时,打开EQ 指示器,即*IN46=’1’

2.当文件在程序中,是用只读的方式声明时,READ 操作并不会造成锁表; 如果文件在程序中是用修改的方式声明,READ 操作成功后,该记录被锁;直到执

行解锁操作(UNLOCK,或UPDATE),或READ 该文件的其它记录,才会解锁

如果文件是用修改的方式声明,但希望READ 操作不锁表时,那么就用READ(N),即

Factory 1 Operation Factory 2 Result HI LO EQ

READ(N)文件记录格式名 45 46

这样读文件,就不会锁记录,但是同时也不能修改记录。如果需要修改记录,那么 在修改之前(包括对文件字段赋值之前),还必须再对该记录进行一次定位操作(比如

CHAIN、READ 语句均可)。也就是说,如果要修改记录,必须先锁住当前记录(很合理吧)

3.当执行READ 操作时,程序是根据游标当前在文件中所指向的位置,顺序读取下

一条记录。关于游标是如何指向,还不是一个很简单的问题,所以将会在下一章“数

据库相关知识”中具体讲解。

4.执行READ 操作时,允许声明的文件没有键值。(即PF 文件)

READC {(E)}(Read Next Changed Record)

没用过,读下一次修改过的记录?

READE {(N | E)}(Read Equal Key)读取键值相等的记录

语法与READ 操作码大致一样,这里不再重复,只说不同的:

假设程序中已声明逻辑文件PFFHSL3(键值为FHS01+FHS02)

Factory 1 Operation Factory 2 Result HI LO EQ

FHSKEY KLIST

KFLD FLD0

1KFLD FLD02

FHSKEY SETLL FMTFHS DOW 1=1

FHSKEY READE FMTFHS 1

5IF *IN15=’1’

LEAVE

ENDIF

ENDDO

这段话的意思,就是定义组合键值FHSKEY,然后根据这个FHSKEY 在逻辑文件

PFFHSL3 中去定位,循环读取PFFHSL3 中,FHS01、FHS03 与FLD01、FLD02 相等的记

录。当读取记录结束,或键值不等时,退出循环(*IN15 是EQ 指示器)。如果将READE 操

作码换成READ 操作码的话(当然,Factory 1 处也就不能有值),就没有“键值不等时退出

循环”这一层意思,只是读不到记录时就退出循环,但有时我们使用逻辑文件,仅仅是需要

它的排序,而不需要读不到键值相等的记录就退出循环。所以说,使用READ 操作码,还

是READE 操作码,需要根据实际的要求来决定。

以上的Factory 1 处填写值的系统处理,当READE 操作码在Factory 1 处未填写值时,系统实际上是将当前的值与读到的上一条记录的关键字进行比较,而不是与SETLL 时的键

值做比较(读第一条记录不做比较!),如果键值不等时,置EQ 指示器为1。也就是说,如果没有与FHSKEY 键值相同的录,那么系统并不是直接找开EQ 指示器,而是会一直保

持正常地往下读,直到找到与读到的第一条记录关键字不同的记录,才会打开EQ 指示器,所以要注意。

READP {(N | E)}(Read Prior Record)读取记录—游标上移

简单来说,READ、READE 操作时,游标在数据文件中,是下移的;即读完第一条记

录,游标指向第二条记录;读完第二条记录,游标指向第三条记录,依此类推,直至最后一 条记录。但READP 则正好相反,游标是上移的,即读完第三条记录后,游标指向第二条记

录;读完第二条记录后,游标指向第一条记录,直至读完第一条记录。一般来说,用READ、READE 的概率会比READP、READPE 的概率高得多,不过在某些情况下,使用READP 操作,又的确会很省事,这个一时间想不起例子来,大家可在编

程序时多实践。

READPE {(N | E)}(Read Prior Equal)

虽然我没用过,但猜想它应该就是指游标上移,按键值去读取文件。与READP 的关系,就类似于READE 与READ 的关系。

REALLOC {(E)}(Re-allocate Storage)

没用过

REL {(E)}(Release)

没用过

RESET {(E)}(Reset)

将数据结构赋值成为初始值。

注意是初始值,不是清空。如定义结构:

D FHSDS DS

D FHS01 10 INZ(’ABCD’)

D FHS02 5 INZ(’EFGH’)

那么,不管对该结构如何赋值,当执行语句: C RESET FHSDS

之后,FHS01 将会变成’ABCD,FHS02 将会变成’EFGH’,即恢复成为初始值。

RETURN {(H | M | R)}(Return to Caller)

RETURN 是程序结束。

在前面,“简单的程序流程”中,我们讲过,“SETON LR” 与RETURN 这两句话一

起,做为程序的结束。这里,再详细解释一下两者之间的区别,以及关系: 如果不写RETURN,只写“SETON LR”,程序执行完最后一句之后,将会再从第一

句开始执行,造成死循环。在简单的程序流程这个例子中,程序原来只想修改读到的第一条 记录,而如果没有RETURN 的话,将会把所有的记录都修改掉,直到最后找不到可修改的记录,然后系统报错,异常中断。(这种离奇的现象现在又测试不到了,可能是当时写错程 序了?把F 写成了P?不管它,当是我写错了,总之RETURN 是表示程序结束,没有

RETURN,主程序无可执行的语句时,它也会结束;如果RETURN 出现在主程序的中间,那么RETURN 后面的语句将不会执行)

如果只写RETURN,不打开指示器*INLR,根据blogliou 所说 “程序不会强制将内存

中的数据写到磁盘中。400 缺省的是BLOCK 输出,即数据记录满一个BLOCK 块时才会将

这一组记录写到磁盘上。那么如果这时BLOCK 没满,数据信息不会立刻写到磁盘上。之后 有其它作业用到该文件,读取的数据就不完整。”

但如果文件有唯一键字,或记录日志,必须同步写时,其实BLOCK 实际被忽略,也就 是此时不会有错。目前我们用的是MIMIX 备份,客户实际上将所有的文件都列入日志,这

时不写也不会出现上述错误。但为避免一些潜在的问题,养成良好的编程风格,建议将 SETON LR 与RETURN 一同,做为程序结束的标志。当然,如果某个程序频繁被调用,且 不涉及文 操作时,可考虑不打开指示器*INLR,仅用RETURN 作为结束,这样程序不

会被PURGE 出内存,可提高调用效率。

如果没写RETURN,也没有打开指示器*INLR,在编译时,系统将会报40 级错,说找

不到程序结束的语句,所以大可放心。ROLBK {(E)}(Roll Back)

1.基本语法

Factory 1 Operation Factory 2 Result

ROLBK

2.该操作码无其它参数,就是指对事务处理进行回滚操作。3.ILE 程序中,ROLBK 操作可随时进行,也允许在没有声明COMMIT 类型的文件的情况下,仍进行ROLBK 操作(对该进程这前的事务进行确认处理)f

4.关于日志的确认回滚操作,在后面会另设专门章节讲述。

2.8.4.5 S--Z SCAN {(E)}(Scan Character String)扫描字符串

扫描字符或字符串Factory 1 在目标字符串Factory 2 中是否存在Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SCAN FLD02 N 26

FLD01 可以是字符,也可以是字符变量;可以是一位长,也可以是多位长。

当FLD01 在FLD02 中存在时,EQ 指示器打开,即*IN26=’1’,同时将FLD02 中的起始

位置,赋值给N;

当FLD01 在FLD02 中不存在时,EQ 指示器保持关闭状态,即*IN26=’0’,同时N=0

允许从FLD02 中的指定位置开始检查:

FLD01 SCAN FLD02:2 N 26

如上句,即表示从FLD02 的第2 位,开始扫描。

在实际使用中,比如说我们判断某个字符是否为数字,就可以先定义一个0—9 的常量,然后将要判断的字符去SCAN 一下这个常量

SELECT(Begin a Select Group)分支语句

在操作码“OTHER”中讲过,为方便读者,列出简单语法如下:

Factory 1 Operation Factory 2 Result HI LO EQ

SELECT

WHEN 条件判断

1处理语句1

WHEN 条件判断2 处理语句

2OTHER

处理语句

3ENDSL

要注意,SELECT 操作码,必须有对应的ENDSL 操作码,否则编译无法通过。

SETGT {(E)}(Set Greater Than)定位操作—大于

举个例子吧,假设文件中有一个字段,是标识顺序号的,1、2、3、4。即该字段为1,表示第一条记录,该字段为2,表示第2 条记录。那么: Factory 1 Operation Factory 2 Result HI LO EQSETGT 文件记录格式名

READ 文件记录格式名

这个READ 操作,READ 到的,是第3 条记录。也就是说,SETGT 操作码,会将游标

定位到大于键值的第一条记录前。

在实际使用中,如果我们是按逻辑文件读取,而且读了一条记录之后,对其键值相同的 记录都不需要再读取时,就可以用SETGT,不过需要注意,Factory 1 项,需要是与键值相

同的变量,即如果文件是使用多个字段做为键值,那么我们也需要先定义一个组合键值的变

量,然后Factory 1 处填写这个组合键值的变量名。

当声明文件的键值有多项时,Factory 1 项的键值,允许小于文件的键值,但顺序必须

一致。即声明的文件如果键值为:FHS01、FHS02、FHS03,那么我们在程序中定义三个类

型与之相同的变量FLD01、FLD02、FLD03,以下写法都是有效的FLDKEY KLIST

KFLD FLD0

1KFLD FLD0

2KFLD FLD03 FLDKEY SETGT 文件记录格式名

FLDKEY KLIST

KFLD FLD01

KFLD FLD02

FLDKEY SETGT 文件记录格式名

FLD01 SETLL 文件记录格式名

SETLL {(E)}(Set Lower Limit)定位操作—小于

语法与SETGT 相同,含义与SETGT 不同。SETLL 操作码,会将游标定位到与键值相

等的第一条记录之前,仍是上例,如果是 2 SETLL 文件记录格式名

READ 文件记录格式名

那么READ 操作码读到的记录,就是第2 条记录,看到了吧,和SETGT 不同。

SETLL 操作码还可以用来简单判断当前键值是否存在有记录,以PFFHSL3 为例(键值

为FHS01、FHS02)

Factory 1 Operation Factory 2 Result HI LO EQ

FHSKEY KLIST

KFLD FLD0

1KFLD FLD0

2EVAL FLD01=’01’

EVAL FLD02=’02’

FHSKEY SETLL 文件记录格式名 44

当文件中有相应记录时,EQ 指示器打开,即*IN44=’1’

当文件中无相应记录时,EQ 指示器关闭,即*IN44=’0’(与CHAIN 正好相反,要注意)

而在这种用法中,SETLL 与CHAIN 的区别在于,CHAIN 是定位读取了记录,而SETLL 仅仅只是判断该记录是否存在。所以用SETLL 操作,不能修改记录,也无法取出记录的值。

只能判断记录是否存在。如果要修改记录,或取出记录的值,还需要有一个读取定位的操作,如READ,或READE、READP 等(最常用的,应该就是READ 操作)

SETOFF(Set Indicator Off)关闭指示器

Factory 1 Operation Factory 2 Result HI LO EQ

SETOFF 10 11 1

2等价于

EVAL *IN10=’0’

EVAL *IN11=’0’

EVAL *IN12=’0’

在SETOFF 这个操作码中,指示器填在HI、LO、EQ 哪里都没关系,都是表示要被关

闭的指示器

SETON(Set Indicator On)打开指示器

Factory 1 Operation Factory 2 Result HI LO EQ

SETOFF 10 11 1

2等价于

EVAL *IN10=’1’

EVAL *IN11=’1’

EVAL *IN12=’1’

在SETON 这个操作码中,指示器填在HI、LO、EQ 哪里都没关系,都是表示要被关闭的指示器

SHTDN(Shut Down)

没用过

SORTA(Sort an Array)没用过

SQRT {(H)}(Square Root)开方

Factory 1 Operation Factory 2 Result HI LO EQSQRT 3 N

这时,N=3(因为3 的平方为9)9、3 都可以是数字型变量,或者直接是数字 SUB {(H)}(Subtract)减法操作

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SUB FLD02 FLD0

3SUB FLD02 FLD03

看过前面的ADD、MULT 操作码,这里不用解释也应该明白是什么意思了吧。那就不

多说了。

SUBDUR {(E)}(Subtract Duration)日期相减

1.减日期

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SUBDUR N:*Y FLD02

表示将日期型变量FLD01 减去N 年,赋值到日期型变量FLD02 中;

N 可以是一个数字型变量,也可以就是一个数字,N 允许为负数 *Y,*M,*D(还有其它的参数值,可见ADDDUR,其中有详细解释)

2.判断两个日期型变量之间的天/月/年数

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 SUBDUR FLD02 N:*D

这时,N 做为一结果变量,表示日期型变量FLD01 与FLD02 之间的天数

SUBST {(P | E)}(Substring)取字符/字符串 Factory 1 Operation Factory 2 Result HI LO EQSUBST FLD01:3 FLD02

表示从字段FLD01 的第3 位开始,取2 位,左对齐赋值到字段FLD02 中。

要求字段FLD01 的长度必须大于或等于3+2 位,否则程序会报错。

可以尝试用%SUBST 语句,也是等价的,如下

EVAL FLD02=%SUBST(FLD01:3:2)

表示的是同样的意思。

起始位数3,取的长度2,在两种写法之下,都可以使用数字型变量来表达。

相比较之下,%SUBST 还有一种用法,就是对字符的指定位置赋值,这个就厉害了:

EVAL %SUBST(FLD02:3:2)=’01’

看到了吧,这句话就是说,使字段FLD02 的第3、4 位(即从第三位开始,两位长)等

于“01”

TAG(Tag)定义标签,与GOTO 同用

Factory 1 Operation Factory 2 Result HI LO EQ

FHSTAG TAG

TEST {(D | T | Z | E)}(Test Date/Time/Timestamp)

没用过

TESTB(Test Bit)

没用过

TESTN(Test Numeric)

没用过

TESTZ(Test Zone)

没用过

TIME(Time of Day)--取当前系统时间 Factory 1 Operation Factory 2 Result HI LO EQ

TIME FLD01

FLD01 可以是时间型或数字型变量

UNLOCK {(E)}(Unlock a Data Area or Release a Record)解锁

Factory 1 Operation Factory 2 Result HI LO EQ

UNLOCK 文件记录格式名

UNLOCK 是解锁操作,在某种程度上,可以将UNLOCK 视为ROLBK,将UPDATE

视为COMMIT。即如果锁定某条记录,并对其字段进行赋值之后,使用UPDATE 语句,将

会把修改后的结果保存下来,即修改文件,而UNLOCK 语句则不会修改文件,即否认了之 前对文件字段做的赋值修改。

从程序的执行效率上来讲,UNLOCK 的执行效率是高于UPDATE 的,因为UPDATE

操作时,系统需要对文件的每一个字段进行确认处理(DEBUG 时可以看到),而UNLOCK 就

是简单的解锁而已。

UPDATE(Modify Existing Record)修改记录

语法与UNLOCK 一样。

这里需要说明一下,在执行UPDATE 的时候,必须先使用READ、CHAIN 等操作码锁

定一条记录。如果未锁住记录,UPDATE 操作码将会报错。当执行了UNLOCK、UPDATE、以及ROLBK 语句时,等于是解锁,此时再执行UPDATE 操作码之前,必须再次锁住记录

操作;

WHEN {(M | R)}(When)分支判断语句中的条件判断

在操作码“OTHER”,“SELECT”中都讲过,仍列出简单语法如下:

Factory 1 Operation Factory 2 Result HI LO EQ

SELECT

WHEN 条件判断1 处理语句1

WHEN 条件判断

2处理语句2

OTHER

处理语句

3ENDSL

WHENxx(When True Then Select)

上面的语法,是RPGLE 的语法,WHENxx 是RPG 的语法,也就是

SELECT

FLD01 WHENEQ FLD02

处理语句

1……..这样的语法,在表达复杂的逻辑关系时,必须与ANDxx,ORxx 一起使用,所以我不

使用WHENxx 这个操作码。

WRITE(Create New Records)写记录

常用的方式:

Factory 1 Operation Factory 2 Result HI LO EQ

CLEAR 文件记录格式名

EVAL 文件字段1=xxxx

EVAL 文件字段2=xxxx

WRITE 文件记录格式名

表示在文件中写入一条新记录。文件需要声明为可写的。

通常会在给文件字段赋值之前,作一次CLEAR 操作来进行初始化,以避免不必要的麻烦。XFOOT {(H)}(Sum the Elements of an Array)

没用过,看帮助,是表示对数组字段的累加统计。

假设DIMDATA 定义为一个数字型的数组变量,FHS01 为一个足够大的数字型变量

Factory 1 Operation Factory 2 Result HI LO EQ

XFOOT DIMDATA FHS01

就表示将数组DIMDATA 中的所有记录的值都取出来,汇总相加,赋值到数字变量

FHS01 中

XLATE {(P | E)}(Translate)

将一个字符串中指定的字符,更换成另外的字符。

举例:如MYCHAR1,MYCHAR2 都是两个20 位长的字符型变量

C MOVEL 'ABCAAAC123' MYCHAR1

C 'A':'9' XLATE MYCHAR1 MYCHAR2

执行过这个语句之后,MYCHAR2 就等于”9BC999C123’,即将字符串MYCHAR1 中所

有的“A”都变成了“9”;

XLATE 也可能指定起始位置。如上句更改为:

C 'A':'9' XLATE MYCHAR1:4 MYCHAR2

则MYCHAR2 等于“ABC999C123”,指从第4 位开始(含第4 位),将“A”变成“9”

赋值。

Z-ADD {(H)}(Zero and Add)向数字型变量赋值

Factory 1 Operation Factory 2 Result HI LO EQ

Z-ADD FLD01 FLD02

将数字型变量FLD01,赋值到数字型变量FLD02 中。

Z-ADD、MOVE 虽然同是赋值操作码,但Z-ADD 的用法就远没有MOVE 那么变化多

端,只能在数字型变量之间赋值。所以也没有什么可说的了。zero 如果要对数字型变量赋初值,使用*ZERO

Z-ADD *ZERO FLD02

Z-SUB {(H)}(Zero and Subtract)用0 减

Factory 1 Operation Factory 2 Result HI LO EQ

Z-SUB FLD01 FLD02

等价于

0 SUB FLD01 FLD02

等价于

EVAL FLD02=FLD01*(-1)

*ALL

*ALL 是个很有意义的变量,举例:

EVAL FLD01=*ALL’0’

表示将字符型变量FLD01 赋值为全’0’

CLOSE *ALL

就表示关闭所有文件,意义与上面是不同的%LEN

取字符串的长度,举例:

(MYLEN 为数字型变量,FLD01 为字符型变量)

EVAL MYLEN = %LEN(FLD01)

这句话的意思,是指取字符串FLD01 的长度,不过通常这样用是没意义的,因为直接

用%LEN 操作码,取到的是字符串的总长度,不是有效字符的长度,也就是说FLD01 长度

为2,那么MYLEN 就恒等于2,不会变。就算变量FLD01 中没有值,取出的MYLEN 也等

于2.。所以,%LEN 通常会与%TRIM 或是%TRIMR 一起使用,语法在下面介绍。

%TRIM,%TRIMR

都是去字符串变量中的空字符意思,%TRIM 是去字符串左边的空字符;%TRIMR 是去

字符串右边的空格。

通常我们在写程序中,都是默认字符串变量左对齐,所以我们使用%TRIMR 操作码的概率应该高一点。举例:

EVAL MYLEN = %LEN(%TRIMR(FLD01))

这时的MYLEN,就是指变量FLD01 中的有效长度(前提条件是FLD01 中如果有值,是左对齐)。如果FLD01 为空,那么MYFLEN 为0;如果FLD01 首位有值,第二位为空,那么MYLEN 为1;如果FLD01 两位都不为空,那么MYLEN 就等于2。

如果字符串左对齐,那么就使用%TRIMR

还有一种用法,假设字符串FLD04 为4 位长的字符,FLD01,FLD02 都是2 位长的字

符,且FLD01 等于“A ”,FLD02 等于“BC”,那我们执行:

EVAL FLD04 = FLD01 + FLD01 + FLD02

FLD04 就等于“A A ”,也就是第二位与第四位都是空的,最后加的FLD02 其实无

效。

而如果执行

EVAL FLD04 = %TRIMR(FLD01)+ %TRIMR(FLD01)+ FLD02

则FLD04 就等于“AABC”,也就是说,在这里,%TRIMR(FLD01),是等价于单字符

“A”的MONITOR

监控程序信息。据说是可以屏蔽掉出错信息,避免程序异常中断,未经测试。

下载AS400 中系统安全性(五篇模版)word格式文档
下载AS400 中系统安全性(五篇模版).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    电子商务安全性初探

    电子商务安全性初探 摘要:本文针对电子商务安全的要求,分析了电子商务中常用的安全技术,并阐述了数据加密技术、认证技术和电子商务的安全交易标准在电子商务安全中的应用。......

    涉网安全性

    关于电厂涉网安全评估的思考 〔摘要〕分析了电力体制实施"厂网分开"后,电网安全责任主体发生变化,电网安全工作面临的新情况,考虑到全国联网的初始阶段和电力供应再度紧张使电......

    烟草安全性

    卷烟安全性的发展 摘要:随着社会的发展进步,吸烟与健康问题日益引起人们的关注,提高烟草安全性迫在眉睫。烟草的安全性指烟叶在燃吸时对人体健康的危害程度,直接影响烟草制品的......

    食品安全性

    食品安全性 1、1906年美国国会通过了第一部对食品安全,诚实经营和食品标签进行管理的国家立法—《食品与药物法》同年还通过了《肉类检验法》。 2、我国于1982年制定了《中华......

    Windows系统和Linux系统的安全性能比较(共五则)

    安全问题对于IT管理员来说是需要长期关注的。主管们需要一套框架来对操作系统的安全性进行合理的评估,包括:基本安全、网络安全和协议,应用协议、发布与操作、确信度、可信计算......

    路桥设计中的耐久性和安全性[大全五篇]

    路桥设计中耐久性和安全性问题 经济的发展离不开道路桥梁等基础设施的建设,道路桥梁工程也逐渐成为影响我国经济发展的基础。对经济发展有重要的影响。我国的道路桥梁在近些......

    中水系统范文

    中水系统—城市消防供水的新水源 内容简介 用城市污水处理系统的产物—中水,来满足城市消防供水的需要,解决目前城市消防供水水压偏低,无法保证火场需要的问题。用消防水鹤来......

    协众告诉你,OA系统安全性就四点!

    协众告诉你,OA系统安全性就四点! 随着全球信息化的建设,互联网的全面普及,以互联网为基础的办公自动化系统OA(Office Automation System)活跃于企业,并在这几年得到迅猛的发展。OA......