2011-10-10 60 views
1

在報告生成期間是否可以在IReports/jasper報告中執行「插入查詢」?在jasper報告中插入查詢

+0

你想達到什麼結果?您可以嘗試在預構建報告事件的調用應用程序中創建觸發器。 –

回答

0

是的,您需要的想法是使用此語法的參數:$P!{PARAM_NAME}

因此,您的整個SQL查詢(或其他類型的查詢)可能只是$P!{SQL}。然後你傳入你需要的動態SQL。

更新: 在閱讀Sharad的評論後,我意識到我的答案並不好。我寫的是真的......但它沒有解決核心問題。

不,您的報告無法真正執行插入語句。嚴格地說,我相信這不是不可能的。您可以在建立連接的.jar文件中添加scriptlet或自定義函數,並執行插入操作。但實際上,一個報告將執行一個或多個查詢。 JR框架不打算執行插入或更新。

+0

在我們的實驗中,我們已經看到,如果我們使用插入或更新,IReport會給出錯誤...請給我們一個洞察這個... –

+0

@mdahlman:我做了什麼,創建了一個輸入控件「$ P!{p_insert_sql }「並設置默認值」「INSERT INTO t_error_log(LogID)VALUES(2)」但它顯示的錯誤:不能用executeQuery()發出數據操作語句() – Sharad

+0

你不覺得如果我們有這個工具來插入或更新數據庫通過JasperReport服務器,我們可以在任何級別做更好的報告,然後我們可以使用JasperReport Server作爲入口點,也可以像Excel一樣,只需在數據庫中創建表格一次,然後通過Jasper插入記錄並查看報告,我們不必實際上一次又一次地使用數據庫來插入或更新記錄。 – Sharad

0

是的,你可以。您想要顯示報告時可以執行查詢。這是一個適合我的示例。

try { 
     Map parameters = new HashMap(); 
     connectionString ="jdbc:mysql://localhost/myDb", "myUsername", "myPassword" 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection conn = DriverManager.getConnection(connectionString); 
     PreparedStatement stmt = conn.prepareStatement(query); 
     ResultSet rs = stmt.executeQuery(); 
     JRResultSetDataSource rsdt = new JRResultSetDataSource(rs); 

     JasperPrint jp; 
     jp = JasperFillManager.fillReport("sourceFileName.jasper", parameters, rsdt); 
     JasperViewer jv = new JasperViewer(jp, false); 
     jv.setVisible(true); 

    } catch (ClassNotFoundException | SQLException | JRException ex) { 
     ex.printStackTrace(); 
    }