AS400 RPG4实例

  • 格式:txt
  • 大小:110.02 KB
  • 文档页数:47

/viewthread.php?tid=555840&extra=&authorid=645782&page=1
(1)ADD(加)
格式:

操作码 因子1 因子2 结果字段 指示器
ADD(H) 加数 加数 和 + - Z
自由格式 不允许使用+操作符

如果说明了因子1,将因子1和因子2相加,结果放在结果字段中。如果没有说明因子1,则因子2的内容与结果字段的内容相加,结果放在结果字段中。因子1和因子2必须是数字型,它可以是:数组、数组元素、常量、字段、文字、子字段或表。
对于ADD、SUB、MULT和DIV操作,因子1不是必需的。如果不规定因子1,执行操作时默认因子1和结果字段是相同字段。
舍入操作是将结果字段中规定小数位的后边一位做四舍五入,只允许对算术操作进行舍入,不能对MVR操作或后面跟MVR的DIV操作作舍入。仅当计算结果的小数位大于结果字段的小数位时,舍入才影响结果,舍入操作在计算操作之后,把结果放到结果字段之前做。舍入操作之后依据结果字段中的值设置结果指示器。

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
C*
C* 把1加到RECNO中。
C ADD 1 RECNO
C* 把EHWORK的内容加到CURHRS中。
C ADD EHWRK CURHRS
C* 把OVRTM和REGHRS的内容加到一起放在TOTPAY中。
C*
C OVRTM ADD REGHRS TOTPA



(2)ANDxx(与)

格式:
操作码 因子1 因子2 结果字段 指示器
ANDxx 比较数 比较数
自由格式 不允许使用AND操作符

此操作必须直接跟在一个ANDxx,DOUxx,DOWxx,IFxx,OFxx或WHENxx操作之后。用ANDxx操作可组成DOUxx,DOWxx,IFxx和WHENxx完整的条件。ANDxx操作的优先级高于ORxx操作。
控制级入口(7和8列)可以是空格,也可以是L1-L9指示器、LR指示器或一组相应程序段中语句的L0项。该控制级的项必须和相应的DOUxx、DOWxx、IFxx或WHENxx操作的控制及项相同。不允许使用条件指示器(9-11列)。
因子1和因子2必须是一字符文字、命名常量、象征常数、表名、数组元素、数据结构或字段名。因子1和因子2必须是同一类型。例如,字符型字段不能与数字进行比较。因子1和因子2的比较遵循比较操作所规定的原则。见4.3.6“比较操作”。
在操作ANDxx,CABxx,DOUxx,DOWxx,CASxx,IFxx,ORxx和WHENxx中,xx可以是:

xx 含义
GT 因子1大于因子2
LT 因

子1小于因子2
EQ 因子1等于因子2
NE 因子1不等于因子2
GE 因子1大于或等于因子2
LE 因子1小于或等于因子2
空格 无条件处理(CASxx或CABxx)



*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 如果ACODE等于A且指示器50为ON,执行MOVE和WRITE操作。
C*
C ACODE IFEQ 'A'
C *IN50 ANDEQ *ON
C MOVE 'A' ACREC
C WRITE RCRSN
C* 如果前面的条件不满足但ACODE等于A,指示器50为OFF,且
C* ACREC等于D时,执行下面的操作。
C*
C ELSE
C ACODE IFEQ 'A'
C *IN50 ANDEQ *OFF
C ACREC ANDEQ 'D'
C MOVE 'A' ACREC
C ENDIF
C ENDIF

(3)BEGSR(子程序开始)


操作码 因子1 因子2 结果字段 指示器
BEGSR 子程序名
自由格式 BEGSR subroutine-name

BEGSR操作指出一个RPGⅣ子程序的开始。因子1是子程序的名。它可用在引用子程序的EXSR操作的因子2上说明,也可在引用子程序的CASxx操作的结果字段上说明,或在一个文件错误子例程的INFSR文件说明键字的项中说明。
控制级项(7和8列)可以是SR或者是空格。不允许条件指示器。
每个子程序必须具有唯一的符号名字。在因子1上用*PSSR说明这是一个异常/错误子例程,用来处理程序发现的异常/错误。用这个键字仅能定义一个子程序。因子1中的*INZSR说明在初始化时将运行这个子程序,用*INZSR仅能定义一个子程序。
RPGⅣ子程序说明必须跟着能被程序执行的所有其它计算操作的后面;但PLIST、PARM、KLIST、KFLD和DEFINE操作可以在ENDSR操作(一个子程序的结束)和BEGSR操作(另一个子程序开始)之间或在所有的子程序之后说明;子程序可以在计算说明中的任何地方用EXSR或CASxx来调用。子程序行可以在7列和8列上用SR规定。对于一个子程序来说7列和8列上有效的规定仅可是SR、AR、OR或空格。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 对于子例程,7和8列必须是空格或SR。
C*
C

:
C :
C EXSR SUBRTB
C :
C :
C :
CL2 EXSR SUBRTA
C :
C :
C :
C SUBRTA BEGSR
C :
C :
C :
C* 一个子例程调用另一个子例程。
C*
C EXSR SUBRTC
C :
C :
C :
C ENDSR
C SUBRTB BEGSR
C :
C :
C :
C*
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 在子例程中可以使用GOTO和TAG操作。
C START TAG
C :
C :
C :
C 23 GOTO END
C :
C :
C :
C 24 GOTO START
C END ENDSR
C SUBRTC BEGSR
C :
C :
C :
C ENDSR
C*

(4)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
CALL(调用一个程序)

操作码 因子1 因子2 结果字段 指示器
CALL 程序名 参数列表名 - ER LR

