`
protobe
  • 浏览: 4431 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
阅读更多

原文:http://eclipse.org/birt/phoenix/deploy/reportScripting.php 

BIRT提供了一个基于Mozilla Rhino的脚本模型。报表引擎创建报表的过程可以划分为两个阶段——生成和呈现。生成阶段利用报表设计,生成一个名为报表文档的中间文件。呈现阶段利用报表文档进行渲染,生成HTMLPDF。报表生产线既可以将两个阶段作为一个任务执行,也可以作为两个任务分别执行。如果作为一个任务,那么报表文档是生成在内存中。在设计器中选择『以HTML方式预览』时,默认是采用这种方式的。反之,如果作为两个任务分别执行,那么报表文档将被保存在磁盘中。在设计器中选择『在浏览器中预览』时,默认是采用这种方式的。

 

每一个阶段的事件都通过事件处理器覆盖,用以修改报表内容。既可以用JavaScript,也可以用Java

 

 

事件

 

三大对象——报表对象、报表元素和数据源()——具有脚本事件。当前所处的阶段决定了可以定制的事件类型和对象属性。

 

 

下图描绘了包含一个表和一个数据元素的简单报表的事件触发顺序:

 

 

reportContextthis

 

在使用Script编辑器时,如果选择Pallette View,那么会显示选定的报表元素、指定事件中能够使用的函数和变量。例如,下图指出了某个数据元素的onCreate事件能够使用的函数和变量:

 

 

this可用于在事件中列出元素的所有方法和属性。

 

reportContext则可以用于访问和修改报表一级的属性。开发人员可用它来设置全局变量。例如:

 

报表的onInitialize事件

 

reportContext.setPersistentGlobalVariable("testglobal", "test global string");

 

Persistent版本的方法能让变量跨持久化。变量是Object类型的,具有高度的灵活性。

 

某个表中一个标签的onPrepare事件

 

this.text = reportContext.getPersistentGlobalVariable('testglobal');

 

全局变量可以通过绑定编辑器赋给数据元素。只需在给定列的表达式构建器中引用该变量即可。例如,如果绑定编辑器中有一列,其值从数据库取回。那么可以通过以下的表达式,在原值后附加上某个全局变量的值:

 

dataSetRow["MyString"] + "-" + reportContext.getPersistentGlobalVariable('testglobal');

 

reportContext也可用于访问会话级变量。

 

// attributeBeanBirt Viewer提供的一个会话级变量

myAttributeBean = reportContext.getHttpServletRequest.getAttribute('attributeBean');

reportDoc = myAttributeBean.getReportDocumentName();

this.text = reportDoc;

 

reportContext允许访问和修改脚本内使用的上下文。例如:

 

报表的onInitialize事件

 

appContext = reportContext.getAppContext();

importPackage(Packages.java.util)

myArrList = new ArrayList();

myArrList.add("one");

myArrList.add("two");

appContext.put("AppContextTest", myArrList);

 

这段代码读取了当前的应用上下文,并进行了一些修改。然后,可以在某个标签元素的onPrepare事件处理器中,这样使用:

 

appContext = reportContext.getAppContext();

myObject = appContext.get("AppContextTest");

this.text = myObject.size();

 

上例也可以这样实现:

 

reportContext.setPersistentGlobalVariable("testglobal", myArrList);

 

reportContext还可用于获取当前的区域信息,以及存储于资源文件中的消息。

 

报表级事件

 

afterFactory

结束生成阶段时执行

afterRender

结束呈现阶段时执行

beforeFactory

开始生成阶段前执行

beforeRender

开始呈现阶段前执行

initialize

开始生成阶段和呈现阶段前执行

 

initialize事件中,可以定义全局函数、变量和对象。例如,创建一个全局的函数:

 

function gTest(v){

return "Global Function:" + v;

}

// 仅在图表脚本中使用时需要

reportContext.setPersistentGlobalVariable("gTest", gTest);

 

只需这样调用:

 

gTest("MyTest");

 

或:

 

gTest = reportContext.getPersistentGlobalVariable("gTest");

val = gTest("Use Persistent");

 

在图表脚本中访问reportContext时,使用:

 

context.getExternalContext().getScriptable()

 

如,图表标题可以这样修改:

 

function beforeGeneration(chart, context){

importPackage(Packages.org.eclipse.birt.chart.model.type.impl);

newChartTitle = context.getExternalContext().getScriptable().getPersistentGlobalVariable("testglobal");

chart.getTitle().getLabel().getCaption().setValue(newChartTitle);

}

 

beforeFactory中,有几个方法可以用于访问报表中的元素。需要对元素命名。例如,想要在动态文本元素"TestHeader"中显示数据集"orders"的查询语句,可以在beforeFactory中这样写:

 

query = this.getDataSet("orders").queryText

this.getDynamicText("TestHeader").valueExpr = "query;";

 

报表元素级事件

 

onPrepare

生成阶段中,为每个报表元素调用一次。可用于修改设计。变更影响元素的所有实例,例如,所有的表行。

onCreate

生成阶段中调用。可访问和修改元素的某个实例(如,每隔9行设置1行背景为红色)

onRender

呈现阶段中调用。类似于onCreate。不可访问数据。

 

一个非常简单的例子——某表中的明细行:

 

onPrepare:

 

this.getStyle().backgroundColor = "red"; // 影响所有行

 

onCreate:

 

if (this.getRowData().getExpressionValue(3) > 100)

this.getStyle().backgroundColor = "red"; // 只影响该行

 

如果该表中有100行,则onPrepare只调用1次,而onCreateonRender将调用100次。

 

元素级事件实例

 

设置标签、文本、动态文本和数据元素的值

 

标签:onPrepare/onCreate

 

this.text = "My New Label"

 

文本:

 

this.context = "My New Text"

 

动态文本:

 

this.valueExpr = "row['CITY']";

this.valueExpr = "'my row count: ' + (row[0] + 1)";

 

数据元素:

 

使用绑定编辑器。

 

设置TOC

 

类似于值表达式,期待字符串:

 

this.tocExpression = "'tocbyrownumber: ' + row[0]";

 

使用行数据

 

onCreate中可使用行数据,可用于对值进行检查。

 

this.getRowData().getExpressionValue(i) // i列的值

this.getRowData().getExpressionValue("some_expression") // 对该行套用表达式的值

 

例如:

 

if (this.getRowData().getExpressionValue(1) == "product1")

this.getStyle().backgroundColor = "red";

 

if (this.getRowData().getExpressionValue("row[price]" == "$30")

this.getStyle().backgroundColor = "blud";

 

修改超链接

 

可在onPrepare中修改:

 

this.getAction().URI = "'http://www.google.com'";

 

getStyle

 

用于定制给定元素的属性。例如:

 

this.getStyle().fontWeight = "bold";

 

getParent

 

用于访问父元素。例如,从数据元素获取表:

 

this.getParent().getParent().getParent();

 

getValue

 

满足一些基于值变更视觉外观的需求。

 

if (this.getValue() > 30){

this.getStyle().fontFamily = "Arial"

this.getStyle().backgroundColor = "Yellow"

}

 

命名表达式

 

是指在某个元素上创建,并给予命名的表达式。其定义可在onPrepare中修改,其值可在onCreateonRender中访问。例如,定义一个表达式totalCreditValue,其值为Total.sum(row[?CREDITLIMIT?])。然后,就可在其他元素中用JavaScriptJava访问。

 

例如,在某个表上建一个表达式"RWC",值为row[0],则可在行中用以下方式访问:

 

rc = this.parent.getNamedExpressionValue("RWC");


 

分享到:
评论

相关推荐

    thunderbird:用于在企业环境中分发的 Thunderbird 脚本和自定义

    2. **Thunderbird脚本**: - 自动化任务:通过编写脚本实现定时任务,如自动备份邮件、定期发送报告等。 - 用户配置:批量设置用户界面、快捷键、首选项,以符合企业标准。 - 数据迁移:脚本可以帮助快速迁移大量...

    FlappyBird游戏源码

    2. 脚本系统:Unity使用C#进行游戏逻辑编写,FlappyBird的Unity版本中,Bird的运动、碰撞检测、游戏逻辑等都是通过C#脚本来实现的。 3. 物理引擎:Unity内置的物理引擎处理Bird的飞行和碰撞。Bird的跳跃通过添加...

    Flappy bird资源.zip

    Flappy Bird的资源包括图像素材、音频文件和可能的游戏逻辑脚本。在"Flappy bird资源.zip"压缩包中,我们可以找到这些关键元素,例如背景图片、小鸟动画序列、管道图形、碰撞检测所需的物理形状等。 Unity引擎支持...

    unity3d做的flappyBird

    1. **Bird脚本**:控制鸟的飞行,包括点击屏幕时的上升力和重力下落。 2. **Pipe脚本**:管理管道的生成、移动和销毁,实现无尽的关卡。 3. **Score脚本**:记录并显示玩家得分。 4. **GameManager脚本**:控制游戏...

    flappy bird源码加素材

    1. 游戏逻辑:Flappy Bird的核心在于角色的飞行控制和管道的生成与移动。源码中会包含角色跳跃的物理模拟,以及通过调整角色的向上速度来实现“飞行”。同时,管道的随机生成和碰撞检测也是游戏的关键部分,这些功能...

    flappy_bird源码

    总的来说,通过学习和分析Flappy Bird的源码,我们可以掌握Unity游戏开发的基本流程,包括游戏对象的创建、脚本编程、物理引擎的运用、碰撞检测、动画控制以及资源管理。这不仅有助于我们理解游戏的工作原理,也有助...

    Unity3D flappy bird

    - 在Unity3D中,游戏逻辑通常由C#脚本控制。我们需要编写几个关键的脚本,如控制小鸟飞行的“BirdScript”,生成和移动管子的“PipesScript”,以及处理游戏状态和得分的“GameManagerScript”。 5. **场景构建与...

    unity3d制作的flybird

    "flybird"项目中,游戏场景包含玩家角色(鸟)、管道、地面等游戏对象,每个对象都有各自的脚本组件来控制它们的行为。 2. **物理引擎**:Unity3D内置了物理引擎,使得游戏中的物体可以模拟真实世界的物理规则,如...

    Flappy Bird 基于Unity

    Unity3D中的C#编程语言可以实现这一逻辑,通过创建脚本来控制小鸟的飞行和碰撞检测。 在Unity中创建项目时,我们首先需要设置场景。设定一个2D项目,并添加天空盒背景,然后导入必要的素材,包括小鸟、管道、地面等...

    Unity Flappybird

    总的来说,Unity Flappybird项目是一个很好的学习平台,可以帮助开发者掌握Unity的基本功能,包括2D游戏开发、物理系统、动画控制、输入管理、脚本编写和UI设计等多个方面。通过实践这个项目,你将能够提升自己的...

    c#版flappybird

    C#脚本可以控制Sprite的位置、大小和旋转。 8. **音频播放**:游戏中的音效增强用户体验。C#可以控制Audio Source组件播放和停止音频。 9. **游戏状态管理**:游戏有开始、游戏进行、游戏结束等状态,C#可以创建...

    FlappyBird 素材

    4. 游戏逻辑脚本:这部分可能包含示例代码,用于演示小鸟的移动逻辑、碰撞检测、得分计算等。对初学者来说,这是理解游戏核心逻辑的重要资源。 自学开发Flappy Bird,你需要掌握以下几个关键技术点: 1. **2D图形...

    flappybird

    通过分析这个Flappy Bird项目,我们不仅可以了解到Unity3D的基本使用,还能掌握游戏开发的关键技术,包括物理模拟、碰撞检测、动画系统、脚本编程和跨平台发布等。对于想要学习或提升Unity3D技能的开发者来说,这是...

    Thunderbird的一套主题

    4. **版本控制**:压缩包名为`thunderbird-monterail-master`,其中的`master`通常与Git版本控制系统相关,表示这是项目的主分支。这表明主题的开发可能是在Git上进行的,因此,版本控制的概念和命令也是开发者需要...

    FlappyBird

    总结,制作一款类似FlappyBird的游戏,需要掌握Unity的基本操作,理解2D物理引擎的运用,编写逻辑清晰的C#脚本,并且能够运用Unity的动画系统和用户交互机制。通过实践,开发者不仅可以提升技术能力,还能体验到游戏...

    Unity Flappy Bird

    你需要编写脚本来控制游戏逻辑,如鸟的飞行、碰撞检测、得分计算、游戏结束条件等。例如,你可以创建一个名为“BirdScript”的C#脚本,其中包含Update()函数,用于检查按键输入并调整飞行状态。 6. **碰撞检测**:...

    flappy bird-unity2018.4.36版本

    这些UI元素可以通过RectTransform组件进行布局,并通过脚本控制它们的行为。 7. **碰撞检测**:Unity的Collider组件用于实现游戏对象间的碰撞检测。在Flappy Bird中,小鸟与管道的碰撞检测是游戏失败的关键条件,...

    FlappyBird正点原子mini

    此项目展示了如何将流行的Flappy Bird游戏移植到微控制器上,使其能够在小型硬件平台上运行,无需复杂的图形处理单元或高性能处理器。下面我们将详细探讨其中涉及的关键知识点。 首先,"FlappyBird含图素资源,直接...

    cocos creator实例--实现FlappyBird游戏的基本功能 | 附代码FlappyBird.zip

    总结,通过Cocos Creator,开发者可以快速地构建出FlappyBird这样的游戏,利用其丰富的组件和便捷的脚本系统,实现游戏逻辑与交互。掌握这些基本知识,不仅能够帮助你制作FlappyBird,还能为其他2D游戏开发打下坚实...

    Flappy Bird(Unity工程文件+APk)

    开发者可以学习如何编写控制角色移动、碰撞检测、分数计算、游戏状态管理等脚本,理解游戏循环、对象生命周期和事件处理等概念。 5. **2D游戏开发**: Flappy Bird是一个2D游戏,Unity的2D工具集包括Sprite ...

Global site tag (gtag.js) - Google Analytics