Oracle SQL
join using(name) 等于 join on a.name = b.name
当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,格式为:USING(column_name)。
1 2 3
| select employee_id,last_name,department_name from employees join departments using (department_id)
|
等价于
1 2 3
| select employee_id,last_name,department_name from employees join departments on employees.department_id = departments.department_id
|
Alternative quote operator 代替引用运算符
‘employee is ‘ || last_name => q’[employee is ]’ || last_name 使用q’[]’ 这样的组合来代替 ‘’ 。
具体的使用场景,为了避免在拼接的自定义字符串中再次出现 ‘ 符号导致无法查询语句无法被解释。
例如:
1 2
| select department_name || ' Department's Manager Id: ' || manager_id from departments
|
显然由于 Department’s Manager 中含有一个 ‘ 符号,导致这个语句会出错。
这是我们就可以使用代替引用运算符
1 2
| select department_name || q'[ Department's Manager Id: ]' || manager_id from departments
|
SQLite
介绍:SQLite是一种轻量级的关系型数据库管理系统(DBMS),它是一个开源的、零配置的、自包含的、事务性的SQL数据库引擎。
DDL操作
创建一个Employee表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| CREATE TABLE [F_Employee] ( [EmployeeId] INTEGER NOT NULL, [EmployeeName] NVARCHAR(20) NOT NULL, [Phone] NVARCHAR(24), [Email] NVARCHAR(60), [HireDate] DATETIME, [JobId] INTEGER, [Salary] REAL, [CommissionPCT] INTEGER, [ManagerId] INTEGER, [DepartmentId] INTEGER, [CreateUser] NVARCHAR(24), [CreateTime] NVARCHAR(24), [UpdateUser] NVARCHAR(24), [UpdateTime] NVARCHAR(24), CONSTRAINT [PK_Employee] PRIMARY KEY ([EmployeeId]) );
|
FineBI
获取[年/月]时间区间的天数
获取开始时间到结束时间之间的天数,开始时间和结束时间之间为[年/月]
DAYVALUE(MONTHDELTA(${结束时间},1)) - DAYVALUE(${开始时间})
DATEIF(${结束时间},${开始时间},'d')
BI和Report融合工具联动配置
目前通过web组件的形式实现BI组件联动FR模板,暂不支持FR模板反向联动BI组件;
其中:viewlet之后的参数为FR模板的链接(支持普通报表和决策报表);__bi_report__之后的参数为仪表板的ID
- 添加完成后会自动生成__bi_session__和__bi_widget__参数,此部分参数为动态,静态写入不可用。
web组件中得report表点击链接跳转后,依然实现联动功能
需要在跳转到得链接界面传入动态参数__bi_report__,__bi_session__和__bi_widget__

点地图自定义提示
数据配置为单元格配置;

