2014-08-28 63 views
0

我有一個Maximo的BIRT報告和兩個腳本數據集。採購申請的主要數據集和採購申請行的子數據集。問題是子數據集適用於單個購買請求,併爲任何給定PR打印正確的數據,但如果您爲多個PR運行報表,則會爲每個PR打印第一個PR的pr行。BIRT數據集爲每個項目打印相同的數據

所以我得到的是這樣的。

PR 10

行1

行2

PR 20

行1

2行

當PR 20應該有10條線,它僅給了我兩個,這兩個和PR 10一樣。我設定了該報告通過填充名爲mySQL的全局變量並將其打印在報告上來打印出由數據集創建的SQL。 SQL看起來很好,我可以將它剪切並粘貼到我的SQL編輯器中並獲得正確的結果,但這不是報表上打印的內容。我檢查過表綁定,我試圖清空腳本中的數據集並強制重新填充,但沒有任何效果。我已經創建了一個新的數據集,但是新的數據集完成了同樣的事情。

有沒有人遇到過這個?任何想法都可以檢查什麼?或者我該如何清理每個PR的數據集,以便PRLINE數據集對每個PR都是乾淨的?

這是數據集的開放腳本。

lineDataSet = MXReportDataSetProvider.create(this.getDataSource().getName(),   this.getName()); 
lineDataSet.open(); 

var sqlText = new String(); 

// Add query to sqlText variable. 
sqlText = "select orderqty, orderunit, itemnum, description, unitcost, linecost, prnum, prlinenum, refwo, assetnum, location, project,tasknum, siteid from maximo.prline_vw " 
+ " where prnum = '" + rows[0]["prnum"].replace(/'/g,"''") + "'" 
+ " and siteid = '" + rows[0]["siteid"] + "'" 
//+ " where prnum = '" + row._outer["prnum"] + "'" 
//+ " and siteid = '" + row._outer["siteid"] + "'" 
// Include the Maximo where clause 
//+ " and " + params["where"] 
; 

lineDataSet.setQuery(sqlText); 

mySQL = sqlText; 

這就是抓取腳本。

if (!lineDataSet.fetch()) 
return (false); 

// Add a line for each output column 
// The specific get method should match the data type of the output column. 
row["prlinenum"] = lineDataSet.getString("prlinenum"); 
row["orderqty"] = lineDataSet.getFloat("orderqty"); 
row["orderunit"] = lineDataSet.getString("orderunit"); 
row["unitcost"] = lineDataSet.getFloat("unitcost"); 
row["linecost"] = lineDataSet.getFloat("linecost"); 
row["prnum"] = lineDataSet.getString("prnum"); 
row["itemnum"] = lineDataSet.getString("itemnum"); 
row["refwo"] = lineDataSet.getString("refwo"); 
row["siteid"] = lineDataSet.getString("siteid"); 
row["description"] = lineDataSet.getString("description"); 
row["project"] = lineDataSet.getString("project"); 
row["tasknum"] = lineDataSet.getString("tasknum"); 
row["assetnum"] = lineDataSet.getString("assetnum"); 
row["location"] = lineDataSet.getString("location"); 


return (true); 
+0

您是否嘗試通過屬性 - >數據集 - >高級 - >需要數據引擎緩存= false來禁用數據集緩存? – SiMemon 2014-09-02 05:49:47

+0

我無法找到屬性SiMemon。我在BIRT 3.7.1上我的版本上有這個屬性嗎? – user3393181 2014-09-03 13:25:59

+0

你是對的,它在BIRT 3.7.1中不可用。你爲什麼不升級到更新的版本? – SiMemon 2014-09-04 05:28:30

回答

0

,而不必閱讀細節:

一個常見的原因是你的腳本化數據集使用的變量。 也就是說,結果取決於變量的值,但BIRT不知道這一點。 BIRTs數據集結果緩存取決於DS參數。 如果將全局變量作爲DS參數添加到DS,則緩存機制知道結果取決於它,並且您已完成。 如果不是,BIRT認爲結果總是相同的。

+0

嗨hvb,你能更具體的smidge?您是否在說我需要將數據集的變量添加爲全局變量?如果是這樣,我是否需要在報告初始化時將該變量聲明爲全局變量?或者我需要移動整個行toolDataSet = MXReportDataSetProvider.create(this.getDataSource()。getName(),this.getName());進入報告初始化?腳本數據集使用的唯一變量是行[0] [「wonum」]在報告上打印出來的罰款?儘管它顯然不在數據集中工作。 – user3393181 2014-09-03 13:22:27

+0

您的詳細信息DataSet(對於PR行)取決於主數據集的當前行(對於PR)。更確切地說,在Java對象「lineDataSet」上。因此,您必須禁用緩存或爲詳細信息DS創建DS參數「ds」,在具有this.getInputParameterValue(「ds」)的詳細DS事件中使用* that *並將其綁定到佈局中的lineDataSet對象。 – hvb 2014-09-04 18:01:24

+0

你在我頭上hvb。 :)我找不到在BIRT 3.7.1中禁用緩存的方法,至於其他方面。我不知道DS參數是什麼?這與常規報告參數不同嗎?並且,當你說將它綁定到佈局中的lineDataSet對象時,你是說只是有一個隱藏的字段,將「ds」設置爲工作訂單號(或任何我正在鍵入的)? – user3393181 2014-09-05 13:46:41

0

這似乎只發生在我查看Eclipse BIRT開發人員的報告時。如果我將報告上傳到工作環境並進行測試,它似乎工作正常。所以它必須與緩存腳本數據源的方式以及開發人員如何處理它有關?