SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结

一、含名称代码无真实名称的表内联动

1、展示效果

​ 如下图所示:实现的效果是:打开报表页面,默认机构选择所有机构,且机构可以人为手工输入,且在机构中不选择任何机构时,依然默认选择全部机构,即机构框中为空白时,依然默认全选,且机构可以人为多选或者单选。其他的如卫生人员类别构成和卫生人员单位构成等,默认选择所有类别,所有单位,点击当前图形时可以联动此报表页面上的其他图形或表格,且当前图形的下拉框展示为所点中的联动类别,以防用户忘记自己点击了哪个类别来联动其他图表,也可以借助下拉框的全部选项返回原始默认选择全部的状况。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第1张图片

2、难点

​ 因数据表中类别,性别,单位等都是以代码的形式存储在数据库表中,而根据上述效果图,无论是图形的图例还是联动所展示的参数均为各自代码所对应的中文名称。因此需要对数据传值时的真实值与显示值等等进行设置。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第2张图片

3、原生SQL数据集的创建

​ 其中蓝色字体为参数,年龄,职称,学历,性别等参数是一个代码对应一个中文名称,而人员参数因其中一个中文名称对应代码为’1-69’,所以需要特殊处置。

​ 单位,年龄,职称,学历,性别等参数因打开报表页面默认显示全部,点击图形联动时是一个一个点击,即联动的点击筛选功能相当于是单选功能,因此采用数组方式进行,同时这些参数的设置不可选择允许多选。而机构参数默认选择全部机构,且支持多选和手工输入,因此也采用数组方法,不过是用 “in” 而不是 “=”,同时机构参数的设置需要勾选允许多选和手工输入两个选项。最后的统计时间参数不能多选,最好是今年就显示2021年,因此不需要采用数组方式,直接 “=” 即可。

#人员类别数据集,其中‘^’里面的提前设置好的参数,用此数据集生成的图形为卫生人员类别构成,而且点击卫生人员类别构成的图形可以联动页面中的其他图形,因此人员类别参数需要作为筛选条件展示在此图形联动的其他的数据集中,而其他一些参数如单位,年龄,职称,性别可以联动此图形,所以需要展示在此数据集的筛选条件中。
select 
COUNT(CASE WHEN a.LB <= '69'  THEN 1  END)  '卫生技术人员',
COUNT(CASE WHEN a.LB = '70'  THEN 2  END)  '其他技术人员',
COUNT(CASE WHEN a.LB = '80'  THEN 3  END)  '管理人员',
COUNT(CASE WHEN a.LB = '90'  THEN 4  END)  '工勤技术人员'
from MD_WORKERS a,tb_org b
where  a.YLJGDM=b.code and 
{[ a.type  =  ^P_PARAM.ucismodelsjk.卫生技术人员单位^ ]}       and  
{[ a.CSRQ  =  ^P_PARAM.ucismodelsjk.卫生人员年龄^    ]}       and  
{[ a.ZCDM  =   ^P_PARAM.ucismodelsjk.卫生人员职称^   ]}       and  
{[ a.WHCD  =   ^P_PARAM.ucismodelsjk.卫生人员学历^   ]}       and  
{[ a.XBBM  =    ^P_PARAM.ucismodelsjk.卫生人员性别^  ]}       and  
{[ b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^  ) ]}       and 
SUBSTRING_INDEX(a.YWSCSJ,'-',1)+'年' =  '^P_PARAM.ucismodelsjk.统计时间^' 
#机构单位构成数据集,其中‘^’里面的提前设置好的参数。
select 
COUNT(CASE WHEN a.type like  'A%'  THEN 1  END)  '医院',
COUNT(CASE WHEN a.type like  'B%'  THEN 2  END)  '社康',
COUNT(CASE WHEN a.type like  'C%'  THEN 3  END)  '妇幼保健院',
COUNT(CASE WHEN a.type like  'D%'  THEN 4  END)  '疾控',
COUNT(CASE WHEN a.type like  'E%'  THEN 5  END)  '卫生监督检验'
from MD_WORKERS a,tb_org b  where  a.YLJGDM=b.code and 
CASE WHEN  '^P_PARAM.ucismodelsjk.人员类别^' ='11'  THEN  a.LB <= '69' 
WHEN '^P_PARAM.ucismodelsjk.人员类别^' ='70'    THEN  a.LB = '70'
WHEN '^P_PARAM.ucismodelsjk.人员类别^' ='80'    THEN  a.LB = '80'
WHEN  '^P_PARAM.ucismodelsjk.人员类别^' ='90'    THEN  a.LB = '90'
ELSE 1=1  END  AND  
{[ a.CSRQ  =  ^P_PARAM.ucismodelsjk.卫生人员年龄^    ]}       and  
{[ a.ZCDM  =   ^P_PARAM.ucismodelsjk.卫生人员职称^   ]}       and  
{[ a.WHCD  =   ^P_PARAM.ucismodelsjk.卫生人员学历^   ]}       and  
{[ a.XBBM  =    ^P_PARAM.ucismodelsjk.卫生人员性别^  ]}       and  
{[ b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^  ) ]}       and 
SUBSTRING_INDEX(a.YWSCSJ,'-',1)+'年' =  '^P_PARAM.ucismodelsjk.统计时间^' 

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第3张图片

4、参数的创建

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第4张图片

​ 单位,年龄,职称,学历,性别等参数均为一个代码对应一个中文名称,均为联动参数,即相当于单选筛选参数,因此上方功能选项直接默认即可,不需要勾选多余的功能选项。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第5张图片

​ 卫生工作人员参数即人员类别参数,因其中的卫生技术人员类别对应了数据表中LB字段的1-69,且默认展示全部,所以在备选值框中加入一个全部列选项,且在默认值中设置全部选项。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第6张图片

​ 统计时间参数:备选值框中提取今年和过去四年,默认值中选择今年,点下一步之后直接保存。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第7张图片

​ 机构参数设置方法一:默认选择全部,可以多选和手工输入,且一个不选时默认也是全部,需要勾选上端功能选项中的允许多选和手工输入两个功能选项,默认值框中不需要进行设置,直接下一步并直接保存。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第8张图片

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第9张图片

​ 机构参数设置方法二:直接在备选值框中采用SQL查询出机构代码与机构名称,点击下一步,然后在备选值_实际值和备选值_显示值中对机构进行设置,实际传入机构代码,即用机构代码作为筛选条件去筛选其他的数据集,并且将机构名称当作显示值显示出来。点击保存即可。

5、Excel里创建Echarts图表

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第10张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第11张图片

​ 卫生人员类别图形的创建,其X轴为中文名称,但数据表中存储的类别实际为类别代码,因此需要将类别代码和类别中文名称都写上,并将中文名称当作X轴,点击数据传值设置功能选项进行联动设置。最后在数据传值设置功能中设置联动属性即参数传值,数据表存储的是代码,所以真实值为代码,显示值为中文类别名称,因此图形当联动筛选源联动其他报表时是用此图形的人员类别当作其他数据集的筛选条件,所以将作用域绑定卫生工作人员参数。

6、参数下拉框控件设置

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第12张图片

二、图形联动隐藏未选中类别

1、展示效果

​ 如下图所示:实现的效果是:打开报表页面默认显示所有人员类别,且下方趋势图也是显示所有类别的趋势走向。点击联动下方趋势图时,在趋势图中将没有选中的类别隐藏,只显示所选中的类别。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第13张图片

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第14张图片

2、难点

​ 因联动的效果一般是将没有选中的类别数据变为0,这就导致其他类别为0的趋势图与X轴重合,从而导致X轴呈现不同的颜色。因此需要对生成趋势图的数据集等等进行设置。

3、原生SQL数据集的创建

​ 人员月度增量趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为月度增量趋势图,因点击卫生人员类别构成的图形可以联动页面中的此趋势图,且趋势图将没有选中的类别隐藏,所以需要在最外层嵌套一个case when判断语句,将没有选中的的类别趋势图隐藏。

select 
月份,  
case when 卫生技术人员增量= 0 then null else 卫生技术人员增量 end 卫生技术人员增量, 
case when 其他技术人员增量= 0 then null else 其他技术人员增量 end 其他技术人员增量,  
case when 管理人员增量= 0 then null else 管理人员增量 end 管理人员增量,  
case when 工勤技术人员增量= 0 then null else 工勤技术人员增量 end 工勤技术人员增量 
from (

SELECT  
CASE WHEN SUBSTRING(日期,6,1)='0' THEN RIGHT(日期,1) ELSE RIGHT(日期,2) END 月份,
SUM(E.卫生技术人员1)    卫生技术人员1,
SUM(E.卫生技术人员3)    卫生技术人员3,
IFNULL(SUM(E.卫生技术人员1),0) - IFNULL(SUM(E.卫生技术人员3),0) 卫生技术人员增量,
SUM(E.其他技术人员1)    其他技术人员1,
SUM(E.其他技术人员3)    其他技术人员3,
IFNULL(SUM(E.其他技术人员1),0) - IFNULL(SUM(E.其他技术人员3),0) 其他技术人员增量,
SUM(E.管理人员1)    管理人员1,
SUM(E.管理人员3)    管理人员3,
IFNULL(SUM(E.管理人员1),0) - IFNULL(SUM(E.管理人员3),0) 管理人员增量,
SUM(E.工勤技术人员1)    工勤技术人员1,
SUM(E.工勤技术人员3)    工勤技术人员3,
IFNULL(SUM(E.工勤技术人员1),0) - IFNULL(SUM(E.工勤技术人员3),0) 工勤技术人员增量

FROM

(SELECT   
C.*, 
D.卫生技术人员2    卫生技术人员3,
D.其他技术人员2    其他技术人员3,
D.管理人员2    管理人员3,
D.工勤技术人员2    工勤技术人员3
FROM
(SELECT 
a.YWSCSJ  日期,
COUNT(CASE WHEN a.LB <= '69'  THEN 1  END)  '卫生技术人员1',
COUNT(CASE WHEN a.LB = '70'  THEN 2  END)  '其他技术人员1',
COUNT(CASE WHEN a.LB = '80'  THEN 3  END)  '管理人员1',
COUNT(CASE WHEN a.LB = '90'  THEN 4  END)  '工勤技术人员1'
FROM MD_WORKERS a,tb_org b 
WHERE  a.YLJGDM=b.code   and  
CASE WHEN  '100' ='11'  THEN  a.LB <= '69' 
WHEN '100' ='70'    THEN  a.LB = '70'
WHEN '100' ='80'    THEN  a.LB = '80'
WHEN  '100' ='90'    THEN  a.LB = '90'
ELSE 1=1  END  AND  
{[a.type   =  ^P_PARAM.ucismodelsjk.卫生技术人员单位^  ]}      and 
{[a.CSRQ   =  ^P_PARAM.ucismodelsjk.卫生人员年龄^     ]}      and  
{[a.ZCDM   =   ^P_PARAM.ucismodelsjk.卫生人员职称^    ]}      and  
{[a.WHCD   =   ^P_PARAM.ucismodelsjk.卫生人员学历^    ]}      and  
{[a.XBBM   =    ^P_PARAM.ucismodelsjk.卫生人员性别^   ]}      and   
{[ b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^   )]}      
AND LEFT(a.YWSCSJ,4)+ '年' =  '^P_PARAM.ucismodelsjk.统计时间^' 
GROUP BY  a.YWSCSJ
)C

LEFT JOIN

( SELECT
LEFT(DATE_ADD(STR_TO_DATE(CONCAT(a.YWSCSJ,'-01'),'%Y-%m-%d'),INTERVAL 1 MONTH),7)  日期,
COUNT(CASE WHEN a.LB <= '69'  THEN 1  END)  '卫生技术人员2',
COUNT(CASE WHEN a.LB = '70'  THEN 2  END)  '其他技术人员2',
COUNT(CASE WHEN a.LB = '80'  THEN 3  END)  '管理人员2',
COUNT(CASE WHEN a.LB = '90'  THEN 4  END)  '工勤技术人员2'
FROM MD_WORKERS a,tb_org b
WHERE  a.YLJGDM=b.code and   
CASE WHEN  '100' ='11'  THEN  a.LB <= '69' 
WHEN '100' ='70'    THEN  a.LB = '70'
WHEN '100' ='80'    THEN  a.LB = '80'
WHEN  '100' ='90'    THEN  a.LB = '90'
ELSE 1=1  END  AND  
{[  a.type   =  ^P_PARAM.ucismodelsjk.卫生技术人员单位^ ]}       and 
{[  a.CSRQ   =  ^P_PARAM.ucismodelsjk.卫生人员年龄^    ]}     and  
{[  a.ZCDM   =   ^P_PARAM.ucismodelsjk.卫生人员职称^   ]}      and  
{[  a.WHCD   =   ^P_PARAM.ucismodelsjk.卫生人员学历^   ]}       and  
{[  a.XBBM   =    ^P_PARAM.ucismodelsjk.卫生人员性别^  ]}        and   
{[  b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^  )  ]}    
AND LEFT(a.YWSCSJ,4)+ '年' =  '^P_PARAM.ucismodelsjk.统计时间^' 
GROUP BY  LEFT(DATE_ADD(STR_TO_DATE(CONCAT(a.YWSCSJ,'-01'),'%Y-%m-%d'),INTERVAL 1 MONTH),7)
) D
ON   C.日期  =  D.日期   
)E
GROUP BY   日期)tt

​ 人员年度增量趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为年度增量趋势图,跟月度增量趋势图一样需要在最外层嵌套一个case when判断语句,将没有选中的的类别趋势图隐藏。

select 
年份,  
case when 卫生技术人员增量= 0 then null else 卫生技术人员增量 end 卫生技术人员增量, 
case when 其他技术人员增量= 0 then null else 其他技术人员增量 end 其他技术人员增量,  
case when 管理人员增量= 0 then null else 管理人员增量 end 管理人员增量,  
case when 工勤技术人员增量= 0 then null else 工勤技术人员增量 end 工勤技术人员增量 
from (

SELECT  
E.年份,
SUM(E.卫生技术人员1)    卫生技术人员1,
SUM(E.卫生技术人员3)    卫生技术人员3,
IFNULL(SUM(E.卫生技术人员1),0) - IFNULL(SUM(E.卫生技术人员3),0) 卫生技术人员增量,
SUM(E.其他技术人员1)    其他技术人员1,
SUM(E.其他技术人员3)    其他技术人员3,
IFNULL(SUM(E.其他技术人员1),0) - IFNULL(SUM(E.其他技术人员3),0) 其他技术人员增量,
SUM(E.管理人员1)    管理人员1,
SUM(E.管理人员3)    管理人员3,
IFNULL(SUM(E.管理人员1),0) - IFNULL(SUM(E.管理人员3),0) 管理人员增量,
SUM(E.工勤技术人员1)    工勤技术人员1,
SUM(E.工勤技术人员3)    工勤技术人员3,
IFNULL(SUM(E.工勤技术人员1),0) - IFNULL(SUM(E.工勤技术人员3),0) 工勤技术人员增量

from

(SELECT   
C.*, 
D.卫生技术人员2    卫生技术人员3,
D.其他技术人员2    其他技术人员3,
D.管理人员2    管理人员3,
D.工勤技术人员2    工勤技术人员3
FROM
(select 
DATE_FORMAT(str_to_date(concat(replace(a.YWSCSJ,'-',''),'01'),'%Y%m%d'), "%Y")  年份,
COUNT(CASE WHEN a.LB <= '69'  THEN 1  END)  '卫生技术人员1',
COUNT(CASE WHEN a.LB = '70'  THEN 2  END)  '其他技术人员1',
COUNT(CASE WHEN a.LB = '80'  THEN 3  END)  '管理人员1',
COUNT(CASE WHEN a.LB = '90'  THEN 4  END)  '工勤技术人员1'
from MD_WORKERS a,tb_org b
where  a.YLJGDM=b.code  and  
CASE WHEN  '100' ='11'  THEN  a.LB <= '69' 
WHEN '100' ='70'    THEN  a.LB = '70'
WHEN '100' ='80'    THEN  a.LB = '80'
WHEN  '100' ='90'    THEN  a.LB = '90'
ELSE 1=1  END  AND  
{[  a.type   =  ^P_PARAM.ucismodelsjk.卫生技术人员单位^  ]}    and  
{[  a.CSRQ   =  ^P_PARAM.ucismodelsjk.卫生人员年龄^     ]}    and  
{[  a.ZCDM   =   ^P_PARAM.ucismodelsjk.卫生人员职称^    ]}    and  
{[  a.WHCD   =   ^P_PARAM.ucismodelsjk.卫生人员学历^    ]}    and  
{[  a.XBBM   =    ^P_PARAM.ucismodelsjk.卫生人员性别^   ]}    and   
{[  b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^   )  ]}   
group by  DATE_FORMAT(str_to_date(concat(replace(a.YWSCSJ,'-',''),'01'),'%Y%m%d'), "%Y")
)C

LEFT JOIN

( SELECT
DATE_FORMAT(DATE_ADD(DATE_FORMAT(str_to_date(concat(replace(a.YWSCSJ,'-',''),'01'),'%Y%m%d'),'%Y-%m-%d'),INTERVAL 1 YEAR), "%Y")  年份,
COUNT(CASE WHEN a.LB <= '69'  THEN 1  END)  '卫生技术人员2',
COUNT(CASE WHEN a.LB = '70'  THEN 2  END)  '其他技术人员2',
COUNT(CASE WHEN a.LB = '80'  THEN 3  END)  '管理人员2',
COUNT(CASE WHEN a.LB = '90'  THEN 4  END)  '工勤技术人员2'
from MD_WORKERS a,tb_org b  
where  a.YLJGDM=b.code  and   
CASE WHEN  '100' ='11'  THEN  a.LB <= '69' 
WHEN '100' ='70'    THEN  a.LB = '70'
WHEN '100' ='80'    THEN  a.LB = '80'
WHEN  '100' ='90'    THEN  a.LB = '90'
ELSE 1=1  END  AND   
{[  a.type   =  ^P_PARAM.ucismodelsjk.卫生技术人员单位^ ]}     and  
{[  a.CSRQ   =  ^P_PARAM.ucismodelsjk.卫生人员年龄^    ]}     and  
{[  a.ZCDM   =   ^P_PARAM.ucismodelsjk.卫生人员职称^   ]}     and  
{[  a.WHCD   =   ^P_PARAM.ucismodelsjk.卫生人员学历^   ]}     and  
{[  a.XBBM   =    ^P_PARAM.ucismodelsjk.卫生人员性别^  ]}     and  
{[  b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^  )  ]}   
group by  DATE_FORMAT(DATE_ADD(DATE_FORMAT(str_to_date(concat(replace(a.YWSCSJ,'-',''),'01'),'%Y%m%d'),'%Y-%m-%d'),INTERVAL 1 YEAR), "%Y")
) D
ON C.年份 =  D.年份 
)E
WHERE 
E.年份 + '年'  >=  ( '^P_PARAM.ucismodelsjk.统计时间^' -5 )  and
E.年份 + '年'<=  '^P_PARAM.ucismodelsjk.统计时间^' 
group by   E.年份)tt

​ 人员月度趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为月度趋势图,跟月度增量趋势图一样需要在最外层嵌套一个case when判断语句,将没有选中的的类别趋势图隐藏。

select 年份,
 月份,  
case when 卫生技术人员= 0 then null else 卫生技术人员 end 卫生技术人员,  
case when 其他技术人员= 0 then null else 其他技术人员 end 其他技术人员,  
case when 管理人员= 0 then null else 管理人员 end 管理人员,  
case when 工勤技术人员= 0 then null else 工勤技术人员 end 工勤技术人员 
from (
select 
SUBSTRING_INDEX(a.YWSCSJ,'-',1)  年份,
SUBSTRING_INDEX(a.YWSCSJ,'-',-1)  月份,
COUNT(CASE WHEN a.LB <= '69'  THEN 1  END)  '卫生技术人员',
COUNT(CASE WHEN a.LB = '70'  THEN 2  END)  '其他技术人员',
COUNT(CASE WHEN a.LB = '80'  THEN 3  END)  '管理人员',
COUNT(CASE WHEN a.LB = '90'  THEN 4  END)  '工勤技术人员'
from MD_WORKERS a,tb_org b
where  a.YLJGDM=b.code and 
CASE WHEN  '100' ='11'  THEN  a.LB <= '69' 
WHEN '100' ='70'    THEN  a.LB = '70'
WHEN '100' ='80'    THEN  a.LB = '80'
WHEN  '100' ='90'    THEN  a.LB = '90'
ELSE 1=1  END  AND  
{[  a.type  =  ^P_PARAM.ucismodelsjk.卫生技术人员单位^  ]}    and  
{[  a.CSRQ   =  ^P_PARAM.ucismodelsjk.卫生人员年龄^     ]}    and  
{[  a.ZCDM   =   ^P_PARAM.ucismodelsjk.卫生人员职称^    ]}    and  
{[  a.WHCD   =   ^P_PARAM.ucismodelsjk.卫生人员学历^    ]}    and  
{[  a.XBBM   =    ^P_PARAM.ucismodelsjk.卫生人员性别^   ]}    and 
{[  b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^  )   ]}    and 
SUBSTRING_INDEX(a.YWSCSJ,'-',1)+'年'  =  '^P_PARAM.ucismodelsjk.统计时间^'
group by   SUBSTRING_INDEX(a.YWSCSJ,'-',1),SUBSTRING_INDEX(a.YWSCSJ,'-',-1)) tt
#12个月表达方式
SELECT '01' AS '月度', '1月'  AS  '月份', '1' AS '月'  UNION
SELECT '02' AS '月度', '2月'  AS  '月份', '2' AS '月'  UNION       
SELECT '03' AS '月度', '3月'  AS  '月份', '3' AS '月'  UNION    
SELECT '04' AS '月度', '4月'  AS  '月份', '4' AS '月'  UNION     
SELECT '05' AS '月度', '5月'  AS  '月份', '5' AS '月'  UNION      
SELECT '06' AS '月度', '6月'  AS  '月份', '6' AS '月'  UNION       
SELECT '07' AS '月度', '7月'  AS  '月份', '7' AS '月'  UNION      
SELECT '08' AS '月度', '8月'  AS  '月份', '8' AS '月'  UNION      
SELECT '09' AS '月度', '9月'  AS  '月份', '9' AS '月'  UNION      
SELECT '10' AS '月度', '10月'  AS  '月份', '10' AS '月'  UNION      
SELECT '11' AS '月度', '11月'  AS  '月份', '11' AS '月'  UNION     
SELECT '12' AS '月度', '12月'  AS  '月份', '12' AS '月'
4、Excel里创建Echarts图表

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第15张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第16张图片

​ 因由月度增量趋势数据集生成的月份字段可能只有前面几个月有数据,因此借助一个12个月份数据集的月度字段为X轴生成趋势图,并进行过滤。而且趋势图中将年度趋势和月度趋势放在了同一个sheet页中,因年份和月份,月度向下扩展属性不同,因此需要将两个做图形报表的内容分开为两个不同区域,让他们互不干涉影响。

三、添加查询刷新按钮

1、展示效果

​ 如下图所示:实现的效果是:报表页面的顶端参数切换时,手动点击查询按钮实现全表刷新,而联动参数切换是通过点击图形来实现,相当于点击事件,实现报表页面局部刷新而不是全表整页刷新。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第17张图片

2、难点

​ 同一个报表即含有整页刷新又含有局部刷新,而且在顶端参数的右端添加一个手动刷新的查询按钮,因此需要借助报表宏进行设置。

3、Excel里设置参数排版

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第18张图片

4、查询按钮及局部刷新按钮宏代码(JS)的创建

​ 名称为:添加查询按钮,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport

function main(spreadsheetReport) {
    // debugger;
    // 获取电子表格参数面板
    var lastCell = spreadsheetReport.paramPanelObj;
    var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
    var i, cell, lastCell;
    // ============在参数同一行添加按钮
    for (i = 0; i < paramTable.rows.length; i++) {
        cell = paramTable.rows[i].insertCell(-1);
        if (i == paramTable.rows.length - 7)
    //EXCEL参数排版中不显示的参数有6个,所以-7
            lastCell = cell;
    }
   
    if (!spreadsheetReport._newBtn) { // 不重复添加按钮
        var input = document.createElement("INPUT");
        input.type = "button";
        // input.className = "button-buttonbar button-bgicon-save";
        input.value = "查询";
        input.title = "查询";
        // input.accessKey = "N";
        input.style.width = "100";
        input.style.height = "20";
        var newBtn = lastCell.appendChild(input);
        spreadsheetReport.addListener(input, "click", doNewButtonClick,
            spreadsheetReport);
        spreadsheetReport._newBtn = newBtn;
    }
    // debugger;
    // 新添加按钮Click事件处理函数
    function doNewButtonClick(e) {
        spreadsheetReport.doRefresh();
        // alert("TODO:Click事件处理函数。");
        spreadsheetReport.doRefresh(true); // 刷新报表
    }
}

​ 名称为:卫生工作人员改变触发,类型为:客户端宏,对象为:spreadsheetReport,事件为:onParamValueChanged

function main(spreadsheetReport, param) {
   if (param.name!="卫生工作人员参数") return;
    var value = param.value;
    //spreadsheetReport.doRefresh();
    // alert("TODO:Click事件处理函数。");
    //spreadsheetReport.doRefresh(true);// 刷新报表
    //alert(value);
    spreadsheetReport.doAjaxRefresh();
}

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第19张图片

四、不同时间维度切换及表格轮播图显示报表

1、展示效果

​ 情况一:医疗机构床位,如下图所示:实现的效果是:打开报表页面默认显示年度,报表数据全部按时间维度年进行统计,但可以切换时间维度为季度或者月度,切换月度,向前推12个月,切换季度,向前推4个季度。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第20张图片

​ 情况二:门诊综合情况,如下图所示:实现的效果是:打开报表页面默认显示月度,报表数据全部按时间维度月进行统计,但可以切换时间维度为季度或者年度或者自定义,切换月度,向前推12个月,切换季度,向前推4个季度,切换年度,向前推5年。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第21张图片

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第22张图片

​ 情况三:签约情况与死因构成,如下图所示:实现的效果是:打开报表页面默认显示月度,报表数据全部按时间维度月进行统计,但可以切换时间维度为季度或者年度或者自定义,切换月度,向前推12个月,切换季度,向前推4个季度,切换年度,向前推5年,而且重点人群概览和死因详情含有表格轮播图,表格可以自由轮播,鼠标移到到任意行即停止轮播,且序号随筛选条件重新排列。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第23张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第24张图片

2、难点

​ 卡片中的统计数据与图形中的数据及趋势图数据均可随着统计时间参数的切换而随之变化,因此需要建立年份,季度,月份及查询时间,统计时间五个参数,以便用切换参数时通过传参的方法实现时间维度的切换。因此需要对生成趋势图的数据集等等进行设置。

