【问题标题】:BIRT Scripted data source : undefined variableBIRT 脚本数据源:未定义的变量
【发布时间】:2018-05-03 10:07:04
【问题描述】:

我在尝试基于脚本数据源生成 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)

英文:未定义变量“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>

【问题讨论】:

    标签: dataset datasource birt


    【解决方案1】:

    您试图在不同的方法范围内使用相同的变量。您在fetch、open 和close 阶段定义了方法。这三个都使用一个名为count 的变量。该变量的可见性固定在特定阶段。您不能从fetch 中的open 等访问局部变量。当您在未定义的fetch 中使用count 时,会引发错误。

    例如,要实现您的计数器,您可以使用reportContext.setGlobalVariable(key, value) 定义一个全局变量,如下所述:Eclipse Forums。

    此外,对于您的特定情况,请记住,您不需要计算 BIRT 中的行数:

    1. 每个列绑定都有一个可用的变量row.__rownum,它提供当前行索引。
    2. 如果您只需要总行数或条目数,只需将带有 count 语句的计算列添加到数据集即可。

    干杯

    【讨论】:

      【解决方案2】:

      一个快速而肮脏的修复方法是从您希望在全局范围内看到的变量中删除 open var 关键字。目前它们被绑定到一个函数的范围 - open() - 因此对于不同的函数 fetch() 是不可见的。这是一个可以使用的代码 sn-p:

      function open(){
        test = '42'
      }
      
      function fetch(){
        console.log(test)
      }
      open()
      fetch()
      

      See it on JSBin

      如上所述,这是一个肮脏的修复。

      您可以在不使用 var 关键字的情况下声明变量并为其赋值。这称为隐式声明,不建议这样做。隐式声明为变量提供了全局范围。但是,当您在过程级别声明变量时,您通常不希望它具有全局范围。为避免给变量全局范围,您必须在变量声明中使用 var 关键字。

      来源:https://docs.microsoft.com/en-us/scripting/javascript/reference/var-statement-javascript

      缺乏关于该主题的介绍性文档确实令人沮丧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        相关资源
        最近更新 更多