BIRT Источник сценариев: неопределенная переменная - PullRequest
0 голосов
/ 03 мая 2018

Я сталкиваюсь с этой ошибкой при попытке создать отчет 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>

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Быстрое и грязное исправление - удаление ключевого слова open из переменных, которые вы хотите видеть в глобальной области видимости. В настоящее время они связаны с областью действия функции - open() - и, следовательно, не видны для другой функции, fetch(). Вот фрагмент кода для игры:

function open(){
  test = '42'
}

function fetch(){
  console.log(test)
}
open()
fetch()

Посмотреть на JSBin

Как уже отмечалось, это грязное исправление.

Вы можете объявить переменную без использования ключевого слова var и присвоить ей значение. Это известно как неявное объявление, и это не рекомендуется. Неявное объявление дает переменную глобальной области видимости. Однако когда вы объявляете переменную на уровне процедуры, вы обычно не хотите, чтобы она имела глобальную область видимости. Чтобы избежать предоставления глобальной области видимости переменной, вы должны использовать ключевое слово var в объявлении переменной.

Источник: https://docs.microsoft.com/en-us/scripting/javascript/reference/var-statement-javascript

Отсутствие вводной документации по теме действительно очень расстраивает.

0 голосов
/ 24 мая 2018

Вы пытаетесь использовать одну и ту же переменную в разных областях действия метода. У вас есть методы, определенные на этапах fetch, open и close. Все три используют переменную с именем count. Видимость этой переменной привязана к конкретной фазе. Вы не можете получить доступ к локальным переменным из fetch в open и т. Д. Поскольку вы используете count в fetch, где оно не было определено, возникает ошибка.

Для реализации вашего счетчика вы можете, например, определить глобальную переменную с reportContext.setGlobalVariable(key, value), как описано здесь: Eclipse Forums .

Более того, для вашего конкретного случая имейте в виду, что вам не нужно считать строки в BIRT:

  1. Для каждой привязки столбца доступна переменная с именем row.__rownum, которая предоставляет текущий индекс строки.
  2. Если вам просто нужно общее количество строк или записей, просто добавьте вычисляемый столбец с оператором count в ваш набор данных.

ура

...