2016-03-24 8 views
2

複雑なSQLを使用して作成されたCrystal Reportがあり、Crystal Report Java APIを使用してそのレポートを呼び出そうとしています。このレポートにはCommandオブジェクトが関連付けられています。CommandTable Cystal Report Error

  1. レポートを読み込んで接続パラメータを設定します。
  2. 次に、現在のJDBCプロファイルに接続情報を設定しようとします。意味テスト環境の資格情報。

私は例外があります。バージョン11とバージョン12の両方で試しました。彼らのどれも働いているようではありません。

次のコードを呼び出すと例外が発生します。このコードは、「コマンド」のないレポートでうまく動作します。

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

以下のコード全体を参照してください。誰かがこれを回避する方法を知っている場合は、返信してください。

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

事でこれを置き換える

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

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

代わりにあなたのこの行の後に追加、この報告書は、もともとODBC接続を使用して作成され、原因となっています。私は最初からJDBC Connectionを使ってレポートを再生成しました。うまくいきました。 CRJava APIには何も問題はありません。混乱と申し訳ありません、これは誰かがこれを理解するのを助けることを願っています。 – user3656845

+0

既に正しいDB情報に接続されているため、setTableLocationの部分を削除したことを意味しますか?または、まだsetTableLocationパーツを使用していますが、すでにJDBC用に定義されているため動作していますか? – Piro

答えて

0

私はここで言及したのを忘れ

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

どのように役立つか教えてください。最初に、 'setTableLocation'メソッドが新しいテーブルと古いテーブルのパラメータを逆転したとしますか?' origTable = tables.getTable(i); 'それ以外の場合は何も置き換えていないので、もちろん失敗しません。 – Piro