Well obviously, you may have tried to use the Crystal Reports VCL component inside a Delphi ISAPI webserver application, and crashed and burned repeatedly. It took my a long time to properly integrate Crystal reports inside an Isapi application with Borland / CodeGear 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 very viable. Especially if you have a ton of Crystal reports you’d like your users to be able to download in .Doc or .PDF, or other printer friendly formats. Crystal Reports is a great reporting tool, and Isapi is a great, fast web serving technology.
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 all of the import units object names, because they will try to replace Delphi existing types!!!
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 H
andled
: 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;
———————————————————————————