mysal查编码 唯一键 对空格校验么

内容提示:[精品]数据库设计规范(修订)

文档格式:DOC| 浏览次数:0| 上传日期: 07:41:35| 文档星级:?????

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

那些经常出现在where子句中的列上

    2、步骤:此函数可以根据雇员的编号查询出雇员的年薪

/SPACE(7-12 列) 在编译期间/COPY 的结果 程序周期 一般 RPG Ⅳ程序周期 详细的 RPGⅣ程序周期 详细的 RPGⅣ目标程序周期 初始化例程 匹配字段例程 溢出例程 先行字段例程 无主文件程序的结束 文件处理嘚程序控制 RPG Ⅳ异常/错误处理子例程 第四章 RPG Ⅳ指示器 在 RPG Ⅳ规范表中定义指示器 溢出指示器 记录标识指示器 配置记录标识指示器的规则 控制级指示器(L1-L9) 控制级指示器的规则

分离的控制字段 字段指示器 配置字段指示器的规则 结果指示器 配置结果指示器的规则 不在规范表中定义的指示器 外部指示器 内部指示器 第一页指示器(1P) 最后一个记录指示器(LR) 匹配记录指示器(MR) 使用指示器 文件条件 文件条件规则 字段记录关系指示器 配置字段记录关系指示器 功能键指示器 暂停指示器(H1-H9) 指示器条件限制计算 第 7 和第 8 列 第 9-11 列 表达式中使用指示器 控制输出指示器 作数据引用的指示器 *IN *INxx 附加规则 指示器总结 异常/错误数据结构和子例程 文件信息数据结构 文件反馈信息 打开反馈信息 输入/输出反馈信息 设备反馈信息 取得属性反馈信息 分块考虑 文件异常/错误子例程(INFSR) 状态码 文件状态码 程序异常/错误 程序状态数据结构 程序状态码 程序异常/错误子例程 文件异常/错误

一般文件考虑 无匹配字段的多文件处理 有匹配字段的多文件处理 分配匹配字段值(M1-M9) 处理匹配记录

主文件/次文件多文件处理

替换比较顺序 改变比较顺序 使用外部比较顺序 在源文件中说明替换比较顺序 格式化替换比较顺序记录 文件转换 指定文件转换 转换一个或全部文件 转换多个文件 指定攵件 指定表 第七章 字符型 数字型 压缩十进制 决定压缩十进制字段的数字长度 区位十进制格式 二进制格式 程序描述的文件 外部描述的文件 日期型 时间型 时间标记数据 图形型 基本指针数据类型 例子 过程指针数据类型 例子 不支持的数据库数据类型 空值/空属性字段 变长字段 对数据库數据映象错误的处理 第八章 文字和命名常量 文字 命名常量 命名常量的规则 定义命名常量的例子 象征常量 数据类型和数据格式

象征常量的规則 数据结构 数据区数据结构 文件信息数据结构 程序状态数据结构 数据结构举例 使用数组和表 数组名和下标 基本数组规范表 运行时数组的编碼 装入运行时数组 在一个源记录中装入运行时数组 用多个源记录装入运行时数组 运行时数组排序 编译时数组的编码 装入编译时数组 数组源記录的规则 运行前数组的编码 装入运行前数组 字符数组的顺序检查 初始化数组 运行时数组 编译时和运行前数组 定义相关数组 检索数组 检索無下标数组 检索有下标数组 使用数组 在计算规范表中说明数组 数组排序 用数组一部分做键字排序数组 数组输出 编辑整个数组 LOOKUP 处理一个表 LOOKUP 处悝二个表 描述在 LOKUP 操作中找到的表无素 编辑数字型字段 简单的编辑码 组合编辑码 用户自定义编辑码 编辑码 数组 特殊数据结构

编辑考虑 编译码尛结 编辑字 如何编写一个编辑字 一个编辑字的组成部分 一个编辑字的主体格式 一个编辑字的状态格式 一个编辑字的扩展格式 编辑字编写规則总结 编辑外部描述文件 初始化数据和子例程 初始化子例程(*INISR) CLEAR 和 RESET 操作码 数据初始化 规范表 一般信息 键字语法 续行规则 控制规范表键字字段 文件描述规范表键字字段 定义规范表键字字段

第 7-16 列(文件名) 程序描述文件 外部描述文件 第 17 列(文件类型) 输入文件 输出文件 更新文件 组合文件 第 18 列(攵件标志) 主文件 次文件 记录地址文件(RAF) 数组或表文件 全过程文件 第 19 列(文件结束) 第 20 列(文件增加) 第 21 列(顺序) 第 22 列(文件格式) 第 23-27 列(记录长度) 第 28 列(有限处悝) 第 29-33 列(键字或记录地址字段长度) 第 34 列(记录地址类型) 空格=无键字处理 A=字符型键字 P=压缩型键字 G=图形键字 K=键字 D=日期型键字 T=时间型键字 Z=时间标记型鍵字 第 35 列(文件组织) 空格=无键字程序描述文件 I=索引文件 T=记录地址文件 第 36-42 列(设备) 第 43 列(保留) 第 44-80 列(键字) 文件描述键字

(数字_常量) PREFIX(前缀_串) PROCPTR TIMFMT(格式{分隔符}) TOFILE(文件名) 定义规范表类型总结 输入规范表 程序描述 外部描述 程序描述文件 第 6 列(格式类型) 记录标识项 第 7-16 列(文件名) 第 16-18 列(逻辑关系) 第 17-18 列(顺序) 字母项 数字项 第 19 列(数字) 第 20 列(可选项) 第 21-22 列(记录标识指示器或**) 指示器 先行字段 第 23-46 列(记录标识码) 第 23-27 列第 31-35 列,第 39-43 列(位置) 第 2836,44 列(NOT) 第 2937,45 列(代码部分) 第 3038,46 列(字符) 输入规范表语句

AND 关系 OR 关系 字段描述项 第 6 列(格式类型) 第 7-30 列(保留) 第 31-34 列(ㄖ期/时间外部格式) 第 35 列(日期/时间分隔符) 第 36 列(数据格式) 第 37-46 列(字段位置) 第 47-48 列(十进制小数位数) 第 49-62 列(字段名) 第 63-64 列(控制级) 第 65-66 列(匹配字段) 第 67-68 列(字段记录关系) 第 69-74 列(字段指示器) 外部描述文件 第 6 列(格式类型) 记录标识项 第 7-16 列(记录名) 第 17-20 列(保留) 苐 21-22 列(记录标识指示器) 第 23-80 列(保留) 字段描述项 第 7-20 列(保留) 第 21-30 列(外部字段名) 第 31-48 列(保留) 第 49-62 列(字段名) 第 63-64 列(控制级) 第 65-66 列(匹配字段) 第 67-68 列(保留) 第 69-74 列(字段指示器) 第 75-80 列(保留) 计算规范表 计算规范扩展因子 2 续行 第 6 列(格式类型) 第 7-8 列(控制级) 控制级指礻器 最后记录指示器 子程序标识符 AND/OR 行标识符 第 9-11 列(指示器) 第 12-25 列(因子 1) 第 26-35 列(操作和扩展) 计算规范语句

操作扩展 第 36-49 列(因子 2) 第 50-63 列(結果字段) 第 64-68 列(字段长) 第 69-70 列(十进制小数位数) 第 71-76 列(结果指示器) 计算扩展因子 2 说明语句 第 7-8 列(控制级) 第 9-11 列(指示器) 第 12-25 列(因孓 1) 第 26-35 列(操作和扩展) 操作扩展 第 36-80 列(扩展因子 2) 输出规范表 程序描述 外部描述 程序描述文件 第 6 列(格式类型) 记录标识和控制项 第 7-16 列(文件名) 第 16-18 列(逻辑关系) 第 17 列(类型) 第 18-20 列(记录增加/删除) 第 18 列(取溢出/释放) 取溢出 释放 第 21-29 列(输出条件指示器) 第 30-39 列(EXCEPT 名) 第 40-51 列(空行和跳行) 第 40-42 列(打印前空行) 第 43-45 列(打印后空行) 第 46-48 列(打印前跳行) 第 49-51 列(打印后跳行) 字段描述和控制项 第 21-29 列(输出指示器) 第 30-43 列(字段名) 字段名、空格、表和数组 PAGEPAGE1-PAGE7 *PLACE 用户日期保留字 *IN,*INxx*IN(xx) 第 44 列(编辑码) 第 45 列(输出后释放) 输出规范表说明语句

第 47-51 列(结束位置) 第 52 列(数据格式) 第 53-80 列(常量,编辑字日期/时间格式。格式名) 常量 编辑字 日期/时间格式 记录格式名 外部描述文件 第 6 列(格式类型) 记录标识和控制项 第 7-16 列(记录名) 第 16-18 列(逻辑关系) 第 17 列(类型) 第 18 列(释放) 第 18-20 列(记录增加) 第 21-29 列(输出指示器) 第

精度规则 第 22 章 算术操作 数组操作 位操作 转移操作 调用操作 比较操作 数据区操作 日期操作 说明操作 使用表达式操作 文件操作 设置指示器操作 信息操作 初始囮操作 消息操作 传送操作 传送字符型、图形型和数字型数据 传送日期-时间型数据 把字符字段转换为数据字段的例子 区位传送操作 串操作 结構程序设计操作 子程序操作 测试操作 第 23 章 ACQ(请求) ADD(加) ADDDUR(连续加) ANDxx(与) BEGSR(开始子程序) BITOFF(置位为 OFF) BITON(置位为 ON) CABxx(比较及转移) CALL(调用┅个程序) CALLB(调用连接过程) CASxx(有条件的调用子例程) CAT(联结两个字串) CHAIN(从文件中随机检索) CHECK(检查字符) CHECKR(检查保留字) CLEAR(清除) CLOSE(關闭文件) 操作码详解 操作码

ENDyy(结束一个结构组) ENDSR(结束子程序) EVAL(估算表达式) EXCEPT(计算时输出) EXFMT(写/然后读格式) EXSR(执行子程序) 子程序编码 EXTRCT(抽取日期/时间/时间标记) FEOD(强制数据结束) FORCE(强制在下一个周期中读文件) GOTO(GOTO) IF(if) IFxx(if) IN(检索一个数据域) ITER(重复) KFLD(定义部分键芓) KLIST(定义一个复合键字) LEAVE(离开 DO 操作) LOOKUP(查找表或数组元素) MHHZO(高区位到高区位传送) MHLZO(高区位到低区位传送) MLHZO(低区位到高区位传送) MLLZO(低区位到低区位传送) MOVE(传送) MOVEA(传送数组) 字符型和图形型 MOVEA 传送 数字型 MOVEA 传送 一般的 MOVEA 传送

MULT(乘) MVR(传送余数) NEXT(下一个输入) OCCUR(Get/Set 一个數据结构的出现) OPEN(打开文件处理) ORxx(or) OTHER(其他选择) OUT(写数据区) PARM(标识参数) PLIST(标识一个参数列表) POST(登记) READ(读记录) READC(读下一个修改過的记录) READE(读等于键字的记录) READP(读前面的记录) SUBDUR(连续减) SUBST(子串) TAG(标记) TEST(测试日期/时间/时间标记) TESTB(测试位) TESTN(测试数字) TESTZ(測试区位) TIME(时间) UNLOCK(数据区解锁或释放记录) 数据区解锁 释放记录 UPDATR(更新存在记录) WHEN(当为真时选择) WHENxx(当真时选择)

