SSRS report development using Report Data Provider (RDP) Class [AX 2012]
Overview
There are multiple methods to develop
SSRS reports in Microsoft Dynamics AX 2012. This tutorial will guide you in
developing Report Data Provider (RDP) based SSRS reports.
RDP based SSRS Reports are used when
complex business logic cannot be achieved using AOT query.
Important Concepts
1. Report Data
Provider (RDP) Class
Report Data Provider Class is an X++
class that is used to access and process data for a SSRS report. The RDP class
processes the business logic based on a specified parameter and/or query and
returns a dataset to the reporting services. In order to create a RDP class in
AX, you have to extend that class with SRSReportDataProviderBase. This
tells AX that this class will be used by reporting services to process the
data.
Two important attributes are used in
RDP classes:
1.
SRSReportQueryAttribute: specifies which AOT query will be
used in this report. If the RDP class uses an AOT query to process data, define
this attribute at the beginning of the class.
2.
SRSReportParameterAttribute: defines the data contract class that
will be used by this report to prompt for parameter values. If the RDP class
contains any parameters this define this attribute at the beginning of the
class.
Both the attributes are optional. If
the report does not use any query or does not want any parameter to filter
report data, these attributes do not need to be used.
2. Data Contract Class
A data contract class is an X++ class
which contains parm methods with the DataMemberAttribute defined
at the beginning of the method. This class is used to define one or more
parameters that will be used in a SSRS report.
3. Table
An AX table is used as the dataset to
store data for the report. The RDP class processes the data and stores it in
the table which is then used by a SSRS report to render data.
A table can be a temporary table (InMemory
or TempDB) or a regular table, but it is Microsoft best practice to use
a temporary table.
The type of temporary table is based
upon the performance considerations. InMemory temporary table is used
when the data set is small, while TempDB is normally used for larger
datasets to improve performance.
Scenario
As part of this tutorial, the report
will print a list of customers and their invoiced sales order counts.
Steps
1. First of all, create a temporary
table. Open AOT à Date Dictionary à Tables.
2. Right Click on Tables and create a
new Table called CustReportRDPDemoTmp.
3. Set the TableType property to InMemory.
This will define the table as a temporary table.
4. Expand the CustReportRDPDemoTmp table
node and add the following fields in the table:
S. No.
|
Field name
|
Extended Data
Type
|
Label
|
1
|
CustAccount
|
CustAccount
|
|
2
|
Name
|
Name
|
|
3
|
SalesOrderInvoiceCount
|
Integer
|
Sales order
invoiced
|
5. Now create a RDP class. Go to Classes
and create a new class called CustReportRDPDemoDP by right clicking on Classes
and selecting New Class. It is a best practice to suffix the RDP class
name with DP .
6. Open the Class declaration by right
clicking on it and selecting View code.
7. Now write the following code:
1
2
3
4
5
|
class
CustReportRDPDemoDP extends SRSReportDataProviderBase
{
//Temporary table
buffer
CustReportRDPDemoTmp
custReportRDPDemoTmp;
}
|
8. Add a new method and name it getCustReportRDPDemoTmp.
This method is mandatory because reporting services uses this method to get the
table buffer containing the processed data. The SRSReportDataSetAttribute attribute
is used to indicate the temporary table name and also tells the reporting services
to use this method to retrieve the processed data.
9. Write the following code in the
method:
1
2
3
4
5
6
7
8
|
[SRSReportDataSetAttribute(tablestr('CustReportRDPDemoTmp'))]
public
CustReportRDPDemoTmp getCustReportRDPDemoTmp()
{
//select data
from table buffer
select * from
custReportRDPDemoTmp;
//return the
buffer
return
custReportRDPDemoTmp;
}
|
10. Add a new method and name it processReport.
This method contains the business logic and is called by reporting services to
generate data.
11. This method will query customer
details and fill the temporary table buffer. Write the following code in the
method:
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
|
///
/// Processes the
SQL Server Reporting Services report business logic
///
|
///
/// This method
provides the ability to write the report business logic. This method will be
called by
/// SSRS at
runtime. The method should compute data and populate the data tables that
will be returned
/// to SSRS.
///
public void
processReport()
{
CustTable
custTable;
SalesTable
salesTable;
//select all
customers
while select *
from custTable
{
//clear the
temporary table
custReportRDPDemoTmp.clear();
//assign customer
account and name
custReportRDPDemoTmp.CustAccount
= custTable.AccountNum;
custReportRDPDemoTmp.Name
= custTable.name();
//select count of
invoiced sales order of customer
select
count(RecId) from salesTable
where salesTable.CustAccount
== custTable.AccountNum
&&
salesTable.SalesStatus == SalesStatus::Invoiced;
custReportRDPDemoTmp.SalesOrderInvoiceCount
= int642int(salesTable.RecId);
//insert in
temporary table buffer
custReportRDPDemoTmp.insert();
}
}
12. Now create a new report. Since the
development of a SSRS report is done in Visual studio, we first need to create
a new project in Visual studio.
13. Open Visual studio. Go to File à New à Project
14. In the Installed templates
section select Microsoft Dynamics AX and then select Report Model
in the right pane. Name the project RDPBasedDemo and press Ok.
15. Now add a new report in the project
by right clicking on the project RDPBasedDemo à Add à Report.
16. A report will be added to the project
with the name Report1. Rename the report RDPBasedDemo.
17. Now double click the report to open
it.
18. The description of the individual
node is given below:
a. Datasets: Datasets retrieve data from RDP
class. It acts as a bridge between AX and the SSRS report. Only the fields
added in the datasets can be used in a report.
b. Designs: It defines the layout of the report.
c. Images: It contains the images that you want
to display in the SSRS report.
d. Data Methods: It contains the business logic which
can then be used in the report.
e. Parameters: It is used to apply filtering to the
data in a report. All the parameters defined in the data contract class are
automatically added here when the RDP class is defined in the datasets.
19. Now you will want to create a new
Dataset by right clicking Datasets àAdd Dataset. Name it CustDetail.
20. Select the CustDetail dataset
and open the properties window. Set the Data Source Type to Report
Data Provider. Then select the Query field. An ellipse button
appears. Click it to open a dialog box.
21. This dialog box lists all the RDP
classes present in the AOT. Select CustReportRDPDemoDP and press Next.
22. Select the fields to be displayed in
the report and press OK. Only the fields selected in this dialog box can
be shown in the report.
23 There are two types of designs that
can be created in a SSRS report:
a. Auto design: Visual studio automatically creates
a design based on the dataset provided. Auto design is the preferred method
because it is easy and usually fulfills the majority scenarios.
b. Precision Design: This is used when you need custom
placement of fields or the layout of the report is too complex.
24. In this demo we will use Auto Design.
Now right click the Designs nodeàAdd àAuto Design. A new design is added. Rename it Design. It
is recommended that you set the name of the Design to either ‘Design‘ or
‘Report‘.
25. Now drag the CustDetail form
to the Datasets node and drop it on the Design node. A table will
be created which contain all the fields present in the data set. These fields
will appear in the same order as in the report. So if you want to arrange the
fields, right click the field and select either ‘move up’ or ‘move down’.
26. Now we have to define the layout of
the report. Visual studio provides built in templates. Select the Design and
open the properties window. Select ReportLayoutStyleTemplate in the LayoutTemplate
field. Give a suitable title to the report.
27. Select CustDetailTable under
the Design node and open the properties window. Select TableStyleAlternatingRowsTemplate
in the Style Template field.
28. The report is now completed and can
be viewed. To preview the report, select the Design node, right click it and
select preview.
29. Select the Report tab. To view the report.