AS400开发入门-By adan 联系客服

发布时间 : 星期二 文章AS400开发入门-By adan更新完毕开始阅读

C 'RPG' CAT STRING TEMP 5 * Note that the trailing blanks of NAME are not included because * NUM=0. The field TEMP contains 'RPGIV'.

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

CHECK

检查String2中是否含有不属于String1的字符。

C

N2

ER

string1

CHECK(E) string2(:N)

result

如果没有N就从string2的第一位开始检查,否则从第N位开始检查 result中会返回第一个不符合条件的字符在string2中所处的位置

如果result是一个变量,那么此指令会在遇到第一个不符合条件的字母时停止检查;如果

result是一个数组,那么此指令会持续检查直到遇到string2的结尾或者是string2中不符合条件的字母个数超过数组的元素个数。

检查完成后,我们可以使用%FOUND检查是否有不匹配的字符。 例:

* In this example, the result will be N=6, because the start * position is 2 and the first nonnumeric character found is the '.'. * The %FOUND built-in function is set to return '1', because some * nonnumeric characters were found.

D Digits C '0123456789' C

C MOVE '$2000.' Salary C Digits CHECK Salary:2 N 2 0 C IF %FOUND C EXSR NonNumeric C ENDIF

* Because factor 1 is a blank, CHECK indicates the position * of the first nonblank character. If STRING contains 'th * NUM will contain the value 4.

C ' ' CHECK String Num 2 0 * The following example checks that FIELD contains only the letters * A to J. As a result, ARRAY=(136000) after the CHECK operation. * Indicator 90 turns on.

D Array S 1P 0 DIM(7)

D Letter C 'ABCDEFGHIJ' C MOVE '1A=BC*' Field 6 C Letter CHECK Field Array 90 * In the following example, because FIELD contains only the

61676237.doc – 第 29 页 共 39 页

* letters F to G, ARRAY=(000000). Indicator 90 turns off. C MOVE 'FGFGFG' Field 6 C Letter CHECK Field Array 90

CHECKR

与CHECK功能基本相同,只是CHECK是从左边开始检查,CHECKR是从右边开始。用法完全相同。

XLATE:

N2

C FROM:TO XLATE(E) STRING:START_POS TARGET ER

从START_POS开始,将字符串STRING中的符合条件(存在于FROM中)的字符替换成相应的(TO中)另外一个字符 例:

* The following translates the blank in NUMBER to '-'. The result * in RESULT will be '999-9999'.

C MOVE '999 9999' Number 8 C ' ':'-' XLATE Number Result 8 例:

D Up C 'ABCDEFGHIJKLMNOPQRS-

D 'TUVWXYZ' D Lo C 'abcdefghijklmnopqrs- D 'tuvwxyz' * In the following example, all values in STRING are translated to * uppercase. As a result, RESULT='RPG DEPT'. C MOVE 'rpg dept' String 8 C Lo:Up XLATE String Result * In the following example only part of the string is translated to lowercase. As a result, RESULT='RPG Dept'.

C Up:Lo XLATE String:6 Result

新增位操作

新增位操作有TESTB

TESTB:

使用方法如下: indicators C TESTB bit_numbers Character_field N1 N2 N3 当factor2中指定的所有位都为off时,N1=*on 当factor2中指定的位中至少有一个为on时,N2=*on;但是,当factor2中只指定了一个位时,N2无效

61676237.doc – 第 30 页 共 39 页

当factor2中指定的所有位都为on时,N3=*on

例(TESTB):

* The field bit settings are FieldF = 00000001, and FieldG = 11110001. * Indicator 16 is set on because bit 3 is off (0) in FieldF. * Indicator 17 is set off. C TESTB '3' FieldF 16 17 * Indicator 16 is set on because both bits 3 and 6 are off (0) in * FieldF. Indicators 17 and 18 are set off.

C TESTB '36' FieldF 161718 * Indicator 17 is set on because bit 3 is off (0) and bit 7 is on * (1) in FLDF. Indicators 16 and 18 are set off.

C TESTB '37' FieldF 161718 * Indicator 17 is set on because bit 7 is on (1) in FLDF. * Indicator 16 is set off. C TESTB '7' FieldF 16 17 * Indicator 17 is set on because bits 0,1,2, and 3 are off (0) and * bit 7 is on (1). Indicators 16 and 18 are set off. C TESTB FieldG FieldF 161718 * The hexadecimal literal X'88' (10001000) is used in factor 2. * Indicator 17 is set on because at least one bit (bit 0) is on * Indicators 16 and 18 are set off.

C TESTB X'88' FieldG 161718

新增日期、时间操作

增加ADDDUR, EXTRCT, SUBDUR, TEST等日期操作。

ADDDUR

计算Factor1/Result加上一段时间后的时间。 N1 N2 N3 C 原时间 ADDDUR(E) 时间段:类型 结果 ER Factor1可以是日期、时间、时间戳类型的变量,当没有指定Factor1时,result将被用作factor1。 Factor2必须是numeric类型的变量,不能含有小数位。Factor2可以是负数,此时实际上是在做减操作。Factor2由两部分组成,两部分使用”:”分割。第一部分是时间,第二部分使用来表示时间类型的关键字。 当Factor1中不是一个有效的时间,或者当没有指定factor1而且result没有指定一个有效的时间值时,此指令会运行出错。我们可以使用两种方式检查指令执行地是否正确:

61676237.doc – 第 31 页 共 39 页

在此指令执行完成后检查指示器。

在adddur后面使用”(E)”,在执行完此指令后检查%ERROR是否为*ON。

HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ H TIMFMT(*USA) DATFMT(*MDY&)

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++

DDateconst C CONST(D'12 31 92') * Define a Date field and initialize DLoandate S D DATFMT(*EUR) INZ(D'12 31 92') DDuedate S D DATFMT(*ISO) Dtimestamp S Z Danswer S T * Determine a DUEDATE which is xx years, yy months, zz days later * than LOANDATE. C LOANDATE ADDDUR XX:*YEARS DUEDATE C ADDDUR YY:*MONTHS DUEDATE C ADDDUR ZZ:*DAYS DUEDATE * Determine the date 23 days later C ADDDUR 23:*D DUEDATE * Add a 1234 microseconds to a timestamp C ADDDUR 1234:*MS timestamp * Add 12 HRS and 16 minutes to midnight C T'00:00 am' ADDDUR 12:*Hours answer C ADDDUR 16:*Minutes answer * Subtract 30 days from a loan due date

C ADDDUR -30:*D LOANDUE

EXTRACT

从time/timestamp/date变量中截取年/月/日/小时/分钟/秒钟/微秒 N1 N2 N3 C EXTRCT(E) 时间:类型 结果 ER

结果字段可以是数值类型也可以是字符类型。 错误检查方法与ADDDUR相同。 例:

D LOGONDATE S D

D DATE_STR S 15 D MONTHS S 8 DIM(12) CTDATA

* Move the job date to LOGONDATE. By default, LOGONDATE has an *ISO * date format, which contains a 4-digit year. *DATE also contains a * 4-digit year, but in a different format, *USA. C *USA MOVE *DATE LOGONDATE * Extract the month from a date field to a 2-digit field

61676237.doc – 第 32 页 共 39 页