2012-05-21 31 views
5

tengo este código¿Cómo abrir Crystal Report en la aplicación java swing?

import com.crystaldecisions.reports.sdk.ReportClientDocument; 
... 

ReportClientDocument rpt = new ReportClientDocument(); 
    rpt.open(reportPath+fileName, 0); 
    rpt.getDatabaseController().logon(DBConnect.getUsername(), DBConnect.getPassword()); 
    Tables tables = rpt.getDatabaseController().getDatabase().getTables(); 

    for(int i=0; i< tables.size(); i++){ 
     System.out.print(i); 
     ITable table = tables.getTable(i); 

     IConnectionInfo connInfo = table.getConnectionInfo(); 

     PropertyBag innerProp = connInfo.getAttributes(); 
     innerProp.clear(); 

     PropertyBag propertyBag = new PropertyBag(); 
     propertyBag.put("Server Type", "JDBC (JNDI)"); 
     propertyBag.put("Database DLL", "crdb_jdbc.dll"); 
     propertyBag.put("Connection String", DBConnect.getConnectionString()); 
     propertyBag.put("Database Class Name", "com.mysql.jdbc.Driver"); 
     propertyBag.put("Use JDBC", "true"); 
     propertyBag.put("Server Name", DBConnect.getServer()); 
     propertyBag.put("Generic JDBC Driver Behavior", "No"); 
     propertyBag.put("URI", "!com.mysql.jdbc.Driver!jdbc:mysql://"+DBConnect.getServer()+":"+DBConnect.getPort()+"/"+DBConnect.getDatabase()+"!ServerType=29!QuoteChar=`"); 

     connInfo.setAttributes(propertyBag); 
     connInfo.setKind(ConnectionInfoKind.SQL); 

     table.setConnectionInfo(connInfo); 
     rpt.getDatabaseController().setTableLocation(table, tables.getTable(i)); 

Qué Im tratando de hacer es abrir un informe y pasar la información de conexión a ese informe para que yo puede cambiar dinámicamente la base de datos del informe, pero por alguna razón no está funcionando y el informe aún produce la información de la base de datos que se configuró inicialmente. ¿Alguien puede decirme qué hice mal? Esta es una aplicación de swing y estoy usando Crystal Reports XI. Por cierto, estoy usando com.crystaldecisions.reports.sdk.ReportClientDocument en lugar de com.crystaldecisions.sdk.occa.report.application.ReportClientDocument porque cuando uso el otro, aparece el error "can not find server". Por favor ayuda.

+1

No veo cómo Swing realmente desempeña ningún papel en esto, excepto quizás que deba tener cuidado de llamar a este código en una cadena de fondo, pero de lo contrario crear un informe se hace de la misma manera desde una GUI Swing que desde un programa de consola. –

+0

Realmente no entendí eso. Lo siento. Todo está bien excepto por el cambio dinámico de la parte de la base de datos. – John

Respuesta

0

Para cambiar la conexión en tiempo de ejecución puede utilizar esto: valores apropiados

IConnectionInfo oldConnInfo = new ConnectionInfo(); 
IConnectionInfo newConnInfo = new ConnectionInfo(); 

// If this connection needed parameters, we would use this field. 
com.crystaldecisions.sdk.occa.report.data.Fields pFields = null; 

try{ 
    // Assign the old Connection info to the reports current info 
    //DatabaseController dbController = rptClient.getDatabaseController(); 
    oldConnInfo=dbController.getConnectionInfos(null).getConnectionInfo(0); 
    com.crystaldecisions.sdk.occa.report.lib.PropertyBag boPropertyBag1 = new com.crystaldecisions.sdk.occa.report.lib.PropertyBag(); 
    boPropertyBag1.put("JDBC Connection String","..."); 
    boPropertyBag1.put("Server Type","..."); 
    boPropertyBag1.put("Database Type","..."); 
    boPropertyBag1.put("Database Class Name","..."); 
    boPropertyBag1.put("Use JDBC","..."); 
    boPropertyBag1.put("Connection URL","..."); 
    boPropertyBag1.put("Database DLL","..."); 
    // Assign the properties to the connection info 
    newConnInfo.setAttributes(boPropertyBag1); 
    // Set the DB Username and Pwd 
    newConnInfo.setUserName("..."); 
    newConnInfo.setPassword("...");  
    // The Kind of connectionInfos is SQL 
    newConnInfo.setKind(ConnectionInfoKind.SQL); 

    // set the parameters to replace. 
    // The 4 options are: 
    // _doNotVerifyDB 
    // _ignoreCurrentTableQualifiers 
    // _mapFieldByRowsetPosition 
    // _useDefault 
    int replaceParams = DBOptions._ignoreCurrentTableQualifiers + DBOptions._doNotVerifyDB; 
    // Now replace the connections 
    dbController.replaceConnection(oldConnInfo, newConnInfo, pFields, replaceParams); 
    }catch(ReportSDKException rse){ 
    ... 
    } 

pase en el fragmento de código anterior. Lamento que esto use las API de com.crystaldecisions.sdk.occa.report.

Espero que esto ayude ...

+0

Gracias por la respuesta. ¿OldConnInfo y newConnInfo son objetos java.sql.Connection? – John

+0

Ambos son del tipo IConnectionInfo ... espero que quisieras decir que ... – ria

+0

¿Debo cambiar los atributos de todas las tablas como lo hice? Si no, ¿cómo obtengo IConnectionInfo del reportclientdocument? – John

0

Puede usar la versión de Eclipse para el desarrollo de informes de Crystal here. Desde donde puedes descargar los complementos para eclipse.

se puede encontrar un buen ejemplo para comenzar con el desarrollo de informes de cristal con Java here

Usted puede encontrar su respuesta en relación con los informes Crystel here, donde toda la información necesaria con respecto al desarrollo de informes de cristal con Java se afirma.

Cuestiones relacionadas