通过for函数来遍历this.points,通过 if函数判断系列名,针对不同的系列配置不同的样式。
最后打开使用html解析文本内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| function(){
var points = this.points;
var a = '<div style="font-size: 14px">' + this.name + '<HR align=center color=#5F83F9 SIZE=1>';
for(var i = 0, len = points.length; i < len; i++) {
if (this.points[i].seriesName == 'A') {
a += '<span style="font-size: 12px;color:#DEEFF2">' + this.points[i].seriesName + '<span/> '
+ '<span style="font-size: 12px;color:#F2A917">'+ this.points[i].value + '<span/>'
+ '</br>'
} else if(this.points[i].seriesName == 'B'){
a += '<span style="font-size: 12px;color:#DEEFF2">' + this.points[i].seriesName + '<span/> '
+ '<span style="font-size: 12px;color:#F2A917">'+ this.points[i].value + '<span/>'
+ '<span style="font-size: 12px;color:#DEEFF2" >万方<span/>'
+ '</br>'
} else{
a += '<span style="font-size: 12px;color:#DEEFF2">' + this.points[i].seriesName + '<span/> '
+ '<span style="font-size: 12px;color:#F2A917">'+ this.points[i].value + '<span/>'
+ '<span style="font-size: 12px;color:#DEEFF2" >万方<span/>'
+ '</br>'
}
}
return a + '<div/>';}
|
地图通过JavaScript自定义中心点和缩放等级
对图表添加初始化事件,由于数据查询的时间的问题,通常设置延迟触发。chart.setMapZoom({[zoomLevel],[viewCenter]})
1 2 3 4 5 6 7 8 9
| setTimeout(function () {
var chart=FR.Chart.WebUtils.getChart("chart0").getChartWithIndex(0);
chart.setMapZoom({zoomLevel:4,viewCenter: [118,32]});
},3000)
|
提示点自动轮播
对图表添加初始化事件,由于数据查询的时间的问题,通常设置延迟触发。chart.openAutoTooltip([delay],[initpoint]);
1 2 3 4 5 6 7 8 9 10 11
| setTimeout(function () {
var chart =FR.Chart.WebUtils.getChart("chart0").getChartWithIndex(0);
chart.openAutoTooltip();
}, 3000);
|
钻取地图在指定层点击进行跳转
问题:在使用默认钻取地图时,添加超级链接后,点击第一层行政区块后会触发超级链接,并不会下钻后第二层。我们需要等待他钻取到第二层之后,再按照等二层点击的区县进行数据下钻。比如成都市->武侯区->武侯区明细表。
处理:当点击链接的时候,可以直接获取到点击区域的区域名,再提前获取到要钻取的数据集,通过匹配点击的区域名是否在对应数据集中就可以来控制是否执行超级链接。
| 参数 |
公式 |
含义 |
| county_names |
=data.county_names |
所有区县名 |
| county_name |
=AREA_NAME |
区域名/用于传参给下钻报表,等于“武侯区” |
| bi_report |
=$_bi_report_ |
融合工具参数 |
| bi_widget |
=$_bi_widget_ |
融合工具参数 |
| bi_session |
=$_bi_session_ |
融合工具参数 |
1 2 3 4 5 6 7 8 9
| var chart = FR.Chart.WebUtils.getChart("chart0").getChartWithIndex(0); var names = chart.getLayerNames(); var layer = chart.getLayerIndex();
if (county_names.includes(county_name)){ console.log(names+'-'+layer + '-'+ county_name) location=encodeURI(encodeURI("/decision/view/form?viewlet=frm85a7014a8ad944d6a4ecba5001dd483d1698290236362&ref_t=design&ref_c=a29ee7c0-51e9-4192-8401-ea1750901953&__bi_report__="+bi_report+"&__bi_widget__="+bi_widget+"&__bi_session__="+bi_session+"&COUNTY_NAME="+county_name)); }
|
持续更新
FineReport
动态SQL参数
1 2
| where 1=1 ${if(len(NY)==0,"","and NY like '"+NY+"'")}
|
导出模板按钮
1 2 3 4 5 6 7 8
| var url="${servletURL}?viewlet=./test.cpt" var config = { ny:this.options.form.getWidgetByName("ny").getValue(), format:"excel", extype:"simple" } FR.doHyperlinkByPost(url,config)
|
校验并提交按钮
1 2
| _g().verifyAndWriteReport();
|
Excel自定义导入按钮
1
| _g().importExcel("customize");
|
删除按钮保留最后一行
删除按钮控件名称为 ‘del’ , 可见设置为 true,可用设置为 false
1 2 3 4 5 6 7 8 9 10 11 12 13
| var arr = ['del']; for (i = 0; i < arr.length; i++) { var kj = $('[widgetname="' + arr[i].toUpperCase() + '"]:visible'); var del = _g().getWidgetsByName(arr[i].toUpperCase()); for (j = 0; j < del.length; j++) { kj.length <= 1 ? del[j].setEnable(false) : del[j].setEnable(true); } }
|
修改默认按钮的背景色
1 2
| $('.fr-btn-up').css('background','#fff0')
|
部分美化(一)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $('.parameter-container-collapseimg-up').removeClass('parameter-container-collapseimg-up');
$('.fDright').removeClass('fDright'); $('.fDbottom').removeClass('fDbottom'); $('.fDtop').removeClass('fDtop'); $('.fDleft').removeClass('fDleft');
$('.x-editor').css('border','2px solid #36d12a'); $('.fr-texteditor').css('border','2px solid #36d12a'); $('.editor-transparent').css('border','2px solid #36d12a');
|
配置单行编辑结束后的更新时间和更新人
通过控件“编辑结束”事件,配置setCellValue()函数来更改指定单元格的值
user_name = $fine_username
update_time = FORMAT(NOW(),”yyyy-MM-dd HH:mm:ss”)
user_cell = “更新人所在的单元格列号” + ROW()
update_time = “更新时间所在的单元格列号” + ROW()
1 2
| _g().setCellValue(user_cell, user_name); _g().setCellValue(time_cell, update_time);
|
round()函数计算精度丢失问题
通常在使用round函数的时候会依照参数保留小数位的值并自动四舍五入,但是由于float的精度问题,可能会导致round函数的功能失效,此时在fr中的round()有第三个参数来控制是否过量计算的问题。
1 2
| round(9999.999 / 9999.99999,2,true) * 100; round(9999.999 / 9999.99999,2,false) * 100;
|
在JS的Math.round()函数中不存在此项问题。
气泡图分数据类型显示颜色及大小
原问题链接
各位大佬,我想问一下,如果我在制作帆软报表的时候,我有两个维度的内容需要呈现,第一个维度是:每个地区的销售人员数量。第二个维度是:每个地区的销售额。这个怎么在地图上显示。销售人员越多。气泡颜色越深,销售额越多,气泡越大。谢谢各位大佬。
表模型:
| 地区 |
销售人数 |
销售额 |
| A |
18 |
300 |
| B |
20 |
400 |
| C |
22 |
500 |
通常在设置气泡图数据配置的时候,地区为系列,x为销售人数,y为销售额,大小为销售额,在条件显示中设置条件属性,来配置不同的x/销售人数,y/销售额,气泡显示的颜色及大小。
展开说一下在点地图中的气泡图如何分数据类型显示颜色及大小
相较于点地图中,数据配置没有x/y,代替的是区域名匹配或者是经纬度坐标。
解决方案就是表模型新增列:颜色分类,将不同的人数分组成不同的颜色
| 地区 |
销售人数 |
销售额 |
颜色分类 |
| A |
18 |
300 |
red |
| B |
20 |
400 |
green |
| C |
22 |
500 |
blue |
使用单元格数据 第一列的系列名为 D2 单元格 值为 C2 单元格,在条件显示中设置条件属性,配置系列名称 等于 “red” 时设置气泡为红色,此时气泡的大小就会根据销售额的值变化,颜色会根据颜色分类的每一列的值为变化。
缺点:颜色无法根据销售人数做到无极更变,而是类似于区域显示一样的分组颜色显示。若需要提示点时,需要自定义提示内容来更变系列名显示为red值的问题。
BI和Report融合工具联动配置
目前通过web组件的形式实现BI组件联动FR模板,暂不支持FR模板反向联动BI组件;
- 在仪表盘中新建web组件
- 添加网络链接,网络链接的格式为:/webroot/decision/view/report?viewlet=cptd9585d968ba24baba99508b70fa6e2191688345541337&__bi_report__=2a049fdaea3540cfafd8a79c962c9113
其中:viewlet之后的参数为FR模板的链接(支持普通报表和决策报表);__bi_report__之后的参数为仪表板的ID
- 添加完成后会自动生成__bi_session__和__bi_widget__参数,此部分参数为动态,静态写入不可用。
web组件中得report表点击链接跳转后,依然实现联动功能
需要在跳转到得链接界面传入动态参数__bi_report__,__bi_session__和__bi_widget__