CALL操作把控制传给因子2上说明的程序。
因子2必须是一个字符项,规定要被调用的程序名。如果说明了库名,库名后面必须用一个斜线,然后是程序名(例如,‘LIB/PROG’)。因子2必须是一个字段名、文字、命名常量或数组元素,数组元素包含被调用的程序名,也可以是程序所在的库名。如果未说明库名,即用库列表查找程序。
文字的总长度(包括斜杠)不能超过12个字符。字段或命名常量中不带空格数据的总长度(包括斜杠),不能超过21个字符。如果程序或库名超出10个字符,则只截取10个字符。程序名要明确的用文字、字段、命名常量或数组元素规定,表明被调用的程序。不管任何前导或后继空白。如果某项第一个字符是斜线,则将用库列表查询程序。如果某项的最后一个字符是斜线,将发出一个编译信息。(小写

字符不转成大写字符,放在引号中的名,例如“ABC”认为引号是被调用程序名的一部分)。不支持*CURLIB。
程序的引用是分组进行,这样可避免对目标程序的重复引用。用命名常量或文字对某个程序的所有引用(用CALL语句)都组在一起,这样程序仅被涉及到一次,而对程序的后续引用(仅用命名常量或文字)不再涉及这个程序。
只有程序名和库名都标识了引用才可以组在一起,用变量名引用的所有程序用变量名组在一起。当用变量引用一个程序时,它的当前值要与用这个变量的前一个程序引用操作中变量值相比较。如果值未改,不做引用。如果有改动,则要引用一个新程序。注意此规则只适于使用变量名的引用。使用命名变量或文字的引用不会再引用,而且它不影响是否用变量来做再引用。图110说明了程序引用的分组。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D Pgm_Ex_A C 'LIB1/PGM1'
D Pgm_Ex_B C 'PGM1'
D PGM_Ex_C C 'LIB/PGM2'
I*

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C CALL Pgm_Ex_A
C*
C* 下面二个调用因为有相同的程序名(PGM1)和相同的库名(none),
C* 所以组在一起。注意,它不能与上面的用Pgm-Ex-A调用组在一起。因为
C* Pgm-Ex-A有不同的库名(LIB1)。
C*
C CALL 'PGM1'
C CALL Pgm_Ex_B
C*
C* 下面两个程序引用由于有同样的程序名(PGM2)和相同库名(LIB),
C* 所以组在一起。
C*
C CALL 'LIB/PGM2'
C CALL Pgm_Ex_C
C*
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 第一个使用CALLV调用,将用变量CALLV调用PGM1,这是一种独立于用
C* 字母或命名常量调用PGM1的方法(PGM1已在程序中调用过),第二个用
C* CALLV的结果仍是调用PGM1。因为CALLV的值没有修改。
C*
C MOVE 'PGM1' CALLV 21
C CALL CALLV
C CALL CALLV


图110 程序引用的分组的例子

在结果字段,说明一个PLIST名来做调用程序和被调用程序间的通讯。如果被调用的程序不传递参数或者是在CALL操作后面直接有PARM参数,结果字段可

以是空格。
71和72列必须是空格。在73和74列可以说明任意一个有效的结果指示器。当从被调用程序有错误返回时置为ON。而在75和76列上,当被调用程序是由LR指示器为ON时返回的RPG程序,这时指示器设为ON。
DSPPGMREF命令是一个用来显示程序外部引用信息的CL命令。由于CALLB用来调用过程,所以在DSPPGMREF中找不到CALLB操作中的因子2;只能找到CALL操作中的因子2。使用DSPPGMREF,也查询用命名常量或文字调用的程序名。
图111 说明了CALL 操作的使用。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C* CALL操作调用PROGA,并允许PROGA访问在另处定义的FieldA和FieldB。
C* PROGA用FieldA和FieldB的内容运行,当PROGA完成后,控制返回给最后
C* 一个PARM语句后的那个语句。
C*
C*
C CALL 'PROGA'
C PARM FieldA
C PARM FieldB

(5)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
CALLB(调用一个连接过程)

操作码 因子1 因子2 结果字段 指示器
CALLB 过程名或 PLIST名 - ER LR
(D) 过程指针

CALLB操作可以用来调用任何ILE语言编写的连接过程。
因子1必须是空格,扩展操作D可以用来包括操作描述符。
注:操作描述符提供给程序员运行时传过来的字符或图形串的确切属性(即串的长度及类型)。详细内容请查阅程序员指南。
因子2是必须的,是一个包含被调用过程名的文字或常量,也可是一个包含被调用过程地址的过程指针。提供的过程名区分大小写且可多于10个字符,但不能超过255个。如果超过要被截断,结果字段为可选项,也可是一个PLIST名。
当调用因错误而结束时,73-74列上说明的指示器置为ON。
当调用以LR为ON结束时,75-76列上说明的指示器置为ON。
注:当CALLB规定为文字或命名常量以“CEE”或“-”开始时,编译程序就把它当作可连接API。有关API的详细信息见SPI参考手册。为了避免与系统提供的APIs混淆,自已的过程不要以“CEE”开头来命名。
在因子2中有过程指针的CALLB,PSDS中的*ROUTINE可以包括文字“*N”。在因子2中有文字或命名常量的CALLB,PSDS中的*ROUTINE包含过程名的前8个字符。


DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D* Define a proce

dure pointer
D
D ProcPtr S * PROCPTR INZ(%PADDR('Create_Space'))
D Extern S 10
D
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C* 下面的调用是静态调用.
C CALLB 'BOUNDPGM'
C* 下面的调用是动态调用.
C CALL Extern
C* 下面的调用是静态调用, 使用一个过程指针.
C CALLB ProcPtr

(6)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
CHAIN(从文件中随机检索)