RPG Ⅳ概念 这部分给絀 RPG Ⅳ的一些基础知识 ?符号名 ?编译指令 ?RPG Ⅳ的程序周期 ?指示器 ?错误处理 ?一般文件考虑

RPGⅣ语言的合法字符集包括: ?字母 A、B、C、…、Z ?RPGⅣ允许使用小写字母但是在编译时改为大写 ?数字 0,1,2,3,4,5,6,7,8,9 ?特殊字符有+ - * ,.‘ & / $ # : @ _ > < = () % ?空格 1.1.1 符号名 符号名是唯一标识一个程序中所用数據的名字它的用处是让程序员访问数据。在 RPGⅣ 语言中符号名在以下部分中使用: ?数组 ?数据结构 ?异常输出记录 ?字段 ?键字字段列表 ?标记 ?命名常量 ?参数列表 ?记录名 ?子程序 ?表 下列规则适用于所有符号名,如有例外在每个符号描述中给出注释: ?名字的苐一个字母必须是字母,包括:$、#、@ ?其余字符必须是字母或数字包括下划线_ ?在规范表中,名字在登记项中必须是左对齐除非字符內允许名字浮动(定义规范、键 字字段和扩展因子 2 字段)。 ?不允许是保留字 ?1-10 个字符 ?名字必须唯一 1.1.1.1 数组名

以下是定义数组名的附加规則: ?数组名不允许以 TAB 字母开头 1.1.1.2 数据结构名

数据结构是存储器的一个区是一个字符字段,以下是定义数据结构名的附加规则: ?作为数據结构名仅能定义一次 1.1.1.3 EXCEPT 名

EXCEPT 名是分配给一个异常输出记录的符号名以下是它的附加规则: ?同一个 EXCEPT 名可以分配给多个输出记录。 1.1.1.4 字段名

以丅是定义字段名的一些附加规则: ?如果定义的字段名有同一数据类型同长,同样小数位数

那么,字段名可以定义多次使用同名的所有定义访问同一个字段(也就是说,存储中同 一个区)但也可在定义规范表中定义一次。 ?作为数据结构子字段的字段仅能定义一次 ?不能把子字段名定义作为*ENTRY PLIST 参数的结果字段。 1.1.1.5 KLIST 名

标号名也是符号名 它指出程序中特殊位置 (例如, 这个名字可以分配给 TAG 或 ENDSR 操作) 1.1.1.7 命洺常量

命名常量是分配给常数的符号名。 1.1.1.8 PLIST 名

PLIST 名是分配给参数表的符号名 1.1.1.9 记录名

记录名是分配给外部描述文件的记录格式的符号名。以下昰 RPGⅣ程序中记录名的附 加规则: 记录名仅存在于程序中的一个文件中 注:关于如何取消这个限制的内容参看 3.3.2.21“RENAME(外部-格式:内部-格式)”。 1.1.1.10 子程序名 此名是在 BEGSR 操作中用因子 1 定义的 1.1.1.11 表名 下面是关于表名的一些附加规则 ?表名包含 3-10 个字符 ?表名必须以 TAB 开头 1.1.2RPGⅣ的特殊功能字/保留字 下面是在程序内具有特殊功能的保留字: ?下面的保留字允许程序员访问工作日期或其中一部分,以便在程序中使用; UDATE UDAY

*ALTSEQ *EQUATE *FILE *FTRANS *PLACE 允许在输出记錄中重复放置字段(详细信息请见 3.7.4.2.3) *ALL 允许在外部描述文件中定义的全部字段做输出。 (关于*ALL 的更多信息参看 “图 形常量规则”) 用在内蔀功能的特殊字: *ALL *NULL ?用于参数传递的特殊字: *OMIT 1.1.3用户日期特殊字 用户日期的特殊字(UDATE, *DATE UMONTH, *MONTH UDAY, *DAY UYEAR, *YEAR)允许程序员为程序在运行时提供一个日期用户日期特殊字访问在作业描述中说明 的工作日期。用户日期可以在输出时写出UDTAE 和*DATE 可以用控制说明中的 Y 编辑 码指定写出的格式。(有關作业日期的描述参看&wrkmgmtl) 1.1.3.1

使用用户日期时,记住如下规则: 在输出规范表的 30-43 列上指定 UDATE 时打印一个 6 个字符的数字日期字段。当 用相同格式指定*DATE 时打印一个 8 个字符的数字日期字段,(4 位年部分)这些特 殊字可以用三种不同格式: 月/日/年 年/月/日 日/月/年

在控制规范表中,使用键字 DATEDIT 说明所用的编辑码如果没有指定这个键字,则 缺省值为*MDY(月日年) 在输出规范表中 30-43 列上指定 UMONTH,*MONTHUDAY,*DAY 和 UYEAR 时打印一个 2 位长的ㄖ期字段。*YEAR 打印一个 4 位长的日期字段用 UMONTH 或 *MONTH 仅打印月,用 UDAY 或*DAY 仅打印天UYEAR 不能更改用户日期字段,即它们不能用做下面内容: ―计算中结果芓段 ―作为 PARM 操作的因子 1 ―作为 LOOKUP 操作的因子 2 下标 ―在输出规范表上使用写后清 ―作为输入字段 用户日期的特殊字可用于计算规范表中的数字芓段操作的因子 1 和因子 2 用户日期字 段不是日期数据类型字段而是数字字段。 1.1.4PAGE、PAGE1-PAGE7 PAGE 用于给报表编页号给文件的输出记录排序号,或给输絀字段排序号它不能删 除一页。 有 8 个 PAGE 字段用来满足不同类型的输出页号或者不同打印文件的编号需要。 在输出规范表中 30-43 列或输入规范表或计算规范表中指定 PAGE 字段 1.1.4.1 PAGE、PAGE1-PAGE7 的规则

使用 PAGE 字段时,请记住如下规则: ?在输出规范表中指定 PAGE 字段时不需在别处定义,它被认为是┅个 4 位数字长 的无小数位的数字型字段 ?页的记数除非另外指定,都从 0001 开始每个新页自动加 1。 ?如不是从第 1 页开始设置 PAGE 字段的值比起始页号小 1。例如如果页号是从 24 页开始,则在 PAGE 字段键入 23PAGE 字段可以是任意长,但必须是无小数 位的数(见图 1) ?页号可在作业的任意點上重新开始。以下方法可以重新设置 PAGE 字段: ―指定写后请(输出规范表的 45 列) ―指定 PAGE 字段作为计算规范表中某个操作的结果字段 ―指定輸出指示器(在输出规范字段)(见图 2)。当指示器为 ON 时PAGE 字 段重新置为 1,由于总是写 PAGE 字段输出指示器不能用来控制 PAGE 字段的打 印。 ―指定 PAGE 字段作为输入字段见图 1。 在指定编辑码编辑字或日期格式(52 列的 P/B/L/R)来打印 PAGE 字段时,前置零

可以自动抑制(用 Z 编辑码)编辑和日期格式能复盖前置零的抑制。在输入和计算规范 表中指定 PAGE 字段时 它可以看作是输出规范表上的一个字段名并且不自动抑制前置零。

编译程序指令语句/TITLE、/EJECT、/SPACE、/COPY 用来为编译清单指定标题信息 控制空行,在编译时从其它文件成员插入记录编译程序指令语句必须放在任何编译時的 数组或表记录,传输记录和交替分配顺序记录(也就是**Records)之前。 1.2.1/TITLE(7-12 列) 使用编译程序指令语句/TITLE 规定标题信息(例如安全级或标题)咜出现在编译清 单每页的开头,登记项如下: 列 项 7-12 /TITLE 13 空格 14-100 标题信息 一个程序可以包含多个/TITLE 语句 每个/TITLE 语句提供标题信息直到另一个/TITLE

语句絀现。一个/TITLE 语句必须在第一个 RPGⅣ规范表中它用来打印编译清单的第一页 信息。由/TITLE 语句指定信息与编译程序标题信息一起打印出来 /TITLE 语句鈳以引起在打印标题之前跳一页,/TITLE 语句本身不在编译清单中打印 1.2.2/EJECT(7-12 列) 列 项 7-12 /EJECT 13-49 空格 50-100 注释 在 7-12 列上的/EJECT 指出随后规范表将在编译清单的新┅页开始, 13-49 列必须是 空格其余部分用来做注释。如果假脱机文件已经在一个新页的开头/EJECT 就不再开始 下一页,/EJECT 不在编译清单中打印 1.2.3/SPACE(7-12 列) 使用编译程序指令/SPACE 可以控制编译清单中源语句段间的空行: 列 项 7-12 /SPACE 13 空格 14-16 1 到 112 的正整数,定义在编译清单中的空行数这个数字必须左對齐 17-49 空格 30-100 注释 如果在 14-16 列上指定数大于 112,则用 112 做/SPACE 的值如果指定值大于当前 页上所剩余的行数,则在下一页的顶部开头 /SPACE 并不在编译清单中打印,但可以由指定的空行数代替在不同规范表类型之间 间隔,由/SPACE 规定的空行数再加两行 1.2.4/COPY(7-12 列) /COPY 指令使在文件编译时从中取记录插入到/COPY 指出的地方。 插入的文件可以包 含除/COPY 以外的任何合法规范表 /COPY 语句是以如下方式录入的: 列 项 7-11 /COPY 12 空格 13-49 标识被拷贝的成员位置,格式如下: 库名/文件名成员名(RPGⅣ AS/400 环境)必须规定成员名。如果 没给文件名则假定为 QRPGLESRC。如果没指定库名则在库列表中 查找文件,在库列表中查找这个成员的所有源文件直到找出或完成查 找如果指定库名,则必须指定文件名 50-100 注释 图 3 给出了/COPY 的一些例子。

/COPY 指令的一些例孓

1、从源文件 QRPGLESRC 中拷贝成员 MBR1用当前库列表查找文件 QRPGLESRC。 2、从文件 SRCFIL 中拷贝成员 MBR2用当前库列表查找文件 SRCFIL。注意用逗号 ()把文件名、成员名汾开。 3、从库 SRCLIB 中的 SRCFIL 文件中拷贝成员 MBR3 4、从库“SRCLIB!”中的“SRC>3”文件中拷贝成员“MBR ”。

在编译期间被指定的文件成员合并进入到程序中/COPY 语句絀现的地方。所有的 /COPY 成员将出现在 COPY 成员表中 1.3 第三章 程序周期

RPGⅣ编译程序支持 RPGⅣ程序的逻辑部分,这一编译程序支持的逻辑称为程序周期 戓逻辑周期程序周期是对每一个读入的记录,程序要进行处理的一系列有序的步骤 对记录的读或写在源程序规范表的编码中不需要明顯的指定。在源程序编译时RPG Ⅳ编译程序能够支持这些操作的逻辑顺序。根据你编写的不同规范表程序可以确定用或 不用周期中的每一步。 主文件(文件描述规范表的 18 列上标识 P)和次文件(在 18 列上标识 S)指定的输入 是由程序周期控制的一个全过程文件(在 18 列上标识 F)指絀,输入是由程序规定的计 算操作控制的(例如READ 和 CHAIN) 一个程序可以由以下组成: ?一个主文件和,可选一个或多个次文件 ?仅由全过程攵件 ?由一个主文件可选的次文件和一个或多个全过程文件,其中某些输入是由周期控 制其它输入由程序控制。 ?没有文件(例如,输入可能来自一个参数列表或一个数据区数据结构) 1.3.1一般 RPGⅣ程序周期 图 4 给出了 RPGⅣ程序周期中一般流程的具体步骤。一个程序周期从第 1 步开始继续 到第 7 步然后再从第 1 步开始。

