Business Rules/Logic

Labels
AJAX(112) App Studio(9) 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(178) 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(184) 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(3) 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
Business Rules/Logic
Friday, July 20, 2012PrintSubscribe
Code Formula

The Code Formula field is an expression in the language of your project (C# or Visual Basic) that calculates the value of the field every time the row values are changed in response to Calculate action.

Let’s add an Extended Price field in Order Details that will calculate the extended price of the order item using Unit Price, Quantity, and Discount.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab, right-click on OrderDetails / Fields node, and select New Field option.

New Field for OrderDetails controller.

Give this field the following settings:

Property Value
Name ExtendedPrice
Type Currency
The value of this field is calculated by a business rule expression. True
Code Formula
Convert.ToDecimal(unitPrice) * 
    Convert.ToDecimal(quantity) * 
    (1 - Convert.ToDecimal(discount))
Label Extended Price
Values of this field cannot be edited True
Data Format String c
Context Fields ProductID, UnitPrice, Quantity, Discount

Press OK to save the field.

At the top of the Project Browser window, switch to the Data Fields tab. Create a new data field with the following configuration:

Property Value
View createForm1
Category New Order Details

Press OK to save.

New ExtendedPrice field with data field in createForm1.

On the toolbar, press Browse button. Navigate to the Order Details page, and create a new record. Specify a Unit Price, Quantity, and Discount, and the Extended Price will be calculated when you press Tab or click outside of the changed field.

New Order Details form with a calculated Extended Price.

If you change any of the field values and shift focus to another field, the Extended Price will refresh.

When a value is changed in the other fields, Extended Price value will be recalculated.

The code generator automatically creates a business rule file using the Code Formula expression. The resulting file can be seen below.

C#:

using System;
using MyCompany.Data;

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

        [ControllerAction("OrderDetails", "Calculate", "ExtendedPrice")]
        public void CalculateOrderDetails(int? orderID,
            string orderCustomerID, string orderCustomerCompanyName,
            string orderEmployeeLastName, string orderShipViaCompanyName,
            int? productID, string productProductName,
            string productCategoryCategoryName,
            string productSupplierCompanyName, decimal? unitPrice,
            short? quantity, float? discount)
        {
            UpdateFieldValue("ExtendedPrice", 
                Convert.ToDecimal(unitPrice) *
                Convert.ToDecimal(quantity) *
                (1 - Convert.ToDecimal(discount)));
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System

Namespace MyCompany.Rules
    
    Partial Public Class OrderDetailsBusinessRules
        Inherits MyCompany.Data.BusinessRules
        
        <ControllerAction("OrderDetails", "Calculate", "ExtendedPrice")> _
        Public Sub CalculateOrderDetails(ByVal orderID As Nullable(Of Integer),
                                         ByVal orderCustomerID As String,
                                         ByVal orderCustomerCompanyName As String,
                                         ByVal orderEmployeeLastName As String,
                                         ByVal orderShipViaCompanyName As String,
                                         ByVal productID As Nullable(Of Integer),
                                         ByVal productProductName As String,
                                         ByVal productCategoryCategoryName As String,
                                         ByVal productSupplierCompanyName As String,
                                         ByVal unitPrice As Nullable(Of Decimal),
                                         ByVal quantity As Nullable(Of Short),
                                         ByVal discount As Nullable(Of Single))
            UpdateFieldValue("ExtendedPrice",
                Convert.ToDecimal(unitPrice) *
                Convert.ToDecimal(quantity) *
                (1 - Convert.ToDecimal(discount)))
        End Sub
    End Class
End Namespace
Friday, July 20, 2012PrintSubscribe
Code Value

The Code Value property is a calculation performed every time the record is inserted or updated. The calculation expression is written in the programming language of your project – Visual Basic or C#.

For example, let’s keep track of the last time an order detail was modified.

Start SQL Server Management Studio. In the Object Explorer, right-click on Databases / Northwind / Tables / dbo.OrderDetails node and select Design.

Design context menu option for Order Details table of the Northwind database.

Add a column to the table:

Column Name Data Type Allow Nulls
ModifiedOn datetime True

Save the table. Switch back to the application generator and refresh the Order Details controller.

Refresh the OrderDetails controller.

Activate the Project Designer. In the Project Explorer, switch to the Controllers tab. Double-click on OrderDetails / Views / editForm1 / c1 – Order Details / ModifiedOn data field node.

ModifiedOn data field in editForm1 of Order Details controller.

Change the following properties:

Property New Value
Text Mode Static

Press OK to save the data field. Double-click on OrderDetails / Fields / ModifiedOn node.

ModifiedOn field of Order Details controller.

Change the following properties:

Property New Value
Code Value DateTime.Now
Data Format String g

Press OK to save. On the toolbar, press Browse.

Navigate to the Order Details page, and edit a record. The Modified On field has no value.

First editing an order detail will reveal that Modified On field has no value.

Change any field value in the record, and save. Open the detail view for the same record – the Modified On field value has been updated.

Opening the same record will reveal that ModifiedOn field value was updated upon insertion.

The field will update on every insert or update.

The web application generator has placed the Code Value formula in an automatically generated business rule associated with the data controller.

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 OrderDetailsBusinessRules : MyCompany.Data.BusinessRules
    {
        
        [ControllerAction("OrderDetails", "Insert", ActionPhase.Before)]
        [ControllerAction("OrderDetails", "Update", ActionPhase.Before)]
        public void AssignFieldValuesToOrderDetails(int? orderID, 
            string orderCustomerID, string orderCustomerCompanyName, 
            string orderEmployeeLastName, string orderShipViaCompanyName, 
            int? productID, string productProductName, 
            string productCategoryCategoryName, string productSupplierCompanyName, 
            decimal? unitPrice, short? quantity, float? discount, DateTime? modifiedOn)
        {
            FieldValue ModifiedOnFieldValue = SelectFieldValueObject("ModifiedOn");
            object ModifiedOnCodeValue = DateTime.Now;
            if (ModifiedOnFieldValue == null)
                AddFieldValue("ModifiedOn", ModifiedOnCodeValue);
            else
            {
                ModifiedOnFieldValue.NewValue = ModifiedOnCodeValue;
                ModifiedOnFieldValue.Modified = true;
                ModifiedOnFieldValue.ReadOnly = false;
            }
        }
    }
}

Visual Basic:

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 OrderDetailsBusinessRules
        Inherits MyCompany.Data.BusinessRules
        
        <ControllerAction("OrderDetails", "Insert", ActionPhase.Before), _
         ControllerAction("OrderDetails", "Update", ActionPhase.Before)> _
        Public Sub AssignFieldValuesToOrderDetails(ByVal orderID As Nullable(Of Integer),
                                                   ByVal orderCustomerID As String,
                                                   ByVal orderCustomerCompanyName As String,
                                                   ByVal orderEmployeeLastName As String,
                                                   ByVal orderShipViaCompanyName As String,
                                                   ByVal productID As Nullable(Of Integer),
                                                   ByVal productProductName As String,
                                                   ByVal productCategoryCategoryName As String,
                                                   ByVal productSupplierCompanyName As String,
                                                   ByVal unitPrice As Nullable(Of Decimal),
                                                   ByVal quantity As Nullable(Of Short),
                                                   ByVal discount As Nullable(Of Single),
                                                   ByVal modifiedOn As Nullable(Of DateTime))
            Dim ModifiedOnFieldValue As FieldValue = SelectFieldValueObject("ModifiedOn")
            Dim ModifiedOnCodeValue As Object = DateTime.Now
            If (ModifiedOnFieldValue Is Nothing) Then
                AddFieldValue("ModifiedOn", ModifiedOnCodeValue)
            Else
                ModifiedOnFieldValue.NewValue = ModifiedOnCodeValue
                ModifiedOnFieldValue.Modified = True
                ModifiedOnFieldValue.ReadOnly = False
            End If
        End Sub
    End Class
End Namespace

This can also be done with SQL Business Rules.

Monday, July 9, 2012PrintSubscribe
Feature: “Code” Business Rules

The application framework of each project is generated in C# or Visual Basic. The business rules engine of the framework takes care of executing SQL, Email, and JavaScript business rules in response to actions defined in the data controller. Naturally, developers can create business rules written in the programming language of the project to tap in the power of the business rules engine and vast Microsoft.NET library.

'Code' Business Rule defined in the data controller 'Customers'

For example, the “Code” business rule defined in the project configuration will result in the code file generated in the project output folders.

The code file with the implementation stub is automatically generated for each 'Code' Business Rule in the programming language of the project

The business rule file provides a method template linked to the data controller business rule with Rule attribute. The file will not be re-created during subsequent code generation sessions. Any modifications to the file will become a permanent extension of the application framework.

Let’s implement a validation business logic.  Note that the highlighted text indicates the conditional expression inserted in the automatically generated business rule method template.

C#:

using System;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class CustomersBusinessRules : MyCompany.Data.BusinessRules
    {
        /// <summary>
        /// This method will execute in any view before an action
        /// with a command name that matches "Insert|Update|Delete".
        /// </summary>
        [Rule("r100")]
        public void r100Implementation(string customerID, string companyName,
            string contactName, string contactTitle, string address, string city,
            string region, string postalCode, string country, string phone, string fax)
        {
            // This is the placeholder for method implementation.
            if (country == "USA")
            {
                // tell the application framework to skip the execution of update, insert, or delete
                PreventDefault();
                // set the focus to the field "Country" and display an error message
                Result.Focus("Country",
                    "You are not authorized to {0}, " +
                    "if the Country is equal to \"USA\".",
                    Arguments.CommandName.ToLower());
                // show an additional information in the message bar at the top of the page
                Result.ShowMessage("Error trying to execute {0} command",
                    Arguments.CommandName);
            }
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System

Namespace MyCompany.Rules
    Partial Public Class CustomersBusinessRules
        Inherits MyCompany.Data.BusinessRules
        ''' <summary>
        ''' This method will execute in any view before an action
        ''' with a command name that matches "Insert|Update|Delete".
        ''' </summary>
        <Rule("r100")> _
        Public Sub r100Implementation(ByVal customerID As String, ByVal companyName As String,
            ByVal contactName As String, ByVal contactTitle As String, ByVal address As String,
            ByVal city As String, ByVal region As String, ByVal postalCode As String,
            ByVal country As String, ByVal phone As String, ByVal fax As String)
            ' This is the placeholder for method implementation.
            If (country = "USA") Then
                ' tell the application framework to skip the execution of update, insert, or delete
                PreventDefault()
                ' set the focus to the field "Country" and display an error message
                Result.Focus("Country",
                    "You are not authorized to {0}, " &
                    "if the Country is equal to ""USA"".",
                    Arguments.CommandName.ToLower())
                ' show an additional information in the message bar at the top of the page
                Result.ShowMessage("Error trying to execute {0} command",
                    Arguments.CommandName)
            End If
        End Sub
    End Class
End Namespace

The pattern of implementation is following closely the pattern of SQL and JavaScript business rules. Both of these alternatives are actually built on top of the same infrastructure demonstrated in this example.

The screenshot shows the “code” business rule in action.

Validation with C# / Visual Basic Business Rules in a web app created with Code On Time web application generator