| By Dan Clark | Article Rating: |
|
| December 7, 2004 12:00 AM EST | Reads: |
43,288 |
With the release of Reporting Services, Microsoft has provided a truly enterprise-level reporting solution. Reporting Services provides support for the entire reporting life cycle including report authoring, report management, and report delivery. This article introduces the process of designing and customizing reports using the Visual Studio .NET integrated Report Designer. Report Designer allows .NET programmers the ability to customize and extend reporting functionality. Custom fields added to a report can include calculations, text manipulation, and expressions. If a report needs to include complex programming logic, programmers can add functions to the report through code blocks embedded into the report definition. To take advantage of the full capabilities of the .NET Framework, reports have the ability to reference external .NET assemblies. By completing the hands-on exercises in this article, you will gain an understanding of how to enhance the functionality of your reports through expressions, code blocks, and external assemblies.
Reporting Services: An Overview
Microsoft Reporting Services is a robust, cost-effective, server-based reporting tool. It consists of a middle-tier server built on top of an SQL Server back end in conjunction with a Web-based front-end running under IIS. Although Report Services relies on SQL Server for its data repository, the report data can come from any data repository that has an OLEDB, ODBC, or .NET managed provider. Microsoft even supports the ability to extend the API to write custom providers. As the product matures, you can expect to see more managed providers released by the major database vendors in the market today.
Reports are designed through a Report Designer that, when installed, integrates with Visual Studio. Using the Report Designer, programmers leverage their knowledge of .NET programming in a familiar design-time environment. Using the Report Designer, you can easily create a variety of complex reports including tabular, matrix, drill-through, and parameter-driven reports. The Report Designer renders the report in a Report Design Language (RDL) format. RDL is an open XML-based schema containing standard tags used to define the data retrieval and report layout information. By creating and storing a report in RDL format, Report Services decouples the creation of the reports from the report rendering. For example, the same RDL document can be rendered as HTML in a Web page link and as a subscription-based PDF e-mail attachment. Out of the box, Report Services supports rendering in many popular formats, such as HTML, MHTML, PDF, and Excel. Developers can also extend the rendering API to include their own rendering formats.
Creating a Report
Once installed, the Report Designer integrates with Visual Studio. A new Business Intelligence Project folder shows up in the New Projects dialog (see Figure 1). There are two options to create a report project. Creating the project using the wizard launches a series of screens that guide you through the common steps necessary for creating a standard report. The other option is to create a blank report project and run through the steps manually.
The following activity demonstrates using the Report Wizard to create a standard report:
1. Create a new project in Visual Studio. Select the Business Intelligence Project folder, name the project reportDemo1, select the Report Project Wizard template, and click OK.
2. Click the Next button on the Report Wizard welcome screen. The next screen gathers information to set up a data source for the report (see Figure 2). Data sources can be private to a particular report or shared among several reports. Create a new data source called dspubs by clicking on the Edit button. Enter the appropriate information to create a link to the pubs database in the Data Link Properties window. After testing the connection, close the window and click the Next button on the Report Wizard screen.
3. The next step is to specify the query to retrieve the data for the report. You can either type in the query string directly or click the Edit button. This launches a familiar query designer interface. Right-click the top portion of the designer to add tables. Add the authors, titleauthor, and the titles tables to the designer. Select the au_lname, au_fname, state, title, type, price, and ytd_sales columns from the tables. Right click on the top section of the designer and choose run to verify the query returns data. Click the OK button in the bottom right corner of the designer to close the window. Click the Next button on the Report Wizard screen.
4. In the Design the Table window, select the state field for the page level, the type field for the group level, and the remaining fields for the details level (see Figure 3).
5. Select a tabular report type and click the Next button.
6. Click the Next button and choose a stepped layout.
7. Click the Next button and choose a style.
8. Click the Next button, name the report authorSales, and click the Finish button.
As you can see, creating a basic report using the wizard is quick and painless. After running through the wizard, the designer presents the report in a layout screen that you can use to further refine and customize the report.
Customizing Report Fields
If you are familiar with creating reports using Access or Crystal Reports, customizing fields in the Report Designer should be intuitive. The following activity demonstrates customizing fields using the Report Designer. If you do not already have the demo report project up and running, launch the project in Visual Studio.
1. There are three tabs at the top of each report open in the report designer: Data, Layout, and Preview. Make sure you are on the Layout tab and right- click on the ytd_sales textbox and select Properties, which launches the Textbox Properties window (see Figure 4).
2. Change the format to Currency and click the Advanced button in the lower left corner of the window.
3. As you click through the tabs in the Advanced Textbox Properties window, you will notice that most properties allow you to customize the property using custom code. Click on the Font tab and select the Function button next to the size property. Enter the following Immediate If expression that changes the font based on the ytd_sales amount.
=IIF( Fields!ytd_sales.Value > 5000,"14pt"," 9pt")
4. Close the Edit Expression and the Advanced Property windows. Click on the Preview tab at the top of the report. Notice that all ytd_sales above 5,000 are rendered in a 14-point font.
5. Although the Immediate If statement is useful for Boolean test conditions, a Switch expression is useful for testing multiple conditions and works like the Select Case VB statement. To demonstrate the Switch expression click on the Price textbox in the report Layout tab. In the Properties window, click on the Color drop-down and select Expression.
6. Enter the following Switch expression that changes the color property based on the price:
=Switch( Fields!price.Value > 20,"Blue", Fields!price.Value > 15, "Green", Fields!price.Value > 5, "Red")
7. Close the Edit Expression window. Click on the Preview tab at the top of the report. You should notice the color of the price changing depending on the amount.
As you can see, adding conditional formatting to a report is easy. The cool part is that you can change almost any formatting property based on a runtime condition. You can also base your condition on any field exposed to the report. For example, see if you can change the color of an author's last name depending on what state he/she lives in.
Adding Functions to a Report
Although conditional formatting is very useful, it is somewhat limited in both scope and functionality. Suppose we want to create custom code for reuse throughout a report. You can include embedded code written in Visual Basic by adding methods to a globally defined code member class. This embedded code is saved in the report definition file and has report level scoping.
The following activity demonstrates creating and consuming embedded code in a report. If you do not already have the demo report project up and running, launch the project in Visual Studio.
1. Select the Layout tab of the report in the Report Designer window. On the Report menu, choose New Report Properties, which launches the Report Properties dialog box.
2. Select the Code tab and enter the method shown in Listing 1. Because the Code tab is just a text box, you may want to write the code in a class file and then paste it in the box. This will allow you to take advantage of the Visual Studio code editing features.
3. Right-click on the state textbox in the Report Layout designer and select Expression to launch the Edit Expression dialog. Enter the following code in the Expression textbox:
=code.FilterEmptyStrings(Fields!state.Value)
4. Repeat Step 3 for the au_fname textbox passing in the value of the au_fname field.
5. Update the author table in the pubs database so that some of the records have blank state and au_fname fields.
6. Preview the report. You should notice the report renders "no value entered" if the state or au_fname fields are blank.
Extending Reports Through External Assemblies
Although adding functions to a report is a great way to extend and customize your reporting solutions, it is still somewhat restrictive. Code reuse is limited to a single report and the full feature set of the .NET framework is not available. To extend code access across multiple reports and take full advantage of the .NET framework, you create an external .NET assembly that the report references.
The following activity demonstrates the process of referencing external assemblies from a report. If you do not already have the demo report project up and running, launch the project in Visual Studio:
1. Add a Class Library project to the solution named reportHelperLib. Add a class named rptHelper.
2. In the rptHelper class, add the methods shown in Listing 2. Notice that one is a shared method. This will help to demonstrate the difference between calling shared methods and instance methods from a report.
3. Build the Class Library project. To create a reference to the reportHelperLib.dll from your report project, open the Report Properties dialog and select the References Tab (see Figure 5). In addition to the assembly, you need to include the class and create an instance name to reference instance methods of the class. You also need to place a copy of the reportHelperLib.dll in the bin folder of the Report Designer folder. This ensures that you can preview the report in the designer. The default location for this folder is: "C:\Program Files\Microsoft SQL Server\80\Tools\Report Designer"
4. Select the Layout tab of the report in the Report Designer window. Right-click the price column in the table and insert a column to the right. Label the column tax. Select the textbox in the column row and change the name to tax.
5. Right-click on the tax textbox and select Expression to launch the Edit Expression dialog. Enter the following code in the Expression textbox. Because this is a shared method, the fully qualified name references the assembly:
=reportHelperLib.rptHelper.getTax( Fields!state.Value)
6. Preview the report. The tax column contains the value returned by the getTax method.
7. Select the Layout tab of the report in the Report Designer window. Right click on the au_fname textbox in the Report Layout designer and select Expression to launch the Edit Expression dialog. Replace the existing code in the Expression textbox with the following code. Because this is an instance method, we reference it through the class instance variable created in Step 3.
=code.m_rptHelper.FilterEmptyStrings(Fields!au_fname.value)
8. Preview the report. Notice the report renders "no value entered" if the au_fname field is blank.
Review
With the release of Reporting Services, Microsoft has provided a truly enterprise-level reporting solution. Reporting Services provides support for the entire reporting life cycle, including report authoring, report management, and report delivery. This article has introduced the process of designing and customizing reports using the Visual Studio .NET integrated Report Designer. A future article will explore the issues involved with report management and delivery. It will guide you through the process of publishing, securing, and executing reports.
Full Reporting Life Cycle Support
SQL Server Reporting Services supports the full reporting life cycle, including:
- Report authoring: Report developers can create reports to be published to the Report Server using Microsoft or third-party design tools that use Report Definition Language (RDL), an XML-based industry standard used to define reports.
- Report management: Report definitions, folders, and resources are published and managed as a Web service. Managed reports can be executed either on-demand or on a specified schedule, and are cached for consistency and performance.
- Report delivery: SQL Server Reporting Services supports both on-demand (pull) and event-based (push) delivery of reports. Users can view reports in a Web-based format or in e-mail.
Published December 7, 2004 Reads 43,288
Copyright © 2004 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Dan Clark
Dan is a Microsoft Certified Trainer, Microsoft Certified Solution Developer, and a Microsoft Certified Database Administrator. For the past seven years he has been developing applications and training others how to develop applications using Microsoft technologies. Dan has been developing and training Microsoft's .NET technologies since the early betas. He has recently authored the book "An Introduction to Object-Oriented Programming with Visual Basic .NET," published by Apress.
![]() |
Jensays 12/03/08 11:00:20 AM EST | |||
I'm so glad I found your advice, I was struggling with a conditional font size in a SRS report, whereby I kept getting a syntax error. Thankfully, your article clearly showed me what my error was. |
||||
![]() |
Mike Kissinger 03/24/05 09:45:38 AM EST | |||
Figure 5 is a blurr. Can you send me a clear image? Mike |
||||
- iPad3 vs Windows 8 - and the Winner Is...Cloud
- Eleven Reasons Why Windows Phone Will Overtake Android
- Windows Azure Overview Part 4: Security
- Eleven Tips for Successful Cloud Computing Adoption
- Agile Development & Enterprise Architecture Practice – Can They Coexist?
- GM to Pull Facebook Advertising: WSJ
- System Center Virtual Machine Manager 2012 as Private Cloud Enabler
- Apply Agile When Deploying Apps
- The Web – Changing the Way We Work
- EE Times and EDN Announce the 2012 UBM Electronics ACE Award Winners
- Closer Look at One NoSQL Database – MongoDB
- Why Is Scrum So Widely Adopted and So Very Dangerously Deceptive
- iPad3 vs Windows 8 - and the Winner Is...Cloud
- Cisco Unveils Visual Collaboration Solutions in the Post-PC Era, Extending the Reach of TelePresence With New Mobile-to-Immersive Offerings
- Eleven Reasons Why Windows Phone Will Overtake Android
- Windows Azure Overview Part 4: Security
- Eleven Tips for Successful Cloud Computing Adoption
- Agile Development & Enterprise Architecture Practice – Can They Coexist?
- GM to Pull Facebook Advertising: WSJ
- System Center Virtual Machine Manager 2012 as Private Cloud Enabler
- Apply Agile When Deploying Apps
- The Web – Changing the Way We Work
- Book Review: Decision Management Systems
- User Group Malaise?
- Google Maps and ASP.NET
- Converting VB6 to VB.NET, Part I
- How to Write High-Performance C# Code
- Crystal Reports XI & How It Has Changed
- Creating Controls for.NET Compact Framework in Visual Studio 2005
- Where Are RIA Technologies Headed in 2008?
- Programmatically Posting Data to ASP .NET Web Applications
- Implementing Tab Navigation with ASP.NET 2.0
- AJAX World RIA Conference & Expo Kicks Off in New York City
- i-Technology Viewpoint: "SOA Sucks"
- .NET Archives: Getting Reacquainted with the Father of C#
- i-Technology Photo Exclusive: Bill Gates & Steve Jobs In "Nerds"






