3、参数的创建

​ 医疗机构床位报表顶端查询时间参数的设置,因顶端查询时间的切换只包含年度,季度,月度,且默认显示年度,所以在备选值区域将三种依次列出,并在默认值区域将年度设置为默认。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第25张图片

​ 门诊综合情况报表顶端统计时间参数的设置,因顶端查询时间的切换只包含年度,季度,月度,且默认显示月度,所以在备选值区域将三种依次列出,并在默认值区域将月度设置为默认。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第26张图片

​ 医疗机构床位报表和门诊综合情况报表年份参数:备选值区域设置需要切换的5个不同年份时间维度,从今年向前推5年,将这5年依次列出,并在默认区设置打开报表时默认显示为今年。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第27张图片

​ 医疗机构床位报表和门诊综合情况报表季度参数:备选值区域设置需要切换的4个不同季度时间维度,将这4个季度依次列出,并在默认区设置打开报表时默认显示为本季度。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QI0Ab2wZ-1624528446198)(D:\资料\21-04工作资料\smartbi学习\图形\1622008200(1)].png)
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第28张图片

​ 医疗机构床位报表和门诊综合情况报表月份参数:备选值区域设置需要切换的12个不同月份时间维度,将这12个月份依次列出,并在默认区设置打开报表时默认显示为本月份。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第29张图片

​ 门诊综合情况报表开始时间参数:提取当前年的1月1日为开始时间,注意:此处开始时间参数的控件类型为:日期控件。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第30张图片

​ 门诊综合情况报表结束时间参数:提取当前年的当前时间为结束时间,注意:此处结束时间参数的控件类型为:日期控件。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第31张图片

4、原生SQL数据集的创建

​ 医疗机构床位报表的床位趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为床位趋势图,因统计时间按年度,季度,月度切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的当月)。

SELECT
COUNT(c.编制床位数)  '编制床位数',
COUNT(c.超过半年的加床位数)  '超过半年的加床位数',
COUNT(c.临时加床位数)  '临时加床位数',
COUNT(c.实有床位数)  '实有床位数',
CASE  WHEN '^P_PARAM.ucismodelsjk.查询时间^'    ='2'  THEN c.年
WHEN '^P_PARAM.ucismodelsjk.查询时间^'   ='1'  THEN CONCAT(c.年,c.出院月份)
WHEN '^P_PARAM.ucismodelsjk.查询时间^'   ='3'  THEN  CONCAT(c.年,c.季度) ELSE c.年  END  当月

 FROM 
(select 
DATE_FORMAT(a.YWSCSJ, "%Y-%m-%d")  日期1,
DATE_FORMAT(a.YWSCSJ, "%Y")  年,
DATE_FORMAT(a.YWSCSJ, "%m")   出院月份,
case when DATE_FORMAT(a.YWSCSJ, "%m") between '01' and '03' then '第1季度' 
     when DATE_FORMAT(a.YWSCSJ, "%m") between '04' and '06' then '第2季度'
     when DATE_FORMAT(a.YWSCSJ, "%m") between '07' and '09' then '第3季度'
     else  '第4季度'  end 季度,
CASE WHEN a.CWLX = '1' THEN 1 ELSE 0 END  '编制床位数',
CASE WHEN a.CWLX= '2' THEN 1  ELSE 0 END  '超过半年的加床位数',
CASE WHEN a.CWLX = '3' THEN 1 ELSE 0 END  '临时加床位数',
CASE WHEN a.CWLX  between 1  and  2 THEN 1 ELSE 0 END  '实有床位数'
 from tb_dict_bed a WHERE  {[ a.YLJGDM in (^P_PARAM.testbzk.住院机构^)]} ) c
 
WHERE CASE  WHEN  '^P_PARAM.ucismodelsjk.查询时间^'   ='2'  THEN (c.年 >='^P_PARAM.ucismodelsjk.年份^'-4 AND c.年<='^P_PARAM.ucismodelsjk.年份^')

WHEN   '^P_PARAM.ucismodelsjk.查询时间^' ='1'  THEN (c.日期1 >=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-','^P_PARAM.ucismodelsjk.月份^','-01'),INTERVAL -11 MONTH) AND c.日期1=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-',CASE WHEN '^P_PARAM.ucismodelsjk.季度^'='第1季度' THEN '01' WHEN '^P_PARAM.ucismodelsjk.季度^'='第2季度' THEN '04' WHEN '^P_PARAM.ucismodelsjk.季度^'='第3季度' THEN '07' ELSE '10' END,'-01'),INTERVAL -3 QUARTER) AND c.日期1

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第32张图片

​ 医疗机构床位报表的床位周转次数数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的床位周转次数卡片汇总数据,因统计时间按年度,季度,月度切换时,整个报表页面内容会跟着切换,而且床位周转次数的计算公式中平均开发病床数与出院人次的统计路径完全来自不同的数据表,所以需要借助case when判断语句,对时间维度的选取进行判断的同时,需要UNION ALL方面将从不同数据表抽取的数据整合SQL子句,再进行计算。

SELECT 
SUM(CASE WHEN lx='1' THEN 床位类别 ELSE 0 END)  '平均开放病床数',
SUM(CASE WHEN lx='2' THEN 床位类别 ELSE 0 END)   '出院人次',
ROUND(CASE WHEN (SUM(CASE WHEN lx='1' THEN 床位类别 ELSE 0 END)) =0 THEN 0 ELSE SUM(CASE WHEN lx='2' THEN 床位类别 ELSE 0 END)/SUM(CASE WHEN lx='1' THEN 床位类别 ELSE 0 END) END,2) 病床周转次数

FROM
(SELECT
'1'  lx,
DATE_FORMAT(YWSCSJ, "%Y")  年,
DATE_FORMAT(YWSCSJ, "%m")   出院月份,
case when DATE_FORMAT(YWSCSJ, "%m") between '01' and '03' then '第1季度' 
        when DATE_FORMAT(YWSCSJ, "%m") between '04' and '06' then '第2季度'
        when DATE_FORMAT(YWSCSJ, "%m") between '07' and '09' then '第3季度'
        else  '第4季度'  end 季度,
DATE_FORMAT(YWSCSJ, "%Y-%m-%d")  日,
DATE_FORMAT(YWSCSJ, "%Y-%m")  当月,
CASE WHEN CWLX between 1  and  2 THEN 1 ELSE 0 END  '床位类别'
from tb_dict_bed  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]}  

UNION ALL

SELECT  
'2'  lx,
DIM_IN_CYSJ_Y  年,
SUBSTRING(DIM_IN_CYSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_IN_CYSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_IN_CYSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_IN_CYSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_IN_CYSJ_D   日,
DIM_IN_CYSJ_M   当月,
IND_IN_DISCHARGES   '床位类别'
from MD_IN_DISCHARGES  where  {[DIM_YLJGDM  in (^P_PARAM.testbzk.住院机构^)]} ) a
where 
case  when '^P_PARAM.ucismodelsjk.查询时间^'  ='1'  then a.年 in ('^P_PARAM.ucismodelsjk.年份^') and a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')
when '^P_PARAM.ucismodelsjk.查询时间^'  ='2'  then a.年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.查询时间^'  ='3'  then a.年 in ('^P_PARAM.ucismodelsjk.年份^') and a.季度 in ('^P_PARAM.ucismodelsjk.季度^') else 1=1  end

​ 医疗机构床位报表的床位比汇总数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的床位周转次数卡片汇总数据,因医师床位比和护士床位比均采用如(52 : 103)的方式,而且床位和人次完全来自不同的数据表,所以需要UNION ALL方面将从不同数据表抽取的数据整合SQL子句,再借助CONCAT()函数进行拼接计算。

SELECT 
P.*,
CONCAT(P.执业助理医师,' : ',P.实有床位数)   医师床位比(52 : 103),
CONCAT(P.注册护士,' : ',P.实有床位数)   护士床位比(32 : 103)
FROM
(SELECT 
SUM(CASE WHEN lx='1' THEN 实有床位数 ELSE 0 END)  '实有床位数',
SUM(CASE WHEN lx='2' THEN 实有床位数 ELSE 0 END)   '执业助理医师',
SUM(CASE WHEN lx='3' THEN 实有床位数 ELSE 0 END)   '注册护士'
FROM
(SELECT
'1'  lx,
DATE_FORMAT(YWSCSJ, "%Y")  年,
DATE_FORMAT(YWSCSJ, "%m")   出院月份,
case when DATE_FORMAT(YWSCSJ, "%m") between '01' and '03' then '第1季度' 
        when DATE_FORMAT(YWSCSJ, "%m") between '04' and '06' then '第2季度'
        when DATE_FORMAT(YWSCSJ, "%m") between '07' and '09' then '第3季度'
        else  '第4季度'  end 季度,
CASE WHEN CWLX between 1  and  2 THEN 1 ELSE 0 END  '实有床位数'
from tb_dict_bed  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]}   
UNION ALL
SELECT  
'2'  lx,
SUBSTRING_INDEX(YWSCSJ,'-',1)   年,
SUBSTRING(YWSCSJ,6)   出院月份,
CASE WHEN SUBSTRING(YWSCSJ,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
CASE WHEN LB between 11  and  12 THEN 1 ELSE 0 END  '实有床位数'
from MD_WORKERS  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]}  
UNION ALL
SELECT  
'3'  lx,
SUBSTRING_INDEX(YWSCSJ,'-',1)   年,
SUBSTRING(YWSCSJ,6)   出院月份,
CASE WHEN SUBSTRING(YWSCSJ,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
CASE WHEN LB = 21 THEN 1 ELSE 0 END  '实有床位数'
from MD_WORKERS  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.查询时间^' ='1'  then a.年 in ('^P_PARAM.ucismodelsjk.年份^') and a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^' )
when '^P_PARAM.ucismodelsjk.查询时间^' ='2'  then a.年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.查询时间^' = '3'  then  a.年 in ('^P_PARAM.ucismodelsjk.年份^') and a.季度 in ('^P_PARAM.ucismodelsjk.季度^') else 1=1  end)P

​ 医疗机构床位报表的床位比趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为床位比趋势图,因统计时间按年度,季度,月度切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的当月)。

SELECT 
SUM(CASE WHEN lx='1' THEN 实有床位数 ELSE 0 END)  '实有床位数',
SUM(CASE WHEN lx='2' THEN 实有床位数 ELSE 0 END)   '执业助理医师',
SUM(CASE WHEN lx='3' THEN 实有床位数 ELSE 0 END)   '注册护士',

CASE WHEN SUM(CASE WHEN lx='1' THEN 实有床位数 ELSE 0 END) =0  THEN 0  ELSE
SUM(CASE WHEN lx='2' THEN 实有床位数 ELSE 0 END)*100/SUM(CASE WHEN lx='1' THEN 实有床位数 ELSE 0 END)   END   医师床位比,
CASE WHEN SUM(CASE WHEN lx='1' THEN 实有床位数 ELSE 0 END) =0  THEN 0  ELSE
SUM(CASE WHEN lx='3' THEN 实有床位数 ELSE 0 END)*100/SUM(CASE WHEN lx='1' THEN 实有床位数 ELSE 0 END)  END   护士床位比,

CASE  WHEN '^P_PARAM.ucismodelsjk.查询时间^' ='2'  THEN a.年
WHEN '^P_PARAM.ucismodelsjk.查询时间^' ='1'  THEN CONCAT(a.年,a.出院月份)
WHEN '^P_PARAM.ucismodelsjk.查询时间^' ='3'  THEN  CONCAT(a.年,a.季度) ELSE a.年  END  当月
FROM
(SELECT
'1'  lx,
DATE_FORMAT(YWSCSJ, "%Y")  年,
DATE_FORMAT(YWSCSJ, "%m")   出院月份,
case when DATE_FORMAT(YWSCSJ, "%m") between '01' and '03' then '第1季度' 
        when DATE_FORMAT(YWSCSJ, "%m") between '04' and '06' then '第2季度'
        when DATE_FORMAT(YWSCSJ, "%m") between '07' and '09' then '第3季度'
        else  '第4季度'  end 季度,
DATE_FORMAT(YWSCSJ, "%Y-%m-%d")  日,
CASE WHEN CWLX between 1  and  2 THEN 1 ELSE 0 END  '实有床位数'
from tb_dict_bed  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]}  
UNION ALL
SELECT  
'2'  lx,
SUBSTRING_INDEX(YWSCSJ,'-',1)   年,
SUBSTRING(YWSCSJ,6)   出院月份,
CASE WHEN SUBSTRING(YWSCSJ,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DATE_FORMAT(STR_TO_DATE(CONCAT(REPLACE(YWSCSJ,'-',''),'01'),'%Y%m%d'), "%Y-%m-%d")  日,
CASE WHEN LB between 11  and  12 THEN 1 ELSE 0 END  '实有床位数'
from MD_WORKERS  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]} 
UNION ALL
SELECT  
'3'  lx,
SUBSTRING_INDEX(YWSCSJ,'-',1)   年,
SUBSTRING(YWSCSJ,6)   出院月份,
CASE WHEN SUBSTRING(YWSCSJ,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(YWSCSJ,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DATE_FORMAT(STR_TO_DATE(CONCAT(REPLACE(YWSCSJ,'-',''),'01'),'%Y%m%d'), "%Y-%m-%d")  日,
CASE WHEN LB = 21 THEN 1 ELSE 0 END  '实有床位数'
from MD_WORKERS  where  {[YLJGDM  in (^P_PARAM.testbzk.住院机构^)]} ) a
WHERE CASE  WHEN '^P_PARAM.ucismodelsjk.查询时间^' ='2'  THEN (a.年 >='^P_PARAM.ucismodelsjk.年份^'-4 AND a.年<='^P_PARAM.ucismodelsjk.年份^')
WHEN '^P_PARAM.ucismodelsjk.查询时间^' ='1'  THEN (a.日 >=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-','^P_PARAM.ucismodelsjk.月份^','-01'),INTERVAL -11 MONTH) AND a.日=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-',CASE WHEN '^P_PARAM.ucismodelsjk.季度^'='第1季度' THEN '01' WHEN '^P_PARAM.ucismodelsjk.季度^'='第2季度' THEN '04' WHEN '^P_PARAM.ucismodelsjk.季度^'='第3季度' THEN '07' ELSE '10' END,'-01'),INTERVAL -3 QUARTER) AND a.日

​ 门诊综合报表的中西医诊疗人次趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为中西医诊疗人次对比趋势图,因统计时间按年度,季度,月度,自定义切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的当月),最终输入的字段时西医,中医均为浮点型,当月为字符串型。

select 
SUM(b.西医)  '西医',
SUM(b.中医)  '中医',
CASE  WHEN '^P_PARAM.ucismodelsjk.统计时间^'='2'  THEN 出院时间年
WHEN '^P_PARAM.ucismodelsjk.统计时间^'='1'  THEN CONCAT(出院时间年,出院月份)
WHEN '^P_PARAM.ucismodelsjk.统计时间^'='4'  THEN  
case when date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 31 day)> '^P_PARAM.ucismodelsjk.结束时间^' then  REPLACE(日,'-','')
when  date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 31 day)<= '^P_PARAM.ucismodelsjk.结束时间^'  
and date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 365 day) > '^P_PARAM.ucismodelsjk.结束时间^'  then CONCAT(出院时间年,出院月份)
else  出院时间年 end  
WHEN '^P_PARAM.ucismodelsjk.统计时间^' ='3'  THEN  CONCAT(出院时间年,季度) ELSE 出院时间年  END  当月

 FROM 
