Our solution (after 2 years of struggle) for using Crystal Report Viewer XI with a dynamic XML data source, without requiring a full Crystal Developer install on the client machine (very pricey!):
Hopefully this will help someone. We had a huge amount of help with this from Ionut Balas (balasionut@gmail.com) who is a Romanian freelancer who doesn't know much about Progress but is Crystal guru. He says that he is open to providing others with assistance.
Core of the viewer program is this:
- Install Java, if not already installed (check C:\Program Files\java)
- Open Internet Explorer
- Go to www.google.com and search for "java download"
[*]The first result should be www.java.com/getjava
[*]Select the Downloads subheading
[*]Find and select the appropriate download for you machine (ie; Windows 2003 32 bit)
[*]Press the "Run" button if a security warning pops up and asks if you want to save
[*]Follow the prompts in the installer
[*]Install Crystal Reports runtime- Go to
- http://www.bionreports.eu/download/DeployCR11.zip. This is a special .msi which contains .dll files which are on the Report Viewer CD, but not in the Report Viewer download. This is because they are dependant on a java installation, and Business Objects (the Crystal company) doesn't want any java-dependent DLL files in a download).
[*]Save (dialog may be behind your web-browser) and unzip the file
[*]Run DeployCR11.msi (note: the install directory seems to be overwritten by C:/Program Files/Business Objects/ which is fine)
[*]Create a "java" directory in C:\Program Files\Business Objects\Common\3.5\
[*]Make sure your Progress code is all in place, including the programs which produce the .xml/.xsd files and the program which calls the Crystal Report Viewer (code for this included below).[*]Make sure your Crystal Report, a .rpt file, is in the correct directory; whatever one your code will expect. It doesn't need to have saved data.[*]Copy files around:- Copy the directory C:\Program Files\Crystal\Common\3.5\java\lib from your development machine to the same directory on the client machine where you are deploying Crystal (note: sometimes the "Crystal" directory may be "Business Objects" instead, and if it a 64 bit machine then the client machine will be C:\Program Files (x86)\ instead of C:\Program Files\). This step was obtained from the Business Objects website, so we assume it's kosher. See http://www.sdn.sap.com/irj/scn/webl...DB20018264970065221781End?blog=/pub/wlg/13732
[*]Copy the C:\Program Files\Business Objects\Common\3.5\java\CRConfig.xml file from the development machine to the same location on the client machine. This step was also obtained from the Business Objects site.- Copy the crdb_xml.dll and crdb_xml_rex_en.dll files from the C:\Program Files\Business Objects\Common\3.5\bin\ directory on the development machine to the same directory on the client machine. This step was also obtained from the Business Objects site.
[*]Edit the C:\Program Files\Business Objects\Common\3.5\java\CRConfig.xml file on the client machine- Select the file, right click and select edit (or, if you do not have that option, open it with notepad)
[*]Change the JavaDir entry to the java location on the client machine (C:\Program Files\java\jre[version info]\bin)
[*]Change the Classpath entry to correctly point all the .jar files to the directory C:\Program Files\Crystal\Common\3.5\java\lib\
[*]Test!
Hopefully this will help someone. We had a huge amount of help with this from Ionut Balas (balasionut@gmail.com) who is a Romanian freelancer who doesn't know much about Progress but is Crystal guru. He says that he is open to providing others with assistance.
Core of the viewer program is this:
Code:
/*------------------------------------------------------------------------------
Purpose: Take an rpt, xml, and xsd file and display a Crystal report.
Notes:
------------------------------------------------------------------------------*/
define variable counter as integer no-undo.
define variable lv-data as character no-undo.
/* get the full path for the rpt and xml/xsd files */
file-info:filename = pv-report.
pv-report = file-info:full-pathname.
file-info:filename = pv-data.
pv-data = file-info:full-pathname.
/* set a string that indicates the location and names of the xml and xsd
files */
lv-data =
"Local XML File=" + pv-data + ";" +
"Local Schema File=" + entry(1,pv-data,".") + ".xsd".
/* create an instance of the Crystal runtime */
create "CrystalRuntime.Application" chApplication.
/* open a report in the Crystal runtime */
chReport = chApplication:OpenReport(pv-report,1).
/* get rid of any data that was saved with the report */
chReport:DiscardSavedData().
/* if this report has a table, then set its connection string and location */
if chReport:Database:Tables:Count > 0 then do:
/* set the connection string on the first table to the xml and xsd
files */
chReport:Database:Tables(1):ConnectBufferString = (lv-data).
/* loop through the tables in the report (this includes subtables),
setting each ones location (the location of the xml and xsd files) */
do counter = 1 to chReport:Database:Tables:Count:
/* get a com-handle to the current table */
chTable = chReport:Database:Tables(counter).
/* if the table uses an xml as a datasource, then set its table
location to the xml and xsd that was passed in */
if chTable:DecriptiveName = "XML" then
chTable:SetTableLocation(
chTable:Location, /* name of table */
"", /* not sure what this parameter is */
lv-data). /* the datasource connection string */
end. /* loop through tables */
end. /* report has a table */
/* read in records from the datasource to the report */
chReport:ReadRecords().
/* set some attributes on the Crystal report viewer, and then view the
report */
chViewer:DisplayTabs = false.
chViewer:ReportSource = chReport.
chViewer:ViewReport().
end procedure.