内置函数
内置函数 与操作码类似,因为它们对您指定的数据执行操作。 可以在表达式中使用内置函数。 此外,可以在指定的常量中使用常量值内置函数。 这些命名常量可以在任何规范中使用。
所有内置函数都将百分号 (%) 作为其第一个字符。 内置函数的语法为:
function-name{(argument{:argument...})}函数的自变量可以是变量,常量,表达式,原型过程或其他内置函数。 表达式自变量可以包含内置函数。 以下示例对此进行了说明。CL0N01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++++
*
* This example shows a complex expression with multiple
* nested built-in functions.
*
* %TRIM takes as its argument a string. In this example, the
* argument is the concatenation of string A and the string
* returned by the %SUBST built-in function. %SUBST will return
* a substring of string B starting at position 11 and continuing
* for the length returned by %SIZE minus 20. %SIZE will return
* the length of string B.
*
* If A is the string ' Toronto,' and B is the string
* ' Ontario, Canada ' then the argument for %TRIM will
* be ' Toronto, Canada ' and RES will have the value
* 'Toronto, Canada'.
*
C EVAL RES = %TRIM(A + %SUBST(B:11:%SIZE(B) - 20))
请参阅各个内置函数描述,以获取有关允许的自变量的详细信息。
与操作码不同,内置函数返回值,而不是将值放在结果字段中。 以下示例说明了此差异。
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
*
* In the following example, CITY contains the string
* 'Toronto, Ontario'. The SCAN operation is used to locate the
* separating blank, position 9 in this illustration. SUBST
* places the string 'Ontario' in field TCNTRE.
*
* Next, TCNTRE is compared to the literal 'Ontario' and
* 1 is added to CITYCNT.
*
C ' ' SCAN CITY C
C ADD 1 C
C SUBST CITY:C TCNTRE
C 'Ontario' IFEQ TCNTRE
C ADD 1 CITYCNT
C ENDIF
*
* In this example, CITY contains the same value, but the
* variable TCNTRE is not necessary since the %SUBST built-in
* function returns the appropriate value. In addition, the
* intermediary step of adding 1 to C is simplified since
* %SUBST accepts expressions as arguments.
*
C ' ' SCAN CITY C
C IF %SUBST(CITY:C+1) = 'Ontario'
C EVAL CITYCNT = CITYCNT+1
C ENDIF
请注意,此示例中使用的自变量 (变量 CITY 和表达式 C+1) 与 SUBST 操作的因子值相似。 函数本身的返回值类似于结果。 通常,内置函数的自变量类似于操作码的因子 1 和因子 2 字段。
内置函数的另一个有用功能是,它们可以简化在定义规范上使用时对代码的维护。 以下示例演示了此功能。
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++
*
* In this example, CUSTNAME is a field in the
* externally described data structure CUSTOMER.
* If the length of CUSTNAME is changed, the attributes of
* both TEMPNAME and NAMEARRAY would be changed merely by
* recompiling. The use of the %SIZE built-in function means
* no changes to your code would be necessary.
*
D CUSTOMER E DS
D DS
D TEMPNAME LIKE(CUSTNAME)
D NAMEARRAY 1 OVERLAY(TEMPNAME)
D DIM(%SIZE(TEMPNAME))
内置函数可用于扩展因子 2 计算规范上的表达式以及定义规范上的关键字。 与定义规范关键字配合使用时,必须在编译时知道内置函数的值,并且自变量不能是表达式。
下表列出了内置函数,它们的自变量以及它们返回的值。
| 姓名 | 参数 | 返回的值 |
|---|---|---|
| %ABS | 数字表达式 | 表达式的绝对值 |
| %ADDR | 变量名 {: *DATA} | 变量的地址或变长变量的数据部分的地址 |
| %ALLOC | 要分配的字节数 | 指向已分配存储器的指针 |
| %BITAND | 字符,数字 | 所有自变量的位的按位 AND 运算 |
| %BITNOT | 字符,数字 | 自变量位的按位反向 |
| %BITOR | 字符,数字 | 所有自变量的位的按位 OR 运算 |
| %BITXOR | 字符,数字 | 两个自变量的位的按位互斥 ORing |
| %CHAR |
|
|
| %字符数 | 字符串表达式 | 字符串中的自然字符数 |
| %CHECK | 比较器字符串: 要检查的字符串{:start position} | 不在比较器字符串中的字符的第一个位置,如果找不到,则为零 |
| %CHECKR | 比较器字符串: 要检查的字符串{:start position} | 不在比较器字符串中的字符的最后一个位置,如果找不到,则为零 |
| %CONCAT | 分隔符: string1 {: string2 { : string3 ... } } | 操作数 2 到 N (用分隔符分隔) |
| %CONCATARR | 分隔符: 数组} | 由分隔符分隔的数组元素 |
| %DATA | 文档 { : options } | 不适用 |
| 日期 | {value {: date format} } | 对应于指定 值的日期,或者当前系统日期 (如果未指定) |
| % 日 | 天数 | 作为持续时间的天数 |
| %DEC |
|
压缩数字格式的值 |
| %DECH | 数字或字符表达式: 数字 :decpos |
压缩数字格式的半调整值 |
| %DECPOS | 数字表达式 | 小数位数 |
| %DIFF | date 或 time 表达式: date 或 time 表达式: 单位 {:fractional seconds} | 指定单位中的两个日期,时间或时间戳记之间的差异 |
| %DIV | 红利: 除数 | 两个自变量的除法的商 |
| %EDITC | 非浮点数字表达式: 编辑码 {:*CURSYM | *ASTFILL | currency symbol} | 表示已编辑值的字符串 |
| %EDITFLT | 数字表达式 | 浮点的字符外部显示表示 |
| %EDITW | 非浮点数字表达式: 编辑字 | 表示已编辑值的字符串 |
| %ELEM 1 | 数组,表或多次出现的数据结构名 | 元素或出现次数 |
| %EOF | {file name} | 如果最新的 循环输入,读操作或写入子文件 (对于特定文件,如果指定) 以文件结束或文件开始条件结束,那么为 "1"。 |
| 否则为 "0"。 注: 当指定参数时, CHAIN , OPEN , SETGT 和 SETLL 操作也会影响 %EOF。 请参阅 %EOF (文件条件的返回结束或开始)。
|
||
| %EQUAL | {file name} | 如果最新的 SETLL (针对特定文件,如果已指定) 或 LOOKUP 操作发现完全匹配,那么为 "1" |
| 否则为 "0" | ||
| %ERROR | "1": 如果指定了扩展程序 "E" 的最新操作码导致错误 | |
| 否则为 "0" | ||
| %字段 | 不适用 | |
| %浮点 | 数字 或字符 表达式 | 浮点格式的值 |
| %FOUND | {file name} | "1": 如果最新的相关操作 (对于特定文件,如果已指定) 找到记录 (CHAIN , DELETE , SETGT , SETLL) ,元素 (LOOKUP) 或匹配 (CHECK , CHECKR 和 SCAN) |
| 否则为 "0" | ||
| %GEN | 生成器 { : options } | 不适用 |
| %GRAPH | 字符,图形或 UCS-2 表达式 { : ccsid } | 具有指定 CCSID 的图形格式的值 |
| %HANDLER | 处理过程: 通信区域 | 不适用 |
| %HIVAL | 变量 | 变量的最高值 |
| % 小时 | 小时数 | 作为持续时间的小时数 |
| %INT | 数字 或字符 表达式 | 整数格式的值 |
| %INTH | 数字 或字符 表达式 | 整数格式的半调整值 |
| %KDS | 包含密钥的数据结构 {: number of keys} |
不适用 |
| %LEN | 任何表达式 | 长度 (以数字或字符计) |
| %LEFT | 字符串 :length | 最左边的字符 |
| %LIST | item1 { : item2 { : item3 ... } } | 从操作数创建的数组 |
| %LOOKUPxx | 参数: 数组 {:start index {:number of elements}} | 匹配元素的数组下标 |
| %LOVAL | 变量 | 变量的最低值 |
| %LOWER | 字符串 {:start{:length}} | 字符串,将子串转换为小写 |
| %MAX | item1 : item2 { : item3 { : item4 ... } } | 操作数的最大值 |
| %MAXARR | 数组 {: start-element { : number-of-elements } } | 数组中最大值的索引 |
| %MIN | item1 : item2 { : item3 { : item4 ... } } | 操作数的最小值 |
| %MINARR | 数组 {: start-element { : number-of-elements } } | 数组中最小值的索引 |
| %分钟 | 分钟数 | 分钟数作为持续时间 |
| %月 | 月数 | 月数作为持续时间 |
| 毫秒 | 微秒数 | 作为持续时间的微秒数 |
| %MSG | 消息标识: 消息文件 { : replacement text } | 不适用 |
| %NULLIND | 可空字段名称 | 表示可空字段的空指示符设置的指示符格式中的值 |
| %会发生 | 多实例数据结构名 | 多实例数据结构的当前实例 |
| %略去 | 过程接口参数名称 | 是否为参数传递了 *OMIT |
| 打开 | 文件名 | "1" (如果指定的文件已打开) |
| "0" (如果指定的文件已关闭) | ||
| %PADDR | 过程或原型名称 | 程序或原型的地址 |
| % 参数 | 无 | 传递到过程的参数数 |
| %PARMNUM | 过程接口参数名称 | 过程接口参数的数目 |
| %PARSER | 解析器 { : options } | 不适用 |
| %通过 | 过程接口参数名称 | 参数是否已传递且未省略 |
| %PROC | {*OWNER | *ONEXIT} | 当前过程的外部名 |
| %RANGE | item1 : item2 | 不适用 |
| %REALLOC | 指针: 数字表达式 | 指向已分配存储器的指针 |
| %REM | 红利: 除数 | 两个自变量的除法中的其余部分 |
| %REPLACE | 替换字符串: 源字符串 {:start position {:source length to replace}} | 通过将替换字符串插入到源字符串中,从起始位置开始并替换指定数目的字符而生成的字符串 |
| %右 | 字符串 :length | 最右边的字符 |
| %SCAN | search 参数: 要搜索的字符串 {:start position{:length}} | 搜索参数在字符串中的第一个位置或零 (如果未找到) |
| %SCANR | search 参数: 要搜索的字符串 {:start position{:length}} | 搜索参数在字符串中的最后位置或零 (如果找不到) |
| %SCANRPL | 扫描字符串: 替换字符串: 源字符串 {:scan start position {:scan length}} |
将扫描字符串替换为源字符串中的替换字符串而生成的字符串,扫描从起始位置开始,开始的长度为指定的长度 |
| %秒 | 秒数 | 作为持续时间的秒数 |
| %SHTDN | "1" (如果系统操作员已请求关闭) | |
| 否则为 "0" | ||
| %SIZE 1 | 变量,数组或文字 {:* ALL} | 变量或文字的大小 |
| %SPLIT | 字符串{:separators} | 子串数组 |
| %SQRT | 数字值 | 数字值的平方根 |
| %状态 | {file name} | 0 (如果自指定了扩展程序 "E" 的最新操作码以来未发生任何程序或文件错误) |
| 为任何程序或文件状态设置的最新值 (如果发生错误) | ||
| 如果指定了文件,那么返回的值是该文件的最新状态 | ||
| %STR | 指针{:maximum length} | 由指针自变量寻址的字符,直到但不包括第一个 x '00' |
| %SUBARR | 数组名: 开始索引{:number of elements} | 数组子集 |
| %SUBDT | 日期或时间表达式: 单位 | 包含日期或时间值的指定部分的无符号数字值 |
| %SUBDT | 日期或时间表达式: 单位 {数字: { fractional seconds}} | |
| %SUBST | 字符串: 启动{:length} | 子串 |
| %目标 | 程序或过程 { : offset } | 不适用 |
| 这 | 本机方法的类实例 | |
| 时间 | {value {: time format} } | 对应于指定 值的时间,或者当前系统时间 (如果未指定) |
| %时间戳 | {(值 {: 时间戳记格式 {: fractional seconds}})} | 对应于指定的字母数字或数字 值的时间戳记,或者当前系统时间戳记 (如果未指定) |
| %时间戳 | {(值 {: fractional seconds})} | 对应于指定日期或时间戳记 值的时间戳记,或者当前系统时间戳记 (如果未指定) |
| %TLOOKUPxx | 参数: 搜索表 {: alternate table} | "*ON" (如果存在匹配项) |
| 否则为 "*OFF" | ||
| %TRIM | 字符串 {: characters to trim} | 包含左空格和右空格或指定字符的字符串 |
| %TRIML | 字符串 {: characters to trim} | 带有左空格或指定字符的字符串 |
| %TRIMR | 字符串 {: characters to trim} | 包含右空格或指定字符的字符串 |
| %UCS2 | 字符,图形或 UCS-2 表达式 { : ccsid } | 具有指定 CCSID 的 UCS-2 格式的值 |
| %UNS | 数字 或字符 表达式 | 无符号格式的值 |
| 联合国人权事务高级专员办事处 | 数字 或字符 表达式 | 无符号格式的半调整值 |
| 上 | 字符串 {:start{:length}} | 字符串,将子串转换为大写 |
| %X 脚 | 数组表达式 | 元素总和 |
| %X 迟到 | 源字符: 目标字符: 字符串 {: start position} | 由源字符替换为源字符的字符串 |
| %X ML | xml 文档 { : options } | 不适用 |
| % 年 | 年数 | 年数作为持续时间 |
注:
|
||