当前位置:文档之家› Jasper Report用户手册

Jasper Report用户手册

Jasper Report用户手册
Jasper Report用户手册

Jasper Report用户手册

version1.0

作者:薛笛

EMail:jxuedi@https://www.doczj.com/doc/c12077978.html,

严正声明:本来我在以前把JasperReport1.0的用户文档由中文译成了英文,花了两周多时间写了几万字,并把它贴到了CSDN的Blog上,并凡是要翻译完的PDF文档的朋友我都尽量给邮过去。但是最近我发现问我要文档的人总管我叫“良子大哥”,我开始还不明所以,后来一查才知道CSDN上有个叫良子的人把我翻译的东西整理了一下,调整了一下格式变成了他的作品,上面压根就没提我,但是里面的注明的索要文档PDF版的E-Mail (jxuedi@https://www.doczj.com/doc/c12077978.html,)却是还是我的—所以别人还是问我要PDF文档!!这令我十分不爽。本来嘛,我想公开大家看是件好事,但你不能连个转载标志也不写啊!??这行为不是明抢吗,做人不能这样啊?但是今天我终于想通了,我好歹也念过这么多年书,不能和他一般见识,最终又重新把它贴出来,不过还是希望不要有人再这么做。

Jasper Report用户手册 (i)

version1.0. i

1 简介 (1)

2 API概览 (2)

Class net.sf.jasper.engine.design.JasperDesign. 2

Class net.sf.jasper.engine.JasperReport4

Class net.sf.jasper.engine.JasperCompileManager4

Class net.sf.jasper.engine.JasperPrint4

Interface net.sf.jasper.engine.JRDataSource. 4

Class net.sf.jasper.engine.JRResultSetDataSource. 5

Class net.sf.jasper.engine.data.JRTableModelDataSource. 5

Class net.sf.jasper.engine.JREmptyDataSource. 5

Class net.sf.jasper.engine.JasperFillManager5

Class net.sf.jasper.engine.JRAbstractScriptlet6

Class net.sf.jasper.engine.JRDefaultScriptlet6

Class net.sf.jasper.engine.JasperPrintManager6

Class net.sf.jasper.engine.JasperExportManager7

Class net.sf.jasper.engine.JasperRunManager7

Class net.sf.jasper.view.JRV iewer7

Class net.sf.jasper.view.JasperV iewer7

Class net.sf.jasper.view.JasperDesignViewer7

Class net.sf.jasper.engine.util.JRLoader7

3 主要的任务和过程 (8)

3.1 XML解析 (8)

3.2 编译报表设计(Report Designs)9

3.3 Report Design 预览 (12)

3.4报表装填(Filling Report) (13)

3.5 查看报表(V iewing Reports) (15)

3.6 打印报表 (15)

3.7 导出报表 (16)

3.8 对象的载入和保存 (16)

4 报表设计(Report Designs) (17)

4.1 DTD Reference. 17

4.2 XML 编码 (18)

4.3 报表属性 (19)

Report Name. 19

Column Count(列数) (20)

Print Order(打印顺序) (20)

Page Size(页面大小) (21)

Page Orientation(默认设置为Portrait) (21)

Page Margins(页边距) (21)

Empty Data Source Behavior22

Scriptlet Class22

5 报表数据(Report Date) (23)

5.1 表达式(expressions) (23)

5.2 参数(Parameters) (24)

参数名 (25)

参数类型 (25)

Prompting for Parameter values26

参数的默认值(parameter default value) (26)

5.2.1 内置的报表参数 (27)

5.3 Data Source(数据源) (28)

5.4 报表查询(Report Query) (30)

5.5 字段(Field) (32)

字段名(Field Name) (33)

字段类型(Field Class) (34)

字段描述(Field Description) (34)

5.6 变量(V ariables) (35)

变量名(V ariable Name) (35)

变量类型(V ariable Class) (35)

重置类型(Reset Type) (36)

Reset Group. 36

5.6.1 运算(Calculations) (36)

5.6.2 内置的报表变量(Build-in Report V ariables) (39)

6 Report Sections41

6.1 Main Report Sections42

6.2 Data Grouping. 43

Group Name. 44

Group Header44

Group Footer44

7 Scriptlets45

8 Report Elements46

Absolute Position. 46

Relative Position. 47

Element Size. 47

Element Color47

8.1 Text Elements51

8.1.1 Fonts and Unicode Support51

8.1.2 Static Texts55

8.1.3 Text Fields56

8.2 Graphic Elements58

8.2.1 Lines59

8.2.2 Rectangles60

8.2.3 Images60

8.2.4 Charts and Graphics62

8.3 Hyperlinks63

8.4 Element Groups64

9 Subreports65

9.1 Subreport Parameters67

9.2 Subreport Data Source. 68

10 Advanced JasperReports68

10.1 XML Report Designs Loading and Writing. 68

10.2 Implementing Data Sources69

10.3 Customizing Viewers69

10.4 Exporting to New Output Formats70

1 简介

JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF,HTML,或者XML格式。最重要的是它是开源的,这给我们带来很大方便,但是文档却要钱,让人不爽。不过人总要生存,再说,做这么一个好东西,用户总不能一点代价也不付(虽然对于中国普通程序原来说太贵了点)。它还有一个相关的开源工程—IReport,这是一个图形化的辅助工具,因为JasperReport仅提供了可使用的类库而未提供更好的开发工具,IReport的出现解决了这一难题。它们配合使用将会更大程度的提高效率。

该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。它的主要目的是辅助生成面向页面的(page oriented),准备付诸打印的文档。JasperReport借由定义于XML文档中的report design进行数据组织。这些数据可能来自不同的数据源,包括关系型数据库,collections,java对象数组。通过实现简单的接口,用户可以将report library插入到订制好的数据源中,在以后我们将提到有关内容。

其实这是一份JasperReport Ultimate Guide的简单翻译以及我的理解和例子。在最后,我将描述一个我正在做的工程,将其中用到的相关信息贡献出来。我这么做是因为当我在学这个类库的时候苦于很少有相关的中文文档,诱惑语焉不详,希望其他人不再受苦。这个文档将分几次贴出来,与原文档的章节相对应。这份文档的Word形式将在全部完成之后放在我的

公开邮箱中与各位共享。我的EMail是jxuedi@https://www.doczj.com/doc/c12077978.html,有什么意见或想法请与我联系。闲言少叙,进入正题。

2 API概览

上图为一个生成报表并打印(导出)的全过程。我将会把涉及到的重要的类进行一一说明。Class net.sf.jasper.engine.design.JasperDesign

这是一个未经加工的报表实例,供JasperReport Library使用。这个类可以在JasperReport类库内置的XML解析器对XML report design进行解析处理之后得到。如果你的程序不想对直接XML文件进行操作,在例子noxmldesign中有不使用XML设计文件而动态生成这个类的方法。我们稍稍看看这个例子:

import 略

public class NoXmlDesignApp

{

private static JasperDesign getJasperDesign() throws JRException

{

//JasperDesign定义JasperDesign的头信息

JasperDesign jasperDesign = new JasperDesign();

jasperDesign.setName("NoXmlDesignReport");

.剩余略

//Fonts定义使用到的字体

JRDesignStyle normalStyle = new JRDesignStyle();

normalStyle.setName("Arial_Normal");

//Parameters 定义Parameters的内容—这个内容以后会提到

JRDesignParameter parameter = new JRDesignParameter();

parameter.setName("ReportTitle");

parameter.setV alueClass(https://www.doczj.com/doc/c12077978.html,ng.String.class);

jasperDesign.addParameter(parameter);

parameter = new JRDesignParameter();

parameter.setName("OrderByClause");

parameter.setV alueClass(https://www.doczj.com/doc/c12077978.html,ng.String.class);

jasperDesign.addParameter(parameter);

//Query 定义查询

JRDesignQuery query = new JRDesignQuery();

query.setText("SELECT * FROM Address $P!{OrderByClause}");

jasperDesign.setQuery(query);

//Fields

JRDesignField field = new JRDesignField();

field.setName("Id");

field.setV alueClass(https://www.doczj.com/doc/c12077978.html,ng.Integer.class);

jasperDesign.addField(field);

//V ariables 定义变量

JRDesignV ariable variable = new JRDesignV ariable();

variable.setName("CityNumber");

variable.setV alueClass(https://www.doczj.com/doc/c12077978.html,ng.Integer.class);

variable.setResetType(JRV ariable.RESET_TYPE_GROUP);

//Groups 定义组

group.setMinHeightToStartNewPage(60);

expression = new JRDesignExpression();

//余下定义一个文档的其他内容,这里省略

return jasperDesign;

}

从getJasperDesign()方法我们可以看出,这个应用程序并没有从XML文件里面将report design提取出来在生成JasperDesign类,而是直接利用JasperDesign提供的函数生成了一个报表设计。这样做的原因是基于灵活性的考虑,你可以在程序中随时动态生成报表,而不需要去从硬盘或网络中读取XML设计文件。但通常我不这么做,因为比较麻烦,而且要对JasperReport的每个元素都非常熟悉才行。

Class net.sf.jasper.engine.JasperReport

这个类的实例包含了一个经过编译的report design对象。生成它的时机是对报表编译之后,但尚未对其填入数据的时候。编译过程中,JasperReport需要生成一个临时的类文件,用以保存report expression,如变量表达式,文本,图像表达式,组表达式等等。这个临时的Java Source File是被动态编译的,编译器使用的是JDK中用来执行应用程序的编译器类(compiler class)。如果tools.jar不在classpath中,编译过程将采用javac.exe来进行后台编译。编译后所得的字节码保存在JasperReport类中,用来在执行期装填数据(filling the report with data)和给表达式赋值(evaluate various report expression)。

Class net.sf.jasper.engine.JasperCompileManager

这是一个上面提到的与编译有关的类。利用它提供的一些方法,你将有能力编译从本地硬盘或一个Input Stream获得的XML report;还可以通过传给JasperCompileManager一个JasperDesign类,来对内存中的report design进行编译—功能很强大。

Class net.sf.jasper.engine.JasperPrint

当一个报表已经装填好数据之后,这个文档就以JasperPrint类的实例出现。这个类可以直接用JasperReport内置的viewer进行查看,也可以序列化到硬盘以备后用,或者发送到网上去。这个类的实例是报表装填过程后的产物,它可以被JasperReport类库中的导出方法导出成各种流行的格式—PDF,HTML,XML等等。

Interface net.sf.jasper.engine.JRDataSource

这个类与报表的数据源有关。只要能够恰当的实现他的一些接口,用户就可以在报表中使用各种数据源,在报表装填的时候由报表引擎负责对数据进行解释和获取。当报表装填的时候,报表引擎都会在后台生成或提供一个该接口的实例。

Class net.sf.jasper.engine.JRResultSetDataSource

这是一个JRDataSource的缺省实现,因为很多报表数据都来源于关系数据库,所以JasperReport缺省包含了这个外覆(wrap)了java.sql.ResultSet对象的实现。

这个类可以用来包裹(wrap)用以对报表进行装填的、已经载入的结果集,也可以被报表引擎用来包裹通过JDBC执行完查询后所得的数据----非常有用。

Class net.sf.jasper.engine.data.JRTableModelDataSource

顾名思义,这个类用于包裹java.swing.table.TableModel类中的数据,它也是实现了JRDataSource接口,用于在Java Swing程序中使用已经被载入到table中的数据来生成报表。Class net.sf.jasper.engine.JREmptyDataSource

这是JRDataSouce接口的最简单实现,这个类用在不需要显示数据源数据而从参数中获取数据的报表和仅需要知道数据源中的实际行数(number of virtual rows)的报表中。

JasperReport自带的例子:fonts,images,shapes和unicode中使用这个类对报表进行装填,来模拟没有任何record的数据源,这时所有的field都为null。例如:JasperRunManager.runReportToPdfFile(fileName, null, new JREmptyDataSource());

Class net.sf.jasper.engine.JasperFillManager

这个类用来实现报表的数据装填。这个类提供了很多方法来接受各种类型的report design--可以是一个对象,一个文件,或一个输入流。它的输出结果也是多样的:file,Object,output Stream。

report的装填引擎需要接收一个可以从中获取数据和value的数据源作为报表参数。参数值(Parameters value)通常使用Java.util.Map来提供,里面包含的KEY是报表的参数名。

数据源可以通过两种方式提供,这取决于你的解决方案:

通常情况下,用户应该提供一个JRDataSource对象,例如我前面提到的那些。

但是大多数的报表都是采用关系数据库中的值来装填数据,所以JasperReport拥有一个内置的缺省行为—让用户在报表设计的时候提供一个SQL查询。在运行期,这个查询将被执行以用来从数据库中获取要装填的数据。在这种情况下,JasperReport仅需要一个java.sql.Connection对象来取代通常的数据对象。JasperReport需要这个连接对象来连接数据

库管理系统并执行查询操作。

在查询结束之后,JasperReport将自动生成一个JRResultSetDataSource,并将它返回给报表装填过程。

Class net.sf.jasper.engine.JRAbstractScriptlet

这个类同样用于报表装填期间,用户可以自己定义一些代码,并由报表引擎在装填过程中执行。这些用户代码可以处理报表数据操作,或在一些定义好的时刻执行,例如page,列,或组的分割处。

Class net.sf.jasper.engine.JRDefaultScriptlet

这是一个非常方便的JRAbstractScriptlet的子类。通常情况下你应该选择继承这个类。

Class net.sf.jasper.engine.JasperPrintManager

这个类用户提供打印方法,用户可以将整个文档或部分文档传递给它,也可以选择是否显示打印Dialog,这在他的API文档中可以找到,这里不再赘述。

Class net.sf.jasper.engine.JasperExportManager

顾名思义,这个类负责文档的导出。这个类的具体信息详见API文档。非常明显和清除,没什么好解释的,Just use it即可。

Class net.sf.jasper.engine.JasperRunManager

有时,我们仅仅需要构造一个流行的文档格式,例如PDF,或HTML,而不需要将装填过程后生成的JasperPrint对象保存到硬盘或其他中间媒体上。这时,可以使用这个类来直接将装填过程生成的文档导出到所需的格式。

Class net.sf.jasper.view.JRV iewer

这是一个基于Swing的应用程序,你可以将它视为一个独立组件,用来进行打印预览。用

户可以继承这个类,来构造满足自身要求的预览程序。

Class net.sf.jasper.view.JasperV iewer

这个类更像是使用JRViewer的教学组件,它演示了一个Swing应用程序如何装在并显示报表。

Class net.sf.jasper.view.JasperDesignViewer

这个类用于报表的设计期间,用来预览报表模版。它仅作为一个开发工具存在于类库中。Class net.sf.jasper.engine.util.JRLoader

装载器用于报表生成的各个主要阶段—编译,装填等等。用户和引擎都可以利用这个类来装载所需的序列化对象如file,URLs,intput stream等等。这个类最令人感兴趣的函数当属loadOnjectFromLocation(String location)。当用户使用这个类从指定地点装载对象的时候,该函数将首先将location解释为一个合法的URL,如果解析失败,函数将认为所提供的location 是硬盘上的一个文件名,并将试图读取它。如果在指定地点没找到文件,它将通过classpath 定位一个相应于该location的资源,所有努力失败之后,将抛出异常。

3 主要的任务和过程

这一节我们将看到对你的XML报表设计进行分析,编译,装填数据,预览结果和导出到其他格式的过程。

3.1 XML解析

JasperReport使用SAX2.0 API对XML文件进行解析。然而,这并不是必须的,用于可以在执行其自行决定使用哪一种XML解析器。

JasperReport使用org.xml.sax.helpers.XMLReaderFactory类的createXMLReader()来获得解析器实例。在这种情况下,就像在SAX2.0文档中说的那样,在运行期,把Java系统属性org.xml.sax.driver(这是属性的key)的值(value)设定为SAX driver类的全限定名是必要的。用户可以通过两种方法做到这一点,我稍后将解释全部两种方法。如果你想使用不同的SAX2.0XML解析器,你需要指定相应的解析器类的名字。

设置系统属性的第一种方法是在你启动Java虚拟机的时候,在命令行使用-D开关:java –Dorg.xml.sax.driver=org.apache.serces.parsers.SAXParser mySAXApp sample.xml

在JasperReport提供的所有例子中,都采用ANT构建工具来执行不同的任务。我们通过使用内置的 task中的元素来提供这一系统属性:

第二种设置系统属性的方法是使用https://www.doczj.com/doc/c12077978.html,ng.System.setProperty(String key, String value) System.setProperty(“org.xml.sax.driver”,” org.apache.xerces.parsers.SAXParser”);

Jsp/compile.jsp和web-inf/class/servlets/CompileServlet.java文件提供了这方面的例子。

注:对于第二种方法,我要说些题外话。有关于JVM的系统属性(我们可以通过System.out.println(System.getProperty(“PropertyKey”)来查看),可以在运行期像上面说所得那样用System.setProperty(“propertyKey”,”propertyV alue”);来进行设置。但是一旦JVM 已经启动之后,其内建的系统属性,如user.dir,就不能再被更改。奇怪的是我们仍可以用System.setProperty()方法对其进行设置,而在用System.out.println(System.getProperty())方法进行查看的时候发现,其值已经更改为我们设置的值,但事实上我们设置的值不会起任何作用。所以对于内置的属性,我们只能通过-D开关在JVM执行之前进行设置。对于org.xml.sax.driver,由于它不是系统内建属性,所以仍然可以在JVM启动之后加以设置。更详细的信息可以参考王森的〈Java深度历险〉。

3.2 编译报表设计(Report Designs)

为了深成一个报表,用户需要首先生成报表的设计(report’s design),生成方法或采用直接编辑XML文件,或通过程序生成一个net.sf.jasper.engine.design.JasperDesign对象。本文

中,我将主要采用编辑XML文件的方法,因为这种方法在目前是使用JasperReport类库的最好的方法,并且我们有机会更好的了解类库的行为。

先前提到过,XML报表设计是JasperReport用来生成报表的初级材料(raw meterial)。这是因为XML中的内容需要被编译并载入到JasperDesign对象中,这些对象将在报表引擎向其中填入数据之前经过编译过程。

注意:大多数时候,报表的编译被划归为开发时期的工作。你需要编译你的应用程序报表设计,就像你编译你的Java源文件一样。在部署的时候,你必须将编译好的报表,连同应用程序一起安装到要部署的平台上去。这是因为在大多数情况下报表设计都是静态的,很少用应用程序需要提供给用户在执行期编译的,需要动态生成的报表。

报表编译过程的主要目的是生成并装载含有所有报表表达式(report expression)的类的字节码。这个动态生成的类将会被用来在装填数据,并给所有报表表达式求值(evaluate)的时候使用。具体例子是,如果你用IReport生成一个报表名字叫SimpleSheetTest,它的XML 设计文件名叫SimpleSheetTest.jrxml,同时和它在同一目录下IReport会自动生成一个文件名为SimpleSheetTest.java,里面主要是一些报表元素,如Field,Parameters,V ariables的定义,以及一些求值表达式。当然,像上面提到的,这个文件在你直接使用JasperReport API的时候是看不到的,因为它是在执行期生成的一个Class。要想看到它的办法是:在IDE(JBuilder,Eclipse)中单步执行程序,在报表打印的阶段,你将能跟踪到这个类,它的名字就是“你的报表名.java”,按上面的例子就是SimpleSheetTest.java,这和IReport是一致的。当然也可以像下面说的那样,到生成这个类的临时目录里找到它。

在这个类生成过程之前,JasperReport引擎需要验证报表设计的一致性(consistency),哪怕存在一处验证检查失败都不会继续运行下面的工作。在下面的章节,我将会展示报表设计验证成功之后的状况。

对于这个包含了所有报表表达式(report expressions)的类的字节码,我们至少需要关心三个方面的内容:

l 临时工作目录(temporary working directory)

l Java 编译器的使用

l Classpath

为了能够编译Java源文件,这个文件必须被创建并且被保存到磁盘上。Java编译过程的输出是一个.class文件,这个包含所有报表表达式的类在这个工作目录里被创建并编译,这也是为什么JasperReport需要访问这个临时目录的原因。当报表的编译过程结束之后,这些临时的类文件将被自动删除,而生成的字节码将保存在net.sf.jasper.engine.JasperReport对象中。如果需要的话,这个类可以将自己序列化(serialized itself)并保存到磁盘上。这就是IReport 的做法。

缺省情况下,这个临时工作目录就是启动JVM时的当前目录,这却取决于JVM的系统属性user.dir。通过更改系统属性https://www.doczj.com/doc/c12077978.html,pile.temp,用户可以很容易更改这个工作目录。在Web环境下,特别是当你不想让含有启动Web Server的批处理文件的目录和报表编译过程的临时工作目录混在一起的时候,修改这个属性就可以了。

上面提到的第二个方面涉及用来编译报表表达式类的Java编译器。首先,报表引擎将试图使用sun.tools.javac.Main类来编译Java源文件。这个类包含在tools.jar中,当且仅当这个jar 文件在JDK安装目录下的bin/目录中,或在classpath中时,sun.tools.javac.Main才能正常使用。

如果JasperReport不能成功装载sun.tools.javac.Main文件,程序将动态执行java编译过程,就像我们通常用命令行那样,使用JDK安装目录下的bin/目录下的javac.exe。这就是为什

么将JDK安装目录/lib/下的tools.jar文件copy到JasperReport工程的lib/目录下是一个可选的操作(optional operation)。如果tools.jar不在classpath中,JasperReport将显示错误信息并继续上面提到的操作。

当编译Java源文件的时候,最重要的事情莫过于classpath。如果Java编译器不能在指定的classpath中找到它试图编译的所有相关类的源文件,则整个过程将失败并停止,错误信息将在控制台显示出来。同样的事情也将发生在JasperReport试图编译报表表达式类的时候。所以,在runtime为编译过程提供正确的classpath是非常重要的。例如,我们我们需要确认在classpath中,我们提供了在报表表达式中可能用到的类(custom class)。

在这个方面也有一个缺省的行为。如果没有为编译report class特殊指定classpath,引擎将会使用系统属性java.class.path的值来确定当前的JVM classpath。如果你指定了系统属性https://www.doczj.com/doc/c12077978.html,pile.class.path的值,你可以用你定义的classpath来覆盖缺省行为。

大多数情况下,编译一个report只需要简单的调用JasperReport类库中的https://www.doczj.com/doc/c12077978.html,pileReport(myXmlFileName);即可。调用之后将生成编译好的report design并存储在.jasper文件中,这个文件将会保存在和提供XML report design文件相同的目录中。

3.3 Report Design 预览

JasperReport类库并没有提供高级的GUI工具来辅助进行设计工作。但是目前已经有至少4个project试图提供这样的工具。然而,JasperReport本身提供了一个很有用的可视化组件来帮助报表设计者在编译的时候预览报表设计(其实不如直接用IReport方便)。

net.sf.jasper.view.JasperDesigner是一个基于Swing的Java应用程序,它可以载入并显示XML 形式或编译后的报表设计。尽管它不是一个复杂的GUI应用程序,缺乏像拖拽可视化报表元素这样的高级功能,但是它仍然是一个有用的工具(instrument)。所有JasperReport工程提供的例子都利用了这个报表查看器(report viewer)。

如果你已经安装了ANT(别告诉我你不知道什么是ANT),想要查看一个简单的报表设计(JasperReport工程所带例子),你只需要到相应的文件夹下输入如下命令:

〉ant viewDesignXML 或者〉ant viewDesign

如果你没安装ANT,要达到上面的效果就不是很容易,因为JasperReport本身需要一些其他辅助的jar包(在JasperReport安装目录/lib下),在运行的时候,你需要把这些jar包都包含到你的classpath里面,并且正确设计系统属性,如上面提到的org.xml.sax.driver。我可以展示一下在windows下的例子:

>java -classpath ./;../../../lib/commons-digester.jar;

../../../lib/commons-beanutils.jar;../../../lib/commons-collections.jar;

../../../lib/xerces.jar;../../../lib/jasperreports.jar

-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser

dori.jasper.view.JasperDesignViewer -XML -FFirstJasper.xml

很麻烦吧?还是赶快弄个ANT吧。下面是预览之后的结果(其实用IReport更好)

3.4报表装填(Filling Report)

报表装填(report filling)过程是JasperReport library最重要的功能。它体现了这个软件最主要的目的(main objective),因为这一过程可以自由的操作数据集(data set),以便可以产生高质量的文档。有3种材料需要装填过程中作为输入提供给JasperReport:

l report design(report templet)

l 参数(parameters)

l 数据源(data source)

这一过程的输出通常是一个单一的最终要被查看,打印或导出到其他格式的文档。

要进行这一过程,我们需要采用net.sf.jasper.engine.JasperFillManager类。这个类提供了一些方法来让我们装填报表设计(report design),report design的来源可以是本地磁盘,输入流,或者直接就是一个已存在于内存中的net.sf.jasper.engine.JasperReport类。输出的产生是于输入类型相对应的,也就是说,如果JasperFillManager接到一个report design的文件名,装填结束后生成的report将会是一个放在磁盘上的文件;如果JasperFillManager收到的是一个输入流,则生成的report将会被写道一个输出流中。

有些时候,这些JasperFillManager提供的方法不能满足某些特定的应用的要求,例如可能有人希望他的report design被作为从classpath中得到的资源,并且输出的报表作为一个文件存放在一个指定的磁盘目录下。遇到这种情况时,开发人员需要考虑在将报表设计传递给报表装填过程之前,用net.sf.jasper.engine.util.JRLoader类来装载report design对象。这样,他们就能获得像报表名这样的report design属性,于是开发者就能生成最终文档的名字(construct the name of the resulting document),并将它存放到所需的位置上。

在现实中,有许多报表装填的情境(scenarios),而装填管理器仅试图覆盖其中最常被使用到的部分。然而对于想要自己定制装填过程的人来说,只要采用上面所说的方法,任何开发者都可以达到满意的结果。

报表参数通常作为java.util.Map的value提供给装填管理器,参数名为其键值(key)。

作为装填过程所需的第三种资源—数据源,有如下两种情况:

通常,引擎需要处理net.sf.jasper.engine.JRDataSource接口的一个实例,通过这个实例,引擎可以在装填过程中获取所需数据。JasperFillManager提供的方法支持所有的JRDataSource 对象(这是一个Interface,上面一章提到过它的常用实现)。

然而,这个管理器还提供一些接受java.sql.Connection对象作为参数的方法集,来取代所需的数据源对象。这是因为在很多情况下,报表生成所需的数据都来源于某个关系型数据库中的表(table)。

在报表中,用户可以提供SQL查询语句来从数据库中取回报表数据(report data)。在执行期,engine唯一需要做的是获得JDBC connection对象,并使用它来连接想要连接的数据库,执行SQL查询并取回报表数据。在后台,引擎将使用一个特殊的JRDataSource对象,但是它对于调用它的程序来说是透明的。

JasperReport工程提供了相关的例子,它们采用HSQL数据库服务器(在工程文件中,有一个相应的文件夹),要运行这些例子你需要首先启动该服务器,方法是:在/demo/hsqldb目录下输入如下命令:>ant 或者>ant runServer

没装ANT就麻烦点:>java -classpath ./;../../lib/hsqldb.jar org.hsqldb.Server

一下代码片断显示了query例子是如何装填数据的:

//Preparing parameters

Map parameters = new HashMap();

parameters.put("ReportTitle", "Address Report");

parameters.put("FilterClause", "'Boston', 'Chicago', 'Oslo'");

parameters.put("OrderClause", "City");

//Invoking the filling process

JasperFillManager.fillReportToFile(fileName, parameters, getConnection());

3.5 查看报表(V iewing Reports)

报表填充阶段的输出通常是一个JasperPrint对象,如果把它保存在磁盘上,通常以一个.jrprint 文件的形式存在。JasperReport拥有一个内置的查看器,用来查看用内置的XML导出器(XML exporter)获得的XML格式的报表文件。这个查看器就是以前提到过的

net.sf.jasper.niew.JRV iewer—一个基于Swing的应用程序组件,用户可以通过继承这个类来定制自己所需的查看器。JasperReport工程中自带的例子webapp中,你可以阅读JRViewerPlus 类的代码来获取进一步内容。

注意:JasperViewer更像是一个教人们如何使用JRViewer组件的演示程序,这里要注意一点,当你调用JasperViewer的viewReport()方法来显示报表时,如果你关闭了预览Frame,整个应用程序将会随之结束,因为这个函数最后调用了System.exit(0);你可以通过继承这个类,并重新在你的Viewer里注册java.awt.event.WindowListener来避免这一情况的发生。

3.6 打印报表

JasperReport类库的主要目标,就是生成可打印的文档。而且多数应用程序生成的报表都是需要落实(或打印)到纸张上。我们可以用net.sf.jasper.engine.JasperPrintManager来打印JasperReport生成的文档。当然,报表也同样可以在被导出到其他格式如PDF,HTML之后再被打印。通过JasperPrintManager提供的方法,我们可以打印整个文档,打印单个文档或打印某一范围内的文档,可以显示打印对话框也可以不显示。下面的例子演示了不显示对话框,打印整个文档的方法:JasperPrintManager.printReport(myReport,false);

这个例子显示了如何打印5-11页的文档,同时显示打印对话框:net.sf.jasper.engine.JasperPrintManager.printPages(myReport,4,10,true);

3.7 导出报表

在一些应用程序环境下,将JasperReport生成的文档从其特有的格式导出到其他更为流行的格式如PDF,HTML是非常有用的。这样一来,其他人就可以在没有安装JasperReport的情况下查看这些报表,特别是当这些文档要通过网络发送出去的时候。

JasperReport提供了JasperExportManager类来支持此项功能。这项功能将会在以后不断加入对新的格式的支持。目前,JasperReport主要支持导出PDF,HTML和XML类型的文档,下面是导出的代码片断:JasperExportManager.exportReportToHtmlFile(myReport);

注意:想要将自己的报表导出到其他格式的用户,需要实现JRExporter的接口,或继承相应的JRAbstractExporter类。

3.8 对象的载入和保存

当使用JasperReport的时候,你经常会与序列化的对象,如以编译的报表设计,或已生成的报表打交道。有时,你需要手动载入从不同的source如input stream或你用类库核心功能(lib’s core functionality)产生的序列化类。JasperReport提供了两个特殊的工具类来提供上述操作的能力,这些类通常供报表引擎自己使用:

net.sf.jasper.engine.util.JRLoader

net.sf.jasper.engine.util.JRSaver

第一个类提供了一些方法让我们能够从不同类型的数据源如文件,URL,input stream 和classpath里面获取序列化对象。最令人感兴趣的方法是loadObjectFormLocation(String)。它已经在上一章中介绍过了,这里不再赘述。

与上面的对象载入工具相反的部分是JRSaver类,它可以帮助程序员将自己的类序列化之后存放到本地磁盘或通过Output Stream发送到网络上去。

有时,开发人员可能想要载入已经生成好的report,或最终的已经被导出到XML格式的JasperReport文档,这与上面所说的直接load序列化对象有所不同。这时,我们需要载入的是将载入的XML内容进行编译,并生成JasperPrint对象,而并非仅仅是载入序列化对象。这时,我们可以通过net.sf.jasper.engine.xml.JRPrintXmlLoader类的一些静态方法,通过编译从XML文件中读取的内容构建出一个位于内存中的文档对象。

4 报表设计(Report Designs)

报表设计体现了一个模版,JasperReport引擎利用这个模版将同台生成的内容传递给打印机,

屏幕或Web。存储在数据库中的数据在报表装填的过程过被组织起来,根据已有的报表设计来获得可以进行打印的,面向页面的(page oriented)文档。

总而言之,一个报表设计包含了所有的结构相关信息和将数据提供给报表所涉及的各个方面。这些信息涉及将在文档中显示出来的各种text或图像元素的位置和内容,自定义计算(custom calculation),数据组织,报表生成时的数据操作,等等。

报表设计通常都定义在一个拥有特殊格式的XML文档中,并且在被填充数据之前要经历JasperReport的编译过程,有关于这个XML文档的详细信息我们将在以后说明。然而JasperReport也允许用户通过JasperReport提供的API构造in-memory报表对象,例程noxmldesign就是很好的例子,但是我们通常不这么用。

4.1 DTD Reference

当使用XML文件进行报表设计的时候,JasperReport将使用内置的DTD文件来验证其受到的XML内容的有效性。如果XML验证通过,则说明所提供的报表设计符合JasperReport 所需要的XML结构和语法规则,其引擎能够生成经过编译的report design。

有效的XML文档总是在验证时指向JasperReport的内部DTD文件。如果没有提供DTD文档的引用,报表的编译过程将会突然结束。这对所有人来说都是一个负担,因为DTD引用通常是相同的,并且这些引用可能会简单的被从以前的报表设计中copy过来。在一开始,你需要将这个引用从给定的例子中copy过来。

正如以前说的一样,报表引擎仅能识别指向其内部DTD文件的的引用。你不能随便从类库的源文件中将那些DTD文件copy到别的地方,再在你的报表设计文件中文件中指向你copy 的那些DTD文件。如果你想那样做的话,你将需要调整类库中某些类,包括net.sf.jasper.engine.xml.JRXmlDigester类的某些代码。如果你遇到像引擎无法找到其内部的DTD文件而导致的无法载入资源的问题,请确定你已经在使用外部DTD文件之前排除了所有可能发生的情况。遇到这样的问题是不太可能的,因为资源载入机制会随着时间不断改进。JasperReport只有两种合法的XML报表设计的DTD引用,他们是:

或者

XML报表的root元素是,下面是一个普通带JasperReport的样子:

4.2 XML 编码

当要生成不同语言的XML报表设计的时候,在XMl文件的首部的编码属性需要特别关注一下。缺省情况下,如果这个属性的值没被订制,则XML解析器将会使用“UTF-8”作为XML文件的编码格式。这一点是非常重要的,因为报表设计通常包含了静态的本地化text。对于大多数西欧语言来说,ISO-8859-1编码,也就是我们常说的LA TIN1将会很好的处理如法语中重音符号的显示问题。

在编辑XML文件的时候,要找到某种特殊语言的编码类型,你可以查看XML document.FIXME

4.3 报表属性

我们上面已经看到,斯XML报表设计的根元素。这一节我将介绍报表设计对象的Property的细节以及这些属性所对应的XML attributes(为避免混淆,我将不提供Property 和Attribute的中文而直接使用英文)。

1

Report Name

每一个报表都必须有一个名字。这个名字是相当重要的,因为类库需要它来生成文件,尤其是当编译,装填,导出报表的默认行为被使用的时候,这个名的作用更为重要。这个名字是以元素的name attribute的形式提供的,并且是强制必须填写。

Column Count(列数)

JasperReport允许生成每页的列数超过一列的报表,正如下面的图片,展示了拥有两列的报表:

1

默认情况下,报表引擎生成每页一列的报表。

Print Order(打印顺序)

对于拥有超过一列的报表,为其提供列将被以什么顺序填充是很重要的。你可以使用的printOrder attribute来进行设置。有如下两种情况:

n V ertical Filling:这个选项将导致列是自顶向下被填充(printOrder=”V ertical”)

n Horzontal:列将自左向右被填充(printOrder=”Horizontal”)

缺省设置将是printOrder=V ertical

Page Size(页面大小)

有两个attribute是用来提供要生成的文档大小的:pageWith,pageHeight。像所有其他显示元素位置和尺寸的attribute一样,这两个attribute是以像素为单位的。JasperReport采用Java 默认的每英寸72点的设置。这意味着pageWith=”595”将大约是8.26英寸,这大概是A4纸的尺寸。

默认的纸张大小是A4纸:pageWith=”595”pageHeight=”842”

Page Orientation(默认设置为Portrait)

orientation属性用来设置文档打印格式是“Portrait”还是“Landscape”。JasperReport允许用户在从“Portrait”切换到“Landscape”的时候调整液面的宽度和高度。我们先看一个例子:我们假定要生成一个A4纸的报表,采用“Protrait”格式。

pageWidth=”595” pageHeight=”842” orientation=”Portrait”

如果我们决定用A4纸的“Landscape”布局,首先要调整相应的页面宽度和高度:pageWidth=”842” pageHeight=”595” orientation=”Landscape”

这是因为JasperReport需要确切知道它所要绘制的报表页的宽度和高度,而不只看我们提供的orientation属性,至少在报表装填的时候是这样。orientation属性仅在报表打印时有用,来通知打印机或某些exporters页面的orientation设置。

Page Margins(页边距)

一旦页面大小确定下来,用户就可以在生成报表的时候设定报表的边距。有四个属性来完成这项工作:topMargin,LeftMargin,bottomMargin和rightMargin。缺省的设置是上下边距20像素,左右边距20像素。

Column Size and Spacing(列宽和列间距)

一个报表可能含有多列,我们可以通过上面提到的columnCount属性得到报表列数。

JasperReport需要知道列的宽度和列间距的大小。有两个属性用于这项工作:columnWidth 和columnSpacing。当我们对报表设计进行编译的时候,编译器会对这项设置进行有效性检查(validation check)--看列的宽度和列间距是否符合给定的页面宽度和页边距。因为缺省的列数为一,所以缺省的列间距为0像素,并且缺省的列宽等于页面宽度减去左右边距所得的值。在上面A4的例子中,列宽即为555像素。

Empty Data Source Behavior

有时我们提供给我们的报表的数据源可能会没有任何record。whenNoDataType属性可以让你选择当所提供的数据源中没有数据的时候入和察看生成的报表。如下有三种不同的可能性,你可以任选其一:

l Empty Document:生成的报表不含有页面(no page in it)。当你试图装载这样的文档(whenNoDataType=”NoPages”)的时候,Viewer 可能会抛出一个错误。

l Blank page:表示生成的报表将仅含有一个空白页。(whenNoDataType=”BlankPage”)

l All sections displayed:除了detail部分的其他部分将在生成的文档中显示出来。(whenNoDataType=”AllSectionNoDetail”)。

缺省的设置是whenNoDataType=”NoPages”。

Title and Summary Sections Placement(标题和摘要的放置)

如果你想让title部分和summary部分在单独的一页里显示,你所需要做的事情就是让下面的一个或两个属性的值为“true”:isTitleNewPage,isSummaryNewPage。这两个属性缺省情况下为false。

注意:即使你选择了在最后一页的剩余部分显示summary,如果列数超过一列,并且第二列已经在最后一页出现的时候(没试过,等有机会试验一下),新的一页将会被自动生成。Scriptlet Class

scirptletClass属性用于设置用于当前报表的scriptlet类的名字。在以后我会对Scriptlet进行详细讨论。如果你没为这个属性提供任何值,报表引擎将会使用net.sf.jasper.engine.JRDefaultScriptlet的实例。

5 报表数据(Report Date)

当我们谈到报表装填过程的时候,有三样东西需要作为输入提供给报表引擎:报表设计(report design),参数值(parameter values)和报表的数据源(data source)。

在先前的章节,我们已经看到了有关报表设计的某些方面,现在我们要更加详细的关注其他两方面的内容:参数(parameter)和报表数据源。他们描绘了报表引擎在装填报表过程中所用到的仅有的数据来源。像你用其他报表工具所希望的一样,这些数据将会根据报表设计中的定义的模版(template)被组织起来,并被用来生成准备打印的、面向页面的文档。

5.1 表达式(expressions)

表达式是JasperReport的一个非常有用的特性。他们可以用来声明执行各种执行各种计算(calculations)的报表变量(report variables),进行报表的数据组织,定制报表文本字段(text field)的内容或者进一步定制报表对象的appearance。

所有报表表达式基本上都是Java表达式,他们可以以特殊的语法引用报表参数(parameter),报表字段(field)和报表变量(variable)。在XML报表设计中,有一些用于定义表达式的元素:等等

因为所有的JasperReport表达式都是真正(real)的Java表达式,只要你用完整的类名(包括包名)来引用这些表达式,你就可以在任何class中使用他们。当你编译报表和装填数据的时候,你应该确定你在报表表达式中使用的类已经写入了classpath。

报表参数引用是通过$P{}序列引入的,例如:

$P{ReportTitle}

这个例子假定我们在报表设计中有一个名为ReportTitle的报表参数,这个参数是一个https://www.doczj.com/doc/c12077978.html,ng.String类。当报表进行装填的时候,文本字段将会显示这个参数的值。

为了在一个表达式中使用报表字段,字段名必须放在$F{}的括号中。例如,如果我们想要在一个文本字段中显示两个数据源字段的连接值(concatenated values),我们可以定义如下表达式:

$F{FirstName} + “ “ + $F{LastName}

表达式可以更加复杂:

$F{FirstName} + ““+ $F{LastName}+ “was hired on “+ (new SimpleDateFormat(“MM/DD/YYYY”)).format($F{HireDate)) + “.”

正如你所看到的一样,参数、字段和变量引用都是通过用JasperReport的特殊语法从一个真正地Java对象中引入的。(实际上是一个JREvaluator对象,该对象是在运行其生成的动态对象,并不能在本地磁盘上见到它的身影,不过如果你使用iReport的话,你就可以在生成报表文件的同一目录下看到它的本来面目)

5.2 参数(Parameters)

Parameters是传递给报表装填操作的对象引用。这些参数主要作用于把那些不能从报表数据源中获得的数据传给报表引擎。例如,我们可能要把执行报表装填过程的用户名字专递给报表引擎,如果我们想让它显示在报表上或者在我们想在报表的title上动态的改变它,我们就可以以参数的形式传给报表引擎。

我们可以用如下的方式定义参数:

这里所提供的报表参数值可以被用到各种报表表达式中,在报表SQL查询中,甚至可以用到报表的scriptlet类里。下面是构成参数定义的全部组件(XML元素):

参数名

name属性是一个强制属性。JasperReport的命名习惯和Java语言的命名习惯是类似的,这意味着参数名应该是一个单词,其中不含特殊字符(如分号)。

参数类型

报表参数的第二个强制属性是提供参数值的类型名。这个类型属性可以使任意的值,只要这个类型的名字在报表编译期和装填期能在classpath中找到即可。

Prompting for Parameter values

在GUI引用程序中,建立一个报表参数集,让用户在执行装填过程之前输入某些应用程序需要用户输入的报表参数是很有用的。可选参数isForPropting参数用来声明是否显示提示信息让用户输入某些参数。下面的例子中,我声明了一个文本参数,当需要用户输入参数值的时候,这个文本参数用来在一个已定制的对话框中描述需要用户输入什么样的参数。

Please type here the report comments if any

]]>

注意:相信大家都知道表示“内容”将不被XML解析器解析,也就是说,你可以在“内容”里加入XML的特殊字符,如>,<等等。

参数的默认值(parameter default value)

通常参数值都是使用java.util.Map对象传给装填过程的,其中参数名作为Key。这样,你就不用每次都为每个参数提供一个value了—可以批量放到Map对象里一起传给装填管理器。如果你没有为参数提供一个value,引擎就认为它是null。但是如果你为它提供了一个默认值,则引擎将在你没提供这个参数值的情况下使用这个默认值。如果你在装填时没提供数据,下面的java.util.Date将在装填是被引擎使用来表示当天日期:

new java.util.Date()

在参数的默认表达式中,我们可以使用这个与定义的报表参数。

5.2.1 内置的报表参数

每一个报表设计中都含有一些与定义的报表参数,这些内置的参数的描述如下:REPORT_PARAMETERS_MAP

这是一个内置的参数,这个参数总是指向一个java.util.Map对象,该对象保存了用户调用报表装填过程时传递给报表引擎的用户定的参数。

REPORT_CONNECTION

这个报表参数指向一个java.sql.Connection对象,这个对象被提供给报表引擎用来通过JDBC 来执行SQL报表查询。将master报表使用的JDBC Connection对象传递给subreport是非常有用的,有关这方面信息请查看subreport例子

REPORT_DA TASOURCE

在报表装填的时候,我们可以或者直接由应用程序中提供,或由报表引擎从所提供的JDBC Connection在后台create而获得一个数据源。这个内置的参数允许我们在报表表达式中或scriptlet中访问报表数据源,而不论我们为什么要这么做。

REPORT_SCRIPTLET

即使报表不使用scriptlet,这个内置的参数仍将指向一个net.sf.jasper.engine.JRAbstracStriptlet 实例,该实例实际是一个net.sf.jasper.engine.JRDefaultScriptlet对象。

但是当使用scriptlet时,报表装填过程所生成的这个指向scriptlet类实例的引用允许我们调用其中的某些特殊函数,使用或控制scriptlet对象在装填过程中已经准备好的数据。在scriptlet例子中你可以看到更详细的使用过程。

5.3 Data Source(数据源)

在进行报表装填的时候,JasperReport引擎迭代的从用户提供的数据源中提取record,并根据报表设计所提供的模版生成报表的各个部分(section)。通常情况下,引擎需要接收一个net.sf.jasper.engine.JRDataSource对象作为报表数据源。但是像我们即将看到的那样,当报表

数据存储于关系型数据库的时候,JasperReport有了让用户提供一个JDBC链接对象来替代通常的数据源对象的特性。JRDataSource接口非常简单,如果我们想要实现它只需要实现下面两个方法:

public Boolean next() throw JRException;

public Object getFieldV alue(JRField jrField) throw JRException

在报表装填的时候,next()方法将被报表引擎调用,迭代的从数据源中获取数据。第二个方法用来为每个在当前数据源记录(data source record)中的报表字段(report field)提供value。

应当知道,从数据源取得数据的唯一方法是使用report field。一个数据源对象更像是一个二维表,表中含有数据。这个二维表的行是一条一条的record,而每一列都映射为一个report field。所以我们可以在report表达式中使用数据源。JasperReport提供了一些缺省的JRDataSource实现,我们来具体看一下:

Class net.sf.jasper.engine.JRResultSetDataSource

这是一个非常有用的缺省实现,因为他外覆(wrap)了java.sql.ResultSet对象。由于多数报表的生成都采用关系数据库中存储的数据,所以这个类是被使用得最为广泛的数据源对象。然而在以下的两种情况下您可以不必在装填过程中自己生成这个对象:

如果你选择在你的报表中用SQL查询来获得在关系数据库的某个table中的数据,报表引擎将会通过执行给定的SQL查询并且将返回的java.sql.ResultSet外覆为一个net.sf.jasper.engine.JRResultSetDataSource实例来执行这项操作。引擎唯一需要的是一个java.sql.Connection对象来执行查询操作。这时你可以提供connection对象来作为通用数据源对象(usual data source object)。例子有:jasper,scriptlet,subreport和query。

当然你可以在应用程序中即JasperReport之外执行SQL查询。这样的话,你可以手动的外覆java.sql.ResultSet,再调用报表装填过程之前实例化这个数据源对象。当使用这种类型的数据源的时候,你需要为在result set中的每一列生命一个report field。report field的名字和类型必须和列的名字和类型匹配。

Class net.sf.jasper.engine.JREcptyDataSource

这个类主要用于当生成报表的数据不是来自数据源,而是来自参数或重要的仅是数据源中virtual records的数量的时候。例子fonts,images,shapes和unicode都使用了这个类来装填报表,来模拟数据源中没有一条记录,所有字段都为null的情况。

Class net.sf.jasper.engine.data.JRTableModelDataSource

这个JRDataSource接口的缺省实现外覆了javax.swing.table.TableModel对象,它可以用在Java Swing应用程序中从已经显示到屏幕上的table中得数据来生成报表。--我喜欢。

通常有两种方法来使用这种数据源:

通常,为了要从中取得数据,你需要为javax.swing.table.TableModel对象的每一列生命一个report field。但是有些情况下会出现问题,比如report field的命名需要遵照Java命名规范来声明变量,而table的列名则不需要。幸运的是,你仍然可以通过列的索引而不是它的名字来将report field与列进行映射。例如,一个列名为“Produce Description”不可能被映射到名为“Produce Description”的report field上,因为report field名中含有空格,这将引起一个编译错误。但是如果你知道这个列示table model对象的第三列(index=2),那么你就可以命名相应的字段“COLUMN_2”并无误地使用这一列的数据。例子有:datasource

Class net.sf.jasper.engine.data.JRBeanArrayDataSource

这个类外覆了一个JavaBeans数组,并且通过反射来获取report field的值。在这种数据源中,一个JavaBean对象描述了一条记录。如果我们有一个名为“ProductDescription”的report field,在获取这个字段的值的时候,程序将会试图通过反射机制调用一个当前JavaBeans对象中]名为getProductDescription()的方法。对于boolean字段,当调用get前缀的属性不能返回其

属性值的时候,程序将会试图使用is前缀的方法来获得属性值。

Class net.sf.jasper.engine.data.JRBeanCollectionDataSource

这个类和上一个类非常类似,它也是使用反射机制和JavaBean命名规范,但是它外覆了一个java.util.Collection对象而不是一个JavaBean对象数组。在datasource例子中你可以看到进一步的用法。

5.4 报表查询(Report Query)

为了要为报表装填数据,我们需要为报表引擎提供所需的数据,或者至少告诉它怎样去获取数据。JasperReport通常需要接受一个net.sf.jasper.engine.JRDataSource对象作为报表的数据源,同时作为更为强大的功能,JasperReport能直接用JDBC从关系数据库总获取数据。类库允许用户在他们的报表设计中提供SQL查询以便可以自运行期从数据库中提取数据。要做到这一点,你只需要在装填的时候为装填管理器的fillReport()方法提供一个java.sql.Connection而不是JRDataSource对象即可。

在报表中,可以使用元素来引入查询。如果这个元素存在,则出现在报表参数声明之后,报表field之前。

如下是一个SQL查询的例子:

为了更好的定制从数据库中取回的数据集(data set),一个重要的方面是在报表查询字符串中报表参数的使用(use of report parameters)。在查询中,这些参数可能会像动态过滤器(dynamic filter)一样工作,它们用特殊的语法被引入进来为报表提供数据,很像report expression。

如下有两种在查询中的使用参数的方法:

1. 像通常的java.sql.PreparedStatement的参数那样使用,用如下语法:

SELECT * FROM Orders WHERE OrderID <= $P{MaxOrderID} ORDER BY ShipCountry ]]>

2. 有时,我们需要使用参数来动态更改SQL查询的某些部分,或将整个SQL查询作为参数提供给装填过程。在这种情况下,语法稍微有些不同,向下面的例子,注意“!”

SELECT * FROM $P!{MyTable} ORDER BY $P!{OrderByClause}

]]>

