wuxiren123

2017年1月6日 #

FineReport关于tomcat集群部署的方案

多台服务器集群后,配置权限、数据连接、模板、定时调度等,只能每台服务器一个个配置,不会自动同步到所有服务器。

针对上述情况,在FineReport中提供新集群部署插件,将xml配置文件、finedb/logdb数据(定时任务、报表目录管理、批量导入、统计信息)的修改都对主机生效。其他辅机的信息读取也都从主机读取,保证了数据同步。

实现了灾备,即主机当即后,次主机会上位接替主机的工作,保证系统正常运作。

同时还增加了集群灾备之文件同步,会将主机的finedb、xml、模板、jar包、插件等等备份到其他节点的应用上。支持可以手动同步和自动同步。

插件介绍

设计器插件、服务器插件安装好之后,新集群部署,有主机、次主机、辅机之分,配置文件都从主机读取,辅机只能用作计算引擎分担压力,有点事当改配置文件的时候,不需要每个节点都去修改,直接改主机即可。

分布式集群

分布式集群文件系统:每台计算机各自提供自己的存储空间,并各自协调管理所有计算机节点中的文件。

这里测试修改主机的报表管理目录树平台标题,然后可以看到辅机会同步修改的配置。其中报表管理目录树存在finedb中,平台样式的平台标题存在fsconfig.xml中。

  • 环境准备

设置tomcat1、tomcat2、tomcat3集群,tomcat1为主机,tomcat2为辅机,tomcat3为次主机,tomcat集群。

WebReport工程分别放在tomcat下的webapps文件夹里

  •  配置文件

集群配置完成之后,修改将配置包resource文件夹下的cluster.xml打开,如果没有这个文件的话,就新建一个,基本内容如下:

  

PublicURL是集群默认跳转地址,比如集群时对外地址是自定义端口的, ip:8888/WebReport/ReportServer?op=fs我们并不能获取到这个8888端口,因此这里需要填写实际的ip:端口号,如果这段省略不写,默认跳转80端口。

ServiceName是为tomcat的名字。

IP是该台服务器内网中的IP,就是其它服务器能与之通信的IP。

Port是报表应用的端口号,假如是部署在tomcat下,那么就是tomcat的端口号,默认是8080。例如我们的内置服务器是8079.

WebAppName是报表应用的名称,我们默认的是WebReport。

详细代码如下:

<?xml version="1.0" encoding="UTF-8" ?>

<ClusterConfig useCluster="true">

<PublicURL>

ip:端口

</PublicURL>

<ClusterService  isMain="true">

<ServiceName>tomcat1</ServiceName>

<ip>192.168.101.82</ip>

<port>6080</port>

<WebAppName>WebReport</WebAppName>

</ClusterService>

<ClusterService>

<ServiceName>tomcat3</ServiceName>

<ip>192.168.101.82</ip>

<port>8080</port>

<WebAppName>WebReport</WebAppName>

</ClusterService>

<ClusterService  isVice="true">

<ServiceName>tomcat2</ServiceName>

<ip>192.168.101.82</ip>

<port>7080</port>

<WebAppName>WebReport</WebAppName>

</ClusterService>

</ClusterConfig>

  • 测试

启动工程,等3分钟后,关闭主机,刷新fs和访问模板,此时是失败的,再等待3分钟,主次机上位,再次刷新fs和访问模板,此时是成功的。

集群同步设置

点击管理系统-集群同步,点击设置,选择需要同步的内容:配置文件(resources目录)、模板(reportlets目录)、插件和jar(plugins和lib文件夹),点击确定,然后可以选择手动同步,或者设置定时同步,点击保存即可,如下图:

共享式集群

共享式文件集群系统:多台计算机识别到同样的存储空间,并相互协调共同管理其上的文件,又被称为共享文件系统;

  • 环境准备

设置tomcat1和tomcat2集群,tomcat1为主机,tomcat2为辅机,tomcat集群。

Web项目部署在不同的服务器上,一般服务器都在同一局域网,那么共享式文件集群该如何访问呢?

这里通过共享局域网里某台电脑上的工程文件夹,多个tomcat都从这个共享的工程文件夹里读,如下图:

 

