首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

2013-11-08 
第十一章 BIRT数据绑定与脚本,事件机制详解(续)11.3 Java事件绑定下面以一个例子来介绍怎么在BIRT设计器中

第十一章 BIRT数据绑定与脚本,事件机制详解(续)
11.3 Java事件绑定

下面以一个例子来介绍怎么在BIRT设计器中添加JAVA事件处理。在 Eclipse 中创建一个单一工程,引入样例报表,使用 Java 语言实现报表事件响应处理程序。引导读者在短时间内对百灵报表(BIRT)有一个初步了解,并掌握使用 Java 语言创建百灵报表(BIRT)事件响应处理程序的基本步骤和调试方法。

建立工程

按照如下步骤,建立一个Java工程,同时引入BIRT Engine API JAR 包。


图 2. 建立工程
第10一章 BIRT数据绑定与脚本,事件机制详解(续)

1. 启动百灵报表(BIRT),在主菜单中选择 File -> New -> Project... 菜单项,打开 New Project 对话框。


图 3. New Project 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

2. 在 New Project 对话框中选择 Java -> Java Project 项目,单击 Next 按钮,打开 New Java Project 对话框。


图 4. New Java Project 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

3. 在 Project name 处输入“BirtWithJava”作为项目名称,单击 Next 按钮,打开 Java Settings 对话框。


图 5. Java Settings 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

4. 在 Java Settings 对话框中选择 Libraries 页面,单击 Add External JARs... 按钮.


图 6. Libraries 页面

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

5. 选择 “<百灵报表(BIRT)根目录>/plug-ins/org.eclipse.birt.report.engine_2.3.0.v20080616.jar“ 文件,添加为工程类库。这个 JAR 包文件是百灵报表(BIRT) 的 Engine API。对于不同版本的百灵报表(BIRT),该文件的文件名中所附带的版本信息是不一样的。


图 7. 引入 Engine API

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

6. 单击 Finish 按钮,当系统提示 “Open Associated Perspective?” 时,单击 Yes 按钮,如下结构的 Java 工程被创建出来。


图 8. BirtWithJava 工程

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

导入样例报表

按照如下步骤,导入一个样例报表。


图 9. 打开 Show View 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

1. 在主菜单中选择 Window -> Show View -> Other... 菜单项,打开 Show View 对话框。


图 10. Show View 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

2. 在 Show View 对话框中选择 Report and Chart Design -> Report Examples 项目,单击 OK 按钮,打开 Report Examples 窗口。


图 11. Report Examples 窗口

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

3. 在 Report Examples 窗口的 Sample Reports 列表中选择 Reporting Feature Examples -> Cross tab -> CrosstabSampleRevenue.rptdesign 项目。这是一个样例报表,它采用交叉表格式来展示一份商品销售情况报告,其数据来自百灵报表(BIRT)内嵌的一个样例数据库。交叉表的具体用法较为复杂,本文不做过多讨论。选择好样例报表后,单击窗口右上角的导入按钮,打开 Project Name 对话框。


图 12. Project Name 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

4. 在 Project Name 对话框中输入 BirtWithJava,单击 OK 按钮,系统显示 Project Exists 提示框。


图 13. Project Exists 提示框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

5. 在 Project Exists 提示框中单击 Proceed 按钮,将选择的样例报表 CrosstabSampleRevenue.rptdesign 导入到本文的示例工程 BirtWithJava 中。导入成功后,此报表被自动打开。


图 14. 样例报表

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

6. 单击报表 CrosstabSampleRevenue.rptdesign 的 Preview 页面,预览此报表。

7. 系统显示处理状态,表示正在生成报表,这可能需要等待几十秒钟的时间。


图 15. 预览报表

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

8. 当系统处理完成后,报表被显示出来。这是一份商品销售报告,显示的是每类商品的季度销售额以及累计情况。接下来,我们尝试用 Java 创建一个事件响应处理类,把每季度销售额在10万美元以上的数据用红色标示出来。

创建 Java 类

按照如下步骤,用 Java 创建百灵报表(BIRT)的事件响应处理程序。


图 16. 创建 Java 类

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

1. 在主菜单中选择 File -> New -> Class 菜单项,打开 New Java Class 对话框。


图 17. New Java Class 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

2. 在 New Java Class 对话框的 Name 处输入 DataItemEventHandler ,作为该事件响应处理类的名字。单击 Browse... 按钮,打开 Superclass Selection 对话框。选择或直接输入 "org.eclipse.birt.report.engine.api.script.eventadapter.DataItemEventAdapter" 作为父类。

3. 单击 Finish 按钮,一个名称为 DataItemEventHandler.java 的文件被创建出来,在这个文件里输入如下代码:


清单 1. 报表事件响应处理类

import org.eclipse.birt.report.engine.api.script.IReportContext;import org.eclipse.birt.report.engine.api.script.eventadapter.DataItemEventAdapter;import org.eclipse.birt.report.engine.api.script.instance.IDataItemInstance;public class DataItemEventHandler extends DataItemEventAdapter {    public void onRender(IDataItemInstance data, IReportContext reportContext) {        super.onRender(data, reportContext);        if (((Double) data.getValue()).doubleValue() > 100000) {            data.getStyle().setColor("red");        }    }}

在上面这段代码中,我们重写了 DataItemEventHandler 类的 onRender 方法。该方法带有两个参数,其中 data 就是当前我们要操作的数据实例,在这里我们通过条件判断来把大于10万美元的数据设置为红色。另外一个参数 reportContext 则是一个全局的上下文对象,利用这个上下文对象,可以在不同的事件响应处理类中传递信息。

4. 确认无误后存盘,报表事件响应处理类创建完成。

Java 类与报表关联

按照如下步骤,将创建好的 Java 事件响应处理类和样例报表关联起来。


图 18. 打开报表属性页面

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

1. 切换到报表 Layout 页面,在主菜单中选择 Window -> Show View -> Other 菜单项,打开 Show View 对话框。


图 19. Show View 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

2. 在 Show View 对话框中选择 Report Design -> Property Editor 项目,单击 OK 按钮,打开 Property Editor 窗口。


图 20. Property Editor 窗口

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

3. 选中报表设计区中的第一个 revenue 数据项,这就是我们要操作的季度销售数据。

4. 在 Property Editor - Data 窗口左侧选择 Event Handler 页面。

5. 在 Event Handler 页面中,单击 Browse... 按钮,打开 Class Selection 对话框。


图 21. Class Selection 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

6. 在 Class Selection 对话框中选择 DataItemEventHandler 类,单击 OK 按钮,完成报表数据项和 Java 事件响应处理类的关联。


图 22. 关联 Java 类

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

7. 单击报表的 Preview 页面,可以看到10万美元以上的季度销售数据(不包括累计数据)都被标示为红色了。这表明我们定制的 Java 事件响应处理类已经和报表成功关联起来。


图 23. 预览报表

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

调试 Java 类

对于任何一个开发工作,调试都是不可避免的。百灵报表(BIRT)提供了一个调试器,开发者可以利用这个调试器,对定制的 Java 事件响应处理类进行调试。

1. 在 Java 类 DataItemEventHandle 中设置断点。


图 24. 设置断点

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

2. 在主菜单中选择 Run -> Debug Configurations... 菜单项,打开 Debug Configurations 对话框。


图 25. Debug Configurations 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

3. 在 Debug Configurations 对话框中,选择 Report 列表项目,单击鼠标右键。在弹出菜单中,选择 New 菜单项,创建一个新的调试环境配置 New_configuration。


图 26. 配置调试环境

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

4. 在 Main 页面中,选择 Debug type 为 Java,并选中 Output 中的 “Open generated file when finished”。

5. 单击 Classpath,打开 Classpath 页面。


图 27. Classpath 页面

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

6. 在 Classpath 页面中,选中 User Entries 项目,单击 Add Projects... 按钮,打开 Project Selection 对话框。