(select 
a.出院时间年   出院时间年,
a.出院月份   出院月份,
a.季度   季度,
a.日   日,
a.当月  当月,
SUM(CASE WHEN a.中西医类别= '01' THEN a.门诊总人次 ELSE 0  END)  '西医',
SUM(CASE WHEN a.中西医类别 ='02' THEN a.门诊总人次 ELSE 0  END)  '中医'
from
(select 
DIM_OUT_DATE_Y  出院时间年,
SUBSTRING(DIM_OUT_DATE_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_OUT_DATE_D  日,
right(DIM_OUT_DATE_M,2)  当月,
IND_OUT_VISITS_ALL  '门诊总人次',
DIM_BMLX        '中西医类别'
from MD_OUT_VISITS_TEST  WHERE  {[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
group by a.出院时间年,a.出院月份,a.季度,a.日,a.当月)b

WHERE CASE  WHEN '^P_PARAM.ucismodelsjk.统计时间^'='2'  THEN (出院时间年>='^P_PARAM.ucismodelsjk.年份^'-4 AND 出院时间年<='^P_PARAM.ucismodelsjk.年份^')
WHEN '^P_PARAM.ucismodelsjk.统计时间^'='1'  THEN (日 >=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-','^P_PARAM.ucismodelsjk.月份^','-01'),INTERVAL -11 MONTH) AND 日= '^P_PARAM.ucismodelsjk.开始时间^' AND b.日<= '^P_PARAM.ucismodelsjk.结束时间^')
WHEN '^P_PARAM.ucismodelsjk.统计时间^'='3'  THEN (日>=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-',CASE WHEN '^P_PARAM.ucismodelsjk.季度^'='第1季度' THEN '01' WHEN '^P_PARAM.ucismodelsjk.季度^'='第2季度' THEN '04' WHEN '^P_PARAM.ucismodelsjk.季度^'='第3季度' THEN '07' ELSE '10' END,'-01'),INTERVAL -3 QUARTER) AND 日 '^P_PARAM.ucismodelsjk.结束时间^' then  REPLACE(日,'-','')
when  date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 31 day)<= '^P_PARAM.ucismodelsjk.结束时间^'  
and date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 365 day) > '^P_PARAM.ucismodelsjk.结束时间^'  then CONCAT(出院时间年,出院月份)
else  出院时间年 end  
WHEN '^P_PARAM.ucismodelsjk.统计时间^' ='3'  THEN  CONCAT(出院时间年,季度) ELSE 出院时间年  END 
ORDER BY 
CASE  WHEN '^P_PARAM.ucismodelsjk.统计时间^'='2'  THEN 出院时间年
WHEN '^P_PARAM.ucismodelsjk.统计时间^'='1'  THEN CONCAT(出院时间年,出院月份)
WHEN '^P_PARAM.ucismodelsjk.统计时间^'='4'  THEN  
case when date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 31 day)> '^P_PARAM.ucismodelsjk.结束时间^' then  REPLACE(日,'-','')
when  date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 31 day)<= '^P_PARAM.ucismodelsjk.结束时间^'  
and date_add('^P_PARAM.ucismodelsjk.开始时间^', interval 365 day) > '^P_PARAM.ucismodelsjk.结束时间^'  then CONCAT(出院时间年,出院月份)
else  出院时间年 end  
WHEN '^P_PARAM.ucismodelsjk.统计时间^' ='3'  THEN  CONCAT(出院时间年,季度) ELSE 出院时间年  END 

​ 门诊综合报表的健康检查人次汇总及同环比数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成卡片医院健康检查人次中的三个数据,因统计时间按年度,季度,月度,自定义切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断。最终输出的字段为健康检查人次现为浮点型,健康检查人次同比和健康检查人次环比均为浮点型。

SELECT 
SUM(健康检查人次1)   健康检查人次现,
CASE WHEN '^P_PARAM.ucismodelsjk.统计时间^'='4' OR IFNULL(SUM(健康检查人次1),0)=0 THEN '-' 

when '^P_PARAM.ucismodelsjk.统计时间^'='2'  THEN (CASE WHEN IFNULL(SUM(健康检查人次3),0)=0 THEN '-' ELSE CONCAT(ROUND((SUM(健康检查人次1)-SUM(健康检查人次3))*100/SUM(健康检查人次3),2),'%')END) 

WHEN '^P_PARAM.ucismodelsjk.统计时间^'='3'  THEN (CASE WHEN IFNULL(SUM(健康检查人次4),0)=0 THEN '-' ELSE CONCAT(ROUND((SUM(健康检查人次1)-SUM(健康检查人次4))*100/SUM(健康检查人次4),2),'%')END)  ELSE (case when IFNULL(SUM(健康检查人次2),0)=0 then '-' else CONCAT(ROUND((sum(健康检查人次1)-sum(健康检查人次2))*100/sum(健康检查人次2),2),'%')end)  END   健康检查人次环比,

CASE WHEN '^P_PARAM.ucismodelsjk.统计时间^' in('4','2')  THEN '-' ELSE (case when IFNULL(SUM(健康检查人次3),0)=0 then '-' else CONCAT(ROUND((sum(健康检查人次1)-sum(健康检查人次3))*100/sum(健康检查人次3),2),'%')end) END   健康检查人次同比 

FROM 
(SELECT 
SUM(a.健康检查人次)   健康检查人次1,
a.当月    当月
FROM 
(select 
DIM_CHECKUP_DATE_Y  出院时间年,
SUBSTRING(DIM_CHECKUP_DATE_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_CHECKUP_DATE_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_CHECKUP_DATE_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_CHECKUP_DATE_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_CHECKUP_DATE_D   日,
DIM_CHECKUP_DATE_M  当月,
IND_CHECKUPS    '健康检查人次'
from MD_CHECKUPS_TEST  WHERE  {[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY a.当月) n 

LEFT JOIN 
(SELECT 
SUM(b.健康检查人次)   健康检查人次2,
b.对比月    对比月1
FROM 
(SELECT 
DIM_CHECKUP_DATE_Y  出院时间年,
SUBSTRING(DIM_CHECKUP_DATE_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_CHECKUP_DATE_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_CHECKUP_DATE_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_CHECKUP_DATE_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_CHECKUP_DATE_D   日,
LEFT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(DIM_CHECKUP_DATE_D,'%Y-%m-%d'),'%Y-%m-%d'),INTERVAL 1 MONTH),7)  对比月,
IND_CHECKUPS    '健康检查人次'
from MD_CHECKUPS_TEST  WHERE  {[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) b   
WHERE      (b.日 >=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-','^P_PARAM.ucismodelsjk.月份^','-01'),INTERVAL -1 MONTH) AND 日=CONCAT('^P_PARAM.ucismodelsjk.年份^','-',CASE WHEN '^P_PARAM.ucismodelsjk.季度^'='第1季度' THEN '01' WHEN '^P_PARAM.ucismodelsjk.季度^'='第2季度' THEN '04' WHEN '^P_PARAM.ucismodelsjk.季度^'='第3季度' THEN '07' ELSE '10' END,'-01') 
AND d.日

​ 签约情况报表的人群概览数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成重点人群概览表格,因统计时间按年度,季度,月度,自定义切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断。最终输出的字段为人数为整型,类别为浮点型。

SELECT 
b.类别       类别,
SUM(b.人数)  人数

FROM (SELECT 
CASE WHEN a.人员类别=1  THEN '高血压患者签约数' 
          WHEN a.人员类别=2  THEN '2型糖尿病患者签约数' 
          WHEN a.人员类别=3  THEN '0-6岁儿童签约数' 
          WHEN a.人员类别=6  THEN '65岁及以上老人签约数' 
          WHEN a.人员类别=7  THEN '孕产妇签约数' 
          WHEN a.人员类别=8  THEN '肺结核尿病患者签约数'
          WHEN a.人员类别=9  THEN '严重精神障碍患者签约数' 
          WHEN a.人员类别=10  THEN '残疾人签约数' 
          WHEN a.人员类别=11  THEN '计划生育特殊家庭签约数' 
          WHEN a.人员类别=12  THEN '纳入计划生育家庭特别扶助制度的独生子女伤残或死亡家庭的夫妻签约数' 
          WHEN a.人员类别=13  THEN '城乡低保五保签约数' 
          ELSE '计划生育特殊家庭自愿签约数'   END 类别,
CASE WHEN a.人员类别=1  THEN SUM(a.签约人数)    
          WHEN a.人员类别=2  THEN SUM(a.签约人数)   
          WHEN a.人员类别=3  THEN SUM(a.签约人数)   
          WHEN a.人员类别=6  THEN SUM(a.签约人数)   
          WHEN a.人员类别=7  THEN SUM(a.签约人数)   
          WHEN a.人员类别=8  THEN SUM(a.签约人数)   
          WHEN a.人员类别=9  THEN SUM(a.签约人数)  
          WHEN a.人员类别=10  THEN SUM(a.签约人数)  
          WHEN a.人员类别=11  THEN SUM(a.签约人数)   
          WHEN a.人员类别=12  THEN SUM(a.签约人数)   
          WHEN a.人员类别=13  THEN SUM(a.签约人数)  
          WHEN a.人员类别=14  THEN SUM(a.签约人数)   
          ELSE 0  END    人数
FROM 
(SELECT 
DIM_QYSJ_Y  出院时间年,
SUBSTRING(DIM_QYSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_QYSJ_D   日,
DIM_QYSJ_M   当月,
QYQK_QYRS   '签约人数',
QYQK_RYLB   人员类别
from MD_ZDRQQYQK_TEST  WHERE  {[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY a.人员类别

UNION ALL

SELECT 
CASE WHEN a.人员类别=1  THEN '高血压患者总数' 
          WHEN a.人员类别=2  THEN '2型糖尿病患者总数' 
          WHEN a.人员类别=3  THEN '0-6岁儿童总数' 
          WHEN a.人员类别=6  THEN '65岁及以上老人总数' 
          WHEN a.人员类别=7  THEN '孕产妇总数' 
          WHEN a.人员类别=8  THEN '肺结核尿病患者总数'
          WHEN a.人员类别=9  THEN '严重精神障碍患者总数' 
          WHEN a.人员类别=10  THEN '残疾人总数' 
          WHEN a.人员类别=11  THEN '计划生育特殊家庭总数' 
          WHEN a.人员类别=12  THEN '纳入计划生育家庭特别扶助制度的独生子女伤残或死亡家庭的夫妻总数' 
          WHEN a.人员类别=13  THEN '城乡低保五保总数' 
          ELSE '计划生育特殊家庭自愿总数'   END 类别,

CASE WHEN a.人员类别=1  THEN SUM(a.总人数)    
          WHEN a.人员类别=2  THEN SUM(a.总人数)   
          WHEN a.人员类别=3  THEN SUM(a.总人数)   
          WHEN a.人员类别=6  THEN SUM(a.总人数)   
          WHEN a.人员类别=7  THEN SUM(a.总人数)   
          WHEN a.人员类别=8  THEN SUM(a.总人数)   
          WHEN a.人员类别=9  THEN SUM(a.总人数)  
          WHEN a.人员类别=10  THEN SUM(a.总人数)  
          WHEN a.人员类别=11  THEN SUM(a.总人数)   
          WHEN a.人员类别=12  THEN SUM(a.总人数)   
          WHEN a.人员类别=13  THEN SUM(a.总人数)  
          WHEN a.人员类别=14  THEN SUM(a.总人数)   
          ELSE 0  END    人数
FROM 
(SELECT 
DIM_QYSJ_Y  出院时间年,
SUBSTRING(DIM_QYSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_QYSJ_D   日,
DIM_QYSJ_M   当月,
QYQK_ZRS   总人数,
QYQK_RYLB   人员类别
from MD_ZDRQQYQK_TEST  WHERE  {[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY a.人员类别

UNION ALL

SELECT 
CASE WHEN a.人员类别=1  THEN '高血压患者在管数' 
          WHEN a.人员类别=2  THEN '2型糖尿病患者在管数' 
          WHEN a.人员类别=3  THEN '0-6岁儿童在管数' 
          WHEN a.人员类别=6  THEN '65岁及以上老人在管数' 
          WHEN a.人员类别=7  THEN '孕产妇在管数' 
          WHEN a.人员类别=8  THEN '肺结核尿病患者在管数'
          WHEN a.人员类别=9  THEN '严重精神障碍患者在管数' 
          WHEN a.人员类别=10  THEN '残疾人在管数' 
          WHEN a.人员类别=11  THEN '计划生育特殊家庭在管数' 
          WHEN a.人员类别=12  THEN '纳入计划生育家庭特别扶助制度的独生子女伤残或死亡家庭的夫妻在管数' 
          WHEN a.人员类别=13  THEN '城乡低保五保在管数' 
          ELSE '计划生育特殊家庭自愿在管数'   END 类别,

CASE WHEN a.人员类别=1  THEN SUM(a.在管人数)    
          WHEN a.人员类别=2  THEN SUM(a.在管人数)   
          WHEN a.人员类别=3  THEN SUM(a.在管人数)   
          WHEN a.人员类别=6  THEN SUM(a.在管人数)   
          WHEN a.人员类别=7  THEN SUM(a.在管人数)   
          WHEN a.人员类别=8  THEN SUM(a.在管人数)   
          WHEN a.人员类别=9  THEN SUM(a.在管人数)  
          WHEN a.人员类别=10  THEN SUM(a.在管人数)  
          WHEN a.人员类别=11  THEN SUM(a.在管人数)   
          WHEN a.人员类别=12  THEN SUM(a.在管人数)   
          WHEN a.人员类别=13  THEN SUM(a.在管人数)  
          WHEN a.人员类别=14  THEN SUM(a.在管人数)   
          ELSE 0  END    人数
FROM 
(SELECT 
DIM_QYSJ_Y  出院时间年,
SUBSTRING(DIM_QYSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_QYSJ_D   日,
DIM_QYSJ_M   当月,
QYQK_ZGRS   在管人数,
QYQK_RYLB   人员类别
from MD_ZDRQQYQK_TEST  WHERE  {[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY a.人员类别
)b   
GROUP BY b.类别  

​ 签约情况报表的签约人次及其占比数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成签约人数及占比双Y联合图,因统计时间按年度,季度,月度,自定义切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断。最终输出的字段为类别编码和类别两个维度均为为字符串型,类别编码主要运用于联动时设置为真实值,而类别为显示值,签约数及占比两个指标为浮点型。

SELECT 
b.类别编码        类别编码,
b.类别       类别,
SUM(b.签约数)  签约数, 
SUM(b.签约数)/(SELECT IFNULL(SUM(a.签约人数),0)  

FROM (
SELECT 
DIM_QYSJ_Y  出院时间年,
SUBSTRING(DIM_QYSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_QYSJ_D   日,
DIM_QYSJ_M   当月,
QYQK_QYRS   '签约人数',
QYQK_RYLB   人员类别
from MD_ZDRQQYQK_TEST  
WHERE   {[QYQK_HJBM = ^P_PARAM.ucismodelsjk.户籍类别^]} and  
{[QYQK_NLFB  = ^P_PARAM.ucismodelsjk.年龄分布^]}  and  
{[QYQK_XBBM  = ^P_PARAM.ucismodelsjk.性别分布^]}  and  
{[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end) 占比

FROM (
SELECT 
a.人员类别    类别编码,
CASE WHEN a.人员类别=1  THEN '高血压患者' 
          WHEN a.人员类别=2  THEN '2型糖尿病患者' 
          WHEN a.人员类别=3  THEN '0-6岁儿童' 
          WHEN a.人员类别=6  THEN '65岁及以上老人' 
          WHEN a.人员类别=7  THEN '孕产妇' 
          WHEN a.人员类别=8  THEN '肺结核尿病患者' 
          WHEN a.人员类别=9  THEN '严重精神障碍患者' 
          WHEN a.人员类别=10  THEN '残疾人' 
          WHEN a.人员类别=11  THEN '计划生育特殊家庭' 
          WHEN a.人员类别=12  THEN '纳入计划生育家庭特别扶助制度的独生子女伤残或死亡家庭的夫妻' 
          WHEN a.人员类别=13  THEN '城乡低保五保' 
          ELSE '计划生育特殊家庭自愿'   END 类别,

CASE WHEN a.人员类别=1  THEN SUM(a.签约人数)    
          WHEN a.人员类别=2  THEN SUM(a.签约人数)   
          WHEN a.人员类别=3  THEN SUM(a.签约人数)   
          WHEN a.人员类别=6  THEN SUM(a.签约人数)   
          WHEN a.人员类别=7  THEN SUM(a.签约人数)   
          WHEN a.人员类别=8  THEN SUM(a.签约人数)   
          WHEN a.人员类别=9  THEN SUM(a.签约人数)  
          WHEN a.人员类别=10  THEN SUM(a.签约人数)  
          WHEN a.人员类别=11  THEN SUM(a.签约人数)   
          WHEN a.人员类别=12  THEN SUM(a.签约人数)   
          WHEN a.人员类别=13  THEN SUM(a.签约人数)  
          WHEN a.人员类别=14  THEN SUM(a.签约人数)   
          ELSE 0  END 签约数

FROM 
(SELECT 
DIM_QYSJ_Y  出院时间年,
SUBSTRING(DIM_QYSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_QYSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,
DIM_QYSJ_D   日,
DIM_QYSJ_M   当月,
QYQK_QYRS   '签约人数',
QYQK_RYLB   人员类别
from MD_ZDRQQYQK_TEST  
WHERE   {[QYQK_HJBM = ^P_PARAM.ucismodelsjk.户籍类别^]} and  
{[QYQK_NLFB  = ^P_PARAM.ucismodelsjk.年龄分布^]}  and  
{[QYQK_XBBM  = ^P_PARAM.ucismodelsjk.性别分布^]}  and  
{[DIM_YLJGDM in (^P_PARAM.testbzk.住院机构^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY a.人员类别)b   GROUP BY b.类别,b.类别编码   ORDER BY SUM(b.签约数)  DESC

​ 签约情况报表的签约人次及其占比数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成签约人数及占比双Y联合图,因统计时间按年度,季度,月度,自定义切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断。最终输出的字段为类别编码和类别两个维度均为为字符串型,类别编码主要运用于联动时设置为真实值,而类别为显示值,签约数及占比两个指标为浮点型。

SELECT (@i:=@i+1) as i,
a.姓名,a.性别,a.户籍,a.上报机构,a.死亡原因,a.死亡日期,a.出生日期,
CASE 
WHEN a.年龄单位 = '岁'  THEN CONCAT(SZNL, '',"岁" )
WHEN a.年龄单位 = '月'  THEN CONCAT(SZNL, '',"个月")
WHEN a.年龄单位  = '周'  THEN CONCAT(SZNL * 7,'',"天")
ELSE CONCAT(SZNL, '',"天")
END  AS 年龄

FROM

(SELECT

DATE_FORMAT(SWSJ, "%Y")    出院时间年,
DATE_FORMAT(SWSJ, "%m")   出院月份,
CASE WHEN DATE_FORMAT(SWSJ, "%m") BETWEEN '01' AND '03' THEN '第1季度' 
         WHEN DATE_FORMAT(SWSJ, "%m") BETWEEN '04' AND '06' THEN '第2季度'
         WHEN DATE_FORMAT(SWSJ, "%m")  BETWEEN '07' AND '09' THEN '第3季度'
         ELSE  '第4季度'  END 季度,
DATE_FORMAT(SWSJ, "%Y-%m-%d")   日,
DATE_FORMAT(SWSJ, "%Y-%m")   当月,
XM   '姓名',
CASE 
WHEN XB = '0'  THEN "未知"
WHEN XB = '1'  THEN "男"
ELSE "女"
END  AS 性别,
CASE 
WHEN XB = '0'  THEN "非深户"
WHEN XB = '1'  THEN "深户"
ELSE "未知"
END  AS 户籍,
CASE 
WHEN NLDW = '1'  THEN "岁"
WHEN NLDW = '2'  THEN "月"
WHEN NLDW = '3'  THEN "周"
ELSE "天"
END  AS 年龄单位,
CASE 
WHEN YLJGDM = 'ytska'  THEN "盐田社康A"
WHEN YLJGDM = 'ytzyy'  THEN "盐田中医院"
ELSE "盐田人民医院"
END  AS 上报机构,
ZJYYMCA    '死亡原因',
SZNL    ,
DATE_FORMAT(CSNY , "%Y.%m.%d")    '出生日期',
DATE_FORMAT(SWSJ, "%Y.%m.%d")   死亡日期,
BKBH  '卡号'
FROM MD_CHILD_DEADINFO_TEST  
WHERE  {[ZJYYMCA  =   ^P_PARAM.ucismodelsjk.死亡原因^ ]}  and  
{[ HJ  = ^P_PARAM.ucismodelsjk.户籍构成^  ]}    and  
{[ XB      =  ^P_PARAM.ucismodelsjk.性别类型^ ]}     and  
{[ NLGC =  ^P_PARAM.ucismodelsjk.年龄构成^ ]}     and  
{[ YLJGDM  in   (^P_PARAM.testbzk.住院机构^)]}) a, (select @i:=0) as it
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
order by a.死亡日期  desc
5、Excel里设置参数排版及无数据时显示暂无数据

​ 因报表顶端只显示机构参数与查询时间参数,且查询时间里面的内容切换时会显示年度,季度,月度的各种选项,所以需要将机构参数,查询时间参数,年份,季度,月份共5个参数依次排列,隐藏多余参数。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第33张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第34张图片

6、默认显示年隐藏季度及月度参数宏代码(JS)的创建

​ 情况一:医疗机构床位报表,此报表默认显示年,且无自定义选项。

​ 名称为:隐藏参数,类型为:客户端宏,对象为:spreadsheetReport,事件为:onParamValueChanged

function main(spreadsheetReport, param) {
   if (param.name!="查询时间") return;
    var value = param.value;
    //alert(value);
    if(value == '2'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
    }else   
    if (value == '1') {                       //若值等于“华北”,则设置“目录”参数隐藏
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = '';
    }else if(value == '3'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
    }
}

​ 名称为:默认显示年,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport

function main(spreadsheetReport) {
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
}

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第35张图片

​ 情况二:门诊综合情况或签约情况或死因构成报表,此报表默认显示当月,且含自定义选项。

​ 名称为:隐藏参数,类型为:客户端宏,对象为:spreadsheetReport,事件为:onParamValueChanged


function main(spreadsheetReport, param) {
   if (param.name!="统计时间1") return;
    var value = param.value;
    //alert(value);
    if(value == '2'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始时间").style.display = 'none';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束时间").style.display = 'none';
    }else   
    if (value == '1') {                                    //若值等于“华北”,则设置“目录”参数隐藏
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始时间").style.display = 'none';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束时间").style.display = 'none';
    }else if(value == '3'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始时间").style.display = 'none';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束时间").style.display = 'none';
    }else if(value == '4'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始时间").style.display = '';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束时间").style.display = '';
    } 
}

​ 名称为:默认显示月,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport

function main(spreadsheetReport) {  
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始时间").style.display = 'none';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束时间").style.display = 'none';
}

​ 名称为:表格轮播图,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function main(spreadsheetReport, isAjaxRefreshCallback) {
    //照相机对象的名字,excel左上角
    var gundong = spreadsheetReport.shapesMap["Picture 24"];
    if (!gundong) {
        return;
    }
    // 滚动速度
    var speed = 60;
    var gundong_parent = gundong.parentNode;
    // 新增id判断,该id与20行中的id保持一致即可,当dom元素已存在时,直接返回,避免因局部刷新导致的资源重复创建
    if (gundong_parent.ownerDocument.getElementById("div_1")) {
        return;
    }
    var div1 = document.createElement("div");
    // 为创建的资源绑定指定的ID,与上述判断的ID保持一致,若多个轮播宏代码,请更换id的值
    div1.id = "div1_1";
    //缓冲div
    var div2 = document.createElement("div");
    div1.appendChild(gundong);
    gundong_parent.appendChild(div1);
    gundong_parent.appendChild(div2);
    div2.innerHTML = div1.innerHTML;
    gundong_parent.style.overflow = "hidden";
    //轮循加载和轮循
    var table;
    function Marquee() {
        try {
            var lunbo_doc = gundong.contentDocument;
            table = lunbo_doc.getElementById("mainTable");
            if (table) {
                var h = table.scrollHeight
                var div = table.parentNode;
                // if (div.tagName != "DIV") return;
                div.style.height = h + "px";
                gundong.style.height = h + 'px';
                var divhei = div2.firstChild.style.height;
                //当滚动高度大于照相机表格实际高度时候,滚动高度重置。
                if (gundong_parent.scrollTop > table.scrollHeight) {
                    gundong_parent.scrollTop -= div1.firstChild.clientHeight;
                } else {
                    gundong_parent.scrollTop += 2;
                }
            }
        } catch (e) {
            clearInterval(MyMar1)
        }
    }
    // 将已存在的计时器给clear掉
    if (spreadsheetReport.MyMar1) {
        clearInterval(spreadsheetReport.MyMar1);
    }
    // 将新增的计时器绑定到spreadsheetreport对象中,若多个轮播宏代码,请更换MyMar1的名称,包含第45、49、50..等名称
    var MyMar1 = setInterval(Marquee, speed);
    spreadsheetReport.MyMar1 = MyMar1;
        //鼠标滑过事件
    gundong_parent.onmouseover = function() {
            if (table) {
                clearInterval(MyMar1)
            }
        }
        //鼠标离开事件
    gundong_parent.onmouseout = function() {
        if (table) {
            clearInterval(MyMar1)
            MyMar1 = setInterval(Marquee, speed)
            spreadsheetReport.MyMar1 = MyMar1;
        }
    }
}

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第36张图片

五、报表顶端含默认显示TOP10或20的报表

1、展示效果

​ 门诊疾病谱报表,如下图所示:实现的效果是:打开报表页面默认显示月度,报表数据全部按时间维度年进行统计,但可以切换时间维度为季度或者月度,切换月度,向前推12个月,切换季度,向前推4个季度。而且报表顶端还有疾病种类(top)的参数,默认显示top10,但可以人为切换为top20。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第37张图片

2、参数的创建

​ 门诊疾病谱报表顶端疾病种类(top)参数的设置,因top10可以切换为top20,所以在备选值区将两个值依次展示,而默认区则显示top10。注意此参数的数据类型为整型,而控件类型为常用的下拉框。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第38张图片

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第39张图片

3、原生SQL数据集的创建

​ 门诊疾病谱报表的门诊疾病增量排名数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成门诊疾病增量排名双Y联合图,因统计时间按年度,季度,月度切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,因需要采用报表顶端疾病种类(top)参数进行筛选,因此需要将此参数运用于数据集中最后用limit进行筛选。

SELECT 
病种1,
IFNULL(SUM(病例数1),0)-IFNULL(SUM(病例数2),0) 增量数,
CASE WHEN IFNULL(SUM(病例数2),0)=0 THEN 0 ELSE (SUM(病例数1)-SUM(病例数2))*100/SUM(病例数2) END 环比 
FROM 
(SELECT 病种1,SUM(IND_DISEASES) 病例数1
FROM (
SELECT c.code_name 病种1,IND_DISEASES,
DIM_OUT_DATE_Y 出院时间年,
SUBSTRING(DIM_OUT_DATE_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_OUT_DATE_D 日,
DIM_OUT_DATE_M 当月
FROM MD_OUT_DISEASES_TEST a ,tb_org b,t_is_dict c WHERE a.DIM_YLJGDM = b.code
AND a.DIM_JZZDBM=c.code_id AND c.dict_group_code='ICD-10'
AND {[ b.name  in  ( ^P_PARAM.ucismodelsjk.机构1^ )]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY 病种1
)t1

LEFT JOIN

(SELECT 病种2,SUM(IND_DISEASES) 病例数2
FROM (
SELECT c.code_name 病种2,IND_DISEASES,
DIM_OUT_DATE_Y 出院时间年,
SUBSTRING(DIM_OUT_DATE_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_OUT_DATE_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_OUT_DATE_D 日,
LEFT(DATE_ADD(STR_TO_DATE(DATE_FORMAT(DIM_OUT_DATE_D,'%Y-%m-%d'),'%Y-%m-%d'),INTERVAL 1 MONTH),7) 对比月
FROM MD_OUT_DISEASES_TEST a ,tb_org b,t_is_dict c WHERE a.DIM_YLJGDM = b.code
AND a.DIM_JZZDBM=c.code_id AND c.dict_group_code='ICD-10'
AND  {[ b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then (日 >=DATE_ADD(CONCAT('^P_PARAM.ucismodelsjk.年份^','-','^P_PARAM.ucismodelsjk.月份^','-01'),INTERVAL -1 MONTH) AND 日=DATE_ADD( '^P_PARAM.ucismodelsjk.开始时间^',INTERVAL -1 MONTH) and a.日<= DATE_ADD( '^P_PARAM.ucismodelsjk.结束时间^',INTERVAL -1 MONTH)
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  (日>=CONCAT('^P_PARAM.ucismodelsjk.年份^','-',CASE WHEN '^P_PARAM.ucismodelsjk.季度^'='第1季度' THEN '01' WHEN '^P_PARAM.ucismodelsjk.季度^'='第2季度' THEN '04' WHEN '^P_PARAM.ucismodelsjk.季度^'='第3季度' THEN '07' ELSE '10' END,'-01') AND 日
4、Excel里设置参数排版

​ 因报表顶端只显示机构参数与疾病种类(top)参数与查询时间参数,且查询时间里面的内容切换时会显示年度,季度,月度,自定义的各种选项,所以需要将疾病种类(top)参数,机构参数,查询时间参数,年份,季度,月份,开始时间,结束时间共8个参数依次排列,隐藏多余参数。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第40张图片

六、报表中含两个维度相互切换改变对应组件的报表

1、展示效果

​ 药占比分析报表,如下图所示:实现的效果是:功能组件中分类轴相同,统计指标值可以依据上方的门急诊与住院两个参数按钮进行切换,参数切换后所对应的组件条形图也随之切换,另外科室药占比条形图默认显示全部科室,且可以联动最右侧的医生药占比,且可以采用下拉框中唯一的全部选项返回全部状态;注意:这里不是采用tab页控件,而是同一个数据集借助参数进行设置。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第41张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第42张图片

2、参数的创建

​ 药占比分析报表中科室药占比组件的门急诊或住院参数的设置,因此参数在门急诊和住院之间切换,所以在备选值区将两个值依次展示,而默认区则显示门急诊,注意医生药占比下的医生门急诊或住院参数与此参数一样。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第43张图片

​ 药占比分析报表中科室药占比组件的药占比分析科室参数的设置,因点击科室药占比的条形图可以联动右侧的医生药占比,且借助此参数可以返回全部。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第44张图片

3、原生SQL数据集的创建

​ 药占比分析报表的科室药占比数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成科室药占比条形图,因统计时间按年度,季度,月度切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,因此条形图可以在门急诊与住院间进行切换,因此外层需要用门急诊或住院参数进行判断筛选,且此数据集的科室名称直接调用字典表t_is_dict里的数据而不是人为将科室代码与科室名称一一对应,因此上述药占比分析科室参数才可直接使用。最后输出的维度字段为科室,字符串类型,指标字段为科室药占比,浮点型数据,而且分类轴不管是门急诊还是住院均为科室,指标数据均为科室药占比,但是门急诊和住院分别来自两个不同的数据表,所以在最外层需要借助门急诊或住院参数结合case when进行判断。

SELECT * FROM 
(SELECT a.科室,
CASE WHEN '^P_PARAM.ucismodelsjk.门急诊或住院^' ='门急诊' THEN SUM(CASE WHEN lx='1' THEN 收入 ELSE 0 END)/SUM(CASE WHEN lx='2' THEN 收入 ELSE 0 END)
ELSE SUM(CASE WHEN lx='3' THEN 收入 ELSE 0 END)/SUM(CASE WHEN lx='4' THEN 收入 ELSE 0 END) END 科室药占比 

FROM (
SELECT '1' lx,IND_DRUG_FEE_MJZYPFY 收入,
DIM_STFSJ_Y 出院时间年,c.code_name 科室,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_OUT_DRUG_FEE a ,tb_org b,t_is_dict c WHERE a.DIM_YLJGDM = b.code AND a.DIM_KDKSBM=c.code_id  AND c.dict_group_code='SZCV01.13.005' AND {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^)]}

UNION ALL
SELECT '2' lx,IFNULL(IND_OUT_FEE,0)+IFNULL(IND_OUT_FEE_JZ,0) 收入,
DIM_STFSJ_Y 出院时间年,c.code_name 科室,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_OUT_FEE_TEST a ,tb_org b,t_is_dict c WHERE a.DIM_YLJGDM = b.code AND a.DIM_KDKSBM=c.code_id  AND c.dict_group_code='SZCV01.13.005'AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^)]}

UNION ALL
SELECT '3' lx,IND_DRUG_FEE_ZYYPFY 收入,
DIM_STFSJ_Y 出院时间年,c.code_name 科室,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_IN_DRUG_FEE a ,tb_org b,t_is_dict c WHERE a.DIM_YLJGDM = b.code AND a.DIM_KDKSBM=c.code_id  AND c.dict_group_code='SZCV01.13.005'AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^)]}

UNION ALL
SELECT '4' lx,IND_IN_FEE 收入,
DIM_STFSJ_Y 出院时间年,c.code_name 科室,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_IN_FEE_TEST a ,tb_org b,t_is_dict c WHERE a.DIM_YLJGDM = b.code AND a.DIM_KDKSBM=c.code_id  AND c.dict_group_code='SZCV01.13.005'AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^)]}
) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY 科室   ORDER BY 科室药占比 DESC
) T  WHERE IFNULL(科室药占比,0)<>0

​ 药占比分析报表的医生药占比数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成医生药占比条形图,因统计时间按年度,季度,月度切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,因此条形图可以在门急诊与住院间进行切换,因此外层需要用医生门急诊或住院参数进行判断筛选,且此数据集的科室名称直接调用字典表t_is_dict里的数据而不是人为将科室代码与科室名称一一对应,因此上述药占比分析科室参数才可直接使用。最后输出的维度字段为医生,字符串类型,指标字段为医生药占比,浮点型数据,而且分类轴不管是门急诊还是住院均为医生,指标数据均为医生药占比,但是门急诊和住院分别来自两个不同的数据表,所以在最外层需要借助医生门急诊或住院参数结合case when进行判断。

SELECT * FROM (SELECT a.医生,
CASE WHEN  '^P_PARAM.ucismodelsjk.医生门急诊或住院^' ='门急诊' THEN SUM(CASE WHEN lx='1' THEN 收入 ELSE 0 END)/SUM(CASE WHEN lx='2' THEN 收入 ELSE 0 END)
ELSE SUM(CASE WHEN lx='3' THEN 收入 ELSE 0 END)/SUM(CASE WHEN lx='4' THEN 收入 ELSE 0 END) END 医生药占比 

FROM (
SELECT '1' lx,IND_DRUG_FEE_MJZYPFY 收入,
DIM_STFSJ_Y 出院时间年,c.xm 医生,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_OUT_DRUG_FEE a ,tb_org b,tb_dic_practitioner c,t_is_dict d WHERE a.DIM_YLJGDM = b.code and a.DIM_KDRGH=c.gh AND a.DIM_YLJGDM=c.YLJGDM AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^ )]}  AND a.DIM_KDKSBM=d.code_id  AND d.dict_group_code='SZCV01.13.005' and  CASE WHEN '^P_PARAM.ucismodelsjk.药占比分析科室^'='全部' then 1=1 else d.code_name='^P_PARAM.ucismodelsjk.药占比分析科室^' end
    
UNION ALL
SELECT '2' lx,IFNULL(IND_OUT_FEE,0)+IFNULL(IND_OUT_FEE_JZ,0) 收入,
DIM_STFSJ_Y 出院时间年,c.xm 医生,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_OUT_FEE_TEST a ,tb_org b,tb_dic_practitioner c,t_is_dict d WHERE a.DIM_YLJGDM = b.code and a.DIM_KDRGH=c.gh AND a.DIM_YLJGDM=c.YLJGDM AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^ )]}   AND a.DIM_KDKSBM=d.code_id  AND d.dict_group_code='SZCV01.13.005' and  CASE WHEN '^P_PARAM.ucismodelsjk.药占比分析科室^'='全部' then 1=1 else d.code_name='^P_PARAM.ucismodelsjk.药占比分析科室^' end
    
UNION ALL
SELECT '3' lx,IND_DRUG_FEE_ZYYPFY 收入,
DIM_STFSJ_Y 出院时间年,c.xm 医生,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_IN_DRUG_FEE a ,tb_org b,tb_dic_practitioner c,t_is_dict d WHERE a.DIM_YLJGDM = b.code and a.DIM_KDRGH=c.gh AND a.DIM_YLJGDM=c.YLJGDM AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^ )]}  AND a.DIM_KDKSBM=d.code_id  AND d.dict_group_code='SZCV01.13.005' and  CASE WHEN '^P_PARAM.ucismodelsjk.药占比分析科室^'='全部' then 1=1 else d.code_name='^P_PARAM.ucismodelsjk.药占比分析科室^' end
    
UNION ALL
SELECT '4' lx,IND_IN_FEE 收入,
DIM_STFSJ_Y 出院时间年,c.xm 医生,
SUBSTRING(DIM_STFSJ_M,6) 出院月份,
CASE WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '01' AND '03' THEN '第1季度' 
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '04' AND '06' THEN '第2季度'
        WHEN SUBSTRING(DIM_STFSJ_M,6) BETWEEN '07' AND '09' THEN '第3季度'
        ELSE  '第4季度'  END 季度,DIM_STFSJ_D 日,
DIM_STFSJ_M 当月
FROM MD_IN_FEE_TEST a ,tb_org b,tb_dic_practitioner c,t_is_dict d WHERE a.DIM_YLJGDM = b.code and a.DIM_KDRGH=c.gh AND a.DIM_YLJGDM=c.YLJGDM AND  {[b.name  in  (    ^P_PARAM.ucismodelsjk.机构1^ )]}  AND a.DIM_KDKSBM=d.code_id  AND d.dict_group_code='SZCV01.13.005' and  CASE WHEN '^P_PARAM.ucismodelsjk.药占比分析科室^'='全部' then 1=1 else d.code_name='^P_PARAM.ucismodelsjk.药占比分析科室^' end
) a
where 
case  when '^P_PARAM.ucismodelsjk.统计时间^'='1'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.出院月份 in ('^P_PARAM.ucismodelsjk.月份^')]}
when '^P_PARAM.ucismodelsjk.统计时间^'='2'  then a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^')
when '^P_PARAM.ucismodelsjk.统计时间^'='4'  then {[a.日>= '^P_PARAM.ucismodelsjk.开始时间^']} and {[a.日<= '^P_PARAM.ucismodelsjk.结束时间^']} 
when '^P_PARAM.ucismodelsjk.统计时间^'='3'  then  a.出院时间年 in ('^P_PARAM.ucismodelsjk.年份^') and {[a.季度 in ('^P_PARAM.ucismodelsjk.季度^')]} else 1=1  end
GROUP BY 医生   ORDER BY 医生药占比 DESC
) T  WHERE IFNULL(医生药占比,0)<>0
4、Excel里设置参数排版

​ 因报表顶端只显示机构参数与查询时间参数,且查询时间里面的内容切换时会显示年度,季度,月度,自定义的各种选项,所以需要将机构参数,统计时间参数,年份,季度,月份,开始时间,结束时间共7个参数依次排列,隐藏多余参数。然后对单选框控件进行设置并绑定相应的参数。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第45张图片

七、导出excel文档且含多参数筛选报表

1、展示效果

​ 如下图所示:实现的效果是:打开报表页面默认显示全部,即单位,姓名,年龄,职务,职称,类别,学历,编制,流动,标志这10个参数默认全选,且这些参数支持多选,一旦下拉框里忘记选的时候即空白时依然默认全选,且可以手动输入,而且手动输入时拥有搜索功能。点击导出按钮时即可将报表导出为excel文档,且导出的内容是筛选出的那些列,并且导出的文档中无报表顶端的参数选项。前三列及表头锁定,后面列可以借助滚动条拖动显示。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第46张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第47张图片

2、参数的创建

​ 报表中所有的参数都在顶端显示,且包含3种不同参数类型,一类是:单位,职务,职称,类别,学历,编制,流动,标志8个参数打开报表时默认显示为全部,这8个参数的控件类型采用下拉框形式,这8类参数设置时勾选允许多选及手工输入以便实现多选及手动输入时的搜索的功能。另一类是:姓名和开始及结束年龄3个参数打开报表时默认显示为空白,这3个参数的控件类型采用文本输入框形式。还有一类是:筛选参数,对报表中展示的列数进行过滤筛选。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第48张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第49张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第50张图片

3、原生SQL数据集的创建

​ 人员明细统计报表数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为人员明细统计报表,借助一系列参数对报表内容进行筛选,并借助筛选参数对所有列名进行筛选展示。

select 
(@i:=@i+1) as i,
XM  姓名,
CASE 
WHEN YLJGDM = 'ytska'  THEN "盐田社康A"
WHEN YLJGDM = 'ytzyy'  THEN "盐田中医院"
ELSE "盐田人民医院"
END  AS 机构名称,
CASE 
WHEN XBBM = '1'  THEN "男"
WHEN XBBM = '2'  THEN "女"
ELSE "未知"
END  AS 性别,
MZMC   民族,
ZJHM  身份证号码,
DATE_FORMAT(CSRQ, '%Y.%m')    出生年月,
floor(DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CSRQ ,"%Y"))  年龄,
CASE 
WHEN WHCD = '11'  THEN "博士生"
WHEN WHCD = '17'  THEN "研究生"
WHEN WHCD = '21'  THEN "大学本科"
WHEN WHCD = '31'  THEN "大学专科"
WHEN WHCD = '41'  THEN "中专及技校"
WHEN WHCD = '47'  THEN "技工学校"
WHEN WHCD = '61'  THEN "高中"
ELSE "初中及以下"
END  AS 最高学历,
CASE 
WHEN XWDM = '410'  THEN "博士"
WHEN XWDM = '310'  THEN "硕士"
ELSE "学士"
END  AS 最高学位,
ZGXLBYXX   最高学历毕业学校,
ZYMC    所学专业,
DATE_FORMAT(CJGZRQ, '%Y.%m')    参加工作年月,
SZYWKSMC   所在部门,
ZHIW   职务,
ZHIC  职称,
CASE 
WHEN LB = '70'  THEN "其他技术人员"
WHEN LB = '80'  THEN "管理人员"
WHEN LB = '90'  THEN "工勤技术人员"
ELSE "卫生技术人员"
END  AS 人员类别,
CASE 
WHEN BZQK= '1'  THEN "编制内"
WHEN BZQK = '2'  THEN "合同制"
WHEN BZQK= '3'  THEN "临聘人员"
WHEN BZQK= '4'  THEN "返聘"
ELSE "其他"
END  AS 编制情况,
CASE 
WHEN NNRYLDQK  like '1%'  THEN "流入"
WHEN NNRYLDQK like '2%'  THEN "流出"
END  AS 流动情况,
DATE_FORMAT(DRDCSJ, '%Y.%m')    调入调出年月,
CASE 
WHEN ZZBZ= '1'  THEN "在职"
ELSE "离职"
END  AS 在职标志
from (select @i:=0) as it, 
tb_dic_practitioner
WHERE 
{[  XM  in  ( ^P_PARAM.testbzk.姓名^) ]}        and  
{[  YLJGDM  in  (      ^P_PARAM.testbzk.单位^      )]}         and  
{[  ZHIW  in  (        ^P_PARAM.testbzk.职务^     )]}          and  
{[  ZHIC  in  (       ^P_PARAM.testbzk.职称^        )]}        and  
{[  LB  in  (         ^P_PARAM.testbzk.人员类别^         )]}    and  
{[  WHCD  in  (         ^P_PARAM.testbzk.学历^         )]}     and  
{[  BZQK  in  (        ^P_PARAM.testbzk.编制情况^     )]}       and  
{[  NNRYLDQK  in  (  ^P_PARAM.testbzk.年内人员流动^   )]}        and  
{[  ZZBZ  in  (   ^P_PARAM.testbzk.在职标志^    )]}             and  
{[  floor(DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CSRQ ,"%Y"))  >=  ^P_PARAM.testbzk.年龄^ ]}  and
{[  floor(DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CSRQ ,"%Y"))  <=  ^P_PARAM.testbzk.结束年龄^ ]}  and
DATE_FORMAT(YWSCSJ ,"%Y年") =  '^P_PARAM.testbzk.统计时间^'
and  {[ ( ^P_PARAM.testbzk.筛选^ ) = ( ^P_PARAM.testbzk.筛选^ ) ]} 
4、Excel里设置参数排版

​ 报表中所有的参数都在顶端显示,参数排版下将参数依次排列并可以设置两个参数之间的间隙,还可以采用冻结窗口将前三列冻结。另外在页面设置中将报表类型改为清单报表,让它分页方式为10行一页。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第51张图片

5、查询导出等宏代码(JS)的创建

​ 名称为:查询导出按钮,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function main(simpleReport, simpleReportContext) {
    if (simpleReport.hadAddBtn) {
        return;
    }
    if (!simpleReport.paramPanelObj) return;
    try {
        //获取参数面板表格
        var paramTable = simpleReport.paramPanelObj.layoutTable;
        var i, cell, lastCell;
        //在最后一个参数后面插入一个新的节点元素
        for (i = 0; i < paramTable.rows.length; i++) {
            cell = paramTable.rows[i].insertCell(-1);
            if (i == paramTable.rows.length - 1) lastCell = cell;
        }
        //创建查询按钮
        var queryBtn = document.createElement("button");
        queryBtn.value = " 查询 "; //如需要修必按钮风格,请自行实现
        queryBtn.innerHTML = "查询";
        queryBtn.className = "query-button";
        lastCell.appendChild(queryBtn);
        simpleReport.addListener(queryBtn, "click",
            function() {
                //刷新页面
                simpleReport.doRefresh();
            },
            this);
        // 添加空格
        var span = document.createElement("span");
        lastCell.appendChild(span);
        span.innerHTML = "  ";
        //创建导出按钮
        var exportBtn = document.createElement("button");
        exportBtn.value = " 导出 "; //如需要修必按钮风格,请自行实现
        exportBtn.innerHTML = "导出";
        exportBtn.className = "query-button";
        lastCell.appendChild(exportBtn);
        simpleReport.addListener(exportBtn, "click",
            function() {
                //导出Excel方法
                simpleReport.doExportMenuCloseUp("EXCEL");
            },
            this);
        simpleReport.hadAddBtn = true;
    } catch (e) {    
    }
}

​ 名称为:隐藏工具栏,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport,功能:隐藏smartbi报表自带的顶端功能区域。

function main(spreadsheetReport) {
    //先判断是否存在回写相关的保存等按钮
    if (spreadsheetReport.spreadsheetReportWriteBack && spreadsheetReport.spreadsheetReportWriteBack.elemSave) {
        spreadsheetReport.spreadsheetReportWriteBack.elemSave.parentNode.style.display = "none"; //保存
        spreadsheetReport.spreadsheetReportWriteBack.elemInsertRow.parentNode.style.display = "none"; //添加行
        spreadsheetReport.spreadsheetReportWriteBack.elemRemoveRow.parentNode.style.display = "none"; //删除行
        spreadsheetReport.spreadsheetReportWriteBack.elem_btnClearModified.parentNode.style.display = "none"; //清空数据修改记录
        if(spreadsheetReport.spreadsheetReportWriteBack.elem_btnBatchImport) {
            spreadsheetReport.spreadsheetReportWriteBack.elem_btnBatchImport.parentNode.style.display = "none"; //批量导入
        }
    }
    if (spreadsheetReport.elem_trToolbar) {
        spreadsheetReport.elem_btnRefresh.parentNode.style.display = "none"; //刷新
        spreadsheetReport.elem_btnMyFavorite.parentNode.style.display = "none"; //收藏
        spreadsheetReport.elem_btnExport.parentNode.style.display = "none"; //导出
        spreadsheetReport.elem_btnPrint.parentNode.style.display = "none"; //打印
        spreadsheetReport.elem_btnSetUserParam.parentNode.style.display = "none"; //设置个人参数
        spreadsheetReport.elem_space2.parentNode.style.display = "none"; //竖线
    }
}

​ 名称为:页签下移,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender,功能:将报表中的页签向下移动并移动到报表的右下端位置。

function main(spreadsheetReport) {
   paging(spreadsheetReport);
}
//分页
function paging(spreadsheetReport){
    //debugger;
    if (!spreadsheetReport._movePageCtrlFlag) {
        // 找到“分页”控件,并从DOM中移除
        var pageCtrl = spreadsheetReport.elemPageCtrl;
        if (pageCtrl && pageCtrl.childNodes.length > 0) {
            // 该电子表格报表是被单独打开的;
            var tr_parent_pageCtrl = pageCtrl.parentNode;
            tr_parent_pageCtrl.removeChild(pageCtrl);
            var content = spreadsheetReport.elem_content;
            var tb_content = content.parentNode.parentNode;
            var newTr = tb_content.insertRow(-1);
            newTr.appendChild(pageCtrl);
            pageCtrl.align = "right";//将分页栏居右
        } else {
            // 该电子表格报表被放到了“页面”上
            var elem_trPagePanel = spreadsheetReport.elem_trPagePanel;
            var tbody = elem_trPagePanel.parentNode;
            tbody.removeChild(elem_trPagePanel);
            tbody.appendChild(elem_trPagePanel);
            elem_trPagePanel.align = "right";//将分页栏居右
            if (domutils.isMobile()) {
                spreadsheetReport.elem_pagePanelTd.style.height = "30px";
                spreadsheetReport.elem_pagePanelTd.firstChild.style.height = "30px";
            } 
            var sheetFrame;
                sheetFrame = spreadsheetReport.elemSheetFrame;
                sheetFrame.style.height = (sheetFrame.offsetHeight - 30) + "px";
        }
         pageCtrl.align = "right";
        // 分页控件已经被移到右下角了
        spreadsheetReport._movePageCtrlFlag = true;
    }
}

​ 名称为:页签样式,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender,功能:设置报表中页签的样式,让其拥有翻页功能,且翻页的时候不能翻的颜色为灰色。

function main(simpleReport, simpleReportContext) {
    var pagePanel = simpleReport.pagePanel; //分页栏面版
    if (pagePanel) {
        debugger;
        var td = pagePanel.firstpage.parentNode;
        td.style.fontSize = "20px"; //设置整体字体大小
        td.style.color = "#ff0000"; //设置整体字体颜色
        pagePanel.curpage.style.fontSize = "20px"; //当前页部分输入框内数字字体颜色    
        pagePanel.curpage.style.width = "70px";
        pagePanel.curpage.style.height = "20px";
        pagePanel.curpage.style.color = "#ff0000";
        pagePanel.rowcount.style.width = "70px"; //每页行数部分输入框字体颜色
        pagePanel.rowcount.style.height = "20px";
        pagePanel.rowcount.style.color = "#ff0000";
        pagePanel.pagePanelFont.color = "#ff0000";
        pagePanel.pagePanelDisableFont.color = "gray"; //设置不可点按钮颜色为灰色
    }
}

​ 名称为:刷选列服务,类型为:服务端宏,对象为:spreadsheetReport,事件为:onBeforeOutput,功能:让客户使用筛选参数的筛选按钮可以筛选出客户所需要的列。

function main(spreadsheetReport) {
    var colList=['序号','姓名','单位','性别','民族','身份证号码','出生年月','年龄','最高学历','最高学位','最高学历毕业学校','所学专业','参加工作时间','所在部门','职务','职称','人员类别','编制情况','年内人员流动情况','调入/调出时间','在职标志'];
    var value = spreadsheetReport.getParameterValue("刷选列"); // 获取参数值
    var sheet = spreadsheetReport.workbook.getWorksheets().get(0); // 获取当前sheet,从0开始计数
    var list = value.split(',');
    var idx=value.indexOf('姓名');
    logger.debug(value);
    logger.debug(list.toString());
    logger.debug("idx:"+idx);
    logger.debug("list[1]:"+list[1]);
    var str = '';
    for (x in colList){
        // 标志是否隐藏x列
        var flag = true;
        for (y in list) {
            // logger.debug("colList: " + colList[x] + ",    list:"+list[y]);
            if (colList[x] == list[y]) {
                // logger.debug('Bingo!');
                flag = false;
            }
        }
        // 如果标志仍然为true,则隐藏
        if (flag) {
            sheet.cells.getColumn(x).setWidth(0);
        }
    }
}

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第52张图片

八、导出excel文档且含展开收缩功能报表

1、展示效果

​ 如下图所示:实现的效果是:打开报表页默认按年度进行统计,而且统计时机参数的内容显示为当年(如今年2021年),单报表内容中展示的是从当年开始向前推三年。每个年份的左侧含有一个+按钮,点击+可以展开所选年的所有月度数据,收缩时,点击年份左侧的-按钮,即可将所有月份收缩。点击导出按钮时即可将报表导出为excel文档,且导出的文档中无报表顶端的参数选项。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第53张图片

2、参数的创建

​ 报表中所有的参数都在顶端显示,其中统计时间根据数据集所采用的数据表进行中,从相应数据表提取从当前年到前4年放入备选值区。提取当前年放入默认值区。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第54张图片

3、原生SQL数据集的创建

​ 机构床位统计报表数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为机构床位统计报表,借助UNION ALL将多个不同数据表提取的字段整合为相同的字段。

select  m.指标名称,m.序号,m.计量单位,m.年,m.月,
case when 计量单位='日' then ROUND(m.张,2) 
when 计量单位='—' then ROUND(m.张,2) 
when 计量单位='平方米' then ROUND(m.张,2) 
when   计量单位='张' then ROUND(m.张,0) 
when   计量单位='人' then ROUND(m.张,0)  end  张
from

(select d.*,
    case when d.张 > 0  then '张' end 计量单位
from 
(select c.*,count(c.指标名称) 张 from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
CASE 
WHEN a.CWLX = '1'  THEN "编制床位数"
END  AS 指标名称,
CASE 
WHEN a.CWLX = '1'  THEN "1.1"
END  AS 序号
from tb_dict_bed a,tb_org b
where  a.YLJGDM=b.code  and {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}) c
where  c.年 > ('2021') -3 and c.年 <=('2021') 
group by c.指标名称,c.年,c.月,c.序号)d  where   d.张 > 0

UNION ALL

select c.*,
case when c.张 > 0  then '张' end  计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
"实有床位数"  AS  指标名称,
"1.2"  AS  序号,
COUNT(CASE  WHEN a.CWLX  between '1'  and  '2' THEN 1  END)   '张'
from tb_dict_bed a,tb_org b
where  a.YLJGDM=b.code  and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]} 
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where   c.张 > 0  and  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')  group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select d.*,
    case when d.张 > 0  then '张' end 计量单位
from 
(select c.*,count(c.指标名称) 张 from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
CASE 
WHEN a.TXCWBZ= '1'  THEN "特需床位数"
END  AS 指标名称,
CASE 
WHEN a.TXCWBZ= '1'  THEN "1.2.1"
END  AS 序号
from tb_dict_bed a,tb_org b
where  a.YLJGDM=b.code  and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}) c
where   c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^') 
group by c.指标名称,c.年,c.月,c.序号)d  where   d.张 > 0


UNION ALL

select d.*,
    case when d.张 > 0  then '张' end 计量单位
from 
(select c.*,count(c.指标名称) 张 from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
CASE 
WHEN a.CWLX = '4'  THEN "观察床数"
END  AS 指标名称,
CASE 
WHEN a.CWLX = '4'  THEN "1.2.2"
END  AS 序号
from tb_dict_bed a,tb_org b
where  a.YLJGDM=b.code  and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}) c
where   c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^') 
group by c.指标名称,c.年,c.月,c.序号)d  where   d.张 > 0


UNION ALL

select c.*,
case when c.日 > 0  then '日' end  计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
"实际开放总床日数"  AS  指标名称,
"1.3"  AS  序号,
COUNT(CASE  WHEN a.CWLX  between '1'  and  '2' THEN 1  END) * 365   '日'
from tb_dict_bed a,tb_org b
where  a.YLJGDM=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]} 
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where   c.日 > 0  and  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select c.*,
case when c.日 > 0  then '日' end 计量单位
from
(select 
a.DIM_IN_RYSJ_Y  年,
substring(a.DIM_IN_RYSJ_M,6)  月,
"实际占用总床日数" AS 指标名称,
"1.3.1"  AS  序号,
SUM(a.IND_BEDUSED_DAYS)   日
from md_in_patients_test a,tb_org b
where  a.DIM_YLJGDM=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY DIM_IN_RYSJ_Y,SUBSTRING(DIM_IN_RYSJ_M,6)) c
where   c.日 > 0  and   c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select c.*,
case when c.张 > 0  then '张' end  计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
"平均开放病床数"  AS  指标名称,
"1.3.1.1"  AS  序号,
COUNT(CASE  WHEN a.CWLX  between '1'  and  '2' THEN 1  END)   '张'
from tb_dict_bed a,tb_org b
where  a.YLJGDM=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where   c.张 > 0  and   c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select c.*,
case when c.日 > 0  then '日' end 计量单位
from
(select 
a.DIM_IN_CYSJ_Y  年,
substring(a.DIM_IN_CYSJ_M,6)  月,
"出院者占用总床日数" AS 指标名称,
"1.3.2"  AS  序号,
SUM(a.IND_IN_USEDBEDS)   日
from MD_IN_DISCHARGES a,tb_org b
where  a.DIM_YLJGDM=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]} 
GROUP BY a.DIM_IN_CYSJ_Y,substring(a.DIM_IN_CYSJ_M,6)) c
where   c.日 > 0  and  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号


