Blog: Posts from March, 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 March, 2012
Thursday, March 22, 2012PrintSubscribe
Calculating Freight

The calculation will analyze Order ID and current Freight value:

If the order total is greater than $100, then Freight will be $19.95 flat.
Otherwise, Freight is $3.95.

The Order Form page will allow overriding the Freight value.

Switch to Visual Studio. If it is not open, exit the Designer, click on the project name in the generator, and press Develop. Open App_Code / Rules / OrdersBusinessRules.cs(vb) file.

This is how the method is implemented. You can copy the implementation into your own project. The method CalculateFreight takes nullable integer orderID and decimal freight, and returns a decimal value. It calls CalculateOrderDetailsTotal method to find the total price of order details. If Freight is equal to blank, 0, 3.95, or 19.95, then it will be returned as 19.95 for Total greater than $100, or 3.95 for Total under $100. If the conditions are not met, then Freight will not be affected.

C#:

namespace MyCompany.Rules
{
    public partial class OrdersBusinessRules : MyCompany.Data.BusinessRules
    {
        public decimal CalculateOrderDetailsTotal(int? orderID)
        {
            using (SqlText calc = new SqlText(@"select sum(unitprice * 
                                        quantity * (1 - discount)) from 
                                        [Order Details] where OrderID= @OrderID"))
            {
                calc.AddParameter("@OrderID", orderID);
                object total = calc.ExecuteScalar();
                if (DBNull.Value.Equals(total))
                    return 0;
                else
                    return Convert.ToDecimal(total);
            }
        }
        public decimal CalculateFreight(int? orderID, decimal? freight)
        {
            decimal total = CalculateOrderDetailsTotal(orderID);
            if (!freight.HasValue || freight.Value == 0 || 
                freight.Value == 3.95m ||
                freight.Value == 19.95m)
                if (total > 100)
                    return 19.95m;
                else
                    return 3.95m;
            else
                return freight.Value;
        }
    }
}

VB:

Namespace MyCompany.Rules
    Partial Public Class OrdersBusinessRules
        Inherits MyCompany.Data.BusinessRules
        Public Function CalculateOrderDetailsTotal(
                ByRef orderID As Nullable(Of Integer)) As Decimal
            Using calc As SqlText = New SqlText("select sum(unitprice *" +
                    "quantity * (1 - discount)) from [Order Details] " +
                    "where OrderID=@OrderID")
                calc.AddParameter("@OrderID", orderID)
                Dim total As Object = calc.ExecuteScalar()
                If DBNull.Value.Equals(total) Then
                    Return 0
                Else
                    Return Convert.ToDecimal(total)
                End If
            End Using
        End Function
        Public Function CalculateFreight(ByRef orderID As Nullable(Of Integer),
                                    ByRef freight As Nullable(
                                    Of Decimal)) As Decimal
            Dim total As Decimal = CalculateOrderDetailsTotal(orderID)
            If Not freight.HasValue Or freight.Value = 0 Or
                freight.Value = 3.95 Or
                   freight.Value = 19.95 Then
                If total >= 100 Then
                    Return 19.95
                Else
                    Return 3.95
                End If
            Else
                Return freight.Value
            End If
        End Function
    End Class
End Namespace


Go back to the Project Explorer, and select Orders from the Controllers list. Open Fields node, and double-click on Freight. Enter the following settings:

Property Value
The value of this field is calculated by a business rule expression True
Code Formula
CalculateFreight(orderID, freight)
Context Fields OrderDetails

Code Formula for 'Freight' field in Code On Time Designer

Save the field, and regenerate the application. Edit an order, and change the Freight to “0”. When you tab away from the field, the freight will be recalculated.

'Freight' field calculation in the Order Form

If you change the order details so that the Subtotal is less than than $100, you will see Freight be recalculated to $3.95.

'Freight' field recalculated to 3.95 in the Order Form

Let’s take a quick look at the Orders business rules class that was automatically created by the code
generator for us. You can see that we have a partial class OrdersBusinessRules with method
CalculateOrders adorned with attributes ControllerAction, which respond to Calculate action. The
method calculates Freight, Subtotal, and Total fields by calling CalculateOrderDetailsTotal and
CalculateFreight with orderID passed as an argument.

C#:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Security;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class OrdersBusinessRules : MyCompany.Data.BusinessRules
    {
        
        [ControllerAction("Orders", "Calculate", "Freight")]
        [ControllerAction("Orders", "Calculate", "Subtotal")]
        [ControllerAction("Orders", "Calculate", "Total")]
        public void CalculateOrders(
                    int? orderID, 
                    string customerID, 
                    string customerCompanyName, 
                    int? employeeID, 
                    string employeeLastName, 
                    DateTime? orderDate, 
                    DateTime? requiredDate, 
                    DateTime? shippedDate, 
                    int? shipVia, 
                    string shipViaCompanyName, 
                    decimal? freight, 
                    string shipName, 
                    string shipAddress, 
                    string shipCity, 
                    string shipRegion, 
                    string shipPostalCode, 
                    string shipCountry, 
                    decimal? subtotal, 
                    decimal? total)
        {
            UpdateFieldValue("Freight", CalculateFreight(orderID, freight));
            UpdateFieldValue("Subtotal", CalculateOrderDetailsTotal(orderID));
            UpdateFieldValue("Total", CalculateOrderDetailsTotal(orderID) + freight);
        }
        
        [RowBuilder("Orders", RowKind.New)]
        public void BuildNewOrders()
        {
            UpdateFieldValue("OrderDate", DateTime.Now);
        }
    }
}