操作码 因子1 因子2 结果字段 指示器
CHAIN 检索自变量 文件名或 数据 NR ER -
(N) 格式名 结构
CHAIN操作是从一个全过程文件(文件描述规范表18列上是F)取一个记录。置一个记录标识指示器为ON(如果在输入规范表上说明),并将该记录的数据放入输入字段中。
因子1是检索自变量,必须含有键字或相对记录号用来取记录。如果通过键字访问,因子1可是一个字段名,一个命名常量,一个象征常数或是一个文字。另外,对外部描述文件在因子1上可以用KLIST来说明。如果用相对记录号访问,因子1必须是一个整型文字或一个带零位小数点的数字型字段。
因子2,规定要读的文件或记录格式名。使用外部描述文件时才用记录格式名。如果因子2是一个文件名并用键字访问,CHAIN操作取出与检索自变量匹配的第一个记录。
如果因子2是一个记录格式名并用键字访问,CHAIN操作取出与检索自变量匹配的所有记录中第一条记录。如果没有找到,则出现记录没找到的情况。
仅当因子2上的文件名是一个程序描述文件(在文件描述规范表的22列用F标识)时,在结果字段中可以规定一个数据结构名。这时,CHAIN操作取出和因子1上的检索自变量匹配的所有记录标识中第一个记录,并把它放在数据结构中。关于在文件和数据结构之间传送数据内容,见4.3.11“文件操作”中的说明。
对WORKSTN(工作站)文件,CHAIN操作读出一个子文件记录。
对多设备文件,必须在因子2上指定一个记录格式,数据是从程序设备上读出,该设备在设备的文件说明中用“DEVID(文件名)”键字中的字段名来标识。如果没有说明此键字,数据是从最后成功地对文件执行输入的设备中读出的。
如果文件是一个输入的磁盘文件,能读出所有记录且不用规定其他的操作。如果是更新文件,如果没有规定N扩展操作,那么

锁住所有的记录。
如果要从一个更新磁盘文件上做读操作,可以规定一个扩展N操作,指出在读记录时不加锁(即CHAIN(N))。详细资料见ILE RPG/400程序员指南。
71和72列必须有一个指示器,当文件中没有和检索自变量匹配的记录时置为ON,73和74列的指示器,当CHAIN操作没成功时置为ON,75和76列必须空格。
当CHAIN操作成功后,要定位因子2说明的文件。这样,随后的读操作将向前或向后检索一个符合条件的记录。当CHAIN操作没有完全成功时(例如出现错误或没找到记录),因子2说明的文件必须在随后的对此文件读操作之前返回原位。(例如,用一个CHAIN或SETLL操作)。
在CHAIN操作对文件成功地执行之后,如果立即对因子2上说明的文件进行更新操作(在计算或输出规范表上),那么更新的是接收到的最后一条记录。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* CHAIN操作从文件FILEX中读取第一条记录,它与检索自变量KEY(因子1)
C* 有同值键字。
C*
C KEY CHAIN FILEX 60
C*
C*
C* 如果没找到与检索自变量相等键字值的记录,指示器60为ON,并执行
C* 由指示器60为条件的EXSR操作。如果这样的记录找到了,程序继续执
C* 行EXSR之后的计算。
C*
C 60 EXSR Not_Found



图117 因子2有文件名的CHAIN操作。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* CHAIN操作使用检索自变量KEY中的值来从外部描述文件的记录REC1中检
C* 索记录。如果没找到记录,指示器72为ON。用组合键字KLIST从有复合
C* 键字的文件中检索记录。如果找到规定的记录,指示器72为OFF,并执行
C* UPDATE操作。
C*
C KEY CHAIN REC1 72
C KEY KLIST
C KFLD Field1
C KFLD Field2
C IF NOT *IN72
C*
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* UPDATE操作修改记录RECI中的所有字段。
C*
C UPDATE REC1
C ENDIF
C*
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 下面例子给出无锁的CHAIN操作。
C*
C MOVE 3 Rec_No
C Rec_No

CHAIN (N) INPUT 99

(7)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
CLEAR(清除)

操作码 因子1 因子2 结果字段 指示器
CLEAR *NOKEY *ALL 结构或变量
CLEAR操作是将结构中的元素(记录格式、数据结构、数组或表)或变量(字段、子字段、数组元素或指示器)设置成它们的缺省值。这些缺省值是根据字段的类型来确定的。(数字型、字符型、图形、指示器、指针或日期/时间/时间标记)。该操作允许在运行期间一个元素一个元素地将结构置成它的缺省值。
因子1必须是空格,除非结果字段为磁盘文件中的一个记录格式名。这时,因子1中可以是*NOKEY,它指出键字字段不能清除。
结果字段为清除的结构或变量,它可以是:一个记录格式名、数据结构名、数组名、表名、字段名、子字段、数组元素或指示器名。如果说明的是一个记录格式名或数据结构,则所有定义在该结构内的字段都要按顺序清除。数据结构中的字段将按照它们的数据类型进行清除。如果在不同的定义中字段之间有部分覆盖,则在非字符字段当中可能有无效数据。在多次出现的数据结构中,只有当前出现的那些字段被清除。如果规定一个表名,则清除当前表元素;如果是一个数组名,则清除整个数组。如果在结果字段中用数组下标规定数组的元素(包括指示器),则只清除说明的那个元素。
因子2必须是空格或是*ALL。如果是*ALL,且结果字段为一个多次出现的数据结构或表名,则所有的出现或表元素都将被清除,且出现的级别将置为1。
当CLEAR操作用在一个记录格式,且因子2为*ALL,因子1是空格时,则记录格式中所有的字段都被清除。如果因子1为*NOKEY,则清除除了键字字段外的所有其它字段。
当CLEAR操作用在记录格式,而因子2是空格,仅记录格式中的输出字段受影响。对于WORKSTN文件的记录格式,只影响用于输出或者用于既输入又输出的字段。所有字段的条件指示器都要受到该操作的影响。DISK、SEQ或PRINTER文件的记录格式在程序中为输出时,记录格式中的字段才受影响。仅输入字段不受该操作影响。通过定义,它们在下一次输入操作中获取新值。
有关缺省值,请看第7章“数据类型与数据格式”。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++
D*
D
D DS1 DS
D Num 2 5 0
D Char 20 30A