UNION ALL

select c.年,c.月,c.指标名称,c.序号,c.日,
case when c.日 > 0  then '日' end  计量单位
from
(select 
a.DIM_IN_CYSJ_Y  年,
substring(a.DIM_IN_CYSJ_M,6)  月,
"出院患者平均住院日" AS 指标名称,
"1.3.2.1"  AS  序号,
SUM(a.IND_IN_USEDBEDS)   '出院者占用总床日数',
SUM(a.IND_IN_DISCHARGES)   '出院人次',
ROUND(CASE WHEN SUM(a.IND_IN_DISCHARGES) =0 THEN 0 ELSE SUM(a.IND_IN_USEDBEDS)   / SUM(a.IND_IN_DISCHARGES)  END,2)  '日'
from MD_IN_DISCHARGES a,tb_org b
where  a.DIM_YLJGDM=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY a.DIM_IN_CYSJ_Y,substring(a.DIM_IN_CYSJ_M,6)) c
where   c.日 > 0  and  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号


UNION ALL

select e.*,
case when e.日 > 0  then '—' end  计量单位
from
(select  d.年,d.月,
"病床使用率"  AS  指标名称,
"1.4"  AS  序号,
ROUND(CASE WHEN sum(d.实际开放总床日数) =0 THEN 0 ELSE SUM(d.实际占用总床日数)   / sum(d.实际开放总床日数)  END,2)   '日'
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
COUNT(CASE  WHEN a.CWLX  between '1'  and  '2' THEN 1  END) * 365   '实际开放总床日数',
SUM(c.IND_BEDUSED_DAYS)   '实际占用总床日数'
from tb_dict_bed a,tb_org b,md_in_patients_test c
where  a.YLJGDM=b.code and  a.YLJGDM=c.DIM_YLJGDM  and DATE_FORMAT(a.YWSCSJ, "%Y")=c.DIM_IN_RYSJ_Y  and  DATE_FORMAT(a.YWSCSJ,"%m") = substring(c.DIM_IN_RYSJ_M,6) and {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) d
GROUP BY d.年,d.月)e
where   e.日 > 0  and   e.年 > ('^P_PARAM.testbzk.统计时间^') -3 and e.年 <=('^P_PARAM.testbzk.统计时间^')   group by e.指标名称,e.年,e.月,e.序号


UNION ALL

select c.*,
case when c.人 > 0  then '人' end  计量单位
from
(select 
SUBSTRING(a.ywscsj,1,4)  年,
SUBSTRING(a.ywscsj,6)  月,
"职业(助理)医师"  AS  指标名称,
"1.5"  AS  序号,
COUNT(CASE WHEN a.LB = '11' or  a.LB ='12' THEN 1  END)   '人'
from MD_WORKERS a,tb_org b
where  a.YLJGDM=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY SUBSTRING(a.ywscsj,1,4),SUBSTRING(a.ywscsj,6)) c
where   c.人 > 0  and  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   and  c.年 > 2018 group by c.指标名称,c.年,c.月,c.序号


UNION ALL

select e.*,
case when e.日 > 0  then '—' end  计量单位
from
(select  d.年,d.月,
"医师床位比"  AS  指标名称,
"1.5.1"  AS  序号,
ROUND(CASE WHEN sum(d.实有床位数) =0 THEN 0 ELSE SUM(d.执业医师数)   / sum(d.实有床位数)  END,2)   '日'
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS 年,
DATE_FORMAT(a.YWSCSJ,"%m") AS 月,
COUNT(CASE  WHEN a.CWLX  between '1'  and  '2' THEN 1  END)   '实有床位数',
COUNT(CASE WHEN c.LB = '11' or  c.LB ='12' THEN 1  END)   '执业医师数'
from tb_dict_bed a,tb_org b,MD_WORKERS c
where  a.YLJGDM=b.code and  a.YLJGDM=c.YLJGDM  and DATE_FORMAT(a.YWSCSJ, "%Y")=SUBSTRING(c.ywscsj,1,4)  and  DATE_FORMAT(a.YWSCSJ,"%m") = SUBSTRING(c.ywscsj,6)  and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) d
GROUP BY d.年,d.月)e
where   e.日 > 0  and e.年 > ('^P_PARAM.testbzk.统计时间^') -3 and e.年 <=('^P_PARAM.testbzk.统计时间^')   group by e.指标名称,e.年,e.月,e.序号


UNION ALL

select c.*,
case when c.平方米 > 0  then '平方米' end 计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS   年,
DATE_FORMAT(a.YWSCSJ,"%m") AS   月,
"年末房屋建筑面积" AS 指标名称,
"2.1"  AS  序号,
SUM(a.ZJZMJ)   平方米
from tb_housing_construction a,tb_org b
where  a.YLJGID=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where   c.平方米 > 0  and c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select c.*,
case when c.平方米 > 0  then '平方米' end 计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS   年,
DATE_FORMAT(a.YWSCSJ,"%m") AS   月,
"其中:业务用房面积" AS 指标名称,
"2.1.1"  AS  序号,
SUM(a.YWYFMJ)   平方米
from tb_housing_construction a,tb_org b
where  a.YLJGID=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]}
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where   c.平方米 > 0  and  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select c.*,
case when c.平方米=0  then '平方米' end 计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS   年,
DATE_FORMAT(a.YWSCSJ,"%m") AS   月,
"年末租房面积" AS 指标名称,
"2.2"  AS  序号,
0   平方米
from tb_housing_construction a,tb_org b
where  a.YLJGID=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]} 
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')   group by c.指标名称,c.年,c.月,c.序号

UNION ALL

select c.*,
case when c.平方米=0   then '平方米' end 计量单位
from
(select 
DATE_FORMAT(a.YWSCSJ, "%Y")  AS   年,
DATE_FORMAT(a.YWSCSJ,"%m") AS   月,
"其中:业务用房面积" AS 指标名称,
"2.2.1"  AS  序号,
0    平方米
from tb_housing_construction a,tb_org b
where  a.YLJGID=b.code   and  {[b.name  in  (^P_PARAM.ucismodelsjk.机构1^)]} 
GROUP BY DATE_FORMAT(a.YWSCSJ, "%Y"),DATE_FORMAT(a.YWSCSJ,"%m")) c
where  c.年 > ('^P_PARAM.testbzk.统计时间^') -3 and c.年 <=('^P_PARAM.testbzk.统计时间^')  group by c.指标名称,c.年,c.月,c.序号
)m 
order by m.序号,m.年,m.月  asc 

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第55张图片

4、Excel里字段过滤设置及父格设置及单元格格式设置

​ 将指标字段张依次拖拽到01-12下方对应单元格,再通过单元格属性的扩展栏下设置不扩展和汇总求和并勾选后面的数据为空时显示为零,然后在单元格属性的过滤栏中借助月字段对01-12下方的字段依次分别进行过滤。最后隐藏一些行并通过设置单元格格式的自定义方法将数据为0时显示为‘-’。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第56张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第57张图片

5、查询导出及展开收缩等宏代码(JS)的创建