点地图自定义提示
数据配置为单元格配置;

- 区域名对应 this.name
- 系列名对应 this.points[i].seriesName
- 值对应 this.points[i].value
通过for函数来遍历this.points,通过 if函数判断系列名,针对不同的系列配置不同的样式。
最后打开使用html解析文本内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| function(){ var points = this.points; var a = '<div style="font-size: 14px">' + this.name + '<HR align=center color=#5F83F9 SIZE=1>'; for(var i = 0, len = points.length; i < len; i++) { if (this.points[i].seriesName == 'A') { a += '<span style="font-size: 12px;color:#DEEFF2">' + this.points[i].seriesName + '<span/> ' + '<span style="font-size: 12px;color:#F2A917">'+ this.points[i].value + '<span/>' + '</br>' } else if(this.points[i].seriesName == 'B'){ a += '<span style="font-size: 12px;color:#DEEFF2">' + this.points[i].seriesName + '<span/> ' + '<span style="font-size: 12px;color:#F2A917">'+ this.points[i].value + '<span/>' + '<span style="font-size: 12px;color:#DEEFF2" >万方<span/>' + '</br>' } else{ a += '<span style="font-size: 12px;color:#DEEFF2">' + this.points[i].seriesName + '<span/> ' + '<span style="font-size: 12px;color:#F2A917">'+ this.points[i].value + '<span/>' + '<span style="font-size: 12px;color:#DEEFF2" >万方<span/>' + '</br>' } } return a + '<div/>';}
|
地图通过JavaScript自定义中心点和缩放等级
对图表添加初始化事件,由于数据查询的时间的问题,通常设置延迟触发。chart.setMapZoom({[zoomLevel],[viewCenter]})
1 2 3 4
| setTimeout(function () { var chart=FR.Chart.WebUtils.getChart("chart0").getChartWithIndex(0); chart.setMapZoom({zoomLevel:4,viewCenter: [118,32]}); },3000)
|
提示点自动轮播
对图表添加初始化事件,由于数据查询的时间的问题,通常设置延迟触发。chart.openAutoTooltip([delay],[initpoint]);
1 2 3 4 5
| setTimeout(function () { var chart =FR.Chart.WebUtils.getChart("chart0").getChartWithIndex(0);
chart.openAutoTooltip(); }, 3000);
|
隐藏sheet
隐藏下方sheet控制栏
1 2
| $(".fr-tabpane-controlbuttons.ui-state-enabled").hide() $(".fr-tabpane-tabscontent-bg").hide();
|
层次坐标-获取交叉表的单元格值
B2[A2:1 ;B1] 获取B2值中B1所有列的,A2第一行的值。