Module 6: Upgrade Reports Module Overview: Objectives
Module 6: Upgrade Reports Module Overview: Objectives
Module Overview
In Microsoft Dynamics® NAV 2013, you can create reports or you can import
reports from earlier versions of Microsoft Dynamics NAV. Typically, reports from
an earlier version are migrated to Microsoft Dynamics NAV 2013. To avoid the loss
of work, this module explains how to migrate reports to Microsoft Dynamics NAV
2013.
Objectives
Upgrading a Report
In Microsoft Dynamics NAV 2009, a report object can contain the following
combinations of components:
In Microsoft Dynamics NAV 2013, a report object can contain only an RDLC layout
and request page.
If you import a report from Microsoft Dynamics NAV 2009 that has both the
classic report layout and the RDLC report layout, then you must upgrade that
report. In Microsoft Dynamics NAV 2013, you can compile. However, you cannot
run or design a report that has a classic report layout. When you upgrade a report,
the classic report layout and the Request form are deleted. Then, the field
information from the report sections is converted to a dataset definition that is
valid for Microsoft Dynamics NAV 2013 reports. Dynamics NAV 2013 uses RDLC
2008 and this implies an adjustment and modification to convert and upgrade of
the RDLC XML source file.
You can have reports that do not have RDLC layouts. For example, you could have
deleted the RDLC layout from a report so that you could view the Classic layout
only. You can also have a report from a version that is from an earlier version of
Dynamics NAV. If this is the case, your report does not contain an RDLC layout or
a request page. If you import a report that has only a Classic report layout and
request form, then when you upgrade the report, an RDLC report layout is created
automatically. You can create a request page for the report or you can use the
form transformation tool to transform a request form to a request page.
The steps that are required to upgrade a hybrid report are outlined in the
following flowchart.
A processing only report is a report without a layout. The report does not produce
any printed output. This type of report processes data. The steps that are required
to upgrade a processing only report are outlined in the following flowchart.
A Classic report is a report that contains a Classic layout but no RDLC layout.
The steps that are required to upgrade a Classic report are outlined in the
following flowchart.
Before you upgrade reports, it is recommended that you create a backup of the
reports. You cannot undo the upgrade after it is finished. To back up reports, use
one of the following methods:
Note: Verify that you have Visual Studio 2010 installed. This includes the
Visual Web Developer feature. You can use any of the following editions of Visual
Studio 2010:
• Premium
• Ultimate
Before you manually update the new RDLC report layout, you should analyze and
understand the report. Sometimes you can achieve the same result by using
different functionality in the RDLC layout than in the Classic report layout. By
understanding the report and the features that are available in Visual Studio
Report Designer, you can determine the manual modifications that you must
make to the new RDLC report layout. For example, the filtering can be managed
in the development environment or in the Visual Studio Report Designer.
Additionally, you should understand how the dataset that contains the data that is
displayed in the report is generated. For a Classic report layout, the data for each
data item is retrieved from the data item and it is formatted in the report
sequentially. For example, if you run an Order Confirmation report for multiple
sales orders and the data for the first order is retrieved and formatted for the
Classic report layout, then the data for the second order is retrieved and
formatted, and so on.
More information about the generation of the dataset is available in the “Creating
Reports” module.
You must understand the dataset to understand the report and know how to
debug it. Report performance is an important concept of report design, especially
when you upgrade a report. Optimizing the dataset of a report usually means
minimizing the dataset. The fewer rows that are located in the dataset at run time,
the quicker the report will execute and fewer memory resources are consumed.
When a report dataset grows, the application will consume increased memory and
then when memory is no longer available, the report execution fails. To avoid this
scenario, you can optimize the dataset by following these guidelines.
In reports that are upgraded from earlier versions of Microsoft Dynamics NAV
2013, the field captions are columns of the dataset. To have the caption of a field,
title for a chart, or a title for the report, translated into the user’s language at run
time, the field is added as a column in the dataset. In the Microsoft Dynamics
NAV 2013 Report Dataset Designer, you can use labels instead. You can add labels
that are related to another data item, such as the caption for a table field, or
labels that are not related to another data item, such as the title of the report.
Labels are passed as parameters to the report. The Label Report Parameter figure
shows an example.
Note: In Visual Studio Report Designer, if you want to use the Caption or
CaptionML values of a field as a label on a report layout, then you must include
the caption in the dataset. You design the dataset by using Report Dataset
Designer. When you add table fields to the dataset with Report Dataset Designer,
you can set the IncludeCaption property to Yes to specify that the caption for the
field is also added to the dataset. If you do not include the caption in the dataset,
then in a multilanguage application, you cannot change the language of the labels
in the report.
You can set the IncludeCaption property in the Properties window of a data item
or in the IncludeCaption column of Report Dataset Designer for a data item or a
column. If you set the IncludeCaption column of a data item, then the
IncludeCaption property is set to Yes for every child column of the data item.
A column in the report dataset designer will become a column in the result set
that is generated at run time. If the field is not used or not required to be
available in the resultset, it should be removed from the report dataset designer.
This reduces memory consumption and provides improved report execution.
Avoid the usage of binary large object (BLOB) fields in the dataset
A BLOB field can potentially contain 2gb of data. Adding it to the report dataset
can potentially increase the size of the dataset significantly. When a BLOB field, for
example the company logo, is required in the dataset it is recommended to use a
separate integer data item to hold the BLOB field(s). You can filter the integer
dataitem in its DataItemTableView property by using this filter:
WHERE(Number=CONST(1))
If a data item is in the Report Dataset Designer for calculations only, and its fields
are not required for the dataset, consider using the DataItemTable view property
of the data item to filter the data item.
Filters can be applied in the RDLC layout of a report. All report data regions in
Visual Studio Report Designer can be used for filtering at run time. However, if the
same result can be achieved by applying filters in the Report Dataset Designer, by
using properties or C/AL code, it will produce a smaller dataset and improve
report execution performance. Filter, sort, and aggregation is more efficient on
the data source than during report processing.
When a report is executed, the dataset is sent from the Microsoft Dynamics NAV
server into the memory on the server. If the dataset exceeds the memory
Windows makes available, then Windows will stop allocating additional memory
and the client might stop responding. If you cannot reduce the dataset, then the
only alternative is to increase available memory on the server.
Best Practice: Windows can handle the size of the page file for general
Windows performance. So interfering with this can cause problems for any other
tasks that are running on that server. So if you do decide to increase the page file,
then it recommended that you do this on a dedicated server that is used to print
only large reports.
Demonstration Steps
Note: Finding the correct values for the initial size and maximum size could
require several tries.
Changing the page file settings does not affect the performance of reports.
However, by doing this, the client can receive more data before it runs out of
memory.
In Microsoft Dynamics NAV 2013, for reports, the standard application uses new
Report Design Guidelines. This provides consistency to reports. Now when you
design a report, other developers will be familiar with the appearance of the
report, and they will no longer have to invent a new appearance for each report.
Additionally, the Report Design Guidelines will help you save time when you
design reports.
More information about the Report Design Guidelines is available in the “Creating
Reports” module of this course.
For report items with conditional visibility, the report processor must apply
grouping, sorting, and filtering expressions even if only top level data is visible.
Although on-demand processing optimizes data evaluation by processing only
visible data, all data is part of the report. If the user only wants to have detail data
visible sometimes, a drill down report is a better choice.
Consider how much data is needed for a chart or gauge. Typically, having more
pixels on a monitor will decrease performance and the visual display of graphics. It
is recommended not to have more than seven or eight sections in a pie chart.
Some charts, such as, scatter graphs, benefit from many data points, whereas
other charts, such as pie charts, are more effective with fewer data points.
Therefore, carefully select a chart type based on the values in your dataset and
how you want this information to be shown.
• When you use a pie chart, merge small sections into one section
called "Other." This reduces the number of sections on your pie chart.
• When there are several data points, do not use data point labels. Data
point labels are most effective when there are only a few points on
the chart.
• Filter unwanted or irrelevant data. This helps highlight the key data
that you are trying to show on the chart.
• If you want to add a bar graph to show ratio data in a table or matrix
template, consider using a linear gauge instead. Gauges are better
suited in displaying a single value inside a cell.
When you include a reference to the built-in field [&TotalPages], the report
processor must paginate the whole report before it can render the first page. If no
reference to [&TotalPages] exists, the first page can be rendered and returned to
the user immediately, without processing the rest of the report. Additionally, the
report processor assumes that any complex expression in the page header or
footer might contain a direct or indirect reference to [&TotalPages].
To avoid having the report processor paginate a lengthy report, do not include a
reference to [&TotalPages] or any complex expressions in the page header and
page footer.
Many levels of nested and adjacent groups in a Tablix data region can affect
report processing performance. Consider the level of grouping, the number of
group instances, and the aggregate functions that require being evaluated after
group, filter, and sort expressions are applied. For example, Previous is an
'expensive' aggregate function because its value depends on the sorted elements
of a data region; Sum is not order-dependent and requires fewer resources. Other
post-sort aggregates include First and Last.
Some features are not supported in all renderers. If the primary format for viewing
a report is a specific file format, you might have to modify the report design for a
better viewing experience for the user.
For example, each page break defines a new sheet in Excel. Each sheet can handle
no more than 65000 rows. Consider these limits when you set the page breaks in a
report.
For exporting to Excel, do not merge cells in a Tablix data region. In free form
reports, align report items vertically. Merged cells and unaligned report items
interfere with Excel functionality in the exported report.
For better report performance, use the following information to help increase the
time that is required to process your report:
• For reports that have many instances of text boxes, set CanGrow and
CanShrink on text boxes to FALSE. By default, each cell in a Tablix
data region contains a text box so that the total number of text boxes
that must be rendered can grow quickly.
• For reports that have many images, set AutoSize on images to a
different value such as Fit.
• For text boxes, do not set the property TextAlign to General. This
value requires conditional processing, depending on the text box
content.
• Do not use horizontal page breaks when they are not required.
Review the margins, column widths, and white space in a report. For
example, render the report to a .TIFF file and view it in the Microsoft
Windows Picture and Fax viewer to determine whether additional
pages are being rendered.
• Set the KeepTogether property on Tablix members only when you
must control the specific rendering behavior for a Tablix data region.
The KeepTogether feature requires additional processing when page
breaks are calculated.
If you have hidden fields on a report, it is recommended that you mark them so
that they are easy to identify. Additionally, you might want to move hidden fields
to a different location in the layout to avoid problems with formatting.
Note: If the hidden text box is in a table data region, it is recommended that
you insert a new row in the table and add the hidden text box to this new row. In
the Properties window of the row, under Layout, you change the value of the
Height property to a larger value so that you can view the row when you design the
report. However, make sure that the value is not so large that it will cause
formatting problems when you print the report, such as 0.2cm.
6. Select the text box that you created. On the View menu, click the
Properties window.
7. In the Properties window, under Font, set the Color property to
Yellow, or select the yellow square from the drop-down list.
8. In the Properties window, under Position, expand Size, and then set
the Width property to a small width, such as 0.15cm.
9. In the Properties window, under Visibility, set the Hidden property to
True.
10. On the File menu, click Save Report.rdlc.
If you apply a filter to the data in a report, then it is recommended that you create
an additional header row in the report to display the filter. You display this header
row only if the user specifies a filter. If no filter is specified, then the filter header is
not displayed.
To conditionally display the filter header, you must add a filter variable to the
report dataset. Next, in the RDLC report layout, create a conditional expression on
the visibility of the filter header that uses the filter variable that you added to the
dataset.
CustFilter := Customer.GETFILTERS;
7. In Report Dataset Designer, under the DataItem for the table to which
a filter can be applied, add a new line.
8. In the Data Type field of the new line, select Column.
9. In the Data Source field of the new line, enter the name of the filter
variable.
10. On the File menu, select Save.
11. In the Save dialog box, verify that Compiled is checked, and then
click OK.
12. On the View menu, select Layout.
13. In Microsoft Visual Studio, in the Report.rdlc file, add a text box to
display the filter header.
14. Select the filter header text box, and then on the View menu, select
the Properties window.
15. In the Properties window, expand the Visibility field.
16. In the Hidden field, select <Expression…> from the drop-down list.
17. In the Expression window, create a conditional statement. For
example, the following are the conditional statements for the two
filter text boxes on report 113.
=IIF(First(Fields!CustFilter.Value) = "",TRUE,FALSE)
IIF(First(Fields!ItemLedgEntryFilter.Value) = "",TRUE,FALSE)
After you upgrade the report to Microsoft Dynamics NAV 2013, you must create
the request page.
A request page runs before the report starts to execute. You can use a request
page to specify options and filters for a report.
You can design the Options FastTab of a request page by using Request
Options Page Designer in the development environment. To access Request
Options Page Designer, open Report Dataset Designer, click View, and then select
Request Page.
You can design the filters on request pages by using the following report
properties:
• ReqFilterHeading
• ReqFilterHeadingML
• ReqFilterFields
• Print
• Preview
• Cancel
• Help
The fields that you define as ReqFilterFields are shown on the request page.
Additionally, an end-user can add more fields on which to filter to the request
page.
Best Practice: It is recommended that you add fields that the end-users of
the report will frequently set filters on.
By default, for every data item in the report, a FastTab for defining filters and
sorting is created on the request page. To remove a FastTab from a request page,
do not define any ReqFilterFields for the data item and set the
DataItemTableView property to define sorting. The request page is displayed but
there is no tab for this data item.
If a DataItemTableView is not defined, then users can select a sort field and sort
order at run time.
If you set UseReqPage to No., then the report starts to print as soon as it is run.
Here, end-users cannot cancel the report run. The report can be canceled.
However, some pages might print.
You can use report usage logging to identify both frequently and rarely used
reports in a customer installation. This information can be useful when you must
determine which Classic reports should be transformed to RDLC reports. This only
works in previous version(s) of Dynamics NAV. A custom development could be an
alternative to this solution.
To log report usage, you must have a hotfix installed. It can be downloaded here:
KB2575296
http://go.microsoft.com/fwlink/?LinkId=267332
KB2558650
http://go.microsoft.com/fwlink/?LinkId=267333
After you install the required hotfix, to set up report usage logging, follow these
steps.
Code example
OBJECT-PROPERTIES
Date=11-06-12;
Modified=Yes;
Version List=NAV6;
PROPERTIES
FIELDS
MinValue=1 }
CaptionML=ENU=User ID }
CaptionML=ENU=Report Name }
KEYS
{ ;No. ;Clustered=Yes }
FIELDGROUPS
CODE
BEGIN
END.
2. Open Codeunit 1.
3. Open “C/AL Globals”.
4. Browse to ”Functions”.
5. Create a new function that uses the Name: OnReportRun.
6. Open Properties and change ID to 120.
7. Now open Locals and create the parameter= ReportId with
Type=Integer.
8. Select the Variables tab and create a ReportLog.
Now you must write the code for this new trigger.
Code example
ReportLog.INSERT;
Simon will upgrade the Classic report. This process deletes the request form,
automatically creates an RDLC report layout, and upgrades the report to be valid
for Microsoft Dynamics NAV 2013. Simon uses the following procedure to import
a Classic-only report and upgrade it.
Detailed Steps
1. Import a Classic report.
a. In the development environment, on the Tools menu, click
Object Designer.
b. In Object Designer, on the File menu, click Import.
c. In the Import Objects window, browse to the report object that
contains only the Classic report layout (R101.fob), and then click
Open.
d. If you are prompted, click OK to open the Import worksheet to
resolve any conflicts. Then click OK in the Import Worksheet to
import the report.
Detailed Steps
1. Upgrade a Classic report.
a. In Object Designer, click Report, select Report 101, Customer
List. This is the list that you imported in the previous step, and
then click Upgrade Reports.
b. In the dialog window, click Yes to confirm that you want to
upgrade the report.
Hidden fields in the RDLC report layout will cause formatting problems when
Simon prints the report because these fields are outside the width of standard
paper. To eliminate the formatting problems, Simon must move these hidden
fields to another location on the report that is within the width of standard paper.
Detailed Steps
1. Open the report in Visual Studio Report Designer.
a. In Object Designer, select report 101, click design, click View,
and then click Layout.
b. Visual Studio Report Designer opens.
Detailed Steps
1. Move the hidden fields.
a. In Visual Studio, in the Report.rdlc file that is created, in the Body
section of the layout, select the following hidden fields on the
right side of the table:
=FIELDS!COMPANYNAME.VALUE
=FIELDS!Customer__ListCaption.VALUE
=FIELDS!CurrReport_PAGENOCaption.Value
Detailed Steps
1. Add the functionality from the section trigger.
a. In Visual Studio, on the View menu, click the Properties window.
b. In the Report.rdlc file, in the Body section of the layout, select the
field at the top of the layout with the following value:
=First(Fields!Customer_TABLECAPTION__________CustFilter.Value)
=IIF(Fields!CustFilter.Value<>"",False,True)
e. Click OK.
In the upgraded report the captions are a part of the dataset. Mort will now
optimize the report that has the property Include Caption and uses labels.
Detailed Steps
1. Enable the Include Caption property.
a. In the Report Dataset Designer select the field that has the name
Customer__No__ and then click Include Caption to enable it.
b. Repeat this step for the following fields:
Customer__Customer_Posting_Group_
Customer__Customer_Disc__Group_
Customer__Invoice_Disc__Code_
Customer__Customer_Price_Group_
Customer__Fin__Charge_Terms_Code_
Customer__Payment_Terms_Code_
Customer__Salesperson_Code_
Customer__Currency_Code_
Customer__Credit_Limit__LCY__
Customer__Balance__LCY__
Customer_Contact
Customer__Phone_No__
Customer__Balance__LCY___Control42
Detailed Steps
1. In the Report Label Designer add labels.
a. Add a label with the Name: Total__LCY_CaptionLbl and Caption:
<Total (LCY)>.
b. Remove the corresponding line in the Report Dataset Designer.
Simon must save the RDLC layout, and he must also save and compile the changes
in the Microsoft Dynamics NAV 2013 development environment.
Detailed Steps
1. Save the report.
a. In Visual Studio, on the File menu, click Save report.rdlc.
b. Close Visual Studio.
c. In the Microsoft Dynamics NAV 2013 development environment,
select an empty line in Report Dataset Designer. You receive the
following message:
d. Click Yes to load the changes that you made to the RDLC report
layout.
e. On the File menu, click Save.
f. In the Save dialog box, select Compiled, and then click OK.
g. Close the report in Object Designer.
Objectives
• Import and upgrade a report that has only a Classic report layout to a
Microsoft Dynamics NAV 2013 report that has an RDLC layout.
• Modify the RDLC report layout.
• Save the layout and compile the report.
Simon will now upgrade the Classic report. This process will delete the request
form, automatically, create an RDLC report layout, and upgrade the report to be
valid for Microsoft Dynamics NAV 2013.
Detailed Steps
1. Import a Classic report.
a. In the development environment, on the Tools menu, click
Object Designer.
b. In Object Designer, on the File menu, click Import.
c. In the Import Objects window, browse to the report object that
contains only the Classic report layout for report R123456707,
and then click Open.
d. If you are prompted, click OK to open the Import worksheet to
resolve any conflicts.
Detailed Steps
1. Upgrade a Classic report.
a. In Object Designer, click Report, select Report 123456707,
Customer Order Summary (this is the report that you imported
in the previous step), and then click Tools, Upgrade Reports.
b. In the dialog window, click Yes to confirm that you want to
upgrade the report.
c. In the Tools menu, click Compile to compile the report that you
upgraded in the previous step.
The “Customer – Order Summary Print Preview” illustration shows the RDLC report
layout for report 123456707, Customer Order Summary, after you upgrade
the report but before you perform any manual modifications.
The RDLC report layout for the Customer Order Summary report that is created
when Simon upgraded the report does not contain all the lines that are required
to be displayed in the report. Simon must make some modifications to the report
layout.
Detailed Steps
1. Open the report in Visual Studio Report Designer.
a. In Object Designer, select report 123456707, click Design, click
View, and then click Layout.
b. Visual Studio Report Designer opens.
Detailed Steps
1. Move header fields out of the table.
a. In Visual Studio, in the Body of the report.rdlc file, move the table
down in the layout to provide space for two fields in the table.
b. Select the First(Fields!Outstanding_OrdersCaption.Value) field,
right-click the field, and then click Cut.
c. Right-click the area in the table and then click Paste to paste the
First(Fields!Outstanding_OrdersCaption.Value) value in a text
box that is in the table.
d. Select the First(Fields!EmptyString.Value) field, right-click, and
then select Cut.
e. Right-click the area that is in the table, under the text box in
which you performed the previous past operation and then click
Paste to paste the First(Fields!EmptyString.Value) value in a
text box.
f. Select the first two rows of the table from which you cut fields.
Right-click the row handle of the two rows, and then select
Delete Rows.
Detailed Steps
1. Update the layout.
a. In Visual Studio, on the last row of the table, right-click the field
that uses the value
=Sum(Fields!SalesAmtOnOrderLCY_3_.Value), and then click
Cut.
b. Right-click the empty field in the last row of the table that is
between the =Sum(Fields!SalesAmtOnOrderLCY_2_.Value) and
=Sum(Fields!SalesAmtOnOrderLCY_4_.Value) fields, and then
click Paste.
c. Expand the third row of the table.
d. Decrease the width of the third column of the table.
e. Select the three hidden fields on the third row of the table. These
hidden fields are in the rightmost columns of the table. The
values in the hidden fields are as follows:
=Fields!COMPANYNAME.Value
=Fields!Customer__Order_SummaryCaption.Value
=Fields!CurrReport_PAGENOCaption.Value
Note: It is recommended that you move these hidden fields from the right
side of the table in all reports for which you create an RDLC report layout. Although
the fields are hidden, white space is still allocated on the page for the fields. In some
cases, this causes problems with the print layout because of the width of the paper
and the width of the table.
h. Select the last three columns of the table from which you cut the
hidden fields.
i. Right-click the three columns, and then click Delete Columns.
Detailed Steps
1. Add data to detail lines.
a. Click in the table to make it active.
b. Right-click the blank detail row, and then click Insert Row >
Inside Group - Below.
c. Add the following values to the first blank detail line:
i. Customer_No_
ii. Customer_Name
iii. Leave the third column blank.
iv. SalesAmtOnOrderLCY_1_Control31
v. SalesAmtOnOrderLCY_2_Control32
vi. SalesAmtOnOrderLCY_3_Control33
vii. SalesAmtOnOrderLCY_4_Control34
viii. SalesAmtOnOrderLCY_5_Control35
ix. SalesOrderAmountLCY_Control36
d. Right-click the field of the detail line, and then click Expression.
e. In the Expression window, under Category, select Fields
(DataSet_Result).
For each amount value, the data that is shown must be the sum of the
lines in the dataset.
2. Obtain the sum of the lines in the dataset for each customer, by
adding a grouping property. Add the grouping property for each
detail row that you added.
a. Select the row.
b. In the Row Groups window, select Group Properties.
= not first(Fields!PrintAmountsInLCY.Value)
c. Select the second of the two rows that you added. This row does
not have the LCY values.
d. In the Properties window, expand Visibility.
e. In the drop-down list for Hidden, select <Expression>.
f. In the Expression window, change the expression to the
following:
=first(Fields!PrintAmountsInLCY.Value)
4. Show the All Amounts are in the LCY caption only when the values
are displayed in local currency.
a. Right-click the field
=First(Fields!All_Amounts_are_in_LCYCaption.Value), and
then select Properties.
b. In the Textbox Properties window, click the Visibility tab.
c. Under Initial visibility, select Expression, and then enter the
following expression in the text box:
=not First(Fields!PrintAmountsInLCY.Value)
d. Click OK.
Simon must now save the RDLC report layout, and he must also save and compile
the changes in the Microsoft Dynamics NAV 2013 development environment.
Detailed Steps
1. Save the report.
a. In Visual Studio, on the File menu, click Save report.rdlc.
b. Close Visual Studio.
c. In the Microsoft Dynamics NAV 2013 development environment,
select an empty line in the report in Object Designer. You receive
the following message:
d. Click Yes to load the changes that you made to the RDLC report
layout.
e. On the File menu, click Save.
f. In the Save window, select the Compiled check box, and then
click OK.
g. Close the report in Object Designer.
Module Review
Module Review and Takeaways
This module described the upgrade process for different report types:
• A Hybrid Report
• A Processing Only Report
• A Classic Report
The module also covered how to determine which reports to upgrade and
concluded with practical labs and real life examples on how a List report and an
Order Summary report should be upgraded.
( ) Classic
( ) Hybrid
( ) Textual
( ) ProcessingOnly
2. Which menu item is used to upgrade a report to the Microsoft Dynamics NAV
2013 RoleTailored client?
( ) Classic
( ) Hybrid
(√) Textual
( ) ProcessingOnly
2. Which menu item is used to upgrade a report to the Microsoft Dynamics NAV
2013 RoleTailored client?