FineReport参数联动如何实现?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 参数 正文

什么是参数联动?

参数联动,通俗地讲,就是一个参数的取值会影响到另一个参数的取值范围

finereport 参数联动
(图片来源网络,侵删)

最常见的例子就是“省-市-区”三级联动:

  1. 当你选择一个“省份”(如“江苏省”)后,“城市”参数的下拉列表只会显示江苏省内的城市(如“南京”、“苏州”)。
  2. 当你选择一个“城市”(如“南京市”)后,“区县”参数的下拉列表只会显示南京市内的区县(如“鼓楼区”、“玄武区”)。

这种交互方式极大地提升了用户体验,避免了在海量数据中进行无效选择。


实现参数联动的核心原理

FineReport 实现参数联动的核心在于 SQL 语句的动态变化

  1. 主参数:第一个被选择的参数,它的值会作为条件,去影响第二个参数的 SQL 查询。
  2. 从参数:第二个及后续的参数,它们的 SQL 查询语句中会包含一个占位符(通常是 ),这个占位符在运行时会被主参数的值所替换

让我们用“省-市”联动的例子来解释:

finereport 参数联动
(图片来源网络,侵删)
  • 省份参数 (主参数):SQL 查询是固定的,查询所有省份。
    SELECT省份名称 FROM 省份表
  • 城市参数 (从参数):SQL 查询是动态的,它需要一个省份名称作为条件。
    SELECT 城市名称 FROM 城市表 WHERE 省份名称 = ?

    这里的 就是一个占位符,当用户在“省份”参数中选择“江苏省”并点击“查询”后,FineReport 会自动将 替换为 '江苏省',然后执行查询,得到江苏省的所有城市。


实现参数联动的两种主要方式

在 FineReport 中,主要有两种方式来实现参数联动:普通联动父子格

普通联动

这是最常用、最标准的方式,适用于大多数“一级影响一级”的场景。

操作步骤(以“省-市”联动为例):

第一步:准备数据集 假设我们有两张表:

  • province (省份表): id, province_name
  • city (城市表): id, city_name, province_id

第二步:创建并配置参数

  1. 创建“省份”参数

    • 在报表设计器中,点击菜单栏的 模板 > 参数
    • 在弹出的“参数”对话框中,点击 新增参数。
    • 参数名称p_province (建议用 p_ 前缀,便于识别)。
    • 参数类型字符串
    • 控件类型下拉框
    • 数据字典:选择 数据库字典
    • SQL 语句:输入查询省份的 SQL。
      SELECT province_name FROM province
    • 勾选 允许多选(如果需要)和 动态缓存(优化性能)。
    • 点击 确定
  2. 创建“城市”参数

    • 同样,新增一个参数。
    • 参数名称p_city
    • 参数类型字符串
    • 控件类型下拉框
    • 数据字典:选择 数据库字典
    • SQL 语句:输入查询城市的 SQL,关键在于使用 占位符
      SELECT city_name FROM city WHERE province_id = (SELECT id FROM province WHERE province_name = ?)

      注意:city 表里有 province_name 字段,SQL 可以简化为 SELECT city_name FROM city WHERE province_name = ?,这里我们假设通过 id 关联,这样更规范。

    • 点击 确定

第三步:建立联动关系

这是最关键的一步,将两个参数关联起来。

  1. 再次打开 模板 > 参数 对话框。
  2. 在左侧参数列表中,选中从参数(即 p_city)。
  3. 在右侧的属性面板中,找到 控件设置 -> 数据联动
  4. 点击 添加 按钮。
  5. 在弹出的窗口中进行配置:
    • 主控件:选择主参数,即 p_province
    • 从控件:系统会自动填充为当前选中的 p_city
    • 联动类型:通常选择 下拉框
    • 主控件值:选择主参数的值,即 p_province
    • 从控件值:选择从参数的值,即 p_city
    • 提交方式:选择 提交后,这样当用户选择省份后,需要点击报表的“查询”按钮,城市列表才会更新,也可以选择 选择后,实现实时联动,但可能会有性能开销。
  6. 点击 确定,再点击 参数 对话框的 关闭

第四步:使用参数 在报表的单元格中,通过 参数控件 工具栏,将 p_provincep_city 这两个参数控件拖拽到报表的合适位置(通常是报表的参数面板区域)。

