R-P-1-2

更新时间:2024-01-11 23:30:01 阅读量: 教育文库 文档下载

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

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/)

当天的日期将以日,月,年的格式打印,并以“/”为分隔符。

1.1.5.3文件描述规范表

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...

FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords+++++++++++++++++++++++++++

FTRANSACT IP E K DISK FEMPLOYEE IF E K DISK FQSYSPRT O F 80 PRINTER

在文件描述规范表中定义了三个文件。

TRANSACT定义为输入文件,由ILE RPG/400程序周期控制从这个文件中读记录。 EMPLOYEE定义为输入的全过程文件,由计算规范表控制从这个文件中读记录。 QSYSPRT定义为输出的打印文件。

1.1.5.4 定义规范表

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... D+Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D Pay S 8P 2

D Heading1 C 'NUMBER NAME RATE H-

D OURS BONUS PAY ' D Heading2 C '______ ________________ ______ _-

D ____ _______ __________'

使用定义规范表,说明变量“Pay”储存雇员每周的工资,两个常量“Heading1”和“HEADING2”来做打印表头。

1.1.5.5 计算规范表

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...

CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..

C TRN_NUMBER CHAIN EMP_REC 99 C IF NOT *IN99

C EVAL (H) Pay = EMP_RATE * TRN_HOURS + TRN_BONUS C ENDIF

计算表的代码项包括:

CHAIN操作,用交易文件中的字段TRN_NUMBER在雇员文件中查找有相同雇员号的记录。 如果CHAIN操作成功。(指示器99为OFF),则雇员的工资值确定,结果被四舍五入并保存于变量“pay”中。

1.1.5.6 输出规范表

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...

OFilename++DF..N01N02N03Excnam++++B++A++Sb+Sa+...........................

O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformat

OQSYSPRT H 1P 2 3

O 35 'PAYROLL REGISTER' O *DATE Y 60 O H 1P 2

O 60 Heading1 O H 1P 2

O 60 Heading2 O D N1PN99 2 O TRN_NUMBER 5 O EMP_NAME 24 O EMP_RATE L 33 O TRN_HOURS L 40 O TRN_BONUS L 49

O Pay 60 '$ 0. ' O D N1P 99 2 O TRN_NUMBER 5

O 35 '** NOT ON EMPLOYEE FILE **' O T LR

O 33 'END OF LISTING'

输出规范表描述了哪些字段要输出到QSYSPRT中。

如果1P指示器为ON,那么包含字符串常量‘PAYROLL REGISTER’的标题行及明细信息的标题就会被打印出来。1P指示器是由ILE RPG/400程序在第一程序周期置为ON的。 明细行的打印由1P指示器和99指示器决定,1P指示器为ON时,明细行不打印。当找到对应的雇员记录时,99指示器为OFF,则打印明细行。如果99指示器为ON,那么打印雇员号和字符串常量‘** NOT ON EMPLOYEE FILE**’。

总计行包含字符串常量‘END OF LISTING’。它在程序的最后一次周期时打印。

1.1.5.7 完整的源程序

下图包含了这个程序中使用的所有规范表,也就是应当输入的源程序。

*------------------------------------------------------------------------* * 这个程序生成雇员每周工资的打印输出。

*------------------------------------------------------------------------*

H DATEDIT(*DMY/)

*------------------------------------------------------------------------* * 文件定义 *

*------------------------------------------------------------------------* FTRANSACT IP E K DISK FEMPLOYEE IF E K DISK FQSYSPRT O F 80 PRINTER

*------------------------------------------------------------------------* * 变量说明 *

*------------------------------------------------------------------------* D Pay S 8P 2

*------------------------------------------------------------------------* * 常量说明 *

*------------------------------------------------------------------------* D Heading1 C 'NUMBER NAME RATE H-

D OURS BONUS PAY ' D Heading2 C '______ ________________ ______ _-

D ____ _______ __________'

*

*------------------------------------------------------------------------* * 对文件(TRANSACT)的每个记录。如果找到雇员,计算他的工资且打印详细 * * 信息。

*------------------------------------------------------------------------* C TRN_NUMBER CHAIN EMP_REC 99 C IF NOT *IN99

C EVAL (H) Pay = EMP_RATE * TRN_HOURS + TRN_BONUS C ENDIF

*------------------------------------------------------------------------* * 报表格式:

*

*

*

* -- 如果1P为ON,打印标题行。 * -- 如果找到记录,打印工资详细内容,否则打印例外记录。

*------------------------------------------------------------------------* OQSYSPRT H 1P 2 3

O 35 'PAYROLL REGISTER' O *DATE Y 60 O H 1P 2

O 60 Heading1 O H 1P 2

O 60 Heading2 O D N1PN99 2 O TRN_NUMBER 5 O EMP_NAME 24 O EMP_RATE L 33 O TRN_HOURS L 40 O TRN_BONUS L 49

O Pay 60 '$ 0. ' O D N1P 99 2 O TRN_NUMBER 5

O 35 '** NOT ON EMPLOYEE FILE **'

*

* -- 当LR为ON时,打印'END OF LISTING'。 *

O T LR

O 33 'END OF LISTING'

图4 工资单计算程序的一个例子

1.1.6 使用OS/400系统

控制用户和AS/400系统所有交互动作的操作系统叫OS/400。在工作站上,OS/400允许你做以下事情:

sign on和sign off注册和注销 与显示工作站进行交互作业 使用联机帮助信息 输入控制命令和过程 对信息作出应答 管理文件

运行实用工具和程序

参考SO/400系统的资料SC41—3000,那里给出了定购的资料内容。

1.1.6.1 与系统进行交互操作

你可以使用命令语言(CL)操纵OS/400系统。进入或选择CL命令就可以与系统进行交互式操作。AS/400系统经常显示一系列的CL命令或适当的命令参数,然后由你选择想要的命令或参数。

1.1.6.1.1 常用的控制语言命令

下面列出了一些常用的CL命令以及它们功能和使用它们的原因。

表1常用的CL命令

操作

CL命令 GO MAIN GO INFO GO CMDRPG

结果 显示主菜单 显示帮助菜单 列出有关RPG的命令

使用系统菜单

GO CMDCRT GO CMDXXX CRTxxxMOD CRTBNDxxx CRTPGM CRTSRVPGM UPDPGM STRDBG ENDDBG CRTPRTF CRTPF CRTLF

CRTSRCPF

列出有关建立的命令 列出有关‘XXX’命令 运行一个程序 建立xxx模块 建立连接的xxx程序

用ILE模块建立一个ILE程序 建立一个服务程序 更新一个连接的程序目标 启动ILE源语句调试程序 结束ILE源语句调试程序 建立打印文件 建立物理文件 建立源物理文件 建立逻辑文件

调用 编译

连接

CALL程序名

调试

建立文件

1.1.7 AS/400工具

AS/400提供了有利于编程的全套工具。以下的产品可以帮助你更有效地开发ILE RPG/400应用程序。关于与这些产品有关的资料的信息,参见附录后的文献。

1.1.7.1 应用程序开发工具集/400(ADTS/400)

应用程序开发工具集/400(ADTS/400)提供了一套完整的主机环境工具。以适应应用程序开发者的需要。这套产品提供了对AS/400系统上源语句,目标及数据库文件管理的工具。其中包括PDM、SEU和SDA。它提供了菜单驱动的界面,从这里你可以完成所有与应用程序开发相关的任务,例如目标管理、编辑、编译和调试。

1.1.7.2 应用程序开发管理程序/400

