2012-08-28 24 views
2

我在通過網絡運行birt報告時遇到問題。該報告在html中運行時的行爲與預期相同,但某些腳本無法通過Web查看器正常工作。我有這個腳本在報告的「初始化」階段運行(我知道,很多線路都沒有neccessary,只是想確定我擺脫了任何可能的腳本語法錯誤):Birt腳本通過Web查看器的行爲不同

var inc_number; 
var inc_number_old; 
var contador; 
var grupo; 
var proveedor; 
var contador_no_encaminadas; 
var contador_encaminadas; 
var contador_cerradas; 
var estado; 
var cliente_nombre; 
var cliente_apellido; 
contador = 0; 
contador_no_encaminadas = 0; 
contador_encaminadas = 0; 
contador_cerradas = 0; 
inc_number_old = 0; 

然後我得到了在錶行中運行的另一個小腳本,用的OnRender觸發:

inc_number = row["Incident Number"]; 
grupo = row["Assigned Group"]; 
proveedor = row["Vendor Name"]; 
estado = row["Status"]; 
cliente_nombre = row["First Name"]; 
cliente_apellido = row["Last Name"]; 

if (inc_number != inc_number_old){ 

    contador++; 

    if (proveedor != null && grupo != "SIGMA") 
     contador_encaminadas++; 

    if ((proveedor == null || proveedor == "") && (grupo == "SIGMA") && (estado != "Resolved" && estado != "Closed")) 
     contador_no_encaminadas++; 

    if (estado == "Resolved" || estado == "Closed") 
     contador_cerradas++; 
} 

inc_number_old = inc_number; 

vars["contador_cerradas"] = contador_cerradas; 
vars["contador_incidencias"] = contador; 
vars["contador_no_encaminadas"] = contador_no_encaminadas; 
vars["contador_encaminadas"] = contador_encaminadas; 

正如你可能已經注意到了,這一切只是爲了顯示不同的組數的。我在調用這個變量的表中設置了一些數據字段(前面​​的代碼塊的最後四行),因此報告顯示了這一點。那麼,所有這些在通過工作區中的預覽選項卡運行時,或者在「運行」菜單中點擊html選項時都是完美的,但是當我嘗試通過Web查看器運行它時,所有計數都顯示0(可能是默認值變量的值)。如果有人能給我一些幫助,我會非常感激。不知何故,我已經有一些其他腳本在單元上運行,onRender也是如此,無論我選擇何種預覽選項,它都可以正常工作。

p.s.我正在使用Birt v2.5.1,我知道這有點舊,但它是唯一支持與BMC Remedy ARS集成的版本,這就是我需要的版本。謝謝!!

回答

3

BIRT對於「直接」輸出具有不同的腳本流程,對Web Viewer有不同的腳本流程。有兩個報告創建階段:「生成」和「演示文稿」,請參閱BIRT events flow diagrams。在「直接」生成中,onCreateonRender事件通過生成階段(onCreate row 1; onRender row 1; onCreate row 2; onRender row 2等)混合在一起並觸發。畢竟,initialize腳本會執行一次。

相反,Web查看器具有拆分生成和呈現階段:首先執行所有onCreate,然後報告幾乎關閉(認爲「所有腳本數據丟失」),然後執行所有onRenderinitialize執行兩次,第一次在生成階段(onCreate)之前,第二次在呈現階段(onRender)之前。 onRender可能無法訪問row['...']變量,但可以訪問它的報告元素屬性,如this.foo

onCreate而不是onRender腳本中處理所有數據是很好的做法,因爲腳本變量保持在一個一致的階段。演示文稿,對於某些頁面可能被忽略(我不確定),所以你可能在Web查看器中跳轉頁面時出現錯誤結果。

如果你要通過產生和呈現階段之間的一些數據,你必須將其存儲在持久全局變量

setPersistentGlobalVariable("name", value); //in generation phase 
... 
var value = getPersistentGlobalVariable("name"); //in presentation phase 

沒有必要來定義報表設計變量,只要使用以上功能。使用持久性全局變量時可能會遇到一個小陷阱 - 它們必須在Java中可序列化(對於某些Java數據類型,這不是明顯的特徵)。

+0

感謝@jinowolski幫助了很多! – Juanma