BIRT 中定时刷新报表
HTML 中如果我们要定时刷新某一个部分, 可以使用DOM api window对象的settimeout方法, BIRT 中当然可以直接使用html 的script , 当然主要是看刷新之后报表还是跟原来一样,参数都正确处理了.
所以在报表中加入一个text 元素, 然后选html 类型, 在其onPrepare() 方法里面加上下列代码就可以在查看报表的时候按照执行的时间进行刷新或者你也可以手工点 “refresh” 按钮进行刷新
//Build a string that contains all the parameters and their values
var paramsString = “”;
var paramDefs = reportContext.getDesignHandle().getAllParameters();
for (i = 0; i < paramDefs.size(); i++ ) {
var paramDef = paramDefs.get(i);
if (paramDef.getClass().toString() == “class org.eclipse.birt.report.model.api.ScalarParameterHandle”) {
var paramVal = reportContext.getParameterValue(paramDef.getName())
if (paramVal == null || paramVal == “null”) {
paramVal = “”;
} else if (paramVal.length > 0) {
var paramValTmp = “”;
for (j = 0; j < paramVal.length; j++) {
if (paramVal[j] != null && paramVal[j] != “null”) {
if (j > 0)
paramValTmp += “|”;
paramValTmp += encodeURIComponent(paramVal[j]);
}
}
paramVal = paramValTmp;
} else {
paramVal = encodeURIComponent(paramVal);
}
paramsString += “&” + paramDef.getName() + “=” + paramVal;
}
}
this.content=”<form name=’input’ onSubmit=’return reloadPage();’>”
+”<input type=’submit’ value=’refresh report’ onclick=’reloadPage()’>refresh manual</input></form>”
+”<script type=text/javascript’>”
+”function reloadPage() {”
//alert( targetURL );
+” var targeturl = window.location+’”+paramsString+”‘;”
+” location.replace(targeturl);”
+” return false;”
+”}”
+”timer=setTimeout(‘reloadPage()’, 20000);”
+”</script>”
第一部分主要是取得当前报表的参数, 并把参数变成 ¶m1=value1 这种形式,因为这种形式的URL 可以被直接使用, 如果是一个参数可以接受多个值的话, 中间就是 | 来连接, 比如 1|2|3 , 最后拼接成一个总的paramsString .
第二部分主要是html 的部分, location.replace(url) ; 就是提交当前的url , 也就是刷新了.
然后使用DOM 的window.setTimeout() 方法, 其中间隔是20 秒, 不过其中也有个按钮可以手工刷新,调用的同样也是reloadPage() 这个html script .
附上报表: .reload_test
参考资料:
这个有个自动刷新的library , 不过代码只适合iportal .
http://www.w3school.com.cn/htmldom/dom_obj_location.asp
http://www.w3school.com.cn/js/jsref_encodeURIComponent.asp
w3school 的几个dom api . 中文的. 这个站点的资源一项不错,google 才知道搞了个中文站点.