Reports

Labels
AJAX(112) App Studio(7) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(183) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
Reports
Tuesday, July 24, 2012PrintSubscribe
FileName Action

Actions Export to Spreadsheet, Download, and Report will produce a file when executed on the server. The file name is a concatenation of the data controller and the view.

Customers generated report file named after the controller and view.

Let’s create a business rule that will assign custom names to the output files.

First, enable shared business rules and regenerate the project. Start the Project Designer and click Develop on the toolbar to open the project in Visual Studio.

In the Solution Explorer, double-click on ~\App_Code\Rules\SharedBusinessRules.cs(vb) file.

SharedBusinessRules file in the Solution Explorer.

Replace the default code with the following:

C#:

using System;
using MyCompany.Data;
using System.IO;

namespace MyCompany.Rules
{
    public partial class SharedBusinessRules : MyCompany.Data.BusinessRules
    {

        public SharedBusinessRules()
        {
        }

        // 1. "Actions | Export to Spreadsheet" in any controller
        [ControllerAction(".", "FileName", "ExportRowset")]
        public void AssignFileNameToExportSpreadsheet(string fileName)
        {
            UpdateFieldValue("FileName", String.Format("Live {0} Data Link.iqy", 
                ControllerName));
        }

        // 2. "Actions | Download" in 'Suppliers' controller
        [ControllerAction("Suppliers", "FileName", "ExportCsv")]
        public void AssignFileNameToDownloadCsv(string fileName)
        {
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} Supplier List.csv", 
                DateTime.Now));
        }

        // 3. "Report |.." in any data controller
        [ControllerAction(".", "FileName", "Report")]
        [ControllerAction(".", "FileName", "ReportAsPdf")]
        [ControllerAction(".", "FileName", "ReportAsExcel")]
        [ControllerAction(".", "FileName", "ReportAsWord")]
        [ControllerAction(".", "FileName", "ReportAsImage")]
        public void FormatReportFileName(string fileName)
        {
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} {1}{2}",
                DateTime.Now,
                Arguments.Controller,
                Path.GetExtension(fileName)));
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System
Imports System.IO

Namespace MyCompany.Rules

    Partial Public Class SharedBusinessRules
        Inherits MyCompany.Data.BusinessRules

        Public Sub New()
            MyBase.New()
        End Sub

        ' 1. "Actions | Export to Spreadsheet" in any controller
        <ControllerAction(".", "FileName", "ExportRowset")>
        Public Sub AssignFileNameToExportSpreadsheet(fileName As String)
            UpdateFieldValue("FileName", String.Format("Live {0} Data Link.iqy",
                                                       ControllerName))
        End Sub

        ' 2. "Actions | Download" in 'Suppliers' controller
        <ControllerAction("Suppliers", "FileName", "ExportCsv")>
        Public Sub AssignFileNameToDownloadCsv(fileName As String)
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} SupplierList.csv",
                                                       DateTime.Now))
        End Sub

        ' 3. "Report |.." in any data controller
        <ControllerAction(".", "FileName", "Report")>
        <ControllerAction(".", "FileName", "ReportAsPdf")>
        <ControllerAction(".", "FileName", "ReportAsExcel")>
        <ControllerAction(".", "FileName", "ReportAsWord")>
        <ControllerAction(".", "FileName", "ReportAsImage")>
        Public Sub FormatReportFileName(fileName As String)
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} {1}{2}",
                                                       DateTime.Now,
                                                       Arguments.Controller,
                                                       Path.GetExtension(fileName)))
        End Sub
    End Class
End Namespace

Save the file.

The implementation handles FileName action with arguments equal to the action command names that require an output file. For example, Export to Spreadsheet action has it’s command set to “ExportRowset”. The application framework will try to obtain a custom filename from the business rules by raising an internal action with command name of “FileName” and argument of “ExportRowset”. If the business rules are updating the filename, then the new name will be assigned to the output file.

Press Ctrl+F5 keyboard shortcut to run the web application. Navigate to the Suppliers page. On the action bar, click Actions | Download.

Download action in the suppliers grid view.

The name of the file will be the current date followed by “Supplier List”.

Download action produced a file with a custom name.

Report action file output will be named with the date and controller name.

PDF Report produced a file with a custom name.

The Export to Spreadsheet action will name the file “Live Suppliers Data Link”.

