帆软FineReport 实现省市区树形联动

在项目数据展示中,涉及到行政区划,省市区三级联动,运用帆软FineReport该如何实现,记录下来,方便备查。

第一步、树形数据准备

行政区划主要分为三级,即省市区,特殊的包含四个直辖市(北京市、天津市、上海市、重庆市),由于行政区划信息在一张表中存放,表内容如下图所示。
在这里插入图片描述
需要对数据进行预处理,即分层查询,组装数据,注意父子关系要对应。SQL如下图所示。

// 查询省级
SELECT
	concat(dist_cd, '-', prov_abbr) AS child_id,
	prov_name AS child_name,
	'0' AS parent_id,
	'省级' AS parent_name,
	'1' AS class_level,
	'1' AS display_seq,
	'0' AS is_leaf,
	dist_cd AS key_word
FROM
	bic_district
WHERE
	stat_cd = '1'
AND lev_cd = '1'
UNION ALL
// 查询市级 lev_cd=2
SELECT
	dist_cd AS child_id,
	city_name AS child_name,
	CONCAT( CONCAT( SUBSTRING(dist_cd, 1, 2), '0000' ), '-', prov_abbr ) AS parent_id,
	'市级' AS parent_name,
	'2' AS class_level,
	'1' AS display_seq,
	NULL AS is_leaf,
	dist_cd AS key_word
FROM
	bic_district
WHERE
	stat_cd = '1'
AND lev_cd = '2'
UNION ALL
// 查询县区级(非直辖市) lev_cd=3
SELECT
	CONCAT(dist_cd, '-', cty_abbr) AS child_id,
	cty_name AS child_name,
	CONCAT( SUBSTRING(dist_cd, 1, 4), '00' ) AS parent_id,
	city_name AS parent_name,
	'3' AS class_level,
	'1' AS display_seq,
	NULL AS is_leaf,
	dist_cd AS key_word
FROM
	bic_district
WHERE
	stat_cd = '1'
AND lev_cd = '3'
AND prov_abbr NOT IN ('BJS', 'TJS', 'SHS',  'CQS')
UNION ALL
// 查询县区级(直辖市) lev_cd=3
SELECT
	CONCAT(dist_cd, '-', cty_abbr) AS child_id,
	cty_name AS child_name,
	CONCAT( CONCAT( SUBSTRING(dist_cd, 1, 2), '0000' ), '-', prov_abbr ) AS parent_id,
	prov_name AS parent_name,
	'2' AS class_level,
	'1' AS display_seq,
	NULL AS is_leaf,
	dist_cd AS key_word
FROM
	bic_district
WHERE
	stat_cd = '1'
AND lev_cd = '3'
AND prov_abbr IN ('BJS', 'TJS', 'SHS',  'CQS')

新增子查询 povTreeData,并将以上SQL添加进数据库查询面板中。
在这里插入图片描述

第二步、新增树形控件

新增树形控件,即树数据集
在这里插入图片描述
选择 数据集 povTreeData,依赖所选数据集的父标记字段构件树,原始标记字段为 child_id ,父标记字段为 parent_id
在这里插入图片描述

第三步、绑定查询控件

绑定 行政区划选择控件,这里数据字段选择自动构建,勾选 多选异步加载结果返回叶子结点
在这里插入图片描述
选择 树数据集构建,设置实际值和显示值对应的字段,如下图所示。
在这里插入图片描述
页面预览,勾选后三级行政区划后,所选择的即选中。
在这里插入图片描述

第四步、主数据关联查询

将编辑栏中选择的日期和三级行政区划等条件,传递到主数据查询,进行筛选。这里使用的是 SUBSTITUTE 函数。

select 
	order_no, 
	create_time, 
	sku_name, 
	sku_num, 
	total_amount
from 
	t_business_order_result 
where 1 = 1
and tbo.pre_order_create_time between '${beginDate} 00:00:00' AND '${endDate} 23:59:59'
${
    
    if(len(treeProv)==0,""," and treeProv in ('"+SUBSTITUTE(treeProv,",","','")+"') ")}
order by tbo.order_no

添加主数据源如下图所示。
在这里插入图片描述

知识学习
SUBSTITUTE(text,old_text,new_text,instance_num): 用new_text替换文本串中的old_text。
Text:需要被替换字符的文本,或含有文本的单元格引用。
Old_text:需要被替换的部分文本。
New_text:用于替换old_text的文本。
Instance_num:指定用new_text来替换第几次出现的old_text。如果指定了instance_num,则只有指定位置上的old_text被替换,否则文字串中出现的所有old_text都被new_text替换。

猜你喜欢

转载自blog.csdn.net/u012190388/article/details/128816465
今日推荐