Question : ReportSDKServerException, Java, Crystal, Eclipse

I need help.  I am trying to prototype/proof of concept a stand alone application in Java, that will open a crystal report, and export it to a pdf.  I have done this in visual basic 6.0 and VB.net 2005, but never in Java and I am having major problems.  It has been a while since I used Java, and I have never done what I am trying to do.  The following is the version of eclipse I am using and the version of crystal reports that I have:

Eclipse Java EE IDE for Web Developers.
Build id: 20090920-1017
Eclipse Platform 3.5.1.M20090917-0800
CR Developer
Version 12.0.0.683
Product Type:  Full

I have looked at the documentation from sap, and I have gone and imported the .jar files that they say you should import.  I went into CRConfig.xml and removed the reportlocator tag so that I could use absolute paths to the report instead of relative paths.  I read that I need to have all the imported .jar files in the Classpath.  Are they referring to the Classpath tag in the Config file, or the Classpath environmental variable that you access through the control panel, or both.  By the way I am using WindowsXP professional, and I am creating a desktop application, not  a web based one.

I threw together the following code just to see if I could open a crystal report:

import java.io.IOException;
 
import com.crystaldecisions.report.web.viewer.*;
//import com.crystaldecisions.reports.reportengineinterface.*;
import com.crystaldecisions.sdk.occa.report.application.ReportClientDocument;
import com.crystaldecisions.sdk.occa.report.data.*;
import com.crystaldecisions.sdk.occa.report.reportsource.*;
//import com.crystaldecisions.reports.sdk.*;
import com.crystaldecisions.sdk.occa.report.lib.*;
import com.crystaldecisions.sdk.occa.report.exportoptions.*;
 
public class CrystalTest {
      public static void main (String args []) throws IOException, ReportSDKException{
            ReportClientDocument reportClientDoc = new ReportClientDocument();
            String report = "C:/Report1.rpt";
            try {
                  reportClientDoc.open(report, 0);
            } catch (ReportSDKException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
                  System.out.println(e.getSDKError());
                  System.out.println(e.getMessage());
                  System.out.println(e.getCause());
                  System.out.println(e.errorCode());
            }
      }
}
When I run it, I get the following exception thrown:

com.crystaldecisions.sdk.occa.report.lib.ReportSDKServerException: There is no server specified.---- Error code:-2147217390 Error code name:serverNotFound
      at com.crystaldecisions.sdk.occa.report.lib.ReportSDKServerException.throwReportSDKServerException(Unknown Source)
      at com.crystaldecisions.sdk.occa.report.application.ReportAppSession.do(Unknown Source)
      at com.crystaldecisions.sdk.occa.report.application.ReportAppSession.int(Unknown Source)
      at com.crystaldecisions.sdk.occa.report.application.ReportAppSession.initialize(Unknown Source)
      at com.crystaldecisions.sdk.occa.report.application.ClientDocument.new(Unknown Source)
      at com.crystaldecisions.sdk.occa.report.application.ReportClientDocument.new(Unknown Source)
      at com.crystaldecisions.sdk.occa.report.application.ClientDocument.open(Unknown Source)
      at CrystalTest.AnotherTest.main(AnotherTest.java:15)
Exception in thread "main"

I need help.  I need someone to give me advice.  I spent two days trying to research this and havent gotten very far.  I need specific advice.  Baby-step advice.  Go in and check this, or do that.  Please dont assume I know anything.  Any assistance is greatly appreciated.  Thanks in advance.

Answer : ReportSDKServerException, Java, Crystal, Eclipse

A tip of the hat to mimcc for giving me a lead that lead to a solution.

The link mimcc provided, stated:  "The java reporting component is not a part of crystal reports 2008.  It's now fully a crystal reports for eclipse product.  The JRC is fully supported with CR4E.  The current versions will not work with crystal reports 2008 reports."

This was perplexing to me, since I had first tried with Eclipse version 3.5.1 and then subsequently tried the CR4E version and kept getting the same error.  I even tried using the Eclipse 3.6 stable build version to no avail.

I then decided to go out and download the crystal reports for eclipse again.  I did.  The download size was the same.  But to my surprise when I extracted the download, I had plugins that I did not have with my previous CR4E.

I then downloaded the "Crystal Reports for Eclipse:  Creating a Thick Client Application" .pdf and followed the instructions for loading the external jars.  I then ran the following test code, and it worked.  I hope this answer will be of use to others in the future since I have seen this question posted a lot of places on the web, but with no answer:

//Crystal Java Reporting Component (JRC) imports.
//import com.crystaldecisions.reports.sdk.*;
import com.crystaldecisions.sdk.occa.report.lib.*;
import com.crystaldecisions.sdk.occa.report.exportoptions.*;

//import com.crystaldecisions.report.web.viewer.*;
//import com.crystaldecisions.reports.reportengineinterface.*;
import com.crystaldecisions.sdk.occa.report.application.ReportClientDocument;
//import com.crystaldecisions.sdk.occa.report.data.*;
//import com.crystaldecisions.sdk.occa.report.reportsource.*;
//import com.crystaldecisions.reports.sdk.*;
//import com.crystaldecisions.sdk.occa.report.lib.*;
//import com.crystaldecisions.sdk.occa.report.exportoptions.*;

//Java imports.
import java.io.*;

public class JRCExportReport {

      //static final String REPORT_NAME = "C:\\JRCExportReport.rpt";
      static final String REPORT_NAME = "C:\\Report1.rpt";
      static final String EXPORT_FILE = "C:\\myExportedReport.pdf";
     
      public static void main(String[] args) {

            try {
                 
                  System.out.println("Open report");
                  //Open report.                  
                  ReportClientDocument reportClientDoc = new ReportClientDocument();
                  System.out.println("After declaration");
                  reportClientDoc.open(REPORT_NAME, 0);
                  System.out.println("After open");
                 
                  //NOTE: If parameters or database login credentials are required, they need to be set before.
                  //calling the export() method of the PrintOutputController.
                 
                  //Export report and obtain an input stream that can be written to disk.
                  //See the Java Reporting Component Developer's Guide for more information on the supported export format enumerations
                  //possible with the JRC.
                  ByteArrayInputStream byteArrayInputStream = (ByteArrayInputStream)reportClientDoc.getPrintOutputController().export(ReportExportFormat.PDF);
                 
                  //Release report.
                  reportClientDoc.close();
                                   
                  //Use the Java I/O libraries to write the exported content to the file system.
                  byte byteArray[] = new byte[byteArrayInputStream.available()];

                  //Create a new file that will contain the exported result.
                  File file = new File(EXPORT_FILE);
                  FileOutputStream fileOutputStream = new FileOutputStream(file);

                  ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(byteArrayInputStream.available());
                  int x = byteArrayInputStream.read(byteArray, 0, byteArrayInputStream.available());

                  byteArrayOutputStream.write(byteArray, 0, x);
                  byteArrayOutputStream.writeTo(fileOutputStream);

                  //Close streams.
                  byteArrayInputStream.close();
                  byteArrayOutputStream.close();
                  fileOutputStream.close();
                 
                  System.out.println("Successfully exported report to " + EXPORT_FILE);
                                               
            }
            catch(ReportSDKException ex) {
           
                  System.out.println("Inside catch");
                  ex.printStackTrace();
                 
            }
            catch(Exception ex) {
                 
                  ex.printStackTrace();
                                   
            }

      }

}
Random Solutions  
 
programming4us programming4us