下拉选项来源与联动
说明下拉框、多选下拉、单选组、复选组的四种选项来源,选项级联(联动下拉)的触发条件与限制,以及大数据量字典的搜索选择方案。
概述
下拉框、多选下拉、单选组、复选组这四种控件的选项,可以来自手工录入、报表里的数据集、公式或一条直连 SQL。选项之间还可以联动:某个下拉的取数文本里引用了另一个控件绑定的参数,那个控件的值一变,本下拉的选项就自动重新取数。
功能入口
「查询表单设计」对话框 > 选中下拉框、多选下拉、单选组或复选组 > 右侧「组件属性」 > 「选项配置」分区 > 「选项类型」。
选项类型
「选项类型」有四个取值,新建控件默认是「自定义选项」。
| 选项类型 | 选项来自 | 适用场景 |
|---|---|---|
| 自定义选项 | 设计者手工录入的「显示值 / 实际值」列表 | 选项固定且很少,如「门诊」「住院」 |
| 绑定数据集 | 报表中已定义的数据集 | 字典已经是报表的一个数据集 |
| 公式字典 | 一个返回列表的表达式 | 选项可以用表达式生成 |
| 直连SQL字典 | 一条直接写在控件上的 SQL | 只为这个下拉取数,不想单独建数据集 |
自定义选项
点击「编辑选项」,在「选项编辑」弹窗里点「添加选项」,逐行填写「显示值」「实际值」。确定时会校验:显示值不能为空、实际值不能为空、实际值不能重复,否则提示「第 N 行…」。「显示值」是使用者看到的文字,「实际值」是提交给参数的值。
绑定数据集
| 属性 | 说明 | 取值/默认值 |
|---|---|---|
| 数据集 | 提供选项的数据集 | 必选 |
| 显示字段 | 作为显示值的字段 | 必选 |
| 值字段 | 作为实际值的字段 | 必选 |
| 简拼字段 | 数据源自带的简拼列 | 可选;不选则按显示字段自动生成简拼 |
数据集、显示字段、值字段有任一项未选时,下拉里没有选项。
公式字典
| 属性 | 说明 | 取值/默认值 |
|---|---|---|
| 公式 | 返回列表的表达式 | 必填,如 '北京,上海,广州'.split(',') |
| 显示字段 | 元素是对象时取此字段作显示值 | 缺省取 label |
| 值字段 | 元素是对象时取此字段作实际值 | 缺省取 value |
| 简拼字段 | 元素是对象时取此字段作简拼 | 可选;缺省按显示字段自动生成 |
表达式返回标量列表时,显示值与实际值相同;返回对象列表时按「显示字段」「值字段」取值。公式必须是合法的脚本表达式,不能是裸的数组字面量,需要写成方法调用,例如 '门诊,住院,全院'.split(',')。
直连SQL字典
| 属性 | 说明 | 取值/默认值 |
|---|---|---|
| 数据源 | 数据源名称 | 留空使用报表默认数据源 |
| SQL | 查询选项的 SQL | 如 SELECT name AS label, id AS value FROM dim_dept |
| 显示字段 | SQL 结果中作显示值的列 | 如 label |
| 值字段 | SQL 结果中作实际值的列 | 如 value |
| 简拼字段 | 结果中作简拼的列 | 可选;缺省按显示字段自动生成 |
SQL 经后端数据集链路执行,参数占位与数据集 SQL 相同,可引用报表参数($参数名)。显示字段、值字段、SQL 任一为空时,该控件没有选项。
简拼搜索
下拉框和多选下拉支持输入关键字过滤,也可以按简拼匹配,如输入 xhy 匹配「小换药」。源表有简拼列时在「简拼字段」里指定,否则按显示字段自动生成。
选项级联
触发条件
「选项级联」开关出现在「绑定数据集」「公式字典」「直连SQL字典」三种类型下,默认开启。开启时,如果本控件选项的取数文本里引用了其他控件绑定的参数,被引用的参数一变,本控件的选项就重新取数:
- 「绑定数据集」的取数文本是该数据集的 SQL(API 数据集则是地址、请求体和参数默认值);
- 「公式字典」的取数文本是公式;
- 「直连SQL字典」的取数文本是 SQL。
依赖由系统对取数文本按字面匹配自动侦测,不需要额外配置;$库房、${库房}、${$库房} 三种形态都会被识别为引用。但作为 SQL 参数取值时应写 $库房 或 ${$库房},${库房}(没有内层 $)里的 库房 是未定义标识符,求值为空(null),拿不到参数值,SQL 里会绑定为 NULL,见 参数类型、默认值与传参。
关闭「选项级联」后,选项只在打开报表时取一次。「自定义选项」没有取数过程,不参与级联。
联动时的行为
- 上级控件的值变化后,等待约 250 毫秒再重新取数,避免多选时逐个勾选连续请求。
- 重新取数后,已选值如果不在新选项里,会被自动清除。
- 重新取数失败时保留原有选项,不清空下拉。
- 树形下拉在数据来源为「数据集」且未使用懒加载时,同样按数据集 SQL 里的参数引用联动。
限制
- 只支持单向联动,即 A 影响 B。A、B 互相引用时,系统只保留先发现的一个方向并断开另一个方向,避免死循环。
- 联动依赖的是取数文本里的字面引用,用表达式间接拼出的参数名不会被识别。
示例
做一个「大区 → 城市」联动下拉,再用两个值查询客户。使用系统初始化时导入的演示数据(数据源 demo)。
- 「查询参数设置」中添加两个字符串参数:
region、city。 - 新建 SQL 数据集「客户」,数据源选
demo:
SELECT 客户名称, 客户类型, 客户等级, 所在大区, 所在城市
FROM demo_客户
WHERE 所在大区 = $region AND 所在城市 = $city
- 在报表中用「客户」数据集的字段绑定明细列(行扩展,参见 单元格绑定与扩展)。
- 「查询表单设计」中添加「下拉框」,标签填「大区」,绑定
region,「选项类型」选「直连SQL字典」:数据源填demo,SQL 填
SELECT DISTINCT 大区 AS label, 大区 AS value FROM demo_地区
显示字段填 label,值字段填 value。
5. 再添加一个「下拉框」,标签填「城市」,绑定 city,「选项类型」同样选「直连SQL字典」,SQL 填
SELECT 城市 AS label, 城市 AS value FROM demo_地区 WHERE 大区 = $region
显示字段 label,值字段 value,「选项级联」保持开启。
6. 两个下拉都打开「是否必填」,再添加「查询按钮」。
7. 确定、保存、预览。在「大区」里选「华东」,「城市」的选项刷新为华东大区的城市;再改选「华北」,「城市」里原先选的华东城市被清除,选项变为华北的城市。
数据量很大的字典
下拉框、多选下拉用虚拟滚动渲染,选项很多时也只渲染可见的行。字典达到数千条以上、需要按关键字在服务端查找时,用「搜索选择」控件:关键字与分页在服务端执行,弹窗表格分页显示,见 查询表单控件。
注意事项
注意:选项值来自数据库原始值,类型可能与参数声明的类型不同(如字典 id 是整数、参数是字符串)。通过 URL 或宿主传入参数值时,系统会按字符串比较、去除首尾空白等方式把值对齐到选项,使其能被选中。
注意:数据集绑定的选项在打开报表时随首屏一次取回。数据集本身没有引用其他控件的参数时,选项不会随其他控件变化。
提示:设计器目前没有「远程搜索下拉」的配置项,大数据量字典请使用「搜索选择」。