在这个例子中,这个引入了参数值得特殊的语法确定了我们为这些参数所提供的值将会替代查询中的参数引用($P!{}的内容)。这些参数将被传给使用java.sql.PrepqredStatement对象的数据库服务器。

事实上,报表引擎首先处理$P!{}参数引用,通过使用他们的值来获取最重的SQL查询,并且仅当这件事完成之后,引擎才会将剩下的普通的$P{}参数引用传递给usual IN parameters。--实际上就是嵌套查询啦。

第二种用于SQL查询的参数引用允许你在运行期传递整个SQL查询语句:

$P!{MySQLQuery}

注意:你不能在参数值中再加入参数引用,也就是说,参数引用不能嵌套使用。

更详细的信息可以参看工程所带的例程:jasper,subreport,scriptlet,webapp以及最有学习价值的query

5.5 字段(Field)

报表字段是从数据源到报表设计的数据映射的唯一途径。你可以应用报表字段在report表达式中使用数据源中的数据,或获得所需的输出。一旦定义了报表字段,你需要在报表填充的时候确认你所提供的数据源中提供了所有你声明的fields。

例如,如果你使用JRResultSetDataSource作为数据源,你需要确定在SQL查询结束之后所获得的ResultSet中的column包含你生命的全部fields。相应的列名和字段名必须完全相同,并且其数据类型也必须完全一致。

