2012-05-21 9 views
5

Mam ten kodJak otworzyć raport kryształów w aplikacji 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)); 

Co Im próbuje zrobić, to otworzyć raport i przekazać informacje o połączeniu z tym raportem tak, że można dynamicznie zmieniać bazy danych raportu, ale z jakiegoś powodu nie działa a raport nadal generuje informacje z bazy danych, którą pierwotnie utworzono. Czy ktoś może mi powiedzieć, co zrobiłem źle? Jest to aplikacja typu swing i używam raportów kryształów XI. Btw Im przy użyciu com.crystaldecisions.reports.sdk.ReportClientDocument zamiast com.crystaldecisions.sdk.occa.report.application.ReportClientDocument, ponieważ podczas korzystania z drugiej, otrzymuję nie można znaleźć błąd serwera. Proszę pomóż.

+1

Nie widzę, jak Swing naprawdę odgrywa jakąś rolę w tym zakresie, z wyjątkiem być może potrzeby, aby zadbać o wywoływanie tego kodu w wątku w tle, ale poza tym tworzenie raportu odbywa się w ten sam sposób z GUI Swinga od program konsoli. –

+0

Naprawdę nie dostałem tego. Przepraszam. Wszystko jest w porządku, z wyjątkiem dynamicznej zmiany części bazy danych. – John

Odpowiedz

0

Aby przełączać połączenia w czasie wykonywania można użyć tego:

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){ 
    ... 
    } 

zaliczyć odpowiednie wartości w powyższym fragmencie kodu. Przykro nam, że używa to interfejsów API com.crystaldecisions.sdk.occa.report.

Nadzieja to pomaga ...

+0

Dziękuję za odpowiedź. Czy oldConnInfo i newConnInfo są obiektami java.sql.Connection? – John

+0

Obie są typu IConnectionInfo .. mam nadzieję, że oznaczało to ... – ria

+0

Czy muszę zmienić atrybuty wszystkich tabel, tak jak to zrobiłem? Jeśli nie, w jaki sposób uzyskać IConnectionInfo z reportclientdocument? – John

0

Można użyć eclipse wersję dla rozwoju raportu kryształ here. Skąd można pobrać wtyczki do eclipse.

Można znaleźć dobry przykład na początek rozwoju Crystal Reports z Java here

można znaleźć odpowiedzi związane z doniesieniami Crystel here, gdzie wszystkie niezbędne informacje dotyczące rozwoju Crystal Reports z Java jest powiedziane.