ibmas400rpg学习手册.docx

上传人:b****4 文档编号:3909025 上传时间:2022-11-26 格式:DOCX 页数:104 大小:102.20KB
下载 相关 举报
ibmas400rpg学习手册.docx_第1页
第1页 / 共104页
ibmas400rpg学习手册.docx_第2页
第2页 / 共104页
ibmas400rpg学习手册.docx_第3页
第3页 / 共104页
ibmas400rpg学习手册.docx_第4页
第4页 / 共104页
ibmas400rpg学习手册.docx_第5页
第5页 / 共104页
点击查看更多>>
下载资源
资源描述

ibmas400rpg学习手册.docx

《ibmas400rpg学习手册.docx》由会员分享,可在线阅读,更多相关《ibmas400rpg学习手册.docx(104页珍藏版)》请在冰豆网上搜索。

ibmas400rpg学习手册.docx

ibmas400rpg学习手册

1简单说明

内部交流、或可作培训使用。

对用户作如下假定:

1、能COPY、修改、编译源代码(RPGLE、CLP),并能运行编译后的程序

2、能COPY、修改、编译文件(PF、LF、PRTF、DSPF);

3、对数据文件(PF)有简单的认识(FIELD→RECORD→PF),并知道LF与PF的对应关系。

2程序代码行的编写

2.1最简单的RPGLE程序

为便于理解,这里写一个最简单的RPGLE程序

CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq

***************Beginningofdata*************************************

0001.00C'HELLOWORLD'DSPLY

0002.00CRETURN

******************Endofdata****************************************

这个程序编译成功,并调用(CALL程序名),就是在屏幕上反白显示“HELLOWORLD”字样。

(其中,绿色字样,是系统自动显示的,下同)

与自由风格的C语言不同,RPGLE中的编码,是有一定的格式,如果写错,将会在当前代码行上高亮反绿显示。

初学者如果不太清楚从何处开始下手,可以使用“F4”键查看(F4键只有用2进入的编辑状态才有效,用5进入的查看状态是无效的)

LevelN01Factor1OperationFactor2Result

'HELLOWORLD'DSPLY

Decimal

LengthPositionsHILOEQComment

关于每一项所对应的内容代表什么意思,该如何填写,即如何写程序,将会在下面的具体讲解。

2.2举例准备

列出表名,字段,以方便下面的举例。

假设有PF文件叫PFFHS,文件的记录格式叫FMTFHS

每条记录,都是由FHS01、FHS02、FHS03三个字段组成,每个字段都是两位长的字符型变量。

逻辑文件PFFHSL1的键值为FHS01

逻辑文件PFFHSL2的键值为FHS02

逻辑文件PFFHSL3的键值为FHS01、FHS02

注:

文件的记录格式,可以理解为给这个文件整条记录起的一个名字;或者是说将每条记录视都视做一个类型相同大变量,然后给这个大变量起的名字。

所以文件的记录格式信息中,包含有一条记录由多少个字段组成,总计长度是多少这样的信息。

文件的记录格式,与各个字段同时定义。

(写文件的源码时)

文件的记录格式在RPGLE的程序中,不能与文件名相同。

2.3简单的程序流程

为方便起见,系统自动显示的就不再贴出来了,只贴代码段。

FPFFHSUFEDISK

CREADFMTFHS

CEVALFHS01=”01”

CUPDATEFMTFHS

CSETONLR

CRETURN

这个程序的意思,是说读PFFHS这个文件,然后将读到的第一条记录中的FHS01这个字段的值修改为“01”。

“SETONLR”,LR的位置可在HI、LO、EQ中任选一处。

意思是指将打开指示器*INLR,即赋值使指示器*INLR的值等于1。

等价于“EVAL*INLR=’1’”,意思是强制将内存中的数据写到磁盘中。

(基于效率因素,系统在修改文件时,会先将修改的结果先放在内存中,在同一程序中,读取数据也是先从内存中查询。

)LR,取自是LastRecord

RETURN,表示程序结束,在后面“操作码”一节中,会有讲述。

如果不太明白,就记住

CSETONLR

CRETURN

CEVAL*INLR=’1’

CRETURN

这两句话加在一起,表示程序结束就可以了。

从这个程序中,我们可以看到,RPGLE的程序,大致上可以分为两个部分:

