FR几个模块的语法特点简介

楼主
我是社区第1380位番薯,欢迎点我头像关注我哦~
一、公式编辑框
FR用到公式的地方非常多,单元格(以=开头的便被解析为公式),条件显示,数据字典,报表填报属性值定义,图表标题,轴定义,页眉页脚,甚至单元格的其他属性中的鼠标悬浮提示内容都可以写公式,虽然那个编辑框非常不像。
简单的说下自己感觉的公式要注意的几个地方:

1.if语句语法刚接触感觉比较奇怪,if(条件式子,值1,值2),if可以嵌套,if(条件式子1,值1,if(条件式子2,值2,值3))。
2.switch语句也是,具体函数我不说了。
3.对于判断用单等号和双等号都行。
4.对于字符串用单引号和双引号都行。
4.1bool只有true或者false。与逻辑还是&&或逻辑还是||。
4.2判断为空的话用isnull()。
4.3format公式。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函数,这个是在公式中直接调用数据库的方法。
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。自己看吧。http://www.finereporthelp.com/help/1/4/7.html
9.过滤公式。
过滤有两个条件类型,其一是公式条件。这个公式有一点点不同的是,可以直接写当前单元格的字段所在数据集的任何字段,相对于普通公式要灵活很多。还拿自带的销量表为例,给地区字段所在单元格过滤,公式条件可以直接写:销量==111。
10.条件属性。
条件属性要说的不是公式方面的,用的多了感觉很自然,但是刚接触的时候感觉不太好理解。简单说下。条件属性面板,上面是属性,下面是条件。当下面的条件满足,也就是返回值是true的时候,执行上面的属性设置。


------------------分割线--------------------

二、sql编辑框
数据集定义的面板,也是报表中最常用的模块之一。
1.我理解的执行过程。
这里其实是生成一个字符串,FR将这个字符串通过设置的数据连接传递到报表中执行。在这个过程中报表应该是先把报表规则的东西(比如现在6.5和7.0的规则是${}中放参数),替换成大家都认得的字符串后,对应的数据库执行完,会反馈值,有可能返回报错信息,也有可能返回数据集。这个报错信息应该是对应的数据库给的。所以说同样的sql语句,不同的数据库用不同的sql语法来执行有可能是不同的结果。比如select 'sdf'在access和sqlserver正常显示,在oracle就抛错。用select version()或者show status或者show tables能在mysql的数据集定义里正常执行,其他则不行。
sql中的and和or要和公式区别开,有人可能在公式里面把&&用成and。还有公式里面的或||在oracle中是字符串的连接符。

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 【当然如果没有加引号的话那p2就被解析为一个字段名了,这是动态字段的实现方法了】
对于存储过程,数据集定义这地方其实是支持call和exec的调用方法的。7.0中把存储过程移到服务器设置里面,是在引导大家用这种更简易的调用方法,但是6.5旧的调用方式也是支持的。

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)}


-------------------分割线----------------------

三、js编辑框
1.FR的js。
作为一款BS产品,browser端的JavaScript是必不可少的。
FR中的js是已经调用了finereport.js的。
大家知道,预览报表时,报表servlet会将cpt模板转为html,在这个html的head头部中会引入FR的js,这个finereport.js中包含了许多内置的function以及一些公有的属性,不管在模板中还是其他网页中,只要引入了finereport.js,就能够通过FR.xxx的形式调用公有的属性与方法。上面是盗用FR官方文档上的一段话。自己写的web想用FR现成的东西的话需要先引用finereport.js。

2.区别。
js大致有两种,页面相关状态的事件还有就是按钮相关的事件。按钮有三类,一类是工具栏的,一类是参数面板或者表单模式的,还有一类是填报页面的。不同按钮的某些语句稍微有些区别的。
表单是form,填报是write,以获取控件并给控件赋值为例
this.options.write.getWidgetByName("p1").setValue("aaa");//填报
this.options.form.getWidgetByName("p1").setValue("aaa");//表单,参数界面
7.0加了contentPane.getWidgetByName("p1").setValue("aaa");//对于工具栏的按钮,和单元格中的不在同一个框架或者容器,不能简单套用
js取值可以通过控件或者单元格,6.5的参数面板也是单元格的形式,这其实有点误导的地方在于,不能通过参数面板的单元格获取东西的,参数面板其实是没有单元格的,写了后会产生逻辑错误,调用了报表主体中的单元格,我们都知道有参数面板的话,参数面板是在报表主体之前加载的,甚至是在报表的加载起始事件之前,所以这样就有可能会调用还没产生的报表主体单元格。

3.js编辑框调用公式。
公式放在框架"${}"中。
比如var v1="${len('sdf')}";那么v1就为3.
这个跟数据集定义和公式交互可以比较一下。js中""下面的就是字符串,sql其实就是字符串,sql定义的地方是${}里面的是公式,于是推理下JS编辑框中"${}"就应该是公式。
但是这里要注意下,不能就这样简单类比了,毕竟处理方式上还是有区别的,sql那边是把公式参数什么的都一股脑的在报表中拼接完了,再一起送到数据库来跑,js却不能这么简单拼接。


-------------------分割线---------------

四、URL地址栏
这边就谈不上什么语法特点了,实际应用中也不会在url中直接写,大多是嵌入或者跳转的时候用。简单说下url中的参数吧。
首先是op参数。文档:http://www.finereporthelp.com/help/6/3/3.html
报表在默认情况下的预览方式是分页预览,当op参数为write时为填报预览,op=view是数据分析,op=form是表单模式
op=fs,数据决策系统
op=fr_platform,报表平台管理
op=excel_submit,后台excel导入填报
op=auth_login,登录的中间页面,需要fr_username和fr_password参数
op=fr_adhoc&cmd=ac_init_analysispane&viewname=数据集名字,单独打开BS设计器
其他的参数:
__bypagesize__ :控制是否分页
__pi__ :是否显示参数界面
__filename__ :控制导出文件名,没有的话默认用模板名
就说这些吧,需要注意一点的是,7.0版本相对于6.5版本很多参数都改动了。至少目前来说文档上有些不对应的地方,大家遇到也不要太奇怪,跟FR反映一下就可以了。


分享扩散:

沙发
发表于 2012-9-10 19:59:36
:)好帖子啊。不错。
板凳
发表于 2012-9-11 13:10:23
顶起             {:soso_e101:}
地板
发表于 2012-9-12 09:36:06
{:soso_e112:}
5楼
发表于 2012-9-12 09:54:30
来自手机
没看懂
6楼
发表于 2015-7-2 14:50:37
怎么我的IF嵌套句子,没作用
7楼
发表于 2016-8-5 10:21:49
非常感谢,好帖子
8楼
发表于 2016-9-1 14:32:58
绝对是初学者的福音
9楼
发表于 2016-10-8 09:10:36
先马克1下先马克1下
10楼
发表于 2017-4-22 12:49:09
强,学习了
11楼
发表于 2017-4-25 13:27:54
虽然过了很多年了,但是我觉得还是挺好的
12楼
发表于 2017-12-5 09:27:01
写得不错,收藏了。
13楼
发表于 2018-2-6 14:49:21
不错,收藏了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

13回帖数 2关注人数 12536浏览人数
最后回复于:2018-2-6 14:49

返回顶部 返回列表