Export action also produces a file with a custom name.

Sunday, June 3, 2012PrintSubscribe
Configuring a Rich Text Box

Memo (long text) fields are presented as a simple multi-line text box by default. For example, Categories.Description field is rendered as a multi-line text box in the image below.

Description field on Categories edit form rendered as a simple text box.

Rich text editing can be enabled when necessary.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. Double-click on Categories / Fields / Description field node.

Description field of Categories controller in the Project Explorer.

At the top of the Designer window, switch to the Data Fields tab. Change the Text Mode property of all data fields:

Property New Value
Text Mode Rich Text

Change all Categories data fields to Text Mode of 'Rich Text'.

Save your changes, and click Browse on the tool bar.

When your default web browser opens, navigate to the Categories page and edit a record. Now rich text can be entered into the field. The application client library uses ASP.NET AJAX Rich Text Editor when rendering rich text fields.

Rich Text editor enabled on Description field of Categories edit form.

Make some “rich” changes to the field value, and save the record. The field value will be displayed in grid view with the styles preserved.

Description field value rich text styling preserved in grid view.

On the action bar, select Report | PDF Document option, and open the downloaded file. The styling will be preserved in the generated report as well.

Description field value rich text styling preserved in a PDF report.

Monday, January 9, 2012PrintSubscribe
Handling “Report…” Actions

Code On Time web applications support out-of-the-box reporting capabilities that require zero programming.

Standard Report Actions

All data views offer four standard actions that yield a different output.

  • Action “ReportAsPdf” will render the data presented to end users as a Adobe PDF document. The shorthand action “Report” will produce the same result. This type of report requires a compatible software installed on the client computer to view and print the report output. You can download free Adobe Acrobat Reader at at http://get.adobe.com/reader.
     
  • Action “ReportAsImage” creates a TIFF image file, which requires a compatible software installed on the client. TIFF format supports multiple pages and is a perfect alternative to PDF. The quality of output in PDF and TIFF formats is equivalent.
     
  • Action “ReportAsWord” renders a report as Microsoft Word document with a high-quality output. In some instances the output is less precise then the output produced by the action “ReportAsImage” and “ReportAsPdf”.
     
  • Action “ReportAsExcel” produces a Microsoft Excel spreadsheet that offer a lesser quality output due to rendering restriction of the popular spreadsheet software.

If a user  requests a “Report...” action then a report is rendered on the server with the help of Microsoft Report Viewer. The output is streamed to the client browser. Typically a prompt is displayed before a compatible installed software viewer will be activated. Users also have an option to save the output locally. If a viewer is not installed on the client computer then the prompt to save the file is the only option.

Code On Time web applications execute various server calls off-band to provide smooth Web 2.0 user experience. Modern web browsers make sure to prevent all sorts of popups initiated by the scripts embedded in the web pages. The client library makes use of correct techniques to process reports on the server without causing automatic activation of popup blockers.

Custom Report Action Handlers

Code On Time web applications created with version 6.0.0.19 or higher allow developers to perform custom processing of reporting actions in business rules. There are several reasons that may require an execution of  custom code that must precede or override the standard report rendering logic:

  • The data must be “prepared” before a report is rendered.
  • The report request must be logged.
  • An external report rendering engine is available. The custom code will redirect the report request to such an engine.
  • A special report preview page needs to be displayed.
  • A custom report building code must execute. The custom code replaces the standard report rendering logic.

Create a business rule for your data controller and implement methods to handle the corresponding “Report...” actions when you need to override the standard report processing.

Example

Generate a Northwind sample using Code On Time web application generator.

Select the project name on the start page of the code generator and click Design.

Select Controllers tab in the Project Explorer and enter CustomerBusinessRules in the Handler property of the Customers data controllers. Click OK to save the changes.

image

Expand Actions node of the Customers data controller in Project Explorer, right-click Actions and create a new action group with the Scope of Action Column.

Add a new action in the newly created action group, set its Command Name to Report, and Command Argument to _blank.

image

Here is the sub-tree of the Customers data controller with the  Report action selected.

image

Click Exit on the Designer tool bar and generate your application.

Select the project name on the start page of the web application generator and choose Develop. Visual Studio or Visual Web Developer will start.

Locate the file ~/App_Code/Rules/CustomerBusinessRules.cs(vb) and enter the following code.

C#:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using MyCompany.Data;
using System.IO;