1、声明、定义部分:

声明程序中使用到的文件(F行),定义程序中使用的变量(D行)

2、程序运行部分:

即C行,也就是程序段。

在RPGLE程序中,F行必须在D行前面,D行必须在C行前面。

程序执行的起始顺序,将从定义部分之后,第一个C行开始,顺序向下执行。

程序中的F行、D行都不是必须项,一个程序可以没有F行(如仅完成计算功能的公共函数,比如计算利息),也可以没有D行(没有需要特别定义的变量,或者所有变量都在C行进行定义),但不应该没有C行,因为F行与D行都属于非执行行,是起定义作用;C行是执行行。

没有C行的程序,是无执行意义的。

2.4常见的程序流程

FPFFHSUFEDISK//声明文件PFFHS

DLSFLD01S2//定义临时变量LSFLD01

CEVALLSFLD01=’01’//给变量LSFLD01赋值

CEXSRSUB#UPD//执行子过程SUB#UPD

CEVALLSFLD02=’02’//给变量LSFLD02赋值

CEXSRSUB#UPD//执行子过程SUB#UPD

CSETONLR//数据写入磁盘

CRETURN//程序结束

CSUB#UPDBEGSR//子过程SUB#UPD开始

CREADFMTFHS//读PFFHS文件

CEVALFLD01=LSFLD01//给字段FLD01赋值

CUPDATEFMTFHS//修改文件

CENDSR//子过程结束

“//”后面的,只是简单的解释,如果自已动手写,不需要输入这些内容。

系统在运行这个程序时,是按如下的顺序来执行:

1.首句EVAL赋值语句,直接执行;

2.当系统发现操作码“EXSR”时,根据后面的变量名“SUB#UPD”,去查找对应的“SUB#UPDBEGSR”语句;

3.然后从“SUB#UPDBEGSR”之后,顺序向下执行,直至“ENDSR”语句

4.执行到“ENDSR”之后,将会再回到当初的“EXSRSUB#UPD”处,继续向下执行,直到RETURN语句为止

这里提出一点要注意,如果子过程中,又执行了自身,即在SUB#UPD程序中,又出现了“EXSRSUB#UPD”,是可以编译通过的,但在执行过程中,系统会因为无法定位,而出现死循环,直至报错异常中断退出。

也就是RPGLE的程序中,子过程不允许出现递归。

2.5F行说明

2.5.1内容说明

首位填上F,然后按F4,会出现如下内容:

FileFileEndofFile

FilenameTypeDesignationFileAdditionSequence

FileRecordLimitsLengthofRecord

FormatLengthProcessingKeyFieldAddressType

File

OrganizationDeviceKeywords

Comment

各项的含义分别是:

Filename:

需要声明的文件名,必须顶格,文件名必须唯一,也就是程序中对同样的文件名不能声明两次。

FileType:

声明文件的处理类型。

必须填写。

允许的选项有:

I:

输入型,即只读文件,对声明的文件只取其记录的值,不对记录进行修改

U:

修改型,即对声明的文件进行修改操作(删除记录属于修改操作的一种)

O:

输出型,即只写,对声明的文件只进行写操作。

C:

混合型,用于对屏幕文件的定义。

(混合型,即输入/输出型,以屏幕文件为便,也就是读取屏幕文件的一些输入字段信息,同时也可以输出一些字段的值到屏幕文件中,但不能对屏幕文件自身进行修改,所以与上面的U是有区别的)

FileDesignation:

文件的指定方式,允许的选项有:

不填:

表示这是一个输出文件,即“FileType”项为“O”时,此项不填

P:

表明声明的文件是主文件,这个很少用,cycle相关

S:

表明声明的文件是次文件,这个没用过,cycle相关

R:

Recordaddressfile,记录地址文件?

没用过

T:

数组或表文件?

不懂,没用过

F:

常用,具体含义不知道该如何翻译(Fullproceduralfile)

简单来说,不考虑cycle(循环控制),这样理解就够了:

当“FileType”为I,U,C时,这里填“F”

当“FileType”为O时,这里不填写

EndofFile:

程序结束前,对记录的处理方式。

可以不填,或填“E”。

但从英文解释上来看,不敢妄下定论,似乎不填,表示在程序结束前,要处理所有文件的所有记录(含LF?

);填E,表示只处理这个文件的所有记录?

