lczCreater中的表达式按照执行时机的不同,分为后台表达式(由后台java程序执行的、在取数后初始阶段执行的、在数据提交到数据库时相关的)和前台表达式(数据加载到Web页面后,由前端初始渲染或交互过程中执行的)。

本文档重点介绍前台表达式的语法及相关业务示例,方便用户学习借鉴。

1 什么是前台表达式?

JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,在大部分的主流浏览器上都能执行。

lczCreater前台表达式是在JavaScript的基础上,扩充了对变量的定义及一些业务函数的扩充。

举个简单的例子,要判定某个字段的值是否等于2,其写法为:${字段标识} == 2返回值:若字段值为2,则返回:true,否则返回:false

其中,“字段标识”是指该字段在元数据中定义的,如下图所示:

术语解释:

  • 元数据:乐创者中,对数据库表结构定义信息的一种扩充对象,用于描述字段在页面中的呈现控件、数值格式、解码数据来源等。
  • 字段标识:在元数据中定义的,用于唯一标识字段的名称;可以有效防止前后端数据交互时,对数据库表结构的暴露;

总结一下,lczCreater前台表达式具备以下特点:

1)、基于JS语法,因此,JS下的对象及对象的方法在lczCreater前台表达式都能支持;
2)、${字段标识}是代入行内字段值的约定词法,表达式执行前会根据字段类型以及字段值先进行替换,即:假设上面示例表达式对应的字段类型如果为整型,值为3,则表达式执行按以下步骤进行:
  步骤一、字段值替换,替换后结果: 3 > 2
  步骤二、替换完成后,就是标准的js代码了,因此,可以提交js脚本引擎执行,获得结果true
  如果字段类型是字符型,那么替换时,在值的两端会自动添加引号以确保符合js语法。

2 应用范围

1)跨设备表单中的表达式->公式计算;
2)跨设备表单中的表达式->动态显示;
3)跨设备表单中的表达式->保存校验;
4)工作流表单中的表达式->保存校验;

3 主从表语法说明

在lczCreater的表达式中,表内字段获取值时表达式的写法比较简单,但涉及到表间计算或是聚合运算时,表达式的语法有以下约定:

3.1 行内计算

直接使用在元数据中定义的字段标识即可,例如:

${字段标识} == 2 
${字段1} > ${字段2}

注意:不支持表内跨行计算

3.2 聚合运算

假设要在主表中,显示对某个明细表某列字段的汇总,表达式为:

sum($[明细表.字段标识])

注意:聚合运算时,词法是按照“$[”和“]”对字段标识进行包含的。

3.3 表间计算

1)、主表字段的表达式,引用从表字段时,一般只能使用汇总计算;
2)、从表字段的表达式,引用主表字段时,需要加[0],例如:在订单实例中,计算订单总价,计算规则: 所有产品的单价 * 数量 + 运费,转换为lczCreater前台表达式:

${dj} * ${sl} + ${订单[0].yhf}

注意:明细表引用主表时,主表表明后要增加: [0]

3)、从表字段的表达式,引用其他从表字段时,一般也只能使用汇总计算。

4 操作符

4.1 算数操作符

适用于两个数值(整型、双精度、浮点型等)进行加减乘除求余计算:

+ : 适用于两个数值相加,例如: 4 + 5${字段标识)} + 10

- : 适用于两个数值相减,例如: 5 - 4${字段标识} - 10

* : 适用于两个数值相乘,例如: 4 * 5${字段标识)} * 10

/ : 适用于两个数值相除,例如: 5 / 4${字段标识)} / 10

% : 适用于两个数值求余,例如: 54 % 5${字段标识} % 10

注意:如果是两个字符串对象使用了加法运算符,则返回值为两个对象拼接

4.2 关系操作符

适用于两个数值(整型、双精度、浮点型等)、日期、日期时间等类型的比较,比较的结果是布尔型值(true / false):

< : 小于, 例如: ${字段1} < ${字段2}

<= : 小于等于, 例如: ${字段1} <= ${字段2}

> : 大于, 例如: ${字段1} > ${字段2}

>= : 大于等于, 例如: ${字段1} >= ${字段2}

== : 等于(先类型转换一直,再比较), 例如: ${字段1} == ${字段2}

!= : 不等于(先类型转换一直,再比较), 例如: ${字段1} != ${字段2}

=== : 全等(恒等,需要比较的两个值类型也相同,即先比较类型,再比较值),例如: "2" === 2,返回:false

!== : 全不等(不恒等,先比较类型,再比较值),例如: "2" !== 2,返回:true

4.3 逻辑操作符

4.3.1 逻辑非

主要用于布尔值的取反操作:

! : 值取反

例如: !${字段标识},假设字段1的值是true,那么表达式的值为:false

4.3.2 逻辑与

一般用于布尔值的与操作:

&& : 适用于两个值相与

例1: ${字段1} && ${字段2},假设字段1的值是true,字段2的值是false,那么表达式的值为:false

例2:1 && 0,那么表达式的值为:0

例3:1 && 2,那么表达式的值为:2

例4:true && true,那么表达式的值为:true

例5:true && false,那么表达式的值为:false

注意:字符值的值不要直接进行逻辑与操作,应先转换为数值后再进行逻辑与操作

4.3.3 逻辑或

一般用于布尔值的或操作:

|| : 适用于两个值相或

例1: ${字段1} || ${字段2},假设字段1的值是true,字段2的值是false,那么表达式的值为:true

例2:1 || 0,那么表达式的值为:1

例3:1 || 2,那么表达式的值为:1

例4:true || false,那么表达式的值为:true

例5:'a' || 'b',那么表达式的值为:’a’