这是一个字段声明的语法,字段的声明需要对应于数据库表中的某一字段。我们来考虑一个Employee的例子,有如下表结构(structure):

报表字段需要像下面这样定义:

如果你定义的字段不能和ResultSet中的某一列相对应,则在运行期将会抛出异常(如果你用IReport,在编译时也会抛出异常)。然而执行SQL查询之后返回的结果集中包含的列不需要与报表字段一一对应(即列可以多于字段,只是在显示的时候不显示出来罢了)。

字段名(Field Name)

元素的name属性是强制属性(即不能省略),你可以在表达式中通过它来引用该字段。字段名必须是一个单词,且不含有特殊字符,如点和分号。

字段类型(Field Class)

这个属性描述了字段值的类型,缺省的类型是https://www.doczj.com/doc/c12077978.html,ng.String,还有其他可选类型如:https://www.doczj.com/doc/c12077978.html,ng.Object

https://www.doczj.com/doc/c12077978.html,ng.Boolean

https://www.doczj.com/doc/c12077978.html,ng.Byte

java.util.Date

java.sql.Timestamp

https://www.doczj.com/doc/c12077978.html,ng.Double

https://www.doczj.com/doc/c12077978.html,ng.Float

https://www.doczj.com/doc/c12077978.html,ng.Integer