总之,此项一般是不填。

FileAddtion:

是否会增加文件中的记录,即是否会对文件进行写操作。

可以不填,或填“A”

当FileType为“O”时,系统自动默认此项为“A”,不必填写;

当FileType为“I”,或“U”时,这项内容可以填“A”,也可以不填。

不填,即表示不会增加文件中的记录,也就是没有写操作;填“A”时,即表示会增加文件中的记录,也就是会对文件进行写操作。

Sequence:

针对cycle使用的,表示排序顺序。

(Cycle我没有用过,估计可能是使用控制起来,程序代码不那么直观,不利于上手和维护,所以现在已经不流行使用了。

当定义为非cycle文件时,即“FileDesignation”项非“P”、“S”时,此项必须为空;

当定义为cycle文件时,即“FileDesignation”项为“P”、或“S”时,此项可填空、A、D。

A表示升序,D表示降序。

因为CYCLE现在已不常用,所以通常不填。

FileFormat

文件格式,不能为空,允许的值有:

E:

声明的文件,是外部描述的文件(即文件在程序运行之前就已存在?

F:

声明的文件,是一个程序描述文件?

(不知道什么意思,没用过)

这里通常填“E”,即为外部描述文件

RecordLength

“FileFormat”为“F”时,才需要填写。

没用过

通常不填

LimitProcessing

不懂。

通常不填。

LengthofKeyField

查询时,索引键值的长度

如果“FileFormat”项等于“E”,即外部描述文件时,此项不填

如果“FileFormat”项等于“F”,便不需要按KEY值查询时,此项也不填

如果“FileFormat”项等于“F”,需要按KEY值查询时,此项填写KEY值的长度(1—2000)。

因为一般都使用外部描述文件,所以这里一般都不填写。

RecordAddressType

记录寻址类型,好象是对文件键值的描述。

允许的值如下:

空:

不使用KEY值,在程序段中,不会对文件的查询定位操作,如“SETLL”、“CHAIN”操作码都不会用的时,该项填空。

K:

使用KEY值,即表示会对声明的文件进行查询定位操作,此时声明的文件必须有键值,即必须为逻辑文件(LF文件),或在生成文件时,已加入了KEY值。

(下面的选项应该是程序描述文件才会使用)

A:

KEY值为字符型

D:

KEY值为日期型

F:

KEY值为数字型

G:

KEY值为非英文字符

P:

KEY值为压缩型数字

T:

KEY值为时间型

Z:

KEY值为timestamp?

总之,如果要按照键值对声明的文件进行查询定位操作(即程序中使用了CHAIN、SETLL操作码,则此项需要填写“K”;如不需要进行查询操作,则不填。

),此项填“K”时,声明的文件必须含有KEY值。

FileOrganization

不知道,一般不填

Device

声明文件的存放位置,必须填写,允许的值有:

DISK:

磁盘文件,即文件存储在磁盘上,最常见的;

PRINTER:

打印文件,提供打印输出描述,以及对打印设备访问。

打印报表用这个;

WORKSTN:

workstation,工作站,显示文件。

屏幕文件(DSPF)的定义用这个值

(下面这两种我没用过的)

SEQ:

磁带文件,文件存储在磁带上。

SPECIAL:

特殊文件,我现在也不是很清楚具体使用方式。

据blogliou说,这种类型,是允许指定一种不能被RPG直接操作的输入/输出设备。

比如可以通过SPECIAL文件,在RPGLE程序中实现象读写磁盘一样,对DTAQ进行程序间数据交换。

Keyword

可以不填,常用的值有(这里只列出几个常用的):

COMMIT

该文件记录的数据操作进行日志处理(关于日志处理,后面会章节会讲到)

RENAME

对文件记录格式名进行重命名。

比如说程序中需要同时声明PFFHSL1,PFFHSL2这两个逻辑文件。

这两个逻辑文件的记录格式名都是一样(通常和PF一样,即都为FMTFHS;不过也可以定义成不同。

如果不同,当然就不需要使用RENAME键字了)。

那么,为了能让系统区分,就必须对其中一个的记录格式名进行重命名。

RENAME的语法:

RENAME(旧记录格式名:

新记录格名),如下:

FPFFHSL1IFEDISK

FPFFHSL2IFEDISKRENAME(FMTFHS:

FMTFHS2

新记录格式可以自由定义,只要在该程序中无同名的即可。

RENAME并不会真正的更改文件的记录格式名,仅是在当前运行程序中进行重命名。

对同时运行的其它程序无影响

USROPN

对于声明的文件,由用户自行打开。

如果不填写此关键字,系统将会在程序最最开始(执行第一句C行语句前),自动执行“OPEN文件”的操作,在程序结束后,自动执行“CLOSE文件”的操作。

而填写此关键字之后,OPEN,CLOSE的操作将由用户在C行程序段中,自行处理。

如果用户未执行OPEN操作,就执行CHAIN、READ、SETLL等语句,在编译程序时就会报错。

程序在结束之前,必须关闭所有已打开的文件,所以用起来会比较繁琐。

USROPN常作用于对文件的解锁,在同一程序中打开同一文件的不同MEMBER等,属于一个较高级的用法,可在实际操作中慢慢体会。

OPEN,CLOSE的操作码,对应的是文件名,不是记录格式名。

COPENPFFHSL1

CCLOSEPFFHSL1

而不是

COPENFMTFHS

Comment

注释说明。

源自RPG,在RPG中是有作用的,可以对程序作简短的说明,但在RPGLE中,其实已经没有作用了,此项不用填。

(填了也没用)

2.5.2常用例子

对文件进行只读的声明:

FPFFHSIFEDISK

对文件进行修改的声明:

FPFFHSUFEDISK

对文件进行只写的声明:

FPFFHSOEDISK

对文件进行修改,以及增加记录的操作:

FPFFHSUFAEDISK

对文件进行查询,增加记录的操作,并对文件进行查询操作:

FPFFHSL1IFAEKDISK

声明两个记录格式相同的文件,并对其中之一进行重命名

FPFFHSL1IFEKDISK

FPFFHSL2IFEKDISKRENAME(FMTFHS:

FMTFHS2)

注:

在声明时,两个文件不一定要上下紧接着;随便改哪一个文件对应的记录格式都可以;新旧记录格式名用冒号隔开,新记录格式名可自行定义,无规则。

对文件的修改操作进行日志处理:

FPFFHSL2UFEKDISKCOMMIT

cycle类文件的声明:

FPFFHSL2IPEKDISK

这样文件声明为P之后,程序中不需要写循环读文件,也不需要写RETURN,设指示器INLR,也就是

FPFFHSL2IPEKDISK

CREAD记录格式名

等价于

FPFFHSL2IFEKDISK

CDOW1=1

CREAD记录格式名EQ指示器

CIFEQ指示器=’1’

CLEAVE

CENDIF

CENDDO

CRETURN

2.5.3补充说明

声明的文件,可以同时使用多个keyword关键字,并可以不在同一行(但必须紧接在声明的文件的下面),如下:

FPFFHSL2IFEDISKRENAME(FMTFHS:

FMTFHS2)

FCOMMIT

即表示文件PFFHSL2,同时使用了RENAME、COMMIT两个关键字。

如果写得下,也可以写在同一行,以空格键分开,如下

FPFFHSL2IFEDISKCOMMITRENAME(FMTFHS:

FMTFHS2)

2.6D行说明

首行填“D”,然后按F4,会出现如下内容:

DeclarationTo/

NameES/UTypeFromLength

InternalDecimal

DataTypePositionsKeywords

Comment

2.6.1内容说明

Name:

定义的变量的名字,该名字可以不顶格写。

(即允许有缩进)

E:

标识定义的变量是否源自外部数据结构。

可以不填,或填“E”

上面的解释可能有点饶口,其实这个地方的意思,就是说:

如果是程序内部自行定义一个临时变量,此处不填;

如果是引用的一个外部文件作为数据结构,那么这里就要填“E”;同时“DeclarationType”处,就要填“DS”,即定义为一个结构;“Keywords”处要使用EXTNAME关键字

所谓“引用一个外部文件作为数据结构”,也就是说定义一个结构,整个结构中的变量,参照外部文件来定义。

所谓结构,可以理解为一个“由多个变量组合而成的大变量”。

举例而言:

DMYDSEDSEXTNAME(PFFHS)

DMYDSDS

DFHS0112(1在From项;2在To/length项)

DFHS0234

DFHS0356

是等价的,都是定义一个结构变量MYDS(名字可以自行定义),这个结构变量是由三个字符型变量FHS01,FHS02,FHS03拼成的。

第一种定义方法,就是引用外部文件“PFFHS”作为数据结构的定义,注意使用到了“EXTNAME”关键字,而且“E”项的值为“E”。

而第二种定义方法,就是直接定义一个结构“MYDS”。

注意没有使用外部文件时,“E”项的值为空。

S/U:

不知道,一般都填空。

DeclarationType:

定义变量的类型,允许的值如下:

不填:

非以下内容:

数据结构、常量、独立变量、数组、表。

此项为空时,好象只能用来表示当前定义的变量是属于结构的一个变量。

在下面会举例

DS:

数据结构,即定义一个结构变量,这个之前已讲过

C:

常量

常量只能使用字符,不需要定义常量的长度、类型。

常量的内容写在“Keywords”处,并使用CONST关键字,在程序段中,不能对常量进行赋值操作。

DMYNUMCCONST('abcdefghijklmn')

就是定义一个叫做MYNUM的常量,这个常量包含字母a--n。

PI:

不知道,没有用过

PR:

不知道,没用过

S:

定义以下内容:

独立变量、数组、表

定义一个叫MYFIELD1的变量,变量为1位长的字符型

DMYFIELD1S1//1在“To/length”项

定义一个叫MYARRAY的数组,共含3条记录,每条记录为1位字符型

DMYARRAYS1DIM(3)//DIM在“Keywords”项

表的定义没有用过

总之,这一项,最常用的,就是“DS”、“S”与空。

即结构体与独立变量,其它选项较少用到。

From:

当“DeclarationType”项为“S”时,表示独立变量、数组,此项不填

当“DeclarationType”项为“DS”时,表示结构,此项仍然不填

当“DeclarationType”项为空时,表示当前定义的变量,属于上面定义的结构,此时,此项可以填写,也可以不填写。

当填写时,“From”项表示变量在结构中的起始位置,右对齐;“To/length”表示变量在结构中的结束位置,也是右对齐。

当不填写时,“To/length”表示直接定义为变量长度。

举例:

DMYDSDS

DDSFLD0112//1在“From”项,2在“To/length”项

DDSFLD0234

DMYDSDS

DDSFLD012//2在“To/length”项

DDSFLD022

其实是等价的,都是定义一个结构变量MYDS,这个结构变量中,包含了两个变量DSFLD01,DSFLD02,这两个变量都是两位长字符。

所不同的是,第一种定义方法,是指定了变量在结构中的位置;而第二种方法,是直接指定变量的长度和类型

注意到上面的定义中,DSFLD01、DSFLD02的DeclarationType为空,也就是表示这两个字段是属于上面定义的结构MYDS。

如果此项为“S”,即表示这个变量与结构无关

DMYDSDS

DDSFLD012//2在“To/length”项

DDSFLD02S2

在这个定义中,变量DSFLD02就是一个独立的变量,与结构MYDS无关。

Length:

上面已讲述在定义结构时的使用方法。

在定义非结构时,此项的内容即为定义变量的长度。

右对齐

InternalDataType:

定义变量的类型,允许的值有:

空:

变量定义为字符型、压缩型数字

A:

变量定义为字符型

B:

二进制?

不知道

D:

变量定义为日期型

F:

变量定义为浮点型?

G:

变量定义为图型?

(非英文?

汉字?

I:

变量定义为带符号的整数

N:

变量定义为指示器变量?

(没用过)

P:

变量定义为压缩型数字

S:

变量定义为普通的数型

T:

变量定义为时间型

U:

变量定义为无符号的整数

Z:

变量定义为日期+时间型(格式:

年-月-日-时.分.秒.微秒)

*:

变量定义为指针型

其实我最常用,就是不填,因为一般的程序,有字符和数字这两种类型变量,就足够了。

DecimalPositions:

当变量定义为数字型时,用来标志小数的位数。

当“To/Length”项为3,“InternalDataType”项为空时

此项为空,表示定义的变量为3位长的字符型

DMYFLD01S3//定义为3位字符型

此项不为空(右对齐),表示定义的变量为数字型

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1