图 28. Project Selection 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

7. 在 Project Selection 对话框中,选择 BirtWithJava 工程项目,单击 OK 按钮,回到 Debug Configurations 对话框。


图 29. Debug Configurations 对话框

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

8. 在 Debug Configurations 对话框中, 单击 Debug 按钮,开始调试。

9. 系统准备进入调试状态,这可能需要几十秒钟的时间。当提示 “Confirm Perspective Switch” 对话框时,单击 Yes 按钮,进入调试画面。


图 30. 开始调试

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

10. 系统运行停留在断点处,开始调试。调试完成后,去除断点,单击 Resume (F8) 按钮继续运行,最终生成的报表在外部浏览器中被打开。


图 31. 运行结果

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

 

11.4 表达式生成器

前面已经用过很多次表达式生成器,无论是在报表项,还是过滤,参数,排序,分组,映射,突出显示等等。但用到的表达式很简单,仅仅只是冰山一角。

例如我们在添加表的排序依据的键时候,可以输入以下来实现动态排序:

if( params["srt"].value == "firstcol" ){row["CUSTOMERNUMBER"];} else if( params["srt"].value == "secondcol"){row["CUSTOMERNAME"];} else if( params["srt"].value == "thirdcol"){row["CONTACTLASTNAME"];}

表达式生成器中不仅可以调用javascript,还可以调用java,根据表达式所属的对象,还可以直接调用该对象的常量。比如数据项的displayString,backgroundColor,style等等

除了 Rhino JavaScript 包含的本机 JavaScript 类以外,BIRT 还提供了几个 JavaScript 类。在编写表达式时,报告开发者可以访问任何 BIRT 类及其属性和函数。BIRT 类作为 BIRT JavaScript 对象显示在表达式构建器的“类别”列表中。 

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

使用 Java 代码编写的 BIRT 事件处理程序无法直接访问 BIRT JavaScript 类。但是,通过对元素定义新的用户属性并使用 JavaScript 表达式来对该属性赋值,可以部分地避开此限制。JavaScript 表达式可以使用任何 BIRT JavaScript 对象。由于 Java 代码能够访问用户属性的值,所以,Java 代码可以按此方式访问 JavaScript 表达式的求值结果。此技术的主要限制是,在创建元素时对表达式求值,因此,该表达式是静态的。

下面简要介绍最常用的几个BIRT javascript:

类 DateTimeSpan 

静态 DateTimeSpan 类提供了一些函数来确定两个日期或时间之间的时间量以及加上或减去时间范围。它提供了一组函数来处理两个日期之间的时间差。因为日期范围仅仅是数字,所以应用程序可对它们使用正常的数学运算:加减乘除等等。此类是静态类。应用程序不能创建此类的实例。

DateTimeSpan.addDate 

此函数返回一个新日期,它是用起始日期加上指定的年数、月数和天数之和。月数可以大于 12,而天数可以大于一个月的天数。实际效果就好像是三个不同的操作。先加上年数。然后使用生成的日期加上月数。接着使用生成的日期加上天数。

在加上月时,生成的日期可能无效。例如,将 1 月 31 日加上一个月会生成无效日期 2 月 31 日。在此情况下,函数会将其调整为有效日期,如果该年不是闰年,则 2 月有 28 天,所以生成的日期将为 3 月 3 日。

任何年数、月数或天数参数都可以为空或者是未定义的。如此一来该值会被视为零。

任何年数、月数或天数参数都可以是负数。在此情况下,结果将被认为是从基本日期减去该单元。

语法 

DateTimeSpan.addDate( startDate, years, months, days )

参数 

startDate 

用于表示基本日期的日期对象。 

years 

该日期要加上的年数。 

months 

该日期要加上的月数。 

days 

该日期要加上的天数。 

返回 

表示用起始日期加上年数、月数和天数生成的日期。

示例 

var startDate = date.parse( "2004-12-31" ); 

var endDate; 

endDate = DateTimeSpan( startDate, 1, 0, 0 ); // 返回 2005-12-31 

endDate = DateTimeSpan( startDate, 0, 1, 0 ); // 返回 2005-1-31 

endDate = DateTimeSpan( startDate, 0, 0, 1 ); // 返回 2005-1-1 

endDate = DateTimeSpan( startDate, 1, 1, 1 ); // 返回 2005-3-4

DateTimeSpan.addTime 

此函数返回一个新日期,它是用起始日期加上指定的小时数、分钟数和秒数之和。小时数可以大于 24,而分钟数和秒数可以大于 60。实际效果就好像是三个不同的操作:先加上小时数。然后使用生成的日期加上分钟数。接着使用生成的日期加上秒数。

任何小时数、分钟数和秒数参数可以为空或者是未定义的。如此一来该值会被视为零。

任何小时数、分钟数和秒数参数都可以是负数。在此情况下,结果将被认为是从基本日期减去该单元。

语法 

DateTimeSpan.addTime( startDate, hours, minutes, seconds )

参数 

startDate 

用于表示基本日期的日期对象。 

hours 

该日期要加上的小时数。 

minutes 

该日期要加上的分钟数。 

seconds 

该日期要加上的秒数。 

返回 

表示用起始日期加上小时数、分钟数和秒数生成的日期。

DateTimeSpan.days 

返回两个日期之间的天数。一天被定义为日历的变化。因此,2 月 27 日下午 11:59:59 到 2 月 28 日午夜为一天,2 月 27 日午夜到 2 月 28 日 11:59:59 也为一天。

语法 

DateTimeSpan.days( startDate, endDate )

参数 

startDate 

用于表示范围起始位置的日期对象。 

endDate 

用于表示范围结束位置的日期对象。 

返回 

返回两个日期之间的天数。

DateTimeSpan.hours 

此函数返回两个时间之间的整小时数。整小时被定义为一小时的指定分钟至下一小时的同一分钟。例如,1:23:00 到 2:23:00 为一小时,而 1:23:00 到 2:22:59 的整小时数为零。

语法 

DateTimeSpan.hours( startDate, endDate )

参数 

startDate 

用于表示范围起始位置的日期对象。 

endDate 

用于表示范围结束位置的日期对象。 

返回 

两个日期之间的整小时数。

DateTimeSpan.minutes 

此函数返回两个时间之间的整分钟数。整分钟被定义为一分钟的指定秒至下一分钟的同一秒。例如,1:23:00 到 1:24:00 为一分钟,而 1:23:00 到 1:22:59 的整分钟数为零。

语法 

DateTimeSpan.minutes( startDate, endDate )

参数 

startDate 

用于表示范围起始位置的日期对象。 

endDate 

用于表示范围结束位置的日期对象。 

返回 

两个日期之间的整分钟数。

DateTimeSpan.months 

此函数返回两个日期之间的整月数。整月被定义为一个月的第 N 天到下个月的第 N 天的时间范围。例如,2 月 28 日到 3 月 28 日是一个月,而 2 月 28 日到 3 月 26 日的整月数为零。

语法 

DateTimeSpan.months( startDate, endDate )

参数 

startDate 

用于表示范围起始位置的日期对象。 

endDate 

用于表示范围结束位置的日期对象。 

返回 

返回两个日期之间的整月数。

DateTimeSpan.seconds 

此函数返回两个时间之间的秒数。

语法 

DateTimeSpan.seconds( startDate, endDate )

参数 

startDate 

用于表示范围起始位置的日期对象。 

endDate 

用于表示范围结束位置的日期对象。 

返回 

两个日期之间的整分钟数。

DateTimeSpan.subDate 

此函数返回一个新日期,它是从起始日期减去指定的年数、月数和天数生成的结果。月数可以大于 12,而天数可以大于一个月的天数。实际效果就好像是三个不同的操作。先减去年数。然后使用生成的日期减去月数。接着使用生成的日期减去天数。