java.io.InputStream

https://www.doczj.com/doc/c12077978.html,ng.Long

https://www.doczj.com/doc/c12077978.html,ng.Short

java.math.BigDecimal

如果某些数据源含有一些自定义的类型,则该类型所对应的字段应该声明为https://www.doczj.com/doc/c12077978.html,ng.Object。但是与参数定义不同的是,你只能选择上述列表中的类型名。

字段描述(Field Description)

当实现一个自定义数据源的时候跟,这一伴随着某个字段的附加的文本块是很有用的。你可以在字段描述中保存一个key或其他任何信息以便于在运行期从自定义数据源中取回字段值。通过使用可选的元素,你就可以轻松的越过字段名的约束(field naming

conventions),在从数据源取数据的时候,使用字段描述而不是字段名来获取相应数据。

PERSON NAME

5.6 变量(V ariables)

报表变量是建立在报表表达式之上的一些特殊对象。他们是用表达式定义的,用来执行某些运算,来简化报表中频繁出现或使用某些项目(如页号,页码,某些列的累加和等等)。下面是它的定义语法:

可以看到,在这个语法中,一个变量可以引用其他变量,当且仅当被引用的变量已经在报表中被定义过。所以,在报表设计中,变量定义的顺序非常重要。

变量名(V ariable Name)