​ 名称为:查询导出按钮,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function main(simpleReport, simpleReportContext) {
    if (simpleReport.hadAddBtn) {
        return;
    }  
    //if (lastEmptyCell._attachChooseFieldsBtn) return;
        
    if (!simpleReport.paramPanelObj) return;
    try {
        //获取参数面板表格
        var paramTable = simpleReport.paramPanelObj.layoutTable;
        var i, cell, lastCell;
        //在最后一个参数后面插入一个新的节点元素
        for (i = 0; i < paramTable.rows.length; i++) {
            cell = paramTable.rows[i].insertCell(-1);
            if (i == paramTable.rows.length - 1) lastCell = cell;
        }
        //创建查询按钮
        var queryBtn = document.createElement("button");
        queryBtn.value = " 查询 "; //如需要修必按钮风格,请自行实现
        queryBtn.innerHTML = "查询";
        queryBtn.className = "query-button";
        lastCell.appendChild(queryBtn);
        simpleReport.addListener(queryBtn, "click",
            function() {
                //刷新页面
                simpleReport.doRefresh();
            },
            this);
        // 添加空格
        var span = document.createElement("span");
        lastCell.appendChild(span);
        span.innerHTML = "  ";
        //创建导出按钮
        var exportBtn = document.createElement("button");
        exportBtn.value = " 导出 "; //如需要修必按钮风格,请自行实现
        exportBtn.innerHTML = "导出";
        exportBtn.className = "query-button";
        lastCell.appendChild(exportBtn);
        simpleReport.addListener(exportBtn, "click",
            function() {
                //导出Excel方法
                simpleReport.doExportMenuCloseUp("EXCEL");
            },
            this);
        simpleReport.hadAddBtn = true;
    } catch (e) {
    }
}

​ 名称为:展开,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function createCellPos(n){
	var ordA = 'A'.charCodeAt(0);
	var ordZ = 'Z'.charCodeAt(0);
 	var len = ordZ - ordA + 1;
 	var s = "";
	while( n >= 0 ) {
		s = String.fromCharCode(n % len + ordA) + s;
		n = Math.floor(n / len) - 1;
	}
	return s;
}

function main(spreadsheetReport, isAjaxRefreshCallback) {
    if (isAjaxRefreshCallback) {
        return;
    }
   var cs=new Array();
   var expanders=new Array();
   var cells=new Array();
   //alert(spreadsheetReport.getColumnCount());
    //var fc=5; //"+"所在列
    for (var j = 0; j <= 2;j++) {
       cs[j]=4+j*13;
       //alert(cs[j]);
       var cell =  spreadsheetReport.getCell(2, cs[j]);
       if (cell==null) return;
       cell.collapsed = false;
       var expander=cell.ownerDocument.createElement("SPAN");
       expander.innerHTML = "+";
       expander.style.cursor = "pointer";
       cell.insertBefore(expander, cell.firstChild);
       
       expander.setAttribute("index", j);
       expander.onclick = function(ex) {
          //alert(this.toString());
          var j1 = this.getAttribute("index");
          //alert(j1);
          var idx = cs[j1];
          //alert(idx);
          var cell0 =  spreadsheetReport.getCell(2, idx);
          if (cell0==null) return;
          var table = cell0.parentNode.parentNode.parentNode;
          var width = parseInt(table.offsetWidth);
          if (cell0.collapsed) {
              this.innerHTML = "-"; //展开显示"-"
              var rowCount = spreadsheetReport.getRowCount();
              for (var i = 0; i < rowCount;i++) { //i=0,从第1行开始,即列头在第1行
                  for (var k = 1; k < 13;k++) { 
                     var td = spreadsheetReport.getCell(i, idx+k);
                       if (td==null) continue;
                     td.style.display = ""; //显示"+"所在列右边的第1列
                     td.width=60;
                    }
                }
              cell0.collapsed = false;
              table.style.width = width + 60*12 + "px";
            } else {
               this.innerHTML = "+"; //收起显示"+"
               var rowCount = spreadsheetReport.getRowCount();
               var w = 0;
               for (var i = 0; i < rowCount;i++) {
                  for (var k = 1; k < 13;k++) { 
                       
                       var td = spreadsheetReport.getCell(i, idx+k);
                       if (td==null) continue;
                       td.style.display = "none"; //显示"+"所在列右边的第1列
                    }
                }
                cell0.width=60;
                table.style.width = width - 60*12 + "px";
               cell0.collapsed = true;
            }
        }
        expander.onclick(expander);
    }
}

​ 名称为:树服务,类型为:服务端宏,对象为:spreadsheetReport,事件为:onBeforeOutput

function main(spreadsheetReport) {
    spreadsheetReport.printExpandedPositions();
    var sheet = spreadsheetReport.workbook.worksheets.get(0);
    if (sheet === "" || sheet === null) {
        return;
    }
    var counts = sheet.cells.maxDisplayRange.columnCount; //获取电子表格列数
    //sheet.autoFitColumns(5, counts); //从0开始,到counts列结束。
    //sheet.autoFitColumn(3); //只对某列进行自适应,第一列为0
}

九、年季度当月近七天切换时间维度展示报表及地图下钻返回

1、展示效果

​ 如下图所示:实现的效果是:打开报表页面默认显示当月,报表数据全部按时间维度进行统计,但可以切换时间维度为本季度或者今年,当日期类型为自定义时,默认显示当天。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第58张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第59张图片

​ 如下图所示:实现的效果是:打开报表页面默认显示省级行政单位,点击地图可以实现地图下钻且让右边的表格也跟随地图一起下钻,且下钻后所得图形依然展示在本报表的同一个线框位置中,而且可以返回下钻前的状态。

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第60张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第61张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第62张图片

2、参数的创建

​ 报表顶端日期类型参数的设置,因顶端日期类型的切换只包含今年,本季,当月,近7天,自定义,且默认显示当月,所以在备选值区域将五种依次列出,并在默认值区域将当月设置为默认。注意此处日期类型的控件类型采用:平铺勾选面板,列数为:5。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第63张图片
​ 今年参数:备选值区域设置为从查询数据的数据表中查询出的时间字段,并在默认区设置打开报表时默认显示为今年即从查询数据的数据表中查询出最大的那个时间字段。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第64张图片

​ 本季参数:备选值区域设置需要切换的4个不同季度时间维度,将这4个季度依次列出,并在默认区设置打开报表时默认显示为本季度。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第65张图片
​ 月份参数:备选值区域设置需要切换的12个不同月份时间维度,将这12个月份依次列出,并在默认区设置打开报表时默认显示为本月份。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第66张图片
​ 开始时间参数:因顶端日期类型的切换为今年时,开始时间为当年的一月一日,切换为本季时,开始时间为当前季度的第一天开始(如二季度为四月一日),切换为当月时,开始时间为当月的一号,切换为近7天时,开始时间为当天向前推6天,切换为自定义时,开始时间为当天,且默认显示当月,所以在备选值区域对5种不同选择进行判断。注意此处开始时间参数的控件类型采用:日期控件。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第67张图片

​ 开始日期参数,其中‘^’里面的是提前设置好的上述日期类型参数。

select date_sub(curdate(), interval 0 day)  当日 from dual  where  '^P_PARAM.ucismodelsjk.\public\日期类型^'  = '自定义'
UNION ALL
select date_sub(CURDATE(), interval 6 day)  近七天  from dual  where  '^P_PARAM.ucismodelsjk.\public\日期类型^'  = '近7天'
UNION ALL 
select date_add(curdate(), interval - day(curdate()) + 1 day)  当月 from dual  where   '^P_PARAM.ucismodelsjk.\public\日期类型^' = '当月'
UNION ALL
select  DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY)  今年 from dual  where '^P_PARAM.ucismodelsjk.\public\日期类型^' = '今年'
UNION ALL
SELECT CONCAT(DATE_FORMAT(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM  CURDATE()),1) + INTERVAL QUARTER(CURDATE())*3-3 MONTH),'%Y-%m-'),'01') 季度 from dual where '^P_PARAM.ucismodelsjk.\public\日期类型^' = '本季'

​ 结束时间参数:直接提取当前天即可,注意此处结束时间参数的控件类型采用:日期控件。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第68张图片
​ 省份参数:直接提取数据表中的省份即可,控件类型采用:下拉框控件。注意:城市参数与省份参数一样。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第69张图片

3、原生SQL数据集的创建

​ 省份分布数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为省份一级的地图,因统计时间按年度,季度,月度,近七天,自定义五个之间切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的当月)。

SELECT  
PROVINCE_NAME  省份名称,
CITY_NAME  市名称,
DIST_NAME  县区名称,
'广东' 目的地,
SUM(SEXRS)   人数      
FROM T_DWV_IN_OUT_HZFX_HZLY
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间'  end)
AND  {[DEPT_NAME  =   ^P_PARAM.CHMS.科室参数^ ]}   
AND   DATA_TYPE = 'OUT'  
GROUP BY PROVINCE_NAME,CITY_NAME,DIST_NAME

​ 城市分布数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为城市一级的地图,因统计时间按年度,季度,月度,近七天,自定义五个之间切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的当月)。

SELECT  
PROVINCE_NAME  省份名称,
CITY_NAME  市名称,
DIST_NAME  县区名称,
'广东' 目的地,
SUM(SEXRS)   人数      
FROM T_DWV_IN_OUT_HZFX_HZLY
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间' end)
AND  {[DEPT_NAME  =   ^P_PARAM.CHMS.科室参数^ ]}   
AND   DATA_TYPE = 'OUT'   AND
PROVINCE_NAME in  ('^P_PARAM.CHMS.省份参数^' )  
GROUP BY PROVINCE_NAME,CITY_NAME,DIST_NAME

​ 县区分布数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形为县区一级的地图,因统计时间按年度,季度,月度,近七天,自定义五个之间切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的当月)。

SELECT  
PROVINCE_NAME  省份名称,
CITY_NAME  市名称,
DIST_NAME  县区名称,
'广东' 目的地,
SUM(SEXRS)   人数      
FROM T_DWV_IN_OUT_HZFX_HZLY
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间' end)
AND  {[DEPT_NAME  =   ^P_PARAM.CHMS.科室参数^ ]}     
AND   DATA_TYPE = 'OUT'   AND
PROVINCE_NAME in  ('^P_PARAM.CHMS.省份参数^')    and
CITY_NAME  in  ( '^P_PARAM.CHMS.城市参数^' )  
GROUP BY PROVINCE_NAME,CITY_NAME,DIST_NAME

​ 注意右侧表格为另一个数据集,也是分为省份,城市,县区三个数据集,这三个数据集与地理分布相似。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第70张图片
​ 初诊复诊趋势分布数据集,用此数据集生成初诊复诊情况双Y联合图。其中‘^’里面的是提前设置好的参数,因统计时间按年度,季度,月度,近七天,自定义五个之间切换时,整个报表页面内容会跟着切换,所以需要借助case when判断语句,对时间维度的选取进行判断,并将整个作为数据集展示的最终维度(如此处的日期)。

SELECT  ( case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then MONTH_YEAR
when '本季' then  MONTH_YEAR
when '当月' then  DATE_FORMAT(DATE_DAY,'%Y-%m-%d') 
else DATE_FORMAT(DATE_DAY,'%Y-%m-%d')  end) AS 日期,
SUM(LY_CZRC)   初诊人次,SUM(LY_FZRC)   复诊人次,SUM(LY_JZZRC)   就诊总人次,
ROUND(case when SUM(LY_JZZRC)=0 then 0 else SUM(LY_FZRC) * 100  / SUM(LY_JZZRC) end,2)  '复诊率'
FROM  T_DWV_IN_OUT_HZFX_HZLY   
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间'  end)
AND  {[DEPT_NAME  =   ^P_PARAM.CHMS.科室参数^ ]}     
AND   DATA_TYPE = 'OUT'   AND
GROUP BY   ( case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then MONTH_YEAR
when '本季' then  MONTH_YEAR
when '当月' then  DATE_FORMAT(DATE_DAY,'%Y-%m-%d') 
else DATE_FORMAT(DATE_DAY,'%Y-%m-%d')  end)

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第71张图片

4、Excel制作报表并设置参数排版

​ 分别制作省份,城市,县区三个报表,注意将地理分布及其右侧的表格一一对应放在同一个报表里。并将三个报表的参数全部设置隐藏。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第72张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第73张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第74张图片
​ 在设置单元格格式功能下,选择自定义设置患者地域分布右侧的表格数据内容显示上升为绿色,下降为红色,采用的是excel自带的函数:[绿色]0.00%↑;[红色]0.00%↓;0.00%。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第75张图片

5、上钻下钻的跳转规则创建

​ 对省级报表新建下钻城市的跳转规则,对城市报表新建下钻县区的跳转规则,且要新建返回省级报表的跳转规则,对县区报表新建返回城市的跳转规则。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第76张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第77张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第78张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第79张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第80张图片

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第81张图片

6、URL控件链接创建

​ 借助URL控件将省份报表链接到报表相应位置。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第82张图片

7、默认显示当月隐藏季度及年度参数宏代码(JS)的创建

​ 名称为:时间参数切换,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function main(spreadsheetReport, isAjaxRefreshCallback) {
  //控制参数显示隐藏
    var value = spreadsheetReport.getParameterValue("日期类型");    //获取“区域”参数的值
    if (value == '今年') {                                    //若值等于“华北”,则设置“目录”参数隐藏
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '本季'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '当月'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '近7天' || value == '自定义'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = '';
    }
    
    // spreadsheetReport.elem_param.style.textAlign = "center";
    // //使用虚拟表格单元的办法,将参数面板虚拟成一个单元格,然后让单元格居中。
    // spreadsheetReport.elem_param.style.display = "table-cell";
    // var td = spreadsheetReport.elem_param.parentNode;
    // td.setAttribute('align', "right");

    // var paramTable = spreadsheetReport.paramPanelObj.layoutTable; //获取到参数面板
    // var cell;
    // cell = paramTable.rows[0].cells[0]; //获取到参数面板上具体的单元格位置,从0从开始计算,这里代表的是第一行第一列的单元格位置
    // cell.style.display = "table-cell";
    // var td1 = spreadsheetReport.elem_param.parentNode;
    // td1.setAttribute('align', 'left'); //设置参数面板字体颜色
    
}

​ 名称为:sheet页标签颜色设置,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function main(spreadsheetReport) {
    //debugger;
    var index = spreadsheetReport.currentSheetIndex;
    var tdsheets = spreadsheetReport.elemTdSheets.firstChild;
    if (tdsheets) {
         
        var child = tdsheets.firstChild.firstChild.firstChild;
        if(child)
        {
            //alert(index);
                 
                for(var i=0;i<child.childNodes.length;i++){
                    if(i==index){
                        child.childNodes[index].style.backgroundColor= "#62a9ff";//设置当前sheet页标签背景色
                    }else{
                         child.childNodes[i].style.backgroundColor = "";//重置非当前sheet页的样式
                    }
                }
            }
        }
}

十、同一线框中表格联动图形且点刷新即可返回

1、展示效果

​ 如下图所示:实现的效果是:打开报表页面默认显示所有科室的医生排名,点击左边各个科室可以联动右边柱图来展示当前点击的那个科室下的医生信息,且下拉框变成点击的科室名称,且点击刷新返回默认的全部。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第83张图片

2、参数的创建

​ 报表顶门诊收入科室1参数的设置,备选值框中查询出数据表中所有科室并用刷新代替全部,并在默认值区域查询出刷新和全部两个内容。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第84张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第85张图片

3、原生SQL数据集的创建

​ 科室收入排名及明细数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成左边的科室排名表格,注意此处没用使用门诊收入科室1参数。

SELECT 
DEPT_CODE  科室代码,DEPT_NAME 科室名称,SUM(KSZSR)  科室总收入,
SUM(TQ_KSZSR)  同比_同期科室总收入,SUM(HQ_KSZSR)  环比_环期科室总收入,SUM(YPSR)  药品收入,
SUM(JYSR)  检验收入,SUM(JCSR)  检查收入,SUM(SSSR)  手术收入,SUM(HCSR)  耗材收入,
SUM(ZCSR) 诊查收入,SUM(HLSR)  护理收入,SUM(CWSR)  床位收入,SUM(ZLSR)  治疗收入,
SUM(QTSR)  其他收入
FROM  T_DWV_OUT_SRFX_KSSR
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间'  end)
GROUP BY DATE_DAY, DEPT_CODE, DEPT_NAME 

​ 医生收入排名数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成右侧医生收入排名条形图,注意此处需要使用门诊收入科室1参数。

SELECT 
DEPT_CODE   科室代码,DEPT_NAME   科室名称,YSGH  医生工号,YSXM  医生姓名,
SUM(YSZSR)  医生总收入
FROM  T_DWV_OUT_SRFX_KSYSSR
WHERE 1=1
and  (DEPT_NAME = '^P_PARAM.CHMS.门诊收入科室1^'  or '^P_PARAM.CHMS.门诊收入科室1^' = "刷新")
and (case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间'  end)
GROUP BY DEPT_CODE , DEPT_NAME  ,YSGH, YSXM

SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第86张图片

4、Excel制作报表并设置参数排版

​ 因在左边的科室收入排名及明细表格中点科室名称可以联动右边条形图,所以在表格作图的sheet页点单位格传值下拉箭头并点传值按钮,然后点添加按钮,单元格的影响目标选择主报表页(门急诊收入)将表格照相机拷贝过去存放的位置,注意那个位置需将存表格的单元格合并,参数选择门诊收入科室1。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第87张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第88张图片
​ 到此同一线框中表格联动图形且点刷新即可返回的报表功能设置完毕。

十一、上级报表切换为下级报表且可导出下级表为excel文档

1、展示效果

​ 如下图所示:实现的效果是:单病种质量分析报表中的指标监测表点击右上端的导出即可全页跳转为指标监测表报表并将指标监测表自动下载excel文档,且也可以点击指标监测表报表的导出按钮下载excel文档,且点击指标监测表报表的返回上一级按钮返回为单病种质量分析报表。且跳转后依然叫单病种质量分析报表。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第89张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第90张图片
​ 如下图所示:实现的效果是:指标监测表报表中点返回上一级按钮即可返回,且点击导出按钮即可导出excel文档。且返回上一级报表后依然叫指标检测表报表。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第91张图片

2、原生SQL数据集的创建

​ 平均住院时长及等待时长趋势数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成平均住院天数趋势和术前平均等待时间趋势图两个折线图。

SELECT  
 (case  '^P_PARAM.CHMS.日期类型^'
when '今年' then MONTH_YEAR
when '本季' then  MONTH_YEAR
when '当月' then  DATE_FORMAT(DATE_DAY,'%Y-%m-%d') 
else DATE_FORMAT(DATE_DAY,'%Y-%m-%d')  end) AS '月日',
SUM(JBZLS)  '疾病总例数',SUM(JBSWLS)  '疾病死亡例数',SUM(ZYZTS)  '住院总天数',SUM(CYLS)  '出院例数',
ROUND(case when SUM(CYLS)=0 then 0 else SUM(ZYZTS)  / SUM(CYLS) end,2)  '平均住院天数',
SUM(SQDHSJ)  '术前等待时间',SUM(JBSSZLS)  '疾病手术总例数',
ROUND(case when SUM(JBSSZLS)=0 then 0 else SUM(SQDHSJ)  / SUM(JBSSZLS) end,2)  '术前平均等待时间'
FROM T_DWV_QY_DBZZL_ZLFX
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间' end)
GROUP BY   ( case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then MONTH_YEAR
when '本季' then  MONTH_YEAR
when '当月' then  DATE_FORMAT(DATE_DAY,'%Y-%m-%d') 
else DATE_FORMAT(DATE_DAY,'%Y-%m-%d')  end)

​ 住院指标检测各汇总及比率数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成单病种质量分析报表中的指标监测表格和指标监测表报表整个报表,即他们共用此数据集。

SELECT  
JBMC  '疾病名称',JBBM   '疾病编码',SUM(JBZLS)  '疾病总例数',SUM(JBSWLS)  '疾病死亡例数',
SUM(CYLS)  '出院例数',SUM(DBZHXDBZBS)  '单病种核心达标指标数',
SUM(DBZFHXDBZBS)  '单病种非核心达标指标数',SUM(ZBZZZBS)  '单病种总指标数',
ROUND(case when SUM(ZBZZZBS)=0 then 0 else SUM(DBZHXDBZBS)  / SUM(ZBZZZBS) end,4)  '核心监测指标达标率',
ROUND(case when SUM(ZBZZZBS)=0 then 0 else SUM(DBZFHXDBZBS)  / SUM(ZBZZZBS) end,4)  '非核心监测指标达标率',SUM(ZYZTS)  '住院总天数',
ROUND(case when SUM(CYLS)=0 then 0 else SUM(ZYZTS)  / SUM(CYLS) end,2)  '平均住院天数',
SUM(ZYFY)  '住院费用',
ROUND(case when SUM(CYLS)=0 then 0 else SUM(ZYFY)  / SUM(CYLS) end,2)  '平均住院费用',
SUM(ZYYF)  '住院药费',
ROUND(case when SUM(CYLS)=0 then 0 else SUM(ZYYF)  / SUM(CYLS) end,2)  '平均住院药费',
SUM(SSZLFY)  '手术治疗费用',SUM(JBSSZLS)  '疾病手术总例数',
ROUND(case when SUM(JBSSZLS)=0 then 0 else SUM(SSZLFY)  / SUM(JBSSZLS) end,2)  '平均手术治疗费用',
SUM(YCXYYCLFY)  '一次性医用材料费用',
ROUND(case when SUM(CYLS)=0 then 0 else SUM(YCXYYCLFY)  / SUM(CYLS) end,2)  '平均一次性医用材料费用'
FROM T_DWV_QY_DBZZL_ZLFX
where 1=1 and (
case  '^P_PARAM.CHMS.日期类型^' 
when '今年' then DATE_YEAR =  '^P_PARAM.CHMS.年份^' 
when '本季' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and  QUARTER_CHN=  '^P_PARAM.CHMS.季度' 
when '当月' then  DATE_YEAR =  '^P_PARAM.CHMS.年份' and MONTH_CHN =  '^P_PARAM.CHMS.月份'  
else DATE_DAY>= '^P_PARAM.CHMS.开始时间' and DATE_DAY <= '^P_PARAM.CHMS.结束时间' end)
GROUP BY JBMC,JBBM
3、Excel中将数据集字段一一拖拽后设置过滤

​ 将数据集字段拖拽过来后一一依据疾病编码设置相应过滤即可。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第92张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第93张图片

4、默认显示当月隐藏季度及年度参数及导出宏代码(JS)的创建

​ 单病种质量分析报表中的宏代码。

​ 名称为:导出,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

function main(spreadsheetReport, isAjaxRefreshCallback) {
    //创建传值对象数组
    var paramsInfo = [];
    paramsInfo.push({ name:"开始日期",value:spreadsheetReport.getParamValue("开始日期"),displayValue:spreadsheetReport.getParamDisplayValue("开始日期")});
    paramsInfo.push({ name:"结束时间",value:spreadsheetReport.getParamValue("结束时间"),displayValue:spreadsheetReport.getParamDisplayValue("结束时间")});
    paramsInfo.push({ name:"日期类型",value:spreadsheetReport.getParamValue("日期类型"),displayValue:spreadsheetReport.getParamDisplayValue("日期类型")});
    
    var srtjBackPic = spreadsheetReport.shapesMap["图片 6"];   //获取Excel中图片对象
    spreadsheetReport.addListener(srtjBackPic, "click",     //为其创建点击事件
        function() {
            var command = spreadsheetReport.command;    //获取当前报表对象
            command.close();                            //关闭当前报表
            command.execute('OPENWITHNOREFRESH', 'I8a80205d0177fc5cfc5cc0890178cfc891af7312'); //跳转至新报表(为指标检测表报表的节点ID,用属性知)
            var report = command.spreadsheetReport;     //获取新报表对象
            if (paramsInfo.length > 0) report.setParamsInfo(paramsInfo);    //判断传值对象中是否有值,有则赋值给新报表对象
            if(report.elem_trToolbar)report.elem_trToolbar.style.display = 'none';
            report.doRefresh();
        },
        this);
        
        
  //控制参数显示隐藏
    var value = spreadsheetReport.getParameterValue("日期类型");    //获取“日期类型”数参的值
    if (value == '今年') {                                    
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '本季'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '当月'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '近7天' || value == '自定义'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("年份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = '';
    }
    
}

​ 指标检测表报表中的宏代码。

​ 名称为:导出,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender


function main(spreadsheetReport) {
    
     // 获取电子表格参数面板
    var lastCell = spreadsheetReport.paramPanelObj;
    var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
    var i, cell, lastCell;
    // ============rows[0]:在参数同一行添加按钮,6表示第几列添加
    lastCell = paramTable.rows[0].insertCell(6);

    if (!spreadsheetReport._newBtn) {// 不重复添加按钮
        var input = document.createElement("INPUT");    //创建一个Element标签
        input.type = "button";      //设置标签属性为按钮
        input.value = "返回上一级"; //标签名称
        input.title = "返回上一级"; //悬浮显示名称
        input.style.width = "100";
        input.style.height = "70";
        //添加按钮控件
        var newBtn = lastCell.appendChild(input);
        //添加点击事件
        spreadsheetReport.addListener(input, "click", doNewButtonClick,
                spreadsheetReport);
        spreadsheetReport._newBtn = newBtn;
    }
    
    // debugger;
    // 新添加按钮Click事件处理函数
    function doNewButtonClick(e) {
        var command = spreadsheetReport.command;    //获取当前报表
        command.close();                            //关闭当前报表
        command.execute('OPENWITHNOREFRESH', 'I8a80205d0177fc5cfc5cc0890178b62bc37a532d');  //打开新报表(为单病种质量分析报表的节点ID)
        var report = command.spreadsheetReport;     //获取新报表对象
        report.doRefresh();                         //刷新新报表
    }
    
    //导出
    spreadsheetReport.doExportMenuCloseUp("EXCEL");
    
    var span = document.createElement("span");  //添加按钮之间的间隙:内容为2个空格
    span.innerHTML = "  ";
    
    
    //创建导出按钮
    var exportBtn = document.createElement("button");
    exportBtn.value = " 导出 "; //如需要修必按钮风格,请自行实现
    exportBtn.innerHTML = "导出";
    exportBtn.className = "query-button";
    //添加导出按钮之前,添加2个空格
    lastCell.appendChild(span);
    lastCell.appendChild(exportBtn);
    spreadsheetReport.addListener(exportBtn, "click",
    function() {
        //导出Excel方法
        spreadsheetReport.doExportMenuCloseUp("EXCEL");
    },
    this);
}

十二、图形报表与表格报表切换且均可导出excel文档

1、展示效果

​ 如下图所示:实现的效果是:打开报表页面默认当前年度的数据,而且日期类型时间维度默认为年,可以借助下拉框切换时间维度(注意:年时默认为当前年,切换为季度是默认当前年的第一季度,切换月度时默认为当前年的1月),而且可以借助图表切换按钮将现在的图形报表切换为表格报表,也可以借助导出按钮将图形报表或者表格报表直接导出,方便客户观看。点击导出按钮时即可将当前报表(图形报表或者表格报表)导出为excel文档,且导出的内容是根据时间类型维度或者展示模式筛选出的那些内容,并且导出的文档中无报表顶端的参数选项。而且电子报表报表是前两列及表头锁定,后面列可以借助滚动条拖动显示。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第94张图片
​ 如下图所示:实现的效果是:表格报表除了图形报表的导出及切换为图形报表外,还有展示模式的切换,展示模式的点选让表格报表在举办主体与区域社康间切换,通过设置展示模式参数,并将此参数运用到创建的数据集来实现。且打开报表时医院下属社康默认隐藏,点击’+'扩展按钮才会显示社康明细,且明细上面有个合计值,且冻结表头及前两列。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第95张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第96张图片

2、参数的创建

​ 报表中所有的参数都在顶端显示,日期类型与年度,季度,月度和第四点一致。展示模式点选参数,对表格报表展示的举办主体和区域社康间进行切换。此参数的控件类型采用平铺勾选面板形式。
在这里插入图片描述
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第97张图片

3、原生SQL数据集的创建

​ 图形报表的数据集创建如第四点,而电子表格报表数据集中,基本和第四点相同,只不过是添加了一个展示模式参数,其中‘^’里面的是提前设置好的参数,用此数据集生成的表格报表为健康档案走势_表格报表。

SELECT
o.P_ORGANIZCODE '医院ID',o.P_ORGANIZNAME '医院',ORG_CODE  '机构编码',o.ORGANIZNAME '机构名称',同比数据,环比数据,`DN_SUM` `本期数据`,`MAN_ALL` `男`,`WOMAN_ALL` `女`,
IFNULL(ORTHER_ALL,0) `其他`,
`ZERO_THERE` `0-3岁`,`ZERO_SIX` `0-6岁`,`FIFTEEN_UP` `15岁及以上`,`EIGHTEEN_UP` `18岁及以上`,
`THIRTY_FIVE_UP` `35岁及以上`,`SIXTY_FIVE_UP` `65岁及以上`,`XLQ` `学龄前`,`YLFN` `孕育妇女`,
`GXY` `高血压`,`TNB` `糖尿病`,`LNR` `老年人`,`ZJ_XJDN` `增加_新建档案`,
`ZJ_QRDN` `增加_迁入档案`,`JS_QCDN` `减少_迁出档案`,`JS_ZXDN` `减少_注销档案`,
`FILE_NUMBER` `动态档案数`,VISITOR_YEAR,VISITOR_YEAM,VISITOR_MONTH,
concat(VISITOR_YEAR,'年',VISITOR_MONTH,'月') `时间`,
STR_TO_DATE(concat(VISITOR_YEAM,'-01'),'%Y-%m-%d') `日期`,
o.ORG_SORT

FROM(SELECT  * from
V_ORG where ORGANIZCODE  in  ( '^P_PARAM.testbzk.jg_id^') AND ORG_COUSTOMR_TYPE= '^P_PARAM.testbzk.展示模式^') o

LEFT JOIN 
(SELECT t1.*,t2.同比数据,t3.环比数据
FROM (SELECT  * FROM `DM_HR_TREND` t WHERE
CASE  '^P_PARAM.testbzk.日期类型^' WHEN '1'  THEN VISITOR_MONTH=(select
max(VISITOR_MONTH) from DM_HR_TREND
where VISITOR_YEAR= '^P_PARAM.testbzk.年份^') and VISITOR_YEAR= '^P_PARAM.testbzk.年份^'
WHEN '2' THEN  VISITOR_MONTH=(select max(VISITOR_MONTH) from DM_HR_TREND where
QUARTER(CONCAT( VISITOR_YEAR  ,VISITOR_MONTH,'01' ))= '^P_PARAM.testbzk.季度^' and VISITOR_YEAR= '^P_PARAM.testbzk.年份^') and VISITOR_YEAR= '^P_PARAM.testbzk.年份^'
WHEN '3'  THEN VISITOR_YEAM =  CONCAT('^P_PARAM.testbzk.年份^','-','^P_PARAM.testbzk.月份^') ELSE 1=2 END AND  ORG_CODE IN ('^P_PARAM.testbzk.jg_id^')) t1
           
LEFT JOIN 
(SELECT `ORG_CODE`, DN_SUM AS 同比数据
FROM `DM_HR_TREND` t WHERE 
CASE  '^P_PARAM.testbzk.日期类型^' WHEN '1'  THEN  t.VISITOR_YEAR =  ''
WHEN '2' THEN VISITOR_MONTH=(select max(VISITOR_MONTH) from DM_HR_TREND
where QUARTER(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ))= '^P_PARAM.testbzk.季度^' AND VISITOR_YEAR= '^P_PARAM.testbzk.年份^'  -1) and VISITOR_YEAR= '^P_PARAM.testbzk.年份^' -1
WHEN '3'  THEN CONCAT(  t.VISITOR_YEAR ,t.VISITOR_MONTH )= DATE_FORMAT((CONCAT('^P_PARAM.testbzk.年份^'-1,'^P_PARAM.testbzk.月份^','01' )),'%Y%m')
ELSE 1=2 END AND ORG_CODE IN ('^P_PARAM.testbzk.jg_id^')) t2 ON t2.ORG_CODE = t1.ORG_CODE
           
LEFT JOIN
(SELECT t.`ORG_CODE`, DN_SUM AS 环比数据 
FROM `DM_HR_TREND` t WHERE
CASE WHEN '^P_PARAM.testbzk.日期类型^' ='1'  THEN VISITOR_MONTH=(
select max(VISITOR_MONTH) from DM_HR_TREND where VISITOR_YEAR= '^P_PARAM.testbzk.年份^' -1) and VISITOR_YEAR= '^P_PARAM.testbzk.年份^' -1
WHEN '^P_PARAM.testbzk.日期类型^' ='2' and '^P_PARAM.testbzk.季度^' ='1' 
THEN VISITOR_MONTH=(select max(VISITOR_MONTH) from DM_HR_TREND where QUARTER(DATE_SUB(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ),interval -1 QUARTER))= '^P_PARAM.testbzk.季度^' and VISITOR_YEAR= '^P_PARAM.testbzk.年份^' -1)
AND t.VISITOR_YEAR= '^P_PARAM.testbzk.年份^' -1
WHEN '^P_PARAM.testbzk.日期类型^' ='2' and '^P_PARAM.testbzk.季度^'  <>'1' 
THEN  VISITOR_MONTH=(select max(VISITOR_MONTH) from DM_HR_TREND where
QUARTER(DATE_SUB(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ),interval -1 QUARTER))= '^P_PARAM.testbzk.季度^' and VISITOR_YEAR= '^P_PARAM.testbzk.年份^')
AND t.VISITOR_YEAR= '^P_PARAM.testbzk.年份^'
WHEN '^P_PARAM.testbzk.日期类型^' ='3'  THEN CONCAT(  t.VISITOR_YEAR ,t.VISITOR_MONTH )= DATE_FORMAT(DATE_SUB(CONCAT('^P_PARAM.testbzk.年份^','^P_PARAM.testbzk.月份^','01' ), INTERVAL 1 MONTH),'%Y%m') ELSE 1=2 END AND ORG_CODE IN ('^P_PARAM.testbzk.jg_id^')) t3
ON t1.ORG_CODE = t3.ORG_CODE)a ON a.ORG_CODE =o.ORGANIZCODE ORDER BY ORG_SORT
4、Excel里设置参数排版及父格