应用程序开发管理程序为应用程序的开发组织提供了高效的管理,也管理应用程序生存期的目标。这一性能使得一组开发人员可以通过编程开发管理程序(PDM)界面或直接通过命令来建立、管理和组织多个版本的应用程序。

1.1.7.3 协作开发环境/400

协作开发环境/400(CODE/400)加强了程序开发能力,并减少了主机上程序开发的负载。对于RPG应用程序的开发和维护。CODE/400提供下面的工具。

语言灵敏度的编辑—包括标志高亮度,格式行,全套提示,和联机帮助。 增强语法检查—当录入语句时,对每一行的错误立即反馈。

程序校验—编译程序在没产生目标代码时就在工作站上进行全范围的语法和语义检

查。

OS/2界面,用以提交主机编译以及连接源语句级调试. DDS设计实用工具—让你方便的修改屏幕,报表和数据文件。 访问应用程序开发管理程序/400。

1.2 第二章 ILE中的RPG编程

ILE RPG/400是集成语言环境中的RPGⅣ编程语言工具。它是AS/400系统上先进的ILE编译程序之一。

ILE是AS/400系统上的一种新的编程方式。它是AS/400增强机器结构和OS/400操作系统功能的结果。ILE编译程序家族包括:ILE RPG/400、ILE C/400*,ILE COBOL/400*,和ILE CL,图5描绘了操作系统支持ILE而做的改进。它说明了对原始程序模式(OPM)和扩展程序模式(EPM)语言的支持。

OS/400

图5 集成语言环境及其在操作系统中的地位

ILE的RPG用户在以下应用开发领域实现了改进和加强。

程序建立 程序管理

C

PL/1

COBOL

CL

COBOL

CL

PASCAL FORTRAN BASIC

RPG

RPG

ILE

OPM

EMP

程序调用 源语句调试

可连接的应用程序接口(APIS)

以上几个方面内容在下面做简要介绍,详细讨论请看以后章节。

1.2.1 程序建立

在ILE中,程序建立包括。

1、把源代码编译为模块。

2、把一个或多个模块连接成为一个程序目标。

你可以使用建立连接的RPG程序命令(CRTBNDRPG),象在OPM环境中一样用一步处理方式来建立一个程序,这条命令先建立一个临时模块,然后再连接成程序目标,也允许你使用一个连接目录来连接其它的目标。

另外,你可以分别使用编译和连接命令来建立程序。这种两步的处理方式允许重复使用或更新一个模块而不用重新编译程序中的其它模块。另外,由于你可以连接任何ILE语言的模块,所以就可以建立和维护多种语言的程序。

用两步处理方式,你可以使用建立RPG模块命令(CRTRPGMOD)来建立模块目标,这条命令把源语句编译成为模块目标。模块是不可运行的目标,必须把它们连接为程序才能运行,连接一个或多个模块应使用建立程序命令(CRTPGM)。

也可以把模块连接成为服务程序,服务程序是把可调用的子例程装配成独立连接的程序目标的一种方法。使用服务程序可以使程序设计模块化和易于维护,你可以使用非本单位的第三方开发的模块,或者相反地,把你的模块封装供第三方使用。建立服务程序应使用建立服务程序命令(CRTSRVPGM)。 图6显示了程序建立的两个步骤。

ILE程序

ILE程序

ILE HLL模块 服务程序

RPG模块

(CRTRPGMOD)

RPG源规范 外部描述文件 复制源注释

(CRTBNDRPG) CRTPGM

图6 ILE中的程序建立

程序一旦建立了,可以使用UPDPGM或UPDSRVPGM来更新,这是很有用的。因为这意味着只需要有新的或修改的有效模块目标就可以更新程序。

关于一步处理的详细信息,参见第五章2.2节中的“使用CRTBNDPGM命令建立程序”。关于两步处理的详细信息,参见第六章2.3节中的“使用CRTRPGMOD和GRTPGM命令建立程序”。关于服务程序的详细信息,参见第七章2.4节中的“建立服务程序”。

1.2.2 程序管理

ILE为在程序运行期间管理程序流程,共享资源,处理语言的语义提供了一般的基础,对于RPG使用者来说这意味着你可以比以前更有效地对资源进行控制。

一个ILE程序必须要激活到一个活动组中。活动组是在程序建立时指定的,它是为作业分配的工作空间,这样可让一个或多个程序在这个空间内运行。如果在程序被调用时,程序指定的活动组不存在,那么为了保证程序的活动状态,要在作业中建立活动组。 活动组是管理ILE应用程序资源和行为的关键因素。例如,你可以把落实控制操作指定在活动组级别。同样可以指定文件覆盖和共享打开的数据路径在正在运行的应用程序的活动组范围内。最后,程序结束的动作也受到它所在的活动组的影响。 关于活动组的详细信息,参见2.5.6节中的“管理活动组”。

你可以使用ILE语言提供的可连接的API,动态地为一个运行时数组分配存储空间。这些API 允许单一语言或混合语言的应用程序访问存储管理功能的中心系列,并为语言提供一个存储模式。

1.2.3 程序调用

通过ILE,可以用传统的动态程序调用把ILE RPG/400程序与OPM RPG/400程序相连接。程序使用动态调用的方式来调用其它程序,用CALL语句指定被调用程序的名字,在运行期间判定被调用程序的名字地址,就和以前程序间传送控制一样。

然而,你可以编写与快速的静态调用相关的ILE程序。静态调用包括过程间的调用。过程是一组自身控制的代码,它能完成某个任务然后返回到调用者。

一个ILE RPG/400模块由一个过程构成。由于过程名是在连接时确定的(建立程序的时候)所以静态调用要比动态调用快一些。

静态调用也允许使用操作描述符,省略参数,并且允许传递多个参数。(省略参数是没有数据传递充当占位的参数)。操作描述符和省略参数当调用连接的AP1或用其它ILE

语言写的过程时是很有用的。RPGⅣ提供了CALLB操作码,以支持过程调用和参数省略。关于运行程序的详细信息,参见第八章2.5节的“运行一个程序”。关于程序/过程调用的详细信息,参见第九章2.6节的“调用程序和过程”。

1.2.4 源程序调试

在ILE中,你可以对任何单一语言或混合语言的ILE应用程序进行源语句级的调试。在程序运行期间用调试命令控制程序的流程。可以在程序运行前设置有条件的或无条件的断点。在调用程序后,可以指定语句号码做单步运行,显示或修改变量的值。当程序由于遇到断点,单步命令或运行期间错误而停止时,在程序停止处能显示相关的模块,这时,可以录入更多的调试命令。

关于调试程序的详细信息,参见第十章3.1节中的“程序调试”。

1.2.5 可连接的AP1

ILE提供了一些可以连接的AP1以补充当前ILE RPG/400提供的功能。可连接的AP1提供了程序调用和活动能力,条件和存储管理,数学函数和动态屏幕管理。 在ILE RPG/400应用程序中可以考虑使用下面一些AP1:

关于这些ILE可连接AP1的详细信息,参见第八章2.5节中的“运行程序”和系统API参考手册。

1.3 程序建立策略

使用ILE,你可以用很多方法建立程序,这部分介绍了使用ILE RPG/400或其它ILE语言建立ILE程序的三种一般策略。

1、使用CRTBNPRPG命令来建立程序与OPM存有最大的兼容性。 2、使用GRTBNDRPG建立ILE程序。

3、使用CRTRPGMOD和CRTPGM命令建立ILE程序。