与字段名和参数名一样,元素的name属性是强制属性,报表引擎允许在报表表达式中通过这个这个名字来引用变量。变量名的命名规则与参数和字段的规则相同。

变量类型(V ariable Class)

每一个变量都有其类型,缺省为https://www.doczj.com/doc/c12077978.html,ng.String,然而只要你所选择的类型可以在classpath 中找到,你就可以在报表编译期和填充期声明任何类型的报表变量。

重置类型(Reset Type)

报表变量的值可以在每一次迭代(iteration)中被改变,但也可以在装填过程中的某一特定的时间(specified moments)通过它的初始的value表达式恢复其初始值。这一行为是由resetType属性控制的,这一属性规定了报表装填过程中当报表变量在何时需要重新进行初始化(或恢复到初始值)。该元素有五种选项值:

n No Reset:变量将不会使用其initial value expression对自身进行初始化,而将仅报表从变量表达式中所求得的值(resetType=”None”)。

n Report Level Reset:变量将在报表填充过程的起始阶段使用其初始化表达式初始化一次(resetType=”Report”)。

n Page Level Reset:变量将在每一页的起始时被重新初始化(resetType=”Page”)。n Colunm Level Reset:变量将在每个新列的开始被初始化(resetType=”Column”)n Group Level Reset:变量将在每次resetGroup属性提供的break的地方被重新初始化(resetType=”Group”)。

缺省的属性为resetType=”Report”

Reset Group

如果存在的话,resetGroup属性包含了报表的组的名字并且仅与resetType=”Gropu”的resetType属性相关联。

5.6.1 运算(Calculations)

像以上所提到的,变量能执行内置的计算类型(build-in types of calculation)。下面是元素的calculation属性的所有可能的值:

Calculation Nothing

这是变量执行的缺省计算。这意味着变量值在数据源的每次迭代时被重新计算(这里的计算只是简单的通过变量表达式给变量赋值)。

Calculation Count

在每次数据源的迭代的时候(注:这里和之前我所说的数据源的迭代都是指:例如,在报表装填的时候,引擎执行SQL查询返回的ResultSet中含有若干记录,每次迭代都是指从ResultSet中获得一条记录,并将这条记录的值赋给已经声明的字段),一个计数(count)变

Reportviewer_报表

https://www.doczj.com/doc/c12077978.html,服务器控件使用之Reportviewer 报表 1.Reportviewer 报表 1.1.Reportviewer控件 注:本教程附2个事例: ●演练:在本地处理模式下将数据库数据源与ReportViewer Web 服务器控件一起使用 ●演练:在本地处理模式下将业务对象数据源与ReportViewer Web 服务器控件一起使用 如果您已经对ReportViewer控件基础知识比较了解,可以直接参阅事例。 1.1.1.简介 Microsoft Visual Studio 2005 包括报表设计功能和ReportViewer 控件,使您可以将功能完整的报表添加到自定义应用程序。报表可以包含表格格式数据、聚合数据和多维数据。提供ReportViewer 控件的目的是可以处理和显示应用程序中的报表。控件有两种版本。 ReportViewer Web 服务器控件用于在https://www.doczj.com/doc/c12077978.html, 项目中驻留报表。ReportViewer Windows 窗体控件用于在Windows 应用程序项目中驻留报表。 这两种版本的控件都可以配置为以本地处理模式或远程处理模式运行。配置为何种处理模式将影响有关报表从设计到部署的所有方面。 ●“本地处理模式”是指ReportViewer 控件在客户端应用程序中处理报表。所有报表都 是使用应用程序提供的数据作为本地过程处理的。若要创建本地处理模式下使用的报表,需要使用Visual Studio 中的报表项目模板。有关详细信息,请参阅将ReportViewer 配置为进行本地处理。 ●“远程处理模式”是指由SQL Server 2005 Reporting Services 报表服务器处理报表。在 远程处理模式下,ReportViewer 控件用作查看器,显示已经在Reporting Services 报 表服务器上发布的预定义报表。从数据检索到报表呈现的所有操作都是在报表服务器上 处理的。若要使用远程处理模式,则必须具有SQL Server 2005 Reporting Services 的 许可副本。有关详细信息,请参阅将ReportViewer 配置为进行远程处理。 若要在应用程序中使用ReportViewer 控件,则必须了解如何将控件添加到项目表单或网页中,如何配置控件来使用本地报表定义或服务器报表,如何更新数据源引用,以及如何在应用程序中测试和部署报表和控件。提供的演练有助于您学习这些关键技能。有关详细信息,请参阅示例和演练。 1.1. 2.将Reportviewer配置为进行本地处理

纷享销客用户使用手册 管理员第二版