​ 报表中展示模式,日期类型,年份,季度,月份参数都在顶端显示,参数排版下将这些参数依次排列,而机构ID是默认隐藏。需要采用冻结窗口将前两列冻结。结合数据集及excel自带公式将各种数值算出,另外最终可以展开收缩的原因,1是因为报表宏的控制,2是受父格的影像,如图:2级父格是1级父格的子级,随1级父格而扩展,而3级子格随2级父格扩展,从而体现层级关系。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第98张图片

5、查询导出及图表切换等宏代码(JS)的创建

​ 图形报表与表格报表的宏代码基本相同,不同之处在于刷新宏,报表报表多一个折叠部分,及查询按钮中的图形切换按钮功能里面节点ID书写的先后方式。

​ 名称为:刷新,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

var udchmUtils = use("system.utils.udchmUtils");

function main(spreadsheetReport) {
    var smartbiParams =getSmartbiParams(spreadsheetReport);
    window.parent.postMessage(smartbiParams,udchmUtils.getVueIP());
     //控制参数显示隐藏
        var value = spreadsheetReport.getParameterValue("日期类型_公共卫生"); //获取“区域”参数的值
        if (value == '1') {   //若值等于“华北”,则设置“目录”参数隐藏
            spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        }else if(value == '2'){
            spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        }else if(value == '3'){
            spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = '';}
/*构造收起展开模块,注意此部分为健康档案走势表格报表独有,其对应的图形报表去除此部分即可*/
    var CollapsableSpreadsheetReport = jsloader.resolve("smartbi.spreadsheetreport.CollapsableSpreadsheetReport");
    var collapsableSpreadsheetReport = new CollapsableSpreadsheetReport();
    //设置列折叠的属性为null,如果只有行折叠,那么此项必须这么设置
    collapsableSpreadsheetReport.columnHeader = null;
    //行合并开始行,从0开始计数,示例中从第4行开始,因此值为3
    collapsableSpreadsheetReport.rowHeader.fromRow = 3;
    //行合并开始列,从0开始计数,示例中B列需要有合并的效果,因此起始列为值为1
    collapsableSpreadsheetReport.rowHeader.fromColumn = 0;
    //行合并结束列,从0开始计数,实例中只有B列需要有合并的效果,因此结束列也为B列,值为1
    collapsableSpreadsheetReport.rowHeader.toColumn = 0;
    //行合并区域中,小计放最后,即收起时保留最后一行。如果为true时,收起时保留第一行
    collapsableSpreadsheetReport.rowHeader.subtotalFirst = true;
    collapsableSpreadsheetReport.rowHeader.collapseAll = true;    //设置默认收起
    collapsableSpreadsheetReport.render(spreadsheetReport);
}
function getSmartbiParams(spreadsheetReport){
      var value = spreadsheetReport.getParameterValue("日期类型_公共卫生");  
      var smartbiParams = [
            {name: "resid", value: spreadsheetReport.queryId ,displayValue:''},
            {name: "日期类型_公共卫生", value: spreadsheetReport.getParamValue("日期类型_公共卫生"),displayValue:spreadsheetReport.getParamDisplayValue("日期类型_公共卫生")},
            {name: "jg_id", value: spreadsheetReport.getParamValue("jg_id"),displayValue:spreadsheetReport.getParamDisplayValue("jg_id")},
            {name: "展示模式", value: spreadsheetReport.getParamValue("展示模式"),displayValue:spreadsheetReport.getParamDisplayValue("展示模式")}]
      if (value == '1') {   
          smartbiParams.push({name: "健康档案走势_年份", value: spreadsheetReport.getParamValue("健康档案走势_年份"),displayValue:spreadsheetReport.getParamDisplayValue("健康档案走势_年份")});
        }else if(value == '2'){
          smartbiParams.push({name: "健康档案走势_年份", value: spreadsheetReport.getParamValue("健康档案走势_年份"),displayValue:spreadsheetReport.getParamDisplayValue("健康档案走势_年份")});
          smartbiParams.push({name: "季度", value: spreadsheetReport.getParamValue("季度"),displayValue:spreadsheetReport.getParamDisplayValue("季度")});
        }else if(value == '3'){
          smartbiParams.push({name: "健康档案走势_年份", value: spreadsheetReport.getParamValue("健康档案走势_年份"),displayValue:spreadsheetReport.getParamDisplayValue("健康档案走势_年份")});
          smartbiParams.push({name: "家庭医生_月份", value: spreadsheetReport.getParamValue("家庭医生_月份"),displayValue:spreadsheetReport.getParamDisplayValue("家庭医生_月份")});
         }
         return JSON.stringify(smartbiParams);     
    }  

​ 名称为:参数切换,类型为:客户端宏,对象为:spreadsheetReport,事件为:onParamValueChanged

var udchmUtils = use("system.utils.udchmUtils");

function main(spreadsheetReport, param) {
    var smartbiParams =getSmartbiParams(spreadsheetReport);
    window.parent.postMessage(smartbiParams, udchmUtils.getVueIP());
    //控制参数显示隐藏
    var value = spreadsheetReport.getParameterValue("日期类型_公共卫生");    //获取“区域”参数的值
    if (value == '1') {      //若值等于“华北”,则设置“目录”参数隐藏
        spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
    }else if(value == '2'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
    }else if(value == '3'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = '';
    }
}
 function getSmartbiParams(spreadsheetReport){
      var value = spreadsheetReport.getParameterValue("日期类型_公共卫生");  
      var jsonArry = [
            {name: "resid", value: spreadsheetReport.queryId ,displayValue:''},
            {name: "日期类型_公共卫生", value: spreadsheetReport.getParamValue("日期类型_公共卫生"),displayValue:spreadsheetReport.getParamDisplayValue("日期类型_公共卫生")},
            {name: "jg_id", value: spreadsheetReport.getParamValue("jg_id"),displayValue:spreadsheetReport.getParamDisplayValue("jg_id")},
            {name: "展示模式", value: spreadsheetReport.getParamValue("展示模式"),displayValue:spreadsheetReport.getParamDisplayValue("展示模式")}]
       if (value == '1') {   
           jsonArry.push({name: "健康档案走势_年份", value: spreadsheetReport.getParamValue("健康档案走势_年份"),displayValue:spreadsheetReport.getParamDisplayValue("健康档案走势_年份")});
        }else if(value == '2'){
            jsonArry.push({name: "健康档案走势_年份", value: spreadsheetReport.getParamValue("健康档案走势_年份"),displayValue:spreadsheetReport.getParamDisplayValue("健康档案走势_年份")});
            jsonArry.push({name: "季度", value: spreadsheetReport.getParamValue("季度"),displayValue:spreadsheetReport.getParamDisplayValue("季度")});
        }else if(value == '3'){
            jsonArry.push({name: "健康档案走势_年份", value: spreadsheetReport.getParamValue("健康档案走势_年份"),displayValue:spreadsheetReport.getParamDisplayValue("健康档案走势_年份")});
            jsonArry.push({name: "家庭医生_月份", value: spreadsheetReport.getParamValue("家庭医生_月份"),displayValue:spreadsheetReport.getParamDisplayValue("家庭医生_月份")});
        }
         return JSON.stringify(jsonArry);        
    }  

​ 名称为:查询,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport

var indicatorExplan = use("system.utils.IndicatorExplan");
var udchmUtils = use("system.utils.udchmUtils");

function main(spreadsheetReport, spreadsheetReportContext) {
    var smartbiParams = getSmartbiParams(spreadsheetReport);
    window.parent.postMessage(smartbiParams, udchmUtils.getVueIP());
    if (!spreadsheetReport.paramPanelObj) return;
    try {
        //获取参数面板表格
        var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
        var i, cell, lastCell, lastCellLength;
        //控制参数显示隐藏
        var value = spreadsheetReport.getParameterValue("日期类型_公共卫生"); //获取“区域”参数的值
        if (value == '1') { //若值等于“华北”,则设置“目录”参数隐藏
            spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        } else if (value == '2') {
            spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        } else if (value == '3') {
            spreadsheetReport.paramPanelObj.getParamTagByParamName("健康档案走势_年份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = '';
        }
        // 添加空格
        var span2 = document.createElement("span2");
        span2.innerHTML = "  ";
        lastCell = paramTable.rows[0].insertCell(paramTable.rows.length + 3);
        //创建查询按钮
        var queryBtn = document.createElement("button");
        queryBtn.value = " 查询 "; //如需要修必按钮风格,请自行实现
        queryBtn.innerHTML = "查询";
        queryBtn.className = "query-button";
        lastCell.appendChild(span2);
        lastCell.appendChild(queryBtn);
        spreadsheetReport.addListener(queryBtn, "click",
            function() {
                //刷新页面
                spreadsheetReport.doRefresh();
            },
            this);
        // 添加空格
        var span = document.createElement("span");
        lastCell.appendChild(span);
        span.innerHTML = "  ";
        //创建导出按钮
        var exportBtn = document.createElement("button");
        exportBtn.value = " 导出 "; //如需要修必按钮风格,请自行实现
        exportBtn.innerHTML = "导出";
        exportBtn.className = "query-button";
        lastCell.appendChild(exportBtn);
        spreadsheetReport.addListener(exportBtn, "click",
            function() {
                //导出Excel方法
                spreadsheetReport.doExportMenuCloseUp("EXCEL");
            },
            this);
        // 添加空格
        var span1 = document.createElement("span1");
        lastCell.appendChild(span1);
        span1.innerHTML = "  ";
        //创建图形切换按钮
        lastCellLength = paramTable.rows.length + 4;
        lastCell = paramTable.rows[0].insertCell(lastCellLength);
        var swithBtn = document.createElement("button");
        swithBtn.value = " 图表切换 "; //如需要修必按钮风格,请自行实现
        swithBtn.innerHTML = "图表切换";
        swithBtn.className = "query-button";
        lastCell.appendChild(swithBtn);
        spreadsheetReport.addListener(swithBtn, "click",
            function() {
                var paramsInfo = [];
                paramsInfo.push({
                    name: "日期类型_公共卫生",
                    value: paramToString(spreadsheetReport.getParamValue("日期类型_公共卫生")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("日期类型_公共卫生"))
                });
                paramsInfo.push({
                    name: "健康档案走势_年份",
                    value: paramToString(spreadsheetReport.getParamValue("健康档案走势_年份")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("健康档案走势_年份"))
                });
                paramsInfo.push({
                    name: "jg_code",
                    value: paramToString(spreadsheetReport.getParamValue("jg_code")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("jg_code"))
                });
                paramsInfo.push({
                    name: "jg_type",
                    value: paramToString(spreadsheetReport.getParamValue("jg_type")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("jg_type"))
                });
                paramsInfo.push({
                    name: "jg_id",
                    value: paramToString(spreadsheetReport.getParamValue("jg_id")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("jg_id"))
                });
                paramsInfo.push({
                    name: "季度",
                    value: paramToString(spreadsheetReport.getParamValue("季度")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("季度"))
                });
                paramsInfo.push({
                    name: "家庭医生_月份",
                    value: paramToString(spreadsheetReport.getParamValue("家庭医生_月份")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("家庭医生_月份"))
                });
                paramsInfo.push({
                    name: "展示模式",
                    value: paramToString(spreadsheetReport.getParamValue("展示模式")),
                    displayValue: paramToString(spreadsheetReport.getParamDisplayValue("展示模式"))
                });
                var command = spreadsheetReport.command;
                command.close();
                command.execute('OPENWITHNOREFRESH', 'Iff8080810171f2bcf2bcc90e0172087f8dae5b14');
            //健康档案走势_图形报表的节点ID
                var report = command.spreadsheetReport;
                if (paramsInfo.length > 0) report.setParamsInfo(paramsInfo);
                if (report.elem_trToolbar) report.elem_trToolbar.style.display = 'none';
                report.doRefresh();
            },
            this);
        indicatorExplan.addIndicatorExplan(spreadsheetReport, document, lastCell);
    } catch (e) {
        alert('更新查询、导出按钮位置失败:' + e.message);
    }
}
function paramToString(v) {
    return v == null ? null : v.toString();
}
function getSmartbiParams(spreadsheetReport) {
    var value = spreadsheetReport.getParameterValue("日期类型_公共卫生");
    var smartbiParams = [{
        name: "resid",
        value: 'Iff8080810171f2bcf2bcc90e0172124ddbae4af7',
        //健康档案走势_表格报表的节点ID
        displayValue: ''
    }, ]
    return JSON.stringify(smartbiParams);
}
6、展示效果

​ 如下图所示:实现的效果是:打开报表页面默认当前年度的数据,而且日期类型时间维度默认为年,可以借助下拉框切换时间维度(注意:年时默认为当前年,切换为季度是默认当前年的第一季度,切换月度时默认为当前年的1月,自定义时默认为今天),而且可以借助图表切换按钮将现在的图形报表切换为表格报表,其中表格报表可以借助导出按钮将报表直接导出,方便客户观看。点击导出按钮时即可将当前表格报表导出为excel文档,且导出的内容是根据时间类型维度或者展示模式筛选出的那些内容,并且导出的文档中无报表顶端的参数选项。另外图形报表还含有联动下钻功能,从医院下钻到这家医院的下属社康,且默认显示为医院,下钻到社康后,依然在同一个区域显示,这就需要这同一个作图区域内设计两个图形,且将两个图形叠加在一起,在社康图形数据集中将医院ID参数所为筛选条件,并在医院双Y联合图中借助数据传值设置将医院ID参数运用到参数作用域中,并借助报表宏设置联动下钻后的返回按钮。无论是图形报表还是表格报表均含有展示模式的切换的功能,展示模式的点选让报表在举办主体与区域社康间切换,通过设置展示模式参数,并将此参数运用到创建的数据集来实现。且打开报表时医院下属社康默认隐藏。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第99张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第100张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第101张图片

7、原生SQL数据集的创建

​ 图形报表的数据集创建和上述第2点相同,只不过图形报表也含有展示模式参数而已,且日期类型多了一个自定义。其中‘^’里面的是提前设置好的参数,用此数据集生成的图形报表为检查人才统计_图报表。

​ 检查人才申请单位_医院数据集,生成医院的双Y联合图。

SELECT
t.P_ORGANIZCODE '医院ID',
t.P_ORGANIZNAME '医院',
sum(CHECK_APPLY) as 检查申请单数,
sum(CHECK_REPORT) as 检查报告单数
from
(SELECT * from V_ORG where ORGANIZCODE in  ( '^P_PARAM.testbzk.jg_id^')
AND ORG_COUSTOMR_TYPE= '^P_PARAM.testbzk.展示模式^' 
and  '^P_PARAM.testbzk.日期类型^' in ('2','3'))t

left join
(select ORG_CODE ,VISITOR_YEAR,VISITOR_MONTH,VISITOR_YEAM,CHECK_APPLY,CHECK_REPORT
FROM DM_CHECK_TIMES_MONTH WHERE
CASE WHEN '^P_PARAM.testbzk.日期类型^' ='2' AND '^P_PARAM.testbzk.季度^'='1' THEN  QUARTER(DATE_SUB(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ),interval -1 QUARTER))=  '1' AND VISITOR_YEAR= '^P_PARAM.testbzk.年份^' - 1
WHEN '^P_PARAM.testbzk.日期类型^' ='2' AND '^P_PARAM.testbzk.季度^'<>'1' THEN  QUARTER(DATE_SUB(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ),interval -1 QUARTER))= '^P_PARAM.testbzk.季度^' AND VISITOR_YEAR= '^P_PARAM.testbzk.年份^'
WHEN '^P_PARAM.testbzk.日期类型^' ='3'  THEN VISITOR_YEAM = DATE_FORMAT(DATE_SUB(CONCAT(   '^P_PARAM.testbzk.年份^' ,'^P_PARAM.testbzk.月份^','01' ), INTERVAL 1 MONTH),'%Y-%m')
ELSE 1=2 END AND ORG_CODE IN ( '^P_PARAM.testbzk.jg_id^')) a 
ON t.`ORGANIZCODE`=a.ORG_CODE GROUP BY P_ORGANIZCODE 

union
SELECT t.P_ORGANIZCODE '医院ID',t.P_ORGANIZNAME '医院',sum(CHECK_APPLY) as 检查申请单数,
sum(CHECK_REPORT) as 检查报告单数 from
(SELECT * from V_ORG where ORGANIZCODE in  ( '^P_PARAM.testbzk.jg_id^')
AND ORG_COUSTOMR_TYPE= '^P_PARAM.testbzk.展示模式^' 
and '^P_PARAM.testbzk.日期类型^' in ('1','4'))t

left join
(select ORG_CODE ,VISITOR_YEAR,VISITOR_MONTH,VISITOR_YEAM,CHECK_APPLY,CHECK_REPORT
FROM DM_CHECK_TIMES_DAY WHERE
CASE WHEN  '^P_PARAM.testbzk.日期类型^'= '1'  THEN  VISITOR_YEAR = '^P_PARAM.testbzk.年份^'
WHEN  '^P_PARAM.testbzk.日期类型^'= '4'  THEN  VISITOR_DATE  >= '^P_PARAM.testbzk.开始日期^'
and   VISITOR_DATE <= '^P_PARAM.testbzk.结束日期^' ELSE 1=2 END
AND ORG_CODE IN ( '^P_PARAM.testbzk.jg_id^')) a ON t.`ORGANIZCODE`=a.ORG_CODE
GROUP BY P_ORGANIZCODE 

​ 检查人才申请单位_社康数据集,生成社康的双Y联合图。

SELECT
t.P_ORGANIZCODE '医院ID',
t.P_ORGANIZNAME '医院',
ORG_CODE  '机构编码',
t.ORGANIZNAME '机构名称',
sum(CHECK_APPLY)      '检查申请单数',
sum(CHECK_REPORT)     '检查报告单数'

from
(SELECT * from V_ORG
where P_ORGANIZCODE in  ( '^P_PARAM.testbzk.申请单数_医院ID^') AND ORG_COUSTOMR_TYPE=  '^P_PARAM.testbzk.展示模式^' and  '^P_PARAM.testbzk.日期类型^' in ('2','3'))t

left join
(select ORG_CODE,VISITOR_YEAR,VISITOR_MONTH,VISITOR_YEAM,
CHECK_APPLY as CHECK_APPLY,CHECK_REPORT as CHECK_REPORT
FROM DM_CHECK_TIMES_MONTH
WHERE CASE WHEN  '^P_PARAM.testbzk.日期类型^' ='2' AND '^P_PARAM.testbzk.季度^'='1' THEN  QUARTER(DATE_SUB(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ),interval -1 QUARTER))= '1'
AND VISITOR_YEAR= '^P_PARAM.testbzk.年份^' - 1
 
WHEN  '^P_PARAM.testbzk.日期类型^' ='2' AND '^P_PARAM.testbzk.季度^'<>'1' THEN  QUARTER(DATE_SUB(CONCAT(VISITOR_YEAR  ,VISITOR_MONTH,'01' ),interval -1 QUARTER))=  '^P_PARAM.testbzk.季度^' AND VISITOR_YEAR= '^P_PARAM.testbzk.年份^'
 
WHEN '^P_PARAM.testbzk.日期类型^'  ='3'  THEN VISITOR_YEAM = DATE_FORMAT(DATE_SUB(CONCAT('^P_PARAM.testbzk.年份^','^P_PARAM.testbzk.月份^','01' ), INTERVAL 1 MONTH),'%Y-%m') ELSE 1=2 END AND ORG_CODE IN ( '^P_PARAM.testbzk.jg_id^')) a
ON t.`ORGANIZCODE`=a.ORG_CODE GROUP BY ORGANIZCODE

