1.0 ILE RPG/400简介
在使用ILE RPG/400建立程序之前,你必须对ILE RPG/400运行环境的某些特征有所了解。本部分就应该了解的以下方面提供信息:
1.1 第一章 RPGⅣ程序设计语言概述
本章在一个高层次上对RPGⅣ编程语言与其他RPG编程语言的区别作了介绍。在用RPGⅣ语言编程之前,必须熟悉并适应所有的这些特性。这里所讨论的特性是围绕以下几个方面的:
关于RPGⅣ的更多信息,参见ILE RPG/400参考手册。
1.1.1 RPGⅣ规范表
RPG编码是在一些规范表的格式中写的,每种规范表都有一系列特定的功能。规范表是由许多项组成的,这些项与位置有关。根据项的类型及规范表的类型,每个项必须从一定的位置开始。
有六种类型的RPG规范表。每种规范表都是可选的。这些规范表必须按照以下的顺序输入到源程序中:
1.1.2 编程周期
1、控制规范表,为编译程序提供生成和运行所需信息,例如程序名,日期格式,使用 交替对照序列或文件翻译。
2、文件描述规范表,描述了程序中使用的所有文件。 3、定义规范表,描述了程序使用的数据。
4、输入规范表,描述了程序使用的输入记录和字段。
5、计算规范表,描述了对数据所做的计算及计算顺序。计算规范表也可以控制某些输 入和输出操作。
6、输出规范表,定义了程序使用的输出记录及字段。
编写规范表 程序周期 指示器 操作码
RPGⅣ语言概述
在RPG编程中ILE各组成部分 ILE程序建立策略
当系统处理数据时,它必须按一定的顺序来进行,这个逻辑顺序是由以下几方面提供的:
由编译程序提供的逻辑叫做程序周期。当让编译程序为你的程序提供逻辑时,就叫做编程周期。
程序周期是程序在文件结束前所重复的一系列步骤。根据编写的规范表,程序可能会执行或跳过周期中的某一步。
如果你想用程序周期来控制文件,就不用在源程序里指定从文件中读取记录的相关信息。编译程序会为这些操作及某些输出操作提供逻辑顺序。
如果不想让该周期来控制文件,那么你必须建立文件结束条件,通常是设置最后记录指示器(LR)为ON。
图1显示了在一般的RPG程序周期流程中的一些步骤
1 2 3 开始
7 6 不是 5 4
是
图1 RPG程序逻辑周期
1、RPG处理所有的标题行和明细行(在输出规范表中17例为H或D)。 2、RPG读下一个记录并置记录标识指示器和控制级指示器为ON。
3、RPG处理总计计算(由控制级指示器L1到L9,或LR指示器或LO项决定)。 4、RPG处理所有的总计输出行(由输出规范表第17例是T标识)。 5、RPG判断LR指示器是否为ON。如果为ON,则程序结束。
6、被选择的输入记录字段由记录转移到处理区,RPG置字段指示器为ON。
7、RPG处理所有的明细计算(该计算规范表7-8列上没有控制级指示条件限制的), 它使用周期开始时记录中的数据。
程序结束 做详细计算 传送字段 LR为ON 写总计输出 写标题和明细行 取输入记录 做总计计算
RPG/400编译程序 程序代码
1.1.2.1 第一周期
通过程序周期的第一次和最后一次与其它周期有所不同,在第一次通过程序周期,读取第一条记录之前,程序要做三件事:
处理输入参数、打开文件、初始化程序数据。
写出由1P指示器(第一页指示器)条件限制的那些记录; 处理所有的标题和明细输出操作。
例如,在读第一条记录前,打印的标题行可能包括常量或页标题信息,或象PAGE和*DATE这样的特殊字段,在第一周期,程序还跳过总计计算和总计输出步骤。
1.1.2.2 最后周期
程序通过周期的最后一次,这时,已没有可用记录,程序置LR(最后记录)指示器和L1到L9(控制级)指示器为ON,程序处理所有的总计计算和总计输出,之后关闭所有文件,程序结束。
1.1.3 指示器
指示器是取值‘1’或‘0’的一个字节长的字符型字段。‘1’为ON,‘0’为OFF。每个指标器都有一个由两个字符构成的名字(例如:LR,01,H3),并且在某些规范表的某些项中仅以这个名字来引用,在另外的一些规范的某些项中用特殊的名字*INxx来引用,其中xx为两个字符的名字。
指示器可以是操作的结果或用来决定(或控制)操作是否执行,指示器就好比程序逻辑流程的开关,根据它们的状态,决定程序运行期间应走的路径。
你可以使用几种不同类型的指示器,每一种表示不同事件。在RPG程序中,指示器可以在规范表中用设置项的方法定义,或由程序周期本身定义。在规范表中定义指示器的位置就决定了指示器的用途。一旦在程序中定义了指示器,它就可以限制或控制计算或输出操作。
RPG程序在程序周期的特定时间设置或重设某些指示器。另外,可以在计算操作中明确地修改指示器的状态。
1.1.4 操作码
RPGⅣ编程语言允许对数据实施不同类型的操作。计算规范表中的操作码指出了要进行何种操作。例如,要读一个新记录,可以使用READ操作码。以下是可用的操作类型的列表。
算术操作 数组操作
指示器设置操作 信息操作
位操作 分枝操作 调用操作 比较操作
初始化操作 消息操作 传递操作 串操作 结构化编程操作 子程序操作 检测操作
数据区操作 说明操作 文件操作
日期/时间/时间标识操作
1.1.5 ILE RPG/400程序的例子
这部分用图讲解了一个使用ILE RPG/400程序处理工资单计算的例子。
1.1.5.1问题提出
一个公司的工资部门要打印出某周公司雇员的工资清单,假设在系统中有两个磁盘文件,EMPLOYEE和TRANSACT。
第一个文件,EMPLOYEE,存储雇员记录,下图显示了雇员记录的格式。
*EMP_NUMBER* EMP_NAME * EMP_RATE * * * * *
1 6 22 27
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..* A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++++* A R EMP_REC
A EMP_NUMBER 5 TEXT('EMPLOYEE NUMBER') A EMP_NAME 16 TEXT('EXPLOYEE NAME') A EMP_RATE 5 2 TEXT('EXPLOYEE RATE') A K EMP_NUMBER
图2雇员物理文件的DDS源语句
EMP_REC
第二个文件,TRANSACT,记录雇员们工作的时间和得到的奖金,下图显示了交易记录的格式。
TRN_REC
* TRN_NUMBER * TRN_HOURS * TRN_BONUS * * * * *
1 6 10 16
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..* A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++++* A R TRN_REC
A TRN_NUMBER 5 TEXT('EMPLOYEE NUMBER') A TRN_HOURS 4 1 TEXT('HOURS WORKED') A TRN_BONUS 6 2 TEXT('BONUS')
图3物理文件TRANSACT的DDS源语句
每个雇员的工资算法是小时数“hours”(取自TRASACT文件)和比率“rate”(取自EMPLOYEE)的乘积并加上取自TRANSACT文件的奖金“bonus”。
1.1.5.2 控制规范表
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ H DATEDIT(*DMY/)