在减去月时,生成的日期可能无效。例如,从 3 月 30 日减去一个月会生成无效日期 2 月 30 日。此函数会通过将日期调整为该月的最后一个有效日来生成有效日期。在此情况下,如果该年不是闰年,则日期会调整为 2 月 28 日。

任何年数、月数或天数参数都可以为空或者是未定义的。在此情况下,该值会被视为零。

任何年数、月数或天数参数都可以是负数。在此情况下,结果将被认为是用基本日期加上该单元。

语法 

DateTimeSpan.subDate( startDate, years, months, days )

参数 

startDate 

用于表示基本日期的日期对象。 

years 

要从该日期减去的年数。 

months 

要从该日期减去的月数。 

days 

要从该日期减去的天数。 

返回 

表示从起始日期减去年数、月数和天数生成的日期。

DateTimeSpan.subTime 

此函数返回一个新日期,它是从起始日期减去指定的小时数、分钟数和秒数的结果。小时数可以大于 24,而分钟数和秒数可以大于 60。实际效果就好像是三个不同的操作。先减去小时数。然后使用生成的日期减去分钟数。接着使用生成的日期减去秒数。

任何小时数、分钟数和秒数参数可以为空或者是未定义的。在此情况下,该值会被视为零。

任何小时数、分钟数和秒数参数都可以是负数。在此情况下,结果将被认为是用基本日期加上该单元。

语法 

DateTimeSpan.subTime( startDate, hours, minutes, seconds )

参数 

startDate 

用于表示基本日期的日期对象。 

hours 

要从该日期减去的小时数。 

minutes 

要从该日期减去的分钟数。 

seconds 

要从该日期减去的秒数。 

返回 

表示从起始日期减去小时数、分钟数和秒数生成的日期。

DateTimeSpan.years 

此函数计算两个日期之间的整年数。整年被定义为从一年的指定月份、日期和时间到下一年的同一月份、日期和时间的时间范围。因为闰年,整年有时包含 365 天,有时包含 366 天。

如果任一参数不是日期,则会抛出异常。如果任一参数为空,则结果也为空。

语法 

DateTimeSpan.years( startDate, endDate )

参数 

startDate 

用于表示范围起始位置的日期对象。 

endDate 

用于表示范围结束位置的日期对象。 

返回 

两个日期之间的整年数。 

Finance 类 

Finance 类是 BIRT 提供的 JavaScript 类。这个类提供了一组可用来执行各种常用商业计算的静态财务函数。财务值可以表示为浮点值。应用程序不能创建此类的实例。

Finance.ddb 

使用双倍余额递减法,此函数返回资产在给定单一期间内的折旧额。双倍余额递减折旧法是一种加速折旧法,与折旧额固定的直线折旧法(SLN)相比,此折旧法在固定资产使用期限早期产生较高的折旧额,从而提高节税额。

此函数使用以下公式来计算单一期间内的折旧额:

depreciation = (( initialCost - totalDepreciationFromPriorPeriods) * 2) / 

assetLifespan

下列规则适用:

assetLifespan 和 singlePeriod 必须以相同的时间单位计。 

所有参数都必须是正数。 

语法 

ddb( initialCost, salvageValue, assetLifespan, singlePeriod )

参数 

initialCost 

此数字表达式指定资产的初始成本。 

salvageValue 

此数字表达式指定资产在其使用期限结束时的价值。 

assetLifespan 

此数字表达式指定资产使用期限的长度。 

必须使用 singlePeriod 的计量单位来提供此值。例如,如果 singlePeriod 以月份计,则 assetLifespan 必须也以月份计。 

singlePeriod 

此数字表达式指定 DDB 将计算折旧额的期间。 

必须使用 assetLifespan 的计量单位来提供此值。例如,如果 assetLifespan 以月份计,则 singlePeriod 必须表示一个月的期间。 

示例 

以下示例使用双倍余额递减法来计算购买价为 $1400、折余值为 $200 并且使用期限估计为 10 年的新机器在第一年的折旧额。结果是 $280,将其赋予变量 Year1Deprec:

Year1Deprec = Finance.ddb(1400, 200, 10, 1)

Finance.fv 

基于固定利率及等额分期付款,此函数返回年金的终值。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。年金的终值是指最后一次付款后的现金余额。

例如,如果存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用,则此计划的终值是 $75,000。

或者,如果贷款 $11,000,则贷款的终值是 $0.00。对于所有典型贷款来说,情况均如此。

下列规则适用:

ratePerPeriod、numberPayPeriods 和 eachPmt 必须以相同的单位计,例如每星期、每个月或每年。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

语法 

fv( ratePerPeriod, numberPayPeriods, eachPmt, presentValue, whenDue )

参数 

ratePerPeriod 

此数字表达式指定每一期的利率。必须使用 numberPayPeriods 的计量单位来提供此值。例如,如果 numberPayPeriods 以月份计,则 ratePerPeriod 必须是月利率。 

numberPayPeriods 

此数字表达式指定年金付款总期数。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 是月利率,则 numberPayPeriods 必须以月份计。 

eachPmt 

此数字表达式指定各期付款额。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 以月份计,则 eachPmt 必须是每月付款额。 

presentValue 

此数字表达式指定未来付款额或一系列付款额的现值。 

例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。该 $100 的现值大约是 $23.94。 

whenDue 

此数字表达式指定各期付款是在期初进行(1)还是期末进行(0)。此值必须是 0 或 1。 

示例 

以下示例假定您的女儿出生时您在储蓄帐户存入 $10,000。如果此帐户的复合日利率为 5.7%,那么,当她 18 岁上大学时,此帐户的余额是多少呢?答案是 $27,896.60,将其赋予变量 TotalValue:

TotalValue = Finance.fv(0.057/365, 18*365, 0, -10000, 1)

以下示例与上一个示例几乎完全相同。但是,在本例中,假定利率是复合月利率而不是复合日利率,并且您决定每月在该帐户中另存入 $55。在本例中,赋予 TotalValue 的终值是 $48,575.82:

TotalValue = Finance.fv(0.057/12, 18*12, -55, -10000, 1)

Finance.ipmt 

基于固定利率及等额分期付款,返回年金在给定期间内的利息偿还额。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。每笔付款都由两部分组成,即本金和利息。iPmt 返回付款的利息部分。

下列规则适用:

ratePerPeriod 和 numberPayPeriods 必须以相同的单位计,例如每星期、每个月或每年。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

语法 

ipmt( ratePerPeriod, singlePeriod, numberPayPeriods, presentValue, futureValue, whenDue )

参数 

ratePerPeriod 

此数字表达式指定每一期的利率。必须使用 numberPayPeriods 的计量单位来提供此值。例如,如果 numberPayPeriods 以月份计,则 ratePerPeriod 必须是月利率。 

singlePeriod 

此数字表达式指定特定的期间,将确定该期的利息。提供的此值必须是 1 到 numberPayPeriods。 

numberPayPeriods 

此数字表达式指定年金付款总期数。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 是月利率,则 numberPayPeriods 必须以月份计。 

presentValue 

此数字表达式指定未来付款额或一系列付款额的现值。例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。在本例中,该 $100 的现值大约是 $23.94。 

futureValue 

此数字表达式指定最后一次付款后的现金余额。 

例如: 

存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用。在此计划中,终值是 $75,000。 

您贷款 $11,000。终值是 $0.00。对于所有典型贷款来说,情况均如此。 

whenDue 

此数字表达式指定各期付款是在期初进行(1)还是期末进行(0)。此值必须是 0 或 1。 

示例 

以下示例假定您贷款 $20,000,还款期为 36 个月,APR 为 11.5%,并且在每个月的第一天还款。在第 5 次还款时,支付了多少利息?答案是 $171.83,并赋予 Interest5:

Interest5 = Finance.ipmt(.115/12, 5, 36, -20000, 0, 1)