5 表达式运算

5.1 字符串运算

1)字符串拼接
例如:要显示某条记录的创建人、创建时间

'创建人:'+${CreateId} + '创建时间:' + formatDatetime(${CreateDate}, "yyyy年MM月dd日 HH时mm分ss秒")

2)字符串比较是否相同
例如:判定字段的值是否等于”表单”

//大小写敏感
${字段标识} === "表单" 

3)判空

//判定字段值为空:
isempty(${字段标识})

//判定字段值不为空:
isnotempty(${字段标识})

4)包含,起始,结束

//包含:
${字段标识}.indexOf("包含值") >= 0

//起始:
${字段标识}.indexOf("起始值") == 0

//包含值最后起始值为:
${字段标识}.lastIndexOf("包含值")

//结束:
${字段标识}.endsWith("结尾值")

5)剔除字符串两边空格

//去除两端:
${字段标识}.trim()

//去除左端:
${字段标识}.trimLeft()

//去除右端:
${字段标识}.trimRight()

6)字符串转大写小写

//大写输出
${字段标识}.toLocaleUpperCase()

//小写输出
${字段标识}.toLocaleLowerCase()

6)字符串替换

//替换为指定字符串:将字段值中的"aaa"全替换为"bbb"
${字段标识}.replaceAll("aaa","bbb")

5.2 数值运算

1)简单的加减乘除运算
直接使用算数运算符进行运算,如:

${字段标识1)} + ${字段标识2} - ${字段标识3}

2)数值比较
例如:判定字段值大于1000,返回true,否则返回false:

${字段标识} > 1000 ? true : false

5.3 日期运算

1)获取当前年份,月份,日期

year()  //返回今年年份,如:2021
month() //返回当月月份,如:04
now()  //返回当前时间,如:2021-04-14 10:09:01

2)格式化字段日期数据

formatDatetime("yyyy年MM月dd日", ${日期字段})
formatDatetime("yyyy-MM-dd", ${日期字段})

3)比较日期大小

//需要转换为日期对象后,再进行比较
datetime(${字段1}, 'yyyy-MM-dd') > datetime(${字段2}, 'yyyy-MM-dd')
datetime(${字段1}, 'yyyy-MM-dd HH:mm:ss') > datetime(${字段2}, 'yyyy-MM-dd HH:mm:ss')

5.4 聚合运算

5.4.1 求和

对明细表字段进行汇总,按照明细行进行逐行汇总运算

sum(tableCol,expression)

参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立

返回值
数值,汇总后的值。

举例

1:返回table1的field1字段的汇总值是否大于100:
sum($[table1.field1]) > 1002:满足条件的,返回汇总值:
sum($[table1.field1], '$[table1.field1] > 10')  //字段值>10的才会被统计

5.4.2 获取最大值

对明细表字段求最大值,按照明细行进行逐行进行运算

max(tableCol,expression)

参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立

返回值
数值或日期值,返回最大的值。

举例

1:返回table1的field1字段的最大值是否大于100:
max($[table1.field1]) > 1002:满足条件的,返回最大值:
max($[table1.field1], '$[table1.field1] > 10')  //字段值>10的才会被统计

5.4.3 获取最小值

对明细表字段求最小值,按照明细行进行逐行进行运算

min(tableCol,expression)

参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立

返回值
数值或日期值,返回最小的值。

举例

1:返回table1的field1字段的最小值是否大于100:
min($[table1.field1]) > 1002:满足条件的,返回最小值:
min($[table1.field1], '$[table1.field1] > 10')  //字段值>10的才会被统计

5.4.4 获取平均值

对明细表字段求平均值,按照明细行进行逐行进行运算

avg(tableCol,expression)

参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立
**
返回值**
数值,返回平均值。

举例

1:返回table1的field1字段的平均值是否大于100:
avg($[table1.field1]) > 1002:满足条件的,返回平均值:
avg($[table1.field1], '$[table1.field1] > 10')  //字段值>10的才会被统计

5.4.5 计数

对明细表进行计数运算

count(tableCol,expression)

参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立

返回值
整数

举例

1:返回table1的field1字段的平均值是否大于100:
count($[table1.field1]) > 1002:满足条件的,返回计数值:
count($[table1.field1], '$[table1.field1] > 10')  //字段值>10的才会被统计

5.4.6 多字段汇总

以订单明细为例,假设主表中要显示订单总价,而总价由所有订购产品的价格 + 运货费组成。

实现方案:
1)“订单明细”元数据中增加一个虚拟列:订购价;
2)在跨设备表单的计算公式中增加一项,元数据选择“订单明细”,字段选择“订购价”,表达式为:${单价} * ${订购数量},这样当“单价”和“订购数”量发生变化时,会自动计算对应产品的“订购价”;
3)在跨设备表单的计算公式中增加一项,元数据选择“订单”,字段选择“总价”,表达式为:$[订单明细.订购价] + ${运货费},当产品的“订购价”或“运货费”发生变化时,会自动计算“总价”。3)在跨设备表单的计算公式中增加一项,元数据选择“订单”,字段选择“总价”,表达式为:$[订单明细.订购价] + ${运货费},当产品的“订购价”或“运货费”发生变化时,会自动计算“总价”。

附录、返回字段值相关java对象常用方法

String对象

1、求字符串长度

int length() 返回该字符串的长度,例如: ${字段标识}.length()

2、查找子字符串位置

int indexOf(searchvalue, start) 可返回某个指定的字符串值在字符串中首次出现的位置

拓展阅读:JavaScript String 对象

作者:Eric  创建时间:2023-06-07 17:07
最后编辑:Eric  更新时间:2025-04-24 13:55