D
D MODS DS OCCURS(2)
D Fld1 1 5
D Fld2 6 10 0
D
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 在下例中,CLEAR把数据结构DS1中的所有子字段设为它们的缺省值,
C* CHAR为空格,NUM为零。
C
C CLEAR DS1
C
C*
C* 在下例中,CLEAR把多次发生的数据结构MODS的当前出现设为它们
C* 的缺省值。FLD1为空格,FLD2为零。
C*
C
C CLEAR *ALL MODS
C


图125 CLEAR操作

图126 给出了用CLEAR记录格式做字段初始化的例子。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
A* FIELD2和FIELD3定义为输出字段,也能由CLEAR影响。由于字段指示
A* 器全部看作为输出字段,指示器10也能由CLEAR修改。
A* (虽然它只限定仅输入字段)。
A* 这是因为在CLEAR操作中规定了*ALL。
A*
++++++RLen++TDpBLinPosFunctions++++++++++++++++++++*
A R FMT01
A 10 Field1 10A I 2 30
A Field2 10A O 3 30
A Field3 10A B 4 30
A*
A* End of DDS source
A*


FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++++
F
FWORKSTN CF E WORKSTN INCLUDE(FMT01)
F
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++
D
D IN C 'INPUT DATA'
D
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C
C CLEAR FMT01
C WRITE FMT01
C
C*
C* 按PF03键时,程序结束循环。
C*
C *IN03 DOWEQ '0'
C READ FMT01 LR
C*
C* PF04把输入字段传给输出字段。
C
C *IN04 IFEQ '1'
C MOVEL Field3 Field2
C MOVEL Field1 Field3
C CLEAR *IN04
C ENDIF
C MOVEL IN Field1
C
C*
C* 当按PF11时,在记录格式中定义为输出或输入/输出的所有字段都恢复
C* 成初始化步骤之后的值。
C*
C *IN11 IFEQ '1'
C RESET FMT01
C CLEAR *IN11
C ENDIF
C* 当

按PF12时,在记录格式中定义为输出或输入/输出的所有字段都清空。
C*
C
C *IN12 IFEQ '1'
C CLEAR FMT01
C CLEAR *IN12
C ENDIF
C N03 WRITE FMT01
C ENDDO
C SETON LR
C

(8)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
CLOSE(关闭文件)

操作码 因子1 因子2 结果字段 指示器
CLOSE 文件名 - ER -
明确的CLOSE操作关闭一个或多个文件或设备,并使它们与程序分开。如果不用一个明确的OPEN操作,在程序中不能再使用这个文件。对一个已经关闭的文件做CLOSE操作,要出现错误。
因子2为将要关闭的文件,可以在因子2上给出键字*ALL表示一次关闭所有的文件。在因子2中,不能规定数组或表文件(在文件描述规范表的18列用T标识)。
在73和74列上可以说明一个结果指示器,当CLOSE操作没有成功时置为ON。71,72,75和76列必须是空格。
如果要将一个数组或表写到一个输出文件(用TOFILE键字说明)上,而在LR时,文件是关闭的(通过一个CLOSE操作),则该数组或表不发生输出。如果文件被关闭,要能得到输出必须重新打开它。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* The explicit CLOSE operation closes FILEB.
C
C CLOSE FILEB
C
C*
C* CLOSE *ALL操作关闭程序中的所有文件。如果再使用它们,要用明确的
C* OPEN操作,如果CLOSE操作没有成功,指示器17为ON。
C*
C
C CLOSE *ALL 17
C


图127 CLOSE操作

(9)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
COMMIT(委托)

操作码 因子1 因子2 结果字段 指示器
COMMIT 分介 - ER -

从前面COMMIT或FOLLBACK操作以来(如前面没有COMMIT或ROLBK操作,就从委托控制开始),对在输出操作中规定的以委托控制打开的文件做全部的修改。可在文件规范表指定COMMIT键字,说明文件以委托控制打开。
在委托控制下,释放文件的所有记录锁。
文件修改和释放记录锁适合于委托控制下的

所有文件,不管程序是否发出COMMIT操作控制,或者通过同一活动组的其他程序或作业,都取决于STRCMTCTL命令中指定的委托范围。发出COMMIT操作的程序不需要有任何在委托控制下的文件。
当执行CL命令STRCMTCTL时,开始启动委托控制。详细信息见ILE RPG/400程序员指南中“委托控制”的章节。
用因子1,可以指定一个常量或变量(除了指针之外的类型),它指出用COMMIT做修改和随后修改之间的边界。如果因子1为空格,则标识符是零。
73和74列上的可选指示器,在操作不成功时置为ON。例如,如果委托控制无效时该指示器置为ON。

DELETE(删除记录)

操作码 因子1 因子2 结果字段 指示器
DELETE 检索自变量 文件名 NR ER -