Finance.irr 

此函数返回现有数组中一系列定期现金流、付款和收款的内部收益率。内部收益率是由定期进行的付款和收款组成的投资的利率。每一期的现金流不必是定额的,年金亦如此。

IRR 与净现值函数 NPV 紧密相关,这是因为 IRR 计算的收益率是与零净现值对应的利率。IRR 是以迭代方式计算的。以 <starting guess> 值开始,它在结果精确到 0.00001% 之前重复进行计算。如果在 20 次迭代后仍无法确定结果,该函数就会失败。

下列规则适用:

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

cashArray 必须至少包含一个负数和一个正数。 

如果在同一期内既有正现金流(即收款)也有负现金流(即付款),那么对该期使用净流。 

如果在特定期间内没有现金流或净现金流,则必须输入 0(零)作为该期间的值。 

下列提示可能很有用:

因为 IRR 使用数组中值的顺序来解释付款和收款顺序,所以,请确保以正确的顺序输入付款和收款额。 

如果 IRR 失败,请尝试使用另一个 startingGuess 值。 

语法 

irr( cashArray, startingGuess )

参数 

cashArray 

指定代表现金流值的现有双精度数组的名称。cashArray 必须至少包含一个正数值(即收款)和一个负数值(即付款)。 

startingGuess 

数字表达式。指定 IRR 的估计返回值。在大多数情况下,此值为 0.1,即 10%。 

示例 

以下示例假定已使用一系列现金流值填充了数组 myArray。将内部收益率赋予变量 IRRValue:

IRRValue = Finance.irr( myArray, .1 )

Finance.mirr 

此函数返回现有数组中一系列定期现金流或者付款和收款的修正内部收益率。修正内部收益率是指付款和收款利率不同时的内部收益率(IRR)。MIRR 同时考虑投资成本(即 financeRate)和现金再投资收益率(即 reinvestmentRate)。

下列规则适用:

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

cashArray 必须至少包含一个负数和一个正数。 

如果在同一期内既有正现金流(即收款)也有负现金流(即付款),那么对该期使用净流。 

如果在特定期间内没有现金流或净现金流,则必须输入 0(零)作为该期间的值。 

因为 MIRR 使用数组中值的顺序来解释付款和收款顺序,所以,请确保以正确的顺序输入付款和收款额。

语法 

mirr( cashArray, financeRate, reinvestmentRate )

参数 

cashArray 

此双精度数组指定现有现金流值数组的名称。此数组必须至少包含一个正数值(即收款)和一个负数值(即付款)。 

financeRate 

此数字表达式指定作为资金成本支付的利率。此值必须是表示百分比的十进制值。 

reinvestmentRate 

此数字表达式指定现金再投资的收益率。此值必须是表示百分比的十进制值。 

示例 

以下示例假定已使用一系列现金流值填充了数组 myArray。如果要支付的资金利率是 12%,收入的收益率是 11.5%,那么修正内部收益率是多少?将答案赋予变量 MIRRValue:

MIRRValue = Finance.mirr( myArray, 0.12, 0.115 )

Finance.nper 

基于固定利率及等额分期付款,返回年金的期数。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。

下列规则适用:

ratePerPeriod 和 eachPmt 必须以相同的单位计,例如每星期、每个月或每年。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

语法 

nper( ratePerPeriod, eachPmt, presentValue, futureValue, whenDue )

参数 

ratePerPeriod 

此数字表达式指定每一期的利率。必须使用 eachPmt 的计量单位来提供此值。例如,如果 eachPmt 是月付款额,则 ratePerPeriod 必须是月利率。 

eachPmt 

此数字表达式指定各期付款额。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 以月份计,则 eachPmt 必须是每月付款额。 

presentValue 

此数字表达式指定未来付款额或一系列付款额的现值。 

例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。在本例中,该 $100 的现值大约是 $23.94。 

futureValue 

此数字表达式指定最后一次付款后的现金余额。 

例如: 

存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用。在此计划中,终值是 $75,000。 

您贷款 $11,000。终值是 $0.00。对于所有典型贷款来说,情况均如此。 

whenDue 

此数字表达式指定各期付款是在期初进行(1)还是期末进行(0)。此值必须是 0 或 1。 

示例 

以下示例假定您贷款 $20,000,APR 为 11.5%,并且在每个月的第一天还款。如果每期还款额为 $653.26,那么,还清贷款需要多少期?答案是 36,将其赋予变量 NumPeriods。

NumPeriods = Finance.nper(.115/12, -653.26, 20000, 0, 1)

Finance.npv 

基于给定利率,此函数返回一系列定期可变现金流(包括正现金流和负现金流)的净现值。PV 确定一系列定额付款的现值,而 NPV 确定一系列可变付款的现值。净现值是与某项投资相关联的所有未来现金流减去所有初始成本后的结余。换言之,如果将这笔资金按指定的利率 <rate> 存入银行并且存款期限为由现金流预定,则它产生的损益与所讨论的现金流系列产生的损益相同。

下列规则适用:

NPV 投资在数组中第一个现金流值的日期之前开始一期,并在最后一个现金流值的日期使该期结束。 

如果第一个现金流在第一期开始时发生,则必须将它的值与 NPV 返回的值相加,而且不能将其包括在 cashArray 的现金流值中。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

cashArray 必须至少包含一个负数和一个正数。 

如果在同一期内既有正现金流(即收款)也有负现金流(即付款),那么对该期使用净流。 

如果在特定期间内没有现金流或净现金流,则必须提供 0(零)作为该期间的值。 

因为 NPV 使用数组中值的顺序来解释付款和收款顺序,所以,请确保以正确的顺序提供付款和收款额。

语法 

npv( rate, cashArray )

参数 

rate 

此数字表达式指定某一期的贴现率。此值必须是十进制值。 

cashArray 

此双精度数组指定现有现金流值数组的名称。此数组必须至少包含一个正数值(即收款)和一个负数值(即付款)。 

示例 

以下示例假定已使用一系列现金流值填充了数组 myArray,并且利率是 11%。净现值是多少?将答案赋予变量 NetPValue:

NetPValue = Finance.npv( .11, MyArray )

Finance.percent 

此函数计算两个数值的比率,以百分比计。此函数能够处理两项与百分比的计算相关的关键常规任务:处理分子为零以及处理空值。

语法 

percent( denom, num, valueIfZero )

参数 

denom 

分母。此参数必须包含数字值。 

num 

分子。此参数必须包含数字值。此值可以是零。 

valueIfZero 

当分子为零时返回的百分比值。缺省值为空。 

返回 

两个数值的比率,以百分比计。如果分子为零,则返回 0。如果两个参数中任何一个为空,则返回空。 

示例 

pct = Finance.percent( 20, 50 ) // 返回 40 

pct = Finance.percent( 20, 0 ) // 返回 0

Finance.pmt 

基于固定利率及等额分期付款,返回年金的每期付款额。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。

下列规则适用:

ratePerPeriod 和 numberPayPeriods 必须以相同的单位计,例如每星期、每个月或每年。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

语法 

pmt( ratePerPeriod, numberPayPeriods, presentValue, futureValue, whenDue )

参数 

ratePerPeriod 

此数字表达式指定每一期的利率。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 numberPayPeriods 以月份计,则 ratePerPeriod 必须是月利率。 

numberPayPeriods 

此数字表达式指定年金付款总期数。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 是月利率,则 numberPayPeriods 必须以月份计。 

presentValue 

此数字表达式指定未来付款额或一系列付款额的现值。 

例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。在本例中,该 $100 的现值大约是 $23.94。 

futureValue 

此数字表达式指定最后一次付款后的现金余额。 

例如: 

存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用。在此计划中,终值是 $75,000。 

您贷款 $11,000。终值是 $0.00。对于所有典型贷款来说,情况均如此。 

whenDue 

