Blog: Posts from December, 2012

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
Posts from December, 2012
Sunday, December 23, 2012PrintSubscribe
Changing Report Template

The Report action is interpreted by the application framework as a request to produce a report document in Adobe PDF, Microsoft Word, Microsoft Excel, or TIFF format. The framework uses Microsoft Report Viewer for that purpose. The Viewer requires a report definition in RDLC format and a dataset to produce the output.

The application framework includes a standard report template file written in XSLT. This report template is applied to a data controller file to produce a report definition in RDLC format when the Report action is handled by the framework. By default, the report template will be generated at run-time using report font, label, and orientation specified for the view.

The picture below shows a report created from Orders controller using the default report template.

Report created with the default report template of Orders controller.

The default report template file can be changed – the customizations will be applied to all non-custom reports.

Let’s add a copyright message at the bottom of all reports.

Start the web application generator, click on the project name, and press Develop to open the project in Visual Studio.

In the Solution Explorer, double-click on ~\Reports\Template.xslt to open the file.

Report template file selected in Visual Studio's 'Solution Explorer'.

Press Ctrl+I and type “PageFooter” to find the footer section. Make the highlighted changes:

<PageFooter>
  <PrintOnFirstPage>true</PrintOnFirstPage>
  <ReportItems>
    <Textbox Name="FooterPrintedInfoTextBox">
      <rd:DefaultName>textbox7</rd:DefaultName>
      <Width>4.125in</Width>
      <Top>0in</Top>
      <Style>
        <VerticalAlign>Bottom</VerticalAlign>
        <PaddingLeft>2pt</PaddingLeft>
        <PaddingRight>2pt</PaddingRight>
        <PaddingTop>2pt</PaddingTop>
        <PaddingBottom>2pt</PaddingBottom>
      </Style>
      <ZIndex>1</ZIndex>
      <CanGrow>true</CanGrow>
      <Paragraphs>
        <Paragraph>
          <TextRuns>
            <TextRun>
              <Value>
                <xsl:text>="© 2012 Code On Time LLC. ^PrintedOn^Printed on^PrintedOn^ " 
                  &amp; CStr(Now())</xsl:text>
                <xsl:text> &amp; IIf(CountRows("</xsl:text>
                <xsl:value-of select="@name"/>
                <xsl:text>") > 1, " (" &amp; CountRows("</xsl:text>
                <xsl:value-of select="@name"/>
                <xsl:text>") &amp; " ^Items^items^Items^)", "")</xsl:text>
              </Value>

Save the file and switch to the web browser. Navigate to any page that has a controller on it, and activate the Report | PDF Document action on the action bar. The copyright information is now displayed on the left side of the page footer.

Report created from default report template now has copyright information displayed in the bottom left corner.

Multiple XSLT report templates can be created. The name of a custom report template with full extension can be specified as the command argument of a Report action or as a value of _template option in the Data property of the action.

Friday, December 21, 2012PrintSubscribe
Order Form Sample–Part 38

If multiple orders are included in the “order details” data set, then a simple filtered report will produce an incorrect output. This will happen if the Report action has a missing or incorrect filter in its Data property.

For example, the header of the report presented below displays the order information from the first “order details” data row. Order details from multiple orders are listed without any separation. The subtotal and total are calculated from the sum of Extended Price of all order details included in the data set. 

Simple report created from multiple orders.

In fact, order #10248 has only two “order detail” rows in the Northwind database.

SQL query to select order details from the specific order shows the inaccuracy of the report.

Let’s change the custom report template to group items by OrderID and CustomerID to ensure valid output even in situations when a report data set contains details of multiple orders.

Adding Grouping by Order

First, decrease the horizontal size of the  tablix by clicking and dragging on the dividers in the grey area above the column headers.

Decreasing the size of the tablix.

Right-click on the grey area to the left of the [ProductProductName] data cell. Select Add Group | Parent Group… option.

Adding a new parent row group to the tablix.

In the Tablix group window, select the following options:

Property Value
Group by: [OrderID]
Add group header true
Add group footer true

Press OK to save. A row group has been added to the tablix. Select the original header label cells by clicking on Product Name, then holding Shift key and clicking on Extended Price. Right-click, and press Cut.

Cutting the column headers from the first row.

Right-click on the cell below Product Name, and press Paste.

Pasting column headers into the second row inside the group.

The column headers will be inserted inside the group.

Right-click on the grey area to the left of the first row in the tablix. Press Delete Rows.

Deleting the first row.

Inserting Order Header

Let’s add another row above the headers to provide a placeholder for the order information. Right-click in the grey area to the left of the column headers, and press Insert Row | Inside Group – Above.

Inserting a row inside the group.

Select the entire row that was added. Right-click, and select Merge Cells option.

Merging the cells in the added row.

Delete the text in OrderID column. Use the divider in the grey area to “minimize” the OrderID column.

Minimizing the 'OrderID' column.

Drag a Rectangle element from the Toolbox, and drop it onto the header row of the group.

Adding a rectangle element to the row.

Select all elements in the header area of the page, right-click, and press Cut.

Cutting all elements from the header.

Right-click on the rectangle, and press Paste. The header elements for the order will be moved from the page header to the group.

Pasting the header elements inside the first row of the group.

Inserting Order Footer

Select the entire row below the data cells in the tablix. Right-click, and press Merge Cells.

Merging the cells in the footer row of the group

From the Toolbox window, drop a Rectangle element onto the row.

Dropping a rectangle into the footer row.

Select all elements in the report footer. Right-click and press Cut.

Cutting the report footer elements.

Right-click on the row underneath the data cells, and press Paste.

Pasting footer elements into the group footer.

The order footer elements will be pasted into the tablix row.

Adding Grouping By Customer

Right-click on the grey area to the left of the first row, and press Add Group | Parent Group… option.

Adding another parent row group.

Specify the following parameters:

Property Value
Group by: [OrderCustomerID]
Add group header true

Press OK to add the group.

Delete the text in the first column, and “minimize” the column.

Minimizing the Customer column.

Select all the cells in the first row. Right-click and press Merge Cells.

Merging the cells in the first row.

In the row, type the following:

[OrderCustomerCompanyName]

On the toolbar, set the font size to “24”, and set the text as bold, underlined, and center-aligned.

Changing the text properties of the first row.

Expand the first row using the handle of the grey area to the left of the row to make sure the text fits.

Fixing Subtotal and Total Formulas

The Subtotal and Total fields are currently displaying a sum for all order details in the returned dataset. Let’s fix the formulas to ensure the correct data is being displayed for each order.

Right-click on the Subtotal field, and press Expression.

Activating the Expression context menu option for 'Subtotal' field.

Replace the expression with the following:

=Sum(Fields!ExtendedPrice.Value)

Press OK to save.

Right-click on the Total field, and press Expression.

Activating the Expression context menu option for 'Total' field.

Use this expression:

=Sum(Fields!ExtendedPrice.Value) + First(Fields!OrderFreight.Value)

Press OK to save.

If a data set with “order details” from multiple orders is used with the new report template with “grouping”, then each order and its details will be rendered on a separate page.

Report created using grouped template shows accurate data.

Thursday, December 20, 2012PrintSubscribe
Order Form Sample–Part 37

A new Report action must be configured in the Orders data controller. The action will produce a PDF output using the custom report template from the “order details” data set filtered by a selected order ID.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. Right-click on Orders / Actions / ag2 (Form) and press New Action.

Creating a new action in 'ag2' of Orders controller.

Assign the following values:

Property Value
Command Name Report
Header Text Order Report
Data

_controller=OrderDetails
_view=editForm1
_template=OrderDetails_report1.rdlc
_sortExpression=OrderID,ProductProductName
OrderID=OrderID

When Key Selected Yes

Press OK to save.

The highlighted parameters will instruct the reporting engine of application framework to use a specific data controller and report template.

The last expression is the filter that will limit  OrderDetails data set by the order ID that was selected on the client in the data view of Orders when action has been activated.

In the Project Explorer, drop Orders / Actions / ag2 (Form) / a100 – Report | Order Report to the left side of a1 – Edit action node to place it first in the action group.

Dropping action 'a100' on the left side of 'a1'.     Action 'a100' placed first in the heirarchy.

On the toolbar, press Browse. Navigate to the Order Form page, and select an order. Click on Order Report button to see the printable report with a content formatted according to the template.

'Order Report' action is now present on the order form

If you were to click on the Print icon in the top or bottom row of action buttons, then a standard report with a list of order fields will be produced on the server.

Click on the Edit button. Notice that the Order Report button disappears.

'Order Report' action is not present in 'edit' mode.

Let’s make sure that a click on the Print icon will yield the customized Order Report, and that the same report is also accessible in edit mode.

Configuring “Print” Icon

The Print icon always activates the first “Report” action in any group with “Action Bar” scope.

In the Project Explorer, hold down Ctrl key and drop a100 – Report | Order Report node onto Orders / Actions / ag7 (ActionBar) – Report action group node.

Copying action 'a100' into action group 'ag7'.     Action 'a100' duplicated in action group 'ag7'.

Next, drop a100 – Report | Order Report node on the left side of a1 – ReportAsPdf action node to place it first.

Dropping 'a100' action on the left side of action 'a1'.     Action 'a100' placed first in action group 'a100'.

The Print icon will now trigger Orders / Actions / ag7 (ActionBar) – Report / a100 – Report | Order Report action.

Order Report Action in Edit Mode

While holding Ctrl key, drop Orders / Actions / ag2 (Form) / a100 – Report | Order Report onto ag2 (Form) action group node to duplicate the action.

Duplicating action 'a100' in the same action group.    Duplicate of 'a100' created.

Drag a101 – Report | Order Report on the left side of a4 – Update when Edit to place it before the target.

Dropping action 'a101' before action 'a4'.     Action 'a101' placed before action 'a4'.

Double-click on a101 – Report | Order Report node, and make the following change:

Property New Value
When Last Command Name Edit

Press OK to save. This action button Order Report will now appear when the form is in edit mode.