Ciao, vorrei visualizzare un report fatto con C.R. XI richiamandolo da una pagina jsp. Ho provato ad utilizzare un file di esempio trova nella cartella d'installazione di C.R. ma non ci capisco molto :(
Mi date un consiglio?
Grazie
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html:html>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
session="true"
%>
<%@ page import="com.crystaldecisions.report.web.viewer.CrystalReportViewer"%>
<%@ page import="com.crystaldecisions.sdk.occa.report.reportsource.IReportSource"%>
<%@ page import="com.crystaldecisions.xml.serialization.*"%>
<%@ page import="javax.servlet.http.HttpServletRequest"%>
<%@ page import="javax.servlet.http.HttpServletRequest"%>
<%@ page import="javax.servlet.http.HttpServletResponse"%>
<%@ page import="java.io.*"%>
<%
String CLOSED_RPT_ID = "closedreportid";
String RPT_ID = "reportid";
String RPT_SOURCE = "D:\\Progetti\\report\\prova.rpt";
(RPT_SOURCE="D:\\Progetti\\report\\prova.rpt");
//String closeRptID = request.getParameter(CLOSED_RPT_ID);
//String reportID = request.getParameter(RPT_ID);
//String serializedRptSrc = request.getParameter(RPT_SOURCE);
String closeRptID = "closedreportid";
String reportID = "reportid";
String serializedRptSrc = "D:\\Progetti\\WeFid\\online\\wefidWeb\\report\\prova.rpt";
if (closeRptID != null && closeRptID.length() > 0)
{
// Clear the report source in session with the given closedreportid
session.removeAttribute(closeRptID);
}
if (reportID != null && reportID.length() > 0)
{
CrystalReportViewer viewer = new CrystalReportViewer();
viewer.setName("htmlpreview");
viewer.setHasRefreshButton(false);
viewer.setHasExportButton(false);
viewer.setHasPrintButton(false);
viewer.setOwnForm(true);
viewer.setOwnPage(true);
if (serializedRptSrc != null && serializedRptSrc.length() > 0)
{
IReportSource reportSource = null;
// Got a seralizedRprtSrc string
// need to deserialize the report source string and pass to viewer
byte[] byteRptSrc = serializedRptSrc.getBytes();
ByteArrayInputStream byteInStream = new ByteArrayInputStream(byteRptSrc);
try
{
XMLObjectSerializer serializer = new XMLObjectSerializer();
SaveOption saveOpt = serializer.getSaveOption();
saveOpt.setExcludeNullObjects(true);
// Enabled since server is ready.
saveOpt.setSkipWritingIdenticalObject(true);
reportSource = (IReportSource)serializer.load(byteInStream);
}
catch (Exception e)
{
e.printStackTrace();
out.write("Error deserializing report source.");
return;
}
finally
{
byteInStream.close();
}
viewer.setReportSource(reportSource);
session.setAttribute(reportID, viewer.getReportSource());
}
else
{
// Try to load report source from session
viewer.setReportSource((IReportSource) session.getAttribute(reportID));
}
viewer.setURI(request.getRequestURI() + "?" + RPT_ID + "=" + reportID);
viewer.processHttpRequest(request, response, application, null);
}
%>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="IBM WebSphere Studio">
<TITLE></TITLE>
</HEAD>
<BODY>
<P>Place content here.</P>
</BODY>
</html:html>
il tuo avatar mi sta facendo svalvolare....:sbavvv:
DvL^Nemo
05-03-2007, 20:11
Adesso non sono a lavoro, quindi non ho nulla sottomano, ma domani ti posto qualcosa :) CRXI e JSP,nel mio caso e' un report che si aggancia ad un database
Ciao !
Adesso non sono a lavoro, quindi non ho nulla sottomano, ma domani ti posto qualcosa :) CRXI e JSP,nel mio caso e' un report che si aggancia ad un database
Ciao !
Ok grazie.
Potresti anche dirmi quali sono i jar da utilizzare? Nella cartella "Program Files\Common Files\Crystal report XI\java\lib" ce ne sono ben 43:eek:
il tuo avatar mi sta facendo svalvolare....:sbavvv:
:ciapet:
DvL^Nemo
06-03-2007, 14:46
Comunque nel mio caso i passi erano 2 per lanciare il report
1) Servlet che chiama la JSP di accesso al database, passando username, password e altre cose..
2) JSP che richiama il report
package xxx.yyyy;
import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.servlet.*;
import javax.servlet.http.*;
import tchn.login.ConnectionHolder;
public class XXX extends HttpServlet {
private final static String connectionURL = Risorse.getConnectionURL();
//Risorse.getDataString("server_ip")
private final static String user = "XXX";
private final static String password = "YYY";
private static final boolean DEBUG = true;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
RequestDispatcher reqDis=request.getRequestDispatcher("view/jrc_database_logon.jsp");
String sUrlDb=request.getParameter("URLDB");
String sId=request.getParameter("sId");
java.sql.Connection connection=getConnection(request.getSession(),sUrlDb);
request.setAttribute("conn",connection);
request.setAttribute("sId",sId);
reqDis.forward(request,response);
}
/** Process the HTTP Post request */
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
private Connection getConnection(HttpSession session,String sUrlDb ){
Connection con=null;
// Synchronize: Without this two holders might be created for one client
synchronized (session) {
// Try getting the connection holder for this client
ConnectionHolder holder =
(ConnectionHolder) session.getAttribute("servletapp.connection");
// Create (and store) a new connection and holder if necessary
if (holder == null) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection cn=DriverManager.getConnection(sUrlDb,user,password);
holder = new ConnectionHolder(cn);
session.setAttribute("servletapp.connection", holder);
}
catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
}
}
}
con=((ConnectionHolder)session.getAttribute("servletapp.connection")).getConnection();
return con;
}
}
2) JSP "jrc_database_logon.jsp"
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@page import="com.crystaldecisions.reports.sdk.*" %>
<%@page import="com.crystaldecisions.sdk.occa.report.reportsource.*" %>
<%@page import="com.crystaldecisions.sdk.occa.report.lib.*" %>
<%@page import="com.crystaldecisions.sdk.occa.report.data.*" %>
<%@page import="com.crystaldecisions.report.web.viewer.*" %>
<%@page import="java.util.*"%>
<%@page import="java.sql.*"%>
<%
/*
* Applies to Versions: XI
* Date Created: February 9, 2005
* Description: This sample opens a report connected to pubs Sample database on
* MS SQL Server using the Java Reporting Component (JRC) SDK.
* The report uses a JDBC connection in the designer.
* The code passes in the user name and password for the database
* via a ConnectionInfos object through the CrystalReportViewer.
* Author: MAE
*/
%>
<%
java.sql.Connection connection=(java.sql.Connection)request.getAttribute("conn");
String sId=request.getAttribute("sId").toString();
%>
<%
//Use the relative path to the report; the physical or full qualified URL cannot
// be used.
String reportName = "reports/Report.rpt";
//Database username and password
String userName = "XXX";
String password = "YYY";
try{
ReportClientDocument clientDoc = new ReportClientDocument();
clientDoc.open(reportName, 0);
Object oReportSource = clientDoc.getReportSource();
session.setAttribute("reportSource", oReportSource);
ResultSet resultSet = getResultSetFromQuery("SELECT * FROM STAMPA WHERE ID='"+sId+"'",connection,session, ResultSet.TYPE_SCROLL_INSENSITIVE);
//Look up existing table in the report to set the datasource for and obtain its alias. This table must
//have the same schema as the Resultset that is being pushed in at runtime. The table could be created
//from a Field Definition File, a Command Object, or regular database table. As long the Resultset
//schema has the same field names and types, then the Resultset can be used as the datasource for the table.
String tableAlias = clientDoc.getDatabaseController().getDatabase().getTables().getTable(0).getAlias();
//Push the Java ResultSet into the report. This will then be the datasource of the report.
clientDoc.getDatabaseController().setDataSource(resultSet, tableAlias , "resultsetTable");
//Store the report source in session, will be used by the CrystalReportViewer.
session.setAttribute("reportSource", clientDoc.getReportSource());
CrystalReportViewer oCrystalReportViewer = new CrystalReportViewer();
oCrystalReportViewer.setReportSource(clientDoc.getReportSource());
ConnectionInfos oConnectionInfos = new ConnectionInfos();
ConnectionInfo oConnectionInfo = new ConnectionInfo();
//Set username and password for the report's database
oConnectionInfo.setUserName(userName);
oConnectionInfo.setPassword(password);
//Add object to collection
oConnectionInfos.add(oConnectionInfo);
session.setAttribute("oConnectionInfos", oConnectionInfos);
oCrystalReportViewer.setDatabaseLogonInfos(oConnectionInfos);
//set viewer attributes
oCrystalReportViewer.setOwnPage(true);
oCrystalReportViewer.setOwnForm(true);
//set the CrystalReportViewer print mode
//oCrystalReportViewer.setPrintMode(CrPrintMode.ACTIVEX);
oCrystalReportViewer.setPrintMode(CrPrintMode.PDF);
oCrystalReportViewer.setDisplayGroupTree(false);
Fields oFields = new Fields();
//setDiscreteParameterValue(oFields, "sessionId", reportName, sessionId);
//Push Fields collection into session so it can be retrieved by the viewer and set
//at view time.
oCrystalReportViewer.setParameterFields(oFields);
session.setAttribute("parameterFields", oFields);
oCrystalReportViewer.setSeparatePages(true);
oCrystalReportViewer.refresh();
session.setAttribute("refreshed", "true");
oCrystalReportViewer.processHttpRequest(request, response, getServletConfig().getServletContext(), null);
}
catch(Exception e){
out.print(e);
}
%>
<%!
/*
* Utility function to set values for the discrete parameters in the report. The report parameter value is set
* and added to the Fields collection, which can then be passed to the viewer so that the user is not prompted
* for parameter values.
*/
private void setDiscreteParameterValue(Fields oFields, String paramName, String reportName, Object value) {
//Create a ParameterField object for each field that you wish to set.
ParameterField oParameterField = new ParameterField();
//You must set the report name.
//Set the report name to an empty string if your report does not contain a
//subreport; otherwise, the report name will be the name of the subreport
oParameterField.setReportName(reportName);
//Create a Values object and a ParameterFieldDiscreteValue object for each
//object for each parameter field you wish to set.
//If a ranged value is being set, a ParameterFieldRangeValue object should
//be used instead of the discrete value object.
Values oValues = new Values();
ParameterFieldDiscreteValue oParameterFieldDiscreteValue = new ParameterFieldDiscreteValue();
//Set the name of the parameter. This must match the name of the parameter as defined in the
//report.
oParameterField.setName(paramName);
oParameterFieldDiscreteValue.setValue(value);
//Add the parameter field values to the Values collection object.
oValues.add(oParameterFieldDiscreteValue);
//Set the current Values collection for each parameter field.
oParameterField.setCurrentValues(oValues);
//Add parameter field to the Fields collection. This object is then passed to the
//viewer as the collection of parameter fields values set.
oFields.add(oParameterField);
}
%>
<%!
/**
* Simple utility function for obtaining result sets that will be pushed into the report.
* This is just standard querying of a Java result set and does NOT involve any
* Crystal JRC SDK functions.
*/
private static ResultSet getResultSetFromQuery(String query,java.sql.Connection connection,HttpSession session, int scrollType) throws SQLException, ClassNotFoundException {
//Load JDBC driver for the database that will be queried.
// Class.forName("oracle.jdbc.driver.OracleDriver");
//Construct JDBC connection.
// final String DBUSERNAME = "XXX";
// final String DBPASSWORD = "YYY";
// final String CONNECTION_URL = "jdbc:oracle:thin:@127.0.0.1:1521:PIPPO";
// java.sql.Connection connection = DriverManager.getConnection(CONNECTION_URL, DBUSERNAME, DBPASSWORD);
//java.sql.Connection connection =((tchn.login.ConnectionHolder)session.getAttribute("servletapp.connection")).getConnection();
java.sql.Statement statement = connection.createStatement(scrollType, ResultSet.CONCUR_READ_ONLY);
//Execute query and return result sets.
return statement.executeQuery(query);
}
%>
Modifica il tutto per quello che serve a te ovviamente, dovrebbe andare..
Questi sono tutti i jar che mi ritrovo nella cartella lib, alcuni non sono di Crystal Report..
Concurrent.jar
CRDBJavaServerCommon.jar
CRDBXMLServer.jar
CrystalCharting.jar
CrystalCommon.jar
CrystalContentModels.jar
CrystalExporters.jar
CrystalExportingBase.jar
CrystalFormulas.jar
CrystalQueryEngine.jar
CrystalReportEngine.jar
CrystalReportingCommon.jar
icu4j.jar
jrcerom.jar
keycodeDecoder.jar
log4j.jar
MetafileRenderer.jar
ojdbc14.jar
ORACLE7JDBC-JDK1.2.jar
rascore.jar
reportviewerbean.jar
rpoifs.jar
serialization.jar
StringUtil.jar
URIUtil.jar
webreporting.jar
xercesImpl.jar
xml-apis.jar
Ciao !
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.