在.net中,你可以很容易的用sql語句過濾報表數據,但在CR4E中沒這樣的功能設定,但可以通過編寫代碼完成。
這里是我做的簡單用sql語句過濾數據的例子。
項目還是用ǘ ├錈嫻膖omcat項目。
建一個實現這個功能的類
JRC_ResultSet_DataSource.java
package com.JRC.util;
import java.sql.*;
import javax.servlet.http.*;

import com.crystaldecisions.reports.sdk.*;
import com.crystaldecisions.sdk.occa.report.lib.*;


public class JRC_ResultSet_DataSource ...{
private String REPORT_NAME="";

public JRC_ResultSet_DataSource(String report_name)...{
this.REPORT_NAME=report_name;
}

/** *//**
* @return rEPORT_NAME
*/

public String getREPORT_NAME() ...{
return REPORT_NAME;
}


/** *//**
* @param report_name 要設置的 rEPORT_NAME
*/

public void setREPORT_NAME(String report_name) ...{
REPORT_NAME = report_name;
}


/** *//**
* 連接數據庫,通過sql查詢語句進行查詢,返回結果集
*/
private static ResultSet getResultSetFromQuery(String query, int scrollType)

throws SQLException, ClassNotFoundException ...{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
final String DBUSERNAME = "username";
final String DBPASSWORD = "password";
final String CONNECTION_URL = "jdbc:microsoft:sqlserver://localhost:1433;database=dname";
java.sql.Connection connection = DriverManager.getConnection(CONNECTION_URL, DBUSERNAME, DBPASSWORD);
Statement statement = connection.createStatement(scrollType, ResultSet.CONCUR_READ_ONLY);
return statement.executeQuery(query);

}

/** *//**
* 通過sql語句過濾報表數據,在.net就不用怎么慘了
*/

public boolean isReportSourceInSession(String session_name,HttpSession session) throws ReportSDKException, SQLException, ClassNotFoundException...{
boolean flag=false;

try ...{
//打開水晶報表
ReportClientDocument reportClientDoc = new ReportClientDocument();
reportClientDoc.open(REPORT_NAME, 0);
//sql查詢語句,返回的字段數必須跟報表里面的一樣,不能多也不能少,并且字段的類型要跟報表的一樣,其他不管是什么數據都可以
//from 表這里要填完整,如數據庫名.dbo.數據庫表,最好做個別名
String query = "select tt.test_1,tt.test_2,tt.test_3,tt.test_4 from dname.dbo.test tt";
ResultSet resultSet = this.getResultSetFromQuery(query,ResultSet.TYPE_SCROLL_INSENSITIVE);
String tableAlias = reportClientDoc.getDatabaseController().getDatabase().getTables().getTable(0).getAlias();
//把結果集放進報表里,將會自動產生一個datasource
reportClientDoc.getDatabaseController().setDataSource(resultSet,tableAlias, "resultsetTable");
session.setAttribute(session_name, reportClientDoc.getReportSource());
flag=true;
return flag;

} catch (Exception e) ...{
// TODO: handle exception
e.printStackTrace();
return flag;
}
}
}

這里要注意數據庫查詢結果集的字段數目要跟報表里面的字段數目一樣,類型也要一樣,不然就會出錯。
sql語句中的表的名字要完整,如數據庫名.dbo.數據庫表,最好做個別名
顯示頁面
Result_viewer.jsp
<%@page import="com.JRC.util.JRC_ResultSet_DataSource" %>
<%--webreporting.jar --%>
<%@page import="com.crystaldecisions.report.web.viewer.*" %>
<%--jrcerom.jar --%>
<%@ page import="com.crystaldecisions.reports.sdk.*" %>
<%
JRC_ResultSet_DataSource jrcd=new JRC_ResultSet_DataSource("resultSet.rpt");
if(!jrcd.isReportSourceInSession("reportSource",session)
response.sendRedirect("error.html");
CrystalReportViewer crViewer=new CrystalReportViewer();
crViewer.setOwnPage(true);
crViewer.setOwnForm(true);
crViewer.setPrintMode(CrPrintMode.ACTIVEX);
Object reportSource=session.getAttribute("reportSource");
crViewer.setReportSource(reportSource);
crViewer.processHttpRequest(request,response,this.getServletConfig().getServletContext(),null);
%>
注意上面幾點應該就沒問題了
PS:Snippets視圖最下面有Crystal reports的一些實用代碼段
CR查看器標記、打開并查詢報表、打開報表、查看報表、查看報表并設置數據庫登錄、將報表導出為pdf、將報表導出為rtf 等的代碼段,簡單易用
posted on 2008-03-28 16:48
煒 閱讀(538)
評論(0) 編輯 收藏 所屬分類:
java基礎