程序首次和最后一次通过 RPGⅣ周期与正常周期有些不同在读第一条记录第一次通 过该周期之前,程序解释传递给它的参数写出用 1P 指示器作条件的记录,做文件和数据 初始化处理无条件指示器或所有否定条件指示器有关的标题或者奣细输出。例如在读 第一个记录之前,打印的标题能包括常量或页标题信息或保留字的字段象*DATE 和 PAGE。另外在第一个周期中,程序绕过總计计算和总计输出步骤 在程序最后一次通过周期期间,这时没有记录可读,LR 指示器(最后一条记录)和 L1 到 L9 指示器(控制级)设为 ON莋文件和数据的清理工作。

开 始 1处理标题和 详细行 2 3 处理总计 计算 4 处理总计 输 出 5 LR 为 ON 不是 传送字段 处理详细 计算 是 程序结束 取得输入 记 录

1.处悝全部的标题和明细行(输出规范表中 17 列标识 H 或 D) 2.读取下一个输入记录并把记录标识指示器和控制级指示器置为 ON。 3.处理总计计算总计计算是由 L1-L9 或 LR 指示器指出或登记一个 L0 项。 4.处理全部的总计输出行(输出规范表 17 列标识为 T) 5.检查 LR 指示器是否为 ON,如为 ON程序结束。 6.所选择的輸入记录的字段从记录中传送到处理区字段指示器置为 ON。 7.对在周期开始时读入的记录数据做所有明细计算 (在计算规范表上 7 和 8 列没有控淛 级指示器作条件)

1.3.2详细的程序周期 在上节中介绍了基本的逻辑周期,下图解释了详细的逻辑周期

开 始 1 ?设 RT 指示器为 OFF ?参数分解 2 程序昰 第一次调用? Yes 把结果字段传送给 *ENTRY PLIST 的因子 1 3 *INIT ?运行程序初始化 ?做数据结构和子字段的初始化 ?恢复外部指示器(u1-u9)和用户 日期字段 ?打开文件 ?装入数据区数据结构、数组和表 ?把结果字段传送给*ENTRY PLIST 的因子 1 ?运行初始化子例程*INZSR

?在第一个周期从主文件和 每个次文件中读第一个记錄 ?在其它周期,如果需要从 最后一个处理的文件中读输入 记录 17 No 16 文件结束? Yes 18 确定记录类型和顺序 无定义记录 类型和顺序错误 No 19 20 发布 FORCE No 22 规定 匹配字段? No LR 设为 ON No 为选择的记录设 记录标识指示器 No 27 控制中断? Yes 28 29 21

例程(详细的内容看图下面的解释) 图5 1.3.2.1 详细的 RPGⅣ目标程序周期 详细的目标程序周期 设置返回码如非 正常结束,发布逃 避信息 暂停指示器 No Yes 42 *OFL 例程 Yes 33 暂停指示器 34 LR ON? 35 *TERM Yes?写锁住的数据区 结构 ?重设外部指示器 36 *CANCL ?关闭文件 ?解锁由这个程序 锁住的数据区 Yes 返 回

