iReport默认参数和变量的含义解析【转】

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 1.变量:VPAGENUMBERTextFieldV{PAGE_COUNT} 当前页面中记录的数目$V{...

1.

变量:
$V{PAGE_NUMBER}代表当前页数(可以是页码也可以是页数,通过TextField的计算时间的不同值来设置)

$V{PAGE_COUNT} 当前页面中记录的数目

$V{groupname_COUNT}代表当前组的记录数   eg:如果组是根据FthecityCityGroupV{CityGroup_COUNT}

$V{COLUMN_NUMBER} 列号码

$V{COLUMN_COUNT} 当前列中记录的数目(是当前页里行的序号,在新页上会重置为1)

$V{REPORT_COUNT} 当前文档中数据源记录数目

 

对于$V{PAGE_NUMBER}:
当evaluationTime="Now"时,即是计算当页所在哪一页. (now:即时执行此表达式.)
当evaluationTime="Report"时,即是计算当页所在哪一页.(Report:整个报表执行完后才执行此表达式)
 


 2.参数:
Parameter name                                 Class type
          
$P{REPORT_PARAMETERS_MAP}          java.util.Map
这是一个内置的参数,这个参数总是指向一个 java.util.Map 对象,该对象保存了用户调用报表装填过程时传递给报表引擎的用户定的参数。

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

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

$P{REPORT_SCRIPTLET}                      net.sf.jasperreports.engine.JRAbstractScriptlet
即 使报表不使用 scriptlet ,这个内置的参数仍将指向一个 net.sf.jasper.engine.JRAbstracStriptlet 实例,该实例实际是一个 net.sf.jasper.engine.JRDefaultScriptlet 对象。
但是当使用 scriptlet 时,报表装填过程所生成的这个指向 scriptlet 类实例的引用允许我们调用其中的某些特殊函数,使用或控制 scriptlet 对象在装填过程中已经准备好的数据。在 scriptlet 例子中你可以看到更详细的使用过程。


Built-in variables内置变量

PAGE_NUMBER    包含了当前页码,在整个报表中包含总的页数。

COLUMN_NUMBER     包含当前是第几列

REPORT_COUNT 指示当前正在处理的是第几条记录

PAGE_COUNT      当前页中包含了几条记录

COLUMN_COUNT       当前列中包含了几条记录

<group name>_COUNT 以变量前缀来表示这个组记录数


Evaluation Time赋值时间

Now 立即求表达式的值

Report 报表产生之后求表达式的值

Page 页未求表达式的值

Colum n列末求表达式的值

Group求每组的值

例如:

第几页:$V{PAGE_NUMBER} Evaluation Time :Now

总页数:$V{PAGE_NUMBER} Evaluation Time :Report



Calculation types计算类型

Nothing   不是计算类型,它被使用当用户指定内在的表达式时,每条记录将被赋值。

Count      计算所有非null的表达式的次数,不要把它和sum搞混了,sum是计算的是数字的结果

Sum 反复的迭加表达式当前的值

Average   计算所有标准输入的表达式的平均值。

Lowest    返回标准输入中最低的表达式的值

Highest    返回标准输入中最高的表达式的值

StandardDeviation 返回标准输入中规格不同的表达式值standard deviation

Variance 返回标准输入中不一致的表达式值

System    不是一种计算方式,也不求表达式的值;使用这个后,报表引擎仅将最后一个变量值放入内存中;它可以用脚本来存储计算结果。.


Reset types重置类型

None       这个Initial Value Expression总是被忽视

Report     这个变量被初始化一次仅仅在报表创建的开始,用Initial Value Expression。

Page       这个变量被初始化在每个新页

Column   The这个变量被初始化在每个新列(或者在每页,如果这个报表页仅仅只有一列的话)

Group     The 这个变量被初始化在每一个新的组(我们定义这个组用Reset Group)

 

3.网上资料:

写道
(1)
JasperReports是一个开源的java报表制作引擎
iReport是JasperReports的一个GUI工具,用来生成JasperReports的jrxml文件。
JasperReports的报表是用XML文件来定义的,约定用jrxml作后缀名。一个典型的jrxml文件包含以下元素:
* <jasperReport> - 根元素
* <title> - 报表的标题,一篇报表里只在开头打印一次
* <pageHeader> - 页眉,报表每页开头打印一次
* <detail> - 报表正文
* <pageFooter> - 页脚,报表每页末尾打印一次
* <band> - 定义报表部件,以上所有元素都包含一个band元素作为他们唯一的子元素
·Summary:可能需要对几页(你的报表可能有几个页组成)的统计值。比如50个销售记录共占用了3页,那么放置这些统计记录的统计值最好的地方就是summary。
·groupHeader:每个表的内容可能需要根据某个属性进行划分显示内容和计算内容,比如希望以月份为单位每组分开显示销售记录,那么就可以定义一个组(组的定义参考后文),groupHeader就是放置组说明或是组标志最好的地方。
·Groupfooter:放置组的统计或是说明

(2)
各元素分析:
static text:静态文本,只是用来在报表中显示;
P>;:"20"+P{statement_current_date}

F>textfield.:F{account_code}
此变量是在<field name>中定义的.其值是在<queryString>中,通过select数据库后,得到的.
select的列名 = field name

V>:V{balance}
变量的默认值是在报表中设置的.一般设置为0.其真正的值是通过 PF来获得的.

(3)
A,报表中的QueryString语句,可以通过界面上的DataBase中的Report SQL Query来进行添加-->会自动生成相应的TextField.若不行,则可自动手动添加.
B,如果要直接修改代码,可以选择界面上的'编辑'-->'直接编辑XML Source'-->先进行保存-->就会出现代码界面.
C,如果要修改JASPER REPORT的属性,可以选择界面上的'预览'-->'报表属性'
E,添加group,可以通过点击界面上的相应'group'按钮来添加.
F,隐藏不要的区域,要设bank=0,而不能删除为空.删除为空,则为默认值
G,IReport中的左栏中的各元素的后面的[X,Y]内的数据,是指此元素偏离'左上角'的X,Y距离.
H,设置子报表时,要将子报表的属性中的"上边界,下边界,左边界,右边界"全部设置为0,否则会出现子报表传回来的数据,在主报表中没法对齐的现象.

(4)
当没有数据(是指QueryString语句SELECT出来的数据为NULL)时,设置怎样显示:
相关代码:
whenNoDataType="NoPages / BlankPage / AllSectionsNoDetail"
NoPages:当没数据时,会弹出一个对话框提示你没数据,然后显示一个没激活的框.
BlankPage :不会提示,只是显示一个白纸.
AllSectionsNoDetail:不会提示,但那些静态的文本,以及从上一层或JAVA文件中传来显示的参数,都可以显示.

(5)
内置的报表变量:
VPAGENUMBER:()JasperReportA,:V{PAGE_NUMBER};
对于VPAGENUMBER:evaluationTime="Now",.(now:.)evaluationTime="Report",.(Report:)B,String.C,:<textFieldevaluationTime="Now"><textFieldExpressionclass="java.lang.String">"Page"+String.valueOf(V{PAGE_NUMBER}) + " Of"
</textFieldExpression>
</textField>
<textField evaluationTime="Report">
<textFieldExpression class="java.lang.String">
String.valueOf(VPAGENUMBER)</textFieldExpression></textField>V{REPORT_COUNT}:
当evaluationTime=Report时,将记录报表的总记录数.
当evaluationTime=Column时,将记录报表从开始到当前页的总记录数.
Variable COLUMN_NUMBER
这个变量将记录当前的列号。
Variable PAGE_COUNT
这个变量纪录当前页中处理的record的数目。
Variable COLUMN_COUNT
这个变量纪录生成当前列时所处理的record的数目。

(6)
field的动态显示+动态显示不同的格式:
有些报表可能需要对同种类型的数据根据重要性不同而显示不同的风格。例如,要在订单列表中加亮显示金额超过100.<printWhenExpression>F{value} < 100(正常显示的文本域)和Fvalue>=100(7)1),:JasperReportsixUnitPrice=(JasperReport)JRLoader.loadObject("jasper/TrendAveItemIntel6MonthUnitPrice.jasper");parameters.put("sixUnitPrice",sixUnitPrice);2),sixUnitPrice.:net.sf.jasperreports.engine.JasperReport3)iReprot,.subReport,:useconnectionexpressionsubReportother:imageexpressionclass=net.sf.jasperreports.engine.JasperReportsubreportexpression:P{sixUnitPrice}
4)
设置要传到子报表的参数,并在主报表中创建相应的参数.
5)
新建子报表,创建一参数(与主报表传递的参数一样),来接收从主报表传来的参数.-->即可应用了.
说明:
位于多层之下的子报表,也需要从主报表开始时,就可以加载,传递下去,否则加载不了.因为一开始,都是从JAVA文件中从传过来,然后一层层传下去的.