union

SELECT
t.P_ORGANIZCODE '医院ID',
t.P_ORGANIZNAME '医院',
ORG_CODE  '机构编码',
t.ORGANIZNAME '机构名称',
sum(CHECK_APPLY)     '检查申请单数',
sum(CHECK_REPORT)    '检查报告单数'

from
(SELECT * from V_ORG
where P_ORGANIZCODE in  ( '^P_PARAM.testbzk.申请单数_医院ID^') AND ORG_COUSTOMR_TYPE= '^P_PARAM.testbzk.展示模式^' and  '^P_PARAM.testbzk.日期类型^' in ('1','4'))t

left join
(select ORG_CODE,VISITOR_YEAR,VISITOR_MONTH,VISITOR_YEAM,
CHECK_APPLY as CHECK_APPLY,CHECK_REPORT as CHECK_REPORT
FROM DM_CHECK_TIMES_DAY
WHERE CASE WHEN  '^P_PARAM.testbzk.日期类型^'= '1'  THEN  VISITOR_YEAR =   '^P_PARAM.testbzk.年份^'
 
WHEN  '^P_PARAM.testbzk.日期类型^'= '4'  THEN  VISITOR_DATE  >= '^P_PARAM.testbzk.开始日期^'
and   VISITOR_DATE <=  '^P_PARAM.testbzk.结束日期^' ELSE 1=2 END AND ORG_CODE IN ( '^P_PARAM.testbzk.jg_id^')) a
ON t.`ORGANIZCODE`=a.ORG_CODE
GROUP BY ORGANIZCODE
8、Excel里设置参数排版及父格

​ 报表中展示模式,日期类型,年份,季度,月份,开始日期,结束日期参数都在顶端显示,参数排版下将这些参数依次排列,而机构ID等是默认隐藏。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第102张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第103张图片

9、查询导出及图表切换等宏代码(JS)的创建

​ 图形报表与表格报表的宏代码基本相同,不同之处在于刷新宏,报表报表多一个折叠部分,及查询按钮中的图形切换按钮功能里面节点ID书写的先后方式。

​ 名称为:初始化,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport

function main(spreadsheetReport, spreadsheetReportContext) {

    //该方法在第一次进入报表调用
    if (!spreadsheetReport.paramPanelObj) return;
    try {
        //获取参数面板表格
        var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
        var i, cell, lastCell,lastCellLength;
        //控制参数显示隐藏
        var value = spreadsheetReport.getParameterValue("基本诊疗_诊疗_切换");    //获取“区域”参数的值
    
        if (value == '1') {                                    //若值等于“华北”,则设置“目录”参数隐藏
            spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
           spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
        }else if(value == '2'){
            spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
        }else if(value == '3'){
            spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
        }else if(value == '4'){
            spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = '';
            spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = '';
        }
        
        var span1 = document.createElement("span");
        span1.innerHTML = "  ";
        var span = document.createElement("span");
        span.innerHTML = "  ";
        
        lastCellLength = paramTable.rows.length;
        lastCell = paramTable.rows[0].insertCell(7); 
       
        //创建查询按钮
        var queryBtn = document.createElement("button");
        queryBtn.value = " 查询 "; //如需要修必按钮风格,请自行实现
        queryBtn.innerHTML = "查询";
        queryBtn.className = "query-button";
        lastCell.appendChild(span1);
        lastCell.appendChild(queryBtn);
        spreadsheetReport.addListener(queryBtn, "click",
        function() {
            //刷新页面
            spreadsheetReport.doRefresh();
        },
        this);
        // 添加空格
        
        //创建图形切换按钮
        var swithBtn = document.createElement("button");
        swithBtn.value = " 图表切换 "; //如需要修必按钮风格,请自行实现
        swithBtn.innerHTML = "图表切换";
        swithBtn.className = "query-button";
        lastCell.appendChild(span);
        lastCell.appendChild(swithBtn);

        spreadsheetReport.addListener(swithBtn, "click",
        function() {
            var paramsInfo = [];
            paramsInfo.push({ name:"jg_code",value:paramToString(spreadsheetReport.getParamValue("jg_code")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("jg_code"))});
            paramsInfo.push({ name:"jg_type",value:paramToString(spreadsheetReport.getParamValue("jg_type")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("jg_type"))});
            paramsInfo.push({ name:"jg_id",value:paramToString(spreadsheetReport.getParamValue("jg_id")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("jg_id"))});
            paramsInfo.push({ name:"基本诊疗_诊疗_切换",value:paramToString(spreadsheetReport.getParamValue("基本诊疗_诊疗_切换")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("基本诊疗_诊疗_切换"))});
            paramsInfo.push({ name:"检查人次统计_年",value:paramToString(spreadsheetReport.getParamValue("检查人次统计_年")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("检查人次统计_年"))});
            paramsInfo.push({ name:"季度",value:paramToString(spreadsheetReport.getParamValue("季度")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("季度"))});
            paramsInfo.push({ name:"家庭医生_月份",value:paramToString(spreadsheetReport.getParamValue("家庭医生_月份")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("家庭医生_月份"))});
            paramsInfo.push({ name:"开始日期",value:paramToString(spreadsheetReport.getParamValue("开始日期")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("开始日期"))});
            paramsInfo.push({ name:"结束日期",value:paramToString(spreadsheetReport.getParamValue("结束日期")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("结束日期"))});
            paramsInfo.push({ name:"展示模式",value:paramToString(spreadsheetReport.getParamValue("展示模式")),displayValue:paramToString(spreadsheetReport.getParamDisplayValue("展示模式"))});
            
            var command = spreadsheetReport.command;
            
            command.close();
            command.execute('OPENWITHNOREFRESH', 'Iff8080810172bfcabfcaee560172db364ccd0bcd');
            var report = command.spreadsheetReport;
            if (paramsInfo.length > 0) report.setParamsInfo(paramsInfo);
            if(report.elem_trToolbar)report.elem_trToolbar.style.display = 'none';
            report.doRefresh();

        },
        this);
        
       
    } catch(e) {
        alert('更新查询按钮位置失败:' + e.message);
    }
    
    function paramToString(v) {
        return v == null ? null : v.toString();
    }
}

​ 名称为:刷新,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

var udchmUtils = use("system.utils.udchmUtils");
function main(spreadsheetReport) {
    var smartbiParams=getSmartbiParams(spreadsheetReport);
    window.parent.postMessage(smartbiParams,udchmUtils.getVueIP());
    
    //控制参数显示隐藏
    var value = spreadsheetReport.getParameterValue("基本诊疗_诊疗_切换");    //获取“区域”参数的值

    if (value == '1') {                                    //若值等于“华北”,则设置“目录”参数隐藏
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '2'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '3'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '4'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = '';
    }
    
    var srtjBackPic = spreadsheetReport.shapesMap["图片 23"];
    spreadsheetReport.addListener(srtjBackPic, "click",
        function() {
        spreadsheetReport.shapesMap["ECharts1_1"].parentNode.style.display = ""; 
        spreadsheetReport.shapesMap["ECharts1_2"].parentNode.style.display = "none"; 
        },
        this);
        
    var labReport = spreadsheetReport.shapesMap["图片 24"];
    spreadsheetReport.addListener(labReport, "click",
        function() {
        spreadsheetReport.shapesMap["ECharts1_3"].parentNode.style.display = ""; 
        spreadsheetReport.shapesMap["ECharts1_4"].parentNode.style.display = "none"; 
        },
    this);
        
}


function getSmartbiParams(spreadsheetReport){
  
  var jsonArry = [
                {name: "resid", value: spreadsheetReport.queryId,displayValue:''},
                {name: "基本诊疗_诊疗_切换", value: spreadsheetReport.getParamValue("基本诊疗_诊疗_切换"),displayValue:spreadsheetReport.getParamDisplayValue("基本诊疗_诊疗_切换")},
                {name: "展示模式", value: spreadsheetReport.getParamValue("展示模式"),displayValue:spreadsheetReport.getParamDisplayValue("展示模式")},
                {name: "jg_id", value: spreadsheetReport.getParamValue("jg_id"),displayValue:spreadsheetReport.getParamDisplayValue("jg_id")}
      ]
       var value = spreadsheetReport.getParameterValue("基本诊疗_诊疗_切换");  
        if (value == '1') {   
           jsonArry.push({name: "检查人次统计_年", value: spreadsheetReport.getParamValue("检查人次统计_年"),displayValue:spreadsheetReport.getParamDisplayValue("检查人次统计_年")});
        
        }else if(value == '2'){
            jsonArry.push({name: "检查人次统计_年", value: spreadsheetReport.getParamValue("检查人次统计_年"),displayValue:spreadsheetReport.getParamDisplayValue("检查人次统计_年")});
            jsonArry.push({name: "季度", value: spreadsheetReport.getParamValue("季度"),displayValue:spreadsheetReport.getParamDisplayValue("季度")});
        }else if(value == '3'){
            jsonArry.push({name: "检查人次统计_年", value: spreadsheetReport.getParamValue("检查人次统计_年"),displayValue:spreadsheetReport.getParamDisplayValue("检查人次统计_年")});
            jsonArry.push({name: "家庭医生_月份", value: spreadsheetReport.getParamValue("家庭医生_月份"),displayValue:spreadsheetReport.getParamDisplayValue("家庭医生_月份")});
        }else if(value == '4'){
            jsonArry.push({name: "开始日期", value: spreadsheetReport.getParamValue("开始日期"),displayValue:spreadsheetReport.getParamDisplayValue("开始日期")});
            jsonArry.push({name: "结束日期", value: spreadsheetReport.getParamValue("结束日期"),displayValue:spreadsheetReport.getParamDisplayValue("结束日期")});
        }
     return JSON.stringify(jsonArry); 
}

​ 名称为:参数切换,类型为:客户端宏,对象为:spreadsheetReport,事件为:onParamValueChanged

var udchmUtils = use("system.utils.udchmUtils");

function main(spreadsheetReport, param) {
    var smartbiParams =getSmartbiParams(spreadsheetReport);
    window.parent.postMessage(smartbiParams, udchmUtils.getVueIP());

    //控制参数显示隐藏
    var value = spreadsheetReport.getParameterValue("基本诊疗_诊疗_切换");    //获取“区域”参数的值

    if (value == '1') {                                    //若值等于“华北”,则设置“目录”参数隐藏
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
       spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '2'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '3'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = 'none';
    }else if(value == '4'){
        spreadsheetReport.paramPanelObj.getParamTagByParamName("检查人次统计_年").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("季度").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("家庭医生_月份").style.display = 'none';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("开始日期").style.display = '';
        spreadsheetReport.paramPanelObj.getParamTagByParamName("结束日期").style.display = '';
    }

    function getSmartbiParams(spreadsheetReport){
        var jsonArry = [
            {name: "resid", value: spreadsheetReport.queryId ,displayValue:''},
            {name: "jg_id", value: spreadsheetReport.getParamValue("jg_id"),displayValue:spreadsheetReport.getParamDisplayValue("jg_id")},
            {name: "基本诊疗_诊疗_切换", value: spreadsheetReport.getParamValue("基本诊疗_诊疗_切换"),displayValue:spreadsheetReport.getParamDisplayValue("基本诊疗_诊疗_切换")},
            {name: "展示模式", value: spreadsheetReport.getParamValue("展示模式"),displayValue:spreadsheetReport.getParamDisplayValue("展示模式")},
          ]
        if (value == '1') {   
           jsonArry.push({name: "检查人次统计_年", value: spreadsheetReport.getParamValue("检查人次统计_年"),displayValue:spreadsheetReport.getParamDisplayValue("检查人次统计_年")});
        }else if(value == '2'){
            jsonArry.push({name: "检查人次统计_年", value: spreadsheetReport.getParamValue("检查人次统计_年"),displayValue:spreadsheetReport.getParamDisplayValue("检查人次统计_年")});
            jsonArry.push({name: "季度", value: spreadsheetReport.getParamValue("季度"),displayValue:spreadsheetReport.getParamDisplayValue("季度")});
        }else if(value == '3'){
            jsonArry.push({name: "检查人次统计_年", value: spreadsheetReport.getParamValue("检查人次统计_年"),displayValue:spreadsheetReport.getParamDisplayValue("检查人次统计_年")});
            jsonArry.push({name: "家庭医生_月份", value: spreadsheetReport.getParamValue("家庭医生_月份"),displayValue:spreadsheetReport.getParamDisplayValue("家庭医生_月份")});
        }else if(value == '4'){
            jsonArry.push({name: "开始日期", value: spreadsheetReport.getParamValue("开始日期"),displayValue:spreadsheetReport.getParamDisplayValue("开始日期")});
            jsonArry.push({name: "结束日期", value: spreadsheetReport.getParamValue("结束日期"),displayValue:spreadsheetReport.getParamDisplayValue("结束日期")});
        }
        return JSON.stringify(jsonArry); 
    }  
}

​ 名称为:检验报告书_联动,类型为:客户端宏,对象为:Iff8080810172bfcabfcaee560172db3686be0bd8,事件为:pointClick

//@smartbi.utility_macro:system.utils.JMClientUtils 
 var jmUtils = use("system.utils.JMClientUtils");

function paramToString(v) {
    return v == null ? null : v.toString();
}
function main(chartView, point, mouseEvent) {
    if(!chartView || !point)
        return;

    var aotuCmd = false;
    //callback(chartView, point);
    chartView.addMenuItem("ECharts1_1",callback,aotuCmd);
}

function callback(chartView,point) {
    var spreadsheetReport = chartView.getContext()
    var paramsInfo = [];
    
    spreadsheetReport.shapesMap["ECharts1_3"].parentNode.style.display = "none"; 
    spreadsheetReport.shapesMap["ECharts1_1"].parentNode.style.display = "none"; 
    spreadsheetReport.shapesMap["ECharts1_4"].parentNode.style.display = ""; 
    spreadsheetReport.shapesMap["ECharts1_2"].parentNode.style.display = ""; 

}

​ 名称为:检验申请单数_联动,类型为:客户端宏,对象为:Iff8080810172bfcabfcaee560172db3686bc0bd4,事件为:pointClick

//@smartbi.utility_macro:system.utils.JMClientUtils 
 var jmUtils = use("system.utils.JMClientUtils");

function paramToString(v) {
    return v == null ? null : v.toString();
}
function main(chartView, point, mouseEvent) {
    if(!chartView || !point)
        return;

    var aotuCmd = false;
    //callback(chartView, point);
    chartView.addMenuItem("ECharts1_1",callback,aotuCmd);
}

function callback(chartView,point) {
    var spreadsheetReport = chartView.getContext()
    var paramsInfo = [];
    
    spreadsheetReport.shapesMap["ECharts1_1"].parentNode.style.display = "none"; 
    //医院双Y联合图隐藏
    spreadsheetReport.shapesMap["ECharts1_3"].parentNode.style.display = "none"; 
    //医院双Y联合图隐藏
    spreadsheetReport.shapesMap["ECharts1_2"].parentNode.style.display = "";
    //社康双Y联合图显示
    spreadsheetReport.shapesMap["ECharts1_4"].parentNode.style.display = ""; 
    //社康双Y联合图显示
}

十三、筛选联动显示在顶端且图框中含不同类型时间维度

1、展示效果

​ 如下图所示:实现的效果是:打开报表筛选内容框默认为空白,当点击下部的饼图等进行联动时,即相当于单选了某类性别,户籍等时,这个户籍类别和性别类别都会显示在筛选内容框中,且人次趋势图默认的时间维度为月,但可以切换。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第104张图片
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第105张图片

2、原生SQL数据集的创建

​ 诊疗人次汇总分析数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形组件为就诊社康类型,户籍构成,性别构成,年龄分布,预约人次占比,收费人次占比,医保人次占比,医保类型占比 等统计汇总类图形组件。

SELECT 
P_ORGANIZCODE '医院ID',
地区分类 '医院',
t.ORG_SORT '排序',
t.ORGANIZCODE '机构编码',

t.COMMU_CODE1 as 'I类社康',
t.COMMU_CODE2 as 'II类社康',
t.COMMU_CODE3 as 'III类社康',

t.SEX1 as '男',
t.SEX2 as '女',
t.SEX3 as '性别未填',

t.CENSUS_TYPE1 as '户籍',
t.CENSUS_TYPE2 as '非户籍',

t.MIG_TYPE1 as '一档',
t.MIG_TYPE2 as '二档',
t.MIG_TYPE3 as '三档',
t.MIG_TYPE4 as '其它',

t.REFERRAL_TYPE1  as '上转',
t.REFERRAL_TYPE2  as '下转',

t.AGE_TYPE1 as '0-9岁',
t.AGE_TYPE2 as '10-19岁',
t.AGE_TYPE3 as '20-29岁',
t.AGE_TYPE4 as '30-39岁',
t.AGE_TYPE5 as '40-49岁',
t.AGE_TYPE6 as '50-59岁',
t.AGE_TYPE7 as '60-69岁',
t.AGE_TYPE8 as '70-79岁',
t.AGE_TYPE9 as '80岁以上',

t.TYPE_CODE1 as '全科诊疗人次',
t.TYPE_CODE2 as '服务人次',
t.TYPE_CODE3 as '专家下社康诊疗人次',
t.TYPE_CODE4 as '中医诊疗人次',

t.YUYUE_TYPE1 as '预约诊疗人次',
t.YUYUE_TYPE2 as '非预约诊疗人次',
t.SHOUFEI_TYPE1 as '诊疗收费人次',
t.SHOUFEI_TYPE2 as '诊疗未收费人次',
t.YIBAO_TYPE1 as '医保诊疗人次',
t.YIBAO_TYPE2 as '非医保诊疗人次'