VB:

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq
Imports System.Text.RegularExpressions
Imports System.Web
Imports System.Web.Security

Namespace MyCompany.Rules

    Partial Public Class OrdersBusinessRules
        Inherits MyCompany.Data.BusinessRules

        <ControllerAction("Orders", "Calculate", "Freight"), _
         ControllerAction("Orders", "Calculate", "Subtotal"), _
         ControllerAction("Orders", "Calculate", "Total")> _
        Public Sub CalculateOrders( _
                    ByVal orderID As Nullable(Of Integer), _
                    ByVal customerID As String, _
                    ByVal customerCompanyName As String, _
                    ByVal employeeID As Nullable(Of Integer), _
                    ByVal employeeLastName As String, _
                    ByVal orderDate As Nullable(Of DateTime), _
                    ByVal requiredDate As Nullable(Of DateTime), _
                    ByVal shippedDate As Nullable(Of DateTime), _
                    ByVal shipVia As Nullable(Of Integer), _
                    ByVal shipViaCompanyName As String, _
                    ByVal freight As Nullable(Of Decimal), _
                    ByVal shipName As String, _
                    ByVal shipAddress As String, _
                    ByVal shipCity As String, _
                    ByVal shipRegion As String, _
                    ByVal shipPostalCode As String, _
                    ByVal shipCountry As String, _
                    ByVal subtotal As Nullable(Of Decimal), _
                    ByVal total As Nullable(Of Decimal))
            UpdateFieldValue("Freight", CalculateFreight(orderID, freight))
            UpdateFieldValue("Subtotal", CalculateOrderDetailsTotal(orderID))
            UpdateFieldValue("Total", CalculateOrderDetailsTotal(orderID) + freight)
        End Sub

        <RowBuilder("Orders", RowKind.New)> _
        Public Sub BuildNewOrders()
            UpdateFieldValue("OrderDate", DateTime.Now)
        End Sub
    End Class
End Namespace
Thursday, March 22, 2012PrintSubscribe
Searching by First Letter

You would be lost while browsing the old fashion phone book or scrolling through the entries of your modern-day contact list on a smart phone without the alphabetical index of entries. A menu of first letters rendered on data pages provides similar productivity enhancement.

This screen shot shows the Search by First Letter enabled in a data view in a Code On Time web application.

Data view with enabled 'Search by First Letter' feature in a Code On Time web application

If you want to enable Search by First Letter, then select the project name on the start page of the web application generator and click Design. Expand a page node in Project Explorer and select the data view that will have the alphabetize search enabled. Toggle the “Search by First Letter” option and re-generate your application.