此数字表达式指定各期付款是在期初进行(1)还是期末进行(0)。此值必须是 0 或 1。 

示例 

以下示例假定您贷款 $20,000,还款期为 36 个月,APR 为 11.5%,并且在每个月的第一天还款。每期付款额是多少呢?答案是 $653.26,将其赋予 PaymentAmt:

PaymentAmt = Finance.pmt(.115/12, 36, -20000, 0, 1)

Finance.ppmt 

基于固定利率及等额分期付款,返回年金在给定期间内的本金偿还额。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。年金的每笔付款由两部分组成:本金和利息。ppmt 返回付款的本金部分。

下列规则适用:

ratePerPeriod 和 numberPayPeriods 必须以相同的单位计,例如星期、月份或年份。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

语法 

ppmt( ratePerPeriod, singlePeriod, numberPayPeriods, presentValue, futureValue, whenDue )

参数 

ratePerPeriod 

此数字表达式指定每一期的利率。必须使用 numberPayPeriods 的计量单位来提供此值。例如,如果 numberPayPeriods 以月份计,则 ratePerPeriod 必须是月利率。 

singlePeriod 

此数字表达式指定特定的期间,将确定该期的利息。此值必须是 1 到 numberPayPeriods。 

numberPayPeriods 

此数字表达式指定年金付款总期数。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 是月利率,则 numberPayPeriods 必须以月份计。 

presentValue 

此数字表达式指定未来付款额或一系列付款额的现值。 

例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。在本例中,该 $100 的现值大约是 $23.94。 

futureValue 

此数字表达式指定最后一次付款后的现金余额。 

例如: 

存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用。在此计划中,终值是 $75,000。 

您贷款 $11,000。终值是 $0.00。对于所有典型贷款来说,情况均如此。 

whenDue 

此数字表达式指定各期付款是在期初进行(1)还是期末进行(0)。此值必须是 0 或 1。 

示例 

以下示例假定您贷款 $20,000,还款期为 36 个月,APR 为 11.5%,并且在每个月的第一天还款。在第 5 次还款时,支付了多少本金?答案是 $481.43,将其赋予 Principal5:

Principal5 = Finance.ppmt(.115/12, 5, 36, -20000, 0, 1)

Finance.pv 

基于固定利率及未来的等额分期付款,此函数返回年金的现值。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。现值是组成年金的未来付款额或一系列付款额的现值。

例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。因此,该 $100 的现值大约是 $23.94。

下列规则适用:

ratePerPeriod 和 numberPayPeriods 必须以相同的单位计,例如每星期、每个月或每年。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

语法 

pv( ratePerPeriod, numberPayPeriods, eachPmt, futureValue, whenDue )

参数 

ratePerPeriod 

此数字表达式指定每一期的利率。必须使用 numberPayPeriods 的计量单位来提供此值。例如,如果 numberPayPeriods 以月份计,则 ratePerPeriod 必须是月利率。 

numberPayPeriods 

此数字表达式指定年金付款总期数。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 是月利率,则 numberPayPeriods 必须以月份计。 

eachPmt 

此数字表达式指定各期付款额。必须使用 ratePerPeriod 的计量单位来提供此值。例如,如果 ratePerPeriod 以月份计,则 eachPmt 必须是每月付款额。 

futureValue 

数字表达式。此数字表达式指定最后一次付款后的现金余额。 

例如: 

存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用。在此计划中,终值是 $75,000。 

您贷款 $11,000。终值是 $0.00。对于所有典型贷款来说,情况均如此。 

whenDue 

此数字表达式指定各期付款是在期初还是期末进行。此值必须是 1(表示期初)或 0(表示期末)。 

示例 

以下示例假定您正在考虑购买面值为 $1000 的企业债券。此债券年息为 $100,15 年到期,并且在计息年度结束时派息。类似债券的到期收益率是 12.5%。此债券的合理价格是多少?换而言之,它的现值是多少?答案是 $834.18,将其赋予变量 PresentValue:

PresentValue = Finance.pv(.125, 15, 100, 1000, 0)

以下示例假定您购买彩票中奖。奖金为 $10,000,000,分 20 年支付,每年支付 $500,000,一年以后开始支付。如果年复合利率为 9.5%,此彩票今天的价值是多少呢?答案是 $4,406,191.06,将其赋予 PresentValue:

PresentValue = Finance.pv(.095, 20, 50000,10000000, 0)

以下示例假定您要分三年储蓄 $11,000。如果 APR 是 10.5%,并且您计划每月存入 $325 并在月初存入,那么,要实现目标,帐户里最初应该有多少起始资金呢?答案是 $2,048.06,将其赋予 StartValue。注意,eachPmt 是负数,这是因为它表示要支付的现金:

StartValue = Finance.pv(.105/12, 3*12, -325, 11000, 1)

Finance.rate 

此函数返回年金在每一期的利率。年金是一段时间内进行的一系列定额现金付款。年金可以是投资(例如每月存款计划),也可以是贷款(例如住房抵押贷款)。

Rate 以迭代方式计算年金的利率。以 startingGuess 值开始,它在结果精确到 0.00001% 之前重复进行计算。如果在 20 次迭代后仍无法确定结果,该函数就会失败。

下列规则适用:

numberPayPeriods 和 eachPmt 必须以相同的单位计,例如每星期、每个月或每年。 

必须使用负数来表示现金支出(例如存款),并使用正数来表示现金收入(例如股息支票)。 

下列提示可能很有帮助:

因为 Rate 使用数组中值的顺序来解释付款和收款顺序,所以,请确保以正确的顺序提供付款和收款额。 

如果 Rate 失败,请尝试使用另一个 startingGuess 值。 

语法 

rate( numberPayPeriods, eachPmt, presentValue, futureValue, whenDue, startingGuess )

参数 

numberPayPeriods 

此数字表达式指定年金付款总期数。必须使用 eachPmt 的计量单位来提供此值。例如,如果 eachPmt 是月付款额,则 numberPayPeriods 必须以月份计。 

eachPmt 

此数字表达式指定各期付款额。必须使用 numberPayPeriods 的计量单位来提供此值。例如,如果 numberPayPeriods 以月份计,则 eachPmt 必须是每月付款额。 

presentValue 

此数字表达式指定未来付款额或一系列付款额的现值。 

例如,如果今天在银行存入 $23.94,存期 15 年,复合年利率为 10%,则最终大约会得到 $100。因此,在本例中,该 $100 的现值大约是 $23.94。 

futureValue 

此数字表达式指定最后一次付款后的现金余额。 

例如: 

存款计划的目标是 18 年后积累 $75,000 以支付子女的教育费用。在此计划中,终值是 $75,000。 

您贷款 $11,000。终值是 $0.00。对于所有典型贷款来说,情况均如此。 

whenDue 

此数字表达式指定各期付款是在期初还是期末进行。此值必须是 1(表示期初)或 0(表示期末)。 

startingGuess 

此数字表达式指定 Rate 的估计返回值。在大多数情况下,此值为 0.1,即 10%。 

示例 

以下示例假定您借贷了 $20,000,并且分三年还清贷款。如果每个月偿还 $653.26 并且在月初支付,那么,您支付的利率(APR)是多少呢?答案是 .115(即 11.5%),将其赋予变量 InterestRate。注意,Rate 的返回值必须乘以 12 才能得到年利率:

InterestRate = Finance.rate(3*12, -653.26, 20000, 0, 1, .1) * 12

Finance.sln 

此函数返回单个时期资产的直线折旧额。直线折旧法最古老并且最简单的固定资产折旧法。它将资产帐面值减去预计余值,并将它们的差值均匀地分配到资产使用期限的各个期间。此过程用于在计算所得税之前对收入收取固定年度折旧费用。所有参数都必须是正数。

语法 

sln( initialCost, salvageValue, assetLifespan )

参数 

initialCost 