CEETREC—表示立即终止条件 CEE4ABN—异常结束 CEEFRST—释放存储空间 CEEGTST—取得堆式存储空间 CEECZST—重分配存储空间 CEEDOD—分解操作描述

第一种策略是作为临时性的推荐。它是为了考虑到已经有OPM应用程序的用户,可能由于时间不够而不能把他们的应用程序一次转成ILE。 第二种也是一种临时的策略,它给你熟悉ILE的时间。但是也允许你立即使用它们的某些性能。第三种策略包含更广,且提供很大的灵活性。

第一和第二种策略都使用一步建立程序的方法,命令名为CRTBNDRPG,第三种策略采用两步建立程序的方法。先用CRTRPGMOD命令,然后用CRTPGM命令。

1.3.1 策略1 OPM兼容的应用程序

策略1可以产生与OPM程序兼容的ILE程序。可用RPGⅣ的增强功能,但不是全部。当要向ILE过渡时,你可能需要这样一个临时程序。

1.3.1.1 方法

使用下面的步骤建立程序:

1、使用CVTRPGSRC命令把原有的源程序转换为RPG IV。注意要转换源程序中使用/COPY

的成员。

2、用CRTBNDRPG命令建立程序目标。指定DFTACTGRP(*YES)。指定DPTACTGRP(*YES) 意味着程序目标只在默认的活动组中运行。(默认的活动组是所有OPM程序运行的 组)。这样就使程序目标与OPM程序,在复盖范围、打开范围和RCLRSC的区域一 致。

当使用这种方法时,就不能用ILE的静态连接。就是说,你的程序不能包括CALLB操作。而且,在建立程序时不能在CRTBNDRPG命令中使用BNDIR和ACTGRP参数。

1.3.1.2 OPM兼容程序的例子

图7显示了OPM兼容程序的运行时样本。它由一个CL程序和两个RPG程序组成。在这个例子中,一个RPG程序被转换成ILE,而其余的程序没有变化。

图7 OPM兼容的应用程序

1.3.1.2.1 ILE作用

以下是在你的应用程序处理时ILE的作用: 程序调用

OPM程序象从前一样动作,当启动作业时,系统自动地建立OPM默认活动

组,所有的OPM应用程序在其中运行,程序可以通过用动态调用的方法

调用该默认活动组中的其它程序。

静态数据的存储空间是在程序激活时建立的,并一直存在直到程序结

数据

OPMRPG

*PGM(Z)

ILERPG

*PGM(Y)

OPMCL

*PGM(X)

缺省活动组

作业 束。当程序结时(无论是正常或非正常结束),程序的存储空间被删除, 若要清除没有结束而返回的程序的存储空间,应使用回收资源命令 (RCLRSC)。 文件

文件处理与前面版本所讲的相同,文件在程序正常或非正常结束时被关

闭。

错误

就象在前面版本所讲的那样,编译程序独立地处理每个程序中的错误。

所看到的出现在程序中的错误与以前是相同的。然而,现在是错误可以

由ILE条件管理程序做程序之间的通信,以使你能看到程序间的不同信 息。这些信息可能会有新的信息标识,因此如果你的CL程序监控某个指 定的信息标识,那么要修改那个信息标识。

1.3.1.3 相关信息

转换为RPGIV—附录1.2.2中的“转换你的源程序”

1.3.2 策略2 使用CRTBNDRPG的ILE程序

策略2产生一个具有先进ILE静态连接的程序。由于可以使用连接目录连接几个模块或服务程序,因此,程序可以包括用CALLB的静态过程调用,你也可以指定程序运行的活动组。

1.3.2.1 方法

使用以下步骤来建立一个程序:

1、如果是由RPGⅢ源程序开始,那么首先使用CVTRPGSRC命令把你的源程序转换成 RPGⅣ。

转换时,要确认转换所有的/COPY成员和调用的程序。另外,如果使用CL来调该 程序的话,那么一定要确认用ILE CL程序而不是用OPM CL程序。 2、确定程序运行要使用的活动组。

也以象这个例子一样,在应用程序名字后命名它。

3、如果需要,给出所用的连接目录的名字。这里假定你要用连接目录,那么该目录是 已经建立好的。例如,要把你的源程序连接到第三部分程序上,那么要知道连接 目录的名字。

4、使用CRTBNDRPG建立ILE程序,指定DFTACTGRP(*NO),指定ACTGRP参数中的活动一步建立处理—第五章2.2节中的“使用CRTBNDRPG命令建立程序” ILE静态连接—第九章2.6节中的“程序和过程调用”和ILE概念 异常处理差异—3.2.1.1.1中的“OPM和ILE异常处理之间的差别”

组。如果有的话,还要指定BNDDIR参数中的连接目录。

注意,如果指定了ACTGRP(*CALLER)并且这个程序被一个在默认活动组中的程序调用,那么这个程序在复盖范围、打开范围和RCLRSC的范围方面的活动将和ILE语义一致。 这种策略的主要不利方面是,你不能有一个永久的模块目标,使它以后可以与其它模块相连接以建立ILE程序,而且任何过程调用必须是在连接目录中标识的模块或服务程序。如果想连接两个或更多的模块而不使用连接目录,那么你就需要使用第三种策略。

1.3.2.2 使用CRTBNDRPG的ILE程序例子

图8显示了一个应用程序运行期间的视图,在应用程序中,ILE CL程序调用了一个和服务程序相连接的ILE RPG/400程序。该应用程序在名为XYZ的活动组中运行。

图8 使用CRTBNDRPG的ILE程序

1.3.2.2.1 ILE的作用

下面详细列出此种方式下ILE的作用:

程序调用

当应用程序启动时,如果活动组不存在,那么系统自动地建立它。

应用程序可包括动态的程序调用或静态的过程调用,连接程序中的过程 使用静态调用来彼此调用,过程调用ILE和OPM程序用动态调用。 数据

程序存储空间的生存期与活动组的生存期相同。存储空间一直保持活动

状态,直到活动组被删除为止。ILE RPG/400在运行期间维护数据。以 便使程序结束的语义和重新初始化的数据与OPM RPG相一致,即使当

OPM RPG程序结束时而实际的存储空间没有被删除。如果前次的过程调用以LR为ON结束或非正常结束,数据都要重新初始化。

支持的服务程序

*SRVPGM(Z)

ILERPG

*PGM(Y)

ILECL

*PGM(X)

SYZ活动组

作业

程序中被说明为进口和出口的数据(分别以EXPORT和IMPORT键字说

明)。对于每个模块来说都是外部的,它们只对连接成一个程序的那些 模块来说是可知的。 文件

在默认情况下,由系统做的文件处理(包括打开、共享、复盖和落实控

制)影响到活动组级。在不同活动组中的程序不能在数据管理级共享文 件。如果你想跨活动组共享文件,那么必须在复盖命令中用SHARE (*YES)参数指定它在作业级打开文件,或在建立文件时用SHARE(*YES)参

指定。

在同一活动组中调用ILE程序或过程时,如果由于前面的原因得到一个

错误

异常时,它会显示一个询问信息,那么现在调用的程序就会首先看到这

个异常信息。

如果调用的程序有错误指示器或*PSSR,那么获得异常的程序或过程就 会非正常结束而不显示询问信息。调用的程序也会做相同的动作(错误

指示器会置为ON,并激活*PSSR)。