DELETE操作从一个数据库文件中删除一个记录。该文件必须是一个更新文件(文件描述规范表的17列上用U标识)。删除过的记录不能再找到。
如果没有指定因子1,DELETE操作删除当前记录(最后检索到的记录)。记录必须由前一个输入操作(例如,CHAIN或READ)加锁。
因子1是检索自变量,它可以是键字或相对记录号,指出要删除的记录。如果用键字访问,因子1可以是一个字段名、一个命名常量或一个文字。另外,对外部描述文件可在因子1上说明一个KLIST名。如果对某键字有相同记录,仅从文件中删除第一条记录。如果用相关记录号访问,因子1必须是一个不带小数位的数字型常量或变量。
因子2是要删除的记录所在的更新文件名或记录格式名。记录格式名仅对外部描述文件有效。如果没有规定因子1,记录格式名必须是从文件读的最后一个记录的名,否则将产生错误。
如果规定了因子1,则必须在71和72列指定一个结果指示器。如果没有规定因子1,则保留71和72列为空格。如果在文件中找到要删除的记录,此指示器置为ON。可以在73和74列上说明一个结果指示器;如果DELETE操作不成功将其置为ON(例如,用户没有权力在文件上删除记录)。75和76列上保留空格。
在OS/400操作系统下,如果对因子2规定的文件成功的执行了DELETE操作,之后又对此文件执行一个读操作,将读出被删除记录后的下一条记录。

DIV(除法)

操作码 因子1 因子2 结果字段 指示器
DIV(H) 被除数 除数 商 + - Z

如果说明了因子1,DIV操作使因子1被因子2除,否则,用结果字段被因子2除。商(

结果)放在结果字段中。如果因子1是0,除的结果也是0。因子2不能是0,如果是0,则出现错误,RPGⅣ异常/错误处理例程接收控制。如果没有说明因子1,结果字段(被除数)被因子2(除数)除,而结果(商)放于结果字段中。因子1和因子2必须是数字,也可以是:一个数组、数组元素、字段、象征常量、文字、命令常量、子字段或表名。
除非除法操作后做一个传送余数(MVR)操作,否则除法操作的余数将会丢失。如果用条件指示器,必须确保在DIV操作之后应即执行MVR。如果在DIV操作之前执行了MVR操作,则出现不可预料的结果。如果传送余数是下一个操作,除法操作的结果就不能被取舍(四舍五入)。
关于DIV操作的规则,见4.3.1的“算术操作”。
在4.3.1中的图100,举例说明了DIV操作。

(10)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
DO(do)

操作码 因子1 因子2 结果字段 指示器
DO 开始值 界限值 索引值

DO开始一组操作,并且指出做这组操作的次数。要规定次数,通过说明一个索引字段,一个开始值和一个界限值。ENDDO语句放在该组的末尾。关于DO组的详细资料,见4.4.19“结构程序设计操作”。
在因子1中规定没有小数的起始值,这个值可以是一个数字文字、命名常量或字段名。如果不说明因子1,初值为1。
在因子2上规定没有小数的界限值,它可以是一个数字型字段名、文字或命名常量。如果不说明因子2,界限值为1。
在结果字段说明一个有当前索引值的数字型字段名。结果字段必须是足够长,能容纳下界限值加上它的增量。如果不说明索引字段,则内部使用。当DO操作开始时,索引字段的值都用因子1来代替。
在相应的ENDDO操作的因子2上指出将要加在索引字段上的增量,它可以是一个数字文字或没有小数位的数字字段。如果它是空格,则增量值为1。
另外,对DO操作本身,在DO和ENDDO语句上的条件指示器控制该DO组。DO语句上的条件指示器控制是否开始DO操作,这些指示器仅在DO循环开始时检测一次。相应的ENDDO语句上的条件指示器控制该DO组是否重复进行。这些指示器在每个循环结束时被检测。
DO操作分以下步来执行:
1、如果DO语句行上的指示器满足了,执行DO操作(第2步)。如果没有满足,执行相应的ENDDO语句之后的可执行操作(第7步)。
2、当开始DO操作时,把初值(因子1)传送到索引字段(结果字段)。
3、如果索引值大于界限值,执行相应的ENDDO语句后边的计

算操作(第7步)。否则,执行DO语句后的第一个操作(第4步)。
4、执行DO组中的每个操作。
5、如果ENDDO语句上的条件指示器不满足,执行相应的ENDDO语句后的计算操作(第7步)。否则执行ENDDO操作(第6步)。
6、通过把增量加到索引字段来执行ENDDO操作。执行第3步。(注意当执行第3步时,不再检测DO语句上的条件指示器(第1步))。
7、当DO或ENDDO语句上的条件指示器不满足时,执行ENDDO语句后面的语句(第1步或第5步),或者当索引值大于界限值时(第3步)也做这步。
当使用DO操作时注意以下几点:
·可以在循环内修改索引、增量、界限值及指示器,从而影响DO组的结束。
·一个DO组不能跨越明细和总计计算。
关于这些操作如何影响DO操作的信息请参阅“LEAVE(离开do组)”和“ITER(重复)。
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 当指示器17为ON时,DO组执行10次,当在字段X(结果字段)中
C* 的下标值大于因子2中的值(10)时,停止运行。当DO组停止运行,
C* 控制转给紧接ENDDO后的操作。由于在DO中没有规定因子1,起始值
C* 为1,由于DO中也没有规定因子2,增量也为1。
C*
C
C 17 DO 10 X 3 0
C :
C ENDDO
C*
C* DO组执行10次。当字段X中的值大于因子2中的值(20)中,或者
C* 在遇到ENDDO,指示器50为OFF时,DO组停止操作。当指示器50为
C* OFF时,不执行ENDDO操作。这样,控制传给ENDDO后的操作。
C* DO操作的因子1规定了起始值2,因子2规定了增量值2。
C*
C 2 DO 20 X 3 0
C :
C :
C :
C 50 ENDDO 2


图130 DO操作

4.4.24 DOU(DO Until)

操作码 因子1 扩展因子2
DOU 空格 表达式

DOU操作执行一组至少执行一次也可能执行多次的操作。开始它的功能与DOUxx操作类似。相应的ENDDO语句表示该组操作的结束。它们的原则是在扩展因子2上用一个指示器值表达式来表示的逻辑条件。扩展因子2上的表达式为真时执行DOU表达式。详细资料见第二十一章。
允许级别和条件指示器。因子1必须是空格,扩展因子2 是要计算的表达式。