文件夹共享后,局域网内的服务器均可通过\\IP\文件夹访问共享的工程目录

 
tomcat1和tomcat2下,修改conf里server.xml文件,添加一个Context,指向项目的目录

  • 配置文件

集群配置完成之后,修改将配置包resource文件夹下的cluster.xml打开,如果没有cluster.xml,则新建一个,基本内容如下:

 共享式的集群方式,因为本身就是指向同一个文件夹的,不需要我们来做文件的同步,这里插件的作用是负载均衡。如果需要用到决策平台,需要将finebd迁移到其他数据库,例如MySQL数据库中。


posted @ 2017-01-06 15:42 喝水居然长肉 阅读(1) | 评论 (0)编辑 收藏

2016年12月28日 #

FineReport:关于扩展行列求各种条件下的函数运用

最简单的扩展列,扩展行的求“最大,最小,平均”值的例子

设计图


效果图

 

相关函数

=MAX(B2:E2)

=MIN(B2:E2)

=AVERAGE(B2:E2)

这个是(满足条件)的固定列,扩展行的求和例子

设计图

 

效果图

 

相关函数

=SUM(B2{B2 > 1} + C2{C2 > 1} + D2{D2 > 1} + E2{E2 > 1})

=SUM(B2{B2 < 1} + C2{C2 < 1} + D2{D2 < 1} + E2{E2 < 1})

=SUM(B2[!0]{B2 > 1})

=SUM(B2[!0]{B2 < 1})

固定列扩展行表求满足条件的(行/列)个数方法!

设计图

 

效果图

 

相关函数

=if(B2 > 1, 1, 0) + if(C2 > 1, 1, 0) + if(D2 > 1, 1, 0) + if(E2 > 1, 1, 0)

=count(greparray(B2:E2, item < 1))

=COUNT(B2{B2 > 1})

=COUNT(B2{B2 < 1})

扩展行扩展列求最大,最小,平均值!

设计图

 

效果图

 

相关函数

=MAX(B2)

=MIN(B2)

=AVERAGE(B2)

posted @ 2016-12-28 14:38 喝水居然长肉 阅读(2) | 评论 (0)编辑 收藏

2016年12月22日 #

如何给FineReport设置自定义消息提醒工具

     摘要: FineReport设计器有自动的消息推送功能,可设置报表定时推送和常规的日报周报推送。官方有自己的消息推送的接口,不过有些用户旺旺希望自己开发,符合自己需求的推送界面。 下面这个方案就从逻辑层面简单阐述一个通讯类应该怎么实现。 废话不多说直接上代码,为了保证新手能够看懂,这个代码基本上只需要了解JS和JQ的常规写法就行。 Code highlighting produced by Ac...  阅读全文

posted @ 2016-12-22 14:17 喝水居然长肉 阅读(0) | 评论 (0)编辑 收藏

2016年11月30日 #

FineReport如何部署Tomcat服务器集群

环境准备

Tomcat服务器集群中需要进行环境准备:

  •  ApacheApachehttp服务器,利用其对Tomcat进行负载均衡,这里使用的版本是Apache HTTP Server2.0.64
  • TmocatTmocat7.0.6
  •  JKJKTmocat提供给http服务器的插件,这里使用的版本是tmocat-connectors-1.2.37-windows-i386-httpd-2.0.x
  •  系统win7

软件安装

Apache

下载完成之后,直接安装apache,安装完成之后,在浏览器中输入http://localhost/,能够看到下图则说明安装成功:


Tomcat

解压下载好的tomcat缩包,复制三份解压好的tomcat文件夹,分别重命名为tomcat1tomcat2tomcat3

配置过程

Apache配置修改

修改httpd.conf,找到conf目录下的httpd.cof,在文件的最后一行添加:

include "C:\Program Files (x86)\Apache Group\Apache2\conf\mod_jk.conf"

新建mod_jk.conf文件,在conf目录下新建mod_jk.conf文件,内容如下:

LoadModule jk_module modules/mod_jk.so

JkWorkersFile conf/workers.properties