调用不同活动组中的OPM程序或过程时,那么异常处理就与OPM RPG一样,每个程序各自处理自身的异常。看到信息可能有新的信息编码,因 每种语言处理它本身的错误并且能处理用其它ILE语言编写的模块中发

此,如果监视某条特定的信息,那么你需要修改那个信息编码。

生的错误。例如,如果程序中有错误指示器的编码,那么RPG可以处理 任何C的错误。C也可以处理任何RPG的错误。

1.3.2.3 相关信息

1.3.3 策略3 使用CRTRPGMOD的ILE应用程序

这种策略允许你全面地利用ILE所提供的概念。然而,越灵活,涉及的内容越多。 本部分讨论了建立程序的三种方案:

单一语言的应用程序

转换到RPGⅣ 一步建立 方法 活动组 RCLRSC

附录1.2.2中的“转换你的源程序”

第五章2.2节中的“使用CRTBNDRPG命令建立程序” 2.5.6节中的“活动组管理” 2.5.6.5节中的“回收资源”命令

第九章2.6节中的“程序和过程调用”和ILE概念 3.2.1.1.1节中的OPM和ILE RPG/400异常处理的差 4.2.1中的“复盖和更改文件输入输出”及4.2.4 中的“共享打开的数据路径“,也参考ILE概念。

ILE静态连接 异常处理差异

异。

复盖和打开的作用范围

多种语言的应用程序 高级应用程序

ILE作用与1.3.2.2.1中“ILE作用”相同。 使用本方法应对基本的ILE概念有所了解。

1.3.3.1 方法

因为这种方法是最灵活的,它包括你建立ILE应用程序的若干种途径。以下给出了需要做的主要步骤。

1.3.3.2 单一语言的ILE应用程序方案

在此方案中,把多个源文件编译成一个模块,然后把它连接成为供ILE RPG/400调用的程序。图9显示了这个应用程序的运行时视图。

*PGM(Y)

XY活动组

*PGM(X) RPG

作业 1、用专用的命令从源成员建立模块。例如,用CRTRPGMOD处理RPG源成员,CRTCLMOD 处理CL源成员,等等。 2、确定应用程序的ILE特性,例如:

确定哪一个模块作为应用程序的起始点,选择的入口模块就是第一个取得控制 的模块。在OPM应用程序中是命令处理程序,或是菜单选择项调用的程序。 确定程序运行的活动组。(与在命名的活动组中运行类似,该活动组的名字是 基于应用程序的名字)。

3、确定是否连接某些模块来建立服务程序。如果是的话,那么使用CRTSRVPGM命令建 立服务程序。

4、用CRTPGM命令连接适当的模块和服务程序。指定根据第2步确定的特性参数值。 使用这种方法建立的应用程序可以在完全保护方式下运行。也就是说,只限于它 本身的活动组中。而且,可以用UPDPGM和UPDSRVPGM命令方便地更新。使用这些

命令可以增加或替换一个或多个模块,而不必重新建立程序目标。

RPG模块 (Y1) RPG模块 (Y2)

RPG模块 (Y3) RPG模块 (Y4)

图9 使用CRTRPGMOD和CRTPGM的单一语言应用程序

程序X对程序Y的调用是动态调用,程序Y中模块间的调用是静态调用。

参见1.3.2.2.1节中的“ILE作用”,其中介绍了应用程序处理调用,数据,文件和错误过程中ILE作用的详细资料。

1.3.3.3 多种语言的ILE程序方案

在此方案中,建立了集成的多语言的应用程序。用某种ILE语言写的主模块,调用其它ILE语言写的过程。主模块打开文件,而其它模块共享这些文件。由于使用了不同语言,你可能认为是不兼容的。然而,ILE保证了这一点。

图10显示了包括一个多种语言ILE程序的应用程序运行期间视图,在程序中一个模块调用不可连接的API,QUSCRTUS(建立用户空间)。

RPG *MODULE(Y2) 缺省活动组 C *MODULE(Y3)

CL *MODULE(Y1)

*PGM(Y)

Y活动组

作业

*PGM(QUSCRTUS) RPG *MODULE(Y4)

图10 多种语言的应用程序

程序Y对OPM API的调用是动态调用,程序Y中的各模块间的调用是静态调用。 参见1.3.2.2.1节中的“ILE作用”,其中介绍了应用程序处理调用,数据,文件及错误的过程中ILE作用的详细资料。

1.3.3.4 高级应用程序方案

在此方案中,你用了包括服务程序在内的ILE功能的全部益处。特别当服务程序在调用它的程序的活动组中运行时,使用了模块和服务程序间的过程的连接调用,特别能提高性能。

图11显示了一个ILE程序被连接到两个服务程序上的例子。

C *MODULE(Z1)

*SRVPGM(Z)

RPG *MODULE(X2) RPG

CL *MODULE(X1) *SRVPGM(1)

*PGM(X)

XYZ活动组

作业

图11 高级应用程序

程序X对程序Y和Z的调用是静态调用。

参见1.3.2.2.1节中的“ILE作用”,其中介绍了应用程序处理调用,数据,文件及错误的过程中ILE作用的详细资料。

1.3.3.5 相关信息

1.3.4 应避免的一种策略

ILE提供了很多建立程序和应用程序的选择。然而,不是所有的都是同样好的,通常,你应该避免出现这样的情况:一个应用程序包含OPM和ILE程序,而它们分别跨跃OPM默认活动组和命名活动组。换言之,应避免图12中显示的方案。

CL

*PGM(X)

缺省活动组

作业 二步建立方法 活动组 异常处理 服务程序 更新程序

ILE静态连接

第六章2.3节中的“用CRTRPGMOD和CRTPGM命令建立程序”。 2.5.6节中的“管理活动组”

第九章2.6节中的“过程与程序调用”,也见于ILE概念。 第十一章3.2节中的“处理异常”,也见于ILE概念。 第七章2.4节中的“建立服务程序”,也见于ILE概念。 2.3.4.1节中的“使用UPDPGM命令”

CL *MODULE(Z2)

图12 应避免的方案,一个应用程序被分开放在OPM默认活动组和命名的活动组中。

这样做就混合了OPM的行为和ILE的行为。例如,默认活动组中的程序可能要求ILE程序在结束时释放他们的资源。然而,活动组不结束的话这是不可能发生的。

类似的,当应用程序分开放在默认活动组和命名活动组中时,复盖和共享的ODP的作用范围将更加难于管理。在默认情况下,命名活动组的作用范围是在活动组级,但是默认活动组的作用范围是调用级或作业级,而不是活动组级。

2.0 建立并运行 ILE RPG/400应用程序

此部分提供了建立和运行ILE RPG/400程序所需的信息。包括:

2.1 第四章 录入源语句

录入源语句 建立模块 读编译清单 建立程序 建立服务程序 运行程序 传递参数 运行时间管理

调用其它的程序或过程

RPG

*SRVPGM(Z)

RPG

*PGM(Y)

QILE活动组 以下简要介绍一些ILE的术语和概念,这些术语和概念将在ILE概念中作全面地讨论。

本章提供了你录入RPG源语句所需要的信息,也简要地介绍了为完成本步骤必需的工具。

要把RPG源语句录入到系统中,可采用以下方法:

交互地使用SEU 交互地使用CODE/400

开始,把源语句录入到一个叫QRPGLESRC的文件中去,文件QRPGLESRC的新成员自动地以RPGLE为默认类型。接着,建立模块和连接成为程序目标的默认的源文件叫做QRPGLESRC。IBM提供了在QGPL库中的QRPGLESRC源文件,它的记录长度为112个字符。 注意:在录入源程序时可用混合大小写的方式,但是,ILE RPG/400的编译程序将把多数的源程序转换成大写,但不转换文字,数组数据或表数据。

