BIRT中的全局函数和全局变量,并从元素的onRender访问它

时间:2015-10-10 21:01:13

标签: javascript java birt crosstab onrender

我正在研究BIRT交叉表报告。在我的报告中,我需要创建一个全局数组变量,并需要根据交叉表的列数填充数组变量。我正在计算交叉表的onRender事件中的columnCount,并且我需要将此值传递给全局函数,并且从全局函数的结果需要填充全局变量。然后在其他一些交叉表或相同的交叉表中我需要访问这个数组变量。

根据交叉表中数据元素的onRender生成的列数,我只生成列名A,B,C ...... Z,AA,AB等,我需要填充数组变量将此计数传递给全局函数,然后函数返回它作为参数接收的数字的excel名称(如1-A,2-B,3-C,...... 26-Z,27-AA ...等)这个结果被添加到数组变量。这个数组变量将用于数据元素onRender的交叉表的另一行,我不能用数据集做这个因为在交叉表中应用了一个排序函数(以克服交叉表的默认排序) )。

我如何实现这一目标,或者另一种简单的方法来处理这个问题?

1 个答案:

答案 0 :(得分:0)

我明白了。一个小小的粗心错误花了4天......我解决了它如下。

在Report initialize event中初始化全局变量和函数。从交叉表数据元素的onRender事件中调用此函数并传递计数器值,该函数获取此计数器值并找到其等效的excelcolumn名称并插入到global变量

columnCount = 1;
counter = 1;
names=new Array();
names.push('');     /* for 0th position */    
function toName(number)
{
    name = "";
    while(number>0)
    {
        modulo = (number-1)%26;
        name = String.fromCharCode(65 + modulo).toString()+name;
        number = parseInt((number-modulo)/26);  
    }
    names.push(name);
}

上述代码在report initialize event中声明。

然后在数据元素中将计数器值传递给函数,如下所示。然后递增计数器。

toName(columnCount);
columnCount++;

然后在我需要excel列名来设置excel公式的数据元素中,此元素的onRender方法获取计数器索引的数组值。

if(counter==columnCount)
{
    counter=1;
}   
this.setDisplayValue(names[counter]);
counter++;

这是通过onRender事件导出到excel时数据元素的更改方式。