1. 公式编辑框
FR 用到公式的地方非常多,单元格(以=开头的便被解析为公式),条件显示,数据字典,报表填报属性值定义,图表标题,轴定义,页眉页脚,甚至单元格的其他属性中的鼠标悬浮提示内容都可以写公式,虽然那个编辑框非常不像。
1. 语句语法刚接触感觉比较奇怪,if(条件式子,值 1,值 2),if 可以嵌套,if(条件式子1,值1,if(条件式子2,值2,值3))。
2. switch 语句。详细请查看: Switch 函数
3. 对于判断用单等号和双等号都行。
4. 对于字符串用单引号和双引号都行。
(1)bool 只有 true 或者 false。与逻辑还是 && 或逻辑还是||。
(2)判断为空的话用 isnull() 或len($$$)=0。
(3)format 公式。format 公式比较灵活。format($$$,"0.00") 可以把当前单元格的数字转换成两位小数的形式,也可以用 format(12,"预算值:0.00万元") 把 12 变成预算值:12.00 万元,这个是不是和自定义显示数据字典神马的有异曲同工之妙啊。有一点要注意的是,满位数年月日的话样式是"yyyy-MM-dd",而不是"yyyy-mm-dd",小写的 mm 的意思是分钟(minute)。
5. 公式中取单元格的话直接用 A1 这种或者 b2,跨 sheet 取值的语法是 sheet1!A1。
6. SQL 函数,直接调用数据库的方法。详情请查看:SQL 函数
7. 数据集公式。
数据集公式是公式直接调用数据集的方法。详情请查看:数据集函数
比如有个模板数据集 ds1,其字段为地区、销售员、销量,则可以用 ds1.group(地区) 获取 ds1 的地区字段,group 是分组,从而容易知道 select 是列表,ds1.select(销售员) 便是列表形式获取销售员字段,可以加上限制条件,比如 ds1.select(销售员,销量=111) 就是获取销售量为 111 的销售员集合。跟数据集相关的几个函数有 colcount、colname、row、rowcount 等。
8. 层次坐标。详情请查看:层次坐标函数
层次坐标是公式里面比较难点的,“可玩性”非常强,东西比较多,只能记住最常用的几个,能解决各种各样BT的需求。较为常用的一个就是排名公式了=count(B3[!0]{B3 > $B3})+1。自己看吧。
9. 过滤公式。详情请查看:筛选过滤
过滤有两个条件类型,其一是公式条件。这个公式有一点点不同的是,可以直接写当前单元格的字段所在数据集的任何字段,相对于普通公式要灵活很多。还拿自带的销量表为例,给地区字段所在单元格过滤,公式条件可以直接写:销量==111。
10. 条件属性。详情请查看:条件属性
简单说:条件属性面板,上面是属性,下面是条件。当下面的条件满足,也就是返回值是 true 的时候,执行上面的属性设置。
2. SQL 编辑框
数据集定义的面板,也是报表中最常用的模块之一。
2.1 执行过程
这里其实是生成一个字符串,FR 将这个字符串通过设置的数据连接传递到报表中执行。在这个过程中报表应该是先把报表规则的东西(比如现在的规则是 ${} 中放参数),替换成大家都认得的字符串后,对应的数据库执行完,会反馈值,有可能返回报错信息,也有可能返回数据集。这个报错信息应该是对应的数据库给的。所以说同样的 SQL 语句,不同的数据库用不同的 SQL 语法来执行有可能是不同的结果。比如 select 'sdf' 在 Access 和 SQLServer 正常显示,在 Oracle 就抛错。用 select version() 或者 show status 或者 show tables 能在MySQL 的数据集定义里正常执行,其他则不行。SQL 中的 and 和 or 要和公式区别开,可能有人在公式里面把 && 用成 and。还有公式里面的或||在 Oracle 中是字符串的连接符。
2.2 SQL 中调用公式
报表通过公式和参数实现与 SQL 语句的交互。
公式放在框架 ${}中。于是 ${"select * from t1"} 其实就等价于select * from t1。
数据集中用公式的难点在于拼接起来比较繁琐。
第一个例子应该是帮助文档上参数为空返回全部的sql语句:
SELECT * FROM 订单 where 1=1 ${if(len(area) == 0,"","and 货主地区 = '" + area + "'")} ${if(len(province) == 0,"","and 货主省份 = '" + province + "'")}
举个调用 FR 中 format 的例子:
select ${"'"+format(p1,"yyyy-MM-dd")+"'"} from aa
如果漏掉 format 函数前后的单引号,就会得到错误的结果。其实有的时候可以通过一些方法简化处理的,比如再声明一个变量 p2,引用这个变量的定义是 format(p1,"yyyy-MM-dd"),这时候上面的 SQL 就变成了select '${p2}' from aa
2.3 SQL中调用 SQL 函数
前面说到,SQL 语句其实是字符串。其实是可以从数据库调用字符串作为一个sql语句进行操作的。这个要用到 SQL 函数了,说例子:
=sql("FRDemo",sql("FRDemo","select testtext from test where id=2",1,1),1,1)
test 这个表里面的第二条数据的 testtext 字段就是字符串 select top 1 地区 from 销量
可以把这个字符串用在 SQL 公式中作为 SQL 语句执行
数据集定义那边这么写是可以的 ${sql("FRDemo","select testtext from test where id = 2",1,1)}
3. JS 编辑框
3.1 FR 的 JS
作为一款 B/S 产品,browser 端的 JavaScript 是必不可少的。FR中的js是已经调用了 finereport.js 的。
预览报表时,报表 Servlet 会将 cpt 模板转为 HTML,在这个 HTML 的 head 头部中会引入 FR 的 JS,这个 finereport.js 中包含了许多内置的 function 以及一些公有的属性,不管在模板中还是其他网页中,只要引入了 finereport.js,就能够通过 FR.xxx 的形式调用公有的属性与方法。
3.2 区别
JS 大致有两种,页面相关状态的事件还有就是按钮相关的事件。按钮有三类,一类是工具栏的,一类是参数面板或者决策报表模式的,还有一类是填报页面的。不同按钮的某些语句稍微有些区别的。
决策报表是 form,填报是 write,以获取控件并给控件赋值为例:
this.options.write.getWidgetByName("p1").setValue("aaa");//填报
this.options.form.getWidgetByName("p1").setValue("aaa");//决策报表,参数界面
contentPane.getWidgetByName("p1").setValue("aaa");//对于工具栏的按钮,和单元格中的不在同一个框架或者容器,不能简单套用
3.3 JS 编辑框调用公式
公式放在框架"${}"中。
比如 var v1="${len('sdf')}";那么 v1 就为 3.
这个跟数据集定义和公式交互可以比较一下。JS 中""下面的就是字符串,SQL 其实就是字符串,SQL 定义的地方是 ${} 里面的是公式,JS 编辑框中"${}"就是公式。
4. URL 地址栏
首先是 op 参数。详情请参考:op 参数的说明
报表在默认情况下的预览方式是分页预览,当op参数为write时为填报预览,op=view 是数据分析,op=form 是决策报表模式
其他 op 参数的类型:
op=fs,数据决策系统
op=excel_submit,后台 Excel 导入填报
op=auth_login,登录的中间页面,需要 fine_username 和 fine_password 参数
其他的参数:
__bypagesize__ :控制是否分页
__pi__ :是否显示参数界面
__filename__ :控制导出文件名,没有的话默认用模板名
注:下划线是两条横线。