(8)
hashmap参数在报表间传递值的用法
1)
如何带参数:
在某层子报表中创建一个新的子报表,此新子报表,必须从:报表java类中定义-->主报表-->各上级父报表中对此新子报表进行定义(定义此参数+各父报表添加此新报表参数,以便其子报表可以获得)-->目的子报表
2)hashmap参数在报表间传递值的用法
如上的专题记录,Pgrouptotalhashhashmap,,:,.:1.,hashmap,,使:<parametername="grouptotalhash"isForPrompting="false"class="java.util.HashMap"><defaultValueExpression><![CDATA[newjava.util.HashMap()]></defaultValueExpression></parameter>2.,:P{group_total_hash}.put();如下:
Ptrayouthash.put("trayout",F{totalqty}) == null?
Boolean.TRUE:Boolean.TRUE
3.
/*
在主报表中:
子报表的返回值有一个问题:它们是在当前区域的所有元素都被处理之后才返回的。
所以,为了能在主报表中的子报表所在的同一区域显示返回值,我们必须延迟文本域表达式的处理时机。这是通过加入一个无效的分组让表达式在分组结束时处理来实现的,而这个无效分组的效果就是数据源中的每条记录就是一组,而且它自己没有组头和组尾区域。
*/
在主报表中:
添加一Field,设置数据类型为Double,且Evaluation time=Column(否则数据出不来)
Pgrouptotalhash.get();:newDouble(((Double)P{trayout_hash}.get("trayout")).doubleValue()
-
((Double)Ptrayinhash.get("trayin")).doubleValue())4.ACCOUNTPL,SCMitemintelligence::ProfitLossbasic.jrxmltotal:ProfitLossbasicsubReportprofitlosstotalyearlist.jrxmlTrendAveItemIntelReport.jrxmlTrendAveItemInteltrayout.jrxml.(9)Group::():mysql>selectfromA;+++|id|name|+++|1|hk||2|hk|+++mysql>selectfromB;+++++|id|Aid|name|value|+++++|1|1|sz|1||1|1|cz|1||2|2|zh|1||2|2|gz|1|+++++,A,()BA.group,(>iReport):IDNamevalue>pageHeader1hk1>detail>1sz1>detail2cz12hk1//name1zh12gz1groupname,jaspername,.name:IDNamevalue>pageHeader1hk1>groupHeader,name,1sz1>detail2cz11zh12gz1sumvalue:5>groupFooter:group,"group"(:nameGroup).,group(variable),groupFooter.(1)iRport,sumValue,:variabletype:Doublecaculationtype:sumResettype:GroupResetGroup:group(:nameGroup)variableexpression:()F{value}
(2)
在groupFooter添加一field:
须定义:
Evaluation time : group,而不是now
Evaluation Group: 上面自定义的group名(如:nameGroup)

jasper报表,子报表内容显示重叠
在jasper中,若在detail区域中,把两个一模一样的子报表上下放置.则在循环输出时,会出现上下子报表
输出内容相遮掩的结果.
解决方案:用group分离显示.
把两个子报表,分别放于两个不同的group中,分组条件为主报表的每一个ID,这样,主报表循环显示时,就
会将各分组一一显示出来,不会影响其显示.

用法二:
利用group来进行分组和实现子报表返回值:
第(8)点的返回值,只适合于非循环性的.
若在主报表的detail区域,需要让每条record都将子报表返回值到对应的record中,则要采用这种方法.上面的方法实现不了.
因为子报表的返回值有一个问题:它们是在当前区域的所有元素都被处理之后才返回的。如果你想在子报表所在的主报表区域显示它的返回值,你最终将看到它们返回的太晚了。
具体实现方法:
1)
先在主报表,子报表建立一个同名的hashmap容器,且将主报表的这个参数作为子报表的传递参数,传到
子报表中.
2)
在报表中,对窗口进行加值:
方式一:
在子报表中,在summary区域的属性中添加:
Ptrayouthash.put("trayout",F{totalqty}) == null?Boolean.TRUE:Boolean.TRUE
方式二:
在子报表中,在summary区域中添加一个不可见的直线元素,且在其中设置:
<line>
<reportElement x="0" y="0" width="0" height="0">
<printWhenExpression>
Ptrayouthash.put("trayout",F{totalqty}) == null?Boolean.FALSE:Boolean.FALSE
</printWhenExpression>
</reportElement>
</line>
3)
在主报表中,添加一个分组,以每条记录作为一个分组.操作如下:
A,点击GROUP按钮.
B,填写组名;
C,分组表达式: Fitemcode.(id)>D,:startonanewpage>,.4)detail,field,:<textFieldevaluationTime="Group"evaluationGroup="itemcodeGroup"><reportElementx="335"y="50"width="175"height="15"/><textFieldExpression>P{trayout_hash}.get("trayout")
</textFieldExpression>
</textField>
采用Group实现返回值的说明:
子报表的返回值有一个问题:它们是在当前区域的所有元素都被处理之后才返回的。如果你想在子报
表所在的主报表区域显示它的返回值,你最终将看到它们返回的太晚了。
所以,为了能在主报表中的子报表所在的同一区域显示返回值,我们必须延迟文本域表达式的处理时
机。这是通过加入一个无效的分组让表达式在分组结束时处理来实现的,而这个无效分组的效果就是
数据源中的每条记录就是一组,而且它自己没有组头和组尾区域。
<group >
<groupExpression>Fitemcode</groupExpression></group>(10)Double,:P{trayout_hash}.get("trayout")-->Object类型;
((Double)Ptrayouthash.get("trayout"))>Double;((Double)P{trayout_hash}.get("trayout")).doubleValue()-->转换成double类型,进行计算;
new Doubel(A-B)--->将最终结果转换成Double,因为上面设置类型类型时,用了Double.
如下:
new Double
(
((Double)Ptrayouthash.get("trayout")).doubleValue()((Double)P{trayin_hash}.get("trayin")).doubleValue()
)

