页面树结构
转至元数据结尾
转至元数据起始

1.应用场景

查询条件主要用于通知表单过滤数据,在以下的场景使用:

  1.在配置操作的界面,如果动作设置为list列表时,可以设置查询条件。

  2.在二次开发的处理脚本,可以通过直接返回查询条件来实现。

  第一种查询方式为保持对DWF2.0的继承性而保留,DWF 3.0版本对其进行了扩展,后续的开发中推荐使用脚本查询。

2.编写语法

2.1 查询条件

  从DWF 2.0继承下来的用于描述条件表达式的方法,写法是:用and开头的若干逻辑表达式,表达式的语法遵循HQL的where子句的语法,每个逻辑表达式可以使用一些预先约定的保留字,用于表示目标对象和上下文的信息。主要的保留字有:

2.1.1 实体类查询

obj:表示查出来的目标类对象。例如:希望查询设备类(Asset)的状态属性(assetState)取值为异常的设备对象,可以写过滤条件:

and obj.assetState = '异常'

$obj:当前表单中正在被操作的对象,$obj的属性和表单对应实体类的属性是一致的,可以用$obj.assetName的方法编写查询条件,例如:如果希望在浏览设备(Asset)的表单查询当前设备处于已完工的工单(WorkOrder)对象清单,可以写过滤条件:

--这里$obj代表正在编辑的设备,其唯一代号是系统属性,obj代表工单WorkOrder类,其workOrderState代表状态属性
and obj.workOrderState = '已完工' and obj.assetOid = '$obj.oid' 

2.1.2关联类查询

对于关联查询的目标使用:leftClass.plt_[属性名],rightClass.plt_[属性名],relationClass.plt_[属性名],分别代表左类,右类和关联类的属性查询,DWF会在后台将左类,右类和关联类合并在一起同时执行过滤,以零件到零件的关联Part2Part类的查询为例:

--查询搅拌车下装配数量为2的所有关联
and obj.left_name = '搅拌车' and obj.relation_number = 2 

如果在表单中,需要引用当前正在编辑的对象,那么仍然可以试用$obj作为当前被操作对象,关联属性表示为:left_[属性名],right_[属性名],relation_[属性名]

--根据当前表单的右对象oid找到关联的左对象oid
and obj.left_oid = $obj.right_oid

2.1.3 上下文引用

$user:当前登录用户的信息。有如下一些属性:

  1. userId / oid:用户的系统唯一标识,userId是为了保持兼容性留下的关键字,推荐使用oid。
  2. userName:用户英文名。
  3. token:用户登录系统后的令牌,在实现跳转超链接到其它系统时可以作为单点登录的依据。
  4. userGroups:当前登录用户直属的组织,用法是:$user.userGroups[0].name,获得组织的名称。

使用$user的典型场景是过滤当前登录用户的特定对象。例如:希望在点击操作显示工单时,过滤得到分配给用户的工单,可以写过滤条件:

--注意:在使用保留字转义的时候需要使用代号
and obj.workOrderState = '已分配' and obj.assetOid = '$obj.oid' and obj.responsiblePersonOid = '$user.userId' 

$env:表示当前登录系统的上下文,有如下一些属性:

  • serverIp:当前服务器的ip。
  • 使用$env的典型场景是根据服务器不同而动态变化访问的地址,主要用于超链接控件中表示语义的跳转。

2.2 脚本查询

由于查询条件是DWF 2.0的产物,使用时存在很多局限性。DWF 3.0版本扩展了条件查询的能力,可以在操作的前处理脚本将查询条件提交给表单引擎。如下所示:

return {
	query:`and obj.state = '已创建'`
}

脚本查询的好处有两点,脚本查询使用了高级语法,直接将当前系统的几乎所有上下文信息获取并拼装到查询条件。例如:当前编辑对象的名称,可以这样写:

2.2.1 实体类查询

对于实体类对象,直接使用:this.obj.[属性名]即可访问到当前表单被操作的对象:

return {
	query:`and obj.id='${this.obj.name}'` //其中JavaScript引擎会自动将${}中的表达式转变为具体的取值
}

2.2.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}'`;

2.2.3 上下文引用

如果在脚本中需要获取上下文信息,可以这样写

this.user:代表当前登录用户信息,其内部含有的属性名称与$user一样,包括:oid, userName, token, userGroups等;

this.env:代表系统的上下文环境信息,其内部含有的属性名与$env一样,包括:serverIp,serverPort等;


return {
	query:`and obj.responsiblePersonId='${this.user.oid}'` //其中JavaScript引擎会自动将${}中的表达式转变为具体的取值
}

2.3 其它情况

2.3.1 原生查询

有时候,在脚本或者快速查询条件里需要使用最直接的SQL查询,那么可以使用如下的方式编写原生的查询语句,使用原生查询的时候,查询语句会先被DWF的访问控制功能检查,以便确信当前登录用户具有访问数据的权限。

原生实体类查询:

原生查询返回的结果集中,每一列的拼写方式需要与返回实体类的属性名称相对应,例如:实体类中存在oid属性,那么查询结果中一定必须存在一个plt_oid as oid的列。如下所示:

nativequery: 
select 
  plt_oid as oid,
  plt_assetname as assetName, 
  plt_number as number
from plt_cus_part where plt_partname = "搅拌车"
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.3.2 在表单URL中查询

下面是一些其它的情况:

表单分享链接中指定查询

使用表单分享时,在分享链接也可以设置查询条件,语法与第一种查询一致,例如:

  http://[ip]:8180/app-web/forms/Product/ProductList?token=Bearer&displayType="create"&query="查询条件"

  • 无标签