历史版本8 :FR模块的语法汇总 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

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.select()和ds1.group()函数

比如有个模板数据集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

作为一款BS产品,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,登录的中间页面,需要fr_username和fr_password参数  

其他的参数:

__bypagesize__ :控制是否分页  

__pi__ :是否显示参数界面  

__filename__ :控制导出文件名,没有的话默认用模板名

注:下划线是两条横线。