(11)
变量还可以声明来完成引擎内建计算的求值,如:count、sum、average、lowest、highest、 variance等等。一个完成Quantity字段sum计算的变量定义如下:
<variable name="QuantitySum"
class="java.lang.Double" calculation="Sum">
<variableExpression>FQuantity</variableExpression></variable>ReportPageColumnGroup<variablename="QuantitySum"class="java.lang.Double"resetType="Page"calculation="Sum"><variableExpression>F{Quantity}</variableExpression>
<initialValueExpression>new Double(0) </initialValueExpression>
</variable>
变量将在每一页的开始处被初始化为0。

(12)
变量的resetType解释:
报表变量的值可以在每一次迭代(iteration)中被改变,但也可以在装填过程中的某一特定的时间(specified moments)通过它的初始的value表达式恢复其初始值。这一行为是由resetType属性控制的,这一属性规定了报表装填过程中当报表变量在何时需要重新进行初始化(或恢复到初始值)。该元素有五种选项值:
4.1
No Reset:变量将不会使用其initial value expression对自身进行初始化,而将仅报表从变量表达式中所求得的值(resetType=”None”)。
4.2
Report Level Reset:变量将在报表填充过程的起始阶段使用其初始化表达式初始化一次(resetType=”Report”)。
缺省的属性为resetType=”Report”
4.3
Page Level Reset:变量将在每一页的起始时被重新初始化(resetType=”Page”)。
4.4
Colunm Level Reset:变量将在每个新列的开始被初始化(resetType=”Column”)
4.5
Group Level Reset:变量将在每次resetGroup属性提供的break的地方被重新初始化(resetType=”Group”)。
Reset Group
如果存在的话,resetGroup属性包含了报表的组的名字并且仅与resetType=”Gropu”的resetType属性相关联。

