AS400开发入门-By adan

更新时间:2024-01-17 12:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

AS/400开发介绍

1.1 AS/400应用开发概述.................................................................... 错误!未定义书签。 1.1.1 数据描述规范(DDS data description specification) ........... 错误!未定义书签。 1.1.2 DB2 QUERY MANAGER AND SQL DEVELOPMENT KIT支持的结构化查询语言SQL/400 ............................................................................................. 错误!未定义书签。 1.1.3 APPLICATION DEVELOPMENT TOOLSET/400(ADTS/400)开发工具包中有PDM、SEU、SDA、RLU、DFU等 ..................................................... 错误!未定义书签。 1.PDM(ROGRAMMING DEVELOPMENT MANAGER) ...... 错误!未定义书签。 2.SEU(SOURCE ENTRY UTILITY) ......................................... 错误!未定义书签。 3.SDA(SCREEN DESIGN AID) ................................................ 错误!未定义书签。 4.RLU(REPORT LAYOUT UTILITY) ...................................... 错误!未定义书签。 5.DFU(DATA FILE UTILITY) .................................................. 错误!未定义书签。 1.1.4 QUERY/400 ............................................................................. 错误!未定义书签。 1.1.5 CL(控制语言)编程 ............................................................ 错误!未定义书签。 1.2 DDS及文件操作说明 .................................................................... 错误!未定义书签。 1.2.1 AS/400数据库结构 ................................................................ 错误!未定义书签。 1.字段及字段定义 ........................................................................... 错误!未定义书签。 2.记录及记录格式 ........................................................................... 错误!未定义书签。 3.数据库文件及文件说明 ............................................................... 错误!未定义书签。 4.成员 ............................................................................................... 错误!未定义书签。 1.2.2 建立物理文件 ......................................................................... 错误!未定义书签。 1.建立一个库TEST一个源文件TESTSRCF ............................... 错误!未定义书签。 2.通过SEU开发工具进行交互式定义源物理文件 ..................... 错误!未定义书签。 3.建立物理文件 ............................................................................... 错误!未定义书签。 4.数据输入 ....................................................................................... 错误!未定义书签。 5.字段参考文件 ............................................................................... 错误!未定义书签。 1.2.3 建立逻辑文件 ......................................................................... 错误!未定义书签。 1.逻辑文件的结构可以很简单,也可很复杂。主要有四类: ... 错误!未定义书签。 2.简单逻辑文件定义 ....................................................................... 错误!未定义书签。 3.建立逻辑文件,可通过CRTLF命令来建立逻辑文件(编译)错误!未定义书签。 1.3 RPG 语言 ...................................................................................... 错误!未定义书签。 1.3.1 结构化程序语言 ..................................................................... 错误!未定义书签。 1.3.2 操作码 ..................................................................................... 错误!未定义书签。 1.算术运算 ....................................................................................... 错误!未定义书签。

61676237.doc – 第 1 页 共 39 页

2.赋值操作 ....................................................................................... 错误!未定义书签。 3. 比较操作: .................................................................................... 错误!未定义书签。 4.程序操作: ................................................................................... 错误!未定义书签。 5. 调用和转移操作: ..................................................................... 错误!未定义书签。 6. 文件操作: ................................................................................. 错误!未定义书签。 7.信息操作: ................................................................................... 错误!未定义书签。 8.说明操作: ................................................................................... 错误!未定义书签。 9.数据区操作 ................................................................................... 错误!未定义书签。 10.其它操作: ................................................................................. 错误!未定义书签。 1.3.3 ILE RPG对RPG/400的扩充 ................................................ 错误!未定义书签。 1.ILE RPG基本概念 .................................................................... 错误!未定义书签。 过程(PROCEDURE) ................................................................. 错误!未定义书签。 模块对象(MODULE) ................................................................ 错误!未定义书签。 ILE程序 ......................................................................................... 错误!未定义书签。 服务程序 ......................................................................................... 错误!未定义书签。 联编目录 ......................................................................................... 错误!未定义书签。 对程序和过程的调用 ..................................................................... 错误!未定义书签。 活动组(Activation Group) ......................................................... 错误!未定义书签。 2.表达式的使用及可使用表达式的操作码 ................................... 错误!未定义书签。 表达式中的有效操作符 ................................................................. 错误!未定义书签。 表达式中结果字段的数据类型 ..................................................... 错误!未定义书签。 表达式中的数据精确度 ................................................................. 错误!未定义书签。 可用表达式的操作码 ..................................................................... 错误!未定义书签。 3.内嵌式函数及新增、改变的操作 ............................................... 错误!未定义书签。 内嵌式函数 ..................................................................................... 错误!未定义书签。 新增操作码 ..................................................................................... 错误!未定义书签。 新增位操作 ..................................................................................... 错误!未定义书签。 新增日期、时间操作 ..................................................................... 错误!未定义书签。 改变了一些操作码的写法 ............................................................. 错误!未定义书签。 附:RPG III 与 RPG IV 的实体名称长度区别 ......................... 错误!未定义书签。 4.可视化调试(源级调试) ........................................................... 错误!未定义书签。 开始调试程序: ............................................................................. 错误!未定义书签。 结束调试: ..................................................................................... 错误!未定义书签。 调试命令: ..................................................................................... 错误!未定义书签。 1.4 举例 ................................................................................................. 错误!未定义书签。 1.4.1 学生成绩管理 ......................................................................... 错误!未定义书签。 1.建库、源文件、物理文件成员、 逻辑文件成员并编译成员 . 错误!未定义书签。 2.分别用DFU、SQL、和通过RPGLE程序对学生学籍进行增加、修改、查询、删除记录操作 ......................................................................................... 错误!未定义书签。 3.编写程序实现某年段学生成绩的基本管理 ............................... 错误!未定义书签。

61676237.doc – 第 2 页 共 39 页

1.1 AS/400应用开发概述

数据描述规范(DDS data description specification)

AS/400的操作系统OS/400提供一种描述数据属性的方法DDS,它可以在程序外部方便、有效地对数据属性进行描述。

AS/400有两种定义数据的方法:

(1)程序描述文件:文件在记录的描述仅包含一个记录名和记录长度,任何程序使用这种方式描述的文件必须为记录中的每个字段提供字段级属性(字段名、数据类型、字段长度等)定义,此中类型文件不常用

(2)外部描述文件:文件包含记录的详细字段描述和有关文件如何被访问的信息,在程序中只要指明该文件为外部描述文件即可,当程序目标建立时,编译器自动从文件中抽取信息到程序中,且转换为高级语言适合的语法,它的显著特点之一是克服了程序描述文件的缺点,通过文件的记录字段仅一次的说明,可定义多种访问路径,多个程序使用。

DB2 QUERY MANAGER AND SQL DEVELOPMENT KIT支持的结构化查询语言SQL/400

SQL/400是SQL的DB2/400实现,可以交互式地输入大部分SQL语句或把它们嵌入到高级语言(RPGLE、COBOL、CLE等)程序中,替代高级语言内置的读、写和修改等指令。SQL/400主要由以下部分组成:

(1)SQL运行支持程序,提供对SQL 语句的分析及对运行任何SQL语句的支持功能,是OS/400的一个部分,它允许含有SQL语句的应用程序在没有安装DB2 QUERY MANAGER AND SQL DEVELOPMENT KIT特许程序的系统上运行。

(2)SQL预编译程序,处理嵌入SQL语句的应用程序 (3)SQL交互式接口,支持用交互式建立和运行SQL语句 (4)DB2 QUERY MANAGER FOR AS/400,提供菜单、填空式提示的交互式接口,允许建立、增加、维护数据,和运行报表

61676237.doc – 第 3 页 共 39 页

APPLICATION DEVELOPMENT

TOOLSET/400(ADTS/400)开发工具包中有PDM、SEU、SDA、RLU、DFU等

1.PDM(PROGRAMMING DEVELOPMENT MANAGER)

可以用来处理源代码、对象和库。为程序员建立源文件成员、访问SEU和许多其他有用的工具提供方便。

STRPDM:直接到PDM菜单

WRKLIBPDM:可以指定操作哪一个库或对当前库列表进行操作

