2016-03-24 15 views
2

Karmaşık bir SQL kullanarak yazılmış bir Crystal Reportum var ve Crystal Report Java API kullanarak bunu çağırmaya çalışıyorum. Bu raporda onunla ilişkili bir Command nesnesi var.CommandTable Cystal Rapor Hatası

  1. Raporu yükleyip bağlantı parametrelerini ayarlıyorum.
  2. Bağlantı bilgilerini geçerli JDBC Profiline ayarlamaya çalışıyorum. Test Ortamı kimlik bilgileri. Bir istisna yapıyorum

Her ikisi de Version 11 Version 12 ile çalıştı. Hiçbiri çalışmıyor gibi görünüyor. Aşağıdaki kod parçasını çağırdığımda özel durumu alıyorum. Bu kod parçası, "Komut" si olmayan raporlarla gayet iyi çalışıyor. Tüm kod için aşağıya bakın. Bu konuda nasıl çalışacaklarını bilen varsa lütfen cevap verin.

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

Thing ile değiştirebiliyor

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

ait

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

yerine senin bu satırdan sonra ekleyin, bu rapor aslen Bir ODBC Bağlantısı kullanılarak oluşturuldu ve Bu neden oldu. Sıfırdan bir JDBC Bağlantısı kullanarak raporu yeniden oluşturdum ve gayet iyi çalışıyor. CRJava API'sinde yanlış bir şey yok. Bu karışıklık ve umut için özür dilerim, bu birisinin bunu çözmesine yardımcı olacaktır. – user3656845

+0

setTableLocation bölümünü kaldırdığınız anlamına mı geliyorsunuz, çünkü doğru DB bilgisine zaten bağlısınızdır? Ya da hala setTableLocation bölümünü kullanıyorsunuz, ancak şimdi JDBC için tanımlanmış olduğundan çalışıyor mu? – Piro

cevap

0

Burada söz oldu unutmuşum

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

Nasıl yardımcı olacağını açıklar mısınız? 'OrigTable = tables.getTable (i) 'den beri,' 'setTableLocation' yönteminin yeni ve eski tablo parametrelerini tersine çevirdiğini mi söylüyorsunuz? Aksi halde hiçbir şeyi değiştirmiyorsunuz, tabii ki başarısız olmaz. – Piro

İlgili konular