第五步:预览效果 点击预览,你就能看到选择省份后,城市列表会随之变化了。


父子格

父子格联动是一种更高级的联动方式,它允许一个参数(父格)的值去决定另一个参数(子格)的显示/隐藏,而不仅仅是改变其选项,它通常用于更复杂的、非下拉框的交互场景,比如用单元格的值来控制其他控件的可见性。

适用场景:

  • 用一个下拉框的值来控制另一个下拉框的显示与隐藏
  • 用一个单元格的值来控制一个文本框的只读/可编辑状态。
  • 用一个复选框的勾选状态来控制一组控件的启用/禁用

核心原理: 父子格联动的实现依赖于 参数面板 的设计,你需要将控件放在参数面板的特定单元格中,然后通过设置控件的 条件属性 来控制其可见性、可用性等。

操作步骤(简述):

  1. 设计参数面板:将参数面板设计成一个类似表格的布局,有“父格”和“子格”之分。
  2. 创建参数:像普通联动一样,创建所有需要的参数,并将它们的控件拖入参数面板的相应单元格。
  3. 设置子格控件的“条件属性”
    • 选中需要被控制的“子格”控件(比如一个下拉框)。
    • 在右侧属性面板中,找到 条件属性
    • 添加一个条件。
    • 条件p_province = '江苏省'
    • 属性:选择 控件 -> 可见
    • 这样,当 p_province 的值等于“江苏省”时,这个下拉框才会显示出来。
  4. 提交方式:父子格联动通常设置为 选择后,以实现即时的交互效果。

进阶技巧与注意事项

  1. 多级联动

    • 实现“省-市-区”三级联动,只需重复“普通联动”的步骤。
    • p_province 影响 p_city
    • p_city 再影响 p_districtp_district 的 SQL 中使用 占位符,其主控件是 p_city
  2. 参数默认值

    可以在参数的“数据字典”设置中,为参数设置一个默认值,这样报表首次加载时就会显示这个默认值,并触发一次联动查询。

  3. 动态 SQL 拼接

    • 如果从参数的查询条件比较复杂,可能需要动态拼接 SQL,可以使用 FineReport 的公式功能。
    • p_city 的 SQL 可以设置为公式:
      // 在公式编辑器中编写
      var sql = "SELECT city_name FROM city WHERE 1=1";
      if(p_province != null){
        sql += " AND province_name = '" + p_province + "'";
      }
      return sql;
    • 然后在参数的数据字典中选择 公式,并选择这个公式。
  4. 性能优化

    • 动态缓存:为参数控件勾选“动态缓存”,可以缓存已经查询过的结果,避免重复查询数据库,提升性能。
    • 提交方式:对于数据量大的报表,建议使用 提交后 联动,而不是 选择后,以减少数据库查询压力。
    • SQL 优化:确保用于联动的 SQL 语句本身是高效的,字段上最好有索引。
  5. 空值处理

    • 在 SQL 中使用 时,如果主参数没有选择(为空),可能会导致 SQL 语法错误,建议使用 IF 函数或 CASE WHEN 来处理。
    • SELECT ... WHERE (province_name = ? OR ? IS NULL),这样当主参数为空时,条件 ? IS NULL 为真,可以查询出所有数据。

特性 普通联动 父子格联动
核心思想 主参数的值替换从参数 SQL 中的 通过条件属性控制控件的显示/隐藏/可用性
适用场景 改变下拉框、复选框等控件的 控制控件的可见性、可用性、只读状态
实现方式 在参数的“数据联动”中设置主从关系 在控件的“条件属性”中设置显示/隐藏条件
交互方式 通常需要点击“查询”按钮(提交后) 通常为实时交互(选择后)
复杂度 简单,标准用法 较复杂,需要设计参数面板布局

对于绝大多数报表开发需求,普通联动是首选,当你需要实现更复杂的交互逻辑,比如根据一个选择显示或隐藏一整组控件时,再考虑使用父子格联动。

希望这份详细的指南能帮助你完全掌握 FineReport 的参数联动功能!

-- 展开阅读全文 --
头像
智能物流国内外发展现状如何?差距与趋势怎样?
« 上一篇 今天
hg680j智能机顶盒
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]