WRKOBJPDM:指定操作某一库下的所有对象(可按名称、类型选取) WRKMBRPDM:指定操作某一库下某一源文件下的所有或部分成员

2.SEU(SOURCE ENTRY UTILITY)

是一个全屏幕编辑工具,可以建立和编辑源文件成员,当启动时,能够输入新的源语句,修改、删除、复制、移动已存在的源语句,具有语言相关提示和语法检查功能,且具有分屏编辑/浏览功能。

STRSEU:可以对原有成员进行编辑或建立新成员,对原有成员进行编辑也可通过在WORK WITH MEMBERS USING PDM(WRKMBRPDM)屏幕上使用选项2(EDIT)功能来实现,当然,建立新成员也可以通过在WORK WITH MEMBERS USING PDM(WRKMBRPDM)屏幕上使用F6(CREATE)功能键来实现。

3.SDA(SCREEN DESIGN AID)

可用来交互式设计、创建和维护应用屏幕,包括显示文件和菜单,且可以将用户设计的屏幕规范地自动转换成DDS源代码,简化了菜单和显示文件的创建。

STRSDA:可以进入屏幕和菜单的编辑画面,对原有屏幕编辑也可通过在WORK WITH MEMBERS USING PDM(WRKMBRPDM)屏幕上使用选项17(CHANGE USING SDA)功能来实现,

4.RLU(REPORT LAYOUT UTILITY)

可用来交互式定义打印报表的格式分布,建立打印文件,且可以将用户设计的报表格式分布规范地自动转换成DDS源代码,简化了报表的设计和修改,使用它可以在屏幕上直观地设计打印报表。

STRRLU:可以进入报表编辑画面,对原有屏幕编辑也可通过在WORK WITH MEMBERS USING PDM(WRKMBRPDM)屏幕上使用选项19(CHANGE USING RLU)

61676237.doc – 第 4 页 共 39 页

功能来实现

5.DFU(DATA FILE UTILITY)

能够快速定义、创建面向数据录入、查询或文件维护的DFU程序,而不需要编程。对开发应用建立测试数据库尤其有用。

STRDFU:显示DFU菜单

DLTDFUPGM:删除DFU程序和文件 CHGDTA:运行DFU程序

DSPDTA:运行DFU程序,但不能修改文件中的数据记录

UPDDTA:使用临时的DFU程序更新文件,可通过在WORK WITH MEMBERS USING PDM(WRKMBRPDM)屏幕上使用选项18(CHANGE USING DFU)来实现,它可以进行查询、增加、修改、删除记录的操作。该功能最常用。

QUERY/400

QUERY/400特许程序是一个非常有用和容易使用的决策支持工具,可用来获取外部描述数据库文件信息。它允许使用单个文件或联结最多32个不同文件的数据,产生的报表可以打印、屏幕显示或存放在新的数据库文件中,功能强大。 STRQRY或GO QUERY命令,可以进入QUERY菜单,主要功能都有相应选项和帮助进行逐步引导完成。

CL(控制语言)编程

AS/400的所有系统功能都可以通过控制语言(CONTROL LANGUAGE,简称CL)调用,单个控制语言就是一条CL命令和它的参数。可以在命令行直接执行或输入到源文件成员中(CL程序或CLLE程序)经编译生成目标运行。注意,有些CL命令只能在程序中实现其功能(如,MONMSG等)。系统为所有CL命令提供提示和帮助,并且多数参数有缺省值。 其实,一个CL程序就是一组CL命令,其目标可以交互式或批处理环境下运行。

通过CL程序可以简化操作,控制工作流程,设置作业运行环境等。在应用中,CL程序一般作为

主控程序来控制应用程序的执行顺序和为应用程序完成一些首尾的任务(如文件覆盖、定位目标等),它可以管理程序执行中出现的以外(可根据需要是饶过还是进行修正)。此外,CL程序还能实现算术/逻辑操作,可以与用户或其他程序通讯,可以访问单个记录格式的数据库文件或显示文件。CL程序也有缺点,不能增加或修改数据库文件中的记录,不能使用打印文件或ICF文件等。

1.2 DDS及文件操作说明

利用DDS可以描述物理文件、逻辑文件、显示文件、打印文件和ICF文件,重点介绍

61676237.doc – 第 5 页 共 39 页

描述物理文件和逻辑文件

AS/400数据库结构

三级存储结构

库(LIBRARY) —— 数据库文件(FILE) —— 成员(MEMBER) 一级目录 —— 二级目录 —— 三级目录

1.字段及字段定义

字段是用来描述某一属性的一组值;字段定义是对字段属性的说明

2.记录及记录格式

记录是把一组字段放在一起命名,用来说明某一事物;记录格式是对记录中所有字段的简单说明以及对各字段排序的说明

3.数据库文件及文件说明

文件是已命名的一组记录,文件说明是对文件所有的记录格式和存取路径的说明,数据库文件分为数据文件和源文件,数据文件就是程序中使用的物理文件和逻辑文件。 A.物理文件(*FILE,PF-DTA):在SQL中称做表(TABLE),含有系统实际存储的数据,每个物理文件只有一个固定长度的记录格式。物理文件可以指定键值来规定其顺序存取路径,而不按记录写入时的物理顺序操作。 B.逻辑文件(*FILE,LF):在SQL中称做表(VIEW),它不含有实际数据,依附于物理文件,可以描述一个或多个物理文件的记录(JOIN逻辑文件)。 逻辑文件功能有: 改变物理文件中定义的字段属性(如字段名和字段排列顺序) 提供记录的逻辑顺序 可以只选择物理文件中部分字段进行显示或修改 对字段值进行选择记录进行操作 从物理文件的字段基础上演绎新字段 联合多个物理文件 C.源文件(*FILE,PF-SRC):是系统用来建立源程序(RPGLE、CLLE、C)或源物理文件(PF)等目标的源说明

4.成员

分为数据文件成员和源文件成员。

61676237.doc – 第 6 页 共 39 页

A.数据文件成员,数据文件中的记录可以按某一规则分为多组,每个成员可以存储其中的一组记录,成员就是数据文件的子集,如一家省级银行将各地区分行的存款记录按多个成员存储。一个文件至少有一个成员,建立数据文件时,系统自动产生一个初始成员(名字和数据文件一样),高级版本OS对文件成员个数不加限制(*NOMAX)。 B.源文件成员,就是源程序、源物理文件、源逻辑文件等集合,可以将大型应用系统的一个模块的相关源文件成员存放在一个源文件里。

建立物理文件

1.建立一个库SGMSRC、两个源文件RPGMSCF和RDTASCF,主要用于存放应用系统的源,再建一个库SGMOBJ,用于存放目标

系统集成标准:

1.库:系统名+库属性,假如有学生成绩管理系统名为SGM,存放该应用系统的源程序库就命名为SGMSRC,存放该应用系统目标的库可命名为SGMOBJ。

2.源文件名:一般情况可按模块名(定义为2位)来区分,而我们要举的例子比较小,直接按存放成员的类型来区分,比如,存放程序的源文件叫R+PGM+SCF,存放物理文件和逻辑文件定义的源文件叫R+DTA+SCF

3.物理文件/逻辑文件名:物理文件一般是按该物理文件的用途来命名的,比如:学生成绩表命名为STGD+A,‘A’含义是主文件(或数据文件),逻辑文件是依附于物理文件,一般通过将A改为L,再加序号以区分哪个逻辑文件,逻辑文件不宜太多,否则,会影响数据操作效率,如针对学生成绩表,其中一个逻辑名为STGDL1

4.程序名:一般情况下,是模块名(两位)+交易码(4位)+程序类型标识(一位,‘R’:RPGLE,‘C’:C,C或CL,‘R’:报表等)组成,比如一个应用系统的一个模块的所有程序存放在源文件RCDSCF下,其中一个交易程序名字可命名为CD0400R,‘CD’为模块名,‘0400’为交易码,‘R’代表RPGLE程序

CRTLIB LIB(SGMSRC) TYPE(*PROD) CRTSRCPF FILE(SGMSRC/RPGMSCF) IGCDTA(*YES) TEXT(‘PROGRAM SRCF FOR STUDENT’) CRTSRCPF FILE(SGMSRC/RDTASCF) IGCDTA(*YES) TEXT(‘DATABASE SRCF FOR STUDENT’)

