--------------------------------------------------
常见函数列表
用户有时候需要将字符串依据某个符号进行分列显示,即将字符串转换为数组。
例如单元格A1中有为「苹果汁,牛奶,柳橙汁,巧克力,牛肉干」的字符串,希望将该字符串中的每个值在不同单元格中分列显示,如下图所示:
或者将不同单元格中的字符串拼接在一起,即将数组转成字符串。
例如单元格A1:A6值为「苹果汁」「牛奶」「柳橙汁」「巧克力」「牛肉干」的数组,希望将其转为“;”分隔的字符串,如下图所示:
创建普通报表,在A2单元格输入「苹果汁,牛奶,柳橙汁,巧克力,牛肉干」,使用“,”作为分隔符,然后在B2单元格输入公式=split(A2,","),如下图所示:
注:有时字符串数据如“苹果汁|牛奶|柳橙汁|巧克力|牛肉干”,用“|”分隔,此时需要对“|”进行转义,即公式为=split(A1,"\\|")。(\\|为转义字符)
设置B2单元格的扩展方向为纵向扩展,即将分割的数据中每个元素显示在不同单元格中,形成数组,如下图所示:
保存模板并预览。
创建普通报表,分别在A2、A3、A4、A5、A6单元格输入「苹果汁」「牛奶」「柳橙汁」「巧克力」「牛肉干」,合并B2:B6单元格,并输入公式=joinarray(A2:A6,";"),如下图所示:
保存模板并预览
在对于分组模板进行页码统计时,希望页码统计只在当前分组进行,即分组了就重新进行编码。
例如华东地区这个组内有三页数据而华北地区这个组内有两页数据,则分别标记「组内页码」,如下图所示:
首先通过「每页固定行数」来计算每组所需的总页数,如上图中华东3页,华北2页;
其次使用当前页$$page_number减去之前组的总页数获得该页在当前组的页码,如上图华北的第一页数据所在$$page_number为4,减去之前组总页数3,就是该页在华北组的页码。
添加模板数据集ds1,输入SQL语句SELECT*FROM销量,如下图所示:
新建报表,并将B3单元格设置为列表展示,如下图所示:
右击A3单元格,选择单元格属性>其他>行后分页,如下图所示:
右击B3单元格,选择条件属性>添加条件>行后分页,当满足公式&B3%10==0时,该属性起作用,如下图所示:
将1-2行设为重复标题行,使其在翻页时,每页重复显示,如下图所示:
首先要获取当前分组为第几个分组,在A1单元格中输入公式:=&A3,并将其左父格设置为A3单元格。
在B1单元格中输入公式:=roundup(count(B3)/10,0)+B1[A3:-1],获取当前分组的页码与上个分组的页码的总页码,如下图所示:
公式说明:
在E1单元格中输入公式:=if(A1=1,$$page_number+"/"+roundup(count(B3)/10,0),$$page_number-B1[A3:-1]+"/"+roundup(count(B3)/10,0)),如下图所示:
用+符号进行字符串拼接
表示当前页在当前分组的第几页
如果A1即当前分组为1,就直接为当前页/当前分组总页数;如果不为1,则当前页码减去之前所有分组的总页数和。
A1、B1都为中间运算结果,可以设置单元格格式>其他属性>不预览单元格内容,如下图所示:
同时可以在D1单元格输入「组内页码」,如下图所示:
计算数组或数据区域中所含项的个数,例如统计「地区数」和「销售员个数」,如下图所示:
也可与其他函数嵌套使用,例如进行「条件计数」,计算除孙林以外的销售员个数,如下图所示:
在报表设计中,count函数可以对单元格的个数计数,可以计算某个单元格扩展出来的个数,也可以求数组中元素的个数。
注:去重计数可通过组合count函数和UNIQUEARRAY()函数实现,例如:count(UNIQUEARRAY(A1))。
可包含任何类型数据的参数
示例:
若A1单元格扩展了5个格子且都有数据,count(A1)等于5。
若A1-A8单元格中都有数据,count(A1:A8)等于8。
count(2,3,4,5,7)等于5。
新建模板,新建数据集ds1,sql语句为SELECT*FROM销量,设置如下模板样式,并将「ds1.地区」字段拽入A2单元格,将「ds1.销售员」拽入B2单元格。在C2单元格输入公式=count(A2),在D2单元格输入公式=count(B2)。如下图所示:
count只统计单元格的个数,由于「地区」和「销售员」数据列都有重复数据,因此如果需要统计地区个数和销售员个数,则需要设置「ds1.地区」A2单元格和「ds1.销售员」B2单元格单元格显示格式为「分组」,相当于进行去重计数,如下图所示:
注:如果以「列表」格式展示数据,但却希望统计去重计数个数,则可使用count(UNIQUEARRAY())公式。
设置C2单元格的左父格为「无」,否则C2和D2单元格将跟随B2单元格扩展,无法正确计数,设置方法如下图所示:
保存模板,效果见本文1.1节。
若需要进行多条件判断,可嵌套公式,例如想要计算除了「孙林」并且销售地区为「华东」的销售员个数,可以使用公式:count(B2{B2!='孙林'&&A2='华东'})或者count(B2{AND(B2!='孙林',A2='华东')}),如下图所示:
count(B2{B2!='孙林'&&A2='华东'})或者
count(B2{AND(B2!='孙林',A2='华东')})
注:form,to,step三个参数不能为空字符串,且to参数必须有值。
Range(1,3,1)返回[1,2,3]
Range(3)返回[1,2,3]
Range(6,-1,-2)返回[6,4,2,0]
Range()函数可以用来生成数字序列,也可以通过一些转化方法生成日期序列和小数序列。
新建模板,在任意单元格中,写入公式:=Range(3),并将其单元格属性设置为向下扩展、居中显示,预览模板后结果返回1、2、3,效果如下图所示:
新建模板,在任意单元格中,写入公式:=Range(Date(2016,10,20),Date(2016,10,24)),并将其单元格属性设置为向下扩展、居中显示,预览模板后结果返回2016-10-20、2016-10-21、2016-10-22、2016-10-23、2016-10-24,效果如下图所示:
注:Range函数生成日期序列,必须使用date函数将数字格式或者字符串格式转化为日期格式,日期格式默认为'yyyy-MM-dd'格式,也可以在单元格属性中修改其他日期显示方式。
Range函数中step的步长要求为整数,若想得到小数序列,可以将Range中的form,to,step三个参数都扩大倍数使其成为一个整数,再将Range()后的结果缩小对应的倍数即可得到。
如想得到一个从0到90,step为22.5的小数序列,可先按0到900,step为225取序列,再将取得的序列除以10得到期望的小数序列。
新建模板,在任意单元格中,写入公式:=Range(0,900,225)/10,将其单元格属性设置为向下扩展、居中显示,预览模板后结果返回0、22.5、45、67.5、90,效果如下图所示:
TOIMAGE函数用于在报表中显示某一路径下的图片。支持jpg、png、bmp常用格式的图片,图片可以存储在本地磁盘,也可以存储在远程服务器,也可以为网页中图片。
TOIMAGE(path),显示指定路径下的图片。此处默认开启了图片缓存功能以加速报表的生成.如不需要缓存,请在参数后面追加值FALSE。
"F:/FineReport_10.0/webroot/logo.png"
注:斜杠必须为/
整数:图片宽度像素
百分比:图片宽度缩放比
整数:图片高度像素
百分比:图片高度缩放比
TOIMAGE("D:/1.jpg")
TOIMAGE("D:/1.jpg",false)
TOIMAGE("D:/1.jpg",true,200,300)
TOIMAGE("D:/1.jpg",true,"50%","200%")
1)使用TOIMAGE函数显示单元格图片的模板,在选择菜单栏「文件>输出>模板(内置数据)」时,图片不会伴随输出。
2)若使用TOIMAGE函数的单元格属性设置了「样式>段间距」,那么导出或打印报表时,设置的「段间距」不生效。
3)使用TOIMAGE函数返回的图片,「图片布局」为「默认」。可以在「单元格属性>样式>对齐>图片布局」处选择其他布局方式。
5)不支持gif格式。
TOIMAGE函数中可以直接输入图片路径,也可以引用存储在数据库的图片路径字段。
图片可以存储在本地磁盘,也可以存储在远程服务器上。图片存储的位置不同,path路径的写法不同。
图片绝对路径,如
E:/图片/logo-fanruan.png
报表服务器webroot目录下
省略工程所在目录的简化路径,如
help/logo-fanruan.png
TOIMAGE("help/logo-fanruan.png")
图片网络地址,如
注:报表服务器webroot为远程服务器时,设计器必须切换到对应远程服务器工作目录下。
1)若图片存储在本地磁盘E盘,路径为:E:/图片/logo-fanruan.png,将图片路径存在数据库表中,如下图所示:
2)将字段「path」拖到报表单元格中,右侧单元格属性选择「高级」,在「显示值」位置,输入公式TOIMAGE($$$),$$$表示当前单元格值,步骤如下图所示:
3)若存储在数据库的图片路径不完整,需要补全路径使图片显示。
如上述E盘中的图片,若在数据库中存储的路径为:logo-fanruan.png,需要将「显示值」的公式修改为:TOIMAGE("E:/图片/"+$$$)。
注:如果用户数据库服务器和报表应用服务器分开的话,图片应该存放在报表应用服务器上,而不是数据库服务器上。
有时用户希望能直接在数据集中取出满足条件的行列数据,不必再将数据集字段拖拽到单元格后添加过滤条件取数,此时可以使用value函数。
value函数有多种写法,不同的参数组合对应不同的取数规则。
最简形式为:Value(设计器中的数据集名称,数据集列号)
例如:
=value("ds1",3)取ds1数据集中第3列的数据,返回一个数组。
语法:
必填
表示数据集名称,注意是「报表数据集」或者是「服务器数据集」名,而非数据库中的表名。
列序号,整型;
value("ds1",1,2)取ds1数据集中第1列第2行的数据。
value("ds1",A1,A2)取ds1数据集中第A1单元格中值对应的列,第A2单元格中值对应的行的数据。
value('ds1',1,2,"牛肉干")取ds1数据集中第1列数据,对应的第2列数据是"牛肉干"的值,返回第一列数据对应值。其中「牛肉干」可换成单元格数据。
示例数据:内置数据「CUSTOMER」
新建一张模板,新建数据库查询ds1:SELECT*FROMCUSTOMER,如下图所示:
分别在单元格中输入如下公式:
=value("ds1",3)
注:由于返回的是数组,因此设置扩展属性为从上向下扩展。
=value("ds1",3,4,"America")
数据集函数概述
将数据集中的数据列直接拖拽到单元格中使用时,如果想要「条件显示」某些数据列的值,那么可以使用数据集函数。
1)参数面板中不支持使用。
3)决策报表填报事件不支持使用数据集函数。
1)概述
筛选出数据集某列中符合条件的数据,返回结果是一个数组,相同数据不会合并
注:当仅返回一条数据时,数据类型是「字符串」而不是数组。
2)注意事项
3)示例
例如数据集ds1取出内置FRDemo数据库中的「S产品」表,分别在单元格中输入以下公式:
返回数据集ds1产品名称列中的所有产品名称。
返回数据集ds1库存量大于20且订购量大于30的产品。
返回数据集ds1供应商为1或者库存量大于30的产品。
为布尔值,true表示升序,false表示降序。
注:若使用升降序参数,那么必须写筛选条件参数,若没有筛选条件,可以用true或者空格代替:例如=ds1.group(销售员,true,false)或者=ds1.group(销售员,,false)
2)示例
如数据集ds1取出内置FRDemo数据库中的「销量」表:
返回数据集ds1华东地区销售总额超过200的销售员,并且相邻数据若相同会进行合并。
返回数据集ds1销售员列中的值,并且其中只要数据相同就会进行合并,结果为降序排列,中间的参数为过滤条件,若没有条件,可以用空替代或者使用true。
返回数据集ds1华东地区的销售员,并且相邻数据若相同会进行合并。
表示列号。
如果tablename.select(#0)则输出数据表行号数组(数据条数)
tablename.select(#1)则输出数据库表中第一列的数组数据
例如数据集ds1取出内置FRDemo数据库中的「销量」表:
返回数据集中的行号
返回数据集中对应列数据
表示行号
在单元格中输入如下公式:
=if(条件,ds1.group(customerid),ds2.group(customerid))
并设置其扩展属性为从上到下。
条件为真,单元格使用数据集ds1中的customerid列,否则使用ds2中的customerid列。
在单元格输入公式=sum(ds1.select(销量)),返回数据集ds1销量列的总和。
sum求和公式也可以换用其他如count、max等。
直接将数据列拖拽到单元格时会自动从上到下扩展。但是使用数据集函数获得数据为一个数组,是显示在一个单元格中的,需要另外给单元格设置扩展属性,数据才会进行扩展。
例如在单元格输入公式=ds1.group(销售员,地区=="华东",true),设置扩展房方向为「纵向」,如下图所示:
预览报表如下图所示:
将日期型转化为中文形式
因政府、事业单位的正式文件中的落款日期都是中文的。
如:在FineReport中制作填报模板,使用了日期控件,希望在做填报时,将当前日期控件中选择的日期值(FR中默认是yyyy-MM-dd的日期格式),能够以中文的方式输出显示,然后再入库,但入库的数据还是默认的数值型的yyyy-MM-dd的日期格式。
实现效果如下图:
使用NUMTO()函数,通过字符转化方式,将其转化为中文输出即可。
NUMTO(number,bool):返回number的中文表示。
注:其中bool用于选择中文表示的方式,当没有bool时,采用默认方式(false)显示。
新建一张普通报表,右击任意单元格,选择控件设置,选择控件为日期控件,格式为yyyy-MM-dd。如下:
再右击此单元格,选择形态>公式形态,输入公式:REPLACE(NUMTO(YEAR($$$),true),"零","〇")+"年"+NUMTO(MONTH($$$),false)+"月"+NUMTO(DAY($$$),false)+"日"
注:REPLACE(NUMTO(YEAR($$$),true),"零","〇"),表示将其中输出的中文的零替换为特殊字符〇。
保存模板后,选择填报预览。
在日期控件中选择好日期后,点击其他处,显示效果如上图所示。
注:有些日期的中文形式还想含有星期,公式如下所示。
【REPLACE(NUMTO(YEAR(today()),true),"零","〇")+"年"+format(today(),'MMMMM')+NUMTO(DAY(today()),false)+"日"+format(today(),'EEEEE')】返回值为【二O一八年二月十八日星期天】
字符串与数组的相加有两种方式,一是直接使用+号,另外一种是使用字符串连接函数concatenate,那么这两个有区别吗?
字符串会和每个数组元素分别进行相加。
如公式:="a"+[1,2,3]+"b",其结果是:a1b,a2b,a3b。
数组会被作为字符串与其他字符串串联。
如公式:=concatenate("a",[1,2,3],"b"),其结果是a1,2,3b。
SQL函数
这时就可以用SQL函数。
注:行序号可以省略,这样返回值为数据列。
仅支持查询sql语句。
示例数据:内置数据库FRDemo中的STSCORE数据表。
从内置数据库「FRDemo」里的STSCORE表取第三行第三列数据值。
从表STSCORE中,可看到第3行第3列的值为Alex,如下图所示:
现在若要直接在报表的单元格中显示数据值:Alex,而不是通过先定义一个数据集后,再去取数据的方式,使用sql()公式,此时只需在单元格中输入:=sql("FRDemo","SELECT*FROMSTSCORE",3,3)即可,预览就可看到Alex值,如下图所示:
需要取出班级为Class1的第3列所有值。
在单元格中输入:=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNO='Class1'",3),显示效果(班级为Class1的第3列所有值),如下图所示:
若需要显示某个具体值,如显示Jonny(即班级为Class1的第3列第4行的值),写法如下:
=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNO='Class1'",3,4)
若参数值为变量如为报表参数或者是某个单元格,则写法如下:=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNO='"+$class+"'",3,4)或=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNO='"+A1+"'",3,4)
例如希望过滤控件选择不同班级,显示不同班级下所有的同学的名字。
显示效果如下图所示:
如果传递的参数是获取当前单元格的值,即用$$$作为参数时,字符串类型同样需要拼接单引号,例如:
=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNO='"+$$$+"'",3,4)
注1:如果参数或者单元格值有多个,那么SQL函数的写法如下:=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNOin('"+$class+"')andCOURSEin('"+$COURSE+"')",3,4)
在SQL中还可以使用IF函数进行判断并拼接模板参数,例如希望实现当参数class为空时,选择全部学生姓名,可输入公式:
=sql("FRDemo","SELECT*FROMSTSCOREwhere1=1"+if(len(class)==0,"","andCLASSNO='"+class+"'"),3)
这里的+是指字符串拼接符号
将前面的SQL语句通过+进行拼接
当参数「class」为空,查询语句相当于:SELECT*FROMSTSCORE
当参数「class」不为空时,查询语句相当于:SELECT*FROMSTSCOREWHERE1=1andCLASSNO='"+$class+"'
当参数「class」为空,相当于:sql("FRDemo","SELECT*FROMSTSCORE",3)
当参数「class」不为空时,查询语句相当于:sql("FRDemo","SELECT*FROMSTSCOREWHERE1=1andCLASSNO='"+$class+"'",3)
如果在SQL中参数为模糊查询时,可使用如下公式:
=sql("FRDemo","SELECT*FROMSTSCOREwhereCLASSNOlike'%"+$class+"%'",3,4)
例如希望对班级进行设置:当前值是Class1则显示一班,如果是Class2,则显示二班,如果是Class3,则显示三班,否则则显示四班,如下图所示:
新建数据查询ds1,数据查询语句如下:SELECT*FROMstscore,如下图所示:
1)设置模板样式,如下图所示:
2)设置公式
单击A2单元格,右键单击「单元格元素>插入数据列>高级」,或者双击单元格,点击「高级」,在自定义显示的值中填入公式:nvl(switch($$$,'Class1','一班','Class2','二班','Class3','三班'),'四班'),如下图所示:
1)PC端
保存模板,点击分页预览,如下图所示:
注:若希望不分页展示,可以选择「数据分析预览」。
2)移动端
NVL函数的使用方法:NVL(value1,value2,value3,...):在所有参数中返回第一个不是null的值。
注:6.5之前的版本NVL只支持2个参数,现在升级到支持多个参数。
下面以填报的示例来说明NVL多参数的用法。
填报应用中,可能会遇到一组单元格中,只需将其中不为空的值保存至数据库的某个字段,如下图所示,对于语文成绩级别这个字段,可能有四个值,入库的时候只保存选择的级别。
在数据库中新建一个表,表名为C,新建如下数据:
然后,添加其报表数据集ds1,SQL语句为:select*fromC
如下图所示,拖动字段到对应单元格并做相应合并:
设置B5、C5、E5、E6、E7、E8为文本类型控件即可。
对E5单元格,设置条件属性:不等于4时,公式为$$$!=4,赋新值为空,如下:
对E6单元格:设置为不等于3时,公式为$$$!=3,赋新值为空;
对E7单元格:设置为不等于2时,公式为$$$!=2,赋新值为空;
对E8单元格:设置为不等于1时,公式为$$$!=1,赋新值为空。
为了保证“优秀”等不设置控件的单元格在添加记录时能默认添加,可设置单元格属性表-其他属性>插入行策略>原值,如下图:
在NUMBERQ的值中,输入=NVL(E5,E6,E7,E8),取出第一个不为空的值进行填报,如下:
在设计器中,点击填报预览,效果:
报表中,若使用到复杂的FR脚本表达式,如:=if(很长很长的公式>0,执行语句1(很长很长的公式),执行语句2(很长很长的公式)),首先想到的是:将很长很长的公式先放在一个单元格(如:A1)中,然后在另一个单元格中,输入=if(a1>0,执行语句1(a1),执行语句2(a1))。对于这样的很长公式,一般公式中还会有部分内容是一些其他的简单运算,若再使用单元格去求算一下,最终求算最终结果时就得引用多个单元格。这样的赋值方式,不但多占用空间内存使得重复计算,其性能往往也不是很好。据此FR已增加LET公式,可将其很长的公式直接赋值,且可直接使用此公式求解最终结果(复杂的脚本表达式),还可提高其性能。
LET(变量名,变量值,变量名,变量值,...,表达式):局部变量赋值函数,参数的个数N必须为奇数,最后一个是表达式,前面是N-1(偶数)为局部变量赋值对。
LET(a,5,b,6,a+b)等于11。
下面根据如上所遇的情况示例介绍,您可根据实际情况,参照示例使用此公式。
1)一个很长的公式为((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1),若将其赋给a,需计算IF(a>1000,(a+200)/a,(a-200)*a)的结果表达式。
2)通常的做法:在任意单元格(如:A1)中,输入((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1),然后在另一个单元格(如:B1)中,输入=IF(A1>1000,(A1+200)/A1,(A1-200)*A1)。
3)而计算时是将A1中的值,对应带入其结果表达式中的。如这边带入的话就是计算=IF((((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1))>1000,((((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1))+200)/(((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1)),((((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1))-200)*(((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1)))
不仅多占用单元格且使得表达式重复计算,其性能往往也不是很好。
4)LET公式的写法:只需在单元格中直接赋值和写入结果表达式。在一个单元格中,直接输入=LET(a,((10+20+30)*MAX(10,20,30)+DATEDIF("2001/2/28","2004/3/20","D"))*COS(0.5)/ROUND(2.15,1),IF(a>1000,(a+200)/a,(a-200)*a))即可执行结果表达式,从而得出最终结果。
对比可看出,使用LET公式明显比通常的做法来得简单,且公式中若再有其他简单运算,如:最大值、平均值等等,也可不必再次占用其他单元格然后再引用此类单元格,这边可直接一步到位求算结果(亦可在LET中直接写一些常用的计算公式),这样也大大地提高了性能。
在制作报表时,某数据列如收入金额是数字类型,其中数据包含小数,且小数位数不超过2位,对该列进行求和(使用公式sum)等处理时,会发现最终的结果如:123456.409999996,即小数位数超过2位。
此时您可能会有疑问,为什么小数位数不是2位?若您的报表对有效位数比较敏感,如金额汇总,总金额最多精确到分,即小数位数最多2位,该怎么办?
此情况时,可使用round()函数对计算后的结果按指定位数四舍五入来解决。
返回某个数字按指定位数舍入后的数字。
需要进行舍入的数字
指定的位数,按此位数进行舍入。
如果num_digits大于0,则舍入到指定的小数位。
如果num_digits等于0,则舍入到最接近的整数。
如果num_digits小于0,则在小数点左侧进行舍入。
因浮点数存在精度计算丢失问题,导致计算结果里可能带上9999、0000这些,因此加入第三个参数来控制是否需要去除9999、0000。
false表示需要过滤9999、0000这些数据;true表示保留,参数为空则默认为false。
报表中的销量列求和,设计如下:
如上对收入sum求和后精度变大了。
遇到这样的情况时,可使用round函数对求和结果按2位小数位四舍五入,即B5单元格中的使用方法。
在制作报表时,我们可能需要根据某一单元格的值对数据集进行检索并返回对应的值。
此情况时,可使用map()函数,根据数据集的名字,找到对应的数据集,找到其中索引列的值为key所对应的返回值。map()函数首先检索模板数据集,再检索服务器数据集。
MAP(1001,"employee",1,2)返回employee数据集,第1列中值为1001那条记录中第2列的值。
MAP(1001,"employee","name","address")返回employee数据集,name列中值为1001那条记录中address列的值。注:只返回第一个找到的值。
MAP(object,string,int,int):根据数据集的名字,找到对应的数据集,找到其中索引列的值为key所对应的返回值。
object:索引值,需要查询的内容。
string:数据集的名字,定义的数据查询的名字。
int:索引值所在列序号。
int:返回值所在列序号。
注:后两个参数也可以写列名代替。根据数据集的名字,找到对应的数据集,找到其中索引列的值为key所对应的返回值。数据集的查找方式是依次从报表数据集找到服务器数据集。索引列序号与返回值序列号的初始值为1。
新建数据查询ds1,SQL语句如下SELECT*FROM供应商,如下图所示:
新建普通报表,分别给A1~A5单元格赋值,单击A2单元格,右键选择单元格元素,选择插入公式,公式如下:
MAP(A1,"ds1","公司名称","供应商ID")返回ds1数据集,“公司名称”列中值为A1那条记录中“供应商ID”列的值。
MAP(A1,"ds1",2,1)返回ds1数据集,第2列中值为A1那条记录中第1列的值。
MAP("妙生","ds1","公司名称","供应商ID")返回ds1数据集,“公司名称”列中值为“妙生”那条记录中“供应商ID”列的值。
MAP("妙生","ds1",2,1)返回ds1数据集,第2列中值为“妙生”那条记录中第1列的值。
语法:treelayer(TreeObject,Int,Boolean,String)
定义:返回一个树对象TreeObject第n层的值,一般为树数据集,或下拉树、视图树等树对象,并且可以设置返回值类型及分隔符。
详细解释:
最上层为1,第二层为2,依此类推,若无则返回最底层
false:返回值类型为数组,默认值
true:返回值类型为字符串
以双引号表示,默认为逗号:","
以一个下拉树控件展示FRDemo数据库中的部门层级树为例,来讲解treelayer函数的作用。
新建普通报表,新建数据集ds1,SQL语句为:select*fromdepartment,如下图所示:
新建一个树数据集Tree1,数据集为ds1,依赖字段为did,父标记字段为fid,如下图所示:
树数据集效果预览如下图所示:
在参数栏添加两个控件:一个下拉树控件和一个文本控件,如下图所示:
下拉树控件的控件名称修改为tree。勾选多选和结果返回完整层次路径。
数据字典选择自动构建,依靠树数据集Tree1构建,实际值和显示值都选择department。如下图所示:
文本控件的控件值选择公式:treelayer($tree,true,"\',\'"),如下图所示:
保存模板,点击预览,勾选总部>人力资源部>人力资源文员、总部>市场部>业务员,如下图所示:
根据文本控件值中填入的公式,预览时的返回值和分隔符也会有所不同,详情如下表所示:
人力资源文员
业务员
人力资源部
市场部
在使用FineReport进行可视化展示时,经常会需要对日期数据进行处理,本文介绍几种日期类型数据的处理应用场景。
在使用公式month()或者是day()时,如果月份或日期是一位数,则显示出来的也只有一位数,比如说1月9号,获取月份时显示的是1,而不是01,获取日期时,显示的是9,而不是09,如果需要获取到01或者是09,这个该如何通过公式实现呢?
通过公式或者自定义函数实现。
在单元格分别输入:
月份公式:=right(concatenate('0',month(today())),2)
天数公式:=right(concatenate('0',day(today())),2)
concatenate('0',month(today()))
concatenate('0',day(today()))
right(concatenate('0',month(today())),2)
right(concatenate('0',day(today())),2)
效果查看:
月份公式:=FORMAT(MONTH("2021-08-31"),"00")
天数公式:=FORMAT(day("2021-08-31"),"00")
MONTH("2021-08-31")
day("2021-08-31")
返回月份数字:8
返回天数数字:31
FORMAT(MONTH("2021-08-31"),"00")
FORMAT(day("2021-08-31"),"00")
如果觉得公式比较复杂,则可以通过自定义函数实现,代码如下:
在单元格中写入公式:="china"+FORMAT(now(),"yyyMMddhhmmss")结果为:china20180101124516,即字符串“china”后面加当前的「年月日时分秒」。
注:一般编号非必要的情况下,不要全用数字,因为在导入导出到EXCEL时数字有可能出错。