Question
“I am registering form based reports with my report server. How can I use ReportModuleVolume event-handlers to control processing on the server?”
Solution
This example defines a TmyReportModuleVolumeController class that manages the ReportModuleVolume.
The ReportModuleVolume is created implicitly by the report catalog when report forms are registered.The ReportModuleVolumeController reads the report volume instance from the catalog and then assigns event-handlers used to control custom processing on the server.
Download: ReportModuleVolumEventHandlers.zip
Sample Delphi code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
type TmyReportVolumeController = class private procedure AttachEventHandlers(aReportVolume: TrsReportVolume); procedure ehOnGetDirectory(Sender: TObject; aEventParams: TrsGetDirectoryEventParams); procedure ehOnGetReportParameters(Sender: TObject; aEventParams: TrsGetReportParametersEventParams); procedure ehAuthenticateReportAccess(Sender: TObject; aEventParams: TrsAuthenticateReportAccessEventParams); public constructor Create; virtual; class function GetVolumeFromCatalog: TrsReportModuleVolume; class function VolumeName: String; class procedure RegisterReports; class procedure Initialize; class procedure Finalize; end; implementation var uVolumeController: TmyReportVolumeController; {******************************************************************************} { } { C L A S S M E T H O D S } { } {******************************************************************************} {TmyReportVolumeController.VolumeName} class function TmyReportVolumeController.VolumeName: String; begin Result := 'Report Forms'; end; {TmyReportVolumeController.RegisterReports} class procedure TmyReportVolumeController.RegisterReports; begin {register the report forms} TrsReportCatalog.RegisterReport(VolumeName, 'Customers\Customer List', 'ppReport1', Tfrm001CustomerList); TrsReportCatalog.RegisterReport(VolumeName, 'Fish\Biolife', 'ppReport1', Tfrm002Biolife); TrsReportCatalog.RegisterReport(VolumeName, 'Customers\Orders\Order List', 'ppReport1', Tfrm003OrderList); TrsReportCatalog.RegisterReport(VolumeName, 'Portfolio\Sections', 'ppReport1', Tfrm004Sections); TrsReportCatalog.RegisterReport(VolumeName, 'Customers\Orders\Customer Order Item', 'ppReport1', Tfrm005CustomerOrderItem); end; {TmyReportVolumeController.Initialize} class procedure TmyReportVolumeController.Initialize; begin {this method is called from the Intialization section of this unit.} RegisterReports; uVolumeController := TmyReportVolumeController.Create; end; {TmyReportVolumeController.Finalize} class procedure TmyReportVolumeController.Finalize; begin {this method is called from the Finalization section of this unit.} uVolumeController.Free; end; {TmyReportVolumeController.GetVolumeFromCatalog} class function TmyReportVolumeController.GetVolumeFromCatalog: TrsReportModuleVolume; var lVolumeEntry: TrsCatalogVolumeEntry; begin {read the volume entry from the catalog} lVolumeEntry := TrsCatalogVolumeEntries.Read(VolumeName); {use the volume proxy to access the report volume instance} if (lVolumeEntry <> nil) and (lVolumeEntry.Proxy is TrsReportModuleVolumeProxy) then Result := TrsReportModuleVolumeProxy(lVolumeEntry.Proxy).Volume else Result := nil; end; {******************************************************************************} { } { C O N S T R U C T O R } { } {******************************************************************************} constructor TmyReportVolumeController.Create; begin inherited Create; AttachEventHandlers(GetVolumeFromCatalog); end; procedure TmyReportVolumeController.AttachEventHandlers(aReportVolume: TrsReportVolume); begin {assign event-handlers} aReportVolume.OnGetDirectory := ehOnGetDirectory; aReportVolume.OnGetReportParameters := ehOnGetReportParameters; aReportVolume.OnAuthenticateReportAccess := ehAuthenticateReportAccess; end; {******************************************************************************} { } { R E P O R T V O L U M E E V E N T H A N D L E R S } { } {******************************************************************************} procedure TmyReportVolumeController.ehAuthenticateReportAccess( Sender: TObject; aEventParams: TrsAuthenticateReportAccessEventParams); begin messagebeep(0); end; procedure TmyReportVolumeController.ehOnGetDirectory(Sender: TObject; aEventParams: TrsGetDirectoryEventParams); begin messagebeep(0); end; procedure TmyReportVolumeController.ehOnGetReportParameters( Sender: TObject; aEventParams: TrsGetReportParametersEventParams); begin messagebeep(0); end; {******************************************************************************} { } { I N I T I A L I Z A T I O N / F I N A L I Z A T I O N } { } {******************************************************************************} initialization TmyReportVolumeController.Initialize; finalization TmyReportVolumeController.Finalize; |