我在尝试根据脚本数据源生成BIRT
报告时遇到此错误:
Caused by: org.mozilla.javascript.EcmaError: ReferenceError: "count" n'est pas défini (/report/data-sets/script-data-set[@id="248"]/method[@name="fetch"]#1)
英文:undefined变量" count"
我没有找到关于此案例的充分文档。
这些是Java类和报告模型。
感谢您的帮助。
AppDS(数据源类):
package projds;
import java.util.ArrayList;
import java.util.List;
public class AppDS {
public List<Entity> getEntities() {
List<Entity> t = new ArrayList<Entity>();
t.add(new Entity("A1"));
t.add(new Entity("A2"));
t.add(new Entity("A3"));
t.add(new Entity("A4"));
return t;
}
}
实体类:
package projds;
public class Entity {
String name;
public Entity() {
super();
}
public Entity(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
报告模型:
<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.23" id="1">
<property name="createdBy">Eclipse BIRT Designer Version 4.6.0.v201606072122</property>
<property name="units">in</property>
<property name="iconFile">/templates/first_report.gif</property>
<property name="bidiLayoutOrientation">ltr</property>
<property name="imageDPI">96</property>
<data-sources>
<script-data-source name="dsrc1" id="247"/>
</data-sources>
<data-sets>
<script-data-set name="dset1" id="248">
<list-property name="resultSetHints">
<structure>
<property name="position">0</property>
<property name="name">colName</property>
<property name="dataType">string</property>
</structure>
</list-property>
<list-property name="columnHints">
<structure>
<property name="columnName">colName</property>
<text-property name="displayName">The Name</text-property>
</structure>
</list-property>
<structure name="cachedMetaData">
<list-property name="resultSet">
<structure>
<property name="position">1</property>
<property name="name">colName</property>
<property name="dataType">string</property>
</structure>
</list-property>
</structure>
<property name="dataSource">dsrc1</property>
<method name="open"><![CDATA[importPackage(Packages.projds);
var dummyObject = new Object();
var gsh = new AppDS();
var data = gsh.getEntities();
var count = 0;]]></method>
<method name="fetch"><![CDATA[if(count < data.size()) {
row["colName"] = data.get(count).getName();
count++;
return true;
}
return false;]]></method>
<method name="close"><![CDATA[dummyObject = null;
gsh = null;
data = null;
var count = 0;]]></method>
</script-data-set>
</data-sets>
<styles>
<style name="report" id="110">
<property name="fontFamily">sans-serif</property>
<property name="fontSize">10pt</property>
</style>
</styles>
<page-setup>
<simple-master-page name="Simple MasterPage" id="2">
<page-footer>
<text id="3">
<property name="contentType">html</property>
<text-property name="content"><![CDATA[<value-of>new Date()</value-of>]]></text-property>
</text>
</page-footer>
</simple-master-page>
</page-setup>
<body>
<label id="245">
<property name="fontFamily">sans-serif</property>
<property name="fontSize">x-large</property>
<property name="fontWeight">bold</property>
<property name="textAlign">center</property>
<text-property name="text">Customer Listing</text-property>
</label>
<table id="325">
<property name="dataSet">dset1</property>
<list-property name="boundDataColumns">
<structure>
<property name="name">colName</property>
<text-property name="displayName">The Name</text-property>
<expression name="expression" type="javascript">dataSetRow["colName"]</expression>
<property name="dataType">string</property>
</structure>
</list-property>
<column id="334"/>
<header>
<row id="326">
<cell id="327">
<label id="328">
<text-property name="text">The Name</text-property>
</label>
</cell>
</row>
</header>
<detail>
<row id="329">
<cell id="330">
<data id="331">
<property name="resultSetColumn">colName</property>
</data>
</cell>
</row>
</detail>
<footer>
<row id="332">
<cell id="333"/>
</row>
</footer>
</table>
</body>
<property name="pageVariables">
<variable-element name="data">
<property name="type">report</property>
</variable-element>
</property>
</report>
答案 0 :(得分:0)
您正尝试在不同的方法范围中使用相同的变量。您在fetch
,open
和close
阶段定义了方法。这三个都使用了一个名为count
的变量。该变量的可见性固定在特定阶段。您无法从fetch
中的open
访问本地变量等。正如您在count
中使用fetch
时未定义的那样,错误加剧。
要实现您的计数器,您可以使用reportContext.setGlobalVariable(key, value)
定义一个全局变量,如下所述:Eclipse Forums。
此外,对于您的特定情况,请记住,您不需要计算BIRT中的行数:
row.__rownum
的变量,它提供当前行索引。 count
语句的计算列添加到数据集中。欢呼声
答案 1 :(得分:0)
一个快速而肮脏的修复方法是从要在全局范围内看到的变量中打开var关键字。当前,它们受功能范围open()
的约束,因此对于其他功能fetch()
不可见。这是一个可使用的代码段:
function open(){
test = '42'
}
function fetch(){
console.log(test)
}
open()
fetch()
如前所述,这是一个肮脏的修补程序。
您可以在不使用var关键字的情况下声明变量,并为其分配值。这称为隐式声明,不建议使用。隐式声明给出了变量的全局范围。但是,在过程级声明变量时,通常不希望它具有全局作用域。为避免赋予变量全局范围,必须在变量声明中使用var关键字。
来源:https://docs.microsoft.com/en-us/scripting/javascript/reference/var-statement-javascript
关于该主题的介绍性文档的缺乏确实令人沮丧。