Peoplecode 运算符
peoplecode表达式能够使用数学,String,比较和布尔类型运算符来修改和结合。
数学运算符
peoplecode使用标准的数学运算符:
+
-
*
/
- **(指数)
指数计算优先于乘除法,乘除法优先于加减法。此外,数学表达式是从左往右进行运算的,可以使用括号来决定运算的优先级。
负数符号可以使用为:
-10
-&NUM
-Product(&PERCENT_CUT,0.1,SALARY)
日期和时间运算符
我们可以对两个日期或者时间进行加减,最后会得到一个结果数。日期间的情况,这个数字代表两个日期间相差的天数。如果是时间之间的情况,这就是两个时间之间相差的秒数。也可以像时间或者日期加上或者减去相应的数,就会得到计算后的新的时间或日期。下表总结了这些运算:
字符串链接
字符串连接符(|)用于连接两个字符串。例如:假设&OPER_NICKNAME是“Dave”;以下语句为&RETOPT赋值为:
“I can't do that,”|&OPER_NICKNAME|"."
连接符会自动将操作数转化成字符串。这种转换使得我们更加容易的去写混合类型的语句。例如:
&DAYS_LEFT = &CHRISTMAS - %Date;
WinMessage("Today is " | %Date | ". Only " | &DAYS_LEFT | " shopping days left!");
@操作符
@操作符将一个存储定义引用的字符串转化为定义。这个非常有用。例如,如果我们希望在数据库中存储定义引用并且使用peoplecode检索他们;或者我们希望一字符串形式通过操作者在提示功能中的输入来获取定义引用。
用一个简单的例子来说明,如果记录中的字段EMPLID目前是8001,以下表达式获取值为8001.
@"EMPLID"
下例是使用@操作符将字符串转化为存储的相应记录引用和字段引用
&STR1 = "RECORD.BUS_EXPENSE_PER";
&STR2 = "BUS_EXPENSE_DTL.EMPLID";
&STR3 = FetchValue(@(&STR1), CurrentRowNumber(1), @(&STR2), 1);
WinMessage(&STR3, 64);
注意:字符串的引用定义是不被peopleTools维护的。如果我们以字符串形式存储一个定义引用,然后用@操作符去转换。这样当定义名称改变时就产生了一个维护问题。
以下个函数从另一个程序中传入两个参数,一个是一个rowset,另一个是一个record,并使用他们来执行一些程序处理。用GetRecord方法不能为record获取到变量,可是我们可以使用@来引用record的名字。因为record名称不会写死的,如果这个名称发生了改变,该代码可以不做修改。
Function Get_My_Row(&PASSED_ROWSET, &PASSED_RECORD)
For &ROWSET_ROW = 1 To &PASSED_ROWSET.RowCount
&UNDERLYINGREC = "RECORD." | &PASSED_ROWSET.DBRecordName;
&ROW_RECORD = &PASSED_ROWSET.GetRow(&ROWSET_ROW).GetRecord(@&UNDERLYINGREC);
/* Do other processing */
End-For;
End-Function;
比较操作符
比较操作符比较两个相同数据类型的表达式。结果是一个布尔类型的值。下表总结了比较操作符:
我们可以在任意的比较操作符前加上not,例如:
- Not=
- Not<
- Not>=
形成一个以比较运算符形式的表达式逻辑术语,可以结合布尔运算符。
字符比较是区分大小写的,可以使用内置函数Upper或者Lower来达到不区分大小写的比较。
布尔运算符
逻辑运算符AND,OR,NOT用于和布尔表达式相结合。下表展示了用and和or结合两个布尔表达式的结果。
NOT运算符会对布尔表达式取反,将为TRUE的变为FALSE,为FALSE的变为TRUE。
在混合表达式中使用NOT,AND,OR。NOT的优先级最高,AND其次,最后是OR。可以使用括号去改变优先级。(通常我们在逻辑表达式上都使用括号,他会使该表达式更容易被解读)如果是被使用于赋值语句的右边,布尔表达式必须用括号括起来。
下面的例子是包含布尔表达式的语句:
&FLAG = (Not (&FLAG)); /* toggles a Boolean */
if ((&HAS_FLEAS or &HAS_TICKS) and
SOAP_QTY <= MIN_SOAP_QTY) then
SOAP_QTY = SOAP_QTY + OrderFleaSoap(SOAP_ORDER_QTY);
end-if;