RPG Ⅳ基础
D PRICE E INZ(1234.89) D ITMARR E DIM(10) 用内部名FRED定义一个外部描述数据结构EXTDS。
-------------------------------------------------------
数据区域:
CRTDTAARA DTAARA(TOTDTA) TYPE (*DEC) LEN(28 0) 数据区域TOTDTA在RPG程序中使用之前要预先创建;
DTAARA{( 数据区名 )}
指定与字段、数据结构、数据结构子字段或数据区数据结构相关的外部数据区的名称。 D LDAREA UDS
如果不指定,则默认为*LDA, (U: 若这是数据区数据结构,则输入 U) 。
方法一:
DTOTALS DS DTAARA(TOTDTA) D TOT_AMOUNT 8 2 D TOT_GROSS 10 2 D TOT_NET 10 2 方法二:
C *DTAARA DEFINE TOTDTA TOTALS *DTAARA DEFINE和关键字DTAARA有相同的功能.
当*DTAARA DEFINE或关键字DTAARA被指定,才能对数据区使用IN,OUT,UNLOCK命令. IN (检索数据区): OUT (写入数据区):
UNLOCK (解除锁定数据区或释放记录):
当IN,OUT或UNLOCK中Factor 2为*DTAARA时,表示程序中定义的数据区被检索或写出或解锁.
------------------------------------------------------------------------ C *LOCK IN *DTAARA
C ADD AMOUNT TOTAMT C ADD GROSS TOTGRS C ADD NET TOTNET ......
C OUT *DTAARA C UNLOCK *DTAARA
C *DTAARA DEFINE TOTAMT 8 2 C *DTAARA DEFINE TOTGRS 10 2 C *DTAARA DEFINE TOTNET 10 2
------------------------------------------------------------------------
*LDA:由系统自动为每个作业创建和删除的数据区,1024个字符. D*Local data area
D LDAREA UDS 1024 D LDFRM1 1 10
RPG Ⅳ基础
D LDFRM2 11 20 D LDTO 21 30 D LDEND 31 31 D LDKEY 32 32 D LDDEP 33 34 D LRTTYNO 45 54 C*Initialize
C *DTAARA DEFINE *LDA LDAREA C IN *DTAARA
C MOVEL LDDEP DEPNO C :
C MOVEL '0' LDEND C OUT *DTAARA
----------------------------------------------------------------------
*LIKE DEFINE 的用法
*LIKE DEFINE 被参考字段 需定义字段 定义一个字段基于另一个字段的属性(长度和小数点位置). 可以在64到68位(field length)处输入一个值: ’+’号代表result field比factor 2 长度increase ’-’号代表result field比factor 2 长度decrease.
如果64到68位为空,则代表result field比factor 2 长度相同.
------------------------------------------------------------------------------------------------ FLDA:7位字符 FLDB: (5 2)
C *LIKE DEFINE FLDA FLDP
C *LIKE DEFINE FLDA FLDQ +2 C *LIKE DEFINE FLDA FLDR - 1 C *LIKE DEFINE FLDB FLDS
C *LIKE DEFINE FLDB FLDT +1 C *LIKE DEFINE FLDB FLDU - 2 C *LIKE DEFINE FLDU FLDX ( FLDP:7 FLDQ:9 FLDR:6
FLDS: (5 2) FLDT: (6 2) FLDU: (3 2) FLDX: (3 2)
Unit 4. Manipulating Data in Calculations
EVAL的用法 FIELD1 = 10 FIELD2 = 9 FIELD3 = 8 FIELD4 = 7
RPG Ⅳ基础
*IN01 = *ON
A = 'abcdefghijklmno' (15位) CHARFIELD1 = 'There' (5位) ARR is defined with DIM(10)
C EVAL RESULT=FIELD1 + FIELD2+(FIELD3-FIELD4) RESULT=20
C EVAL *IN03 = *IN01 OR (FIELD2 > FIELD3) *IN03= *ON
C EVAL A = 'Hello ' + CHARFIELD1 A = 'Hello There ' (左对齐赋值,再填补空格)
C EVAL %SUBST(A:3:4) = '****' A = 'ab****ghijklmno'
C EVAL ARR(*) = FIELD2 * FIELD3 ARR数组的每个元素的值为72
操作扩充符
C 123.456 MULT(H) 10 RESULT3 在操作码之后的括号中指定操作扩充符。扩充符可立即跟在操作码之后或可由一个或多个空格分隔。括号之间可能指定多个 opcode 扩展器。
选择下列其中一个扩充符值:
空白: 若不执行舍入、不带锁定读取或结果字段填充或若不支持扩充符,则将字段留空。 (D): 输入 (D) 以发送 CALLB 上字符类型字段的操作描述符给接收过程。对于应用 于日期的其它操作输入 D 。 (E): 输入 (E) 表示发生错误处理。若指定了 E 扩充符,则不允许错误指示符。 (H): 若要执行舍入,则输入 (H) 。
(M): 若将应用位数规则的最大数,则输入 (M) 。
(N): 若不带锁定读取该记录,则输入 (N) 。对于其他操作,若 DEALLOC 操作将结果字段
设置为空,则输入 (N) 。
(P): 若结果字段以空白填充,则输入 (P) 。
(R): 若要应用结果小数位规则,则输入 (R) :将计算小数中间值的精度,以便小数位数的
减少不超过分配结果的小数位数。
(T): 若该操作应用于时间,则输入 (T) 。 (Z): 若该操作应用于时间戳记,则输入 (Z) 。
MULT的用法
D RESULT1 S 5P 1 D RESULT2 S 5P 1 D RESULT3 S 5P 2 D RESULT4 S 7P 2
C 123.456 MULT 10 RESULT1 ( EVAL RESULT1 = 123.456 *10) RESULT1=1234.5 小数点左边满足,右边第二位被截去
C 123.456 MULT(H) 10 RESULT2
( EVAL(H) RESULT1 = 123.456 *10)
RPG Ⅳ基础
RESULT2=1234.6 小数点左边满足,右边第二位被四舍五入 C 123.456 MULT(H) 10 RESULT3
RESULT3=234.56 小数点左边不满足, 被截去最左边一位,右边满足(数字溢出) C 1234.56789 MULT 100 RESULT4 如果编译时指定TRUNCNBR(*YES)
RESULT4=23456.78 小数点左边不满足, 被截去最左边一位, 右边第三位被截去(数字溢出). 截段数字 (TRUNCNBR) 指定在运行程序时出现数字上溢的情况下,截断值是否移至结果字段,或者是否产生错误。 注: TRUNCNBR 任选项不应用于表达式中执行的计算。(在扩充因子2 字段中寻找表达式。)若这些计算出现上溢,则将总是出现错误。 *YES:忽略数字上溢,并将截断值移至结果字段。 *NO:当检测到数字溢出时,生成运行期错误。
CAT(并置两个字符串)
Code Factor 1 Factor 2 Result Field CAT (P) 字符串1 字符串2:空格数 目标字符串 C MOVE 'RPG ' NAME 5 C MOVE 'IV ' LAST 5 C Z-ADD 0 NUM 1 0 C NAME CAT(P) LAST:NUM TEMP 10 TEMP:‘RPGIV ’(NUM为0,截去字符串1后的空格)
SCAN(扫描字符串)
Code Factor 1 Factor 2 Result Field Indicators SCAN (E) 字符串:长度 字符串:开始位置 最左边的位置 标志位 扫描Factor 2中字符串是否包含有Factor 1中的字符串.
------------------------------------------------------------------------------- C 'ABC' SCAN 'XCABCD' RESULT - - - - 90 RESULT中为3,因为字符串找到,所以*IN90=*ON .
C MOVE 'YARRYY' FIELD1 6 C MOVE 'Y' FIELD2 1
C FIELD2 SCAN FIELD1:3 ARRAY 90 数组ARRAY的1,2元素为5,6, *IN90=*ON.
C MOVE 'TESTING' FIELD1 7 C Z-ADD 2 X 1 0 C MOVEL 'TOOL' FIELD2 5
C FIELD2:4 SCAN FIELD1:X INT90 20 90 FIELD2:4取4位,为'TOOL', 因为字符串没找到,所以*IN90=*OFF . C SrchName SCAN Line C IF %FOUND C EXSR HandleLine C ENDIF
如果在Line中扫描到SrchName, %FOUND返回’1’,继续执行HandleLine.
RPG Ⅳ基础
-------------------------------------------------------------------------------------
%SCAN (扫描字符位置)
%SCAN(搜索字符:源字符:开始位置)
-------------------------------------------------------------------------------------
D source S 15A inz('Dr. Doolittle') D pos S 5U 0
C EVAL pos = %scan('oo' : source) POS=6 C EVAL pos = %scan('D' : source : 2) POS=5 C EVAL pos = %scan('abc' : source) POS=0 C EVAL pos = %scan('Dr.' : source : 2) POS=0
-------------------------------------------------------------------------------------
CHECK(检查字符) (由左到右检查)
Code Factor 1 Factor 2 Result Field Indicators
CHECK (E) 比较字符串 被比较字符串:开始位置 左起位置 - - ER FD
CHECKR(检查反向) (由右到左检查)
Code Factor 1 Factor 2 Result Field Indicators
CHECK (E) 比较字符串 被比较字符串:开始位置 右起位置 - - ER FD
SUBST(子字符串)
Code Factor 1 Factor 2 Result Field Indicators SUBST 截取的长度 源字符串:开始位置 目标字符串 标志位(ER) C Z-ADD 3 T 2 0 C MOVEL 'ABCDEF' String 10
C 2 SUBST String:T Target - - 90 - - TARGET=‘CD’,*IN90 = *OFF(没有错误发生)
------------------------------------------------------------------------------ C MOVE 'ABCDEF' String 6 C Z-ADD 4 T 1 0 C 5 SUBST String:T Result 90 Result没变化,*IN90 = *ON
------------------------------------------------------------------------------ C ' ' SCAN City C C ADD 1 C
C SUBST City:C TCntre
CITY='Toronto, Ontario',C=9,Tcntre= 'Ontario' (Factor 1为空,将截取Tcntre的长