2016-03-24 5 views
2

Ich habe einen Crystal Report, der mit einem komplexen SQL geschrieben wurde, und ich versuche, das mit der Crystal Report Java API aufzurufen. Diesem Bericht ist ein Command-Objekt zugeordnet.CommandTable Cystal Fehler melden

  1. Ich lade den Bericht und stelle die Verbindungsparameter ein.
  2. Dann versuche ich die Verbindungsinformationen auf das aktuelle JDBC-Profil einzustellen. Bedeutung Testumgebung Anmeldeinformationen.

Ich bekomme eine Ausnahme. Ich habe versucht mit Version 11. Version 12 beide. Keiner von ihnen scheint zu arbeiten.

Ich bekomme die Ausnahme, wenn ich den folgenden Code aufrufen. Dieses Stück Code funktioniert gut mit Berichten ohne "Befehl" sqls.

try{ 
    clientDoc.getDatabaseController().setTableLocation(
    origTable, newTable); 
}catch(Exception ex){ 
    ex.printStackTrace(); 
} 

Siehe unten für den gesamten Code. Bitte antworten Sie, wenn jemand weiß, wie dies zu umgehen ist.

private static void changeDataSource(ReportClientDocument clientDoc, 
     String reportName, String tableName, String username, 
     String password, String connectionURL, String driverName, 
     String jndiName) throws ReportSDKException { 

    PropertyBag propertyBag = null; 
    IConnectionInfo connectionInfo = null; 
    ITable origTable = null; 
    ITable newTable = null; 

    // Declare variables to hold ConnectionInfo values. 
    // Below is the list of values required to switch to use a JDBC/JNDI 
    // connection 
    String TRUSTED_CONNECTION = "false"; 
    String SERVER_TYPE = "JDBC (JNDI)"; 
    String USE_JDBC = "true"; 
    String DATABASE_DLL = "crdb_jdbc.dll"; 
    String JNDI_OPTIONAL_NAME = jndiName; 
    String CONNECTION_URL = connectionURL; 
    String DATABASE_CLASS_NAME = driverName; 

    // Declare variables to hold database User Name and Password values 
    String DB_USER_NAME = username; 
    String DB_PASSWORD = password; 
    System.out.println("Trusted_Connection:" + TRUSTED_CONNECTION); 
    System.out.println("Server Type:" + SERVER_TYPE); 
    System.out.println("Use JDBC:" + USE_JDBC); 
    System.out.println("Database DLL:" + DATABASE_DLL); 
    System.out.println("JNDIOptionalName:" + JNDI_OPTIONAL_NAME); 
    System.out.println("Connection URL:" + CONNECTION_URL); 
    System.out.println("Database Class Name:" + DATABASE_CLASS_NAME); 
    System.out.println("DB_USER_NAME:" + DB_USER_NAME); 
    System.out.println("DB_PASSWORD:" + DB_PASSWORD); 
    // Obtain collection of tables from this database controller 
    if (reportName == null || reportName.equals("")) { 
     Tables tables = clientDoc.getDatabaseController().getDatabase() 
       .getTables(); 
     for (int i = 0; i < tables.size(); i++) { 
      origTable = tables.getTable(i); 

      if (tableName == null || origTable.getName().equals(tableName)) { 
       newTable = (ITable) origTable; 
       newTable.setQualifiedName(origTable.getAlias()); 
       connectionInfo = newTable.getConnectionInfo(); 

       // Set new table connection property attributes 
       propertyBag = new PropertyBag(); 
       // Overwrite any existing properties with updated values 
       propertyBag.put("Trusted_Connection", TRUSTED_CONNECTION); 
       propertyBag.put("Server Type", SERVER_TYPE); 
       propertyBag.put("Use JDBC", USE_JDBC); 
       propertyBag.put("Database DLL", DATABASE_DLL); 
       propertyBag.put("JNDIOptionalName", JNDI_OPTIONAL_NAME); 
       propertyBag.put("Connection URL", CONNECTION_URL); 
       propertyBag.put("Database Class Name", DATABASE_CLASS_NAME); 
       connectionInfo.setAttributes(propertyBag); 
       connectionInfo.setUserName(DB_USER_NAME); 
       connectionInfo.setPassword(DB_PASSWORD); 

       // Update the table information 
       try{ 
        clientDoc.getDatabaseController().setTableLocation(
         origTable, newTable); 
       }catch(Exception ex){ 
        ex.printStackTrace(); 
       } 
      } 
     } 
    } 
    // Next loop through all the subreports and pass in the same 
    // information. You may consider 
    // creating a separate method which accepts 
    if (reportName == null || !(reportName.equals(""))) { 
     IStrings subNames = clientDoc.getSubreportController() 
       .getSubreportNames(); 
     for (int subNum = 0; subNum < subNames.size(); subNum++) { 
      Tables tables = clientDoc.getSubreportController() 
        .getSubreport(subNames.getString(subNum)) 
        .getDatabaseController().getDatabase().getTables(); 
      for (int i = 0; i < tables.size(); i++) { 
       origTable = tables.getTable(i); 
       if (tableName == null 
         || origTable.getName().equals(tableName)) { 
        newTable = (ITable) origTable; 

        newTable.setQualifiedName(origTable.getAlias()); 
        // Change connection information properties 
        connectionInfo = newTable.getConnectionInfo(); 
        // Set new table connection property attributes 
        propertyBag = new PropertyBag(); 

        // Overwrite any existing properties with updated values 
        propertyBag.put("Trusted_Connection", 
          TRUSTED_CONNECTION); 
        propertyBag.put("Server Type", SERVER_TYPE); 
        propertyBag.put("Use JDBC", USE_JDBC); 
        propertyBag.put("Database DLL", DATABASE_DLL); 
        propertyBag.put("JNDIOptionalName", JNDI_OPTIONAL_NAME); 
        propertyBag.put("Connection URL", CONNECTION_URL); 
        propertyBag.put("Database Class Name", 
          DATABASE_CLASS_NAME); 
        connectionInfo.setAttributes(propertyBag); 
        connectionInfo.setUserName(DB_USER_NAME); 
        connectionInfo.setPassword(DB_PASSWORD); 

        // Update the table information 
        clientDoc.getSubreportController() 
          .getSubreport(subNames.getString(subNum)) 
          .getDatabaseController() 
          .setTableLocation(origTable, newTable); 
       } 
      } 
     } 
    } 
} 
+0