(13)
报表的分层显示方法:
外层,在主报表中查询循环显示;
下层,在子报表中查询循环显示.

目录
打赏
0
0
0
0
680
分享
相关文章
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
1951 7
|
11月前
|
解析Java线程池:参数详解与执行流程
解析Java线程池:参数详解与执行流程
115 1
南大通用GBase 8s数据库游标变量解析:提升数据库操作效率
南大通用GBase 8s 数据库游标变量解析:提升数据库操作效率
requests库中json参数与data参数使用方法的深入解析
选择 `data`或 `json`取决于你的具体需求,以及服务器端期望接收的数据格式。
462 2
yolov5的train.py的参数信息解析
这篇文章解析了YOLOv5的`train.py`脚本中的参数信息,详细介绍了每个参数的功能和默认值,包括权重路径、模型配置、数据源、超参数、训练轮数、批量大小、图像尺寸、训练选项、设备选择、优化器设置等,以便用户可以根据需要自定义训练过程。
187 0
深度解析京东商品列表数据接口:功能、参数与实战技巧
京东商品列表数据接口让开发者通过HTTP请求获取京东商品详尽列表信息,包括ID、名称、价格等。接口支持参数化搜索(关键词、价格区间等),返回JSON格式数据,便于处理与分析。开发者需注册账号并创建应用以获取访问权限。应用场景涵盖市场调研、商品管理和营销策略制定等,有效提升数据驱动决策能力。
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
694 0
|
9月前
|
精通Go语言的命令行参数解析
【8月更文挑战第31天】
148 0

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等