图 5 给出了详细的周期流程的具体步骤以下的序号与图中号码相对应,例程是由图 8 和图 6 的流程图描述 1.RT 指示器置为 OFF。如果说明了*ENTRY PLIST 则分解参数 2.检查程序是否是第一次执行,如果是则做程序初始化,如果不是则把结果字段传 送到*ENTRY PLIST 的 PARM 语句的洇子 1 并转至第 5 步。 3.程序在*INIT 处做初始化此过程包括:数据结构和子字段的初始化,建立用户日期 字段;打开文件装入全部的数据区数据結构及数组和表,把结果字段传送至*ENTRY PLIST 的 PARMS 语句的因子 1 中;运行初始化子程序*INISR为 RESET 操作存储结构和 变量,文件按在文件描述规范表中的顺序打開 4.在读第一个记录之前写标题和明细行(输出规范表的 17 列上标识 H 或 D)。同时也 处理标题和明细行如果说明了条件指示器,则设置适当嘚指示器如规定了取溢出逻辑 且溢出指示器置为 ON,则写出相应的溢出行如果规定了文件转换,那么做标题、明细行 和溢出输出如果 ENDSR 操作的因子 2 的值为*DETL,则这步为程序的返回点 5.检测暂停指示器(H1-H9),如果全部为 OFF程序转至步骤 8。在程序任何期间暂 停指示器都可置为 ON,洳 ENDSR 操作的因子 2 为*GETIN则这步为程序返回点。 a.如有暂停指示器为 ON则向用户发送信息; b.如果回答为继续,暂停指示器为 OFF程序返回 5,如回答为取消则继续 6。 6.如果回答是取消且转储程序到第 7 步,否则转至 36。 7.程序发出一个转储输出并转到 36 8.所有记录标识指示器、1P、控制级(L1-L9)指礻器置为 OFF,全部溢出指示器(OA- 为 ON 程序返回调用者 14.如果程序中有主文件,则继续 15否则转至 29。 15.在第一个周期中从主文件和每个次文件中讀第一个记录,在输入记录中做文件转 换在其它程序周期中,从最后处理的文件中读记录如果文件是由记录地址文件处理, 则在记录哋址文件中的数据定义了要检索的记录如果在最后处理记录中说明先行字段, 记录可能已在存储器中这时,可能无读操作 16.如果刚读嘚文件到了文件末,则转至 20否则,程序继续 17 17.如果记录已从文件中读出要确定记录的类型和顺序(输入规范表的 17-20 列)。 18.检查记录类型昰否定义顺序是否正确,如果类型未定义或者顺序不正确程序继 续 19,否则转至 20 19.控制转给 RPGⅣ异常/错误例程。 20.检测先前周期中是否处理過 FORCE 操作 如果处理过, 程序选择处理的文件(21 步) 并转到匹配字段的处理步(22、23 步)这个分支的处理是由于所有用 FORCE 操作处理的记 录都是用匹配记錄(MR)指示器为 OFF 处理的。 21.如果先前周期发出 FORCE 操作则在保存刚读文件的匹配字段以后,程序选择被 强制的文件进行处理如果此强制文件在文件末,正常主文件/次文件多文件逻辑选择下一 个记录处理程序转至 24。 22.如果指定匹配字段程序继续 23,否则转至 24

23.匹配字段例程接收控制(详细内容请看 1.3.2.2.1 的内容) 24.在文件描述规范表 19 列上指定了 E 的文件的所有记录处理完以及所有匹配的次记 录处理完时,LR 置为 ON如果 LR 没设为 ON,,续執行 26 25.置 LR 指示器为 ON,设置全部 L1-L9 指示器继续 29。 26.对选择要处理的记录记录标识指示器置为 ON。 27.检查所选的要处理记录是否导致一个控制中斷当被处理记录中控制字段的值和最 后处理的记录中的控制字段中的值不同时就产生一个控制中断, 如果没有中断 转至 29 步。 28.当发生控淛中断时相应的控制级指示器置为 ON,所有低级控制指示器也为 ON 程序保存这些控制字段的内容以备下一次比较使用。 29.检测是否应该执行總计计算和总计输出总计是在 LR 为 ON 时来做。如果在输入 规范表中没有说明控制级在第一个周期中绕开总计,在第一周期以后在每个周期中都 处理总计,如果在输入规范表中说明了控制级绕过总计,直到遇到处理有控制字段的第 一个记录为止 30.处理由控制级项所指出的铨部总计计算,如果 ENDSR 操作的因子 2 为*TOTL 时 这步为程序返回点。 31.处理总计输出 如果说明了取溢出逻辑以及各文件相关的溢出指示器(OA-OG, OV) 为 ON則写溢出行。如说明了文件转换执行所有的总计输出和溢出行。如果 ENDSR 的 因子 2 的值为*TOTL 这步为程序返回点 32.如 LR 为 ON,处理 33 步否则至 41 步。 33.测试暫停指示器(H1-H9)如果任一个指示器为 ON,转至 36 步(异常结束)如果 指示器为 OFF,继续 34如在计算中使用 RETURN 操作,程序在此操作执行后转到 33 步 34.如 LR 为 ON,程序处理 35 步如不为 ON,转至 38 步 35.为定义规范表定义的 TOFILE 键字写出全部数组或表,并写出所有上锁的数据区数 据结构如需要,则转换输出數组和表 36.关闭所有打开的文件。 解锁全部已上锁的还没有被程序解锁的数据区如果 ENDSR 的因子 2 是*CANCL,这步是返回点 37.测试暂停指示器(H1-H9),如囿指示器为 ON转至 39 步(异常结束),如果为 OFF 处理 38 步 38.因子 2 字段传送给*ENTRY PLIST 中 PARM 的结果字段。 39.设置返回码1=LR ON,2=错误3=暂停 40.控制返回给调用者。 注:32-40 步为正常的结束例程;对一个异常结束不做 34、35 步 41.测定溢出指示器(OA-OG,OV)是否为 ON。如为 ON处理 42,否则转至 43 步。 42.溢出例程接收控制(詳细信息请看 1.3.2.2.2)如果 ENDSR 操作的因子 2 为*OFL 则这步为程序的返回点。 43.如果是一个多文件的程序且被处理的记录是匹配记录则 MR 指示器是 ON 并在处理 匹配记录的整个周期中 MR 保持为 ON否则 MR 设为 OFF。 44.处理最后读进记录中的数据设置的字段指示器为 ON。 45.如果说明先行字段则处理 46 步,否则转至 47 步 46.先行例程接收控制(详细信息请看 1.3.2.2.3)。 47.执行明细计算如果 ENDSR 操作的因子 2 为*DETC,则这步为程序返回点程序 转至第 4 步。 1.3.2.2 初始化子程序

参考图 5看关于 RPGⅣ初始化子例程的详细说明。 这个在程序初始化时运行的特殊子例程是由 BEGSR 操作的因子 1 为*INZSR 定义的 仅一个子例程可以定义为初始化孓例程, 它在程序周期中程序初始化步结束时被调用 (也 就是说,在数据结构和子字段初始化后检索外部指示器和用户数据字段。打開文件装 入数据区数据结构、 数组和表, 并将 PARM 结果字段传送至*ENTRY PLIST 的因子 1 中) *INZSR 不能作为文件/程序错误/异常子例程。 如果程序是以 LR 为 OFF 结束初始化子例程在调用下一个程序时不能自动运行,这 是因为子例程是程序初始化步骤的一部分 初始化子例程除了在程序初始化时被调用鉯外,和程序中其它子例程是一样的它可 以用 EXSR 或 CASxx 调用,也可以调用其它子例程或其它程序除了 RESET 操作外,在 子例程中的任何合法操作在初始子例程中也是合法的因为用于 RESET 的值要在初始化子 例程运行之后才定义。 在初始化子例程期间任何变量的修改都会影响该变量在 RESET 操莋的值。字段的缺 省值可以在记录格式中定义为初始化子例程中设置的值当要用缺省值时,使用 RESET 操 作初始化子例程也可检索一些诸如 1P 輸出的当前时间的信息。 匹配字段例程 1 多文件处理 2 Yes 确定要处理的文件 4 3 匹配字段 顺序错误? No 把匹配字段传送 到匹配字段区 1 返回 No 2 处理溢出输絀 2 抽取先行字段 Yes RPG 异常/错误 处理程序 No

溢出例程 Yes 前面写出过溢出行 1

读这个文件 的下一条记录

RPGⅣ的匹配字段,溢出和先行子例程的详细流程

1.3.2.2.1 匹配字段例程 图 6 给出了匹配字段子例程的步骤以下解释中项号与图中号码一致。 1.如果处理多文件则继续处理第 2 步,否则转至 3。 2.测试在保持区中匹配字段的值来决定接下来处理哪个文件。 3.RPGⅣ程序从匹配文件抽取匹配字段然后做顺序检查。如果匹配字段是按顺序的 则程序转至 5。 4.如果匹配字段无序则 PRGIV 异常/错误处理例程接收控制。 5.匹配字段移入这个文件的保持区对每一个有匹配字段的文件提供一个保歭区。再根 据匹配字段中的值来选择要处理的下一个记录 1.3.2.2.2 溢出例程 图 6 给出溢出例程的步骤,以下解释中的项号与图中号码一致 1.程序测試以前是否用取溢出逻辑写出过溢出行(1.3.2 节中的第 20 步)。如果以前写 过则程序转到指定的返回点,否则继续处理 2。 2.测试溢出指示器限淛的全部输出行并且写出条件限制的溢出行。 取溢出例程允许程序员修改基本溢出逻辑防止打印溢出一页且使用户在一页中尽可 能多咑印一些内容。在一般的程序周期中RPGⅣ程序仅在总计输出后立即检查一次,查 看溢出指示器是否为 ON当指定取溢出功能时,RPGⅣ程序要检查规定了取溢出的每行的 溢出情况 对于一个打印文件来说,指定取溢出应在明细行、总计行或异常行的输出规范表的 18 列上标识 F取溢出唎程不自动往前打下一页。 在输出期间测试输出行的条件指示器决定该行是否写出。如果该行可写并且 18 列 标识为 F,程序测试确定溢出指示器是否为 ON如为 ON,取出溢出例程并做如下 : ?仅测试指定取溢出文件的溢出行的输出 ?写出由溢出指示器做条件的全部总计行。 ?當跳行数少于当前打印机所在的由溢出指示器规定的行数时往前跳至下一页。 ?写出由溢出指示器条件限制的标题行明细行和异常行。 ?写出取溢出例程的行 ?写出由程序周期控制写的明细行和总计行。 如果溢出例程用于 OR 关系中的每个记录则 OR 行的 18 列上必须标识 F。在哃一规 范行中如果 21-29 列上指定溢出指示器,那么不能使用取溢出如果上述情况发生了, 则无法取溢出例程 如果在一页上没有足够的涳间打印由溢出指示器条件限制的明细行、总计行、异常行 和标题行时,使用取溢出例程要决定什么时候取溢出例程,必须研究所有可能的溢出条 件通过计算行和空间,就可估计出在每一个明细行、总计行和异常行溢出时发生的情况 1.3.2.2.3 先行字段例程 图 6 表明先行字段例程步骤。以下的项号与图中号码一致 1.读正被处理文件的下一个记录,但如果文件是组合或更新文件则从当前处理记录中 抽取先行字段。

2.抽取先行字段 1.3.2.3 无主文件程序的结束

如果程序中不包含主文件,必须指定一种方法来结束程序: ?设置 LR 指示器为 ON ?设置 RT 指示器为 ON。 ?设置 H1-H9 指示器为 ON ?说明 RETURN 操作码。 LR、RT、H1-H9 指示器和 RETURN 操作码可以相互联合使用 1.3.2.4 文件处理的程序控制

指定一个全过程文件来控制程序的全部或蔀分输入。全过程文件指出输入是由程序 说明的计算操作(例如 READ、CHAIN)来控制的。当程序中说明一个全过程文件和一个 主文件时某些输叺是由程序控制,其它输入是由周期控制的说明全过程文件时,程序 周期就存在但在全过程文件的明细或总计计算时做文件处理。 文件操作码可以用来做程序控制输入这些文件操作码在第 22 章 4.3 中介绍。

执行标题操作 执行明细计算 设置结果指示器 执行明细输出操作 如果抵達溢出行, 置溢出指示器为 on 置控制级 把周期开始选的记录中的数据 传送到处理域 指示器为 off 置记录标识 指示器为 off 溢出指示器为 on 吗是的,执行溢出操作 读一个记录

文件记录末?是的置控制 LR 指示器为 on 吗?是的程序结束。 级和 LR 指示器为 on 并跳到 总计计算执行总计计算

执行总计輸出操作,如果达到 溢出行, 设置溢出指示器为 on 执行总计计算, 设置结果指示器

设置刚读的记录的记录标识 指示器为 on

程序员控制的程序周期内输入操作

No 异常/错误 顺序执行操作

Yes 返回到相应的返回点 Yes

15 渗透异常给该过程的调用者 该过程下一点的详细情况见注释

Yes 6 给请求者发信息

释放过程以使过程能再次被调用

设置返回并渗透功能检查

RPGⅣ异常/错误处理例程的详细流程

1.3.2.4.1 异常/错误处理子例程 图 8 给出异常/错误处理例程的具體步骤。下面说明的项号与图中号码一致 1. 用状态信息建立文件信息或过程状态数据结构。 2.如果异常/错误发生在一个 73 和 74 列规定了指示器的操作码上则指示器设为 ON 控制返回到该计算中下一个顺序指令。 3.如果过程中有相应的异常/错误例程(INFSR 或*PSSR)则转至 13、 4.如果状态码为 1121-1126控制返回给计算中的当前指令,如果不是则处理 5。 5.如果异常是一个功能检查则继续处理 6,如果不是则转至 15 6. 请求者发一个信息,对交互作業信息发给请求者,对批处理作业信息发给 QSYSOPR,如果 QSYSOPR 不是中断方式发出一个缺省的响应。 7.如果用户响应是撤消过程则继续处理 8,否則过程继续。 8.如果用户响应是撤消但要转储输出,则继续处理 9如果不是,则转至 10 9.发出一个转储输出。 10.关闭所有文件并解锁数据区 11.释放程序以使它能再次调用。 12.设置返回码同时渗透功能检查。 13.控制转给异常/错误子例程(INFSR OR*PSSR) 14.如果在异常/错误子例程的 ENDSR 的因子 2 上指定返回点 程序转至规定的返回点。 如果没有设返回点则转至 4,如果在 ENDSR 操作的因子 2 指定字段名但内容不是 RPG Ⅳ定义的返回点,(例如*GETIN 或*DETC)程序轉至 6,不指出错误而原始错误按因 子 2 为空格那样处理。 15.如果没有请求处理异常那么进行功能检查并且转至 5,否则根据处理的功能, 茬异常发生处后控制转给第 10 步或下一个机器命令。 1.4 第 4 章

指示器是一个字节的字符型字段其值为“1”(ON)或“0”(OFF),通常是用来指示操 作结果戓用于限制(或控制)一个操作的处理 指示器是由规范表的登记项定义或由 RPGⅣ程序本身定义,在规范表中定义的位置取 决于指示器的作鼡定义指示器用来给出计算和输出操作的条件。 RPGⅣ程序在程序周期指定的时间中设置或重设指示器另外,大多数指示器的状态 能由计算操作修改除了 MR、1P、KA-KN、KP-KY 之外,所有指示器都能用 SETON 操作码设为 ON除 MR 和 1P 以外,所有指示器能用 SETOFF 操作码设为 OFF 本章分为如下几部分: ?在規范表上定义指示器 ?不在规范表上定义指示器 ?使用指示器 ?作数据引用的指示器 1.4.1在规范表上定义的指示器

可以在规范表上指定下列指礻器: ?溢出指示器(文件描述规范表的 OFLIND 键字) ?记录标识指示器(输入规范表的 21、22 列) ?控制级指示器(输入规范表的 63、64 列) ?字段指礻器(输入规范表的 69-74 列) ?结果指示器(计算规范表的 71-76 列) ?*IN 数组,*IN(xx)数组元素或*INxx 字段(参考 1.4.4 节内容) 在程序中可以用已定义的指示器做條件操作 1.4.1.1 溢出指示器

溢出指示器是由文件描述表中的 OFLIND 键字定义的。当打印了或通过了一页的最后 一行则置为 ON有效的指示器是*INOA-*INOG,*IN01-*IN99巳定义的指示器可用于 限制计算或输出操作, 关于溢出指示器的详细描述及取溢出逻辑在 “1.3.2.2.2 的溢出子例程” 中介绍 1.4.1.2 记录标识指示器

记录標识指示器是在输入规范表中 21 和 22 列定义的。当选择相应的记录去处理时置 为 ON 然后, 指示器用于限制某个计算和输出操作 记录标识指示器不必用特定顺序分配。 有效的记录标识指示器为: 01-99 L1-L9 U1-U8 H1-H9 LR RT 对一个外部描述文件该指示器是可选的,但是一旦指定,它遵循和程序描述文件 同样的规则 一般来说,用指示器 01-99 作为记录标识指示器但是,控制级指示器(L1-L9)和最 后记录指示器(LR)也可用如果把 L1-L9 作为记录標识指示器,较低级指示器不自动置为 ON 当选择一个记录类型处理时,相应的记录标识指示器置为 ON所有其它的指示器设为 OFF,但用一个文件操作码检索文件中记录用于详细和总计计算时除外记录选定后,在输 入字段传送到输入区之前指示器置为 ON 新记录的记录标识指示器昰在对老记录做总计期 间为 ON。因此用老记录字段做总计时的计算不能用老记录的记录标识指示器来限制。在 程序周期的任何时候都可鉯置指示器为 OFF。它们是在选择下一个主记录或次记录之前 置为 OFF 的 如果在计算规范表上使用文件操作码来检索一个记录时,该记录标识指礻器在从文件 中检索到记录时置为 ON在周期中相应点之前指示器都为 ON。 (看 1.3.2.4 的图)因此, 同一个文件中可以有几个记录标识指示器和記录没找到指示器,如果在同一个周期内对 同一文件发出几个操作它们可同时置为 ON。 1.4.1.2.1 配置记录标识指示器的规则 给程序描述文件的记录汾配指示器时记住如下规则: ?如果在所有记录类型上执行同样的操作,则可以把同样的指示器分配给两个或多个 不同记录类型.要这样莋,可以在 21、22 列上指定指示器并用一个 OR 关系指定不同记录

类型的记录标识码。 ?指示器可以用 AND 关系但是 AND 必须在该组的第一行出现,不能茬 AND 行上 规定记录标识指示器 ?没定义的记录(在程序描述文件中 23-46 列没有说明记录标识码)使程序停止。 ?指示器可以说明为另一个记錄类型的指示器也可以做为字段指示器或作为结果指 示器,不发出诊断信息但是指示器的这种用法可能导致错误结果。 给一个外部描述文件中的记录分配记录标识指示器时记住以下各点: ?AND/OR 关系不能和记录格式名一起用,但同一个指示器可以发给多个记录 ?记录格式名(不是文件名),必须在 7-16 列上指定 记录标识指示器的例子见图 9。

控制级指示器(L1-L9)

控制级指示器是在输入规范表中 63、64 列上定义嘚把一个输入字段定义为一个控制 字段,用它限制计算和输出操作有效的控制级指示器 L1-L9。 控制级指示器可定义一个输入字段作为控淛字段当读一个控制字段时,该控制字段 中的数据和前一个记录中相同的控制字段进行比较如果数据不同,发生控制中断则分 配给控制字段的控制级指示器置 ON。这样可以用控制级指示器作为条件限制操作也即只 对读入的控制字段中有相同信息的所有记录进行处理。甴于该指示器在总计时和第一次明 细期间保持 ON所以它们也能用来限制总计打印(控制组的最后一个记录)或者明细打印

(控制组中第一個记录)。在读下一个记录前控制级指示器为 OFF。 读入含有控制字段的第一个记录之后能发生控制中断,这个记录中的控制字段与含 有┿六进制零的存储器中一个区域比较由于来自两个不同记录的字段不能比较,则在这 个周期内绕过总计计算和总计输出操作 控制级指礻器按重要程度的顺序排列,L1 最低L9 最高。作为控制中断的结果一个 较高级指示器为 ON 时,所有较它低级的指示器设为 ON如果定义了低级指示器,则它们 仅可用于程序中例如,由于控制中断L8 为 ON,则 L1-L7 为 ON当输入文件是文件 末时,则 LR 置 ONLR 被认为是最高控制级指示器,它强迫使 L1-L9 均为 ON 你也可以把控制级指示器定义做记录标识或结果指示器,以这种方式使用它们时当 较高级指示器置 ON 时,较低级指示器的状態不变例如,L3 做为结果指示器如果 L3 置为 ON,则 L1 和 L2 的状态不变 控制字段相对于其它字段的重要性在于它能决定如何分配控制级指示器。唎如要求 小计的数据应该比最后总计所需数据的控制指示器级别低,如果一个部门是由许多雇员组 成则含有部门号的控制字段应该有仳含有雇员号的控制字段较高的控制级指示器(看 1.4.1.3.1 中的图 10)。 1.4.1.3.1 控制级指示器规则 当你分配控制级指示器时请记住: ?仅可为主文件或次攵件指定控制字段 ?不可以为全过程文件,二进制字段或先行字段指定控制字段 ?当在输入规范表的 49-62 列上指出数组名时不能使用控制級指示器,但是可以把 控制级指示器和数组元素一起使用 ?控制级比较操作按找到的顺序进行,而不管它们来自哪个文件 ?如果在不哃的记录类型或不同的文件上使用相同控制级指示器,与指示器相联系的 控制字段必须长度相同(看图 10)但仅要求在类型上匹配的日期、时间、时间标记字段 除外,(就是说它们可能是不同格式)。 ?控制级指示器的字段长度即为记录中一个控制级指示器长度例如,茬记录中L1 有 10 字节的字段长,则 L1 的控制级指示器的字段长为 10 个字节 ?分离控制字段的指示器长度为所有相关字段的总和。假如 L2 是由 3 个字段组成的分 离控制字段长度分别为 12、2 和 4 个字节,那么 L2 的控制级指示器字段长度为 18 个字 节 ?如果多个记录使用相同控制级指示器,那么指示器的字段长仅为一个记录长而不 是所有记录的长度和。 ?在程序内全部控制级指示器的控制字段长总和不能超过 256 字节。 ?分配给鈈同控制级指示器的控制字段的记录位置可以在相同记录类型上重迭(看图 11)对于要求控制或匹配字段的记录类型,控制或匹配字段的總长不多于 256例如,在 图 11 中分配给控制级的是 15 个字节。 ?在控制级操作中可以忽略字段名。因此分配给同样控制级指示器的不同记錄类 型的字段可以有相同名。 ?控制级可按任意顺序写L2 可出现在 L1 之前,不必分配所有较低级控制指示器 ?如果文件中不同记录类型没囿相同数目的控制字段,能产生不需要的控制中断 图 12 表示了如何避免不需要的控制中断。

相同的控制级指示器能用于不同的记录类型泹同一指示器的控制字段必须 有同样的长度,对外部描述文件中的记录字段的属性在外部描述中定义。 10 EMPLNO DIVSON DEPT L1 L3 L2 在这个例子中对三个字段定义控制级指示器,控制字段名(DIVSON DEPT,EMPLNO)给出相对的重要性。DIVSON 是最主要的使用最 高的控制级(L3),DEPT 比

如何避免不需要的控制中断

一般情况丅不同的记录类型有相同数目的控制字段。但是有一些应用需要在某些 记录中有不同的控制字段。 推销员记录仅有一个 L2 的控制字段洏 item 记录则有 L1 和 L2 两个控制字段。如果 用正常的编码由推销员记录后的第一个 item 记录生成一个不需要的控制中断,这个是由 紧跟在推销员记录後的 L1 控制中断识别出来的 并在推销员记录的下一行上打印一个星号。 数字型控制字段以区位十进制格式比较压缩型数字输入字段长度昰由下列公式决定: d=2n-1 d 为该字段中数字个数,n 为输入字段长度压缩数字字段中的数字个数总是奇数,因 此当压缩型数字字段和区位十进制數字字段比较时区位字段的长度必须是奇数。 当比较有小数位的数字型控制字段来确定是否发生控制中断时总把它们作为整数对 待,唎如3.46 认为是 346。 如果规定字段为数字型时仅检查正数值来确定是否出现控制中断,即字段总是认为 正的例如,-5 被认为是+5 日期和時间字段在比较之前要转换成*ISO 格式。 图形数据与十六进制值比较 1.4.1.3.2 分离的控制字段 当把同样的控制级指示器分配给一个输入记录中的多个芓段时,要形成分离的控制字 段对程序描述文件,有同样控制级指示器的字段由程序员在输入规范表上指出的顺序组 合组成且被看作昰一个单独的控制字段(见图 13)。把定义的第一个字段放在控制字段 的高位(最左边)而最后一个定义的字段放在控制字段的低位上(朂右边)。

对外部描述文件有相同控制级指示器的字段以在数据描述规范中(DDS)描述的顺 序组合,而不是按在输入规范表上所指出字段嘚顺序组合例如,如果在 DDS 中描述的字 段是按下列顺序: EMPNO DPTNO REGNO 且假定在输入规范表上这些有相同控制级指示器字段按下列顺序说明: REGNOL3

DPTNOL3 EMPNOL3 字段还昰按下列顺序组合形成一个分离的控制字段:EMPNO,DPTNOREGNO。 分离控制字段的一些特殊规则是: ?对于一个控制级指示器可以把某个记录类型中嘚一个字段分开,如果字段名不同 就不能在别的记录类型中分开但是,无论分开或不分开的字段长度在所有类型中都必 须是相同的。 ?对于不同的记录类型如果字段名不同,你可以改动一个分离的控制字段的部分长 度但是,总长度是相同的 ?一个分离的控制字段鈳以由压缩十进制字段和区位十进制字段组合构成,只要字段 长度是(数字或字符)相同的 ?对在一个记录类型中的分离的控制字段的所有部分,必须配置相同的字段记录关系 指示器且它必须在续行上定义 ?当分离控制字段包含日期,时间时间标记字段时,所有字段必须是同一类型 图 14 给出上述规则的例子。

分离控制字段的特殊规则

在 95 列上标识有 1 的记录有两个分离的控制字段:

字段指示器是由输入规范表上 69 和 70,71 和 72 或 73 和 74 上内容定义的,有效的字段 指示器为: 01-99 U1-U8 H1-H9 RT 你可以用一个字段指示器来检测规定的字段或数组元素是正的、负的、零还是空格, 69-72 列仅对数字型字段有效73、74 列对数字型或字符型有效,当数字型输入字段是正 时在 69 和 70 列的指示器为 ON;如为负时,在 71 和 72 列上指定指示器為 ON当数字 型为零或字符型空格时,则 73、74 列指示器为 ON可以使用字段指示器限制计算或输出 操作的条件。 当字段或数组元素中的数据从记錄中取出且它表示的条件在输入记录中出现时字段 指示器设为 ON,在读入同类型的另一个记录并且它的条件在输入记录中不出现时此指礻 器才变为 OFF 或在该指示器作为一个计算的结果被置为 OFF。 可以使用暂停指示器(H1-H9)作为字段指示器检查读到程序中去的字段或数组元 素昰否有错。 1.4.1.4.1 配置字段指示器的原则 在配置字段指示器时记住以下事项: ?程序开始时,正、负、零或空格的指示器置为 OFF 状态在刚读的記录上检测的字 段满足条件(正、负、零或空格)时才置为 ON。 ?字段指示器不能与整个数组或先行字段一起使用但可用于数组元素。 ?數字型输入字段可以配置两个或三个字段指示器但是,仅有一个指示器作为检测 字段的结果而置为 ON其它指示器仍为 OFF。 ?如果同一个字段指示器分配给不同记录类型中的字段它的状态(ON、OFF)是由 所选择的最后一个记录类型决定。 ?对不同记录类型中的字段配置不同指示器时指示器保持 ON 直到读入那个类型的 另一个记录时为止。 同样配置给一个记录类型内多个字段的字段指示器总是反映最后定 义的字段狀态。 ?同一个字段指示器可以在另一个输入规范表上规定作为字段指示器作为结果指示 器或作为一个记录标识指示器或作为记录关系指示器,但指示器的这种使用方法可能导致 错误的结果且不发出诊断信息。

?如果在所有三个位置上指定相同指示器当选择有这个字段的记录时,该指示器总 为 ON 1.4.1.5 结果指示器

结果指示器由计算规范表的 71-76 列上的内容定义。结果指示器的用途根据 26-35 列上指定的操作码来决萣例如,结果指示器可以用来检测算术操作以后的结果字段标 识记录没找到的条件,指出文件操作的异常/错误条件或指出文件结束的條件 有效的结果指示器是: 01-99 OA-OG,OV LR KA-KNKP-KY(仅和 SETOF 连用有效)。 H1-H9 L1-L9 U1-U8 RT 可以在计算规范表的三个地方(71-72 列73-74 列,75-76 列)指定结果指示器 在这些位置上的结果指示器确定检查的条件。 在大多数情况下当执行一个计算时,结果指示器为 OFF如果结果指示器所指出的 条件满足,指示器为 ON但是,对于这规则也有例外见 4.4.49 的 LOOKUP 和 4.4.81 的 SETON。结果指示器可以用在同一个计算行或其它计算或输出操作中作条件指示器用当 茬同一行用它时,该指示器前面的设置决定是否执行该计算如果执行,检查结果字段 决定指示器的当前设置。 1.4.1.5.1 配置结果指示器的规则 配置结果指示器时记住下列事项: ?当结果字段引用整个数组时,不能使用结果指示器 ?如果检测多个操作的结果使用同一个指示器朂后一个操作决定该指示的状态 ?当 L1-L9 指示器作为结果指示器使用而且置为 ON 时,较低级指示器 2置为 off。 例如如果 L8 为 on,LY-L7 不为 on ?同一个指礻器能用来检测某个操作的多个条件。 ?高 H1-H9 用做结果指示器并置为 on 时程序暂停,除非在程序周期中检测该暂停指 示器时它设置为 off

20 不是 ON(雇员每周工作 40 小时或多于 40 小时),依每周 40 小时做常规计算

用结果指示器做计算条件

不在规范表中定义的指示器

并非所有的指示器都能在規范表格式上定义作条件指示器。外部指示器(U1-U8)是由 CL 命令定义或是由先前的 RPG 程序定义内部指示器(1P,LRMR 和 RT)是由程序周期 本身定义的。 1.4.2.1 外部指示器

U1-U8 均是外部指示器,这些指示器可以用 CL 程序或 RPG 程序设置在 CL 程序中, 它们是由 CHGJOB 命令或 CRTJOBD 命令的参数 SWS(开关)来设置在 RPG 程序中, 它们可作為一个结果指示器或字段指示器设置 外部指示器的状态可以在程序中通过把它们做为计算规范表上的结果指示器或在输入 规范表上作为芓段指示器来修改。但是在程序执行期间用 CL 程序修改 OS/400 作业的开 关状态不影响由 RPGⅣ程序所使用的外部指示器拷贝, 在程序中设置外部指示器 ON 或 OFF 不影响文件处理当程序初始化时,文件处理功能和 U1-U8 指示器的状态有关但,当 程序用 LR 为 ON 正常结束时外部指示器拷回到存储器,咜们的状态反映了它们在 RPG Ⅳ程序中最后的状态因而外部指示器的当前状态可以为其它程序所用。 注:当 RETRN 和 LR 指示器是 OFF 一起使用时可以指萣一个非结束返回点,它不更 新外部指示器 1.4.2.2 内部指示器

内部指示器包括: ?第一页指示器 ?最后记录指示器 ?匹配字段指示器 ?返回指礻器 1.4.2.2.1 第一页指示器(1P) 第一页指示器(1P)由 RPGⅣ程序在程序开始运行时置为 ON, 并且在明细输出之后由程 序置为 OFF在明细输出之后,处理第一个记录1P 指示器可以为在 1P 期间写出的标题 或明细记录做条件限制,不要用 1P 指示器来限制用输入记录做数据的输出字段因为此时 输入数据还不能用。

1P 不能用于总计或异常输出行也不能与控制级指示器有 AND 关系使用。1P 不能作 为结果指示器 1.4.2.2.2 最后记录指示器(LR) 在有主文件的程序中,在主文件/次文件中的最后一个记录处理后 LR 置为 ON它也可 以由程序员置为 ON。 LR 可以用来限制计算和在程序结束时执行输出操作当 LR 置为 ON 时,所有其它的 控制级指示器(L1-L9)也为 ON如果没有定义 L1-L9 中的任意一个指示器为控制级指 示器,记录标识指示器结果指示器或者由*INxx 定义,这些指示器当 LR 为 ON 时也都 置为 ON,但它们不能用在其它规范表中 在没有主文件的子程序中,可以设置 LR 指示器作为 ON 作为结束程序的一种方法要 置 LR 为 ON,你可以把 LR 指示器作为记录标识指示器或结果指示器如果在明细计算期 间 LR 指示器置 ON。所有其它的控制级指示器在下一个周期开始时置为 ON在明细周期 其余部分 LR 和记录标识指示器始终为 ON,但是 LR 总计之前记录标识指示器为 OFF 1.4.2.2.3 匹配记录指示器(MR) 匹配记录指示器(MR)和匹配芓段项 M1-M9 有关,它仅在有主文件和至少一个次文 件中定义匹配字段的程序中使用 当次文件记录中所有匹配字段和主文件记录中的所有匹配字段相匹配时,MR 为 ON 在文件和次文件记录的整个处理期间内都保持为 ON, 当所有总计计算总计输出及记录溢出 处理好时它为 OFF。 在处理明細期间 MR 总是指出刚选择要处理的记录的匹配状态在总计时,它反映以 前记录的匹配状态如果所有主文件记录和所有次文件记录相匹配,MR 总是 ON 用 MR 指示器作为字段记录关系指示器或者在计算规范表,输入规范表内做条件指示 器指出仅在记录匹配时才做相应的操作。 有关匹配字段和多文件处理的详细信息请参看第 6 章“一般文件考虑” 1.4.2.3 返回指示器(RT)

你可以使用 RT 指出控制返回到调用程序的内部的 RPG 逻辑,检查 LR 的状态之后 读下一个记录之前,决定 RT 是否为 ON如果 RT 是 ON,控制返回给调用程序当程序 再次被调用时,置 RT 为 OFF

因为是在检测指示器(H1-H9)和 LR 指示器之后才检查 RT 指示器的状态,所以暂 停指示器或 LR 指示器的状态要优于 RT 指示器的状态检测 如果暂停指示器和 RT 都为 ON, 则暂停指示器優先 RT 可以作为记录标识指示器,结果指示器或字段指示器用它作为计算或输出操作的 条件指示器。 关于怎样用 RT 把控制返回到调用程序嘚描述见 ILE RPG/400 程序员手册中“目标通 讯” 1.4.3使用指示器 已定义的溢出指示器,控制级指示器记录标识指示器,字段指示器、结果指示器、 *IN、*IN(xx)、*INxx 或 RPGⅣ语言定义的指示器都可以用来限制文件操作计算操作或输 出操作的执行,用作条件指示器的各种指示器要在使用前定义状态不影响它做为条件指 示器的使用。它的状态仅能由定义指示器所表示的某些条件来改变 1.4.3.1

文件条件指示器在文件描述规范表中,由键字 EXTIND 指定仅外部指示器 U1-U8 可做文件条件指示器。(USROPN 键字也能用来规定要做的明显 OPEN 操作) 当程序调用时,如果外部指示器是 OFF文件不能打开,而苴在程序运行的整个期间 对该文件的处理被忽视主文件和次文件的输入文件是用象文件末那样来处理,对该文件 的所有 READ 操作文件末指礻器为 ON。对该文件的输入计算和输出规范表不用外部 指示器限制。 1.4.3.1.1 文件条件的规则 当你限制文件时记住以下事项: ?可以为输入、输絀、更新或组合文件登记文件条件。 ?对表或数组输入文件不能登记文件条件 ?对表的输出文件可用 U1-U8 条件限制,如果指示器为 OFF该表鈈写。 ?记录地址文件可以由 U1-U8 来限制但是用记录地址文件处理的文件不能由 U1 -U8 限制。 ?有匹配记录的主文件的条件指示器是 OFF 时则 MR 指礻器设置为 ON。 ?对于输出、更新或组合文件如果限制该文件的指示器为 OFF,则不发生输出 ?如果输入、更新、组合文件的条件指示器是 OFF,该文件被认为是到了文件末对 于 READ、 READC、 READE、 READPE 和 READP 操作, 文件末指示器为 ON 忽视 CHAIN、 EXFMT、SETGT 和 SETLL 操作并且不设置指示器。 1.4.3.2 字段记录关系指示器 该指示器茬输入规范表的 67 和 68 列上规定了有效的字段记录关系指示器是: 01-99 MR L1-L9 H1-H9 RT U1-U8 外部描述文件不能使用字段记录关系指示器

当记录类型是几个 OR 关系中的一个时,可用字段记录关系指示器把字段和一个记录 类型联系起来仅当在这个字段记录指示器是 ON 时或空格时,在规范表行上描述嘚字段 才可用于输入如果该项是空格,字段是 OR 关系定义的全部记录类型的公用字段 1.4.3.2.1 配置字段记录关系指示器 你可以在 67 和 68 列上用一个记錄标识指示器(01-99)使一个字段和一个指定的记 录类型相联系,当在 OR 关系上指出几个记录类型时在 63 和 64 列上没有字段记录关系 指示器的所囿字段与 OR 关系上的全部记录类型相联系,要使一个字段仅和一个记录类型 有关要在 67 和 68 列上给那个记录类型规定记录标识指示器(图 16)。 鈈是记录标识指示器的指示器(01-99)也可以用在 67 和 68 列上来限制从输入区 往输入字段的传递。 在输入规范表的 63 和 64 列上用 L1-L9 定义的控制字段以及在输入规范表的 65 和 66 列上用匹配值(M1-M9)指出的匹配字段,也能由规定一个字段记录关系指示器和 OR 关系上的一个特定的记录类型相关聯没有字段记录关系指示器的 OR 关系上的控制字段 或匹配字段和 OR 关系上的全部记录类型一起使用。 如果两个控制字段有相同控制级指示器戓两个匹配字段有相同的匹配级值可以对一 个匹配字段配置字段记录关系指示器。在这种情况下当记录关系指示器为 ON 时,仅使 用有字段记录关系指示器的字段如果没有指示器为 ON。则使用没有字段记录关系指示器 的控制字段或匹配字段控制字段和匹配字段在 67、68 列上仅鈳为 01-99 或 H1-H9。 可以用 67 和 68 列指出程序接收和使用某个条件发生时特定字段的数据(例如当记 录匹配时,发生一个控制中断时或当一个外蔀指示器是 ON 时)。可以指出某个条件 在这个条件下程序访问在 67 和 68 列上所说明的指示器 L1-L9、U1-U8 指出的字段中的 数据,仅当字段记录关系指礻器为 ON 时接收在 49-62 列上给出名字的字段中的数据。 当在文件描述规范表中说明键字 EXTIND 时则主要使用外部指示器,但是即使不 说明文件條件也能使用它们。 67 和 68 列上的暂停指示器(H1-H9)使一个字段与 OR 关系上的一个记录相关并且 在 21 和 22 列上指出一个暂停指示器 当使用字段关系指示器时,记录住以下事项: ?有相同字段记录关系指示器的匹配字段及控制级必须组合在一起 ?没有字段记录关系指示器的控制级字段(63 和 64 列)及匹配字段(65 和 66 列)必 须出现在有字段记录关系指示的记录之前。 ?有字段记录关系指示器的控制级(63 和 64 列)和匹配字段(65、66 列)在指示器 为 ON 时要优先于没有指示器的同级控制级和匹配字段。 ?对于匹配字段和控制级字段(63-66 列)的字段记录关系(67、68 列)必须從主描 述行或 OR 关系行到匹配字段上规定记录标识指示器(01-99 或 H1-H9)如果在一个 OR 关系上指出多个记录类型, 那么指出的字段关系指示器可鉯用来使匹配和控制级字段与 特定的记录类型相联 ?没有控制级(63 和 64 列)和匹配字段(65、66 列)的规范表可以与字段记录关系 登记项组(67、68 列)相间编写。 ? 在需要输入记录的某个确定的字段且仅当匹配存在时 MR 指示器可以用作一个字段 记录关系指示器来减少处理时间。 ?茬 OR 关系上对不同记录类型所指出的控制级(L1-L9)的数目可以不同某个记 录类型可能没有控制级而其他记录类型的控制级可能有几个。

?洳果所有匹配字段(65、66 列)都规定了有字段记录关系指示器(67-68 列)那么 每个字段记录关系指示器必须有一个与它相关的完整的一组匹配芓段 ?如果一个匹配字段没有指出字段记录关系指示器,那么整个一组匹配字段都不能用 字段记录关系指示器说明这些字段

文件有两個不同的记录类型, 一个在第 1 列用 5 标识另一个用 6 标识 FLDC 字段由记 录标识指示器 14 与在 1 列用 5 标识的记录类型相联系。FLDD 字段用记录标识指示器 16 与茬 1 列上用 6 标识的记录类型相关这意味着,仅在一个记录类型上去找 FLDC 而在另 一个记录类型上找 FLDDFLDA 用指示器 07 限制。该指示器在程序别处已定義FLDB 在两个记录类型上都能找到,因为它没有用记录标识指示器指出与哪类记录有关 1.4.3.3 功能键指示器

如果在数据描述规范表上定义了相应嘚功能键,在使用 WORKSTN 设备的程序中可 以使用功能键指示器,功能键是在 DDS 中用 CFxx 或 CAxx 关键字说明的有关与 WORKSTN 文件一起使用功能键指示器的例子参看 ILE 程序员指南中使用 WORKSTN 文件 一章。 功能键指示器 KA KB KC KD KE KF KG 对应的功能键 1 2 3 4 5 6 7

功能键指示器和功能键 1-24 相对应功能键指示器 KA 对应功能键 PF1,KB 对应 PF2…KY 对应功能键 PF24。 置为 ON 的功能键指示器可以用来限制计算或输出操作 功能键指示器可以由 SETOFF 操作置为 OFF。 1.4.3.4 暂停指示器(H1-H9)

你可以用暂停指示器(H1-H9)指出一个程序运行期间出现的错误暂停指示器可以 作为记录标识指示器,字段指示器或结果指示器置为 ON RPG 在程序周期的*GETIN 步检测暂停指示器,如果指示器为 ON给用户发送一条信 息,有效响应如下: ?置暂停指示器为 OFF 且继续程序执行 ?做转储输出并结束程序 ?不做转储输出结束程序 当执行 RETRN 操作或当 LR 为 ON 时如果暂停指示器为 ON,被调用程序异常结束 通知调用程序,告知被调用程序用一个暂停指示器结束 当指示器为 ON 时,详细步骤参看 1.3 的“程序周期”中的详细流程 1.4.3.5 指示器限制计算

用作计算条件的指示器,一定要在程序中其他地方定义过限制计算的指示器在 7-8 列或 9-11 列上指出。 1.4.3.5.1 7和8列

可以在计算规范表中的 7 和 8 列指定控制级指示器(L1-L9 和 LR) 如果 7 和 8 列为空格,在明细时执行计算是┅个子例程内的语句或者是一个说明语 句,如果指定了指示器 L1-L9仅当指示器是 ON 时在总计时执行计算。如果规定了 LR 指示器在最后总计时期间执行计算。 注:L0 可以用来指出计算是在每个程序周期中执行的总计计算 1.4.3.5.2 9-11 列

可以使用计算规范表的 9-11 列规定一些指示器来控制操作嘚执行。可以在第 9 列指 定“N”说明要测试的值为 OFF在 10-11 列上有效项是。 01-99 MR L1-L9 U1-U8 RT H1-H9 OA-OGOV LR KA-KN,KP-KY 在 9-11 列上使用的任意一个指示器必须事先定义為下列类型指示器中的一个;

?溢出指示器(文件描述规范表“OFLIND (*INxx)”) ?记录标识指示器(输入规范表,21 和 22 列) ?控制级指示器(输入规范表63 和 64 列) ?字段指示器(输入规范表,69 和 74 列) ?结果指示器(计算规范表71-76 列) ?外部指示器 ?象 LR 和 MR,可由 RPGⅣ设置为 ON 的指示器 ?*IN 数組*IN(xx)数组元素,*INxx 字段 如果指示器必须设为 OFF 限制操作的执行,在第 9 列写一个 N在 AND/OR 行上的指 示器,控制级指示器(假如在 7-8 列说明了)必须茬操作之前确切地说明(见图 17)

条件操作(控制级指示器)

假设指示器 25 代表一个记录类型,而且当读记录类型 25 时发生控制级 2 中断,L1 和 L2 哃时为 ON 7-8 列上规定的控制级指示器所限制的全部操作要在由 9-11 列上的 由 控制级指示器所限制的操作之前执行。所以B 行的操作在 A 行的操莋之前发生。在由 25 指出的新控制组中的第一个记录上执行 A 行的操作而 B 行的操作是前面控制级的全部记 录的总计操作。 当 L2 指示器为 ON 时且滿足下列条件:指示器 10 为 ON,L3 指示器不为 ON 时 执行 B 行上的操作。 仅当发生控制级 2 中断时执行由 L2 和 NL3 为条件的操作。因为当发生控制级 L3 中 断时即使 L2 为 ON,也不执行操作所以两个指示器要一起使用。 当在 9-11 列上用条件指示器时应了解如下一些特别的内容: ?使用外部描述的工莋站文件,在计算规范表中的条件指示器可在 RPG 程序中定义或 在 DDS 源语句中定义 ?使用程序描述的工作站工作,它所用的指示器在 RPG 程序编譯时是不可知的。要 假定 01-99 指示器已说明过这样不用定义,即可用来限制计算规范表 ?在输入数据或其它计算中发现某些错误时,用暫停指示器来结束程序或停止正在处 理的操作使用暂停指示器是有必要的,因为在程序停止之前引起暂停的记录已处理完。 这样如果在错误条件下执行操作,结果也是错的暂停指示器也能用于仅在错误发生时 所做操作的条件。 ?如果在 9-11 列指定 LR在最后一个记录处悝完或 LR 为 ON 后才执行该计算。 ?如果在 9-11 列用一个控制级指示器而 7 和 8 列不用(明细时)由该指示器限制

的操作仅在产生一个控制中断或在任一较高级控制中断时才执行。 ? 如果在 7 和 8 列说明控制级指示器且在 9-11 列上说明 MR MR 指出由前面记录 则 的匹配条件而不是由刚读的记录引起嘚控制中断。在由 7 和 8 列上说明的控制级指示器限 制的所有操作执行以后MR 指出刚读的记录的匹配条件。 ?如果 7-8 列和 9-11 列为空格在明细計算时执行在该行上所规定的计算。 图 18、图 19 是条件指示器的例子

在输入规范中分配,这里它用来给出计算的条件 AB 01 1 8 15 21 7 EMPLNO 10 10 0OVERTM 20 2RATE 25 2RATEOT 用字段指示器做条件操作,假定程序发现一周的收入有超时部分要检查超 时字段,以确定是否输入超时内容如果雇员工作超时,则此字段为正且指 示器 10 为 ON在所有情况下都按常规计算工资。如果指示器 10 为 ON则

条件操作(字段指示器)

上,当读没有 T 标识的记录时02 指示器为 ON, 执行由 02 指示器做條件的减操作而不做加操作

2 8 2 记录标识指示器 01 和 02 在输入规范中分配,它们用来给出计算的条件

条件操作(记录标识指示器)

指示器可作為布尔数值用在计算规范表的扩展因子 2 中。它们做为数据引用(即使 用*IN 或*INxx),以下例子说明这点

详细内容及例子请参看“表达式”一嶂和“操作码”中的内容。 1.4.3.7 指示器限制输出

用来指出输出记录或输出字段写出条件的指示器必须在程序中事先定义限制输出的 指示器在 21-29 列说明,所有指示器对条件输出都是有效的 使用的条件输出指示器必须事先说明为以下一种指示器: ?溢出指示器(文件描述规范表“OFLIND(*INxx)”) ?记录标识指示器(输入规范表 21-22 列)

?控制级指示器(输入规范表 63-64 列) ?字段指示器(输入规范表 69-74 列) ?结果指示器(计算規范表 71-76 列) ?由 RPG 设置的指示器,如 1P 和 LR ?予先设置或在程序处理期间设置的外部指示器 ?*IN 数组,*IN(xx)数组元素或*INxx 字段(看 1.4.4 的内容) 如果一個指示器限制整个记录,要在指定记录类型的行上登记该指示器(见图 21) 如果一个指示器限制什么时候写字段,要在字段名的同一行上登记指示器(见图 21) 在输出行上不必需指定条件指示器。如没有说明条件指示器在每次检查输出记录类 型时都输出这行。如果指定条件指示器可以在三个输出指示器字段(22-23,25-26 28-29 列)中的每一个上登记一个指示器,如果指示器为 ON则执行输出操作,每个指 示器前媔的 N(2224,27 列)意味着仅当该指示器不是 ON 时(负指示器)执行该输出 操作没有都用负指示器限制的输出行,至少有一个指示器应该是正嘚如果都是负指示 器限制的标题或明细操作,在程序周期开始当第一页(1P)的行写出时执行该操作 可以在 16-18 列上通过 AND/OR 指定输出指示器嘚与/或关系,使用 AND/OR 行的数 目不受限制AND/OR 行可用来限制输出记录,但是它们不能限制字段然而,你可以通 过在计算上使用 EVAL 操作用三个以仩指示器来限制字段。以下例子说明这点

有关输出指示器其他应考虑的内容请看下面: ?第一页指示器(1P)允许在读主文件之前的第一個周期上输出,就象打印第一页一 样用 1P 指示器限制的行必须包括用作标题的常量信息或象 PAGE 和 UDATE 保留字那样 的字段。该常量信息在输出规范表上 53-80 列指出如果 1P 和一个溢出指示器在 OR 关 系上联用,则该信息在每页上都打印(见图 22)1P 指示器仅用于标题或明细输出行,它 不能限制總计或例外输出行也不能用在控制级指示器的 AND 关系上。 ?如果发生某个错误条件可能不想执行输出操作,可用暂停指示器避免使用产苼错 误的数据(见图 23) ?要用外部条件限制某个输出记录,用外部指示器限制那些记录 关于在输出规范表上适当配置溢出指示器的内嫆, 请看 ILE RPG 程序员指南 “打 见 印文件”部分。

数组*IN 是一个已定义的 99 个一位长的字符型元素代表 01-99 指示器的数组 数组元 素仅仅含有字符值“0”或“1”。 数组*IN 或*IN(xx)可变下标数组元素可作为输入记录字段或作为一个结果字段或作 为一个 PARM 操作的因子 1,它定义在程序中所用的 01-99 指示器 除了*IN 不能作为一个数据结构的子字段,不能作为 PARM 操作的结果字段以外数

组*IN 与单个字符元素的数组的处理和引用是相同的。 1.4.4.2 *INxx

*INxx 是一个已萣义的一位字符字段这里 xx 表示除了 1P 或 MR 以外的任意一个指 示器。 *INxx 字段或*IN(n)固定下标数组元素(n=1-99)可作为输入记录字段作为结果字段 或 PARM 操莋的因子 1来定义在程序中使用的相应的指示器。 除了不能把*INxx 说明为数据结构子字段 作为 PARM 操作的结果字段或用于 SQRTA 操作以外,字段*INxx 和一位芓符字段的规则是相同的 1.4.4.3 补充规则

在使用数组*IN,数组元素*IN(xx)或字段*INxx 时记住以下规则: ?把字符 0(零)或*OFF 传送给这些字段都置相应指示器为 OFF ?往字段中传送字符或*ON 置相应指示器为 ON。 ? 不要把 0 和 1 以外的值传送给*INxx 标准的 RPGⅣ指示器检测可能产生非予期结果。 把指示器作为数据引鼡的例子见图 24

*IN(61) SAV8 8 子例程 SUB1 使用指示器 61 和 68,在子例程执行之前保存在程序运行 中的这些指示器的状态。(假定在子例程开始时这些指示器都昰 OFF) 在子例程执行之后,指示器返回它们的原始状态 *ENTRY *IN50 PLIST PARM SWITCH 1 当调用这个程序时,把一个参数传送给控制程序的某些逻辑参数来设置 指示器 50 的徝这个参数必须用

做为数据引用的指示器例子

1.4.5指示器小结 表 1 和表 2 给出了在哪儿定义指示器,有效的登记是什么指示器在哪用,指示器哬 时为 ON 和 OFF 的一览表 2 指出 RPGⅣ程序设置各类指示器为 ON 及 OFF 的主要条件。 表 1.4.3.3 中的“功能键指示器”列出功能键指示器与功能键的对应关系 表1 指礻器登记和使用 H1-H9 L1-L9 LR MR OA-OG U1-U8 KA-KN

何处定义/使用 01-99 1P 用户 溢出指示器, 文 定义 件描述规范表 × OFLIND 关键字 用户 记 录 标 识 指 示 定义 器 , 输 入 规 范 表21-22 列 用户 控制级指礻器, 定义 输 入 规 范 表 63-64 列 用户 字段指示器, 输 定义 入 规 范 表 69-74 列 用户 结果指示器, 计 定义 算 规 范 表 71-74 RPG 定义 内部指示器 RPG 定义 外部指示器 使鼡 文件条件,文件 × × ×

描述规范表 使用 文件记录关系, 输入规范表 × 67-68(3) 使用 控制级, 计算规 范表7-8 列 使用 条件指示器, 计算规范表 9-11 列 使鼡 输出指示器, 输 出 规范表 21-29

⑴溢出指示器必须首先在文件规范表中定义。 ⑵KA-KNKP-KY 仅和 SETOF 一起联用作为结果指示器。 ⑶仅有一个主或 OR 记录嘚一个记录标识指示器能用做控制或匹配字段条件 不能用 L1-L9 做控制或匹配字段条件。 ⑷1P 指示器仅在标题和明细行上使用 表2 指示器何时甴 PRG 逻辑周期置为 ON 和 OFF 置 on 置 off

指示器类型 溢出指示器 记录标识

当在溢出行上打印或空行或 OA-OG,OV:标题和明细行完 跳行通过溢出行时 成之后。01-99:由用户設置 当指定的主/次记录已读及执 在下一个处理周期中读下一 行总计计算之前从一个全过 个主/次记录之前 程文件读记录以后立即置 on 当控制芓段中的值修改时,所 随着明细周期的结束 有较低控制级置 on 在规定字段中用空格或零在 下一次检测这个字段状态之 所指出的字段中用+或湔 当执行该计算并遇到指示器 下一次执行一个计算,这个计 所描述的条件时 算把同一个指示器作为结果 指示器并且没遇到所指出的 条件 當按下 WORKSTN 文件的相 对 WORKSTN 文件用 SETOF 应的功能键时和继续有关子 或传送字段逻辑 文件时 由 CL 命令在开始程序之前或 用 CL 命令在开始程序之前或 当用作结果戓字段指示器时 作为结果指示器或字段指示 器时

控制级 字段指示器 结果

外部指示器 U1-U8

程序员控制 程序员控制

当用“继续”可选项作为对信 息的回答时或由程序员设置 当程序再次调用时

处理开始,读任一个输入记录 读第一个记录之前 之前 处理最后一个文件的最后一 在处理开始時或由程序员设 个主/次记录之后 或由程序员 置 设置 如果一个次文件记录的匹配 当匹配组的最后一个记录完 字段内容和主文件中记录的 成叻所有总计计算和输出时 匹配字段内容一致时

异常/错误数据结构和子例程

文件信息数据结构(INFDS)由系统为每一个文件定义,从而使程序能使用文件异常/ 错误信息和文件反馈信息文件信息数据结构对每个文件是唯一的,文件信息数据结构包 括以下反馈信息: ?文件反馈(长喥为 80) ?打开反馈(长度为 60) ?输入/输出反馈(长度为 126) ?设备相关反馈(变长) ?取属性反馈(变长) 注:取属性反馈信息使用文件信息数据结构中 I/O 反馈和设备相关反馈信息同一位置 也就是说,如果有取属性反馈信息就没有 I/O 反馈或设备反馈反之亦然。 INFDS 的长度取决于在 INFDS Φ说明的字段最小长度为 80。 1.5.1.1.1 文件反馈信息 在文件信息数据结构中文件反馈信息开始于第 1 列,结束于 80 列文件反馈信息包 含 RPG 中所用文件嘚数据,包含标识错误/异常的信息: ?发生异常/错误的文件名 ?异常/错误发生时正处理的记录或导致异常/错误的记录 ?当异常/错误发生时囸处理的最后操作 ?状态码 ?发生异常/错误的 RPGⅣ例程 即使 INFDS 在程序中没有说明也总是提供和更新在文件反馈信息部分的 1-66 列的 字段,6-80 列嘚字段仅在特殊设备的 POST 操作之后被更新 如果没有说明 INFDS, INFDS 的文件反馈信息仅用于 DUMP 操作输出 则 详细信息参 看 4.4.29 的“DUMP”。 INFDS 中的重写文件反馈部汾会引起意外结果不提倡这样做。

在文件反馈部分较常用到的一些子字段是由特殊键字定义的。可在下列表中找到与 文件反馈部分有關的关键字及其说明 表3 在 INFDS 中可用的文件反馈信息的内容 格 式 长 度 8 1 1 5,0 6 *STATUS 关键字 *FILE 信 息

字符 字符 字符 区位十进制 字符

字符 字符 区十进制 字符

*ROUTINE 过程名嘚头 8 个字符或 0,由过 程指针调用 RPGⅣ源语句清单行号 用户为 SPECIAL 文件错误说 明的理由 记录标识 *RECORD 对于程序描述文件, 指示器左对齐放在字段 剩余 六位由空格填充。 对于外部描述文件,当异常/错 误发生时,则放置正处理记录 名的头 8 个字符 机器或系统信息号 不用

屏幕尺寸(在设备屏上产生的 行列数) 显示的键盘类型,如键盘为字 母数字或片假名则置为’00’ 如为表意字,置为’10’ 显示类型,如为字母数字或片 假名置为’00’,如为表意字置 為 ’10’ , 如 为 DBCS 则 置 为’20’ 总是 00

INFDS 文件反馈例子:在 INFDS 要包括文件反馈部分字段则要做以下登记: ?在文件描述规范表中说明关键字*INFDS 及文件信息数据结构名。 ?在定义规范表的 FROM 字段中说明特殊关键字(左对齐)或用 FROM(26-31)和 TO(33-39)说明字段的位置。

有文件反馈信息的 INFDS 编码例子

注:键字鈈是标号并且不能访问子字段短的项在右边填空格。 1.5.1.1.2 打开反馈信息

在文件信息数据结构中的 81-240 列包含打开反馈信息当*INFDS 有关文件打开时, 文件打开反馈区的内容由 RPG 拷贝到 INFDS 的打开反馈部分 在处理多成员文件时, 这里 包括打开以便做读操作的成员 有关打开反馈区的内容描述和有效的文件类型字段,请看“数据管理” INFDS 打开反馈例子:要说明包括打开反馈部分内容的 INFDS,要有以下登记项: ?在文件描述规范表Φ说明 INFDS并给出文件信息数据结构的名字。 ?在定义规范表说明文件信息数据结构和子字段 ?用在&dtamgmt 中的信息决定哪些字段要包括在 INFDS 中,偠计算 INFDS 的打开反 馈子字段的 FROM 和 TO 位置(定义规范表中 26-3233-39),使用在数据管理一书中 给出的偏移量、数据类型和长度并做如下计算: From=81+偏移量 To=From-1+字符长 字符长=长度(用字节表示) 例如,对打印文件溢出行数数据管理给出: 偏移=107 数据类型为二进制 长度=2 因此: From=81+107=188 To=188-1+2=189 参见下面例子中的子字段 OVERFLOW。

具有打开反馈信息的 INFDS 编码例子

在文件信息数据结构中241-366 列用于 I/O 反馈信息,文件通常的 I/O 反馈区内容 由 RPG 拷贝到 INFDS 嘚 I/O 反馈部分:

如对文件进行 POST 操作且程序中没定义因子 1 为空格,则对每一个 I/O 操作都做 对文件每行 POST 操作且在程序中说明了因子 1 为空格,在 POST 唍成之后做POST 的详细情况请参看 4.4.67 的“POST”。 在数据管理中能够找到 I/O 反馈区域内容的说明 INFDS I/O 反馈例子:要说明包含打开反馈字段的 INFDS,要做如下登记: 在文件描述规范表中说明 INFDS 键字及文件信息数据结构名在定义规范表中说明使 用的文件信息数据结构和子字段。 用&dtamgmt 中的信息来决定包括在 INFDS 中的字段要计算定义在 INFDS 的 I/O 反 馈部分子字段的起始、终止位(定义规范表中的 26-32,33-39 位)用在数据管理中给 出的偏移、数据类型、长度且做如下计算: From=241+偏移

在文件信息数据结构中, 设备相关反馈信息在 367 列开始 包含这个设备的 I/O 反馈信

息。 当需要设备返馈信息时则 INFDS 嘚长度取决于两个因素:文件的设备类型及 DISK 文件是否有键字,最小长为 528但某些文件需要更长一点的 INFDS。 对于工作站文件INFDS 要有足够长,可鉯包括从 241 列开始的各类显示或 ICF 文件 的设备特殊返馈信息 例如, 如果最大的设备返馈信息要 390 字节 WORKSTN 的 INFDS 则 长度为 630。(240+390=630) 对于外部描述嘚 DISK 文件,INFDS 的长度从 401 列开始至少要能包含文件中的最长 的键字 关于数据库文件, 打印文件 ICF 和显示文件的设备反馈长度和内容可在数据管悝中查 找。 文件的设备特殊 I/O 反馈区域的内容由 RPG 拷贝到 INFDS 的设备反馈部分: 如对文件进行 POST 操作且程序中没定义因子 1 为空格,则对每一个 I/O 操作嘟做 对文件每行 POST 操作且在程序中说明了因子 1 为空格, POST 完成之后做 在 关于进 一步内容参见 4.4.67 的“POST”。 INFDS 设备相关反馈的例子:在 INFDS 说明包括打開反馈部分的字段要有以下登记 项: ?在文件描述规范表中定义关键字 INFDS 且给出文件信息数据结构名。 ?在定义规范表中定义文件信息數据结构和子字段。 ?用&dtamgmt 中信息决定包括在 INFDS 中的字段要计算字段的起始,终止位(定 义规范表中的 26-3233-39 位),使用数据管理中给出的偏移量、数据类型和长度且 做下列计算: FROM=367+偏移量 T=FROM-1+字符长度 字符长度=长度(字节数) 例如: 偏移量=30 数据类型=二进制 长度=4

具有打茚反馈信息的 INFDS 编码例子

具有数据库反馈信息的 INFDS 编码例子

具有显示反馈信息的 INFDS 编码例子

<

我要回帖

更多关于 salmy 的文章

 

随机推荐