内置函数

内置函数 与操作码类似,因为它们对您指定的数据执行操作。 可以在表达式中使用内置函数。 此外,可以在指定的常量中使用常量值内置函数。 这些命名常量可以在任何规范中使用。

所有内置函数都将百分号 (%) 作为其第一个字符。 内置函数的语法为:
function-name{(argument{:argument...})}
函数的自变量可以是变量,常量,表达式,原型过程或其他内置函数。 表达式自变量可以包含内置函数。 以下示例对此进行了说明。
图 1。 内置函数自变量示例
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))

请参阅各个内置函数描述,以获取有关允许的自变量的详细信息。

与操作码不同,内置函数返回值,而不是将值放在结果字段中。 以下示例说明了此差异。

图 2。 内置函数示例
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 字段。

内置函数的另一个有用功能是,它们可以简化在定义规范上使用时对代码的维护。 以下示例演示了此功能。

图 3。 使用内置函数简化维护
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 计算规范上的表达式以及定义规范上的关键字。 与定义规范关键字配合使用时,必须在编译时知道内置函数的值,并且自变量不能是表达式。

下表列出了内置函数,它们的自变量以及它们返回的值。

表 1. 内置函数
姓名 参数 返回的值
%ABS 数字表达式 表达式的绝对值
%ADDR 变量名 {: *DATA} 变量的地址或变长变量的数据部分的地址
%ALLOC 要分配的字节数 指向已分配存储器的指针
%BITAND 字符,数字 所有自变量的位的按位 AND 运算
%BITNOT 字符,数字 自变量位的按位反向
%BITOR 字符,数字 所有自变量的位的按位 OR 运算
%BITXOR 字符,数字 两个自变量的位的按位互斥 ORing
%CHAR
  • 字符,图形, UCS-2 表达式 { : ccsid }
  • 数字表达式
  • 日期,时间,时间戳记表达式 {: date, time, or timestamp format}
  • 具有指定 CCSID 的字符格式的值
  • 具有 作业 CCSID 的字符格式的值
  • 具有作业 CCSID 的字符格式的值
%字符数 字符串表达式 字符串中的自然字符数
%CHECK 比较器字符串: 要检查的字符串{:start position} 不在比较器字符串中的字符的第一个位置,如果找不到,则为零
%CHECKR 比较器字符串: 要检查的字符串{:start position} 不在比较器字符串中的字符的最后一个位置,如果找不到,则为零
%CONCAT 分隔符: string1 {: string2 { : string3 ... } } 操作数 2 到 N (用分隔符分隔)
%CONCATARR 分隔符: 数组} 由分隔符分隔的数组元素
%DATA 文档 { : options } 不适用
日期 {value {: date format} } 对应于指定 的日期,或者当前系统日期 (如果未指定)
% 日 天数 作为持续时间的天数
%DEC
  • 数字表达式 {:digits:decpos}
  • 字符表达式: 数字 :decpos
  • 日期,时间或时间戳记表达式 {:format}
压缩数字格式的值
%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 } 不适用
% 年 年数 年数作为持续时间
注:
  1. 不允许使用复杂限定名。