Property 'Search by First Letter' enabled in a data view

The “first letter” is a bit of a misnomer. The application will find distinct first characters in the first visible data field of type String. If more than one distinct character is detected then the sorted menu of characters is rendered above the “grid” views of the data controller linked to the data view.

'Search by First Letter' is represented by a menu of first characters in the first searchable string data field of a data view.

If a user clicks on a symbol then the data is automatically filtered according to the selection. The following screen shot show what happens if a user clicks on the latter “A” above the list of products in the Northwind sample. This selection activated “begins with…” filtering option on the first column of the gird view.

'Product Name begins with A' is the result of clicking on the first letter.

Users can accomplish the same end result by a selecting the filtering option from the context menu of the first column.

The alternative method of activating the 'Begins With...' filter

Search by First Letter is sensitive to the current set of user-defined filters. The following screen shot shows exactly the same list of products that belong to “Beverages” and “Seafood” categories. The number of symbols in the Search by First Letter menu is less than the number of symbols available when all categories allowed in the view. All filtering options in Code On Time web applications are adaptive.

Adpative nature of 'Search By First Letter'

Search by First Letter is also displayed on a data view that is configured to have “Search on Start”. This option can be enabled in the data view properties. You will find the check box below the “Search by First Letter” option.

Enabling data view properties 'Search by First Letter' and 'Search on Start' will result in the following presentation when users arrive to the Products page.

Users can remove the filter by clicking on the close button on the right-hand side of the filter description.

Alternatively, users can “mouse” over the filter element in the filter description area and have the filter removed with a single mouse click without affecting any other active filters.

Mouse click on the filter element in the filter details will remove the filter without affecting any other active filters

Sunday, March 18, 2012PrintSubscribe
Configuring a Chart in Web Site Factory Project

Charts are great at telling a story when numbers fail to impress. Ad hoc charts can be created by end users of your web application. You can also incorporate a chart that requires no effort on the user part.

Activate the Project Designer and choose Controllers tab. Add a new view to the Orders data controller.

Adding a new view to 'Orders' data controller

Enter the following properties in the view properties.

Property Value
Id chart1
Type Chart
Command command1
Label Sales Chart
Header Text Sales of orders by quarter

Click OK button to save the new view.

Right-click the new view chart1 and choose New Data Field option.
 
'New Data Field' option in the context menu of the data controller view

Set Field Name property of the new data field to OrderID and click OK button to save the new field.

Repeat this procedure one more time and add OrderDate data field to the view.

Right-click the node Orders / Views / chart1 and choose Show All Data Fields option.

'Show All Data Fields' option in the context menu of the data controller view

Note that the right-most column Chart shows the value of None for both fields.

Data fields of a chart view in Project Designer

Change the properties of both data fields as follows.

Data Field Property Value
OrderID Chart Bar (Cylinder)
OrderID Σ (Aggregate) Count
OrderDate Chart X, Quarters
OrderDate Format MMM yy

These property values will result in chart presenting a breakdown of order count by order date quarters.

Chart view data fields configured to display a total count of orders broken down by order date quarters

Click Browse button on the designer toolbar to the open the application in your default web browser.

Navigate to Orders page and select Sales Chart option form the view selector.

View selector displayed in a web application created with Code On Time

The chart view will be displayed in the main area of the data view on the page.

Chart view in a master data view of a Code On Time web application

Navigate to the Customers page, select  a customer, and choose Sales Chart option in the view selector of the child view on the tab Orders. The chart view of orders linked to the selected customer will be rendered.

Chart view in a child data view of a Code On Time web application

Let’s say you want to have this chart view on the application home page.

Activate Pages tab on the Project Explorer and select the node Home / container2. Right-click the node and choose New Data View option from the context menu.

'New Data View' option in the context menu of a container in Project Explorer

Set Controller property to Orders, set View property to chart1.

Select the Show Pager option. Unselect all other check boxes under Presentation.

Click OK to save the new data view.

Click Browse button on the designer tool bar. The application home page will load with the chart displayed at the bottom of the second container.

Chart data view displayed on the home page of an application created with Code On Time