此数字表达式指定资产的初始成本。 

salvageValue 

此数字表达式指定资产在其使用期限结束时的价值。您可以输入一个余值以查看直线折旧额与余值的偏差,也可以通过输入余值 0(零)以返回没有余值的直线折旧额。 

assetLifespan 

此数字表达式指定资产使用期限的长度。必须使用函数的返回计量单位来提供此值。例如,如果要让 SLN 确定资产的年折旧额,则 assetLifespan 必须以年计。 

示例 

以下示例使用直线折旧法来计算购买价为 $1400、余值为 $200 并且使用期限估计为 10 年的新机器的年折旧额。结果是每年 $120,将其赋予 AnnualDeprec:

AnnualDeprec = Finance.sln(1400, 200, 10)

Finance.syd 

此函数返回资产在所指定期间内的年限总和折旧额。年限总和折旧法是一种加速折旧法,与折旧额固定的直线折旧法(SLN)相比,此折旧法在固定资产使用期限的早期产生较高的折旧额,从而提高节税额。

此函数根据使用期限年数的数字之和的倒数比例来计算折旧额。例如,如果资产的使用期限为 4 年,数字 4、3、2、1 相加得 10。于是,第一年的 SYD 是资产的可折旧成本的 4/10,即成本减去余值。第二年的比率为 3/10,依此类推。

下列规则适用:

singlePeriod 和 assetLifespan 必须以相同的时间单位计。 

所有参数都必须是正数。 

语法 

syd( initialCost, salvageValue, assetLifespan, singlePeriod )

参数 

initialCost 

此数字表达式指定资产的初始成本。 

salvageValue 

此数字表达式指定资产在其使用期限结束时的价值。 

assetLifespan 

此数字表达式指定资产使用期限的长度。必须使用 singlePeriod 的计量单位来提供此值。例如,如果 singlePeriod 以月份计,则 assetLifespan 必须也以月份计。 

singlePeriod 

此数字表达式指定一个期间,SYD 将计算此期间内的折旧额。必须使用 assetLifespan 的计量单位来提供此值。例如,如果 assetLifespan 以月份计,则 singlePeriod 必须表示一个月的期间。 

示例 

以下示例使用年限总和折旧法来计算购买价为 $1400、余值为 $200 并且使用期限估计为 10 年的新机器在第一年的折旧额。结果为 $218.18,将其赋予 Year1Deprec。

Year1Deprec = Finance.syd(1400, 200, 10, 1)

注意:

结果等于 10/55 * $1,200 

55 = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 

在这一系列的数字中,第 1 期(第一年)的数字是 10 

以下示例计算同一资产在其使用期限内第二年的折旧额。结果为 $196.36,将其赋予 Year2Deprec。

Year2Deprec = Finance.syd(1400, 200, 10, 2)

注意:

结果等于 9/55 * $1,200 

55 = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 

在这一系列的数字中,第 2 期(第二年)的数字是 9 

Total 类 

Total 类是作为聚集函数的容器提供的。Total 类包含许多用于进行聚集的函数。这些函数是 BIRT 对 JavaScript 的扩展,它们对一组行进行汇总。BIRT 报告引擎在下列两个阶段实现了函数:

在报告的数据转换阶段发生的聚集阶段 

在生成和表示阶段发生的聚集访问阶段 

BIRT 重新编写了任何包含聚集的脚本,从而创建了执行这两个阶段的已修订脚本。您只有在调试包含聚集函数的表达式时,了解此过程才十分重要。请研究在组的组脚中显示值的示例,其中,该值是在所有帐户的总计中所占的百分比。以下语句执行此操作:

(balance / Total.sum( balance, Total.OVERALL ) ) * 100.0

在以上示例中,Total.OVERALL 导致 BIRT 对所有行计算求和聚集函数,即使此表达式出现在组总计中亦如此。为了计算上一示例中的表达式,BIRT 将执行一次遍历以计算总计,然后执行第二次遍历以计算每个帐户的值。

Total 类的一般规则是:

聚集函数忽略空值。 

应用程序可以有选择地指定分组级别。 

应用程序可以有选择地指定条件。 

应用程序不能创建此类的实例。 

关于分组和过滤 

所有聚集函数都允许使用两个可选参数来指示过滤和分组:

Total.<聚集函数> ( ..., filter, group )

关于过滤器参数 

过滤器参数提供了一个布尔表达式,对于每一行,BIRT 都会对该表达式进行求值。在计算聚集时,BIRT 仅考虑与该过滤器匹配的行。例如,报告可以对活动客户的贷记限额进行求和,以确定最大贷记风险。

此表达式是在数据转换阶段执行的。它可以访问行中的列、参数、用户定义的函数以及上述上下文描述中定义的其他资源。例如:

Total.sum( row["CreditLimit"], row["Active"] == 'Y' );

指定过滤器参数 null、未定义过滤器参数或者指定 Total.NO_FILTER,都表示未提供过滤器。如果应用程序未提供过滤器,则过滤器缺省为未定义。如果提供了组参数,则必须提供 null 或 Total.NO_FILTER 以指示不进行过滤。

关于组参数 

报告经常需要显示当前分组级别的总计。例如,假定一个报告按客户和订单进行分组,并且详细信息记录表示订单中的行项。每个行项都有单位价格和数量,如以下聚集函数所示:

Total.sum( row["price"] * row["quantity"] )

此聚集函数对当前组的金额进行求和。如果将此聚集放在订单组脚中,则它将显示该订单的行项之和。如果将其放在客户组脚中,它就会显示该客户的所有订单的所有行项之和。并且,如果将其放在报告组脚中,它就会显示所有客户的所有行项之和。

但是,应用程序有时需要访问另一分组级别的总计。例如,您可能想了解一个订单的总金额在该客户所有订单中所占的百分比。在这种情况下,必须访问除当前组以外的组的总计。可以使用分组参数来实现此目的:

Total.sum( row.CreditLimit, null, "Customer" );

组参数可以是下列其中一项:

Null,这表示当前分组级别。 

当前分组级别或更高分组级别的组的名称。此名称是报告设计中指定的名称。 

当前分组级别或更高分组级别的组的组键表达式。 

组级别的数字索引。0 表示整体总计,1 表示最高级别的组,依此类推。 

相对组索引:-1 表示比此组高一级的组,-2 表示比此组高两级的组,依此类推。 

特殊名称“Overall”,此名称引用数据集的整体总计。也可以使用静态属性 Total.OVERALL。 

下列示例演示了三类组参数:

Total.sum( row["myCol"] null, null ); // 当前组 

Total.sum( row["myCol"], null, "Customer" ); // 按名称 

Total.sum( row["myCol"], null, "row[`custID']" ); // 按组键 

Total.sum( row["myCol"], null, 1 ); // 按组索引 

Total.sum( row["myCol"], null, "Overall" ); // 整体总计 

Total.sum( row["myCol"], null, 0 ); // 整体总计

使用分组参数时,必须提供过滤器参数。如果不需要过滤器,请指定 null 作为过滤器值。不能将组索引括在引号中,它必须是数字。即,1 表示级别为 1 的组,而 "1" 表示名为 "1" 的组。

静态属性 

OVERALL

这是用于组参数的常量,它请求计算数据集的整体总计。 

函数 

ave( expr [, filter [, group ]] ) 

一组值的算术平均值。 

count( [ filter [, group ]] ) 

行数。 

countDistinct( expr [, filter [, group ]] ) 

相异值数。 

first( expr [, filter [, group ]] ) 

序列中的第一个值。 

isBottomN(expr, n, [, filter [, group ]] ) 

这个布尔值指示某个值是否是最小的 n 个值中的一个。 

isBottomNPercent( expr, percentage, [, filter [, group ]] ) 

这个布尔值指示某个值是否是占 n% 的最小值中的一个。 

isTopN(expr, n, [, filter [, group ]] ) 