CL0N01Factor1+++++++OpcodeE+Extended-factor2++++++++++++++++++++++++++++++
C

Extended-factor2-continuation+++++++++++++++++
C* 这例中,在按F3之前,重复Loop操作。
C*
C DOU *INKC
C :
C :
C ENDDO
C
C* 在*IN01为ON或FIELD2大于FIELD3之前,重复Loop操作。
C*
C
C DOU *IN01 OR (Field2 >; Field3)
C :
C :
C ENDDO
C* 在X大于数组元素个数之前,重复Loop操作。
C*
C
C DOU X >; %elem(Array)
C EVAL Total = Total + Array(x)
C EVAL X = X + 1
C ENDDO
C
C*

图131 DOU举例

4.4.25 DOUxx(Do Until)

操作码 因子1 因子2 结果字段 指示器
DOUxx 比较数 比较数

DOUxx执行一组至少执行一次也可能执行多次的操作。相应的ENDDO语句标出该组操作的结束。关于DO组更详细的资料和xx的含义,请参阅4.3.19“结构程序设计操作”。
因子1和因子2必须是一个文字、一个命名常量、一个字段名、一个表名、一个数组元素、一个象征常数或是一个数据结构名。因子1和因子2的数据类型必须相同。
在DOUxx语句上指明一个关系xx。为了规定一个更复杂的条件可以在DOUxx语句之后跟有ANDxx或ORxx的语句。DO组中的操作执行一次,然后重复执行DO组直至因子1和因子2之间关系存在为止,或者是由DOUxx、ANDxx或ORxx操作组合的特定条件存在为止。即使该组的起始条件就不为真,DO组中至少执行一次。
另外,对DOUxx操作本身,在DOUxx和ENDDO语句上的条件指示器控制该DO组。DOUxx语句上的条件指示器控制是否开始DOUxx操作。相应的ENDDO语句上的条件指示器可使得DOU循环提前结束。

DOUxx操作的执行步骤如下:
1、如果DOUxx上的条件指示器满足,执行DOU操作(第2步)。如果不满足,执行相应的ENDDO语句后的下一个操作(第6步)。
2、通过把控制传给下一个可执行操作执行DOUxx操作(第3步)。DOUxx操作不比较因子1和因子2也不在这点上检测规定的条件。
3、执行DO组中的每个操作。
4、如果ENDDO语句上的条件指示器不满足,执行相应ENDDO语句之后的计算操作(第6步)。否则执行ENDDO操作(第5 步)。
5、通过比较DOUxx 操作的因子1和因子2或者检测组合操作的条件来执行ENDDO操作。如果因子1和因子2之间的关系xx存在或者说明的条件存在,则DO组操作完成并执行ENDDO语句后面的计算操作(第6步)。如果

因子1和因子2之间关系xx不存在或者说明的条件不存在,则重复组中的操作(第3步)。
6、当DOUxx或ENDDO语句上的条件指示器不满足时(第1步或第4步),或者当因子1和因子2之间的关系xx存在,或第5步上规定的条件存在,执行ENDDO后面的语句。
关于这些操作如何影响一个DOUxx的信息请参阅“LEAVE(离开DO组)”和“ITER(重复)”。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* DOUEQ操作至少运行一次DO组中的操作。
C
C FLDA DOUEQ FLDB
C
C*
C* 在ENDDO时,要做检测来确定FLDA是否等于FILDB。如果不等,再次
C* 执行前面的操作,Loop继续执行直到FLDA等于FLDB;相等时,程序
C* 转至执行ENDDO后面的操作。
C
C SUB 1 FLDA
C ENDDO
C
C* DOUEQ ANDEQ OREQ组合至少执行一次DO组中的操作。
C
C FLDA DOUEQ FLDB
C FLDC ANDEQ FLDD
C FLDE OREQ 100
C
C*
C* 在ENDDO操作时,要检查规定的条件,即FLDA是否等于FLDB且FLDC是
C* 否等于FLDD。如果条件存在,程序转至ENDDO后面的语句,否则,执行
C* OREQ后的操作。程序处理第二个DOUEQ开始的条件检查。如果DOUEQ和
C* ANDEQ以及OREQ的条件都不满足,再次执行OREQ后的操作。
C
C SUB 1 FLDA
C ADD 1 FLDC
C ADD 5 FLDE
C ENDDO

图132 DOUxx操作

4.4.26 DOW(Do While)

操作码 因子1 因子2
DOW 空格 表达式

DOW操作执行一组满足给定条件的操作。它的功能与DOWxx操作类似。相应的ENDDO语句标出该组操作的结束。不同的是用扩展因子2上指示器值表达式来表示一个逻辑条件。当扩展因子2字段中的表达式为真时执行DOW控制的操作。
允许控制级和条件指示器。因子1必须是空格,因子2是要计算的表达式。


CL0N01Factor1+++++++OpcodeE+Extended-factor2++++++++++++++++++++++++++++++
C Extended-factor2-continuation+++++++++++++++++
C* 在这个例子中,在条件为假之前重复执行循环,即当A>;5和/或B+C不等于零。
C*
C
C DOW A <= 5 AND B+C = 0
C :
C :
C ENDDO
C

图133 DOW举例

4.4.27 DOWxx

(Do While)

操作码 因子1 因子2 结果字段 指示器
DOWxx 比较数 比较数