2.1.1 建立库和源物理文件

源语句是录入到源物理文件的成员中的。在你录入程序之前,库和源物理文件必须已经存在。

要建立一个库,应使用CRTLIB命令。要建立源物理文件,使用CRTSRCPF命令。建议文件记录长是112个字符。该记录长度考虑到了图13所示的新的ILE RPG/400结构。

顺 序 号 码 注 释

图13 ILE RPG/400记录长度分析

因为系统默认的源物理文件记录长度是92个字符,所以应该指定记录长为112。如果指定了小于92的记录长度,那么系统可能会因为截短了源代码而不进行编译。 注意:如果你在一个新的库中建立文件,那么你必须先建立库,然后建立源文件。 关于建立库和源文件的更多信息,参见ADTS/400:源语句录入实用程序(SEU)和ADTS/400:程序开发管理工具(PDM)。

2.1.2 使用源语句录入实用程序(SEU)

最小记录长度 (92个字符) 建议记录长度 (112个字符)

12

80

20

可以用源语句录入实用程序(SEU)来输入源语句,SEU提供了不同规范表样板的提示和语法检查。要启动SEU,使用STRSEU(启动源语句录入实用程序)命令。关于用这种方法启动并使用SEU,参见ADTS/400:源语句录入实用程序。

如果源文件的名字是QRPGLESRC,那么当SEU编辑一个新成员时,自动地将源成员类型设为RPGLE。否则的话,必须在建立成员时指定RPGLE。

如果想在键入STRSEU后得到提示,按F4键。就会出现STRSEU显示屏,列出参数,并给出默认值,如果在要求提示前已给出了某些参数值,那显示屏幕上将会填上那些值。 在下面的例子中,输入一个程序的源语句,这个程序将打印一个取自文件中的雇员信息。它告诉你如何做下面的事情:

建立库

建立源物理文件 启动SEU编辑任务 输入源语句

1、为了建立名为MYLIB的库,键入CRTLIB(MYLIB)。 CRTLIB命令建立一个名为MYLIB的库。

2、建立名为QRPGLESRC的源物理文件,键入CRTSRCPF FILE(MYLIB/QRPGLESRC) CRTSRCPF命令在库MYLIB中建立了源物理文件QRPGLESRC。 3、启动一个编辑任务,并建立源成员EMPRPT键入。

STRSEU SRCFILE(MYLIB/QRPGLESRC) SRCMBR(EMPRPT) TYPE(RPGLE)OPTION(2)

RCDLEN(112) TEXT(‘Source physical file for all RPG progroms’)。

键入OPITION(2)指出要启动编辑任务来建立一个新的成员。STRSEU命令在库MYLIB的文件QRPGLESRC中建立一个新成员EMPRPT,并启动编辑任务。

SEU的编辑屏如图14所示,注意屏幕自动地转换,以使第6列(规范表类型列)位于左边界。

* *

* Columns . . . : 6 76 Edit MYLIB/QRPGLESRC *

* SEU==> EMPRPT * * FMT H

HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * * *************** Beginning of data

************************************* *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ''''''' *

* ****************** End of data **************************************** *

* *

* F3=Exit F4=Prompt F5=Refresh F9=Retrieve F10=Cursor *

* F16=Repeat find F17=Repeat change F24=More keys

*

* Member EMPRPT added to file MYLIB/QRPGLESRC. + *

* *

图14 新成员的编辑屏

在SEU的编辑屏中键入图15中给出的源语句,使用以下的SEU行命令来得到各表提示:

F***************************************************************** F* 模 块 名: EMPRPT F*

* *

* *

F* 有关文件: EMPMST(物理文件)

PRINT (打印文件)

F* 说 明:这个程序打印EMPMST中的雇员信息。 FQSYSPRT O F 80 PRINTER FEMPMST IP E K DISK

D TYPE S 8

IEMPREC 01

C IF ETYPE = 'M' C EVAL TYPE = 'MANAGER' C ELSE

C EVAL TYPE = 'REGULAR' C ENDIF

IPF—文件描述规范表的提示 IPI—输入规范表的提示 IPC—计算规范表的提示

IPCX—有扩展参数2的计算规范表的提示 IPO—对于输出规范表的提示

IPP—对于输出规范表的连续行的提示

F*****************************************************************

OQSYSPRT H 1P 2 6

O 50 'EMPLOYEE INFORMATION'

O H 1P

O 12 'NAME' O 34 'SERIAL #' O 45 'DEPT' O 56 'TYPE' O D 01

O ENAME 20 O ENUM 32 O EDEPT 45 O TYPE 60

图15 成员EMPRPT的源程序

A***************************************************************** A* 说 明:这是物理文件EMPMST的DDS,它的记录格式名为EMPREC。* A* 文件中对每个雇员都有一条记录。 A*

A R EMPREC

A ENUM 5 0 TEXT('EMPLOYEE NUMBER') A ENAME 20 TEXT('EMPLOYEE NAME') A ETYPE 1 TEXT('EMPLOYEE TYPE') A EDEPT 3 0 TEXT('EMPLOYEE DEPARTMENT') A ENHRS 3 1 TEXT('EMPLOYEE NORMAL WEEK HOURS')

*

A*****************************************************************

5、按F3(Exit)退出屏幕,键入Y(Yes)保存EMPRPT。 这样,成员EMPRPT被保存。

图16显示了被EMPRPT所引用的文件的DDS源语句。

A K ENUM

图16 对应于EMPRPT的DDS

使用CRTBNDRPG命令由此源语句建立程序,参见2.2.1.1中的“建立OPM-兼容的程序目标”。

2.1.3 使用DB2/400 SQL语句

在ILE RPG/400程序中嵌入SQL语句,就可以访问OS/400的DB2*,按以下的规则输入SQL语言:

在计算规范表中输入SQL语句。

在7-15列使用/EXEC SQL(/应在第7列)启动SQL语句。 可以在/EXEX SQL的同一行中输入SQL语句。

也可以在接下的行中使用续行符(在第7列输入一个+)来续写源语句。 在第7-15列用/END-EXEC(/在第7列)来表示SQL语句结束。

注意:程序中SQL语句不能超过第80列。 图17显示了嵌入SQL语句的例子。

...+....1....+....2....+....3....+....4....+....5....+....6....+....7.. C

C (ILE RPG/400 calculation operations) C

C/EXEC SQL (the starting delimiter) C+

C+ (continuation lines containing SQL statements) C+ . . .

C/END-EXEC (the ending delimiter) C

C (ILE RPG/400 calculation operations)

C

图17 ILE RPG/400程序中的SQL语句

必须录入单个的命令来处理SQL语句。

详细信息参见DB2/400 SQL编程和DB2/400 SQL参考手册。有关源语句录入实用程序SEU处理SQL语法检查的信息,请参见ADTS/400。

2.1.4 在程序中包括图形数据

在RPGⅣ语言中,现在提供对图形数据类型(G)字段的全面支持。 关于ILE RPG/400图形支持的详细信息,参见 ILE RPG/400参考手册。

2.2 第五章 使用CRTBNDRPG命令建立程序

本章介绍了如何用CRTBNDRPG命令,从RPGⅣ的源语句来建立一个ILE程序。使用这条命令可以建立以下两类的ILE程序。

设有静态连接的OPM兼容程序 有静态连接单模块的IEL程序