这个布尔值指示某个值是否是最大 n 个中的一个。 

isTopNPercent( expr, percentage, [, filter [, group ]] ) 

这个布尔值指示某个值是否是占 n% 的最大值中的一个。 

last( expr [, filter [, group ]] ) 

序列中的最后一个值。 

max( expr [, filter [, group ]] ) 

数字、字符串或日期序列的最大值。 

median( expr [, filter [, group ]] ) 

数字序列的算术中值。 

min( expr [, filter [, group ]] ) 

数字、字符串或日期序列的最小值。 

mode( expr [, filter [, group ]] ) 

值序列的算术众数。 

movingAve( expr, window [, filter [, group ]] ) 

数字序列的移动平均值,用户可以在其中指定计算平均值时要考虑的值的数目。 

percentile( expr, percentage [, filter [, group ]] ) 

一组值的百分点值。 

percentileRank( expr [, filter [, group ]]) 

某个值在数据集中的百分比排名。 

percentSum( expr [, filter [, group ]]) 

在总计中所占的百分比。 

quartile( expr, quartile,[ filter [, group ]]) 

一组值的四分点值。 

rank( expr, ascending, [, filter [, group ]]) 

值的排名。 

runningCount( [, filter [, group ]] 

项数。 

runningSum( expr [, filter [, group ]] ) 

与 sum 类似,但提供报告中给定点的移动总计。 

stdDev( expr [, filter [, group ]] ) 

数字序列的算术标准方差。 

sum( expr [, filter [, group ]] ) 

数字序列的和。 

variance( expr [, filter [, group ]] ) 

数字序列的算术方差。 

weightedAve( expr, weight [, filter [, group ]] ) 

数字序列的加权平均值。 

Total.ave 

此聚集函数计算算术平均值。如果表达式求值为数字,则此函数返回那些数字的平均值。如果表达式求值为日期,则此函数返回平均日期。

语法 

Total.ave( expr [, filter [, group ]] )

参数 

expr 

要计算平均值的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字或日期。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的平均值。如果没有可用的行,则返回 null。

示例 

以下语句返回班级中学生的平均年龄:

Total.ave( row.Age )

要返回班级中学生的平均生日,请使用以下语句:

Total.ave( row.BirthDate )

Total.count 

此函数计算某个组中的行数。

语法 

Total.count( [ filter [, group ]] )

参数 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

给定组中的匹配行数。如果没有可用的行,则返回零。 

示例 

此示例计算班级中的男女生数。需要创建两个数据项。请将第一个数据项设置为:

Total.sum( row.sex == 'M' );

将第二个数据项设置为:

Total.sum( row.sex == 'F' );

Total.countDistinct 

此函数计算某个组或数据集中的相异值数。expr 参数提供用于对值进行分组的表达式。此表达式引用一个数据行列。空值计作一个相异值。

语法 

Total.countDistinct ( expr [, filter [, group ]] )

参数 

expr 

此表达式标识唯一的值。此表达式应该至少引用一个数据行列。数据类型可以是数字、字符串或日期。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

组或数据集中的相异值数。如果没有可用的行,则返回零。

示例 

假定我们要了解一组学生所代表的不同国家或地区的数目。我们可以定义一个使用以下表达式的数据项:

Total.countDistinct( row.Country )

在此语句中,row.Country 是一个列,它包含学生的祖国的名称或代码。假定某些行包含空值(这表示我们不知道该学生的祖国)。使用以下语句来指定不对这些行进行计数:

Total.countDistinct( row.Country, row.Country != null )

Total.first 

此聚集函数返回数据集中的第一个值。这就是使用为表或列表定义的排序顺序来访存行时在数据集中访存的第一个值。

语法 

Total.first( expr [, filter [, group ]] )

参数 

expr 

要进行求值的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字、日期或字符串。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回行序列中的第一个值,或者如果数据集未包含任何行,则返回 null。

示例 

假定一个报告列示了给定的一支股票在一段时间内的交易情况。以下语句将显示该股票的最早一次买入交易:

Total.first( row.TransDate, row.Action == 'Buy' );

Total.isBottomN 

此函数返回一个布尔值,它指示所指定数字字段的值是否是最小的 n 个值中的一个。

语法 

Total.isBottomN( expr, n, [, filter [, group ]] )

参数 

expr 

要进行求值的表达式。此表达式应该至少引用一个数据行列。数据类型只能是数字。 

要测试的值的数目。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回 true 或 false。如果该数字字段的值是此列所有值中最小的 n 个值中的一个,则此函数返回 true。

示例 

假定某个报告列有 5 行,它们分别包含值 1、2、3、4 和 5。Total.isBottomN(expr, 2) 将测试由 expr 表示的字段是否包含 1 或 2,即此列中最小的两个数字。

Total.isBottomNPercent 

此函数返回一个布尔值,它指示所指定数字字段的值是否是该列所有值中占 n% 的最小值中的一个。

语法 

Total.isBottomNPercent( expr, n, [, filter [, group ]] )

参数 

expr 

要进行求值的表达式。此表达式应该至少引用一个数据行列。数据类型只能是数字。 

要测试的值的百分比。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回 true 或 false。如果该字段的值是此列所有值中占 n% 的最小值中的一个,则此函数返回 true。

示例 

假定某个报告列有 5 行,它们分别包含值 1、2、3、4 和 5。Total.isBottomNPercent(expr, 60) 将测试由 expr 表示的字段是否包含 1、2 或 3,即此列中占 60% 的最小数字。

Total.isTopN 

此函数返回一个布尔值,它指示所指定数字字段的值是否是最大的 n 个值中的一个。

语法 

Total.isTopN( expr, n, [, filter [, group ]] )

参数 

expr 

要进行求值的表达式。此表达式应该至少引用一个数据行列。数据类型只能是数字。 

要测试的值的数目。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回 true 或 false。如果该数字字段的值是此列所有值中最大的 n 个值中的一个,则此函数返回 true。

示例 

假定某个报告列有 5 行,它们分别包含值 1、2、3、4 和 5。Total.isTopN(expr, 2) 将测试由 expr 表示的字段是否包含 4 或 5,即此列中最大的两个数字。

Total.isTopNPercent 

此函数返回一个布尔值,它指示所指定数字字段的值是否是该列所有值中占 n% 的最大值中的一个。

语法 

Total.isTopNPercent( expr, n, [, filter [, group ]] )

参数 

expr 

要进行求值的表达式。此表达式应该至少引用一个数据行列。数据类型只能是数字。 

要测试的值的百分比。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回 true 或 false。如果该字段的值是此列所有值中占 n% 的最大值中的一个,则此函数返回 true。

示例 

假定某个报告列有 5 行,它们分别包含值 1、2、3、4 和 5。Total.isTopNPercent(expr, 60) 将测试由 expr 表示的字段是否包含 3、4 或 5,即此列中占 60% 的最大数字。

Total.last 

此函数返回数据集中的最后一个值。这就是使用为表或列表定义的排序顺序来访存行时在数据集中访存的最后一个值。

语法 

Total.last( expr [, filter [, group ]] )

参数 

expr 

要进行求值的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字、日期或字符串。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回行序列中的最后一个值,如果数据集未包含任何行,则返回 null。

示例 

假定一个报告列示了给定的一支股票在一段时间内的交易情况。以下语句将显示该股票的最近一次卖出交易:

Total.last( row.TransDate, row.Action == 'Sell' );

Total.max 

此函数计算给定表达式的最大值。将针对每一行来对此表达式进行求值,然后返回最大值。此函数可用于处理数字、日期或字符串。

语法 

Total.max( expr [, filter [, group ]] )

参数 

expr 

要计算最大值的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字、字符串或日期。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的最大值。如果没有可用的行,它将返回 null。

示例 

以下语句查找班级中年龄最大的学生:

Total.max( row.Age )

Total.median 

此聚集函数计算算术中值。一半的值大于中值,另一半的值小于中值。

语法 

Total.median( expr [, filter [, group ]] )

参数 

expr 

要计算平均值的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字或日期。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的中值。如果没有可用的行,则返回 null。

示例 

以下语句返回班级中学生的年龄中值:

Total.median( row.Age )

并且,要返回班级中学生的生日中值,请使用以下语句:

Total.median( row.BirthDate )

Total.min 

此聚集函数计算给定表达式的最小值。将针对每一行来对此表达式进行求值,然后返回最小值。此函数可用于处理任何简单类型:数字、日期或字符串。

语法 

Total.min( expr [, filter [, group ]] )

参数 

expr 

要计算最小值的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字、字符串或日期。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的最小值。如果没有可用的行,则返回 null。

示例 

以下语句返回班级中年龄最小的学生的年龄:

Total.min( row.Age )

Total.mode 

此聚集函数计算算术众数值。众数是数据中最频繁出现的值。例如,在序列 {1, 2, 3, 2, 4, 7} 中,由于 2 出现了两次,而其他数字只出现一次,所以众数为 2。如果数据集有多个众数,例如序列 {1,2,3,2,3} 的情况,mode 聚集函数将返回 null。

语法 

Total.mode( expr [, filter [, group ]] )

参数 

expr 

要查找众数的表达式。此表达式应该至少引用一个数据行列。数据类型可以是数字、日期或字符串。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的众数值。如果没有可用的行,或者如果数据包含多个众数,则返回 null。

示例 

以下语句返回班级中学生的最普遍年龄:

Total.mode( row.Age )

Total.movingAve 

此聚集函数计算移动平均值。expr 参数指定要计算平均值的值,window 参数指定要考虑的行数。将按照上下文确定的顺序对各行计算平均值,此顺序通常由列表或表元素的排序顺序指定。

语法 

Total.movingAve( expr, window [, filter [, group ]] )

参数 

expr 

要计算平均值的表达式。此表达式应该至少引用一个数据行列。结果必须是数字。 

window 

计算聚集时要考虑的行数。必须求值为数字。将在聚集启动时求值一次。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的移动平均值。如果没有可用的行,则返回 null。

示例 

假定一个报告列示某个股票的每日报价。要显示该股票在最近 5 天的移动平均价,请使用以下语句:

Total.movingAve( row.price, 5 );

Total.percentile 

此函数对一组值进行检查,并返回所有那些值中在所指定百分点处的值。例如,在一次测验后,您可能想了解所有分数的第 90 个百分点处的分数。

语法 

percentile(expr, percentage [, filter [, group ]] ) 

参数 

expr 

此表达式应该指定要分析的值所在的数据行列。 

percentage 

0 与 1 之间的百分比值。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回所分析的一组值中指定百分点处的值。

示例 

以下语句返回第 50 个百分点处的分数值:

Total.percentile( row.TestScore, 0.5)

如果所指定列中的一组测验分数是 10、20、30、40 和 50,则此语句将返回 30。

Total.percentRank 

此函数计算某个值在所指定字段中的百分比排名。

语法 

percentRank( expr, filter [, group ]] )

