SSRS Reports Using Controller Class in Developing in Microsoft Dynamics AX 2012
Overview
Controller class is used to control the report
execution as well as preprocessing of the report data. The SSRS reporting
framework uses this class to modify the report dialogs, calling the SQL Server
reporting services, as well preprocessing parameters for the report.
Following are the scenarios where Controller class
can be used:
1.
Modifying a report query based on the input data
2.
Modifying report contract data based on the input data
3.
Control a report parameters dialog
4.
Open different reports/designs from the same menu item based on the
input data
5.
Reports that are opened from a form
To create a controller class, extend it with SrsReportRunController.
Prerequisites
2.
Reporting services extensions must be installed in Dynamics AX
Sample Controller Class
1.
Create a new class. Open AOT → Classes
2.
Right Click on Classes and select New
Class. Name it as SSRSDemoController.
3.
Open the Class declaration by right clicking on it
and selecting View code.
4.
Now write the following code:
1
2
3
4
5
|
class SSRSDemoController extends SrsReportRunController
{
}
|
5.
Create a new method and write the following code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public static client void main(Args args)
{
//define the new object for controller class
SSRSDemoController ssrsDemoController;
ssrsDemoController = new SSRSDemoController();
//pass the caller args to the controller
ssrsDemoController.parmArgs(args);
//set the report name and report design to run
ssrsDemoController.parmReportName(ssrsReportStr(SSRSSessionQuery,Design));
//execute the report
ssrsDemoController.startOperation();
}
|
Examples
of Controller Class Usage
Based on different scenarios,
different methods are overridden as shown in the following examples:
1. Modifying
report query based on the input data
·
Used in those scenarios where a report query needs
to be modified based on the caller args parameters or recorded before the
report parameter dialog is rendered.
·
Override prePromptModifyContract method to modify
the report query as shown below:
1
2
3
4
5
|
public void prePromptModifyContract()
{
//add a range in the report query
SrsReportHelper::addParameterValueRangeToQuery(this.getFirstQuery(),tableNum(SSRSReportDemo),fieldNum(SSRSReportDemo,
RecId),SysQuery::value(this.parmArgs().record().RecId));
}
|
Note:
prePromptModifyContract is called by report controller before the parameter
dialog is shown to the User.
2. Modifying
report contract data based on the input data
·
Used in those scenarios where report contract
parameters need to be modified based on the caller args prior to the execution
of the report.
·
Override preRunModifyContract method to modify the
report contract as shown below:
1
2
3
4
5
6
7
8
9
10
11
|
protected void preRunModifyContract()
{
//define object for report contract
SSRSDemoContract contract;
//get the reference of the current contract
object
contract = this.parmReportContract().parmRdpContract()
as SSRSDemoContract;
//modify the parameter value of the contract
contract.parmType(this.parmArgs().parm());
}
|
Note:
preRunModifyContract is called by report controller before the report is run.
3. Control
report parameters dialog
·
In some scenarios, a report parameter dialog should
not be visible to the end user. Controller class is also used to control the
visibility of the report parameter UI.
·
Add the following code in the main method of the
controller class before startOperation method call to hide/show the report
parameter UI:
1
2
|
//hide the report parameter dialog
ssrsDemoController.parmShowDialog(false);
|
4. Open
different reports from the same menu item based on the input data
·
It is used in those scenarios where different
reports or different designs of a same report need to be opened from a same
menu item depending upon the caller args.
·
Write the following code in main method to achieve
this scenario:
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
|
public static client void main(Args args)
{
//define the new object for controller class
SSRSDemoController ssrsDemoController;
ssrsDemoController = new SSRSDemoController();
//pass the caller args to the controller
ssrsDemoController.parmArgs(args);
//if report is run from edit mode then run the
EditDesign of the report otherwise run the NewDesign of the report
if(args.parmEnum() == FormOpenMode::ForEdit)
{
//set the report name
and report design to run
ssrsDemoController.parmReportName(ssrsReportStr(SSRSSessionQuery,EditDesign));
}
else
{
//set the report name
and report design to run
ssrsDemoController.parmReportName(ssrsReportStr(SSRSSessionQuery,NewDesign));
}
//execute the report
ssrsDemoController.startOperation();
}
|
5. Reports
that are opened from a form
·
Controller class is also used when reports are
opened from a form and are needed to show selected record details.
·
Use either prePromptModifyContract method or
preRunModifyContract method to achieve this scenario.
Comments
Post a Comment