CRTLIB LIB(SGMOBJ) TYPE(*PROD)

2.通过SEU开发工具进行交互式定义源物理文件

DDS使用一种位置相关的格式。在一个DDS行中对物理文件有效的位置是: 6:FORM的类型(A=DDS) 17:NAME的类型(R=RECORD NAME ,K=KEY FIELD NAME,BLANK=FIELD NAME)

61676237.doc – 第 7 页 共 39 页

19-28:NAME(类型由17列决定的名称,如记录名、字段名、键字段名) 29:参照定义(R表示只有当17列为空,19-28非空时有效,表示当前字段是一个参照字段,BLANK=当前字段非参照字段) 30-34:字段长度 35:数据类型 36-37:小数点位置定义(0-31有效),当19-28列定义为非数字型字段时,本拦应为空 45-80:功能定义,用于定义各种关键字 关键字的使用大大丰富了DDS的文件定义。分为

文件级,位于记录名之前,主要包括

REF:指定被参考文件 UNIQUE:键值唯一

FIFO,FCFO,LIFO:相同键值记录的排列规则,有UNIQUE时,就不能用 记录级,位于记录名和第一个字段名之间,主要有

FORMAT:共享其他文件的记录格式 TEXT:记录格式说明

字段级,关键字位于一个字段名和其下一个字段名或第一个关键字段名之间,包括

COLHDG:为数据库文件中字段显示和打印用

REFFLD:参考一个已定义的字段,允许字段长度和参考的字段不同,可用+N或-N来改变字段长度 关键字段级,关键字位于第一关键字段名和其下一个关键字段名或成员尾之间,主要包括

DESCEND:按降序排列,可用于字符或数值型键字字段 ABSVAL:按绝对值顺序排序

3.建立物理文件

定义好源物理文件后,可以建立物理文件,来对数据进行承载。 CRTPF SGMOBJ/DBREF SGMSRC/RDTASCF DBREF CRTPF SGMOBJ/STGDA SGMSRC/RDTASCF STGDA 如果建立物理文件时,要求有多成员,则要修改MAXMBRS参数值,可以指定为无限定(*NOMAX) 若要增加新成员,可以通过命令ADDPFM 命令完成,也可通过GO CMDMBR命令,再选4来完成。

4.数据输入

通过交互式SQL的INSERT 命令 用工具DFU的UPDDTA功能 通过程序输入

通过CPYF命令从其它数据文件中拷贝数据

61676237.doc – 第 8 页 共 39 页

5.字段参考文件

相当于数据字典,一般字段参考文件是没有成员和关键字定义的。

建立逻辑文件

1.逻辑文件的结构可以很简单,也可很复杂。主要有四类:

A.简单逻辑文件,把单个物理文件或表映射到逻辑记录定义 B.多重格式逻辑文件,允许对几个物理文件存取,每个物理文件都有自己的记录格式定义。这种逻辑文件只能通过DDS创建,不能用SQL创建。 C.联接逻辑文件,从多个物理文件或表、逻辑文件或视图中组合字段,给出单个记录定义 D.SQL视图类似于联接逻辑文件,和联接逻辑文件的区别主要是实现方法不一样,联接文件对每次联接进行维护或共享存取路径,而SQL视图在运行时通过查询定义模板找到需要的存取路径

2.简单逻辑文件定义

简单逻辑文件定义和物理文件定义类似,只是逻辑文件在DDS的关键字中增加一些与关系操作有关的内容:

记录级

PFILE:定义包含逻辑文件处理数据的物理文件 字段级

RENAME:更改一个字段的名称(其他属性不变)

CONCAT:可以将物理文件的多个字段合并成逻辑文件的一个字段,例通过CONCAT(STRYR STRMO STRDA)可以将三个字段合并成一个新的字段SEQDAT。 SELECT(选择)/OMIT(跳过)级关键字 当DDS表格中的第17列为S或O时,就说明该行第19-28位置是SELECT/OMIT字段名,该行的关键字就是SELECT/OMIT级关键字,该关键字具备筛选记录功能

ALL:选择或排除不满足以上任何S/O条件的记录 COMP:字段与字段或某值比较 VALUE:字段是否存在于一值列表中 RANGE:字段是否在一个指定范围内

3.建立逻辑文件,可通过CRTLF命令来建立逻辑文件(编译)

CRTLF SGMOBJ/STGDL1 SGMSRC/RDTASCF STGDL1

61676237.doc – 第 9 页 共 39 页

1.3 RPG 语言

OPM (原始程序模型)RPG语言是一种定格式、面向过程、结构化开发语言,它的优点主要体现在可以很方便的对数据库文件进行操作,而且效率非常的高,它是AS/400上一种最主要的开发语言之一。

ILE(集成语言环境) RPG/400,集成化语言环境下的RPG具有更强功能、编程变得更简便,ILE一组新的工具和相关的系统支持,是为在AS/400系统上增强程序开发而设计的,只能由通过新ILE系列的编译器产生的程序开发这种新模型的能力,该系列包括ILE RPG/400、ILE COBOL/400、ILE C/400、ILE CL。把OPM RPG 转换成ILE RPG可以通过命令CVTRPGSRC来实现。

结构化程序语言

RPG程序可以用工具SEU来编辑,它的格式固定,大致可以分为

条件指示器 操作数1 操作码 操作数2 结果 结果指示器

RPG里的三种程序结构

1.顺序操作:流水作业,没有程序语句转移 2.条件转移操作 A.IF ELSE ENDIF结构 OPM RPG A IFXX B A ANDXX C 。。。 ELSE 。。。 ENDIF XX:EQ、HT、NE等 B.SELECT WHEN OTHER ENDSL结构 ILE RPG SELECT WHEN AXB 。。。 OTHER 。。。 ENDSL ‘X’:=、>、<、<>等 61676237.doc – 第 10 页 共 39 页