纷享销客用户使用手册-管理员) 第二版 (

1 1

目录 创建企 业 (3) 邀请同 事 (4) 纷享管理后 台 (6) 部门与员 工 (7) 权限管 理 (11) 帐号安 全 (14) 应用管 理 (15) 企业设 置 (16)

外勤签到设置 (19) 考勤签到设置 (21) 报数系统后台管理 (23) 版本说明: 1 纷享销客用户使用手册版本:V4.7.0 日期:2015.11.19 版本更新: 文档版更新日更新概 新人V2.0 2015/11/19 王创建文档 学琳

纷享销客用户使用手册 创建企业企业第一个注册用户即为企业后台管理员,企业创建成功后,登录前往管理后台进行管理操作。 进入纷享销客官方网页,点击立即注册,进入注册流程,通过手机注册进入企业创建界面,填写企业名称,填写当前注册用户姓名和密码,点击创建。企业创建成功后,系统生成企业帐号方便登录。 纷享销客用户使用手册 邀请同事点击中部黄色指引系统指引会引导管理员前往邀请同事,管理员登录进入企业,条中的[邀请同事],弹出窗口提供给管理员两种邀请方式,一是通过手机号码或邮箱发送邀请,二是直接生成邀请链接复制黏贴给同事。.纷享销客用户使用手册

如果管理员没有通过引导方式邀请,也可在移动端设置-邀请同事,通过微信、短信、邮箱的方式调取本机的应用快速发出邀请。管理员可在此界面进行用户注册同事接受邀请并进行注册,提交信息给管理员,审核,审核通过的同事就正式加入当前企业,等待权限等其他设置。.纷享销客用户使用手册 纷享管理后台和应用,管理管理员登录进入企业后,网页导航栏包括功能模块:工作、CRM员还会拥有管理后台入口,点击[管理]进入管理后台,需要再次输入密码,确保后台管理的安全。企业信管理员可通过管理后台进行部门与员工维护、权限设置、账号安全管理、纷享提供用户分类管理员设定,公告管理、息维护、删除信息管理、日志统计等;不同权限的管理员分门别类的对各自模块继续维护和管理。.纷享销客用户使用手册

Visual Studio 2008 水晶报表快速入门

Visual Studio 2008 水晶报表快速入门 医手 先新建一个Web项目: CrystalWebApp 为项目添加新项: CrystalReport1.rpt

在弹出的对话框,选择作为空白报表。用向导当然更方便,但在这里,白手起家或许能更好地理解。 在工具箱选择 Text Object,拖到报表头。写些字,设置字体之类的。在属性选项卡设置它的名字为 txtTitle 以供将来程序访问。 水晶报表对于程序员来说其实跟 Repeater 控件是很相似的。于是需要数据和字段名。在Repeater 控件中你可以很随意地指定要绑定的字段名。在程序还没有真正运行之前,这个字段名可以没有任何表的字段名跟它匹配,也可以没有任何类的属性名跟它匹配。但在水晶报表中,字段名在设计阶段就必须是真实存在的。还能稍感安慰的是,水晶报表一旦设计好之后,就能像 Repeater 控件那样绑定任意类型的对像。而不必是设计时指定字段来源的表或类。所以我们现在要创造些真实存在的字段名…… create table TabTest ( UserID int, UserName nvarchar(50), Age int, Birthday datetime ) 你可以用 Access 或者 Excel 来创造真实存在的字段名,但我这里是使用 SQL Server。 在 "字段资源管理器" 的 "数据库字段" 上按右键,选择 "数据库专家..."。在

弹出的对话框中,创建新连接==>OLE DB (ADO)(Access 或者 Excel 应点 "数据库文件" 前的 "+" 号)。在弹出的对话框,选择 "SQL Native Client" 作为提供程序。 按提示一步步地做,直到连上数据库。选择表 TabTest,把它弄到右边的框中。再点击确定。 折腾了半天就是为了这些字段名。对水晶报表的开发商无语…… 把需要显示的字段拖到 "详细资料"。"页眉" 和 Word 文档中的页眉完全不是一回事。这里的页眉其实就是列名(表头)。那么就顺便改一下列名吧。默认是有下划线的,可以改一下格式。

易语言使用Grid++Report起步教程

易语言使用Grid++Report起步教程 概述: 在本教程中,首先介绍用 Grid++Report 的报表设计器应用程序设计一个简单的清单式报表,我们最后会得到一个与 Grid++Report 例子模板中的‘简单列表.grf’类似的报表模板。接下来我们学习怎样让‘简单列表.grf’例子模板在易语言程序中运行起来。首先实现报表的打印与打印预览功能,通过本部分的学习我们可以得到一个类似本教程附带的‘打印与打印预览报表.e’程序。然后我们学习利用 Grid++report 的查询显示器控件实现报表在窗口中的查询显示,我们会创建一个类似本教程附带的‘在查询显示控件中显示报表.e’程序。通过本教程的学习,你将对 Grid++Report 报表模板设计与在易语言中使用 Grid++Report 有一个初步与直观的了解,开启你用 Grid++Report 在易语言中开发报表的大门,为你更进一步学习奠定了良好的开端。 具备一定的数据库方面的知识对开发报表非常重要,因为报表一般都需要从数据库中取数据,然后由报表工具生成出来,你应该对数据库方面的一些基本概念有所了解,能够写出基本的 SQL 查询语句。如果你具备这些基础知识,你学习用 Grid++Report 在易语言中开发报表会非常容易,如果你觉得这方面有所欠缺,建议你加强这方面的学习。本教程适用于第一次接触 Grid++Report 或对 Grid++Report 在易语言中使用还没有入门的易语言开发者。完成本教程的学习之后,建议你浏览并运行一遍 Grid++Report 自带的全部易语言例子,对 Grid++Report 的功能有所了解。 使用本教程你必须安装易语言的4.0或以上版本。必须安装 Grid++Report 报表组件,可以去 https://www.doczj.com/doc/c12077978.html,下载最新的 Grid++Report。为了顺利完成本教程,你应该将 Grid++Report 安装在 C:\Program Files\Grid++Report 3 目录下。 教程包括以下内容: ?第一节:创建报表模板 ?第二节:配置 Grid++Report 在易语言中的使用 ?第三节:实现报表打印与打印预览 ?第四节:实现报表在查询显示控件中显示 第一节:创建报表模板 ?创建一个空白的报表模板 1.从 Windows 桌面执行‘开始->程序->Grid++Report 3.6->Grid++Report 报表设计器’启动报表 设计器应用程序。 此时一个空白的报表模板创建在报表设计器应用程序中。 ?定义报表头

ReportViewer控件最简单教程-Xieris

教程题目:使用Report Viewer控件制作报表。 环境:WIN7,VS2012, 代码:https://www.doczj.com/doc/c12077978.html,。 需要元素(项目右击可添加这些项): Default.aspx Web窗体 Reoport.rdlc 报表 DataSet.xds 数据集文件(报表需要它规定格式) 需要实现效果: 1、能成功简单显示报表 2、使用list集合填充 3、使用DataTable填充 效果如下: 实现步骤: 基础: 1个button,1个report viewer(rv1)控件,直接从工具栏拖至页面即可。 右击项目,添加报表文件(Report.rdlc),双击报表文件,工具栏的控件会变成报表工具。Button事件(点击时显示报表):btn_Click.

代码如下: public void btn_Click(object sender, EventArgs e) { /*先清空原来数据集*/ rv1.LocalReport.DataSources.Clear(); /*设置报表文件*/ rv1.LocalReport.ReportPath = "Report.rdlc"; /*数据集的填充,效果2-3才需要*/ ReportDataSource rds = new ReportDataSource("DataSet1", loadData3()); /*将数据集添加到本地报表,效果2-3才需要*/ rv1.LocalReport.DataSources.Add(rds); /*刷新报表显示*/ rv1.LocalReport.Refresh(); } 加蓝色的代码,实现效果时需要改的,记住。 实现效果1: 打开Report.rdlc文件,从工具栏拖两个文本框,一个内容为hello,一个内容为world。 右击Default.aspx,选择浏览,这时,可以看见:

纷享销客使用规定3.0

关于纷享逍客的使用规定3.0 一、日志(每日工作计划) 1、总部:总部人员每日下班前应填写工作日志,填写内容为当日的主要工作内容及完成情况、第二天的工作计划内容,发送时间不得迟于当天24:00,逾期发送乐捐人民币20元/次。 2、营销部:各项目经理应于当天将工作总结及次日工作计划发送至“企信项目组”,逾期发送乐捐人民币20元/次。 二、周计划 1、填写人员:各项目经理 2、填写时间:每周日下班前填写完毕,发送时间不得迟于当天24:00,逾期发送乐捐人民币50元/次。 3、填写格式:填写本周主要工作内容及完成情况及下周的工作计划内容,工作内容要求客观详实,条理清楚。周表报统计时间为周一至周日,原“销售周报表”及“销控表”以附件形式添加并发送。 4、抄送范围:余总、林总、营销总监、项目策划、行政点评人:营销总监 三、月计划 1、填写人员:各项目经理 2、填写时间:每月初填写完毕,发送时间不得迟于5日24:00,逾期发送乐捐人民币50元/次。 3、填写格式:填写本月主要工作内容及完成情况及下月的工作计划内容,工作内容要求客观详实,条理清楚。月表报统计时间为1-31日,原“销售月报表”、“绩效考核”及“销控表”以附件形式添加并发送。 4、抄送范围:余总、林总、营销总监、项目策划、行政点评人:营销总监 四、案场会议记录 1、各项目经理应组织销售人员召开早会/晚会,并将早会视频发送至微信“阳光项目管理群”及晚会会议记录拍照发送至“纷享逍客企信的营销经理群”;经理休息或开会需交待其他人员主持早会,未完成视为经理监督不到位。 2、发送时间:早会视频在9:30前发送,全体上班成员均应参加,特殊情况未参加且未报备说明原因的个人及经理各乐捐50元/次,晚会记录应在当天 24:00前发送,逾期发送经理乐捐50元/次。 五、请假审批 1、所有人员请假需按照格式填写请假的起止时间及请假事由。 2、总部人员请假:抄送范围为总部,第一审批人为其直属上级,超过天数者第一审批人审批后应再次提交上一级审批人。 3、销售人员请假:抄送范围为“行政部”+"所在项目",请假时间1天内审批人为“项目经理”,超过1天者,由项目经理审批后需再次提交“营销总监”审批; 4、项目经理请假:抄送范围为“行政部”+"所在项目",审批人为“营销总监”,并由营销总监视具体情况决定是否需要提交上级审批。 5、请假必须提前1天填写《请假条》,获得批准后方可休假。未经批准视为无效请假,擅自休假的视为旷工。

利用Reportviewer生成RDLC报表

利用ReportViewer生成RDLC报表 报表是应用程序,特别是数据库系统中的重要功能。在Visual Studio 2010中,自带的ReportViewer控件,可以满足常用报表功能的实现,而且使用方便,以下就将介绍利用VS2010中的ReportViewer控件创建RDLC报表,并在winform程序中调用的实例,使用C#语法。 第一步:创建一个Windows应用程序 在Visual Studio 2010中,选择“文件”菜单,新建-“项目”,从已安装模板中选择Visual C#,从中间的项目类型中,选择“Windows窗体应用程序”;在名称栏中,为项目指定名称;在位置栏中,指定想要保存的目录。完成之后,项目中会有一个Form1,以下从对它的窗体设计器开始讲解。 像下面这样修改Form1的属性,当然也可以保留默认属性: Form1.Text = "MS Reporting Services 101 with Smart Client" Form1.Size = 750, 300 第二步:为窗体(Form)添加报表查看器(Report Viewer) 报表查看器,我们可以把它理解为显示和预览报表的容器。它不仅可预览输出报表,还可帮助将报表信息生成各种格式(PDF或Excel等等),当然也包括打印功能。 请按如下步骤在Form1上放置好报表查看器控件: 依次找到工具箱(ToolBox)――报表--报表查看器(ReportViewer),并把它拖到Form1上。这会创建一个名为reportViewer1的新实例。 通过设置reportViewer1.Dock = Fill,报表查看器将会填充窗体的整个区域,以显示报表。 在完成第一步与第二步之后,窗体看起来应该如图1所示: 图1 第三步:为项目添加数据集(DataSet) 数据集是伴随报表查看器而来的,它保存并提供从数据源而来的原始数据,我们便可对这些原始数据进行处理或在C#程序中输出。

reportviewer教程

打开Visual Studio后,选择"文件"—>"新建项目",打开新建项目对话框: 打开新建项目对话框后,在“项目类型”中选“Visual Basic"中的Windows: (也可在“项目类型”中选其它语言中的“Visual C#") 再在模板中选"Windows 应用程序",并在名称中输入名称"ReportViewerTest":

按确定后,显示Form的设计画面: 将工具箱中ReportViewer拖入至Form1中,将Form1适当的调大一点:

