在项目数据展示中,涉及到行政区划,省市区三级联动,运用帆软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替换。