DOWxx操作执行一组满足给定条件的操作。用DOWxx语句后面的ANDxx或ORxx语句说明更复杂的条件。相应的ENDDO语句标出该组操作的结束。关于DO组更详细的内容和xx的含义,请参阅4.3.19“结构程序设计操作”。
因子1和因子2必须是一个文字、一个命名常量、一个象征常数、一个字段名、一个表名、一个数组元素或一个数据结构名。因子1和因子2的数据类型必须相同。关于因子1和因子2的比较遵循比较操作中的同样规则。见4.3.6节“比较操作”。
对DOWxx操作本身,在DOWxx和ENDDO语句上的条件指示器控制该DO组。DOWxx语句上的条件指示器控制是否开始DOWxx操作。相应的ENDDO语句上的条件指示器控制该DOW组是否重复执行。
DOWxx操作执行步骤如下:
1、如果DOWxx语句行上的条件指示器满足,执行DOWxx操作(第2步)。如果该指示器不满足,则执行相应的ENDDO语句后的下一个操作(第6步)。
2、通过比较因子1和因子2或检测由DOWxx、ANDxx或ORxx操作组成的复合条件,执行DOWxx操作,如果因子1和因子2之间的关系xx或者组合操作说明的条件不存在,则DO组结束,控制转到ENDDO语句后面的下一个操作(第6步)。如果因子1和因子2之间的关系或者组合条件存在,则DO组的操作重复执行(第3步)。
3、执行DO组中的每个操作。
4、如果ENDDO语句上的条件指示器不满足,则执行相应的ENDDO语句后面的操作(第6步)。否则,执行ENDDO操作(第5步)。
5、控制转给DOWxx,执行ENDDO操作(第2步)。(注意DOWxx语句上的条件指示器在第1步不再检测)。
6、当DOWxx或ENDDO语句上的条件指示器不满足时(第1步或第4步),或者当因子1和因子2之间的关系xx或在第2步上说明的条件不存在时,执行ENDDO语句后面的语句。
关于这些操作如何影响一个DOWxx操作的信息请参阅“LEAVE(离开DO组)”和“ITER(重复)”。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 仅当FLDA小于FLDB时,DOWLT执行DO组中的操作。如果FLDA
C* 不小于FLDB,程序转至ENDDO语句的操作。如果FLDA小于LFDB,
C* 执行DO组中的操作。
C
C FLDA DOWLT FLDB
C
C* ENDDO操作使程序执行第一个DOWLT操作,它要检查来确定FLDA是否
C* 小于FLDB,在FLDA等于或大于FLDB前都要重复做这个循环,然后
C* 程序

转至执行END后的操作。
C
C MULT 2.08 FLDA
C ENDDO
C
C* 在这个例子中,测试多个条件,DOWLT和ORLT组合,在FLDA小于
C* LFDB或FLDC时,执行DO组内的操作。如果规定的条件不存在, 程序转
C* 到ENDDO后的操作。如果有一个条件存在,执行ORLT后的操作。
C
C FLDA DOWLT FLDB
C FLDA ORLT FLDC
C
C* ENDDO操作让程序转至第二个DOWLT操作,它测试确定需要的条件是否
C* 存在,在FLDA等于或大于FLDB和FLDC时,一直要执行循环,然后程
C* 序转到ENDDO后面的操作。
C
C MULT 2.08 FLDA
C ENDDO

(11)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
ELSE(否则)

操作码 因子1 因子2 结果字段 指示器
ELSE

ELSE操作是IFxx和IF操作的可选部分。如果IFxx比较内容成立,执行ELSE之前的计算;否则,执行ELSE之后的计算。
在总计计算中,控制级登记(7列和8列)可以是空格或者是L1-L9指示器、一个LR指示器或一个L0项把语句组成程序适当的段。控制级项仅针对文件。不允许条件指示器(9-11列)。
用ENDIF操作关闭IFxx/ELSE组。
4.4.43的图142举例说明了和IFxx连用的ELSE操作。

4.4.31 ENDyy(结束一个结构组)

操作码 因子1 因子2 结果字段 指示器
END 增量值
ENDCS
ENDDO 增量值
ENDIF
ENDSL

ENDyy操作结束一个CASxx,DO,DOU,DOW,DOUxx,DOWxx,IF,IFxx或SELECT组的操作。
ENDyy操作如下:
END 结束一个CASxx,DO,DOU,DOUxx,DOW,DOWxx, IF,IFxx或SELECT组。
ENDCS 结束一个CASxx组。
ENDDO 结束一个DO,DOU,DOUxx,DOW,DOWxx组。
ENDIF 结束一个IF或IFxx组。
ENDSL 结束一个SELECT组。
在ENDyy操作中仅允许给出因子2,它给一个DO组定界。因子2为DO组的增量值。它可以是正的也可以是负的,不能有小数位,也可以为:数组元素、表名、数据结构、字段、命名常量或数字型文字。如果ENDDO上未规定因子2,则缺省增量为1。如果增量是负的,则DO组永远不会结束。
ENDDO中条件指示器是可选项,但对ENDCS,ENDIF和ENDSL不允许使用条件指示器。

不允许用结果指示器。对ENDCS,ENDIF和ENDSL,因子1、因子2和结果字段必须是空格。
如果一个ENDyy的格式用在不正确的操作组(例如,ENDIF用在一个结构组),编译时会出错。
使用ENDyy操作的例子,见CASxx、DO、DOUxx、DOWxx、IFxx和DOU、DOW、IF和SELECT操作举例。

4.4.32 ENDSR(结束子程序)

操作码 因子1 因子2 结果字段 指示器
ENDSR 标号 返回点

ENDSR操作定义一个RPGⅣ子程序的结束并指出返回点。ENDSR必须是该子程序的最后一条语句。因子1可以是一个标号,该标号是子程序内GOTO操作转出的点。控制级内容(7和8列)可以是SR或空格。不允许规定条件指示器。
ENDSR操作结束子程序,把控制返回到EXSR或CASxx语句之后的语句,除非该子程序紧跟是一个程序异常/错误子程序(*PSSR)或一个文件异常/错误子程序(INFSR)。对这些子程序,ENDSR操作的因子2可以存放子程序执行后控制返回的地点。因子2的内容可以是一个字段名,包括一个保留键字或文字或命名常量。如果说明了无效返回点,则RPGⅣ错误处理程序接收控制。
关于返回点的详细信息见1.5.1.2的“文件异常/错误子程序(INFSR)”。
RPGⅣ子程序编码的例子见4.4.37的图138。