参数 

expr 

此表达式应该至少引用一个数据行列。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回某个值在所指定字段中的百分比排名。返回值的范围是 0 到 1。

示例 

以下语句返回一个分数在某个列中所有分数之间的百分比排名:

Total.percentRank( row.Scores )

如果求值范围中的分数是 10、10、20 和 50,并且包含此语句的单元格中的分数是 30,则返回值是 .5,这是因为半数的值大于 20,另一半的值小于 20。

Total.percentSum 

此函数计算此值在范围内所有值之和中所占的百分比。

语法 

percentSum( expr [, filter [, group ]] )

参数 

expr 

此表达式应该至少引用一个数据行列。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回此值在范围内所有值之和中所占的百分比。

示例 

以下语句返回此订单金额在所有订单金额之和中所占的百分比:

Total.percentSum( row.OrderAmt )

Total.quartile 

此函数计算所定义的一组值中的一个值,对于该值,该组中有 0%、25%、50%、75% 或 100% 的值大于该值。

语法 

quartile( expr, quartile, [, filter [, group ]] )

参数 

expr 

此表达式描述一组要进行求值的值。它应该至少引用一个数据行列。 

quartile 

要返回的值的四分点。quartile 参数可以是 0、1、2、3 或 4,它们分别表示该组中的最小值、第一个四分点、第二个四分点、第三个四分点和最大值。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回所指定组中位于所指定四分点位置处的值。

示例 

以下语句返回一个订单金额,75% 的订单金额小于该金额,25% 的订单金额大于该金额。

Total.quartile( row.OrderAmt, 3)

Total.rank 

此函数计算某个值在一组值中的排名。排名值的范围是 1 到该组中的值数目。如果两个值相等,则它们具有相同的排名。

语法 

rank( expr [, filter [, group ]] )

参数 

expr 

此表达式标识一组要进行求值的数字。此表达式应该至少引用一个数据行列。这一组值可以是数字值、字符串值或日期值。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回一个整数来反映值的排名,其范围是 1 到该组值中的项数。

示例 

以下语句返回 OrderAmt 字段在 OrderAmt 列中所有订单金额中的排名。

Total.rank( row.OrderAmt )

Total.runningCount 

此函数计算动态行数。

语法 

runningCount( filter [, group ]] )

参数 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回动态行数。

示例 

以下语句返回报告的动态行数:

Total.runningCount( )

Total.stdDev 

此聚集函数计算数字序列的统计标准方差。标准方差是对一组值的分布情况的度量。

语法 

Total.stdDev( expr [, filter [, group ]] )

参数 

expr 

要分析的表达式。此表达式应该至少引用一个数据行列。结果必须是数字。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的标准方差。如果没有可用的行,则返回 null。

Total.sum 

此聚集函数计算一个组中每一行的值的累加和。每一行的值都是使用 expr 参数中给定的表达式计算而得的。累加和是通过将所有这些值累加到一起获得的。

语法 

Total.sum( expr [, filter [, group ]] )

参数 

expr 

要进行求和的表达式。此表达式应该至少引用一个数据行列。结果必须是数字。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

给定表达式之和。如果没有可用的行,则返回零。

示例 

以下语句计算某个客户的订单金额总计:

Total.sum( row.OrderAmt )

Total.variance 

此聚集函数计算数字序列的统计方差。方差是对一组值的分布情况的度量。

语法 

Total.variance( expr [, filter [, group ]] )

参数 

expr 

要分析的表达式。此表达式应该至少引用一个数据行列。结果必须是数字。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的方差。如果没有可用的行,则返回 null。

Total.weightedAve 

此聚集函数计算算术加权平均值。如果 expr 或 weight 参数求值为 null,则不对该行计算平均值。

语法 

Total.weightedAve( expr, weight [, filter [, group ]] )

参数 

expr 

要计算平均值的表达式。此表达式应该至少引用一个数据行列。结果必须是数字。 

weight 

此表达式指定每一行的权重。结果必须是数字。 

filter 

可选的过滤条件。 

group 

可选的组标识。 

返回 

此函数返回给定表达式的加权平均值。如果没有可用的行,则返回 null。

示例 

假定一个金融应用程序要对不同时间分批买入的给定股票进行跟踪。每个批次都有不同的买入价,并且许多股数都是按该价位买入的。以下语句计算加权平均买入价:

Total.weightedAve( row.purchasePrice, row.shareCount )

更多的BIRT javascript使用说明,请参考eclipse-birt的帮助内容文档中的BIRT Report Developer Guide-Scripting Reference

第10一章 BIRT数据绑定与脚本,事件机制详解(续)

最后,表达式生成器还能使用外部javascript脚本。具体的用法参看

6.7 外部脚本的使用,样式,模板,库,与资源

热点排行