Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ...
- uses
- CrystalActiveXReportViewerLib11_5_TLB, OleAuto;
- ...
- procedure TForm1.Button1Click(Sender: TObject);
- var
- cry : TCrystalActiveXReportViewer;
- oRpt, oApp : variant;
- i : integer;
- frm : TForm;
- begin
- cry := TCrystalActiveXReportViewer.Create(Self);
- oApp := CreateOleObject('CrystalRuntime.Application');
- oRpt := oApp.OpenReport('c:my_report.rpt',1);
- for i := 1 to oRpt.Database.Tables.Count do begin
- oRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := 'username';
- oRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := 'password';
- end;
- frm := TForm.Create(Self);
- try
- cry.Parent := frm;
- cry.Align := alClient;
- cry.ReportSource := oRpt;
- cry.ViewReport;
- frm.Position := poOwnerFormCenter;
- frm.ShowModal;
- finally
- FreeAndNil(frm);
- end; //try-finally
- end;
- procedure TForm1.btnExportClick(Sender: TObject);
- var
- cry : TCrystalActiveXReportViewer;
- oRpt, oApp : variant;
- i : integer;
- begin
- //Export the report to a file
- cry := TCrystalActiveXReportViewer.Create(Self);
- oApp := CreateOleObject('CrystalRuntime.Application');
- oRpt := oApp.OpenReport(c_DBRpt,1);
- for i := 1 to oRpt.Database.Tables.Count do begin
- oRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := 'username';
- oRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := 'password';
- end;
- oRpt.ExportOptions.FormatType := 29; //excel 8
- oRpt.ExportOptions.DiskFileName := 'c:output.xls';
- oRpt.ExportOptions.DestinationType := 1; //file destination
- //Export(False) => do NOT prompt.
- //Export(True) will give runtime prompts for export options.
- oRpt.Export(False);
- end;
- {
- Class to facilitate the display of Crystal 11 Reports.
- The Crystal 11 VCL component does not seem to work with Delphi 2007.
- As a result, we have to use ActiveX objects, which make deployment messy.
- This class is similar to CrystalReporter, but it works for Crystal 11.
- However, it lacks some of the features of the old CrystalReporter.
- Refer to the crystal reports activex technical reference to duplicate the
- missing functionality.
- Example usage is at the bottom of this unit.
- //}
- unit CrystalReporter11;
- interface
- uses
- CrystalActiveXReportViewerLib11_5_TLB, OleAuto, Classes, Controls;
- type
- TCryExportFormat = (
- XLS
- ,PDF
- );
- type
- TCrystalReporter11 = class
- private
- FCryRpt : TCrystalActiveXReportViewer;
- FRpt, FApp : variant;
- FReportFile, FUsername, FPassword, FServer, FFilters : string;
- FOwner : TComponent;
- procedure SetLoginInfo(const username, password, server : string);
- function GetFilterConds: string;
- procedure SetFilterConds(const Value: string);
- public
- property FilterConditions : string read GetFilterConds write SetFilterConds;
- procedure ExportToFile(ExportFileName : string;
- FileExportFmt : TCryExportFormat; PromptForOptions : boolean);
- procedure Display;
- constructor Create(AOwner : TComponent; ReportFile : string); overload;
- constructor Create(AOwner : TComponent; ReportFile,
- Username, Password, Server : string); overload;
- end;
- implementation
- uses
- SysUtils, Forms;
- const
- //these are taken from pgs 246 and 247 of the technical reference
- c_FmtCode_Excel = 29;
- c_FmtCode_PDF = 31;
- constructor TCrystalReporter11.Create(AOwner: TComponent; ReportFile: string);
- begin
- inherited Create;
- try
- FReportFile := ReportFile;
- if FileExists(FReportFile) then begin
- FOwner := AOwner;
- FCryRpt := TCrystalActiveXReportViewer.Create(AOwner);
- FApp := CreateOleObject('CrystalRuntime.Application');
- FRpt := FApp.OpenReport(FReportFile,1);
- FFilters := FRpt.RecordSelectionFormula;
- end
- else begin
- raise Exception.Create('Report file ' + ReportFile + ' not found!');
- end;
- except on e : exception do
- raise;
- end; //try-except
- end;
- constructor TCrystalReporter11.Create(AOwner: TComponent; ReportFile, Username,
- Password, Server: string);
- begin
- Create(AOwner,ReportFile);
- FUsername := Username;
- FPassword := Password;
- FServer := Server;
- SetLoginInfo(FUsername,FPassword,FServer);
- end;
- procedure TCrystalReporter11.Display;
- var
- rptForm : TForm;
- begin
- SetLoginInfo(FUsername,FPassword,FServer);
- FCryRpt.ReportSource := FRpt;
- rptForm := TForm.Create(FOwner);
- try
- FCryRpt.Parent := rptForm;
- FCryRpt.Align := alClient;
- FCryRpt.ViewReport;
- rptForm.Position := poOwnerFormCenter;
- rptForm.WindowState := wsMaximized;
- rptForm.Caption := ExtractFileName(FReportFile);
- rptForm.ShowModal;
- finally
- FreeAndNil(rptForm);
- end; //try-finally
- end;
- procedure TCrystalReporter11.ExportToFile(ExportFileName : string;
- FileExportFmt : TCryExportFormat; PromptForOptions : boolean);
- begin
- case FileExportFmt of
- XLS : FRpt.ExportOptions.FormatType := c_FmtCode_Excel;
- PDF : FRpt.ExportOptions.FormatType := c_FmtCode_PDF;
- end; //case
- FRpt.ExportOptions.DiskFileName := ExportFileName;
- FRpt.ExportOptions.DestinationType := 1; //file destination
- FCryRpt.ReportSource := FRpt;
- FRpt.Export(PromptForOptions);
- end;
- function TCrystalReporter11.GetFilterConds: string;
- begin
- Result := FFilters;
- end;
- procedure TCrystalReporter11.SetFilterConds(const Value: string);
- begin
- FFilters := Value;
- if 0 < Length(Trim(FFilters)) then begin
- FRpt.RecordSelectionFormula := Value;
- end;
- end;
- procedure TCrystalReporter11.SetLoginInfo(const username, password,
- server : string);
- var
- i : integer;
- begin
- //set user name and password
- //crystal only accepts these values if they are CONST params
- for i := 1 to FRpt.Database.Tables.Count do begin
- FRpt.Database.Tables[i].ConnectionProperties.Item['User ID'] := username;
- FRpt.Database.Tables[i].ConnectionProperties.Item['Password'] := password;
- try
- {
- Some reports use direct connections, and others use an ODBC Data Source.
- Crystal XI uses a different label to refer to the database name in each
- method.
- I don't know how to determine in advance which method is being used, so:
- First, we try the direct connection.
- If that fails, we try the "data source" method.
- Reference: "Crystal Reports XI Technical Reference", pages 41 thru 46;
- "Common ConnectionProperties"
- }
- FRpt.Database.Tables[i].ConnectionProperties.Item['Server'] := server;
- except on E: Exception do
- FRpt.Database.Tables[i].ConnectionProperties.Item['Data Source'] := server;
- end;
- end;
- end;
- {
- Example usage:
- procedure TForm1.btnShowRptDBClick(Sender: TObject);
- var
- cry : TCrystalReporter11;
- begin
- cry := TCrystalReporter11.Create(Self,'c:my_report.rpt','username',
- 'password','server.domain.com');
- try
- cry.Display;
- finally
- FreeAndNil(cry);
- end;
- end;
- }
- end.
Add Comment
Please, Sign In to add comment