4.4.33 EVAL(计算表达式)

操作码 因子1 因子2
EVAL 空格 赋值语句

EVAL操作计算格式为结果=表达式的赋值语句的值。表达式计算后放在结果中。因此,结果不能是文字或常量,它必须是一个字段名、数组名、数组元素、数据结构、数据结构子字段或%SUBST内部函数的一个串。表达式可以产生任一RPG数据类型。表达式的类型必须与结果的类型相同。字符型或图形结果要左对齐,或按要求用空格填充或截断。
如果结果表示一个不带下标的数组或一个ARRAY(*)的数组,表达式的值将分配给结果的每个元素,依据的原则在数组一章描述。否则,表达式仅做一次计算并把值放到数组或数组的每一个元素中。对于数字表达式,允许做扩展的舍入操作。舍入的规则与算术操作中的规则相同。

(12)ILE RPG4 C表常用操作码学习笔记(按字母顺序发)
EXFMT(写/然后读格式)

操作码 因子1 因子2 结果字段 指示器
EXFMT 记录格式名 - ER -

EXFMT操作是对同一个记录格式先写后读的组合操作。EXFMT仅对外部描述的WORKSTN文件有效,该文

件可以定义为一个外部描述的(文件描述规范表22列是E)全过程文件(文件描述规范表的18列是F)或组合文件(文件描述规范表的17列是C)。
因子2必须是先写后读的记录格式名。可以在73和74列上说明一个结果指示器,当EXFMT操作不成功时置为ON。当指示器置为ON时,操作的读部分不执行(记录标识指示器和字段不改变)。71,72,75和76列必须是空格。
对多设备文件使用EXFMT,请参阅READ和WRITE操作的描述。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
FFilename++IPEASFRLen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++
F*
F* PROMTD是WORKSTN文件,它提示用户一个选项,根据用户输入的
F* 内容,程序执行不同的子例程进行增加、删除或修改记录。
F*
FPROMTD CF E WORKSTN
F*
F* 如果用户按了F3键,指示器*IN03为ON,结束DOW循环。
F*
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C
C DOW *in03 = *off
C
C* EXFMT在屏幕上给出提示,等待用户输入一个选项,SCR1是定义在
C* WORKSTN文件的记录格式名,OPT是记录中的一个字段。
C*
C
C EXFMT SCR1
C SELECT
C WHEN OPT = 'A'
C EXSR ADDREC
C WHEN OPT = 'D'
C EXSR DELREC
C WHEN OPT = 'C'
C EXSR CHGREC
C ENDSL
C ENDDO
:
:

图137 EXFMT举例

4.4.36 EXSR(激活子例程)

操作码 因子1 因子2 结果字段 指示器
EXSR 子程序名

EXSR操作是执行在因子2规定的RPGⅣ子程序。该子程序名必须是一个唯一的符号名,而且必须在BEGSR操作的因子1上出现。EXSR操作可以在计算说明的任何地方编写。它一出现就执行命名的子程序。
子程序中的操作执行以后,执行EXSR后面的语句,除非子程序内的一个GOTO语句给出子程序外的一个标号或该子程序是一个在ENDSR操作的因子2上规定的异常/错误子程序。
因子2中的*PSSR说明执行程序异常/错误子程序。因子2中的*INZSR用于说明执行程序初始化子程序。

4.4.37 编写子程序

一个RPGⅣ子程序可以在计算操作中的任一点上执行。所有RPG操作都可在一个子程序内执行,而且这些操作可以用9-11列的有效指示器来进行条件限制。7-8列上可以是SR

或空格。在这些列上不能使用控制级指示器(L1-L9)。然而,子程序内的AND/OR行可以在7-8列上指出。
子程序使用的字段可以在子程序内定义,也可以在程序其它地方定义。主程序和子程序都能使用该字段。
一个子程序不能包含另一个子程序。但一个子程序可以调用另一个子程序;即一个子程序中可有EXSR或CASxx语句 ,但在一个子程序内的EXSR或CASxx不能调用它本身。因为这可能产生不可预测的结果。如果想走到同一个子程序内的另一点时,可以使用GOTO和TAG语句。
不必须说明子程序的使用顺序。每一个子程序都必须有一个唯一的符号名,必须有一个BEGSR和一个ENDSR语句。
在子程序内允许使用GOTO(分支)操作。GOTO可以在子程序的ENDSR操作上指定标号。GOTO不能用于走到某个子程序内的TAG或ENDSR发出,除非此GOTO与TAG或ENDSR在同一子程序内。子程序内的GOTO可以走到明细计算或总计计算内的TAG处。


*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 对于子例程,7和8列必须是空格或SR。
C*
C :
C :
C EXSR SUBRTB
C :
C :
C :
CL2 EXSR SUBRTA
C :
C :
C :
C SUBRTA BEGSR
C :
C :
C :
C* 一个子例程调用另一个子例程。
C*
C EXSR SUBRTC
C :
C :
C :
C ENDSR
C SUBRTB BEGSR
C :
C :
C :
C*
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
C*
C* 在子例程中可以使用GOTO和TAG操作。
C START TAG
C :
C :
C :
C 23 GOTO END
C :
C :
C :
C 24 GOTO START
C END ENDSR
C SUBRTC BEGSR
C :
C :
C :
C ENDSR
C*

图138

下载文档原格式

  / 47
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。