这样就在Form1上创建了一个默认名为"ReportViewer1"的控件,这个控件 就是用来浏览报表的控件。 (如果是用C#语言就创建了默认名为"reportViewer1"的控件,是第一个字母的大小写有区别)点击"ReportViewer1",在它的右上角出现了一个小三角形: 点击右上角的小三角形,点选"在父容器中停靠": 出现以下画面:

打开解决方案资源管理器(按Ctrl+Alt+L或在菜单->视图->解决方案资源管理器): 右击这个项目名称"ReportViewerTest",在出来的菜单上选: 添加->新建项,如下图所示:

在添加新项对话框中选"报表",名称就用默认的Report1.rdlc: 再点添加后,出现Report1.rdlc的设计画面:

选择工具箱中报表项下的"表",将"表"拖到Report1.rdlc设计窗体中: 将"表"拖到Report1.rdlc设计窗体中后,会自动生成“table1" 表,如下图: 红框以内就是"table1" 表。 在红框以内是报表的空白区:

纷享销客用户使用手册

纷享销客用户使用手册 快速上手版-管理后台 外勤签到设置.................................................................................. 考勤签到设置.................................................................................. 报数系统后台管理 ............................................................................ 版本说明: 版本:V4.7.0

日期: 版本更新: 创建企业 管理员登录进入企业后,网页导航栏包括功能模块:工作、CRM和应用,管理员还会拥有管理后台入口,点击[管理]进入管理后台,需要再次输入密码,确保后台管理的安全。

管理员可通过管理后台进行部门与员工维护、权限设置、账号安全管理、企业信息维护、删除信息管理、公告管理、日志统计等;纷享提供用户分类管理员设定,不同权限的管理员分门别类的 对各自模块继续维护和管理。 [1]管理后台首页展示员工统计数据,待审核的邀约,待分配部门的员工,未激活的员工,今 日登录的员工数; [2]安全数据统计,显示设备数据,和异常帐号数据 [3 [4] [1] [2] [3]添加员工:点击进行员工新建,填写姓名,昵称(默认与姓名一致),手机,登录帐 号(默认与手机号一致),设置初始密码,一个员工可从属多个部门,填写

其职务,选择直属上级(审批审核),新建用户默认为办公版,如当前企业购买了营销版 帐号,则可进行帐号设置。 [4]导入:点击导入,按照弹窗中的操作步骤提 示进行成员的批量导入操作,下载模版,补 充完成后上传即可;还可勾选是否发送短信 通知已创建的用户,方便员工及时收到通知[5] 传说中的小黄条 [6]员工列表信息包括:姓名,帐号,部门,职务,手机,创建时间及账户版本类型 (批量)选择员工记录时,可进行如上图操作:禁止登录,允许登录,批量编辑归属部门,重置密码,停用帐号, 激活提醒,设置版本类型。

VS2010_RDLC自带报表使用手册.

RDLC使用总结 1、为什么要使用RDLC报表(简介) VS .NET开发中,用什么进行报表设计?可能的回答是Crystal Report,当然,必须承认Crystal Report的功能还是非常强大的,被Business Object收购以后,商业的成分也在逐渐增加,也形成了一定规模的用户群。 Visual Studio .NET进入2005版本以后,Crystal Report与IDE的结合更“紧密”了,至少我们看不到那个讨厌的注册窗口了。但是,Microsoft似乎并不容忍在自己的超级工具中竟然没有报表工具,于是Report Viewer Control出现了,我把它的报表称为RDLC报表。 在VS .NET 2005之前,SQL Server Reporting Services中已经提供了一种被称为报表定义语言(Report Definition Language, RDL)的语言;在VS .NET 2005中,Microsoft提供了针对这种报表的设计器,并提供了在WinForm和WebForm中使用这种报表的能力。Microsoft将这种报表的后缀定为RDLC,RDL仍然是Report Definition Language的缩写,那么C代表什么呢?C代表Client-side processing,凸显了它的客户端处理能力。 这种报表的易用性和可定制性让我们完全有理由放弃Crystal Report,让我们来看看它的强大功能吧: 1)简单易用的控件,特别是Table控件,非常方便字段在报表上的排列; 2)灵活的可定制性,用XML来描述一个报表相关的一切,不用说了吧; 3)高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表生成、预览和打印等一系列操作; 4)支持DrillThrough数据钻取功能; 5)导出的Excel文件格式非常完美,而且并不需要安装Excel; 6)数据源处理极其方便,开发人员可以自己接管数据库连接、取数,然后将数据结果赋值给RDLC的数据集即可。 7)展示和数据分离,程序员更是可以编写一个RDLC设计器交有用户使用,这样用户就可以自行设计RDLC报表格式,程序员只负责定制数据接口即可。 RDLC MSDN:https://www.doczj.com/doc/c12077978.html,/zh-cn/library/ms251671(VS.80).aspx 2、RDLC简单Demo 本文所有RDLC例子都是基于VS2005 C#,所有ReportViewer的处理模式都是Local模式。本报表Demo显示上文中提到的RDLC手册各节内容,下述为Demo的详细steps。 1)新建项目,选择Windows应用程序项目类型,输入工程名称RDLCDev; 2)修改Form1窗体名称为FrmRdlcUserGuide,在工具箱—>数据Tab选项卡中选择ReportViewer控件,将其拖入到FrmRdlcUserGuide,默认命名为reportViewer1,调整ReportViewer控件的大小和布局; 3)在解决方案资源管理器中选择RDLCDev工程,鼠标右击RDLCDev工程,添加新建

2017年纷享销客使用说明及规定(精)

OA及纷享销客使用说明及相关规定 为规范销售公司日常管理,自2017年2月14日起启用OA及纷享销客进行工作汇报及各项工作管理具体工作流程及规定如下: 一.OA: 1.关于日常报货: A.操作方法: OA主界面---选择上方“销售通道”----“海利尔药业专区”---“远程报单”----选择左侧“新建订单”---进入界面1(下图)---选择“付款客户”(点击空格旁边的蓝色“选择”)---选择对应的客户----选择审批人(全部选择李建国(闲农),在权限栏的最后一个)---点击右上角“保存”(完成后为界面2,下图)-----点击右上角,最后一个“选择产品”----进入界面3(下图)-----点击左侧的“选择产品”---进入界面4(下图)----中间位置“产品名称”右侧的空格填写产品名称,然后点击搜索---进入界面5(下图)----选择需要的产品规格,点击对应列后面的“选择”--系统自动返回界面3---填写“数量”“交货日期”,如有特殊情况填写备注---点击右上角“保存”----进入界面6(下图)-----确认无误后,点击右上角“提交审核”即可。(如有修改,可根据提示进行修改。)---审核人审批完毕以后---查询订单在“远程报单”界面的左侧“已审核订单”,其他订单模式等。 B.特别说明: 1)订单形成后,审核完毕的下一步是进入ERP系统,需要取消订单时联系物流部杨梅0532--58659206。(如只是为了测试系统或学习系统发货数量为0,备注栏填写测试,这样的不必提醒) 2)非现款客户发货必须经由杨博淘副总裁审核后方可发货。 界面1 界面2 界面3 界面

4 界面5 界面6 2.关于推广费/市场问题反馈 OA主界面---业务平台--国内制剂专区--销售类申请---“推广费备案”;“推广费报账”“市场问题反馈”等按照相关规定要求填写上报----选择“青岛闲农”中的“王延辉经理”即可;价格上浮部分,申请上报----选择“青岛闲农”中的“李建国经理”即可。费用额度超过1万都要申请上报----选择“集团副总裁”中的杨博淘总”即可 3.关于OA其他应用: A.出差申请/请假:OA--业务平台-国内制剂专区-人资类申请--“出差/培训申请”“请假申请”,按照相关表格,详细填写清楚,销售人员上报李建国经理,市场及生测人员上报王延辉经理。 B.差旅费申请:OA--业务平台-国内制剂专区-付款类---根据差旅费报账表内容填写完成---销售选择李建国经理、市场选择王延辉经理-----交办即可。(该表最好在邮寄差旅费的同时提交) 二.纷享销客: 1.关于纷享销客日汇报: A.操作方式: 进入纷享销客主界面---下方“工作”--进入界面,选择右上方“+”--选择日志---“发日志”--填写工作总结、明日工作计划---左下角“抄送范围”(所有闲农人员选择“青岛闲农”“杨博淘”)---右下角“点评人”(销售人员选择李建国、市场及生测人员选择王延辉)。---点击右上角“发送” B.相关规定: 1).日汇报要求每天晚上20点之前按照以上操作方式进行发布。并随时跟进领导们的批示。迟报的在纷享销客“青岛闲农-日常交流”群里发10元红包自罚。

2017年纷享销客使用说明及规定

OA及纷享销客使用说明及相关规定为规范销售公司日常管理,自2017年2月14日起启用OA及纷享销客进行工作汇报及各项工作管理具体工作流程及规定如下: 一.OA: 1.关于日常报货: A.操作方法: OA主界面---选择上方“销售通道”----“海利尔药业专区”---“远程报单”----选择左侧“新建订单”---进入界面1(下图)---选择“付款客户”(点击空格旁边的蓝色“选择”)---选择对应的客户----选择审批人(全部选择李建国(闲农),在权限栏的最后一个)---点击右上角“保存”(完成后为界面2,下图)-----点击右上角,最后一个“选择产品”----进入界面3(下图)-----点击左侧的“选择产品”---进入界面4(下图)----中间位置“产品名称”右侧的空格填写产品名称,然后点击搜索---进入界面5(下图)----选择需要的产品规格,点击对应列后面的“选择”--系统自动返回界面3---填写“数量”“交货日期”,如有特殊情况填写备注---点击右上角“保存”----进入界面6(下图)-----确认无误后,点击右上角“提交审核”即可。(如有修改,可根据提示进行修改。)---审核人审批完毕以后---查询订单在“远程报单”界面的左侧“已审核订单”,其他订单模式等。 B.特别说明: 1)订单形成后,审核完毕的下一步是进入ERP系统,需要取消订单时联系物流部杨梅0532--58659206。(如只是为了测试系统或学习系统发货数量为0,备注栏填写测试,这样的不必提醒) 2)非现款客户发货必须经由杨博淘副总裁审核后方可发货。 界面1 界面2 界面3 界面4

界面5 界面6 2.关于推广费/市场问题反馈 OA主界面---业务平台--国内制剂专区--销售类申请---“推广费备案”;“推广费报账”“市场问题反馈”等按照相关规定要求填写上报----选择“青岛闲农”中的“王延辉经理”即可;价格上浮部分,申请上报----选择“青岛闲农”中的“李建国经理”即可。费用额度超过1万都要申请上报----选择“集团副总裁”中的杨博淘总”即可 3.关于OA其他应用: A.出差申请/请假:OA--业务平台-国内制剂专区-人资类申请--“出差/培训申请”“请假申请”,按照相关表格,详细填写清楚,销售人员上报李建国经理,市场及生测人员上报王延辉经理。 B.差旅费申请:OA--业务平台-国内制剂专区-付款类---根据差旅费报账表内容填写完成---销售选择李建国经理、市场选择王延辉经理-----交办即可。(该表最好在邮寄差旅费的同时提交) 二.纷享销客: 1.关于纷享销客日汇报: A.操作方式: 进入纷享销客主界面---下方“工作”--进入界面,选择右上方“+”--选择日志---“发日志”--填写工作总结、明日工作计划---左下角“抄送范围”(所有闲农人员选择“青岛闲农”“杨博淘”)---右下角“点评人”(销售人员选择李建国、市场及生测人员选择王延辉)。---点击右上角“发送” B.相关规定: 1).日汇报要求每天晚上20点之前按照以上操作方式进行发布。并随时跟进领导们的批示。迟报的在纷享销客“青岛闲农-日常交流”群里发10元红包自罚。

RDLC报表详细讲解与分析报告

