Tutorials

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(8) OAuth Scopes(1) OAuth2(11) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(10) PKCE(2) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(180) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(80) 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
Tutorials
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
Sunday, March 18, 2012PrintSubscribe
Total and Subtotal: Enable Sort and Filter

Currently, the new fields Total and Subtotal do not allow sorting or filtering. You can see this on the grid of Order Form – the Total column does not have a dropdown available, and the field is not displayed in the advanced search bar.

'Total' field in Order Form is not searchable or filterable

Let’s enable sorting and filtering for these two fields. Switch back to the Project Explorer, and double-click on Orders / Fields / Subtotal. Change the following settings:

Property Value
Allow Query-by-Example True
Allow Sorting True

Enable Query-by-Example and Sorting on 'Subtotal' field

Press OK to save the field. Now, double-click on Total field. Make the same changes:

Property Value
Allow Query-by-Example True
Allow Sorting True

Enable Query-by-Example and Sorting on 'Total' field

Save the field, and regenerate the application. On the Order Form page, you can see that the Total field is now searchable and filterable.

Sorting and Filtering enabled in Order Form for 'Total' field

Sunday, March 18, 2012PrintSubscribe
Total and Subtotal: Business Rule for Subtotal

The Subtotal field is now present in the application. The field does not reflect changes when new order items are entered. We will add a business rule to the Orders controller and add a code expression for Subtotal. This code expression will use the rule to calculate the subtotal.

In the Project Explorer, switch to Controllers tab. Double-click on the Orders controller. In the Handler field, type:

OrdersBusinessRules

Adding 'OrdersBusinessRules' Handler to 'Orders' Controller

Press OK to save the controller, exit the Designer, and Generate the project. The business rule placeholder file will be created.

When generation is complete, click on the project name in the web application generator and press Develop. Microsoft Visual Studio or Visual Web Developer will open. In the Solution Explorer on the right side of the screen, double-click on App_Code /Rules / OrdersBusinessRules.cs(vb).

OrdersBusinessRules.cs Rule file in OrderForm project

Paste in the following code:

C#:

using MyCompany.Data;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
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);
            }
        }
    }
}

VB:

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq
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
    End Class
End Namespace

This function uses SqlText utility class to create an instance of a query connected to the project’s database.
This simple query selects a sum of UnitPrice multiplied by Quantity multiplied by one minus the
Discount.

Note that SqlText utility class is generated as a part of the code base of your application. It uses the
default database connection string and ADO.NET to execute the query.

Save the file, and switch back to the application generator. Select the project name, and press Design. In the Project Explorer, switch to Controllers. Double-click on Orders / Fields / Subtotal. Make the following changes:

Property Text
The value of this field is calculated by a business rule expression True
Code Formula
CalculateOrderDetailsTotal(orderID)
Context Fields OrderDetails

Code Formula for 'Subtotal' field
'Context Fields' property of Orders / Fields / Subtotal

Press OK to save the field. The Subtotal field on the Order Form will now update to reflect any changes made to the order details.