在日常的泛微 E9 二次开发中,我们常常需要对表单中的流程浏览按钮做数据过滤以满足业务需求。泛微提供了一个非常强大的自定义参数 spellSqlWhere
,可以通过它实现基于 SQL 的动态筛选功能。本文将详细介绍这一功能,并分享一个实用的解决方案。
先亮方案!注意:仅限流程浏览框
注意事项
建议配合datas查询的sql使用:api/ec/dev/table/getxml 拦截后解决方案,否则你的参数很容易无效~在流程中,我们可以通过 WfForm.appendBrowserDataUrlParam
API 方法扩展浏览按钮取数接口的参数值:
WfForm.appendBrowserDataUrlParam("field6541", {
"spellSqlWhere": "and workflow_requestbase.currentnodeid = 202"
});
上述代码的核心是利用 spellSqlWhere
参数直接向 SQL 查询中拼接条件,非常适合实现基于表单动态条件的数据过滤。
背景分析
关键代码解析
在研究过程中,发现了泛微的部分源码逻辑:
private String getFromSql(Map<String, Object> var1, List<String> var2) {
String var3 = (String)var2.get(0);
String var4 = (String)var2.get(1);
StringBuilder var5 = new StringBuilder();
var5.append(" where 1=1 ").append(Util.null2String(var1.get("spellSqlWhere")));
}
从这段代码可以得出以下几个重要信息:
拼接逻辑 :
spellSqlWhere
参数的值会被直接拼接到 SQL 查询的WHERE
子句中。Util.null2String(var1.get("spellSqlWhere"))
的作用是将传入的spellSqlWhere
参数安全地拼接到WHERE
子句中,避免空值引发异常。
来源 :
var1
是请求的参数 Map。- 浏览按钮通过请求参数
spellSqlWhere
动态传入 SQL 条件。
动态扩展 :
- 通过向参数中添加
spellSqlWhere
,可以为浏览按钮注入自定义 SQL 条件,从而动态控制浏览按钮的数据展示。
- 通过向参数中添加
功能要点
spellSqlWhere
的核心功能是基于 SQL 的动态筛选。通过将表单上的条件转换为 SQL 语句拼接到查询中,开发者可以快速实现复杂的过滤需求。
使用场景
- 按流程节点过滤 :
在工作流中,不同节点需要查看不同的数据。例如,当前节点只允许看到与当前流程状态相关的数据。 - 基于表单字段动态过滤 :
根据用户在表单中填写的值,实时调整浏览按钮的数据范围。 - 复杂条件查询 :
对接外部系统或处理复杂的业务逻辑时,通过自定义 SQL 条件过滤数据。
实现步骤
1. 定义浏览按钮并关联字段
在 E9 中设计表单,添加一个浏览按钮,并绑定一个字段(如 field6541
)。
2. 使用 WfForm.appendBrowserDataUrlParam
扩展参数
在工作流节点脚本中,使用 WfForm.appendBrowserDataUrlParam
方法向浏览按钮添加 spellSqlWhere
参数。例如:
WfForm.appendBrowserDataUrlParam("field6541", {
"spellSqlWhere": "and workflow_requestbase.currentnodeid = 202"
});
3. 动态构建 SQL 条件
根据业务需要,可以动态拼接不同的 SQL 条件。例如,基于表单字段值动态筛选:
var condition = "and workflow_requestbase.requestid = " + WfForm.getFieldValue("field1234");
WfForm.appendBrowserDataUrlParam("field6541", {
"spellSqlWhere": condition
});
4. 测试并验证
通过实际操作表单,测试浏览按钮的数据是否按预期过滤。例如:
- 当前节点是否只显示与当前节点 ID 匹配的数据。
- 表单字段值是否正确过滤浏览数据。
实际案例
场景描述
在一个审批流程中,需要在表单中添加一个浏览按钮,过滤出当前流程节点中未审批的流程请求。
解决方案
- 表单中添加浏览按钮,绑定字段
field6541
。 - 在节点脚本中添加以下代码:
WfForm.appendBrowserDataUrlParam("field6541", {
"spellSqlWhere": "and workflow_requestbase.currentnodeid = " + WfForm.getFieldValue("currentNodeId") +
" and workflow_requestbase.requeststatus = 0"
});
动态拼接 SQL 条件:
currentnodeid
:当前节点 ID。requeststatus = 0
:未审批状态。
结果
浏览按钮只显示符合当前节点且未审批的请求数据,大大提高了用户体验和操作效率。
总结
spellSqlWhere
是一个非常灵活的自定义浏览按钮参数,开发者可以利用它轻松实现复杂的动态 SQL 筛选需求。通过 WfForm.appendBrowserDataUrlParam
方法,可以为浏览按钮动态注入 SQL 条件,适用于各种复杂业务场景。
优点:
- 灵活性高:基于 SQL 动态拼接,几乎没有筛选限制。
- 易于实现:通过简单的 API 调用即可完成。
通过合理利用 spellSqlWhere
,我们可以显著增强泛微 E9 的浏览按钮功能,让表单更加智能和高效!
[Ecology E9] [ 精华 ] 流程浏览按钮自定义参数自定义sql筛选 by https://oneszhang.com/archives/127.html
等等,我可以这样写吗@(吐舌)
"spellSqlWhere": "and exists (select * from xxxxxxx)"比如我的浏览框是uf_abc的表单,但是我流程直接添加WfForm.appendBrowserDataUrlParam("field6541", {
});
这样好像就不需要在新建浏览框那先设定一个where了?
不行滴这个只支持流程选择框
我查看了建模浏览框代码,里面没有固定这个参数,只有在流程浏览框里才可以使用这个参数
不是呀,我的是流程里面的浏览框,只不过单选浏览是引用的模块的表单
其他浏览框可以吗,比如岗位选择
这个就需要看一下源码了,通常来讲不一定可以,暂时只有流程可以这么做
这个源码是看的哪部分@(乖)
哪个,本文章的代码在BrowserAction.class 如果你问得岗位选择的话,那我还真没注意过,如果你会的话,可以开远程调试打断点看下
现在我是有个请假类型的浏览框 拉的是考勤里面的假期类型,想根据流程里某个字段的值对浏览框的选项进行筛选,用这个可以实现么,或者咋实现,我看那个前端接口api文档里面好像没有能实现的
费点劲,实现起来比较麻烦,不过你可以把请假类型改为下拉框,自定义值对应好请假类型浏览框即可WfForm.controlSelectOption来控制下拉框,这样似乎实现起来好一些
好的,感谢感谢@(乖)
丸子大佬,想问问你,集成中心-数据展现集成中,做一个浏览按钮,数据来源选择自定义地址,这个地址会返回XML格式的body数据, 这样会形成一个浏览框,然后把某个字段设置为查询字段/查询字段默认显示, 在流程框中,根据条件去筛选数据,这时候的条件查询会区分大小写, 那么如何才能实现不区分大小写筛选呢?
哦豁,这个我还真没使用过,你可以看看条件会不会传给你的自定义地址,如果传给了自定义地址重新获取的数据,那肯定就是自定义地址源的问题。暂时没看到组件有这个配置项