Sache, die ich vergessen haben, hier zu erwähnen, war dieser Bericht ursprünglich erstellt mit einer ODBC-Verbindung und das hat es verursacht. Ich habe den Bericht mit einer JDBC-Verbindung von Grund auf neu erstellt und es funktioniert gut. Mit der CRJava API ist nichts falsch. Entschuldigung für die Verwirrung und hoffe, dass dies jemandem helfen wird, dies herauszufinden. – user3656845

+0

meinst du dich entfernt SetTableLocation Teil, weil Sie bereits mit korrekten DB-Informationen verbunden sind? Oder Sie verwenden noch setTableLocation Teil, aber es funktioniert jetzt, weil es bereits für JDBC definiert ist? – Piro

Antwort

0

hinzufügen nach dieser Zeile von Ihnen

connectionInfo.setPassword(DB_PASSWORD); 
newTable.setConnectionInfo(connectionInfo); 
//This will add connection parameters to the new table 

Statt

clientDoc.getDatabaseController().setTableLocation(origTable, newTable); 

diese ersetzen mit

clientDoc.getDatabaseController().setTableLocation (newTable, tables.getTable(i)); 
+0

Können Sie erläutern, wie es helfen wird? Seit 'origTable = tables.getTable (i);' an erster Stelle, sagst du, dass 'setTableLocation' Methode neue und alte Tabellenparameter umgekehrt hat? Sonst ersetzt du nichts, also scheitert es natürlich nicht. – Piro