FROM (
SELECT o.* ,z.* FROM  
 (    SELECT * from   V_ORG_SS where   ORGANIZCODE  in  (  SELECT ORGANIZCODE FROM v_org WHERE '0'= RIGHT(  '^P_PARAM.testbzk.jg_id_2^' ,1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
			UNION SELECT ORGANIZCODE FROM v_org WHERE '1'=  RIGHT( '^P_PARAM.testbzk.jg_id_2^' ,1) AND P_ORGANIZCODE = LEFT( '^P_PARAM.testbzk.jg_id_2^' , INSTR( '^P_PARAM.testbzk.jg_id_2^' ,'#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
			UNION SELECT ORGANIZCODE FROM v_org WHERE '2'=  RIGHT('^P_PARAM.testbzk.jg_id_2^' ,1)  AND P_ORGANIZCODE = LEFT( '^P_PARAM.testbzk.jg_id_2^', INSTR( '^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
			UNION SELECT ORGANIZCODE FROM v_org WHERE '3'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND ORGANIZCODE =  LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^' ) ) and ORG_COUSTOMR_TYPE= '^P_PARAM.testbzk.展示模式_三种^')o
LEFT JOIN (
SELECT
o3.ORG_CODE,
SUM(case when o3.COMMU_CODE='1'   then o3.VISITS_TIMES else 0 end ) 'COMMU_CODE1',
SUM(case when o3.COMMU_CODE='2'   then o3.VISITS_TIMES else 0 end ) 'COMMU_CODE2',
SUM(case when o3.COMMU_CODE='3'   then o3.VISITS_TIMES else 0 end ) 'COMMU_CODE3',

SUM(case when o3.SEX='1'   then o3.VISITS_TIMES else 0 end ) 'SEX1',
SUM(case when o3.SEX='2'   then o3.VISITS_TIMES else 0 end ) 'SEX2',
SUM(case when o3.SEX='3'   then o3.VISITS_TIMES else 0 end ) 'SEX3',

SUM(case when o3.CENSUS_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'CENSUS_TYPE1',
SUM(case when o3.CENSUS_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'CENSUS_TYPE2',
SUM(case when o3.CENSUS_TYPE='3'   then o3.VISITS_TIMES else 0 end ) 'CENSUS_TYPE3',

SUM(case when o3.MIG_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'MIG_TYPE1',
SUM(case when o3.MIG_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'MIG_TYPE2',
SUM(case when o3.MIG_TYPE='3'   then o3.VISITS_TIMES else 0 end ) 'MIG_TYPE3',
SUM(case when o3.MIG_TYPE='4'   then o3.VISITS_TIMES else 0 end ) 'MIG_TYPE4',

SUM(case when o3.REFERRAL_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'REFERRAL_TYPE1',
SUM(case when o3.REFERRAL_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'REFERRAL_TYPE2',

SUM(case when o3.AGE_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE1',
SUM(case when o3.AGE_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE2',
SUM(case when o3.AGE_TYPE='3'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE3',
SUM(case when o3.AGE_TYPE='4'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE4',
SUM(case when o3.AGE_TYPE='5'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE5',
SUM(case when o3.AGE_TYPE='6'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE6',
SUM(case when o3.AGE_TYPE='7'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE7',
SUM(case when o3.AGE_TYPE='8'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE8',
SUM(case when o3.AGE_TYPE='9'   then o3.VISITS_TIMES else 0 end ) 'AGE_TYPE9',

SUM(case when o3.TYPE_CODE='1'   then o3.VISITS_TIMES else 0 end ) 'TYPE_CODE1',
SUM(case when o3.TYPE_CODE='2'   then o3.VISITS_TIMES else 0 end ) 'TYPE_CODE2',
SUM(case when o3.TYPE_CODE='3'   then o3.VISITS_TIMES else 0 end ) 'TYPE_CODE3',
SUM(case when o3.TYPE_CODE='4'   then o3.VISITS_TIMES else 0 end ) 'TYPE_CODE4',

SUM(case when o3.YUYUE_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'YUYUE_TYPE1',
SUM(case when o3.YUYUE_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'YUYUE_TYPE2',

SUM(case when o3.SHOUFEI_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'SHOUFEI_TYPE1',
SUM(case when o3.SHOUFEI_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'SHOUFEI_TYPE2',

SUM(case when o3.YIBAO_TYPE='1'   then o3.VISITS_TIMES else 0 end ) 'YIBAO_TYPE1',
SUM(case when o3.YIBAO_TYPE='2'   then o3.VISITS_TIMES else 0 end ) 'YIBAO_TYPE2'

FROM  DM_VISITS_ANALYZE_DAY o3
WHERE   o3.VISITOR_DATE >= '^P_PARAM.testbzk.开始日期^' and o3.VISITOR_DATE <='^P_PARAM.testbzk.结束日期^'
  and (ORG_CODE in (  SELECT ORGANIZCODE FROM v_org WHERE '0'= RIGHT( '^P_PARAM.testbzk.jg_id_2^',1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^' )
			UNION SELECT ORGANIZCODE FROM v_org WHERE '1'=  RIGHT( '^P_PARAM.testbzk.jg_id_2^',1) AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR( 'ALL#0' ,'#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^' )
			UNION SELECT ORGANIZCODE FROM v_org WHERE '2'=  RIGHT('^P_PARAM.testbzk.jg_id_2^' ,1)  AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
			UNION SELECT ORGANIZCODE FROM v_org WHERE '3'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND ORGANIZCODE =  LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^') ))
    
AND AGE_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次分析_年龄^
when '0-9岁' then '1'
when '10-19岁' then '2'
when '20-29岁' then '3'
when '30-39岁' then '4'
when '40-49岁' then '5'
when '50-59岁' then '6'
when '60-69岁' then '7'
when '70-79岁' then '8'
when '80岁以上' then '9'
else 0 end)
    
AND  SEX = ( 
case  ^P_PARAM.basszsk_t.诊疗人次_性别^ 
when '男' then '1'
when '女' then '2'
when '未知' then '3'
else 0 end)
AND CENSUS_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次_户籍^ 
when '户籍' then '1'
when '非户籍' then '2'
else 0 end)
    
AND  COMMU_CODE= ( 
case   ^P_PARAM.basszsk_t.诊疗人次_社康类型^ 
when 'I类社康' then '1'
when 'II类社康' then '2'
when 'III类社康' then '3'
else 0 end)
    
AND  MIG_TYPE= ( 
case    ^P_PARAM.basszsk_t.诊疗人次_医保类型^ 
when '一档' then '1'
when '二档' then '2'
when '三档' then '3'
else 0 end)
    
AND REFERRAL_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗人次_转诊类型^ 
when '上转' then '1'
when '下转' then '2'
else 0 end)
    
AND YUYUE_TYPE= (
case    ^P_PARAM.basszsk_t.诊疗分析_预约类型^ 
when '预约诊疗人次' then '1'
when '非预约诊疗人次' then '2'
else 0 end)
    
AND SHOUFEI_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗分析_收费类型^
when '诊疗收费人次' then '1'
when '非诊疗收费人次' then '2'
else 0 end)
    
AND YIBAO_TYPE= (
case     ^P_PARAM.basszsk_t.诊疗分析_医保诊疗类型^ 
when '医保诊疗人次' then '1'
when '非医保诊疗人次' then '2'
else 0 end)
    
GROUP BY o3.ORG_CODE 
) z
ON o.ORGANIZCODE =  z.ORG_CODE

)t 
ORDER BY t.ORG_SORT

​ 诊疗人次趋势分析数据集,其中‘^’里面的是提前设置好的参数,用此数据集生成的图形组件为诊疗人次趋势图形组件。因趋势图隶属在报表顶端开始时间至结束时间的时间段内,且默认为展示当月,但包含时间切换参数,可以切换为显示日,月,季度,年份四种。

select * from (
    
select  max(visitor_date) '时间',
        visitor_date as '日期',
        sum(VISITS_TIMES ) as 全科诊疗人次
FROM `DM_VISITS_ANALYZE_DAY` t
    
WHERE VISITOR_DATE  >= '^P_PARAM.testbzk.开始日期^' and   VISITOR_DATE  <= '^P_PARAM.testbzk.结束日期^' and '^P_PARAM.testbzk.日期类型^' = 1 
and (ORG_CODE in 
     
( SELECT ORGANIZCODE FROM v_org WHERE '0'= RIGHT( '^P_PARAM.testbzk.jg_id_2^' ,1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '1'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND P_ORGANIZCODE = LEFT( '^P_PARAM.testbzk.jg_id_2^' , INSTR( '^P_PARAM.testbzk.jg_id_2^' ,'#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '2'=  RIGHT('^P_PARAM.testbzk.jg_id_2^' ,1) AND P_ORGANIZCODE = LEFT( '^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '3'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND ORGANIZCODE =  LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^') ) )
    
and type_code = 1 
    
AND AGE_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次分析_年龄^ 
when '0-9岁' then '1'
when '10-19岁' then '2'
when '20-29岁' then '3'
when '30-39岁' then '4'
when '40-49岁' then '5'
when '50-59岁' then '6'
when '60-69岁' then '7'
when '70-79岁' then '8'
when '80岁以上' then '9' else 0 end)
    
AND  SEX = ( 
case  ^P_PARAM.basszsk_t.诊疗人次_性别^ 
when '男' then '1'
when '女' then '2'
when '未知' then '3'
else 0 end)
    
AND CENSUS_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次_户籍^ 
when '户籍' then '1'
when '非户籍' then '2'
else 0 end )
    
AND  COMMU_CODE= ( 
case   ^P_PARAM.basszsk_t.诊疗人次_社康类型^ 
when 'I类社康' then '1'
when 'II类社康' then '2'
when 'III类社康' then '3'
else 0 end)
    
AND  MIG_TYPE= ( 
case    ^P_PARAM.basszsk_t.诊疗人次_医保类型^ 
when '一档' then '1'
when '二档' then '2'
when '三档' then '3'
else 0 end)
    
AND REFERRAL_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗人次_转诊类型^ 
when '上转' then '1'
when '下转' then '2'
else 0 end)
    
AND YUYUE_TYPE= (
case    ^P_PARAM.basszsk_t.诊疗分析_预约类型^ 
when '预约诊疗人次' then '1'
when '非预约诊疗人次' then '2'
else 0 end)
    
AND SHOUFEI_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗分析_收费类型^
when '诊疗收费人次' then '1'
when '非诊疗收费人次' then '2'
else 0 end)
    
AND YIBAO_TYPE= (
case     ^P_PARAM.basszsk_t.诊疗分析_医保诊疗类型^ 
when '医保诊疗人次' then '1'
when '非医保诊疗人次' then '2'
else 0 end )GROUP BY visitor_date 
    
union
    
select  max(visitor_date) '时间',
        visitor_yeam  as '日期',
        sum(VISITS_TIMES ) as 全科诊疗人次
FROM `DM_VISITS_ANALYZE_DAY` t
    
WHERE VISITOR_DATE >= '^P_PARAM.testbzk.开始日期^' and  VISITOR_DATE  <= '^P_PARAM.testbzk.结束日期^' and '^P_PARAM.testbzk.日期类型^' =2
and (ORG_CODE in 
(SELECT ORGANIZCODE FROM v_org WHERE '0'= RIGHT('^P_PARAM.testbzk.jg_id_2^',1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '1'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')

UNION SELECT ORGANIZCODE FROM v_org WHERE '2'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1)  AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^' )

UNION SELECT ORGANIZCODE FROM v_org WHERE '3'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND ORGANIZCODE =  LEFT('^P_PARAM.testbzk.jg_id_2^',INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')))
    
and type_code = 1
    
AND AGE_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次分析_年龄^
when '0-9岁' then '1'
when '10-19岁' then '2'
when '20-29岁' then '3'
when '30-39岁' then '4'
when '40-49岁' then '5'
when '50-59岁' then '6'
when '60-69岁' then '7'
when '70-79岁' then '8'
when '80岁以上' then '9'
else 0 end)
    
AND  SEX = ( 
case  ^P_PARAM.basszsk_t.诊疗人次_性别^ 
when '男' then '1'
when '女' then '2'
when '未知' then '3'
else 0 end)
    
AND CENSUS_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次_户籍^ 
when '户籍' then '1'
when '非户籍' then '2'
else 0 end)
    
AND  COMMU_CODE= ( 
case   ^P_PARAM.basszsk_t.诊疗人次_社康类型^ 
when 'I类社康' then '1'
when 'II类社康' then '2'
when 'III类社康' then '3'
else 0 end)
    
AND  MIG_TYPE= ( 
case    ^P_PARAM.basszsk_t.诊疗人次_医保类型^ 
when '一档' then '1'
when '二档' then '2'
when '三档' then '3'
else 0 end)
    
AND REFERRAL_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗人次_转诊类型^ 
when '上转' then '1'
when '下转' then '2'
else 0 end) GROUP BY visitor_yeam  
    
union
    
select
        max(visitor_date) '时间',
        concat(SUBSTR(VISITOR_DATE,1,4),'年',concat('第',QUARTER(CONCAT( VISITOR_DATE )),'季度')) as '日期',
        sum(VISITS_TIMES ) as 全科诊疗人次
FROM `DM_VISITS_ANALYZE_DAY` t
    
WHERE VISITOR_DATE >= '^P_PARAM.testbzk.开始日期^' and VISITOR_DATE <= '^P_PARAM.testbzk.结束日期^'  and '^P_PARAM.testbzk.日期类型^' =3
and (ORG_CODE in 
(SELECT ORGANIZCODE FROM v_org WHERE '0'= RIGHT('^P_PARAM.testbzk.jg_id_2^',1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '1'=  RIGHT('^P_PARAM.testbzk.jg_id_2^' ,1) AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '2'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1)  AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '3'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND ORGANIZCODE =  LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^') ))

and type_code = 1
    
AND AGE_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次分析_年龄^
when '0-9岁' then '1'
when '10-19岁' then '2'
when '20-29岁' then '3'
when '30-39岁' then '4'
when '40-49岁' then '5'
when '50-59岁' then '6'
when '60-69岁' then '7'
when '70-79岁' then '8'
when '80岁以上' then '9'
else 0 end)
    
AND  SEX = ( 
case  ^P_PARAM.basszsk_t.诊疗人次_性别^ 
when '男' then '1'
when '女' then '2'
when '未知' then '3'
else 0 end)
    
AND CENSUS_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次_户籍^ 
when '户籍' then '1'
when '非户籍' then '2'
else 0 end)
    
AND  COMMU_CODE= ( 
case   ^P_PARAM.basszsk_t.诊疗人次_社康类型^ 
when 'I类社康' then '1'
when 'II类社康' then '2'
when 'III类社康' then '3'
else 0 end)
    
AND  MIG_TYPE= ( 
case    ^P_PARAM.basszsk_t.诊疗人次_医保类型^ 
when '一档' then '1'
when '二档' then '2'
when '三档' then '3'
else 0 end)
    
AND REFERRAL_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗人次_转诊类型^ 
when '上转' then '1'
when '下转' then '2'
else 0 end) GROUP BY VISITOR_YEAR,quarter(VISITOR_DATE)
    
union
    
select
        max(visitor_date) '时间',
        visitor_year as '日期',
        sum(VISITS_TIMES ) as 全科诊疗人次
FROM `DM_VISITS_ANALYZE_DAY` t
    
WHERE VISITOR_DATE  >= '^P_PARAM.testbzk.开始日期^' and  VISITOR_DATE  <= '^P_PARAM.testbzk.结束日期^'  and '^P_PARAM.testbzk.日期类型^' = 4
and (ORG_CODE in 
( SELECT ORGANIZCODE FROM v_org WHERE '0'= RIGHT(  'ALL#0' ,1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '1'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '2'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1)  AND P_ORGANIZCODE = LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^')
 
UNION SELECT ORGANIZCODE FROM v_org WHERE '3'=  RIGHT('^P_PARAM.testbzk.jg_id_2^',1) AND ORGANIZCODE =  LEFT('^P_PARAM.testbzk.jg_id_2^', INSTR('^P_PARAM.testbzk.jg_id_2^','#')-1) and ORGANIZCODE in  ('^P_PARAM.testbzk.jg_id^') ))
    
and type_code = 1
    
AND AGE_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次分析_年龄^
when '0-9岁' then '1'
when '10-19岁' then '2'
when '20-29岁' then '3'
when '30-39岁' then '4'
when '40-49岁' then '5'
when '50-59岁' then '6'
when '60-69岁' then '7'
when '70-79岁' then '8'
when '80岁以上' then '9'
else 0 end)
    
AND  SEX = ( 
case  ^P_PARAM.basszsk_t.诊疗人次_性别^ 
when '男' then '1'
when '女' then '2'
when '未知' then '3'
else 0 end)
    
AND CENSUS_TYPE = (
case  ^P_PARAM.basszsk_t.诊疗人次_户籍^ 
when '户籍' then '1'
when '非户籍' then '2'
else 0 end)
    
AND  COMMU_CODE= ( 
case   ^P_PARAM.basszsk_t.诊疗人次_社康类型^ 
when 'I类社康' then '1'
when 'II类社康' then '2'
when 'III类社康' then '3'
else 0 end)
    
AND  MIG_TYPE= ( 
case    ^P_PARAM.basszsk_t.诊疗人次_医保类型^ 
when '一档' then '1'
when '二档' then '2'
when '三档' then '3'
else 0 end)
    
AND REFERRAL_TYPE= (
case   ^P_PARAM.basszsk_t.诊疗人次_转诊类型^ 
when '上转' then '1'
when '下转' then '2'
else 0 end)GROUP BY visitor_year) t
order by 日期
3、Excel里设置参数排版及父格

​ 报表中展示模式,日期类型,年份,季度,月份,开始日期,结束日期参数都在顶端显示,参数排版下将这些参数依次排列,而机构ID等是默认隐藏。
SmartBi参数传值与JS报表宏及Mysql数据集特殊功能总结_第106张图片

4、查询导出及图表切换等宏代码(JS)的创建

​ 图形报表与表格报表的宏代码基本相同,不同之处在于刷新宏,报表报表多一个折叠部分,及查询按钮中的图形切换按钮功能里面节点ID书写的先后方式。

​ 名称为:初始化事件,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRenderReport

var cookieUtils = use("system.utils.cookieUtils");
var spreadsheetReportSelf;
function main(spreadsheetReport, simpleReportContext) {
    spreadsheetReportSelf = spreadsheetReport;
    //该方法在第一次进入报表调用
    if (!spreadsheetReport.paramPanelObj) return;
    try {
        //获取参数面板表格
        var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
        var i, cell, lastCell,lastCellLength;

        
        var span1 = document.createElement("span1");
        span1.innerHTML = "  ";
        
        //lastCellLength = paramTable.rows.length;
        lastCell = paramTable.rows[0].insertCell(lastCellLength); 
       
        //创建查询按钮
        var queryBtn = document.createElement("button");
        queryBtn.value = " 查询 "; //如需要修必按钮风格,请自行实现
        queryBtn.innerHTML = "查询";
        queryBtn.className = "query-button";
        lastCell.appendChild(span1);
        lastCell.appendChild(queryBtn);
        spreadsheetReport.addListener(queryBtn, "click",
        function() {
            //刷新页面
            spreadsheetReport.doRefresh();
        },
        this);
 
        // 添加空格
        var span = document.createElement("span");
        lastCell.appendChild(span);
        span.innerHTML = "  ";

        spreadsheetReport.doRefresh_old = spreadsheetReport.doRefresh;
        spreadsheetReport.doRefresh = function(fromButton, delayMask) {
      
        var beginValue = spreadsheetReport.getParamValue("诊疗人次_当前年第一天");
        var endValue = spreadsheetReport.getParamValue("诊疗人次_当前年最后一天");
    
        if (beginValue > endValue) {
            alert("开始日期不能大于结束日期!");
        } else {
            this.doRefresh_old(fromButton, delayMask);
        }
    }
    } catch(e) {
        alert('初始化事件错误' + e.message);
    }
    
    function paramToString(v) {
        return v == null ? null : v.toString();
    }    //调用增加筛选区域方法
    addSelects(spreadsheetReport);
    // 创建方法  监听点击图形的时候 筛选区域隐藏
    if (!spreadsheetReport.isSHowSelectDiv) {
        spreadsheetReport.isSHowSelectDiv = function() {

            if (this.pieparamsDropdownDiv && this.pieparamsDropdownDiv.style.display == "block") {
                this.pieparamsDropdownDiv.style.display = "none";
            }
        }

    }
}
//新增筛选区域
function addSelects(spreadsheetReport) {
    //获取电子表格参数面板 根据参数排版中预留的表格位置增加筛选区域
    var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
    //筛选区域所在参数面板中的位置
    var lastCell = paramTable.getElementsByTagName("tr")[0].childNodes[2];
    var span = document.createElement("span");
        span.innerHTML = "  ";
    // 添加空格
        lastCell.appendChild(span);
    if (!spreadsheetReport._newDiv) { // 不要重复添加筛选控件
        //筛选区域的DIV
        var div = document.createElement("div");
        div.className = "combobox-panel";
        //span标签文本提示
        var span1 = document.createElement("span");
        span1.innerHTML = "筛选内容:";
        span1.className = "aliasSpan";
        //展示筛选区域内容的input框
        var input1 = document.createElement("input");
        input1.className = "combobox-edit";
        input1.id = "showPieParams";
        input1.type = "text";
        input1.autocomplete = "off";
        //下拉框箭头的文本框
        var input2 = document.createElement("input");
        input2.className = "combobox-button";
        input2.type = "button";

        if (domutils.isIE()) {
            div.style.cssText = "display: inline-block; width: 173px;";
            span1.style.cssText = "line-height: 26px;";
            input1.style.cssText = "width: 155px; background-color: white;";
            input2.style.cssText = "width: 16px;";
        } else {
            div.style = "display: inline-block; width: 173px;";
            span1.style = "line-height: 26px;";
            input1.style = "width: 155px; background-color: white;";
            input2.style = "width: 16px;";
        }

        //创建的属性加入页面中
        div.appendChild(input1);
        div.appendChild(input2);
        spreadsheetReport.showPieParamsInput = input1;
        lastCell.appendChild(span1);
        var newDiv = lastCell.appendChild(div);
        //监听 下拉框箭头的文本框点击时触发的事件
        spreadsheetReport.addListener(input2, "click", doNewButtonClick, spreadsheetReport);
        spreadsheetReport._newDiv = newDiv;
    }

    //创建方法:实现更改参数后,最新的参数值在筛选区域的文本框显示
    if (!spreadsheetReport.changePieParamsShow) {
        spreadsheetReport.changePieParamsShow = function() {
            var showValueStr = "";
            var isHaveChange = false;
            var pieParams = spreadsheetReport.pieParams;
            for (var i = 0; i < pieParams.length; i++) {
                if (pieParams[i].isChange) {
                    isHaveChange = true;
                    showValueStr += pieParams[i].value + ",";
                }
            }
            if (isHaveChange) {
                showValueStr = showValueStr.substr(0, showValueStr.length - 1);
            }
            spreadsheetReport.showPieParamsInput.value = showValueStr;
            spreadsheetReport.showPieParamsInput.title = showValueStr;

        }
    }

}

// 下拉框箭头的文本框点击时触发的事件:展示或者隐藏值的列表,可以在列表后删除参数
function doNewButtonClick(e) {
    var paramTable = this.paramPanelObj.layoutTable;
    //获取筛选参数区域的位置
    var lastCell = paramTable.getElementsByTagName("tr")[0].childNodes[3];
    if (!this.pieparamsDropdownDiv) {
        //获取筛选区域展示的区域相对窗口的绝对位置
        var leftTop = getLeftTop(this._newDiv);
        var left = leftTop.left;
        //判断是否存在最左边的功能列表,有则删除对应的宽度
        if (document.getElementsByClassName("base__sidebar ps-container ps-theme-default").length > 0) {
            left = left - 50;
        }
        //判断是否存在左边的导航列表,有则删除对应的宽度
        if (document.getElementsByClassName("_leftPanel leftPane leftCatalogTree ").length > 0) {
            var leftTab = document.getElementsByClassName("_leftPanel leftPane leftCatalogTree ");
            for (var i = 0; i < leftTab.length; i++) {
                var leftTabOne = leftTab[i];
                if (leftTabOne.style.display == "none") {
                    continue;
                } else {
                    left = left - leftTabOne.offsetWidth - 1;
                }
            }
        }
        var top = this._newDiv.offsetHeight + this._newDiv.offsetTop + 5;
        if (this.elemToolbarBg && this.elemToolbarBg.style.display != "none") {
            top = top + this.elemToolbarBg.offsetHeight;
        }

        //创建参数值展示的列表区域DIV
        var div = document.createElement("div");
        div.className = "dropdown-box-div";
        if (domutils.isIE()) {
            div.style.cssText = "position: absolute; z-index: 1008; display: none; height: 200px; width: 175px; left: " + left + "px; top: " + top + "px;";
        } else {
            div.style = "position: absolute; z-index: 1008; display: none; height: 200px; width: 175px; left: " + left + "px; top: " + top + "px;";
        }

        this.pieparamsDropdownDiv = div;
        lastCell.appendChild(div);
    }
    if (this.pieparamsDropdownDiv.style.display == "none") {
        this.pieparamsDropdownDiv.style.display = "block";
    } else {
        this.pieparamsDropdownDiv.style.display = "none";
        return;
    }
    this.pieparamsDropdownDiv.innerHTML = "";
    var pieParams = this.pieParams;
    //创建参数值展示的列表区域DIV的每个参数
    for (var i = 0; i < pieParams.length; i++) {
        if (pieParams[i].isChange) {
            var div = document.createElement("div");
            div.className = "combobox-panel";
            //值的展示input
            var input1 = document.createElement("input");
            input1.className = "combobox-edit";
            input1.value = pieParams[i].value;
            //删除标志
            var a1 = document.createElement("a");
            a1.innerHTML = "x";
            a1.name = "deleteA";
            a1.href = "javascript:;";
            a1.title = "删除";
            a1.id = pieParams[i].id;

            if (domutils.isIE()) {
                div.style.cssText = "float:left;width:100%;"
                a1.style.cssText = "vertical-align: -webkit-baseline-middle;cursor:pointer;color:#ccc;text-decoration:none;";

            } else {
                div.style = "float:left;width:100%;"
                a1.style = "vertical-align: -webkit-baseline-middle;cursor:pointer;color:#ccc;text-decoration:none";
            }


            div.appendChild(input1);
            div.appendChild(a1);
            //监听 点击删除标识触发事件
            this.addListener(a1, "click", toRemovePieParam, this);
            this.pieparamsDropdownDiv.appendChild(div);
            debugger;
            this.addListener(document.body, "mousedown", closeSelect, this);
            
        }
    }

}

function closeSelect(e) {
    debugger;
    if (e.target.name == "deleteA") {
        return true;
    }
    if (this.pieparamsDropdownDiv.style.display == "block") {
        this.pieparamsDropdownDiv.style.display = "none";
    }

}

// 点击删除标识触发事件
function toRemovePieParam(e) {
    e.target.parentNode.parentNode.removeChild(e.target.parentNode);
    if(e.target.id=="jg_id_2"){
        this.setParamValueByName(e.target.id, "ALL#0", "");
    }else{
        this.setParamValueByName(e.target.id, "", "");
    }
    var pieParams = this.pieParams;
    //设置对应的隐藏参数的标识
    for (var i = 0; i < pieParams.length; i++) {
        if (pieParams[i].id == e.target.id) {
            pieParams[i].isChange = false;
        }
    }
    //回写参数区域筛选值的内容
    this.changePieParamsShow();
    //delName(spreadsheetReport);
}
//获取元素相对于窗口的绝对位置
function getLeftTop(obj) {
    // 如果函数没有传入值的话返回对象为空的
    if (!obj)
        return null;
    var w = obj.offsetWidth,
        h = obj.offsetHeight;
    // 从目标元素开始向外遍历,累加top和left值
    var t, l;
    for (t = obj.offsetTop, l = obj.offsetLeft; obj = obj.offsetParent;) {
        t += obj.offsetTop;
        l += obj.offsetLeft;
    }
    var r = document.body.offsetWidth - w - l;
    var b = document.body.offsetHeight - h - t;

    var leftPos = l;
    var topPos = t + h;

    return {
        width: w,
        height: h,
        top: t,
        left: l,
        right: r,
        bottom: b
    };
}

名称为:刷新,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

var udchmUtils = use("system.utils.udchmUtils");
var findAllId = use("system.utils.findAllId");
var cookieUtils = use("system.utils.cookieUtils");
function main(spreadsheetReport,isAjaxRefreshCallback) {
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_性别").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次分析_年龄").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_社康类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_户籍").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_医保类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_转诊类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗分析_预约类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗分析_收费类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗分析_医保诊疗类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("jg_id_2").style.display = 'none';
     if (!spreadsheetReport.pieParams) {
        //电子表格对象中设置 饼图 参数数组
        var pieParams = [];
        //饼图1的参数json
        /***
        id:需要关联的参数名称
        isChange:是否根据图形点击去更改参数值
        value:参数的值
        **/
        var pie1 = {
            "id": "诊疗人次_性别",
            "isChange": false,
            "value": ""
        };
        var pie2 = {
            "id": "诊疗人次分析_年龄",
            "isChange": false,
            "value": ""
        };
        var pie3 = {
            "id": "诊疗人次_社康类型",
            "isChange": false,
            "value": ""
        };
        var pie4 = {
            "id": "诊疗人次_户籍",
            "isChange": false,
            "value": ""
        };
        var pie5 = {
            "id": "诊疗人次_医保类型",
            "isChange": false,
            "value": ""
        };
        var pie6 = {
            "id": "诊疗人次_转诊类型",
            "isChange": false,
            "value": ""
        };
        var pie7 = {
            "id": "诊疗分析_预约类型",
            "isChange": false,
            "value": ""
        };
        var pie8 = {
            "id": "诊疗分析_收费类型",
            "isChange": false,
            "value": ""
        };
        var pie9 = {
            "id": "诊疗分析_医保诊疗类型",
            "isChange": false,
            "value": ""
        };
        var pie10 = {
            "id": "jg_id_2",
            "isChange": false,
            "value": ""
        };
        pieParams.push(pie1);
        pieParams.push(pie2);
        pieParams.push(pie3);
        pieParams.push(pie4);
        pieParams.push(pie5);
        pieParams.push(pie6);
        pieParams.push(pie7);
        pieParams.push(pie8);
        pieParams.push(pie9);
        pieParams.push(pie10);
        spreadsheetReport.pieParams = pieParams;
        
        var smartbiParams=getSmartbiParams(spreadsheetReport);
        window.parent.postMessage(smartbiParams,udchmUtils.getVueIP());
    }
    //  var srtjBackPic = spreadsheetReport.shapesMap["返回"];
    //     spreadsheetReport.addListener(srtjBackPic, "click",
    //     function() {
    //         var paramsInfo = [];
    //         var code = cookieUtils.getCookie("jg_id")
    //         paramsInfo.push({ name:"jg_id",value: code,displayValue:""});
    //         paramsInfo.push({ name:"jg_id_2",value: "ALL#0",displayValue:""});
    //         spreadsheetReport.setParamsInfo(paramsInfo);
    //         spreadsheetReport.doAjaxRefresh();
    //     },
    //     this);
        
}

function getSmartbiParams(spreadsheetReport){
  var jsonArry = [
                {name: "resid", value: spreadsheetReport.queryId,displayValue:''},
                {name: "jg_id", value: spreadsheetReport.getParamValue("jg_id"),displayValue:spreadsheetReport.getParamDisplayValue("jg_id")},
                {name: "展示模式", value: spreadsheetReport.getParamValue("展示模式"),displayValue:spreadsheetReport.getParamDisplayValue("展示模式")}
      ]
     return JSON.stringify(jsonArry); 
}

tWidth - w - l;
var b = document.body.offsetHeight - h - t;

var leftPos = l;
var topPos = t + h;

return {
    width: w,
    height: h,
    top: t,
    left: l,
    right: r,
    bottom: b
};

}


名称为:刷新,类型为:客户端宏,对象为:spreadsheetReport,事件为:onRender

```js
var udchmUtils = use("system.utils.udchmUtils");
var findAllId = use("system.utils.findAllId");
var cookieUtils = use("system.utils.cookieUtils");
function main(spreadsheetReport,isAjaxRefreshCallback) {
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_性别").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次分析_年龄").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_社康类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_户籍").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_医保类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗人次_转诊类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗分析_预约类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗分析_收费类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("诊疗分析_医保诊疗类型").style.display = 'none';
     spreadsheetReport.paramPanelObj.getParamTagByParamName("jg_id_2").style.display = 'none';
     if (!spreadsheetReport.pieParams) {
        //电子表格对象中设置 饼图 参数数组
        var pieParams = [];
        //饼图1的参数json
        /***
        id:需要关联的参数名称
        isChange:是否根据图形点击去更改参数值
        value:参数的值
        **/
        var pie1 = {
            "id": "诊疗人次_性别",
            "isChange": false,
            "value": ""
        };
        var pie2 = {
            "id": "诊疗人次分析_年龄",
            "isChange": false,
            "value": ""
        };
        var pie3 = {
            "id": "诊疗人次_社康类型",
            "isChange": false,
            "value": ""
        };
        var pie4 = {
            "id": "诊疗人次_户籍",
            "isChange": false,
            "value": ""
        };
        var pie5 = {
            "id": "诊疗人次_医保类型",
            "isChange": false,
            "value": ""
        };
        var pie6 = {
            "id": "诊疗人次_转诊类型",
            "isChange": false,
            "value": ""
        };
        var pie7 = {
            "id": "诊疗分析_预约类型",
            "isChange": false,
            "value": ""
        };
        var pie8 = {
            "id": "诊疗分析_收费类型",
            "isChange": false,
            "value": ""
        };
        var pie9 = {
            "id": "诊疗分析_医保诊疗类型",
            "isChange": false,
            "value": ""
        };
        var pie10 = {
            "id": "jg_id_2",
            "isChange": false,
            "value": ""
        };
        pieParams.push(pie1);
        pieParams.push(pie2);
        pieParams.push(pie3);
        pieParams.push(pie4);
        pieParams.push(pie5);
        pieParams.push(pie6);
        pieParams.push(pie7);
        pieParams.push(pie8);
        pieParams.push(pie9);
        pieParams.push(pie10);
        spreadsheetReport.pieParams = pieParams;
        
        var smartbiParams=getSmartbiParams(spreadsheetReport);
        window.parent.postMessage(smartbiParams,udchmUtils.getVueIP());
    }
    //  var srtjBackPic = spreadsheetReport.shapesMap["返回"];
    //     spreadsheetReport.addListener(srtjBackPic, "click",
    //     function() {
    //         var paramsInfo = [];
    //         var code = cookieUtils.getCookie("jg_id")
    //         paramsInfo.push({ name:"jg_id",value: code,displayValue:""});
    //         paramsInfo.push({ name:"jg_id_2",value: "ALL#0",displayValue:""});
    //         spreadsheetReport.setParamsInfo(paramsInfo);
    //         spreadsheetReport.doAjaxRefresh();
    //     },
    //     this);
        
}

function getSmartbiParams(spreadsheetReport){
  var jsonArry = [
                {name: "resid", value: spreadsheetReport.queryId,displayValue:''},
                {name: "jg_id", value: spreadsheetReport.getParamValue("jg_id"),displayValue:spreadsheetReport.getParamDisplayValue("jg_id")},
                {name: "展示模式", value: spreadsheetReport.getParamValue("展示模式"),displayValue:spreadsheetReport.getParamDisplayValue("展示模式")}
      ]
     return JSON.stringify(jsonArry); 
}

你可能感兴趣的:(BI,mysql,数据库的使用,mysql,sql,javascript)