PeopleCode 函数

概论

PeopleCode提供以下函数

  • 内置函数:PeopleCode标准的函数集合,他们能够在不被声明的情况下直接调用。
  • 内部函数:定义在调用该函数的peoplecode程序中(使用函数定义语句)。
  • 外部peoplecode:定义于调用该函数的程序外。它们通常包含在record的定义中,用作函数库。
  • 外部非peoplecode:外部语言的函数库。

注意:PS计算解析引擎提供自带的内置函数

此外,PS还支持一些方法。内置函数和方法的区别在于:

  1. 内置函数在你的代码中独立存在,一般情况下不需要任何关联。我们也不必在使用该函数时先去实例化一个对象。
  2. 方法只能被对象执行(用点号调用),并且必须先实例化该对象。

函数定义

peoplecode函数能在任意的peoplecode程序中被定义。函数定义必须要放在程序的顶端,沿着下来是变量和外部函数声明。

按照惯例,peoplecode程序被存储在以FUNCLIB_为开头的record中,并且通常放在fielformula事件上。

注意:Applicaton Class提供了定义函数的另一种方式。对函数功能进行分离,能够比存储在FUNCLIBS表中更加清晰。

如果你在peoplecode函数中调用外部函数,你必须将该函数声明在该程序的顶部,声明函数的语法多种多样,主要取决于外部函数是否是写在peoplecode中或者是动态链接库中编译的。

以下是一个FUNCLIB record中函数的声明方法示例

Declare Function UpdatePSLOCK(函数名) PeopleCode FUNCLIB_NODES.MSGNODENAME(表名.字段名) FielFormula;

以下是一个函数定义的示例:

Function Z_Function([param_list]) returns string(返回值类型) 
	...
	return &returnValue;
end-Function;

函数调用

用下述语法调用函数:

function_name([param_list])

参数列表(param_list)是一个表达式列,使用逗号分隔。他们是函数所需的。参数列表中的项有的是必须的有的是可选的。

我们可以在peoplecode的debugger中对输入的参数做校验。

如果,函数必须有返回值,那么该函数的调用方法必须如下:

&RESULT = Product(&RAISE_PERCENT);

如果函数的返回值不是必须的,它就可以视为子程序被调用。如果函数没有返回值,那么他就是一个子程序。

WinMessage(64,"I can't do that," | &OPER_NICKNAME | ".");

参数通常是用引用的形式传递到函数内部和外部函数的。即使有的函数会改变调用者传入的值,我们也必须传入变量。

内置函数的参数为引用值或者值,这需要取决于该函数。外部函数的参数引为用值或者值,取决于对他的声明以及类型。

函数返回值

函数能返回任意被支持的数据类型:一些函数对返回值有限制。

随意返回值只能出现在内置函数。我们不能定义随意返回值的函数。函数中典型的随意返回的值是布尔类型值,它指明是否该执行是成功的。例如:下面调用的DeleteRow函数,忽视返回值,并删除行。

if DeleteRow(RECORD.BUS_EXPENSE_PER,&L1_ROW,RECORD.BUS_EXPENSE_DTL,&L2ROW)
then WinMessage("ROw deleted.");
else WinMessage("Sorry-couldn't delete that row.");
end-if;

函数命名冲突

如果定义一个函数和系统内置函数的名字一样。那么该函数优先覆盖掉内置函数

此时,我们在开发工具中编译peoplecode的任何时候,都会出现一个警告在validate页签上,指出用户定义的函数和系统内置函数重名。

此外,如果编译所有的peoplecode,系统就会给每个用户自定义的函数生成一个错误信息日志文件,有自定义函数和内置函数重名。

这是一个错误消息的例子:User-defined function IsNumber is overriding the built-in function of the same name. (2,98)

如果我们留意到我们命名的函数与系统内置函数重名,并且该内置函数完成了我们希望达到的目的。直接引用内置函数代替我们自定义的函数。内置函数一般都会更加高效。此外降低了其他人维护你的代码时引起混淆。因为,如果他们没注意到validate tab上的警告消息,这会导致他们以为调用的是系统内置函数。