﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web报表工具-专业博客 &#187; Web报表工具-专业知识</title>
	<atom:link href="http://reportblog.cn/archives/category/webreport-prof/feed" rel="self" type="application/rss+xml" />
	<link>http://reportblog.cn</link>
	<description>报表技术知识：web报表，报表工具，表单工具，报表设计，报表系统，java报表</description>
	<lastBuildDate>Thu, 12 Jan 2012 03:24:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Web报表工具中自定义函数概述</title>
		<link>http://reportblog.cn/archives/1424</link>
		<comments>http://reportblog.cn/archives/1424#comments</comments>
		<pubDate>Mon, 31 Oct 2011 07:10:58 +0000</pubDate>
		<dc:creator>FineReport——web报表技术领跑者</dc:creator>
				<category><![CDATA[Web报表工具-专业知识]]></category>
		<category><![CDATA[finereport报表]]></category>
		<category><![CDATA[web报表工具]]></category>
		<category><![CDATA[自定义函数]]></category>

		<guid isPermaLink="false">http://reportblog.cn/?p=1424</guid>
		<description><![CDATA[函数定义规则 FineReport报表已经提供了大量的自带函数，在正常情况下足够满足用户的报表制作需求，但是在一些特殊领域，可能需要一些特殊的函数，在这种情况下，web报表工具提供了自定义函数机制，可以由用户根据业务需要自己来定义一些函数，但这些函数必须满足FineReport函数定义规则。 FineReport函数定义规则：Functionname(Para,Para,&#8230;)，其中Functionname为函数名，Para为参数。 函数原理 在FineReport报表中，每一个函数都被定义成一个类，这个类必须要实现Function这个接口，在运算的时候首先通过函数名反射取得这个类，然后调用它的run(Object[] agrs)方法。下面以SUM这个函数为例。 http://www.finereport.com/forumimages/e433.png http://www.finereport.com/forumimages/e434.png 由程序可以看到，SUM类用来运算SUM函数，他继承了NormalFunction类，而NormalFunction实现了Function这个接口。 当函数运算的时候，先根据函数名取得运算该函数的类，如SUM(2,4,true)这个函数先根据函数名取得SUM这个类，然后调用SUM类的run(Object[] args)方法，args中存放的是SUM函数的参数，运算的时候可以从args中取得参数进行运算。如执行结果为SUM(2,4,true)=2+4+1=7。 自定义函数使用步骤 Web报表工具中自定义函数使用分为四个步骤，如下： 自定义函数 编译自定义函数 注册自定义函数 使用自定义函数 研究FineReport为代表的web报表工具 Web报表主题相关文章： finereport报表软件设计概述 理解FineReport缓存系列1——数据集缓存 理解FineReport缓存系列2——数据集共享 论类Excel报表设计器标准 报表定义]]></description>
			<content:encoded><![CDATA[<p><strong>函数定义规则</strong></p>
<p><a href="http://www.finereport.com/" target="_blank">FineReport报表</a>已经提供了大量的自带函数，在正常情况下足够满足用户的报表制作需求，但是在一些特殊领域，可能需要一些特殊的函数，在这种情况下，<a href="http://www.finereport.com/web-reportingtool" target="_blank">web报表工具</a>提供了自定义函数机制，可以由用户根据业务需要自己来定义一些函数，但这些函数必须满足FineReport函数定义规则。</p>
<p>FineReport函数定义规则：Functionname(Para,Para,&#8230;)，其中Functionname为函数名，Para为参数。<span id="more-1424"></span></p>
<p><strong>函数原理</strong></p>
<p>在FineReport<a href="http://www.finereport.com/products/advantages" target="_blank">报表</a>中，每一个函数都被定义成一个类，这个类必须要实现Function这个接口，在运算的时候首先通过函数名反射取得这个类，然后调用它的run(Object[] agrs)方法。下面以SUM这个函数为例。</p>
<p><img class="alignnone" src="http://www.finereport.com/forumimages/e433.png" alt="" width="475" height="575" /></p>
<p><img class="alignnone" src="http://www.finereport.com/forumimages/e434.png" alt="" width="475" height="134" /></p>
<p><a href="http://www.finereport.com/forumimages/e433.png" target="_blank">http://www.finereport.com/forumimages/e433.png</a></p>
<p><a href="http://www.finereport.com/forumimages/e434.png" target="_blank">http://www.finereport.com/forumimages/e434.png</a></p>
<p>由程序可以看到，SUM类用来运算SUM函数，他继承了NormalFunction类，而NormalFunction实现了Function这个接口。</p>
<p>当函数运算的时候，先根据函数名取得运算该函数的类，如SUM(2,4,true)这个函数先根据函数名取得SUM这个类，然后调用SUM类的run(Object[] args)方法，args中存放的是SUM函数的参数，运算的时候可以从args中取得参数进行运算。如执行结果为SUM(2,4,true)=2+4+1=7。</p>
<p><strong>自定义函数使用步骤</strong></p>
<p><a href="http://www.finereport.com/web-reportingtool" target="_blank">Web报表工具</a>中自定义函数使用分为四个步骤，如下：</p>
<p>自定义函数</p>
<p>编译自定义函数</p>
<p>注册自定义函数</p>
<p>使用自定义函数</p>
<p>研究FineReport为代表的web报表工具</p>

<p><strong>Web报表主题相关文章：</strong></p>
<ul>
<li><a href="http://reportblog.cn/archives/872">finereport报表软件设计概述</a></li>
<li><a href="http://reportblog.cn/archives/802">理解FineReport缓存系列1——数据集缓存</a></li>
<li><a href="http://reportblog.cn/archives/805">理解FineReport缓存系列2——数据集共享</a></li>
<li><a href="http://reportblog.cn/archives/217">论类Excel报表设计器标准</a></li>
<li><a href="http://reportblog.cn/archives/7">报表定义</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://reportblog.cn/archives/1424/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>finereport报表软件设计概述</title>
		<link>http://reportblog.cn/archives/872</link>
		<comments>http://reportblog.cn/archives/872#comments</comments>
		<pubDate>Tue, 29 Jun 2010 11:43:07 +0000</pubDate>
		<dc:creator>FineReport——web报表技术领跑者</dc:creator>
				<category><![CDATA[Web报表工具-专业知识]]></category>
		<category><![CDATA[finereport报表]]></category>

		<guid isPermaLink="false">http://reportblog.cn/?p=872</guid>
		<description><![CDATA[      FineReport报表软件的设计理念，就是Excel和数据列的结合。一些基本的使用方式都和Excel类似，这就意味着你在用FineReport设计报表的时候，只需要理解一些与单元格绑定数据列有关的操作即可。并且这些操作都是后台的代码处理，基本不需要手写表达式。报表设计的流程大致可分为如下几个步骤： 配置数据源    在报表设计之前，首先要添加报表所展示的数据的来源，当然这些来源并一定是数据库，也可以是程序数据源，文本数据源等。 新建报表     在报表新建时，可以选择使用报表设计向导，也可以新建空白的自由报表，向导生成的是标准的分组表或者交叉表，生成后的报表可以自由修改。报表主设计界面是一个类似Excel的表格。 添加数据源    数据源的添加可以在新建报表之前，也可以在新建报表之后。数据源列表会显示在左侧的数据源面板当中，用户可以直接选中并拖拽数据列到单元格中。 设置数据记录摆放的方向     通常一个数据列会返回多条记录，也就是一个单元格绑定了一个数据列，但这个数据列中有多行数据。所以我们就要定义这些数据是从上到下进行列表，还是从左到右进行列表。另外，一般来说，需要汇总的数据，我们可以对其进行不扩展的设置。这是因为汇总的单元格，一般来说是作为其它单元格的附属格子来放置的。 设置数据的类型     当单元格扩展的时候，无论数据是纵向放置还是横向放置，从数据显示的角度，可以进行分组，即将数据列中所有相同内容的记录进行合并；也可以数据列表，即将数据列中的所有数据记录扩展出来，无论数据记录是否重复。 设置单元格之间的关系     除了可以绑定数据列，还有一点与Excel不同的是，FineReport的单元格在绑定了数据之后，并非平行的关系，而是格子之间存在附属关系，这种附属关系可以是默认的，也可以人为进行指定。     当一个格子默认不附属于任何格子，或者我们指定它不属于任何格子的时候，这个格子就是顶级的格子，或者可以叫做首格。首格的扩展与其他的格子没有关系，而且这个首格后面的格子将默认作为这个首格的附属格。这时候就是将Excel的所有格子分成几块相互没有关系的格子组，达到报表分片的效果。 Web报表主题相关文章： Web报表工具中自定义函数概述 理解FineReport缓存系列1——数据集缓存 理解FineReport缓存系列2——数据集共享 论类Excel报表设计器标准 报表定义]]></description>
			<content:encoded><![CDATA[<p>      FineReport<a href="http://www.finereport.com/cn/functions.html">报表软件</a>的设计理念，就是Excel和数据列的结合。一些基本的使用方式都和Excel类似，这就意味着你在用FineReport设计报表的时候，只需要理解一些与单元格绑定数据列有关的操作即可。并且这些操作都是后台的代码处理，基本不需要手写表达式。<span id="more-872"></span><strong>报表设计的流程大致可分为如下几个步骤：</strong><strong><br />
</strong><strong>配置数据源</strong><br />
   在报表设计之前，首先要添加报表所展示的数据的来源，当然这些来源并一定是数据库，也可以是程序数据源，文本数据源等。<br />
<strong>新建报表</strong><br />
    在报表新建时，可以选择使用报表设计向导，也可以新建空白的自由报表，向导生成的是标准的分组表或者交叉表，生成后的报表可以自由修改。报表主设计界面是一个类似Excel的表格。<br />
<strong>添加数据源</strong><br />
   数据源的添加可以在新建<a href="http://www.finereport.com/cn/knowledge.html">报表</a>之前，也可以在新建报表之后。数据源列表会显示在左侧的数据源面板当中，用户可以直接选中并拖拽数据列到单元格中。<br />
<strong>设置数据记录摆放的方向</strong><br />
    通常一个数据列会返回多条记录，也就是一个单元格绑定了一个数据列，但这个数据列中有多行数据。所以我们就要定义这些数据是从上到下进行列表，还是从左到右进行列表。另外，一般来说，需要汇总的数据，我们可以对其进行不扩展的设置。这是因为汇总的单元格，一般来说是作为其它单元格的附属格子来放置的。<br />
<strong>设置数据的类型</strong><br />
    当单元格扩展的时候，无论数据是纵向放置还是横向放置，从数据显示的角度，可以进行分组，即将数据列中所有相同内容的记录进行合并；也可以数据列表，即将数据列中的所有数据记录扩展出来，无论数据记录是否重复。<br />
<strong>设置单元格之间的关系</strong><strong><br />
</strong>    除了可以绑定数据列，还有一点与Excel不同的是，<a href="http://www.finereport.com/cn/company.html">FineReport</a>的单元格在绑定了数据之后，并非平行的关系，而是格子之间存在附属关系，这种附属关系可以是默认的，也可以人为进行指定。<br />
    当一个格子默认不附属于任何格子，或者我们指定它不属于任何格子的时候，这个格子就是顶级的格子，或者可以叫做首格。首格的扩展与其他的格子没有关系，而且这个首格后面的格子将默认作为这个首格的附属格。这时候就是将Excel的所有格子分成几块相互没有关系的格子组，达到报表分片的效果。</p>

<p><strong>Web报表主题相关文章：</strong></p>
<ul>
<li><a href="http://reportblog.cn/archives/1424">Web报表工具中自定义函数概述</a></li>
<li><a href="http://reportblog.cn/archives/802">理解FineReport缓存系列1——数据集缓存</a></li>
<li><a href="http://reportblog.cn/archives/805">理解FineReport缓存系列2——数据集共享</a></li>
<li><a href="http://reportblog.cn/archives/217">论类Excel报表设计器标准</a></li>
<li><a href="http://reportblog.cn/archives/7">报表定义</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://reportblog.cn/archives/872/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>理解FineReport缓存系列1——数据集缓存</title>
		<link>http://reportblog.cn/archives/802</link>
		<comments>http://reportblog.cn/archives/802#comments</comments>
		<pubDate>Sun, 13 Jun 2010 12:56:11 +0000</pubDate>
		<dc:creator>FineReport——web报表技术领跑者</dc:creator>
				<category><![CDATA[Web报表工具-专业知识]]></category>

		<guid isPermaLink="false">http://reportblog.cn/?p=802</guid>
		<description><![CDATA[         FineReport缓存技术包括数据集缓存和模板结果共享缓存，合理的使用缓存可以有效的提高性能。  一、数据集缓存         数据集缓存分为取数缓存和共享数据集 A. 取数缓存         FineReport的报表取数模型用的是叫做数据集(TableData)的二维表模型。而数据集缓存指的就是针对“数据库查询”这种数据集的取数过程所作的缓存。 背景：         数据库查询，就是通过SQL或者存储过程，从数据库服务器查询取数据传送到服务器以供报表执行用。通常这个取数的过程就是报表执行过程的一部分，因此报表的性能很大程度上依赖于取数的性能，而取数缓存就是为了解决这种性能问题而产生的。特别是数据量较大时，合理的使用缓存，可以控制性能表现。 原理：         我们知道服务器各个硬件的I/O性能是不同的，内存I/O &#62;&#62; 硬盘I/O &#62;&#62; 网络 I/O， “&#62;&#62;”表示远快于。在实际应用环境中，数据库服务器和FineReport服务器通常是在不同的服务器上，它们之间的数据交互必须要通过网络I/O来实现。而通常情况下，报表执行过程中可能对一条记录需要使用多次，如果每次都需要到数据库服务器上面去查询取数，不但增加了数据库的压力，而且速度也会很慢。为什么我们不能在第一取数后，把该数据放到本地上的内存和磁盘上，从而提高性能。这就是一种“缓存”， 暂且称为取数本地缓存。         如果把缓存放到本地，那么是放到内存还是磁盘上呢？既然内存I/O的速度比磁盘快很多，可不可以把所有的数据都放在内存上？可以是可以，但不一定是最好的选择。因为相同容量的内存比磁盘的造价高很多，所以存储的成本也要高很多。所以通常情况下，服务器的内存容量也会比磁盘小很多，如果数据库的数据都放在内存上，就很容易造成OutOfMemory。另一个极端是把所有数据都放到磁盘上?这样也不合算，因为虽然空间够用了，但是速度却不够快。所以最好的解决方案是合理的分配内存和磁盘，把那些使用频率最高的数据尽量放在内存中，从而提高在内存中的命中率。这是另一种“缓存”， 我们称之为取数内存缓存。         综上，可以看出，利用缓存技术来优化提高性能，是各种硬件性能造价的差异造成的合理结果。FineReport致力于研究合理的缓存技术来提高报表的性能。 缺陷：         缓存能够很好的提高性能，但是也有一些缺陷，特别是实时数据敏感的应用。但对于通常的报表应用来说，影响并不大。 1. 拿取数本地缓存来说，数据缓存到本地后，在缓存存活有效期，再次取数时，就不会到数据库取数了。如果此时数据库的数据发生了更新，就不能及时的反应到本地。所以缓存会导致数据延迟，可能不是最新的数据。但是，这个数据延迟的时间可以通过参数来设定。 2. 对于服务器的集群来说，各个服务器之间的缓存需要同步化。比如：当客户端第一次访问报表服务器的时候，A机器计算了报表并在A机器作了缓存，当客户端第二次访问时，例如此时跳转到B机器，B机器上找不到报表的缓存，也找不到参数的缓存，于是只好报错或者重新计算。可以通过提供了集群服务器之间通讯的能力，解决负载均衡时服务器之间跳转访问带来的缓存同步的问题。其原理是，首先，客户端第一次访问报表服务器，A机器计算了报表并在A机器作了缓存，当客户端第二次访问时，例如此时跳转到B机器，B机器根据缓存id判断出是A机器做的缓存，于是B机器向A机器发送缓存请求，A机器读取缓存并把缓存结果发送给B机器，B机器再把结果返回给客户端。 使用说明： 1.       取数本地缓存：服务器&#124;缓存参数设置            FineReport6.5对于数据库数据集内置了取数磁盘缓存技术，一般用户不需要手动设置，上图显示了本地磁盘缓存的分页大小。是否启用本地磁盘缓存，会根据下面取数内存缓存面板中的“启用磁盘缓存当记录数大于”编辑框，当编辑框中为0时，表示一直启用本地磁盘缓存 2.取数内存缓存：          打开报表设计器： 报表&#124;数据集&#124;数据集查询          如上红色箭头所指编辑框，就是取数内存缓存设置的地方，编辑框中的数字表示查询结果记录集的记录数大于多少时启用本地磁盘缓存，否则使用取数内存缓存，-1表示全部缓存到内存。 Web报表主题相关文章： Web报表工具中自定义函数概述 finereport报表软件设计概述 理解FineReport缓存系列2——数据集共享 论类Excel报表设计器标准 报表定义]]></description>
			<content:encoded><![CDATA[<p>         <a href="http://www.finereport.com/">FineReport</a>缓存技术包括<strong>数据集缓存</strong>和<strong>模板结果共享缓存</strong>，合理的使用缓存可以有效的提高性能。</p>
<p><strong> </strong><strong>一、数据集缓存</strong></p>
<p>        数据集缓存分为<strong>取数缓存</strong>和<strong>共享数据集</strong></p>
<p><strong>A. </strong><strong>取数缓存</strong></p>
<p>        FineReport的报表取数模型用的是叫做数据集(TableData)的二维表模型。而数据集缓存指的就是针对“数据库查询”这种数据集的取数过程所作的缓存。</p>
<p><span id="more-802"></span></p>
<p><strong>背景：</strong></p>
<p>        数据库查询，就是通过SQL或者存储过程，从数据库服务器查询取数据传送到服务器以供报表执行用。通常这个取数的过程就是报表执行过程的一部分，因此报表的性能很大程度上依赖于取数的性能，而取数缓存就是为了解决这种性能问题而产生的。特别是数据量较大时，合理的使用缓存，可以控制性能表现。</p>
<p><strong>原理：</strong></p>
<p>        我们知道服务器各个硬件的I/O性能是不同的，内存I/O &gt;&gt; 硬盘I/O &gt;&gt; 网络 I/O， “&gt;&gt;”表示远快于。在实际应用环境中，数据库服务器和<a href="http://www.finereport.com/">FineReport</a>服务器通常是在不同的服务器上，它们之间的数据交互必须要通过网络I/O来实现。而通常情况下，报表执行过程中可能对一条记录需要使用多次，如果每次都需要到数据库服务器上面去查询取数，不但增加了数据库的压力，而且速度也会很慢。为什么我们不能在第一取数后，把该数据放到本地上的内存和磁盘上，从而提高性能。这就是一种“缓存”， 暂且称为<strong>取数本地缓存</strong>。</p>
<p>        如果把缓存放到本地，那么是放到内存还是磁盘上呢？既然内存I/O的速度比磁盘快很多，可不可以把所有的数据都放在内存上？可以是可以，但不一定是最好的选择。因为相同容量的内存比磁盘的造价高很多，所以存储的成本也要高很多。所以通常情况下，服务器的内存容量也会比磁盘小很多，如果数据库的数据都放在内存上，就很容易造成OutOfMemory。另一个极端是把所有数据都放到磁盘上?这样也不合算，因为虽然空间够用了，但是速度却不够快。所以最好的解决方案是合理的分配内存和磁盘，把那些使用频率最高的数据尽量放在内存中，从而提高在内存中的命中率。这是另一种“缓存”， 我们称之为<strong>取数内存缓存</strong>。</p>
<p>        综上，可以看出，利用缓存技术来优化提高性能，是各种硬件性能造价的差异造成的合理结果。FineReport致力于研究合理的缓存技术来提高报表的性能。</p>
<p><strong>缺陷：</strong></p>
<p>        缓存能够很好的提高性能，但是也有一些缺陷，特别是实时数据敏感的应用。但对于通常的<a href="http://www.finereport.com/">报表</a>应用来说，影响并不大。</p>
<p>1. 拿取数本地缓存来说，数据缓存到本地后，在缓存存活有效期，再次取数时，就不会到数据库取数了。如果此时数据库的数据发生了更新，就不能及时的反应到本地。所以缓存会导致数据延迟，可能不是最新的数据。但是，这个数据延迟的时间可以通过参数来设定。</p>
<p>2. 对于服务器的集群来说，各个服务器之间的缓存需要同步化。比如：当客户端第一次访问报表服务器的时候，A机器计算了报表并在A机器作了缓存，当客户端第二次访问时，例如此时跳转到B机器，B机器上找不到报表的缓存，也找不到参数的缓存，于是只好报错或者重新计算。可以通过提供了集群服务器之间通讯的能力，解决负载均衡时服务器之间跳转访问带来的缓存同步的问题。其原理是，首先，客户端第一次访问报表服务器，A机器计算了报表并在A机器作了缓存，当客户端第二次访问时，例如此时跳转到B机器，B机器根据缓存id判断出是A机器做的缓存，于是B机器向A机器发送缓存请求，A机器读取缓存并把缓存结果发送给B机器，B机器再把结果返回给客户端。</p>
<p><strong>使用说明：</strong></p>
<ol>
<li><strong>1.       </strong><strong>取数本地缓存：</strong><em>服务器|</em><em>缓存参数设置</em><strong> </strong></li>
</ol>
<p><strong> </strong></p>
<p><img src="http://www.finereport.com/forumimages/e6.png" alt="" /></p>
<p>        <a href="http://www.finereport.com/">FineReport</a>6.5对于数据库数据集内置了取数磁盘缓存技术，一般用户不需要手动设置，上图显示了本地磁盘缓存的分页大小。是否启用本地磁盘缓存，会根据下面取数内存缓存面板中的“启用磁盘缓存当记录数大于”编辑框，当编辑框中为0时，表示一直启用本地磁盘缓存</p>
<p><strong>2.</strong><strong>取数内存缓存：</strong></p>
<p>         打开报表设计器： <em>报表|</em><em>数据集|</em><em>数据集查询</em></p>
<p><img src="http://www.finereport.com/forumimages/e7.png" alt="" /></p>
<p>         如上红色箭头所指编辑框，就是取数内存缓存设置的地方，编辑框中的数字表示查询结果记录集的记录数大于多少时启用本地磁盘缓存，否则使用取数内存缓存，-1表示全部缓存到内存。</p>

<p><strong>Web报表主题相关文章：</strong></p>
<ul>
<li><a href="http://reportblog.cn/archives/1424">Web报表工具中自定义函数概述</a></li>
<li><a href="http://reportblog.cn/archives/872">finereport报表软件设计概述</a></li>
<li><a href="http://reportblog.cn/archives/805">理解FineReport缓存系列2——数据集共享</a></li>
<li><a href="http://reportblog.cn/archives/217">论类Excel报表设计器标准</a></li>
<li><a href="http://reportblog.cn/archives/7">报表定义</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://reportblog.cn/archives/802/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>理解FineReport缓存系列2——数据集共享</title>
		<link>http://reportblog.cn/archives/805</link>
		<comments>http://reportblog.cn/archives/805#comments</comments>
		<pubDate>Sun, 13 Jun 2010 12:53:21 +0000</pubDate>
		<dc:creator>FineReport——web报表技术领跑者</dc:creator>
				<category><![CDATA[Web报表工具-专业知识]]></category>

		<guid isPermaLink="false">http://reportblog.cn/?p=805</guid>
		<description><![CDATA[数据集共享(也称SQL共享)         对于同一个报表的并发很多，或者不同的报表使用同样的数据集时，可以使用这个优化手段。 原理：         当多个报表在服务器端执行的时候，他们可能使用同样的数据库查询数据集。同样指的是这些数据库查询，经过参数处理后(在有参数的情况下)，生成的SQL是相同的。他们是不同的数据集，所以需要分别到数据库去执行SQL查询，取数等等，但他们做的却是同样的重复的事情，如果能够重用共享他们，使用同样的取数过程，不但可以节省下数据库资源，而且还可以提高取数的速度。这就是所谓数据集共享，也称SQL共享。         在多个客户端同时请求同一个报表模板时候，如果使用了数据集共享，原先的多个数据查询取数过程，现在只需要一个就可以完成。更进一步，不同的模板也可以使用同样的数据集，它们也可以共享。         FineReport的数据集共享是全局的，用户可以自己设置是否共享。每个数据库查询数据集都有一个“是否共享数据集”的属性。希望共享时，可以设置这个属性为true。当一个数据集共享之后，并非所有“同样的”数据集都可以共享此数据集，只有那些共享属性也为true的数据集才能共享。         举个例子，如果A、B两个数据集，一个共享，另一个不共享，则他们仍然是不同的取数过程。当A、B都共享时，就是同一个取数过程了。简言之，所有的共享的数据集集合分享同一个取数过程。 使用说明:         一个数据集如果希望共享，也就是希望加入其SQL对应的共享部落，只需要设置一下共享属性，打钩就行。如下： 打开报表设计器： 报表&#124;数据集&#124;数据集查询 打钩表示共享。 二、模板结果共享缓存         顾名思义，“模板结果共享缓存”就是把报表的执行结果缓存下来，存成cpt，pdf等文件，在多次访问之间共享同样的执行结果。 原理：         我们在前面的取数缓存原理中提到过，可以利用不同硬件I/O之间性能造价差异，使用缓存来提高效率，那我们这边的缓存是利用的什么性能“差异”呢？先看一个例子：         客户端A访问服务器上的报表设计模板，进过FineReport模型取数执行后，生成想要的模板结果文件，缓存到某处，并传回客户端。         而客户B访问服务器发现他想要的模板结果文件就是A缓存的那些文件，于是不经过报表模型的处理，直接去拿A缓存的那些文件，然后传回客户端。         如果要从原始模板得到客户端想要的结果模板，需要经过“FineReport模型”这一“中间层”处理产生，除非“它已经在那儿”。         由此我们可以得到与取数缓存类似的结论(“&#62;&#62;”表示远快于)：去某处缓存取模板结果 &#62;&#62; 通过报表模型产生模板结果 这边的“FineReport模型”是不很像“网络I/O”中的“网线”或者“中转站”。         正如Paul Graham所说：最纯粹、最抽象的设计难题之一，就是设计桥梁。你面对的问题，基本上就是如何使用最少的材料，跨越给定的距离。 使用说明：          为了说明报表结果缓存怎么使用，用一个例子配合说明。 步骤一：          新建一个报表，在单元格A1中写公式=Now() 步骤二：         保存为now.cpt 步骤三：         服务器&#124;缓存设置 设置模板共享缓存生存时间为10s。 步骤四：         首先是没有使用模板共享缓存的情况下，点击分页预览按钮。 http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt [...]]]></description>
			<content:encoded><![CDATA[<p><strong>数据集共享(</strong><strong>也称SQL</strong><strong>共享)</strong></p>
<p>        对于同一个<a href="http://www.finereport.com/">报表</a>的并发很多，或者不同的报表使用同样的数据集时，可以使用这个优化手段。</p>
<p><strong>原理：</strong></p>
<p>        当多个报表在服务器端执行的时候，他们可能使用同样的数据库查询数据集。同样指的是这些数据库查询，经过参数处理后(在有参数的情况下)，生成的SQL是相同的。他们是不同的数据集，所以需要分别到数据库去执行SQL查询，取数等等，但他们做的却是同样的重复的事情，如果能够重用共享他们，使用同样的取数过程，不但可以节省下数据库资源，而且还可以提高取数的速度。这就是所谓<strong>数据集共享</strong>，也称<strong>SQL</strong><strong>共享</strong>。</p>
<p><span id="more-805"></span></p>
<p>        在多个客户端同时请求同一个报表模板时候，如果使用了数据集共享，原先的多个数据查询取数过程，现在只需要一个就可以完成。更进一步，不同的模板也可以使用同样的数据集，它们也可以共享。</p>
<p>        <a href="http://www.finereport.com/">FineReport</a>的数据集共享是全局的，用户可以自己设置是否共享。每个数据库查询数据集都有一个“是否共享数据集”的属性。希望共享时，可以设置这个属性为true。当一个数据集共享之后，并非所有“同样的”数据集都可以共享此数据集，只有那些共享属性也为true的数据集才能共享。</p>
<p>        举个例子，如果A、B两个数据集，一个共享，另一个不共享，则他们仍然是不同的取数过程。当A、B都共享时，就是同一个取数过程了。简言之，所有的共享的数据集集合分享同一个取数过程。</p>
<p><strong>使用说明:</strong></p>
<p>        一个数据集如果希望共享，也就是希望加入其SQL对应的共享部落，只需要设置一下共享属性，打钩就行。如下：</p>
<p>打开报表设计器： <em>报表|</em><em>数据集|</em><em>数据集查询</em></p>
<p><img src="http://www.finereport.com/forumimages/e8.png" alt="" /></p>
<p>打钩表示共享。</p>
<p>二、<strong>模板结果共享缓存</strong><strong></strong></p>
<p>        顾名思义，“模板结果共享缓存”就是把报表的执行结果缓存下来，存成cpt，pdf等文件，在多次访问之间共享同样的执行结果。</p>
<p><strong>原理：</strong></p>
<p>        我们在前面的<strong>取数缓存</strong>原理中提到过，可以利用不同硬件I/O之间性能造价差异，使用缓存来提高效率，那我们这边的缓存是利用的什么性能“差异”呢？先看一个例子：</p>
<p>        客户端A访问服务器上的报表设计模板，进过<a href="http://www.finereport.com/">FineReport</a>模型取数执行后，生成想要的模板结果文件，缓存到某处，并传回客户端。</p>
<p>        而客户B访问服务器发现他想要的模板结果文件就是A缓存的那些文件，于是不经过报表模型的处理，直接去拿A缓存的那些文件，然后传回客户端。</p>
<p>        如果要从原始模板得到客户端想要的结果模板，需要经过“FineReport模型”这一“中间层”处理产生，除非“它已经在那儿”。</p>
<p>        由此我们可以得到与<strong>取数缓存</strong>类似的结论(“&gt;&gt;”表示远快于)：<strong>去某处缓存取模板结果 &gt;&gt; </strong><strong>通过报表模型产生模板结果</strong></p>
<p>这边的“FineReport模型”是不很像“网络I/O”中的“网线”或者“中转站”。</p>
<p>        正如<strong><span style="text-decoration: underline"><a href="http://en.wikipedia.org/wiki/Paul_Graham" target="_blank">Paul Graham</a></span></strong>所说：最纯粹、最抽象的设计难题之一，就是设计桥梁。你面对的问题，基本上就是如何使用最少的材料，跨越给定的距离。</p>
<p><strong>使用说明：</strong><strong></strong></p>
<p>         为了说明报表结果缓存怎么使用，用一个例子配合说明。</p>
<p>步骤一：</p>
<p>         新建一个<a href="http://www.finereport.com/">报表</a>，在单元格A1中写公式=Now()</p>
<p><img src="http://www.finereport.com/forumimages/e9.png" alt="" /></p>
<p>步骤二：</p>
<p>        保存为now.cpt</p>
<p><img src="http://www.finereport.com/forumimages/e10.png" alt="" /></p>
<p>步骤三：</p>
<p><em>        服务器</em><em>|</em><em>缓存设置</em><em></em></p>
<p>设置模板共享缓存生存时间为10s。</p>
<p><img src="http://www.finereport.com/forumimages/e11.png" alt="" /></p>
<p>步骤四：</p>
<p>        首先是没有使用模板共享缓存的情况下，点击分页预览按钮。</p>
<p>http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt</p>
<p><img src="http://www.finereport.com/forumimages/e12.png" alt="" /></p>
<p>        不断的刷新浏览器，会看到时间会不断刷新，说明每次都会经过FineReport模型计算</p>
<p>步骤五：</p>
<p>        修改url，在后面加上__cache__=true，表示使用模板共享缓存，如下：</p>
<p>http://localhost:8075/WebReport/ReportServer?reportlet=now.cpt&#038;__cache__=true</p>
<p>         不断刷新浏览器，会看到在10秒以内，时间不会变化，但是一旦超过10s，显示的时间就会更新，说明模板共享缓存起作用了。</p>
<p>        另外，模板共享缓存的使用借鉴了数据集缓存的想法，就是只有两个模板的访问地址都有__cache__=true的时候，他们才会共享模板结果，此时如果另一个访问希望使用缓存，只要在url后面加上__cache__=true就行了。如果一个带有__cache__=true参数的模板第一次访问时没有缓存，则会创建缓存，缓存超过“最大生存时间”或着未被使用的时间超过“最大空闲”时间，那么会自动更新缓存。所以，可以根据对数据时效的敏感程度不同设置“最大生存时间”。</p>
<p><strong>三、缓存设置面板的使用说明</strong><strong></strong></p>
<p>        打开设计器，<em>服务器</em><em>|</em><em>缓存设置</em></p>
<p><img src="http://www.finereport.com/forumimages/e13.png" alt="" /></p>
<ol>
<li><strong>缓存路径设置</strong>，是报表服务器上所有缓存数据存放的路径，此路径一般需要在部署时设置。</li>
<li><strong>内存缓存容量</strong>是使用取数本地缓存时，每个数据集最大的内存容量，默认为48MB</li>
<li>数据集和结果模板的<strong>共享属性设置</strong>中包括4项：</li>
</ol>
<p><strong>最大活动对象</strong>，是指在缓存容器中最大放置的缓存对象个数，如果活动对象数超过此数目，则服务器会根据下面的<strong>缓存策略</strong>来选择哪些对象留下，哪些被去除，FIFO表示先进来的先出去。</p>
<p><strong>最大空闲时间</strong>指的是缓存对象在容器中停留不被使用不能超过的时间，也就是空闲的时间，如果空闲的时间超过这个时间，此对象就会被移除。</p>
<p><strong>最大生存时间</strong>指的是缓存对象在容器中存活的最大时间，无论是否活动，一旦超过此时间，此缓存对象就失效，将会被移除。</p>
<p>如何灵活协调的设置这些参数，需要根据上面说的那些原理来确定。没有明确原因时，不建议改动。</p>

<p><strong>Web报表主题相关文章：</strong></p>
<ul>
<li><a href="http://reportblog.cn/archives/1424">Web报表工具中自定义函数概述</a></li>
<li><a href="http://reportblog.cn/archives/872">finereport报表软件设计概述</a></li>
<li><a href="http://reportblog.cn/archives/802">理解FineReport缓存系列1——数据集缓存</a></li>
<li><a href="http://reportblog.cn/archives/217">论类Excel报表设计器标准</a></li>
<li><a href="http://reportblog.cn/archives/7">报表定义</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://reportblog.cn/archives/805/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>论类Excel报表设计器标准</title>
		<link>http://reportblog.cn/archives/217</link>
		<comments>http://reportblog.cn/archives/217#comments</comments>
		<pubDate>Tue, 14 Jul 2009 18:20:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web报表工具-专业知识]]></category>
		<category><![CDATA[报表设计器]]></category>
		<category><![CDATA[类excel报表]]></category>

		<guid isPermaLink="false">http://reportblog.cn/?p=217</guid>
		<description><![CDATA[         企业采购报表工具有一个很重要方面，从报表设计人员角度考虑，选择易学，易用，易维护的报表设计器。于是很多报表厂商都选择学习Excel，设计出类excel报表设计器。解决报表的复杂表样，提高制作报表的效率，并且国内的用户大都非常熟悉 Excel 的使用。从设计的方便性来说，厂商们需要提供一个尽可能贴近 Excel 使用习惯的报表设计器。          但凡支持类 Excel 报表设计的设计器，除了和Excel单元格命名相同，单元格基本属性相同，单元格内容编辑方式相同，Excel提供相同函数和无缝导出导出excel之外，还要具备如下功能： 浮动图表元素图表元素如果能浮动在excel元素至少，就能任意控制图表显示位置，做到更加灵活图表定位，特别是以向量为模型的Excel报表。 相同多Sheet使用方法多sheet在Excel制作过程广泛使用，如果在报表工具中没有办法很方便创建多sheet，让用户很困惑。 拖动复制单元格内容如果相连单元格具有相似性，比方值分别为：1、2、3、4、5，如果能通过鼠标拖动能快速复制。 插入图片能保存在报表文件中如果只是保存一个图片相对路径，这样对后期报表维护来说是一个巨大工作量。所以图片一定要保存报表文件中。 完全兼容Excle公式比方如果Excel中写一个SUM（C1，C2），导入到类Excel报表设计器后，这个公式要能计算。 Web报表主题相关文章： Web报表工具中自定义函数概述 finereport报表软件设计概述 理解FineReport缓存系列1——数据集缓存 理解FineReport缓存系列2——数据集共享 报表定义]]></description>
			<content:encoded><![CDATA[<p>         企业采购报表工具有一个很重要方面，从报表设计人员角度考虑，选择易学，易用，易维护的报表设计器。于是很多报表厂商都选择学习Excel，设计出类excel报表设计器。解决报表的复杂表样，提高制作报表的效率，并且国内的用户大都非常熟悉 Excel 的使用。从设计的方便性来说，厂商们需要提供一个尽可能贴近 Excel 使用习惯的报表设计器<span id="more-217"></span>。</p>
<p>         但凡支持类 Excel 报表设计的设计器，除了和Excel单元格命名相同，单元格基本属性相同，单元格内容编辑方式相同，Excel提供相同函数和无缝导出导出excel之外，还要具备如下功能：</p>
<ul>
<li><strong>浮动图表元素</strong>图表元素如果能浮动在excel元素至少，就能任意控制图表显示位置，做到更加灵活图表定位，特别是以向量为模型的Excel报表。</li>
<li><strong>相同多Sheet使用方法</strong>多sheet在Excel制作过程广泛使用，如果在报表工具中没有办法很方便创建多sheet，让用户很困惑。</li>
<li><strong>拖动复制单元格内容</strong>如果相连单元格具有相似性，比方值分别为：1、2、3、4、5，如果能通过鼠标拖动能快速复制。</li>
<li><strong>插入图片能保存在报表文件中</strong>如果只是保存一个图片相对路径，这样对后期报表维护来说是一个巨大工作量。所以图片一定要保存报表文件中。</li>
<li><strong>完全兼容Excle公式</strong>比方如果Excel中写一个SUM（C1，C2），导入到类Excel报表设计器后，这个公式要能计算。</li>
</ul>
<p><!-- InstanceEndEditable --></p>

<p><strong>Web报表主题相关文章：</strong></p>
<ul>
<li><a href="http://reportblog.cn/archives/1424">Web报表工具中自定义函数概述</a></li>
<li><a href="http://reportblog.cn/archives/872">finereport报表软件设计概述</a></li>
<li><a href="http://reportblog.cn/archives/802">理解FineReport缓存系列1——数据集缓存</a></li>
<li><a href="http://reportblog.cn/archives/805">理解FineReport缓存系列2——数据集共享</a></li>
<li><a href="http://reportblog.cn/archives/7">报表定义</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://reportblog.cn/archives/217/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>报表定义</title>
		<link>http://reportblog.cn/archives/7</link>
		<comments>http://reportblog.cn/archives/7#comments</comments>
		<pubDate>Sun, 05 Jul 2009 12:41:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web报表工具-专业知识]]></category>
		<category><![CDATA[报表定义]]></category>

		<guid isPermaLink="false">http://reportblog.cn/?p=7</guid>
		<description><![CDATA[       报表就是用表格、图表等格式来动态显示数据，可以用公式表示为：“报表 ＝ 多样的格式 ＋ 动态的数据”。        报表是企业管理的基本措施和途径，是企业的基本业务要求，也是实施 BI 战略的基础。报表可以帮助企业访问、格式化数据，并把数据信息以可靠和安全的方式呈现给使用者。     报表分类：  EXCEL、WORD等编辑软件：它们可以做出很复杂的报表格式，但是由于它们没有定义专门的报表结构来动态的加载报表数据，所有这类软件中的数据都是已经定义好的，静态的，不能动态变化的。它们没有办法实现报表软件的“数据动态化”特性。 数据库软件：它们可以拥有动态变化的数据，但是这类软件一般只会提供最简单的表格形式来显示数据。它们不具备报表软件能够实现“格式多样化”的特性。 报表软件：它们有专门的报表结构来动态的加载数据，同时也能够实现报表格式的多样化      报表绘制方式： 根据报表的绘制方式，报表工具大致可以分为SQL画布方式，Cell单元格方式和两者结合型： SQL画布方式报表工具的特点是将报表水平分割成若干个区域，在各个区域上放置报表组件，报表组件位置可以是任意的，各组件可以互相重叠。画布式报表工具的优点是可以做到可视化数据绑定，组件位置自由。缺点是插入列、组件对齐困难，画表格线经常出现线与线之间的错开现象。这种报表只是很好的解决了“报”的问题，但对于“表”的问题依然存在。比较著名的画布式报表工具主要有CrystalReport、FastReport等。 CELL单元格式报表工具，是将报表看作是由一系列连续的单元格组成的区域。要改变报表组件（一般是文本或图形）的位置，只能通过改变行高列宽方式进行，组件之间不能重叠，单元格可以合并。单元格式报表工具的优点是画线，插入列，多行列标题绘制非常方便，但格子中的动态数据绑定，往往需要手写公式来进行。这种报表只是很好的解决了“表”的问题，但对于“报”的问题依然存在。F1BOOK是一款比较著名的单元格式报表工具。 两者结合型报表工具，融合上面两种报表工具的特点，使用户可以可视化地动态绑定数据，也可以象Excel一样来画线，从而提高报表设计的效率。FineReport是属于这种两者优势结合型的报表。 Web报表主题相关文章： Web报表工具中自定义函数概述 finereport报表软件设计概述 理解FineReport缓存系列1——数据集缓存 理解FineReport缓存系列2——数据集共享 论类Excel报表设计器标准]]></description>
			<content:encoded><![CDATA[<p>       报表就是用表格、图表等格式来动态显示数据，可以用公式表示为：“报表 ＝ 多样的格式 ＋ 动态的数据”。</p>
<p>       报表是企业管理的基本措施和途径，是企业的基本业务要求，也是实施 BI 战略的基础。报表可以帮助企业访问、格式化数据，并把数据信息以可靠和安全的方式呈现给使用者<span id="more-7"></span>。</p>
<ol>
<li><strong>    报表分类：</strong>
<ul>
<li><strong> </strong><a href="http://www.finereport.com/cn/articles/excel.html" target="_blank">EXCEL</a>、WORD等编辑软件：它们可以做出很复杂的报表格式，但是由于它们没有定义专门的报表结构来动态的加载报表数据，所有这类软件中的数据都是已经定义好的，静态的，不能动态变化的。它们没有办法实现报表软件的“数据动态化”特性。</li>
<li><a href="http://www.finereport.com/cn/articles/database1.html" target="_blank">数据库软件</a>：它们可以拥有动态变化的数据，但是这类软件一般只会提供最简单的表格形式来显示数据。它们不具备报表软件能够实现“格式多样化”的特性。</li>
<li>报表软件：它们有专门的报表结构来动态的加载数据，同时也能够实现报表格式的多样化 </li>
</ul>
</li>
<li><strong>    报表绘制方式：</strong> 根据报表的绘制方式，报表工具大致可以分为SQL画布方式，Cell单元格方式和两者结合型：
<ul>
<li>SQL画布方式报表工具的特点是将报表水平分割成若干个区域，在各个区域上放置报表组件，报表组件位置可以是任意的，各组件可以互相重叠。画布式报表工具的优点是可以做到可视化数据绑定，组件位置自由。缺点是插入列、组件对齐困难，画表格线经常出现线与线之间的错开现象。这种报表只是很好的解决了“报”的问题，但对于“表”的问题依然存在。比较著名的画布式报表工具主要有<a href="http://www.finereport.com/cn/articles/crystalreport.html" target="_blank">CrystalReport</a>、<a href="http://baike.baidu.com/view/1367656.htm" target="_blank">FastReport</a>等。</li>
<li>CELL单元格式报表工具，是将报表看作是由一系列连续的单元格组成的区域。要改变报表组件（一般是文本或图形）的位置，只能通过改变行高列宽方式进行，组件之间不能重叠，单元格可以合并。单元格式报表工具的优点是画线，插入列，多行列标题绘制非常方便，但格子中的动态数据绑定，往往需要手写公式来进行。这种报表只是很好的解决了“表”的问题，但对于“报”的问题依然存在。<a href="http://blog.csdn.net/jvict/articles/246467.aspx" target="_blank">F1BOOK</a>是一款比较著名的单元格式报表工具。</li>
<li>两者结合型报表工具，融合上面两种报表工具的特点，使用户可以可视化地动态绑定数据，也可以象Excel一样来画线，从而提高报表设计的效率。<a href="http://www.finereport.com" target="_blank">FineReport</a>是属于这种两者优势结合型的报表。</li>
</ul>
</li>
</ol>

<p><strong>Web报表主题相关文章：</strong></p>
<ul>
<li><a href="http://reportblog.cn/archives/1424">Web报表工具中自定义函数概述</a></li>
<li><a href="http://reportblog.cn/archives/872">finereport报表软件设计概述</a></li>
<li><a href="http://reportblog.cn/archives/802">理解FineReport缓存系列1——数据集缓存</a></li>
<li><a href="http://reportblog.cn/archives/805">理解FineReport缓存系列2——数据集共享</a></li>
<li><a href="http://reportblog.cn/archives/217">论类Excel报表设计器标准</a></li>
</ul><br />
]]></content:encoded>
			<wfw:commentRss>http://reportblog.cn/archives/7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