ILE RPG IF A X B AND AXC 。。。 ELSE 。。。 ENDIF ‘X’:=、>、<、<>等 OPM RPG SELEC A WHXX B( 。。。 OTHER 。。。 ENDSL XX:EQ、GT、LT、NE等

其他还有CASXX、GOTO、EXSR(执行子程序)转移操作

3.重复执行某一操作/循环 A.DO ENDDO OPM RPG DO 10 Y 2 0 。。。 ENDDO ILE RPG DO *HIVAL IF Y>10 LEAVE ENDIF 。。。 EVAL Y = Y+1 ENDDO B.DOW ENDDO OPM RPG Y DOWLE 10 。。。 1 ADD Y Y ENDDO

其他还有DOUXX/DOU重复执行操作

ILE RPG DOW Y<=10 。。。 EVAL Y = Y+1 ENDDO 操作码

1.算术运算

ADD: RESULT = FACTOR1/RESULT + FACTOR2 SUB: RESULT = FACTOR1/RESULT + FACTOR2 Z-ADD: RESULT = 0 + FACTOR2 Z-SUB: RESULT = 0 - FACTOR2

MULT: RESULT = FACTOR1/RESULT * FACTOR2 DIV: RESULT = FACTOR1/RESULT / FACTOR2 MVR: RESULT = 上一个DIV操作的余数 SQRT: RESULT = FACTOR2的平方根 XFOOT: RESULT = FACTOR2数组的和

61676237.doc – 第 11 页 共 39 页

2.赋值操作

MOVE:RESULT = FACTOR2(右靠齐,字符型变量和P形变量可以互相赋值) 如果FACTOR2的长度小于RESULT的长度,则RESULT的其余部分保持不便; 如果FACTOR2的长度大于RESULT的长度,则FACTOR2种的多余部分将被忽略; MOVEL: RESULT = FACTOR2(左靠齐,字符型变量和P形变量可以互相赋值) 如果FACTOR2的长度小于RESULT的长度,则RESULT的其余部分保持不便; 如果FACTOR2的长度大于RESULT的长度,则FACTOR2种的多余部分将被忽略; MOVEA: RESULT = FACTOR2 (RESULT必须是个使用DIM定义的数组,FACTOR2可以是数

组,变量,常量,*BLANKS, *ZEROS, *ALL'XXX'。详细图解清参考RPG FOR AS/400 REFERENCE)

3. 比较操作:

COMP: FACTOR1与FACTOR2比较的结果由指示器表示 VAR1 COMP VAR2 99 *IN99 IFEQ ’1’

。。。 ENDIF

CABXX: FACTOR1与FACTOR2比较,如果结果为真的话就转移到RESULT指示的TAG VAR1 CABXX VAR2 TAG1 VAR1 CABXX VAR3 TAG2 ??.. TAG1 TAG ??.. TAG2 TAG ??.

CASXX: FACTOR1与FACTOR2比较,如果结果为真的话就执行RESULT指示的子程序

VAR1 CASXX VAR2/CONST SUBROUTINE1 VAR3 CASXX VAR4/CONST SUBROUTINE2 VAR5 CASXX VAR6/CONST SUBROUTINE3 CAS SUBROUTINE4 ENDCS

例:

DA1 S 2 0 INZ(50) DA2 S 2 0 INZ(20) C A1 DSPLY C A2 DSPLY C A1 CASGT A2 S#001 C A1 CASLT A2 S#002 C ENDCS C ENDPGM TAG

61676237.doc – 第 12 页 共 39 页

C EVAL *INLR = '1' C RETURN C S#001 BEGSR C 'A1>A2' DSPLY C GOTO ENDPGM C ENDSR C S#002 BEGSR

4.程序操作:

BEGSR: 子程序开始 ENDSR: 子程序结束 EXSR: 执行子程序 例:

SUB0001 BEGSR

EXSR SUB0001

???. ENDSR

注释:每一个程序中都可以有一个特殊的子程序*INZR,它无论被放在程序的什么部分都会被首先执行

*INZR BEGSR ??? ENDSR

程序例外出错检测子程序,当程序发现例外出错时,自动执行该子程序,做出下一步处理

*PSSR BEGSR 。。。 ENDSR

DABC S 3 0 DIM(10) DX S 2 0 C C MOVEA 1 ABC(X) C ABC(1) DSPLY C C ENDPGM TAG C EVAL *INLR = '1' C RETURN C C *PSSR BEGSR C 'SYS ERR' DSPLY C GOTO ENDPGM C ENDSR

61676237.doc – 第 13 页 共 39 页

5. 调用和转移操作:

CALL: 调用一个外部程序,该程序可以是RPG、CL或C程序等 CALL 'COUNT' PARM P1 PARM P2 RETRN/RETURN: 返回上一层程序,

6. 文件操作:

A. CHAIN: 用纪录号或键值从一个文件查找,如果文件是使用I方式打开的话,此操作不会在记录上加锁;如果使用U方式打开的话,就会。 MOVE ‘ABCD’ WWACNO

N1N2N3 WWACNO CHAIN FACNO(记录格式名) 8899 *IN88 IFEQ ‘1’

(RPG IV)或 IF *IN88 = ‘1’ (RPG IV)或 IF *IN88

(RPG IV)或 IF NOT %FOUND

MOVE ‘FER0001’ WWMGID GOTO ENDPGM ENDIF

*IN99 IFEQ '1' 纪录被锁 MOVE 'FER0002' WWMGID GOTO ENDPGM ENDIF ?? ENDPGM TAG

MOVE '1' *INLR RETRN

ACKEY KLIST

KFLD WWACNO KFLD WWSBNO MOVE ‘ABC’ WWACNO Z-ADD 10 WWSBNO

ACKEY CHAIN(N) FACNO(记录格式名) 8899 仅查找,不锁记录 *IN88 IFEQ '1'

MOVE 'FER0001' WWMGID GOTO ENDPGM ENDIF

*IN99 IFEQ '1'

MOVE 'FER0002' WWMGID

61676237.doc – 第 14 页 共 39 页

GOTO ENDPGM ENDIF ??.. ENDPGM TAG

MOVE '1' *INLR RETRN

B. CLOSE: 关闭文件(通常情况下,如果是注明用户打开的文件,在程序结束之前要CLOSE将文件关闭,如果是系统自动打开的文件,在程序结束时会自动关闭) CLOSE ACNOA(文件名)

C. OPEN: 打开文件,在程序对多成员文件进行操作时一般需要由用户自行打开和关闭数据文件

OPEN ACNOA(文件名)

D. COMIT/COMMIT: 文件修改落实,在文件定义(F表)中指明文件要由落实机制控制(COMMIT参数)

E. ROLBK/ROLBK : 文件修改回滚,在文件定义(F表)中指明文件要由落实机制控制(COMMIT参数)

F. DELET/DELETE: 删除记录

DELET FACNO(记录格式名)

G. EXFMT: 显示输出一个显示记录,并从标准输入读取数据 EXFMT CHOICE(一般文件显示记录格式名)

H. READ: 读一条记录

N1N2N3 READ FACNO(记录格式名) 99 *IN99 IFEQ '1'

(RPG IV)或 IF %EOF(到文件末)

MOVE 'FRD0001' WWMGID GOTO ENDPGM ENDIF

I. READE: 从当前记录位置开始寻找一个等于键字的记录,并读取 MOVE ‘A124’ WWACNO

N2N3

WWACNO READE FACNO 8899

*IN88 IFEQ '1' 纪录被锁

MOVE 'FER0002' WWMGID GOTO ENDPGM ENDIF

*IN99 IFEQ '1' 无匹配记录

(RPG IV)或 IF *IN99 = ‘1’ (RPG IV)或 IF *IN99

(RPG IV)或 IF NOT %FOUND

MOVE 'FER0003' WWMGID GOTO ENDPGM

61676237.doc – 第 15 页 共 39 页

N2N3 8899 纪录被锁

MOVE 'FER0002' WWMGID GOTO ENDPGM ENDIF

*IN99 IFEQ '1' 遇到文件头

(RPG IV)或 IF %BOF(到文件末)

MOVE 'FER0003' WWMGID GOTO ENDPGM ENDIF

K. SETLL: 从文件第一条记录开始逐条查询,直到找到第一条符合条件的记录,此记录的键字大于或等于FACTOR1指定的键值。但只是将文件指针指向此记录的上方,并不读出(可以使用READ读下一记录)。

L. SETGL: 从文件第一条记录开始逐条查询,直到找到第一条符合条件的记录,此记录的键字大于FACTOR1指定的键值。但只是将文件指针指向此记录的下方,并不读出(可以使用READP将上一条记录读出)。 例如:

有一物理文件:学生成绩表,记录格式名为RSTT,字段属性是,成绩GRADE(3S0)、姓名NAME(10 O),成绩是键值,储存数据如下:

成绩(K) 姓名 80 张一 85 张二 88 张三 88 李一 92 李二

显示将成绩大等于90的学生姓名(结果只有显示李二)

MOVE 90 CJ 3 0

CJ SETLL RSTT(记录格式名) READ RSTT DO 1 IF %EOF LEAVE ENDIF GRADE DSPLY

READ RSTT ENDDO

显示将成绩小等于85的学生姓名(结果显示张二和张一) MOVE 85 CJ 3 0

CJ SETGT RSTT(记录格式名)

61676237.doc – 第 16 页 共 39 页

J. READP: *IN88 ENDIF

读取当前记录位置的上一条记录 READP FACNO IFEQ '1'

GRADE READ DO IF LEAVE ENDIF DSPLY READP ENDDO

P RSTT 1 %BOF

RSTT

注意:SETLL与SETGT只是对文件记录进行定位,并没有读记录,必须结合使用READ或READP等读记录语句一起使用,使用的文件必须带键值

M. UNLCK: 解除记录锁

UNLCK FIDNO(记录格式名)

N. UPDATE: 更新数据库记录

EVAL ACKEY = 10

ACKEY CHAIN FACNO

EVAL ACNM ='Leon Davis'

UPDATE FACNO(记录格式名) 99(N2) *IN99 IFEQ '1' 更新文件失败 (RPG IV)或 IF %ERROR

EVAL 'UDR0001' WWMGID GOTO ENGPGM ENDIF

O. WRITE: 写文件记录 EVAL

WRITE FACNO(记录格式名) 99(N2)

*IN99 IFEQ '1' 写文件失败 (RPG IV)或 IF %ERROR

EVAL 'WTR0001' WWMGID GOTO ENGPGM ENDIF

注意:在RPG中使用文件操作一定要注意控制好文件定位操作和锁表问题,不要在一个程序链中同时打开某一个表进行修改。

7.信息操作:

1. DEBUG: 用来在有问题的程序中显示所有状态为'1'的指示器 2. DUMP: 在调试程序的时候,可以将程序运行到当前位置时所有变量和指示器的值打印在一个spool file 中。

3. TIME: 取系统时间

TIME TM_VAR(6或12位数字的数字型字段名)

4. DSPLY: 允许程序与系统控制台之间或和程序要求的显示工作站之间进行通讯。 VAR1 DSPLY

61676237.doc – 第 17 页 共 39 页

VAR1 DSPLY *QSYSOPR RESP_VAR VAR1 DSPLY RESP_VAR

注释:如果是个批作业那么因子2的默认值是QSYSOPR(系统操作员),如果是个交互式作业,那么作业2的默认值是*EXT(信息发往请求者)

8.说明操作:

1. DEFN/DEFINE:数据区(data area):在因子2说明一个数据区的外部名或*LDA说明为一个局部数据区,如果在因子2为空,则结果字段上登记的是该数据区的外部名

*LIKE DEFN WWACNO XXACNO(字段名) *NAMVAR DEFN TOTAL TATNET(可以是字段名、数据结构名、 数据结构子字段等)

*NAMVAR DEFN TOTAL(外部定义数据区)

2. KLIST & KFLD: 定义复合键字,用于复合键字逻辑文件。 ACKEY KLIST

KFLD ACNO KFLD ACSN

3. PLIST :表示一个参数列表,如果参数列表是一个被调用的输入参数列表,因子1必须是*ENTRY

PARM : 定义组成一个参数列表的参数,可以随在一个PLIST和CALL之后 WWPARM PLIST

PARM ACNO PARM ACSN CALL PGMA

PARM P1 PARM P2

9.数据区操作

1.IN :检索一个数据区并可选择允许你指定是否允许其它的程序更新这个数据区,IN检索的数据区,必须在*NAMVAR DEFN 语句的结果字段上说明。

当因子1是保留字*LOCK时,该数据区已上锁,直到执行一个UNCLK操作或执行因子1上为空的OUT操作或程序结束情况之一方可解琐。

当因子2是保留字*NAMVAR时,检索程序中定义的所有数据区,当遇到错误时,如结果指示器未指定,可以说明异常情况/程序例外错监控子程序(*PSSR)来处理。

2.OUT :更新一个数据区更新之前,必须先做两件事,其一,该数据区必须在一个*NAMVAR DEFN语句的结果字段上说明,其二,该数据区必须用一个*LOCK IN语句预先上锁。它的因子1是*LOCK时,更新之后保留上锁状态,因子1是空时,更新之后不上锁。当因子2是局部数据区时,因子1必须是空。当因子2为保留字*NAMVAR时,程序中定义的所有数据区都被更新,更新发生错误时,处理方式同IN操作。

C *DTAARA DEFINE SSCDTAARA DTAARA 5 C *LOCK IN DTAARA

61676237.doc – 第 18 页 共 39 页

C DTAARA DSPLY C EVAL DTAARA = %SUBST(DTAARA:1:3) C DTAARA DSPLY C

C OUT DTAARA

3.UNLCK/UNLOCK:解锁一个数据区,一个数据区可以和UNLCK操作联用之前,它必须在一个*NAMVAR DEFN语句的结果字段上说明,因子2必须是一个数据区名或保留字*NAMVAR,当因子2是NAMVAR时,程序中所有上锁的数据区都被解锁。 UNLOCK DTAARA1 UNLOCK *NAMVAR

10.其它操作:

1.LOKUP/LOOKUP:

SRCHNO LOOKUP ARR 11( = EQ) 在数组ARR中查找等于SRCHNO的元素,找到时结果指示器为ON 2.XFOOT: 求一个数组中所有元素的和 XFOOT ARR SUM 3.SORTA: 给一个数注重的元素排序 SORTA ARR 4.MOVEA: 数组传递

MOVEA *BLANKS ARR(X)(从第X元素开始,ARR的其余部分是空格) MOVEA *ALL'XY' ARR(X)(从第X元素开始,ARR的其余部分给‘XY’)

MOVEA ARRX ARRY(3)(自数组ARRX第一元素起传递给数组ARRY的自第3个元素起的元素)

MOVEA ARRX ARRY

MOVEA ARRX(3) ARRY(自数组ARRX第3元素起传递给数组ARRY的自第1个元素起的元素)

MOVEA FLDA ARR

FLDA ARR

1234567 传送前 |986|543|210|ABC| 1234567 传送后 |123|456|710|ABC|

MOVEA ARR FLDA

ARR FLDA |01|0A|02|0B|O3|0C| 传送前 01OA |01|0A|02|0B|O3|0C| 传送后 02OB

61676237.doc – 第 19 页 共 39 页

ILE RPG对RPG/400的扩充

1.ILE RPG基本概念 过程(PROCEDURE)

是一组字包含的高级语言语句的集合,它执行特定的任务然后返回调用者。MODULE中的PROCEDURE已经可以被其他任何ILE程序共享,当然,作为ILE语言之一,ILE RPG也可以调用任何ILE子程序(包括ILE RPG本身)。

模块对象(MODULE)

是不可运行的对象,在系统中使用符号为*MODULE来代表模块对象。它是建立可运行ILE对象的基本构件块。我们也可以使用CRTRPGMOD命令将一个程序编译成MODULE。

我们还可以将一个或者多个MODULE共同编译成一个服务程序,供其它应用系统调用。当然,我们可以使用其它第三方厂商提供的服务程序,或者将我们自己的程序编译成一个服务程序作为第三方产品提供给客户。这种服务程序实际上就是一个函数库。在AS/400中,系统API也都是通过这种方式提供的。

PROCEDURE和MODULE都是ILE和OPM之间的显著区别。

ILE程序

可运行的对象,在系统中使用符号为*PGM来代表ILE程序对象(和OPM RPG一样)。

编译RPGLE程序有两种方式: 1.对于单独一个RPGLE程序,我们可以使用命令CRTBNDRPG(与在PDM中使用14同)将一个单独的程序变成一个可执行程序。这个命令实际上实现将RPGLE程序编译成一个临时的MODULE然后再将它编译成一个可执行程序。 2.我们也可以先使用CRTRPGMOD命令将一个程序编译成MODULE,然后再使用CRTPGM将这个MODULE和其他MODULE一起编译成一个可执行程序。使用这种方法的好处就是可以利用其它MODULE中的子程序。当然这个程序自己的子程序也可以被其他的ILE程序共享。

服务程序

是一个由可运行的过程和可用数据项组成的集合。其他的ILE程序和服务程序可以直接地存取这些过程和数据项。在许多方面,服务程序类似于子程序库或过程库。

61676237.doc – 第 20 页 共 39 页

联编目录

包含建立ILE程序或服务程序时可能需要的模块和服务程序的名称。是一个系统对象,对系统用符号*BNDDIR来表示。当建立ILE程序或服务程序时,联编目录提供了将可能用到的模块或服务程序打包在一起的便利方法。例如,一个联编目录可能包含提供数学函数的所有模块和服务程序。当想要使用其中的一些函数时,只需指定一个联编目录而不用将使用的每个模块或服务程序都指定。

对程序和过程的调用

ILE程序中既可以调用程序也可以调用过程。ILE语言通过调用语句CALL和CALLP或CALLB来标识调用的目标是程序还是过程。

1.动态程序调用

使用call调用*pgm程序其实是在程序运行时将被调用的程序转换成地址,因此可以将这种方式称之为动态调用。动态程序调用包括:

A.OPM程序可以调用一个OPM程序或ILE程序

B.ILE程序可以调用一个OPM程序或另一个ILE程序 C.服务程序可以调用OPM程序或ILE程序 2.静态过程调用

使用callp调用procedure是在binding(联编)的时候将被调用的程序转换位地址,因此可以被称之为静态调用。静态调用在效率上比动态调用高。可以用静态过程调用来调用下列任何项:

A.在同一模块内的对象

B.在同一个ILE程序或服务程序内的一个单独模块中的过程 C.在一个单独的ILE服务程序中的过程

CALL, CALLB, CALLP的区别:

CALL只能调用*PGM, 是动态调用,程序运行效率低。CALLB和CALLP都只能调用PROCEDURE,大部分时候是静态调用,只有调用指针变量中所指的PROCEDURE时才是动态调用;但是CALLB不参加接口合法性检查,即:不需要原型说明,因此在运行时可能会导致一些错误。CALL 和CALLB都只能使用固定格式的实参传递,即:使用PLIST。

RPG IV中的全局变量与局部变量:

每一个OPM程序都只有一个唯一的程序入口,但是在ILE程序中每一个Procedure都可以有一个入口。在OPM程序中每一个内部子程序的变量都是全局变量,但是在ILE程序的Procedure中声明的所有变量都是局部变量,其余所有用到的变量都是全局变量。如果在Procedure中声明的变量和某一全局变量同名的话,那么这两个变量将在内存中使用不同的两个空间,也就是说这两个变量将互不影响,同名的那个全局变量将不被此procedure 使用。局部变量也将在此procedure执行完成后被全部释放。

活动组(Activation Group)

活动组是一个作业的子结构,由系统资源组成,例如:存储器、提交机制、文件打开、

61676237.doc – 第 21 页 共 39 页

重定向文件(Override files)。这些资源被分配给活动组以运行一个或者多个ILE或者是OPM程序。活动组使得我们可以在一个作业中相对独立地运行一些程序,而这些程序之间不会互相影响(如:Commitment Control & Overrides)。 一个程序所属的活动组是在编译它(CRTPGM & CRTSRVPGM)的时候指定的,但是OPM程序只能运行在默认的活动组中,不能改变。如果使用CRTBNDRPG来编译程序,那么只有在DFTACTGRP的值为*NO时才可以指定ACTGRP,DFTACTGRP的默认值是*YES,此时程序就运行在DFTACTGRP中。 活动组可以选以下几种值: 1. a named activation group 一个指定名称的活动组可以将您的ILE程序和服务程序作为一个整体来管理。这样的一个活动组是在第一个属于该组的程序被调用的时候被建立。 用户可以使用了RCLACTGRP命令删除一个活动组。但是,必须是在这个活动组没有被使用的时候才能被删除。 2.*NEW 如果我们为ACTGRP指定了*NEW,那么这个程序在任何被调用的时候都会重新生成一个新的活动组, 系统会自动为这个ACTGRP指定一个在这个JOB中唯一的一个名称。 一个以*NEW方式产生的活动组总是在生成它的那个程序结束时被系统自动删除(无论这个程序是不是以*INLR=*ON的方式退出的)。因此,如果你想使用*INLR=*OFF的方式结束一个程序,以便保持这个程序仍为Active 状态,那么你就不应该为此程序在ACTGRP参数指定*NEW。 注意:*NEW对于SERVICE PROGRAM是不适用的。SERVICE PROGRAM只能使用Named group or *CALLER。CRTPGM的ACTGRP默认值是*NEW。CRTBNDRPG的默认值是DFTACTGRP。 3.*CALLER 此参数将使得被调用的程序被激活在调用它的那个程序所属的活动组中。 对于OPM程序来说,它只能运行在*DFTACTGRP中。在以下两种情况下,ILE程序将也会运行在*DFTACTGRP中:

A.ILE程序在编译时使用了DFTACTGRP(*YES)。 B.ILE程序在编译时使用了DFTACTGRP(*NO) ACTGRP(*CALLER),并且此程序被一

个OPM程序调用。

注意:通常情况下,如果我们在编译程序的时候不对有关Activation Group的参数进行任何修改,那么我们的程序都会运行在DFTACTGRP中,也就是说,我们的一个JOB实际上就只有一个活动组,因此我们的override 和 commitment control也都是在整个作业的范围内起作用的。

*NEW, DFTACTGRP(*YES), NAMED ACTIVATION GROUP的区别: *NEW类型的活动组在与此活动组相关的子程序RETURN(不管*INLR的值如何)时被删除,也就是在作业还没有结束的时候就会被删除,此时此活动组的所有资源都被释放。 NAMED ACTIVATION GROUP只有在整个作业结束的时候或者是在用户使用显式的RCLACTGRP时才会被删除。程序占用的存储器空间也只有这时才会被释放。 DFTACTGRP中,只有在程序以*INLR=‘1’的方式退出或者非正常退出的情况下才会释放他占用的存储器空间。因为ACTGRP=*CALLER而运行在DFTACTGRP中的程序只有

61676237.doc – 第 22 页 共 39 页

用户在签退的情况下(交互式作业Interactive Job)或者是作业运行完毕(批作业Batch Job)的情况下才会被释放占用的内存。 注意:如果系统中有许多程序在占用存储器,那么系统就可能因为存储器资源不够而瘫痪。因此,我们必须避免让大量的程序都运行在DFTACTGRP中,因为这时存储器只有在作业停止的时候才会被系统回收。 服务程序的资源只有在它运行的活动组结束的时候才会被系统回收。如果服务程序是运行在DFTACTGRP中,那么只有在整个作业运行结束后系统才会回收它所占用的资源。 我们可以使用RCLACTGRP命令来删除一个Named Activation Group。 RCLRSC命令可以用来回收那些已经结束但是*INLR=*ON的程序所占的资源。

2.表达式的使用及可使用表达式的操作码 表达式中的有效操作符

1. 一元操作符:

+ 保持原来的数值 - 取原来数值的相反值 NOT 逻辑取反

例如:如果A=12.8 那么-A就等于-12.8 2. 二元操作符:

+ 两个数值相加;连接两个字符串或者是图形变量;给一个指针变量加偏移量

- 两个数值相减;修改指针偏移量;两个指针变量相减

* 两个数值相乘 / 两个数值相除

** 求幂,例如2**3=8,即2的3次方为8 = 判断两个变量是否相等,‘1’相等,‘0’不等 <> 判断两个变量是否不等 > 大于 < 小于 >= 大于等于 <= 小于等于 AND 逻辑与操作 OR 逻辑或操作 3. 嵌入式函数:

4. 用户自定义函数: 例如:

C IF MYFUNC(STRING1)=%TRIM(MYFUNC(STING2))

C EVAL %SUBST(X:3)=MYFUNC(‘ABC’) C ENDIF

61676237.doc – 第 23 页 共 39 页

表达式中结果字段的数据类型

1.+ — *

如果操作数中至少有一个浮点数类型的变量,那么结果字段为浮点数

否则,如果操作数中至少有一个操作数是packed-decimal或zone-decimal或binary类型,那么结果字段是packed-decimal

否则,如果两个操作数都是integer或unsigned integer,那么结果字段是integer或者unsigned integer

一个最多十个数字并且小数位为0的数字变量会被认为是整形数 2./

如果两个操作数中至少有一个浮点数,那么结果就是浮点数,否则的话结果就是packed decimal类型

3.**

结果是float类型

表达式中的数据精确度

RPG IV必须决定它的表达式中的每一个中间结果的格式(format)和精确度,而在RPG III中,程序员必须指定每一个独立运算的结果被放入哪一个变量中去,也就是说RPG III每一步计算结果的格式和精确度都是由程序员指定的。

如果一个计算的结果是浮点数、整数或者是无符号整数,那么精确度就是这个结果的长度。但是,如果一个计算的结果是packed decimal或者zone decimal 或者binary, 那么计算结果的精确度取决于参与运算的操作数。RPG IV最大支持30位长度的操作数,因此如果运算结果的长度超过了30位的话,结果字段会被调整到30位长,剩下的位数将被切除。

1.默认情况下,为了减少溢出的可能性,表达式得到的结果会尽可能的长 2.“result decimal position”和默认情况下的工作是一样的,任何中间值的小

数点位数都不会低于最终结果要求的小数点位数。除非操作涉及到向一个数值变量中指定一个数值(an assignment to a numeric variable)或者是涉及到转化成一个明确小数点位数的精度。

在实际中,你不用担心精确度,只要你在编译时注意了编译列表(compile list).当表达式中涉及到指定数值时(an assignment to a numeric variable),我们可以通过在result decimal position位上指定(R)来确保小数位精确度被保持。

当result decimal position无法被使用时,我们还可以使用TC来将结果的精确度降低,以防止小数位丢失。使用TC可以用来指定中间结果的小数位位数不能低于TC指定的位数。

可用表达式的操作码

DOU (Do Until)

61676237.doc – 第 24 页 共 39 页

DOW (Do While)

EVAL (Evaluate expression) IF (If)

RETURN (Return to Caller) WHEN (When True Then Select)

DOU

例子:

C

C C

DOU ?? ENDDO

*INKC

C* 直到F3被按下,循环中的语句至少被执行一次 C C C C C C

DOU *IN10 OR (FIELD2 > FIELD3) ?? ENDDO DOU ?? ENDDO

X > %ELEM(ARRAY)

DOW

例子: C

C C

DOW ?? ENDDO

A<=5 AND B+C=0

EVAL

例子:

C EVAL ARR(*)=FIELD2*FIELD3 C* 数组ARR的所有元素都被赋予同样的值

C EVAL RES=(FIELD1<10)+ *IN10 +(FIELD2>=5) C* 逻辑判断的值为字符形,因此RES的值就是三个逻辑判断的结果的连接,‘010’

RETURN

例子:

D*无参数返回 D RETNONE

?????? P RETNONE D RETNONE ??

61676237.doc – 第 25 页 共 39 页

PR B PI

C P RETNONE RETURN E

D*返回一个参数 D RETFIELD D PARM ?????? P RETFIELD D RETFIELD D PARM D FLD ??

C P RETFIELD D* 返回数组 D RETARRAY ?????? P RETARRAY

PR 5P 2 5I 2 B

PI 5P 2 5I 2

S 12S 1 INZ(13.8)

RETURN 7(RETURN FLD*3 / RETURN FLD) E

PR B

D DIM(3)DATFMT(*YMD/)

D RETARRAY PI D DIM(3)

D SMALLARR S DIM(2)DATFMT(*ISO) D BIGARR S DIM(4)DATFMT(*USA)

C* 如果使用下面的方法返回参数,那么接口数组中所有元素都含有相同的值 C RETURN D’1995-06-27’

C*如果使用比接口定义的数组元素个数少的数组,那么接口数组的第三个元素将 C*被赋予默认值

C RETURN SMALLARR

C*如果使用比接口定义的数组元素个数多的数组,那么多余的数组元素将被忽略 C RETURN BIGARR P RETARRAY E

WHEN

例子:

C C

C C C C

SELECT WHEN

*INKA

?????? WHEN NOT(*IN10) AND (DAY=’FRIDAY’) ??????

WHEN %SUB(A:4:3)=’ABC’ ?????? OTHER

C C

C C ?????? ENDSL

61676237.doc – 第 26 页 共 39 页

3.内嵌式函数及新增、改变的操作 内嵌式函数

?S(numeric expression)返回表达式的绝对值 -DR(variable name)返回表达式的地址

%CHAR(graphic,date,time,timestamp expression)返回字符类型的值 TC(numeric expression(:digits:decimal position)按照参数指定的数据长度和精度返回返回P类型的值 Tcpos(numeric expression)按照参数指定的小数位返回P类型的数值

%ELEM(array,table,multiple occurrence data structure name)返回元素个数

%EOF(filename)当最近一次input操作或向一个SUBFILE写操作遇到文件头或文件尾,就返回‘1’,否则返回‘0’

%EQUAL(filename)如果最近一次SETLL(for a particular file ,if specified)或者LOOKUP遇到了一个完全一致的匹配,就返回‘1’,否则返回‘0’ %ERROR无参数,如果最近一次(在EXTENDER字段填有‘E’的)操作码产生了一个错误,就返回‘1’,否则返回‘0’ %float(numeric expression)返回float类型的值 %FOUND(filename)如果最近一次对文件的操作(CHAIN、DELETE、SETGT、SETLL)、对数组的操作(LOOKUP)、对字符串的操作(CHECK、CHECKR、SCAN)成功的话,就返回‘1’,否则返回‘0’

%INT(numeric expression)返回整形的值

%LEN(any expression)返回数字或字符串的长度

%OPEN(filename)如果指定的文件的状态为打开,就返回‘1’,否则返回‘0’ %PADDR(procedure name)返回函数的指针 %PARMS无参数,返回传递给函数的参数个数

%REPLACE(替代串:被替代的串(:开始位(:替代的长度)))用‘替代串’替代‘被替代串中’的一部分

%SCAN(search argument:string to be searched(:start position))当找到STRING TO BE SEARCHED时,返回位置数,否则返回‘0’

%SIZE(variable,array,literal(:* all))返回变量或者是数组的大小 %STR(pointer(:maximum length))返回由pointer指定的字符串去掉前导空格之后的串

%SUBSTR(string:start(:length))取子串 %TRIM(string)去掉字符串的前导和末尾空格 %TRIML(string)去掉字符串的前导空格 %TRIMR(string)去掉字符串的末尾空格 %UNS(numeric expression)返回无符号数

61676237.doc – 第 27 页 共 39 页

新增操作码

新增CAT, CHECK,XLATE, CHECKR,DOU, DOW, EVAL, CALLB,CALLP等操作码。

CAT

连接字符串 C string1 CAT string2(:n) result 如果没有定义n,那么string1的后续空格和string2的前导空格都将会被作为有效字符放入result中。否则的话,string1的后续空格将被删除,但result的前导空格不会被删除。 例:

* The following example shows leading blanks in factor 2. After * the CAT, the RESULT contains 'MR. SMITH'.

C MOVE 'MR.' NAME 3 C MOVE ' SMITH' FIRST 6 C NAME CAT FIRST RESULT 9 * The following example shows the use of CAT without factor 1. * FLD2 is a 9 character string. Prior to the concatenation, it * contains 'ABC'; FLD1 contains 'XYZ

* After the concatenation, FLD2 contains 'ABC XYZ'. C MOVEL(P) 'ABC' FLD2 9 C MOVE 'XYZ' FLD1 3 C CAT FLD1:2 FLD2 * CAT concatenates LAST to NAME and inserts one blank as specified * in factor 2. TEMP contains 'Mr. Smith'.

C MOVE 'Mr. ' NAME 6 C MOVE 'Smith ' LAST 6 C NAME CAT LAST:1 TEMP 9 * CAT concatenates 'RPG' to STRING and places 'RPG/400' in TEMP. C MOVE '/400' STRING 4 C 'RPG' CAT STRING TEMP 7 *

* The following example is the same as the previous example except

* that TEMP is defined as a 10 byte field. P operation extender * specifies that blanks will be used in the rightmost positions * of the result field that the concatenation result, 'RPG/400', * does not fill. As a result, TEMP contains 'RPG/400' * after concatenation.

C MOVE *ALL'*' TEMP 10 C MOVE '/400' STRING 4 C 'RPG' CAT(P) STRING TEMP

* After this CAT operation, the field TEMP contains 'RPG/4'. * Because the field TEMP was not large enough, truncation occurred. C MOVE '/400' STRING 4

61676237.doc – 第 28 页 共 39 页

C 'RPG' CAT STRING TEMP 5 * Note that the trailing blanks of NAME are not included because * NUM=0. The field TEMP contains 'RPGIV'.

C MOVE 'RPG ' NAME 5 C MOVE 'IV ' LAST 5 C Z-ADD 0 NUM 1 0 C NAME CAT(P) LAST:NUM TEMP 10

CHECK

检查String2中是否含有不属于String1的字符。

C

N2

ER

string1

CHECK(E) string2(:N)

result

如果没有N就从string2的第一位开始检查,否则从第N位开始检查 result中会返回第一个不符合条件的字符在string2中所处的位置

如果result是一个变量,那么此指令会在遇到第一个不符合条件的字母时停止检查;如果

result是一个数组,那么此指令会持续检查直到遇到string2的结尾或者是string2中不符合条件的字母个数超过数组的元素个数。

检查完成后,我们可以使用%FOUND检查是否有不匹配的字符。 例:

* In this example, the result will be N=6, because the start * position is 2 and the first nonnumeric character found is the '.'. * The %FOUND built-in function is set to return '1', because some * nonnumeric characters were found.

D Digits C '0123456789' C

C MOVE '$2000.' Salary C Digits CHECK Salary:2 N 2 0 C IF %FOUND C EXSR NonNumeric C ENDIF

* Because factor 1 is a blank, CHECK indicates the position * of the first nonblank character. If STRING contains 'th * NUM will contain the value 4.

C ' ' CHECK String Num 2 0 * The following example checks that FIELD contains only the letters * A to J. As a result, ARRAY=(136000) after the CHECK operation. * Indicator 90 turns on.

D Array S 1P 0 DIM(7)

D Letter C 'ABCDEFGHIJ' C MOVE '1A=BC*' Field 6 C Letter CHECK Field Array 90 * In the following example, because FIELD contains only the

61676237.doc – 第 29 页 共 39 页

* letters F to G, ARRAY=(000000). Indicator 90 turns off. C MOVE 'FGFGFG' Field 6 C Letter CHECK Field Array 90

CHECKR

与CHECK功能基本相同,只是CHECK是从左边开始检查,CHECKR是从右边开始。用法完全相同。

XLATE:

N2

C FROM:TO XLATE(E) STRING:START_POS TARGET ER

从START_POS开始,将字符串STRING中的符合条件(存在于FROM中)的字符替换成相应的(TO中)另外一个字符 例:

* The following translates the blank in NUMBER to '-'. The result * in RESULT will be '999-9999'.

C MOVE '999 9999' Number 8 C ' ':'-' XLATE Number Result 8 例:

D Up C 'ABCDEFGHIJKLMNOPQRS-

D 'TUVWXYZ' D Lo C 'abcdefghijklmnopqrs- D 'tuvwxyz' * In the following example, all values in STRING are translated to * uppercase. As a result, RESULT='RPG DEPT'. C MOVE 'rpg dept' String 8 C Lo:Up XLATE String Result * In the following example only part of the string is translated to lowercase. As a result, RESULT='RPG Dept'.

C Up:Lo XLATE String:6 Result

新增位操作

新增位操作有TESTB

TESTB:

使用方法如下: indicators C TESTB bit_numbers Character_field N1 N2 N3 当factor2中指定的所有位都为off时,N1=*on 当factor2中指定的位中至少有一个为on时,N2=*on;但是,当factor2中只指定了一个位时,N2无效

61676237.doc – 第 30 页 共 39 页

改变了一些操作码的写法

RETRN?RETURN UPDAT?UPDATE LOKUP?LOOKUP COMIT->COMMIT DEFN->DEFINE DELET->DELETE EXCPT->EXCEPT REDPE->READPE SELEC->SELECT SETOF->SETOFF UNLCK->UNLOCK

附:RPG III 与 RPG IV 的实体名称长度区别

Description Field/Array Name DS Name Record Name File Name Max Number of Files Character Field Size Named Constant DS Size No of Decimal Places No of Array Elements No of Subroutine

RPG III 6 6 8 8 50 256 256 9999 9 9999 256

RPG IV 10 10 10 10 None 32767 1024 32767 30 32767 None

4.可视化调试(源级调试)

ILE 提供允许源级调试的调试程序,可随列表文件一起使用调试程序,并且允许设置中断点、显示变量或进入或跨过一条指令。执行这些操作不一定要通过命令行输入命令。可以通过热键实现。

预备工作:在使用CRTRPGMOD或者CRTBNDRPG编译程序的时候,将参数DBGVIEW设置为*SOURCE。

开始调试程序:

STRDBG PGM(MYLIB/MYPGM) UPDPROD(*YES)

61676237.doc – 第 36 页 共 39 页

结束调试:

ENDDBG

调试命令:

F16

使调试窗口显示的源程序向上/下/左/右滚动: 向上滚: UP 行数 向下滚: DOWN 行数 向左滚: LEFT 行数 向右滚: RIGHT 行数 向上滚到程序头: TOP 向下滚到程序尾: BOTTOM 在调试窗口显示下一个断点: NEXT 在调试窗口显示上一个断点: PREVIOUS 显示在线帮助: HELP 结束程序: F3 显示上一个用过的调试命令: F9 单步执行: F10 运行到下一断点处: F12 察看当前所有的WATCH变量: F18 调出命令窗口: F21 进入一个被调用的程序(STEP INTO): F22 显示输出画面: F23

显示一个变量的值:

EVAL 变量名/结构名 热键:F11 显示一个指针变量的值: EVAL 变量名:C 显示字节数 改变一个变量的值: EVAL 变量名=xxxx 显示一个变量的属性: ATTR 变量名 删除一个断点: CLEAR 行号 热键:F6 删除一个WATCH: CLEAR WATCH 变量名 增加一个断点: BREAK 行号 热键:F6 向前执行N行: STEP 行数

增加一个WATCH:使程序停止在一个指定变量的值发生变化的时候 WATCH 变量名 热键:F17 在源程序中查找一个字符串: FIND 字符串 反复查找热键:

热键:F19 热键:F20

61676237.doc – 第 37 页 共 39 页

1.4 举例 学生成绩管理

1.建库、源文件、物理文件成员、 逻辑文件成员并编译成员

A.建立一个库 STDLIB

CRTLIB STDLIB *PROD

B.在库STUDENT下建立一个源文件 STDSRCF

CRTSRCF FILE(STDLIB/STDSRCF) IGCDTA(*YES) TEXT('SRCPF FOR STUDENTS')

C. 在库STUDENT源文件 STDSRCF下建立物理文件成员REFF(数据字典)和STDPF

STRSEU F4 或进入STDSRCF下按F6

STRSEU SRCFILE(STDLIB/STDSRCF) SRCMBR(REFF) TYPE(PF) TEXT('pf for student’)

STRSEU SRCFILE(STDLIB/STDSRCF) SRCMBR(STDPF) TYPE(PF) TEXT('pf for student’)

D. 在库STUDENT源文件 STDSRCF下建立逻辑文件成员STDLF STRSEU F4 或进入STDSRCF下按F6

STRSEU SRCFILE(STDLIB/STDSRCF) SRCMBR(STDLF) TYPE(LF) TEXT('Lf for student’)

2.分别用DFU、SQL、和通过RPGLE程序对学生学籍进行增加、修改、查询、删除记录操作

A.DFU

UPDDTA STGDA B.SQL

增加:INSERT INTO STDPF 。。。

查询:SELECT * FROM STDPF WHERE 。。。 修改:UPDATE STDPF SET 。。。 WHERE 。。。 删除:DELETE FROM STDPF WHERE 。。。 C.RPGLE 增加记录:WRITE 查询:CHAIN

61676237.doc – 第 38 页 共 39 页

修改:UPDATE 删除:DELETE

3.编写程序实现某年段学生成绩的基本管理

1. 统计每个学生的总分并更新数据存储

2. 根据总分排出每个学生在年级的名次(SRL_GRD)

学号

姓 名

年级名次

STNUMB STNAME SRL_GRD

3. 根据总分排出每个学生在班级的名次(SRL_CLS) 班级 学号

STCLAS

姓 名

班级名次

STNUMB

STNAME SRL_CLS

4. 年级各科平均分、及格率、优秀率(及格、优秀分数线分别为60、85)

化学

语文

数学

英语

物理

平均分 及格率 优秀率

A11 A21 A31

A12 A22 A32

A13 A23

A14 A24

A15 A25

A35

A33 A34

5. 假如把学校学生分为四类A、B、C、D,他们分数线分别为A>=90、90>B>=75、75>C>=60、60>D>=0,计算各班班主任和语文教师的积分,积分=(A类学生个数*5+B类学生个数*3+C类学生个数)/总学生个数

班级

班主任

语文老师

TM_CLAS B1 B2

61676237.doc – 第 39 页 共 39 页

本文来源:https://www.bwwdw.com/article/vu2o.html

Top