RDLC报表随笔…… (,感谢网友”蜡人”) (一) VS .NET开发中,用什么做报表? 可能的回答是Crystal Report,自.NET“紧密”集成Crystal Report后,这可能是开发人员比较单一的选择。但是,这种集成似乎并不非常紧密,网络上充斥着关于使用Crystal Report的抱怨,太复杂也许是其最为令人诟病的地方,自定义性比较差也不能为程序员们所容忍。 当然,必须承认Crystal Report的功能还是非常强大的,被Business Ob ject收购以后,商业职能的成分也在逐渐增加,也形成了一定规模的用户群。 Visual Studio .NET进入2005版本以后,Crystal Report与IDE的结合更“紧密”了,至少我们看不到那个讨厌的注册窗口了。但是,Microsoft似乎并不容忍在自己的超级工具中竟然没有报表工具,于是Report Viewer Control出现了,我把它的报表称为RDLC报表。 在VS .NET 2005之前,SQL Server Reporting Services中已经提供了一种被称为报表定义语言(Report Definition Language, RDL)的语言;在VS .NET 2005中,Microsoft提供了针对这种报表的设计器,并提供了在WinForm和WebForm中使用这种报表的能力。Microsoft将这种报表的后缀定为RDLC,RDL仍然是Report Definition Lan guage的缩写,那么C代表什么呢?C代表Client-side processing,凸显了它的客户端处理能力。 这种报表的易用性和可定制性让我们完全有理由放弃Crystal Report,让我们来看看它的强大功能吧: 1、简单易用的控件,特别是Table控件,非常方便字段在报表上的排列; 2、灵活的可定制性,用XML来描述一个报表相关的一切,不用说了吧? 3、高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表

纷享销客软件使用评估(对比CRM、OA)

“纷享销客”软件评估一、软件概括 纷享销客是采用类微博、微信的交互形式,使手机与PC即时互通,糅合OA及CRM简要功能,实现外勤签到、日志填写、工作审批、指令发放、分享信息、客户群管理功能。 二、核心价值 取代一般团队用于内部沟通协作的传统OA 系统、邮件、CRM 和IM 工具,产品定位于销售团队管理,在平台主体为“微博(#话题#+@功能)+ 微信(语音)”的基础上,实现一软多能,且手机PC实时同步信息,帮助团队实现销售行为管理(LBS 签到、定位汇总、过程查询)、销售过程管理(包括销售日志、计划、统计等功能)和销售协同管理(如审批、指令任务、文档等)。 三、主要功能对比(以手机功能为主,同步PC为辅) 1、功能对比表格(请看下页)

四、测试结论 纷享销客是个轻量化、灵活性、易管控、个性化的软件,最大特点在于手机端功能上的糅合,使一个软件集成微信、微博分享交流特色功能,加入简易OA功能、CRM功能。具体优缺点如下表格所示:

从上表格可以看出,纷享销客相较OA而言,拥有OA无法比拟的内部沟通交流功能,但从工作模块来看,纷享销客责显得较为年轻,因纷享销客工作模块注重的是销售团队行为管理、沟通交流、手机端日志填写的便捷性,但针对全员来说是较为简单的,相反OA工作流的表单及流程设计能起到更好的管理效果; 再从CRM与纷享销客对比来看,除去OA已对比功能外,在客户管理系统中,远胜纷享销客现有客户管理功能; 依据公司现有的信息化管理软件(CRM+OA),手机+PC的同步功能即可满足轻量化纷享销客所带来的管理优势,当前相较纷享销客较弱的功能为“内部沟通交流分享模块”!但可通过微信解决,其原因为目前使用智能手机用户,没有人不使用微信,经过微博调查,以及现今社会人员使用习惯,即时使用第三方管理软件,大多数人依然无法离开使用微信,故此微信可实现内部交流群组建立,拟补我们现今信息化软件的不足。 另在目前互联网反映情况来看,纷享销客较多的使用者为互联网行业性质公司,因其业务销售性质和传统销售行业性质不同,销售类型并非快消品、耐消品,没有较多的数据工作流程,更多的提现是一纸合同、服务费、软硬设施费用,无需过多的工作流程,只需便捷的沟通行为。

纷享销客用户使用手册 管理员第二版

纷享销客用户使用手册快速上手版-管理后台 北京研发中心-产品部 —————————内部资料,请勿外传—————————

目录 创建企业 (4) 邀请同事 (5) 纷享管理后台 (7) 部门与员工 (8) 权限管理 (11) 帐号安全 (14) 应用管理 (15) 企业设置 (16) 外勤签到设置 (19) 考勤签到设置 (21) 报数系统后台管理 (23)

版本说明: 版本:V4.7.0 日期:2015.11.19 版本更新: 文档版本更新日期更新人更新概述 2015/11/19 V2.0 创建文档王学琳 创建企业企业第一个注册用户即为企业后台管理员,企业创建成功后,登录前往管理后台进行管理操作。 进入纷享销客官方网页,点击立即注册,进入注册流程,通过手机注册进入企业创建界面,填写企业名称,填写当前注册用户姓名和密码,点击创建。企业创建成功后,系统生成企业帐号方便登录。

邀请同事管理员登录进入企业,系统指引会引导管理员前往邀请同事,点击中部黄色指引条中的[邀请同事],弹出窗口提供给管理员两种邀请方式,一是通过手机号码或邮箱发送邀请,二是直接生成邀请链接复制黏贴给同事。 如果管理员没有通过引导方式邀请,也可在移动端设置-邀请同事,通过微信、短信、邮箱的方式调取本机的应用快速发出邀请。同事接受邀请并进行注册,提交信息给管理员,管理员可在此界面进行用户注册审核,审核通过的同事就正式加入当前企业,等待权限等其他设置。

纷享管理后台管理员登录进入企业后,网页导航栏包括功能模块:工作、CRM和应用,管理员还会拥有管理后台入口,点击[管理]进入管理后台,需要再次输入密码,确保后台管理的安全。 管理员可通过管理后台进行部门与员工维护、权限设置、账号安全管理、企业信息维护、删除信息管理、公告管理、日志统计等;纷享提供用户分类管理员设定,不同权限的管理员分门别类的对各自模块继续维护和管理。 管理后台首页展示员工统计数据,待审核的邀约,待分配部门的员工,][1未激活的员工,今日登录的员工数;

纷享销客移动端使用手册

纷享销客用户使用手册快速上手版-移动端 北京研发中心-产品部 —————————内部资料,请勿外传—————————

目录 下载安装 (1) 注册帐号 (2) 登录 (5) 功能模块概览 (6) 免费试用 (10) 发起对话 (11) 工作提醒 (13) 企信搜索 (14) 群组对话历史 (15) 企信消息撤回 (16) 语音消息转文字 (16) 群通知 (16) 发分享 (18) 发审批 (19) 发日志 (19) 工作界面 (20) 日程和任务 (21) 联络提醒 (24) 外勤签到 (24)

附近客户 (26) 考勤签到 (26) 微营销 (27) 工作简报 (28) 报数系统 (29) 通讯录 (30) 网盘 (31) 我的话题 (32) 我的归档 (33) 我的下载 (34) 我的微名片 (34)

版本说明: 版本:V4.7.0 日期:2015.11.16 版本更新: 文档版本更新日期更新人更新概述 V1.0 2015/08/31 王学琳创建文档 V1.1 2015/10/09 王学琳更新归档和报数系统截图V1.2 2015/10/11 王学琳更新4.6工作页最新改版 截图 V2.0 2015/11/16 王学琳手册全新改版并新增4.7 产品功能

下载安装 通过纷享销客官网(https://www.doczj.com/doc/c12077978.html,)或通过手机应用市场下载纷享销客进行安装。 1、 在浏览器输入https://www.doczj.com/doc/c12077978.html,进入纷享官网,页面最下方为下载页 面,如下图所示: 也可关注纷享销客微信公众号,了解更多关于纷享销客的讯息。 2、 在手机应用市场,如360手机助手,豌豆荚,小米商店等,搜索“纷享 销客”,点击下载安装,如下图: 1

纷享销客常见问题及解决办法大集合

纷享销客常见问题及解决办法 目录 一、签到问题 (2) 1、签到知识普及: (2) 2、签到位置有偏差: (2) 3、无法签到: (3) 4、签到拍照闪退 (3) 二、收不到push(消息提醒): (3) 三、关于手机权限的相关问题及解决办法: (4) 1、vivo: (4) 2、三星G3508J: (5) 3、三星,安卓4.2.0 (6) 4、酷派 (7) 5、三星S4 (8) 6、华为荣耀3C(h30-t00) (8) 7、小米2 (8) 四、低版本浏览器的功能缺失: (11) 五、登录不了 (11)

关于日常的问题受理,除功能使用咨询外,其它问题的受理重点应该是: 1、表象:比如登录不了,应该了解登录不了的具体提示是什么; 2、对比:比如无法签到,在了解具体无法签到的具体表现后,需要和其它功能或APP有对比,除了签到,纷享中其它功能是否可以使用?再比如登录提示网络异常,那手机中其它APP是否可以使用? 3、排除:通常,纷享中个别功能无法使用,提示网络异常,首先需要排除是否被手机中的安全软件限制了权限。 4、终端信息:对于手机端的问题,为了方便排查,需要和客户了解以下信息:手机品牌型号、手机系统版本、纷享销客版本、是否越狱或刷机、企业帐号、个人账号。 一、签到问题 1、签到知识普及: 目前纷享的定位方式有两种,GPS和基站定位两种方式,开启GPS定位的精确度较高;使用基站定位,定位的精确度取决于所在地附近基站分布的情况。 云层较厚或者在室内,即使开启了GPS,也是通过基站来进行定位的。 2、签到位置有偏差: 1.1 点击当前位置右侧的大于号,在位置列表选择一个相对准确的地点; 1.2 尝试移动一下所在位置,如果在室内,建议到窗户边重新进行签到,签到获取位置的时间多停留一会; 1.3 如果是安卓手机,可在一键签到界面右上角点击地图切换定位服务,目前支持百度、高德、腾讯的定位服务。

VS2010报表ReportViewer数据的生成

VS2010报表ReportViewer数据的生成-添加程序运行过程中生成表字段与参数 开发环境:vs2010 报表工具:ReportViewer.exe 这个要另外安装 开发说明: 由于在开发、运行过程中,会生成一些汇总统计表,这样的表不一定会以数据库表的形式固定存在,因此,会以运行过程中,用DataSet\DataTable、参数的方式传递给ReportViewer。 关键点: 1、ReportViewer在制作报表时,要生成用户数据,需要添加数据表,在制作过程中,调用该表。但,如果该表是通过参数传递过来,会无法读取该表,因此,需要手工添加一个临时表给它。

2、临时表生成,解决,添加新建项方案中,添加新建项,数据-数据集,工具栏,添加table,再添加键,生成一个可供调用的临时表。 3、VS2010在制作表过程中,菜单会出现在两个地方,一个在主菜单出现,下拉后内容极少,不包括数据参数,一个在【视图】中,打开,在工具栏会出现数据参数等更多内容。

4、有了临时表、参数,就可以布局制作报表了,统计时间是数据参数传递的。

5、统计表的数据传输与参数参数程序 注:传递数据表 Microsoft.Reporting.WinForms.ReportDataSource r = new Microsoft.Reporting.WinForms.ReportDataSource(); https://www.doczj.com/doc/c12077978.html, = "my_dt"; r.Value = da; 传递的表名称要与设计时的名称一致。

this.reportViewer1.LocalReport.DataSources.Clear(); this.reportViewer1.LocalReport.DataSources.Add(r); 传递参数 ReportParameter p = new ReportParameter("dt", dt); this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p }); _ds是通过中间层传输过来。 【参考代码】 private void bt_Sum_Class_Click(object sender, EventArgs e) { string dt = this.dateTimePicker1.Value.ToString("yyyy年MM月dd日") + " -至-" + this.dateTimePicker2.Value.ToString("yyyy年MM月dd日"); this.lb_title.Text = "[" + this.dateTimePicker1.Value.ToString("yyyy-MM-dd") + "]至[" + this.dateTimePicker2.Value.ToString("yyyy-MM-dd") + "]" + this.bt_Sum_Class.Text; DataSet _ds = gl.DecompressGetBytes(gl.BL.Get_Sum_Between_Classified_Zip(this.dateTimePicker1.Value, this.dateTimePicker2.Value)); DataTable da = _ds.Tables[0]; this.dataGridView1.DataSource = _ds.Tables[0]; this.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); for (int i = 1; i <= this.dataGridView1.Columns.Count - 1; i++) {

相关主题
文本预览
相关文档 最新文档