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]) > 100
例2:满足条件的,返回汇总值:
sum($[table1.field1], '$[table1.field1] > 10') //字段值>10的才会被统计
5.4.2 获取最大值
对明细表字段求最大值,按照明细行进行逐行进行运算
max(tableCol,expression)
参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立
返回值
数值或日期值,返回最大的值。
举例
例1:返回table1的field1字段的最大值是否大于100:
max($[table1.field1]) > 100
例2:满足条件的,返回最大值:
max($[table1.field1], '$[table1.field1] > 10') //字段值>10的才会被统计
5.4.3 获取最小值
对明细表字段求最小值,按照明细行进行逐行进行运算
min(tableCol,expression)
参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立
返回值
数值或日期值,返回最小的值。
举例
例1:返回table1的field1字段的最小值是否大于100:
min($[table1.field1]) > 100
例2:满足条件的,返回最小值:
min($[table1.field1], '$[table1.field1] > 10') //字段值>10的才会被统计
5.4.4 获取平均值
对明细表字段求平均值,按照明细行进行逐行进行运算
avg(tableCol,expression)
参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立
**
返回值**
数值,返回平均值。
举例
例1:返回table1的field1字段的平均值是否大于100:
avg($[table1.field1]) > 100
例2:满足条件的,返回平均值:
avg($[table1.field1], '$[table1.field1] > 10') //字段值>10的才会被统计
5.4.5 计数
对明细表进行计数运算
count(tableCol,expression)
参数
tableCol:字段标识,仅支持行内单字段,多字段或跨表计算需通过虚拟字段辅助
expression:条件表达式,表达式成立,对应的字段数据才会被统计;为空时,代表成立
返回值
整数
举例
例1:返回table1的field1字段的平均值是否大于100:
count($[table1.field1]) > 100
例2:满足条件的,返回计数值:
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)
可返回某个指定的字符串值在字符串中首次出现的位置
最后编辑:Eric 更新时间:2025-04-24 13:55