namespace MyCompany.Rules
{
    public partial class CustomersBusinessRules : MyCompany.Data.BusinessRules
    {
        [ControllerAction("Customers", "Report", "_blank")]
        public void RedirectToCustomReport(string customerId, string companyName)
        {
            // Redirect user to another URL
            Result.NavigateUrl = String.Format(
                "~/Pages/Customers.aspx?CustomerID={0}&_controller=Customers" + 
                "&_commandName=Select&_commandArgument=editForm1",
                customerId);
        }

        [ControllerAction("Customers", "ReportAsImage", "")]
        public void GenerateCustomReport(string customerId, string companyName)
        {
            PreventDefault();
            // return the same image in response to all "Report..." commands
            Context.Response.Clear();
            Context.Response.ContentType = "image/jpeg";
            Context.Response.AddHeader("Content-Disposition", 
                String.Format("attachment;filename={0}.jpg", customerId));
            byte[] reportData = 
                File.ReadAllBytes(@"C:\Users\Public\Pictures\Sample Pictures\Koala.jpg");
            Context.Response.AddHeader("Content-Length", reportData.Length.ToString());
            Context.Response.OutputStream.Write(reportData, 0, reportData.Length);
        }
      
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq
Imports System.IO

Namespace MyCompany.Rules
    
    Partial Public Class Customers
        Inherits MyCompany.Data.BusinessRules

        <ControllerAction("Customers", "Report", "_blank")> _
        Sub RedirectToCustomReport(ByVal customerId As String, ByVal companyName As String)
            ' Redirect user to another URL
            Result.NavigateUrl = String.Format( _
                "~/Pages/Customers.aspx?CustomerID={0}&_controller=Customers" + _
                "&_commandName=Select&_commandArgument=editForm1",
                customerId)
        End Sub

        <ControllerAction("Customers", "ReportAsImage", "")> _
        Sub GenerateCustomReport(ByVal customerId As String, ByVal companyName As String)
            PreventDefault()
            'return the same image in response to all "Report..." commands
            Context.Response.Clear()
            Context.Response.ContentType = "image/jpeg"
            Context.Response.AddHeader("Content-Disposition", _
                String.Format("attachment;filename={0}.jpg", customerId))
            Dim reportData As Byte() = _
                File.ReadAllBytes("C:\Users\Public\Pictures\Sample Pictures\Koala.jpg")
            Context.Response.AddHeader("Content-Length", reportData.Length.ToString())
            Context.Response.OutputStream.Write(reportData, 0, reportData.Length)
        End Sub
    End Class
End Namespace

The first method RedirectToCustomReport will use the ID of the selected customer to compose a URL relative to the application. The URL will open in a new browser window and will force the application to select a customer with the specified ID.

The new window will open if your have entered the command argument as “_blank” when defining the action in Project Designer. If action command argument has been left blank then the new URL will replace the page in the web browser. Users will have an option to return to the previous page using the browser’s Back button.

The screen shot of the Customers page prior to execution of our Report action is shown next.

image

If you click on the Report button then a new browser window will open. You can see the address bar reflecting the ID of the selected customer.

image

Our web application is using its own capabilities to present the data with the help of data controller URL parameters. You can redirect the report action to a generic web request handler or to a web-enabled report server such as Crystal Reports or Microsoft SQL Server Reporting Services.

The second method GenerateCustomReport takes control over the report rendering completely.

First, the method cancels out the default reporting logic at the very beginning by calling PreventDefault.

Next it reads the file C:\Users\Public\Pictures\Sample Pictures\Koala.jpg and streams it out. In a real-world application you can produce any sort of output using a custom code.

The method uses the customer ID to assign the file name to the output.

If you are reproducing this sample on a Windows 7 computer then there is not need to change the code . Otherwise change the path to the image file accordingly.

Run your web app, navigate to Customers page and select a customer.

Choose Report | Multipage Image on the action bar above the list of customers.

image

The custom method will execute and you will see the following prompt to download the file AROUT.jpg if you browsing with IE 9.

image

Click Open and the default image viewer will start.

image

If you select any other customer and choose the same action bar option then exactly the same image will be downloaded but the file name will reflect the actual primary key of the selected customer.

In a real-world applications you will likely stream other formats of output such as PDF or custom Microsoft Office documents using 3rd party reporting software.