Showing posts with label WEb application. Show all posts
Showing posts with label WEb application. Show all posts

Thursday, August 14, 2008

Use Crystal Reports in Delphi ISAPI Web Application

Well obviously, you may have tried to use the VCL component, and cashed and burned repeatedly. I took my a long time to properly integrate Crystal reports with an Isapi application through delphi. After literally weeks of research in 2004 I was able to properly utilize almost all of Crystal's functionality inside an ISAPI.

Why am I just now writing about this? Well.. As time rolls on, the technology is still viable. Especially if you have a tone of Crystal reports you'd like your users to be able to download in .Doc or .PDF formats.

Here Goes...

Import the Crystal Reports type library, save it as CRAXDRT_TLB; (into new unit) This would apply to Crystal Reports version 9. Don't forget to add the "cr" in front of the object names!!!


Here's the source code example: Please forgive any poor formatting on my part I wrote an automated .Pas to HTML conversion program, in about ten minutes, and right now it's imperfect. So I will work on that program as I continue to post Delphi Tips. Thanks and enjoy.

PLEASE LEAVE ME A COMMENT IF YOU LIKE!


---------------------------------------------------------------------------------
procedure TWebModule1.WebModule1WaExportReportAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var CrReport : Report;
NewStream : TStream;
TheReportType :CRExportFormatType;
S, TheCType : String;
begin
try


//For Initilization purposes only

TheReportType:= CRAXDRT_TLB.crEFTPortableDocFormat;

//End Initialization

////Use the value of a web page radio button to determine the type of export ////the users desires.

If TheButtonVal='PDF' then begin
TheReportType:= CRAXDRT_TLB.crEFTPortableDocFormat;
TheCType:='application/pdf'
end;
If TheButtonVal='DOC' then begin
TheReportType:= CRAXDRT_TLB.crEFTWordForWindows;
TheCType:='application/doc'
end;
If TheButtonVal='XLS' then begin
TheReportType:= CRAXDRT_TLB.crEFTExcel80;
TheCType:='application/xls'
end;
If TheButtonVal='RTF' then begin
TheReportType:= CRAXDRT_TLB.crEFTExactRichText;
TheCType:='application/rtf'
end;

///You could use the actual report name added to a select element using ///Delphi's ///FindFiles...
CrReport := Application1.OpenReport('DirectoryName\'+TheReportName);

CrReport.DiscardSavedData;
CrReport.EnableParameterPrompting:=False;
CrReport.DisplayProgressDialog:=False;
if TheButtonVal='PDF' then
CrReport.ExportOptions.PDFExportAllPages;

if CrReport.ParameterFields.Count=1 then
CrReport.ParameterFields.Item[1].AddCurrentValue(Code1);
////Depending upon any parameter values the Report uses and how they are //configured, these lines could change.
if CrReport.ParameterFields.Count=2 then begin
CrReport.ParameterFields.Item[1].AddCurrentValue(Code2);
CrReport.ParameterFields.Item[2].AddCurrentValue(Code3);
end;
CrReport.ExportOptions.FormatType :=TheReportType ;
CrReport.ExportOptions.DestinationType :=CRAXDRT_TLB.crEDTDiskFile;

/////Give the created report a destination on disk, and name
CrReport.ExportOptions.DiskFileName :=

CrReport.Export(False);

NewStream:=TFileStream.Create(the name you created above),
fmOpenRead and fmShareDenyWrite);
Response.ContentStream:=NewStream;
//IMPORTANT
Response.ContentType:=TheCType;
Response.SetCustomHeader('content-disposition', 'attachment; filename=YourShortFileName));
Except
Response.SendRedirect('Your Error Handling Page')
end;
end;
---------------------------------------------------------------------------------