JkMount /*.jsp controller

解压下载的jk文件,将里面的so文件复制到Apache安装目录的modules目录下,这里下载的jk文件名为mod-jk.so。新建并编辑workers.properties文件。在conf文件夹下新建worker.properties,内容如下:

#server

worker.list = controller

#========tomcat1========

worker.tomcat1.port=11009

worker.tomcat1.host=localhost

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor = 1

#========tomcat2========

worker.tomcat2.port=12009

worker.tomcat2.host=localhost

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor = 1

#========tomcat3========

worker.tomcat3.port=13009

worker.tomcat3.host=localhost

worker.tomcat3.type=ajp13

worker.tomcat3.lbfactor = 1

 

#========controller,负载均衡控制器========

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2,tomcat3

worker.controller.sticky_session=false

worker.controller.sticky_session_force=1

#worker.controller.sticky_session=1

如果需要配置远程的tomcat服务器的话,只需要将worker.tomcat3.host=localhost中的localhost改为远程服务器的IP地址即可。本次配置都是本地的tomcat,并且在一台机器上,所以端口号都不相同,如果在不同服务器上,端口号则不需要更改。

Tomcat配置

修改之前复制好的三份tmocat中的server.xml配置,打开conf/server.xml文件,修改如下图:

tomcat1:

 


Tomcat2:

 

Tomcat3:

 


结果测试

tomcat下面的项目文件夹中修改web.xml,如这里使用test项目,则修改三个tomcat下面的test项目中的web.xml,在每个web.xml<display-name>节点后添加新的节点<distributable/>。在每个test项目文件夹下新建test.jsp,内容如下:

<%@ page contentType="text/html; charset=GBK" %>

<%@ page import="Java.util.*" %>

<html><head><title>Cluster App Test</title></head>

<body>

Server Info:

<%

out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>

<%

  out.println("<br> ID " + session.getId()+"<br>");

  // 如果有新的 Session 属性设置

  String dataName = request.getParameter("dataName");

  if (dataName != null && dataName.length() > 0) {

     String dataValue = request.getParameter("dataValue");

     session.setAttribute(dataName, dataValue);

  }

  out.println("<b>Session 列表</b><br>");

  System.out.println("============================");

  Enumeration e = session.getAttributeNames();

  while (e.hasMoreElements()) {

     String name = (String)e.nextElement();

     String value = session.getAttribute(name).toString();

     out.println( name + " = " + value+"<br>");

         System.out.println( name + " = " + value);

   }

%>

  <form action="test.jsp" method="POST">

    名称:<input type=text size=20 name="dataName">

     <br>

    :<input type=text size=20 name="dataValue">

     <br>

    <input type=submit>

   </form>

</body>

</html>

Session测试

项目部署好之后,启动三个tomcat以及Apache,启动顺序随意,然后再浏览器中输入http://localhost/test/test.jsp,结果如下图:

 

刷新页面,如下图:

 

再次刷新,如下图:

 

多次刷新页面的sessionID看是同一个ID,说明session是复制成功了。那么session中的存储的东西呢,在输入框中分别输入112233后,显示结果如下图:

 



节点插拔测试

关闭Tomcat

关闭tomcat3,刷新页面,可以不断访问tomcat1tomcat2,再关闭tomcat2,只能够访问tomcat1,说明节点关闭时运行正常。

启动Tomcat

如果重启Tomcat2,无论怎么刷新,始终访问Tomcat3,无法访问tomcat2,这时利用另外台机器访问页面,发现Tomcat2正常,然后在刷本地页面,又可以访问Tomcat2了。对于每个新来的sessionApache按照节点配置中的lbfactor比重选择访问节点,如果某节点node1不能访问,则寻找下一可访问节点,并且将此node1就在该访问session的访问黑名单中,以后该session的访问直接不考虑node1,即使node1又可以访问了。而新来的session是无黑名单的,如果新的session能够访问到node1了,则会将node1在其他所有session访问的黑名单删除,这样其他session就又能访问node1节点了。经过以上测试,说明Tomcat集群和负载均衡已经实现了。

posted @ 2016-11-30 16:01 喝水居然长肉 阅读(2) | 评论 (0)编辑 收藏

2016年10月28日 #

如何将报表系统集成到微信中?

     摘要: 如今,随着信息技术的不断发展,很多公司采用微信企业号来进行企业与员工之间的联系。其实微信企业号中右很多独立的应用。 那么如何可以将报表系统集成到微信中呢?这里分享一下在微信企业号中创建独立的报表应用,并且将微信账号单点登录到帆软报表软件FineReport的权限对接。 报表服务器环境准备 1、报表服务器环境要求 报表服务器必须是能够访问外网,并且如果是http协议则访问端口不限,如果是ht...  阅读全文

posted @ 2016-10-28 14:00 喝水居然长肉 阅读(6) | 评论 (0)编辑 收藏

2016年9月29日 #

如何利用报表工具FineReport实现报表列的动态展示

相信动态列的实现困扰了很多人,大数据量,多字段的加载将会非常耗时,数据又做不到真正的动态灵活。现有的方式都是通过变向的隐藏等方式来实现。

那该如何解决呢?这里分享帆软报表设计器FineReport的实现方案,结合实际工作中遇到的的相关内容。

我本地常用数据库是MYSQL,所以比较了解一点,所以实现方式也是基于mysql的。首先了解一下MySQL自带的information_schema数据库使用。

大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库。information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章后,你就会对information_schema数据库有所了解。

information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。

在 MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。

information_schema数据库表说明:

  •  SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
  •  TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
  • COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
  • STATISTICS表:提供了关于表索引的信息。是show index from schemaname.tablename的结果取之此表。
  •  USER_PRIVILEGES(用户权限)表:给出了关于全程权限的信息。该信息源自mysql.user授权表。是非标准表。
  • SCHEMA_PRIVILEGES(方案权限)表:给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
  • TABLE_PRIVILEGES(表权限)表:给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
  • COLUMN_PRIVILEGES(列权限)表:给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
  • CHARACTER_SETS(字符集)表:提供了mysql实例可用字符集的信息。是SHOW CHARACTER SET结果集取之此表。
  • COLLATIONS表:提供了关于各字符集的对照信息。
  • COLLATION_CHARACTER_SET_APPLICABILITY表:指明了可用于校对的字符集。这些列等效于SHOWCOLLATION的前两个显示字段。
  • TABLE_CONSTRAINTS表:描述了存在约束的表。以及表的约束类型。
  • KEY_COLUMN_USAGE表:描述了具有约束的键列。
  • ROUTINES表:提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
  • VIEWS表:给出了关于数据库中的视图的信息。需要有show views权限,否则无法查看视图信息。
  • TRIGGERS表:提供了关于触发程序的信息。必须有super权限才能查看该表

扩展的应用

  • 查看某个数据库表的记录数
selecttable_schema,table_name,table_rows from tables where TABLE_SCHEMA = '数据库名称' order by table_rowsdesc;
  • 查看数据库所占空间

selectconcat(round(sum(data_length/1024/1024),2),'MB') as data_length_MB, 

concat(round(sum(index_length/1024/1024),2),'MB')as index_length_MB 

frominformation_schema.tables where 

table_schema='数据库名';

  • 查看某个表所占空间

selectconcat(truncate(sum(data_length)/1024/1024,2),'MB') as data_size,

concat(truncate(sum(max_data_length)/1024/1024,2),'MB')as max_data_size,

concat(truncate(sum(data_free)/1024/1024,2),'MB')as data_free,

concat(truncate(sum(index_length)/1024/1024,2),'MB')as index_size

frominformation_schema.tables where TABLE_NAME = '表名';

看完之后相信可能还是有点疑惑。就是说mysql中有一个系统库information_schema。这个库中存放着mysql数据库的数据库实例名,表名称,表注释,字段名称,字段注释等等等等。而这个库的存在为我们动态列的实现就提供了一个基础。(其余的数据库oracle、sqlserver、db2等也有类似的存在。)

然后我们继续回到主题。我在本地建立了一个测试库reporttest,测试表report。在mysql库中新建一个库reporttest(或者使用已经存在的库,但是如果使用已经存在的,那么报表内部sql内容就需要更改。所以最好新建一个),然后用类似navicat的工具运行我提供的reporttest.sql文件,即可建表并且导入数据,然后刷新即可,此时数据准备完成。

设计器创建数据连接test,填写对应的数据库信息,测试成功即OK。

此时,库名称为reporttest,表名称为report,数据连接test。这时直接预览动态列实现方案.cpt。

 

可以很清晰的看到效果,选择哪个列,它就只查询那个列,只展示哪个列的数据,这就是动态列的实现方案。大家可以依据我的逻辑,替换成自己的数据连接库、表数据进行测试使用体验!

posted @ 2016-09-29 15:41 喝水居然长肉 阅读(3) | 评论 (0)编辑 收藏

2016年9月20日 #

用普通计算机假设基于liunx系统的NAS部署FineReport决策系统

何为NAS?

简单说就是连接在网络上,具备资料存储功能的装置因此也称为“网络存储器”。它是一种专用数据存储服务器。他以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。

为何选择群辉NAS

我所看重的是群辉的DSM操作系统,基于linux内核简单而且功能丰富的操作系统,群辉NAS就是一台功能丰富的电脑设备,可以娱乐,可以办公,可以视频监控等等。

仔细的小伙伴看到标题应该会有联想到何为用普通计算机假设NAS?

正是由于DSM系统的易用和高效性,决定了群辉的NAS是硬软件一体机,硬件的选择余地及可扩展性(CPU、内存)差也成为了它的硬伤。所以作为屌丝把它装在普通电脑上是在是个绝妙的主意!

好了,以上只是引言。下面我们言归正传,正式讲解在NAS-DSM系统(为了表示方面一下简称DSM)上部署Finereport数据决策系统。

安装篇

首先:我们需要在DSM系统上安装JAVA和Tomcat7.0,点开DSM的套件中心选择安装JAVAmanager及Tomcat7插件。在安装好这两个插件后,DSM会自动生成一个Tomcat文件夹并且会自动设置成共享方式。我们通过windows连接共享的方式就能方便的访问到这个文件,当然前提是你要以admin这个DSM管理员账户登录,如下图:


接下来就是进入到Tomcat\ROOT目录把里面的文件全部删除,然后把FineReport工程目录WebReport下的所有文件全部复制过来(注意:不包含WebReport目录是它下面的所有目录和文件)然后重启Tomcat,啥?你不知道如何重启?哈哈,你只是没找到而已,在DSM里一切都显得如此简单!请看下图:

还是在套件中心里找到左侧选择栏<已安装菜单>点击,然后在右侧窗口里找到安装好的tomcat。

 


其实到这里,FR已经能用http://的IP地址:7070/ReportServer?op=fs访问了。但是到这里就够了么?NO,还不够方便、tomcat的内存还需要调整,我们还要进行优化!GO!GO!

优化篇:

1、URL访问带着端口不爽!后面还要输入一堆E文字符不爽!但是DSM系统出于安全考虑,简单的通过页面访问,你根本就找不到它的系统文件(哪怕是用管理员帐号)!而大家都知道要调整这些个属性必须要找到并编辑Tomcat的server.xml。那么我们这里只能通过linux窗口命令来处理,为此我们要开启DSM系统的Telnet功能,然后通过工具来修改。

A、开启DSM系统的Telnet功能:


勾选后保存

B、用SecureCRT连接DSM系统,账户名:root密码就是你admin的密码(root密码初始是和admin密码相同的)


切换到server.xml文件所在的目录,命令用小写

cd/var/packages/Tomcat7/target/src/conf

接下来打开编辑:

viserver.xml


通过键盘方向键找到此处,按键盘上的i字母键进入编辑模式,修改为80端口(因为我80端口用掉了,所以用的是8080),修改好后按ESC键退出编辑模式,按:键进入命令行模式输入W回车。至此端口修改完毕,重启Tomcat就能不带端口访问了!

C、tomcat下访问ip直接进入op=fs界面:

小伙伴们可以参考帮助文档的那篇文章,自行设置http://help.finereport.com/doc-view-806.html

需要补充说明的是:

1、如果标题出现乱码,可以打开a.jsp将编码改为GBK

2、给出DSM系统的web.xml的位置:/var/packages/Tomcat7/target/src/conf

3、由于前面我让大家把文件复制到ROOT目录的所以帮助文档的这部分就不用再做了


2、修改Tomcat内存,提高系统运行效率。修改catalina.sh文件方法同上,限于篇幅我只给出DSM系统的位置:/var/packages/Tomcat7/target/src/bin/,添加代码部位如下图:


经过以上的设置,基本已经达到我们的要求了短URL访问:只需输入IP地址就能直接跳到登录界面了、服务器内存也修改到了我们需要的大小。

posted @ 2016-09-20 09:20 喝水居然长肉 阅读(5) | 评论 (0)编辑 收藏

2016年9月13日 #

关于报表自定义函数的应用

很多报表工具都自带大量的函数,在正常情况下足够满足用户的报表制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,报表工具FineReport提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,满足用户的自定义需求。但这些函数必须FineReport函数定义规则。以下以两个实际案例来仔细详解。

应用一:生成UPC条形码

FineReport中自带有EAN型编码,但却没有UPC条形码,但是可以通过自定义函数引用第三方包来生成UPC编码的条形码并显示出来。如输入数值12345678912,将会得到以下UPC条形码:

具体步骤怎么实现?

1、 编写自定义函数

  • 导入第三方包

在eclipse中导入第三方包barcode4j-light.jar,可在帆软论坛上下载),barcode4j是一款开源的条形码生成库,能够生成很多种编码的条形码,包括UPC码。自定义函数中可以直接调用该包中现成的方法来生成UPC条形码。

  • 自定义函数类

新建一个类Upc,完整代码如下:

package com.fr.function;

import java.awt.image.BufferedImage;
import org.krysalis.barcode4j.impl.upcean.UPCABean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;
import com.fr.script.AbstractFunction;

public class Upc extends AbstractFunction 
{
    public Object run(Object[] args) 
{
        
if (args == null || args.length < 1{
            
return "参数不对,必须有一个参数";
        }

        
try {
            
// 创建一个UPC编码生成器
            UPCABean bean = new UPCABean();
            
// 设置条形码高度,BufferedImage.TYPE_BYTE_BINARY代表常量值12,可直接使用常量值
            final int dpi = Integer.parseInt(args[1].toString());
            bean.setModuleWidth(UnitConv.in2mm(
1.0f / dpi));
            bean.doQuietZone(
false);
            BitmapCanvasProvider canvas 
= new BitmapCanvasProvider(dpi,
                    BufferedImage.TYPE_BYTE_BINARY, 
false0);
            
// 创建条形码
            bean.generateBarcode(canvas,args[0].toString());
            canvas.finish();
            
// 返回图片显示   
            return canvas.getBufferedImage();
        }
 catch (Exception e) {
            e.printStackTrace();
        }

        
return args[0];
    }

}

2、 编译自定义函数

编译Upc.java生成Upc.class文件,拷贝至报表环境目/WebReport/WEB-INF/classes/com/fr/function下;

将第三方包barcode4j-light.jar放在报表环境目录/WebReport/WEB-INF/lib文件夹下。

3、 注册自定义函数

启动设计器,点击服务器|函数管理器,新增函数取名为Upc,选择Upc.class类,如下图:

4、 Upc()函数的使用

重启服务器,在报表中使用公式==Upc(num1, num2),num1为需要生成条形码的数值,num2为生成的图片的高度。

如在单元格中输入公式:=Upc(12345678912,100),预览便可以看到条形码了。

应用二:Unicode编码转化为中文

数据库中保存的是如下形式的编码:%u5357%u4EAC-%u57CE%u5317,希望最好展示出来的是对应的中文“南京-城北”。

具体步骤如下:

1、 编写自定义函数

package com.fr.function;  

import com.fr.script.AbstractFunction;  
  
public class Ubm extends AbstractFunction 
{  
    public Object run(Object[] args) 
{  
        String str 
= args[0].toString();  
        String st 
= "";  
        StringBuffer buffer 
= new StringBuffer();  
        
while (str.length() > 0{  
            
if (str.startsWith("%u")) {  
                st 
= str.substring(26);  
                
char ch = (char) Integer.parseInt(String.valueOf(st), 16);  
                buffer.append(
new Character(ch).toString());  
                str 
= str.substring(6);  
            }
 else {  
                st 
= str.substring(0, str.indexOf("%u"));  
                buffer.append(st);  
                str 
= str.substring(st.length());  
            }
  
        }
  
        
return buffer.toString();  
    }
  
}

2、 编译自定义函数

将编译后的Ubm.class放到FineReport的安装目录WEB-INF下面的classes目录下,因为Ubm.java属于包com.fr.function,所以Ubm.class需要放到classes\com\fr\function目录下。

3、 注册自定义函数

生成该函数的类后需要在设计器中进行注册,才可以使用该函数。打开服务器|函数管理器选择刚刚定义好了Ubm类,如下图

4、 使用自定义函数

注册号自定义函数后,制作报表时便可直接使用了,使用方法与内置的函数是相同的。输入公式=Ubm("%u5357%u4EAC-%u57CE%u5317")运行如下:

展示值为“南京-城北”。


posted @ 2016-09-13 14:15 喝水居然长肉 阅读(1) | 评论 (0)编辑 收藏

2016年8月31日 #

关于Web报表FineReport打印的开发应用案例

     摘要: 报表打印是报表使用和开发过程中经常碰到的问题,这里汇总了关于Web报表开发打印功能的一些典型应用案例,以应用最广泛的FineReport为例。 案例一:java直接调用报表打印 当java后台定义定时打印的功能,同时又需要直接调用报表的打印的时候,由于打印机型号和纸张不同,需要指定打印机,从而打印是否成功并设置返回值。那么怎么样可以实现这一过程呢? 实现过程 1、定义报表运行环境 C...  阅读全文

posted @ 2016-08-31 15:29 喝水居然长肉 阅读(8) | 评论 (0)编辑 收藏

2016年8月24日 #

如何利用FineReport制作动态树报表

在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图。那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍。

思路:

通过将模版设置为组织树报表,然后通过设置树节点按钮,最好通过数据分析预览或者form表单预览即可查看效果。

步骤:

1、  初步建立模板

 建立模板就相当于建立一个excel的sheet,只不过是cpt的形式。把相应的字段拖到单元格内。

2、  增加树节点按钮

 通过设置树节点按钮来实现折叠树,分别右击单元格A1、A2、A3,选择空间设置>按钮,按钮类型选择“树节点按钮”,设置如下:

1、  保存与预览

保存模板,点击设计器中的数据分析,在网页上的预览效果即如上述所示。

动态效果展示:

用户设置了折叠树按钮后,预览报表时没有动态树效果,可能是预览模式错误。

我们是通过按钮控件实现该功能的,而普通的分页预览是不会将控件显示出来,如下图所示:

因此需要在op=view状态即数据分析下才能预览显示出效果。

折叠树延伸

需要在双向折叠树中显示对应的图表,以便查看,如下图所示:

具体步骤如下所示:

1、建立双向折叠树:

首先建立一个双向折叠树,双向折叠树需要注意折叠树数据列不可位于同一行或者同意列

2、设定节点点击事件

为了实现双向折叠树与图标的交互,需要设置树节点的点击事件,通过点击事件将树节点的值作为参数传递给图表。

下面以效果图中食品节点为例来说明控件点击事件的设置。

食品节点事件效果图如下所示

treenode_lb1()方法作用是传参,内容是:

function treenode_lb1(treenode, cv) {
    
if (treenode.selected()) {
    
if (!window.fr_lb1_param){
          window.fr_lb1_param 
= {};
       }

       window.fr_lb1_param[cv] 
= cv;
    }
 else {
      window.fr_lb1_param[cv] 
= null;
    }

    postParam();
}

demo.js中还有个方法是关联tree.cpttree_chart.cpt两个文档,内容是:

FR.doHyperlinkByPost('ReportServer?reportlet=demo/analytics/tree/tree_chart.cpt', {diqu:diqu_str,city:city_str,lb1:lb1_str,lb2:lb2_str,lx1:lx1_str,lx2:lx2_str},'iframe');
}

3、  图表模板的引入

图表模板通过树模板中的一个网页框控件引入,属性如下,关联tree_chart.cpt


上图中,控件名为空,即默认是iframe,如果设置控件名,则必须与最后一个方法中的名字对应

4、图表模版的设置

图表模板中,需要设置根据树节点传参的条件设置。

综上可以看出,动态折叠树的设计思路是点击主格时,控制附属于该组的子项内容展开与折叠,由此到达数据分析的效果。


posted @ 2016-08-24 12:03 喝水居然长肉 阅读(4) | 评论 (0)编辑 收藏

仅列出标题  下一页