应用场景
查询条件主要用于通知表单过滤数据,在以下的场景使用:
...
第一种查询方式为保持对DWF2.0的继承性而保留,DWF 3.0版本对其进行了扩展,后续的开发中推荐使用脚本查询。
编写语法
(一)查询条件
从DWF 2.0继承下来的用于描述条件表达式的方法,写法是:用and开头的若干逻辑表达式,表达式的语法遵循HQL的where子句的语法,每个逻辑表达式可以使用一些预先约定的保留字,用于表示目标对象和上下文的信息。主要的保留字有:
...
代码块 | ||
---|---|---|
| ||
--这里$obj代表正在编辑的设备,其唯一代号是系统属性,obj代表工单WorkOrder类,其workOrderState代表状态属性 and obj.workOrderState = '已完工' and obj.assetOid = '$obj.oid' |
(2)关联类查询
对于关联查询的目标使用:leftClass.plt_[属性名],rightClass.plt_[属性名],relationClass.plt_[属性名],分别代表左类,右类和关联类的属性查询,DWF会在后台将左类,右类和关联类合并在一起同时执行过滤,以零件到零件的关联Part2Part类的查询为例:
...
代码块 | ||
---|---|---|
| ||
--根据当前表单的右对象oid找到关联的左对象oid and obj.left_oid = $obj.right_oid |
(3)上下文引用
$user:当前登录用户的信息。有如下一些属性:
- userId / oid:用户的系统唯一标识,userId是为了保持兼容性留下的关键字,推荐使用oid。
- userName:用户英文名。
- token:用户登录系统后的令牌,在实现跳转超链接到其它系统时可以作为单点登录的依据。
- userGroups:当前登录用户直属的组织,用法是:$user.userGroups[0].name,获得组织的名称。
...
- serverIp:当前服务器的ip。
- 使用$env的典型场景是根据服务器不同而动态变化访问的地址,主要用于超链接控件中表示语义的跳转。
(二)脚本查询
由于查询条件是DWF 2.0的产物,使用时存在很多局限性。DWF 3.0版本扩展了条件查询的能力,可以在操作的前处理脚本将查询条件提交给表单引擎。如下所示:
...
脚本查询的好处有两点,脚本查询使用了高级语法,直接将当前系统的几乎所有上下文信息获取并拼装到查询条件。例如:当前编辑对象的名称,可以这样写:
(1)实体类查询
对于实体类对象,直接使用:this.obj.[属性名]即可访问到当前表单被操作的对象:
代码块 | ||
---|---|---|
| ||
return { query:`and obj.id='${this.obj.name}'` //其中JavaScript引擎会自动将${}中的表达式转变为具体的取值 } |
(2)关联类查询
对于关联查询的目标使用obj.left_[属性名],obj.right_[属性名],obj.relation_[属性名],对于查询条件引用关联类的对象:分成左类,右类和关联类,写法是this.obj.left_[属性名],this.obj.right_[属性名],this.obj.relation_[属性名]的方式进行引用
代码块 |
---|
query = `and obj.left_oid = '${this.obj.right_oid}'`; |
(3)上下文引用
如果在脚本中需要获取上下文信息,可以这样写
this.user:代表当前登录用户信息,其内部含有的属性名称与$user一样,包括:oid, userName, token, userGroups等;
...
代码块 | ||
---|---|---|
| ||
return { query:`and obj.responsiblePersonId='${this.user.oid}'` //其中JavaScript引擎会自动将${}中的表达式转变为具体的取值 } |
(三)其它情况
(1)原生查询
有时候,在脚本或者快速查询条件里需要使用最直接的SQL查询,那么可以使用如下的方式编写原生的查询语句,使用原生查询的时候,查询语句会先被DWF的访问控制功能检查,以便确信当前登录用户具有访问数据的权限。
原生实体类查询:
原生查询返回的结果集中,每一列的拼写方式需要与返回实体类的属性名称相对应,例如:实体类中存在oid属性,那么查询结果中一定必须存在一个plt_oid as oid的列。如下所示:
...
代码块 | ||
---|---|---|
| ||
nativequery: select plt_fullname as "FullName", plt_age as "age" -- 此处双引号包裹 from plt_cus_person -- 实体类的表名是 plt_ZONENAME_CLASSNAME where plt_fullname like '%Walter%' -- 查询条件中使用单引号包裹 |
原生关联类查询:
代码块 | ||
---|---|---|
| ||
nativequery: select leftclass.plt_oid as "left_oid", -- leftclass.plt_oid 必须在select语句中 leftclass.plt_fullname as "left_FullName", relationclass.plt_oid as "relation_oid" , -- relationclass.plt_oid 必须在select语句中 relationclass.plt_leftoid as "relation_leftOid", -- relationclass.plt_leftoid 必须在select语句中 relationclass.plt_rightoid as "relation_rightOid", -- relationclass.plt_leftoid 必须在select语句中 relationclass.plt_friendship as "relation_FriendShip", rightclass.plt_oid as "right_oid", -- rightclass.plt_oid 必须在select语句中 rightclass.plt_fullname as "right_FullName" from plt_cus_person leftclass, plt_cus_r_friendship relationclass, plt_cus_person rightclass -- 关联类表名是 plt_ZONENAME_r_CLASSNAME where leftclass.plt_oid = relationclass.plt_leftoid and rightclass.plt_oid = relationclass.plt_rightoid - join条件 and (relationclass.plt_friendship > 50) |
原生外部实体类查询:
代码块 | ||
---|---|---|
| ||
nativequery: select name, gender -- 外部实体类不需要 as from person -- 外部实体类表名为ZONENAME where name = 'White' |
(2)在表单URL中查询
下面是一些其它的情况:
信息 | ||
---|---|---|
| ||
使用表单分享时,在分享链接也可以设置查询条件,语法与第一种查询一致,例如: http://[ip]:8180/app-web/forms/Product/ProductList?token=Bearer&displayType="create"&query="查询条件" |
...