建立第一种类型还是第二种类型的程序,取决于CRTBNDRPG命令中的DFTACTGRP参数是规定为*YES还是*NO。建立第一种类型的程序使程序在打开范围,复盖范围和RCLRSC的区域和OPM程序一致。具有这种高级的兼容性是因为它们象OPM程序一样在同一个活动组中运行,即默认活动组。

然而这种高兼容性导致不能进行静态连接,静态连接指的是调用过程的能力(在其它模块或服务程序中)及使用过程指针的能力。换言之,不能在程序中使用CALLB操作码,也不能在程序建立时连接其它模块。

建立第二种类型的程序,使程序具有静态连接的ILE特征。可以在程序建立时指定程序将要在其中运行的活动组以及静态连接的某些模块。另外,可以在程序中使用CALLB操作码。

2.2.1 使用CRTBNDRPG命令

建立连接的RPG(CRTBNDRPG)命令只用一步处理由RPGⅣ源语句建立程序目标。也允许通过使用连接目录连接其它的模块或服务程序。

该命令启动ILE RPG/400编译程序,并在QTEMP库中建立一个临时的模块。然后,把

它连接到类型为*PGM的程序目标中,一旦程序目标建立,用于建立程序的临时模块就被删除。

当你想从独立的源代码(不用连接其他模块的代码)建立程序目标时,CRTBNDRPG命令是很有用的。因为它有建立与连接二个步骤,另外它允许建立与OPM兼容的程序。 注意:如果想保留一些模块目标,以便与其它目标连接成为程序,那么必须用CRTRPGMOD命令建立目标。详细信息参见第6章2.3节中的“使用CRTRPGMOD和CRTPGM命令”建立程序。

可以交互地或批处理或从控制语言(CL)程序中使用CRTBNDRPG命令。如果交互地使用该命令并需要提示的话,键入CRTBNDRPG,然后按F4(提示)。如果需要帮助,那么键入CRTBNDRPG,然后按F1(帮助)。

表2总结了CRTBNDRPG的参数,并给出默认值。 表2

CRTBNDRPG的参数和他们的默认值,按功能分组

指定程序名和库 标识源文件和库 标识包含源规范表的成员 程序的简要描述 程序能建立的错误级别

*GEN/*NOGEN,决定程序是否建立

指定调试视图的类型,如果需要调试,是否包含于程 序中

确定优化级别

确定是否替代已存在的程序 指定用于符号分析的连接目录 指定运行程序的用户配置文件 指定建立程序的授权类型 指出目标运行的软件版本 确定是否产生编译清单

确定是否在清单中显示缩进,并指出标志缩进的字符 指定编译清单的内容

程序标识

PGM(*CLIRLIB/*CTLSPEC) SRCFILE(*LIB/QRPGLESRC) SRCMBR(*PGM) 程序建立 GENLVL(10) OPTION(*GEN)

TEXT(*SRCMBRTXT)

PBGVIEW(*STMT) OPTIMIZE(*NONE) REPLACE(*YES) BNNDIR(*NONE) USRPRF(*USER)

AUT(*LIBCRTAUT) TGTRLS(*CURPENT) 编译清单

OUTPUT(*PRINT) INDENT(*NONE)

OPTION(*XREF*NOSECLVL *SHOWCRY*EXPDDS*EXT) 数据转换选项 CVTOPT(*NONE) ALWNULL(*NO) FIXNBR(*NONE)

指定外部描述文件的数据类型的处理方式 确定程序是否接受容许空值字段的值

确定无效的区十进制数是否被整理转换为压缩型数据.

运行时的考虑 DFTACTGRP(*YES) ACTGRP(QILE) STRSEQ(*NEX)

指出该程序是否总在OPM默认活动组中运行 指出程序运行的活动组 指出使用的排序顺序表

与SRTSEQ并用来指定排序顺序的语言标识 指定发生数字溢出时采取的动作

LANGID(*JOBRUN) TRUNCNBR(*YES)

参见附录C,1.3中的“建立命令”,其中有CRTBNDRPG的语法图解和参数描述。

2.2.1.1 建立一个与OPM兼容的程序目标

在此例子中使用CRTBNDRPG命令,由源程序EMPRPT,如2.1.2节中的图15所示,建立一个与OPM兼容程序。

1、要建立目标,键入

CRTBNDRPG PGM(MYLIB/EMPRPT) SRCFILE(MYLIB/QRPGLESRC)

TEXT(‘ILE RPG/400 program’) DFTACTRP(*YES)。

CRTBNDRPG命令在库MYLIB中建立程序EMPRPT,它将在默认活动组中运行。这时产生编译清单。

注意:DFTACTGRP(*YES)提供,OPM兼容性,有了这项就不允许你输入ACTGRP和BNDDIR的参数值,另外,如果源程序中包含CALLB操作码,那么将会出错误信息且编译结束。

2.2.1.2 建立用于源语句调试的程序

在此例子中建立可以用源语句调试程序EMPRPT。CRTBNDRPG和CRTRPGMOD的DBGVIEW参数决定了在编译时产生何种调试数据。该参数提供了六种选项:

*STMT—允许用编译清单在语句处显示变量值,设置断点,此时,不显示源语句。 *SOURCE—建立与输入的源语句相同的显示。

*COPY—建一个源语句显示和包括带有/COPY成员的源语句的显示。 *LIST—建立与编译清单相似的显示。 *ALL—建立以上所有类型的显示。 *NONE—不产生调试数据。

2、键入以下CL命令中的一个来看生成的编译清单。

DSPJOB并选择选项4(显示假脱机文件) WRKJOB WRKOUTQ队列名 WRKSPLF

EMPRPT的源语句如2.1.2节中的图15所示。

1、要建立目标,键入:

CRTBNDRPG PGM(MYLIB/EMPRPT)DBGVIEW(*SOURCE)这个程序以它的源成员EMPRPT

为名建立在库MYLIB中。注意在默认方式下,将会以参数DFTACTGRP(*YES)建立,这个程序目标可以用源语句视图调试。

* *

* Display Module Source *

* *

* Program: EMPRPT Library: MYLIB Module: EMPRPT *

* 1

F**************************************************************** * * 2 F* 模 块 名: EMPRPT

*

PRINT

(打印文件)

*

*

*

*

* 3 F* 有关文件: EMPMST(物理文件) * 4 F*

2、要调试程序键入:

STRDBG EMPRPT

图18显示了键入以上命令后的屏幕显示。

* 5 F* 说 明:这个文件打印EMPMST中的雇员信息 * 6 F* * 7

F**************************************************************** *

* 8 FQSYSPRT O F 80 PRINTER *

* 9 FEMPMST IP E K DISK *

* 10 *

* 11 D TYPE S 8 *

* 12 *

* 13 IEMPREC 01 *

* 14 *

* 15 C IF ETYPE = 'M' *

* More... *

* Debug . . . *

* *

* F3=End program F6=Add/Clear breakpoint F10=Step F11=Display variable *

* F12=Resume F13=Work with module breakpoints F24=More keys *

* *

* *

图18 EMPRPT的显示模块源语句屏幕

在这个屏幕上(显示模块源语句屏幕)你可以输入调试命令来显示或修改字段值,设置断点来控制调试程序流程。

关于调试的详细信息,参见第10章3.1节中的“程序调试”。

2.2.1.3 建立一个使用静态连接的程序

在此例子中使用CRTBNDRPG命令建立一个程序COMPUTE,在程序建立时,连接一个服务程序。假设要把程序COMPUTE与购买来的高级计算的服务程序相连接。要连接源程序的目录名为MATH,这个目录包含一个服务程序的名字,该服务程序中包括几个组成它的过程。要建立目标,键入:

CRTBNDRPG PGM(MYLIB/COMPUTE)

DFTACTGRP(*NO) ACTGRP(GRP1) BNDDIR(MATH)

在程序建立时,源程序将与在连接目录MATH中指定的服务程序相连接。这意味着调用服务程序中的过程,将比动态调用要省时间。

当调用程序时,将在活动组GRP1中运行,CRTBNDRPG的ACTGRP默认值为QILE。但是,建议在唯一的活动组中运行你的应用程序,以确保相关联的资源被完全保护。

注意:为了能输入ACTGRP和BNDDIR的参数值,必须把参数DFTACTGRP的值设置为*NO。 关于服务程序的详细信息,参见第七章2.4节“建立服务程序”。

2.2.2 使用编译清单

本部分讨论了如何得到清单,如何用它得到帮助来处理下面问题:

修正编译错误 修正运行时错误 为维护工作准备文档

参见附录D,附录1.4节中的“编译清单”,其中有清单各部分的信息和完整的样本清单。

2.2.2.1 获取编译清单

要获得编译清单应在CRTBNDRPG命令或CRTRPGMOD命令中指定OUTPUT(*PRINT)。(这是它们的默认值),如果指定了OUTPUT(*NONE)将不产生清单。 指定OUTPUT(*PRINT)将产生至少包含以下部分的编译清单: 序(命令选项总计) 源清单,包括:

—联机诊断信息

—匹配字段表(如果使用了有匹配字段的RPG周期的话)

附加的诊断信息 输出缓冲区中的字段位置 /COPY成员表 编译时数据,包括:

—交替对照顺序记录和表或NLSS信息和表 —文件传输记录 —数组记录 —表记录 信息总计 最终总计

代码生成报告(只在有错误时出现)

连接报告(仅对CRTBNDRPG命令,只在有错误时出现)。如果在建立命令的OPTION参数中指定相应的值的话,那么编译清单会包括以下附加的信息。

*EXPDDS *SHOWCPY *EXPDDS *XREF *EXT

外部描述文件规范表(出现在清单的源语句部分) /COPY成员的源记录(出现在清单的源语句部分) 键字字段信息(自已一部分单元) 交叉引用清单(自已一部分单元) 外部引用清单(自已一部分单元) 二级信息文本(出现在信息总计部分)

*SECLUL

注意:对建立命令而言,除了*SECLUL以外,以上所有的值都是OPTION参数的默认值。不必修改OPTION参数,除非不想要某个清单部分或者想在清单中包括第二级文本。

2.2.2.1.1 剪裁编译清单

可以改制页标题或改制行距来剪裁编译清单。

改制页标题:页标题信息包括产品信息行和由/TITLE命令提供的标题。产品信息行包

括ILE RPG/400编译程序和库版权注意信息,成员,源程序所在库,模 块建立的日期和时间,还有清单的页数。

可以用/TITLE编译命令指定清单中标题。这条命令让你指定在每页编译清单顶部出现的内容。这条信息,要优先于通常页标题信息。如果该命令是源成员中的第一条记录,那么这条信息也会出现在序言部分。

也可以改变清单中页标题和其它信息中使用的日期分隔符,日期格式和时间分隔符。一般地,编译程序根据作业属性来决定这内容。要修改它们应使用修改作业(CHGJOB)命令,用这条命令可以:

选择以下日期分隔符之一:*SYSLVL,*BLAND,斜线(/),连接号(-),句点(.),或逗号(,)。

选择以下日期格式之一:*SYSLVL,*YMD,*MDY,*DMYAKG *JUL。

选择以下时间分隔符之一:*SYSLVL,*BLAND,冒号(:),逗号(,)或句点(.)。 这些值用在清单中出现时间和日期字段的地方。

改制行距:通常清单的每部分都从新的一页开始;清单的每一页都以产品信息开始(除

非源成员包含/TITLE命令)。这产品信息出现在第二行而标题出现在第一

行。

使用/EJECT和/SPACE编译命令可以控制编译清单的间隔和页码,/EJECT命令强制产生一个页中断,开始另一页。/SPACE命令控制清单的行距。关于这些命令的详细信息参见ILE RPG/400参考手册。

2.2.2.1.2 编译清单中的结构化操作缩进

如果源程序规范表中包括结构化操作码(例如DO-END或IF-ESLE-END),你可能希望在源程序清单中这些操作有缩进显示。INDENT可以让你指定是否显示缩进,并指定标记

缩进的字符。如果不想缩进应指定INDENT(*NONE),这是默认值。如果想要缩进的话,那么最多指定两个字符来标记缩进。

例如,要指定让结构化操作缩进,并以显示(|)和空格标记,应指定INDENT(‘|’)。 如果要求缩进,那么正常情况下出现在源程序清单中的一些信息要被删除,这样才能可以缩进。以下的内容不会出现在清单中:

DO编号 最后一次更新 页/行

如果在指定缩进的同时指定了清单调试视图,那么在调试视图中不会出现缩进。 图19显示了缩进产生的源程序清单。缩进标记为‘| ’。

Line <---------------------- Source Specifications

----------------------------------------------><---- Comments ----> Src Seq Number ....1....+....2....+<-------- 26 - 35

--------->....4....+....5....+....6....+....7....+....8....+....9....+...10 Id Number 33 000000 002000

34 C* MAINLINE * 000000 002100 35 000000 002200 002300 002400 002500

000000 002600 002700

----20 002800

C********************************************************************

C********************************************************************

36 C WRITE FOOT1

37 C WRITE HEAD

38 C EXFMT PROMPT

39 C*

40 C DOW NOT *IN03

41 C CSTKEY | SETLL CMLREC2

42 C | IF *IN02

002900 003000 003100 003200 003300 003400 003500 003600 003700 003800 003900 004000 004100 004200 004300

000000 004400

LR---- 004500

图19 有缩进的清单的样本源程序

43 C | | MOVE '1' *IN61

44 C | ELSE

45 C | | EXSR SFLPRC

46 C | END

47 C | IF NOT *IN03

48 C | | IF *IN04

49 C | | | IF *IN61

50 C | | | | WRITE FOOT1

51 C | | | | WRITE HEAD

52 C | | | ENDIF

53 C | | | EXFMT PROMPT

54 C | | ENDIF

55 C | ENDIF

56 C ENDDO

57 C*

58 C SETON

2.2.2.2 改正编译错误

对改正编译错误有用的编译清单主要部分有:

源语句部分 附加信息部分 /COPY表部分 各类总计部分

出现在源语句部分的联机诊断信息,在源语句段上找到的错误,编译程序立即标识,其它错误是在编译期间接到附加信息后标识出的。提示这些错误的信息是在源语句部分和附加信息部分中标识的。

为了帮助改正编译错误,也许需要在清单中包括第二信息文本—特别对于RPG初学者。要想这样做的话,需在建立命令中指定OPTION(*SECLVL)参数。这样就会把第二级信息加到信息总计中的信息清单中。

最后,要记住编译清单是程序的一个记录。因此,如果有错误的话,可以使用清单来检查源程序。除了源语句外,要检查的编译清单部分还包括:

匹配字段表

如果你使用有匹配字段的PRG程序周期,那么可以用这个表来确定编译程序是否象预期的那样识别他们。

以偏移量定义的输出字段与文本或字段名一起列出起始和结束位置,以此确定编译程是否象预想的那样识别输入。 编译时数据。

列出ALTSEQ和FIRANS记录和表,NLSS信息和表也列出来。表和数组都被明确的标识出来。用这些来确定编译程序是否象预想地那样识别它们。

2.2.2.2.1 使用联机诊断信息

有两种联机诊断信息:定位类和非定位类。

定位类信息确切地指出了错误发生的位置,图20显示了定位类联机诊断信息的例子。

Line <---------------------- Source Specifications

----------------------------><---- Comments ----> Do Page Change Src Seq

Number ....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+...10 Num Line Date Id Number

63 C SETOFF _12___ 003100

======> aabb

======> cccc

*RNF5051 30 a Resulting-Indicator entry is not valid; defaults to blanks. *RNF5051 30 b Resulting-Indicator entry is not valid; defaults to blanks. *RNF5053 30 c Resulting-Indicators entry is blank for specified operation. 图20 定位类联机诊断信息样本

在这个例子中,没有在71-72或73-74列而是错误地在72-73列设置了一个指示器,三个定位符号‘aa’,‘bb’,和‘cc’指出了发生错误的地方。正确的列位置和解释的变量为高亮度显示.在这里,信息RNF5051指出被‘aa’和‘bb’标记的字段没有有效的指示器。因为没有有效的指示器,所以编译程序假定字段为空,但。SETOFF操作要求有指示器。因此产生了另一个错误,就是信息RNF5053中字段‘CCCC’所指出的。

错误是按它出现的顺序来排列的。一般的,要先改正先出现的错误,然后再改后面的。 非定位类联机诊断信息也指示错误。由于错误的性质,它们不能指出在源语句中的确定位置。而只能指出问题。图21显示了非定位类联机诊断信息的例子。

Line <---------------------- Source Specifications

----------------------------><---- Comments ----> Do Page Change Src Seq

Number ....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+...10 Num Line Date Id Number

12345 000600 000700 000800 000900

12345 100792 001000

6 FINTERN IS F 72 DISK

7 FQSYSPRT O F 256 DISK

8 FF7145A CT F 28 DISK

9 FF7145B CT F 28 DISK

10 F*

*RNF2025 30 6 INTERN defaults to primary file.

11 DARRA S 28 FROMFILE(F7145A) TOFILE(F7145A) 001100

图21 非定位类联机诊断信息样本

此例子中有几个文件规范表,其中一个定义做次文件,但是没有定义主文件。因为主文件是必需的,所以产生了错误信息(RNF2025)。编译程序不能指出应定义哪一行的文件做主文件。当下一种规范表开始时,它就会认为不存在这样的行。

2.2.2.2.2 使用附加诊断信息

附加诊断信息部分指出了当一行或多行编码整体看起来时会出现的错误,这些信息一般不放在出现问题的编码行,编译程序在写有问题的程序源码时,还不知道错误是否存在。但是,当能够发现错误时,信息行就会包括与此相关的源语句行号。

2.2.2.2.3 使用SEU显示编译清单

SEU的分屏/显示功能(F15)允许显示输出队列中的编译清单,可以在修改源码的同时,查看上一次的编译结果。

在显示时可以查找错误,并改正那些有错误的源语句。要查找错误,在显示屏幕的SEU命令行上键入F *ERR。有第一(或下一个)错误的行就会高亮度显示,并且这个错误的第一级信息文本在屏幕底部出现。可以把光标放在底部的信息上,然后按F1(帮助)键,来显示第二级信息文本。

只要有可能,编辑清单中的错误信息会指出有错误行的SEU顺序号。行号出现在信息文本之前。

关于显示编译清单的完整信息,参考 ADTS/400:源语句录入实用程序。

2.2.2.3 改正运行时错误

清单的源语句部分,对于改正运行时错误也是有用的。许多运行时错误都指出了错误的语句号。清单左边的行号与运行时错误信息的语句号相对应。源语句ID号和编译清单右

边的SEU顺序号指出了源成员和记录。

这样就可使用两者来确定哪一行需要检查。

2.2.2.3.1

改正运行时错误经常用到程序调试。考虑以下问题可能在调试程序时有帮助:

如果使用源语句调试那么可选择以下调试显示:*STMT,*SOURCE,*LIST, *COPY,*ALL。

如果要在调试时用编译清单作为辅助工具可以指定OUTPUT(*PRINT)从而得到一

选择有Debug窗口选项的编译清单可选项

个清单。如果使用源语句显示进行调试的话,那么编译清单是很重要的。因为设置断

如果考虑做调试,那么可能需要用参数

DBGVIEW(*ALL),OUTPUT(*PRINT)和OPTION(*SHOWCPY)来编译源程序,这样允许使如果指定了DBGVIEW(*LIST),那么调试时有效的信息取决于OPTION参数,只有指

点的行号就是那些在清单中指出的行号。

用源语句显示或清单显示,并包括/COPY成员。

2.2.2.4 使用编译清单做维护

没有错误的程序的编译清单可用来作为文档,当:

文档用于向新的程序员教授程序。 日后更新程序。

定了OPTION(*SHOWCPY *EXPDDS),才能包括/COPY成员和外部描述文件。

在这种情况下,应当有完整的清单,它是由规定参数OUTPUT(*PRINT)和OPTION(*XREF *SHOWCPY *PDDS *EXT)产生的。注意对于建立命令以上参数的值都是默认值。 对程序维护有用的是在清单的序言部分,它告诉你:

谁编译了模块/程序

用哪个源码来产生的模块/程序 当编译模块/程序时使用了哪些选项

在以后要改动程序时,可能需要知道命令选项(例如,选择的调试显示或使用的连接目录)。

边的SEU顺序号指出了源成员和记录。

这样就可使用两者来确定哪一行需要检查。

2.2.2.3.1

改正运行时错误经常用到程序调试。考虑以下问题可能在调试程序时有帮助:

如果使用源语句调试那么可选择以下调试显示:*STMT,*SOURCE,*LIST, *COPY,*ALL。

如果要在调试时用编译清单作为辅助工具可以指定OUTPUT(*PRINT)从而得到一

选择有Debug窗口选项的编译清单可选项

个清单。如果使用源语句显示进行调试的话,那么编译清单是很重要的。因为设置断

如果考虑做调试,那么可能需要用参数

DBGVIEW(*ALL),OUTPUT(*PRINT)和OPTION(*SHOWCPY)来编译源程序,这样允许使如果指定了DBGVIEW(*LIST),那么调试时有效的信息取决于OPTION参数,只有指

点的行号就是那些在清单中指出的行号。

用源语句显示或清单显示,并包括/COPY成员。

2.2.2.4 使用编译清单做维护

没有错误的程序的编译清单可用来作为文档,当:

文档用于向新的程序员教授程序。 日后更新程序。

定了OPTION(*SHOWCPY *EXPDDS),才能包括/COPY成员和外部描述文件。

在这种情况下,应当有完整的清单,它是由规定参数OUTPUT(*PRINT)和OPTION(*XREF *SHOWCPY *PDDS *EXT)产生的。注意对于建立命令以上参数的值都是默认值。 对程序维护有用的是在清单的序言部分,它告诉你:

谁编译了模块/程序

用哪个源码来产生的模块/程序 当编译模块/程序时使用了哪些选项

在以后要改动程序时,可能需要知道命令选项(例如,选择的调试显示或使用的连接目录)。

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

Top