Business Rules/Logic

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
Business Rules/Logic
Wednesday, April 11, 2012PrintSubscribe
Calculating Values via “Custom” Action

The following screen shows  a customer record from the Northwind sample presented in edit mode. Suppose that you want to display an action on the action bar that allows automatic calculation of certain field values.

View 'editForm1'  in the Customers data controller of the Northwind sample

Start the application generator and click on the project name on the start page. Select the Design option to bring up the Project Designer.

Activate the Controllers tab in Project Explorer, right-click Customers / Actions / ag4 (ActionBar) node and select New Action.

Adding a new action in a Code On Time web application

Enter the following values in the properties of the action.

Property Value
Command Name Custom
Command Argument CalcValues
Header Text Calculate Values
When Last Command Name Edit

Click OK button to save the action.

Press Browse on the tool bar and start editing any customer record. You will notice the Calculate Values option on the action bar.  The new action has been added to the “flat” action group ag4, which makes the action render directly on the action bar instead of being displayed as a child option of the parent action group menu item.

Custom action 'Calculate Values' on the action bar of a web app created with Code onTime application generator

Clicking on Calculate Values option will close the edit form and the grid view of customers will be displayed.

You can handle a custom action in a custom business rules or shared business rules class.

Here is an example of a shared business rules class that changes Company Name and Contact Name fields.

C#

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

namespace MyCompany.Rules
{
    public partial class SharedBusinessRules : MyCompany.Data.BusinessRules
    {
        [ControllerAction("Customers", "Custom", "CalcValues")]
        public void ChangeCompanyAndContactNames(string companyName, string contactName)
        {
            UpdateFieldValue("CompanyName", companyName + "+");
            UpdateFieldValue("ContactName", contactName + "-");
        }
    }
}

Visual Basic:

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

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

        <ControllerAction("Customers", "Custom", "CalcValues")>
        Public Sub ChangeCompanyAndContactNames(ByVal companyName As String,
                                                ByVal contactName As String)
            UpdateFieldValue("CompanyName", companyName + "+")
            UpdateFieldValue("ContactName", contactName + "-")
        End Sub
    End Class
End Namespace

The implementation is invoking UpdateFieldValue method. The first argument of the method indicates the name of the data field. The seconds specifies the new value. Action “Custom” does not update the database. Any data fields changed during its execution will be packages and retuned to the client web browser. The client library of the application will replace the old values with the new ones.

Save the file ~/Rules/SharedBusinessRules.cs(vb), navigate to your application and start editing any customer record. Click Calculate Values and you will see that the characters “+” and “-” are added to the Customer Name and Contact Name fields. The record will remain in edit mode.

The effect of a custom business rule executed on the server in a web application created with Code On Time

Business rules have complete access to the entire set of Microsoft.NET APIs.

A more complex version of the business rules class processing the same Custom action is presented next.

C#:

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

namespace MyCompany.Rules
{
    public partial class SharedBusinessRules : MyCompany.Data.BusinessRules
    {
        [ControllerAction("Customers", "Custom", "CalcValues")]
        public void ChangeCompanyAndContactNames(string companyName, 
            string city, string country, string customerID)
        {
            UpdateFieldValue("City", country);
            UpdateFieldValue("Country", city);
            string newCompanyName = companyName +  ": " + SqlText.ExecuteScalar(
                "select City + '/' + Country from Customers " +
                "where CustomerID = @CustomerID", customerID);
            UpdateFieldValue("CompanyName", newCompanyName);
        }
    }
}

Visual Basic:

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

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

        <ControllerAction("Customers", "Custom", "CalcValues")>
        Public Sub ChangeCompanyAndContactNames(ByVal companyName As String,
                ByVal city As String, ByVal country As String, ByVal customerID As String)
            UpdateFieldValue("City", country)
            UpdateFieldValue("Country", city)
            Dim newCompanyName As String = companyName + ": " + SqlText.ExecuteScalar(
                "select City + '/' + Country from Customers " +
                "where CustomerID = @CustomerID", customerID)
            UpdateFieldValue("CompanyName", newCompanyName)
        End Sub
    End Class
End Namespace

This is the result of action execution if you select the customer Around the Horn, start editing the record, and click Calculate Values option on the action bar.

  • Client-side values of fields City and Region are swapped and sent back to the client
  • The client-side value of the field Company Name is appended with the database values of  fields City and Country.

Values of fields 'City' and 'Country' are swapped. These values are also appended to the field 'Company Name'.

Similar calculations can be performed without the business rules class. If you are more comfortable with SQL language and consider yourself to be a database person then learn about implementing calculations with “SQL” action.

Tuesday, April 10, 2012PrintSubscribe
Calculating Values via “SQL” Action

The following screen shows  a customer record from the Northwind sample presented in edit mode. Suppose that you want to add a button to the form to automatically calculate certain field values.

A data record presented in 'edit' mode in a web application created with Code On Time

Start the web application generator and select your project. Click Design to activate the Project Designer.

Activate Controllers tab in the Project Explorer and right-click Customers / Actions / ag2 (Form) node. Choose New Action option to create a new action.

Action group with 'Form' scope presented in Project Explorer

Enter the following properties.

Property Value
Command Name SQL
Header Text Calculate Values
Data
select
  @CompanyName = @CompanyName +  '+',
  @ContactName = @ContactName + '-'
When Last Command Name Edit

Save the action and click Browse on the Designer toolbar.

Your web application will be displayed in the default web browser. Navigate to the Customers page and start editing any record.

You will notice the Calculate Values button displayed above and below the form fields. Click the button and you will see “+” added to the Company Name field and “-” added to the Contact Name field.

The effect of 'SQL' action calculating the field values

If you press Calculate Values button a few more times then you will see more “+” and “-” characters added to the same fields.

If you cancel the changes then the record will not be updated.

The changes made by SQL action will be persisted if you click OK button.

Action SQL causes the client library to send the current field values to the server. The core application framework knows how to handle this action.

First, the framework will find the text entered in the “Data” property of the action.

Next, it will parse the text to detect any parameters.

If you database server uses another symbol to indicate a parameter, then make sure to enter this symbol instead of “@”.

If the parameters are found then the framework will try to match them to the names of the available data fields. The application will also recognize parameters that have “_Value”, “_NewValue”, and “_OldValue” suffix. If there is a matching data field then the field’s current, new, or old value will be assigned to the parameter.

All parameters are marked as Input/Output parameters.

The application will execute the SQL text. If any parameter values have changed, then they will be packaged and sent back to the client. The client library will reflect the changed values in the user interface as if the application user has entered them in the input text boxes.

It is expected that the SQL text in action’s Data property contains instructions assigning values to parameters that are not matched to the fields. You can use any SQL language constructs supported by your database server as if you were executing them in a tool such as SQL Management Studio.

Consider the following sample data for SQL action:

declare @Temp nvarchar(50)

-- swap City and Country
set @Temp = @City
set @City= @Country
set @Country= @Temp

-- update Company Name
select @CompanyName = @CompanyName + ': ' + City + '/' + Country
from Customers 
where CustomerID = @CustomerID

Enter this text in the Data property of the action and click OK button.

Action property 'Data' in Project Designer

This is the result of action execution if you browse to a customer record, start editing, and push the Calculate Values button.

  • The @Temp parameter is used to capture the client-side value of the field City.
  • Client-side values of fields City and Region are swapped and sent back to the client
  • The client-side value of the field Company Name is appended with the database values of  fields City and Country.

    Values of fields 'City' and 'Country' are swapped. These values are also appended to the field 'Company Name'.

  • If you need more than just an interaction with the database to perform a calculation, then consider using custom business rules or shared business rules for implementation. Learn more about implementing calculations with “Custom” action.

    Saturday, March 31, 2012PrintSubscribe
    “Soft” Filtering With Business Rules

    Code On Time web applications offer impressive adaptive filtering and search capabilities that require zero programming. Consider the following screen shot from the Northwind sample.

    A complex filter defined at runtime by an application user

    Application user has selected specific categories,

    User-defined category filter

    specific suppliers,

    User-defined supplier filter

    a range of prices,

    User-defined unit price filter

    and specific values of product units on order.

    User-defined 'units on order' filter

    A user can remove the filter at will by either clicking on individual filter elements or dismissing the entire filter.

    User can remove the filter at will by either clicking on individual filter elements or dismissing the entire filter

    An application developer can also configure a filter based on arbitrary conditions at runtime. The filter can be constructed just before the data is retrieved from the database.  Users will see the filter as if they have selected all options on their own. End users can always cancel or adjust the “soft” filter to reveal more data rows.

    This may be useful when a specific data row has to be brought to the application user’s attention.  “Soft” filtering will work even better when combined with the auto highlight first row or auto select first row features.

    Enable shared business rules in your web application and enter the following code.

    C#:

    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Linq;
    using MyCompany.Data;
    
    namespace MyCompany.Rules
    {
        public partial class SharedBusinessRules : MyCompany.Data.BusinessRules
        {
            [ControllerAction("Orders", "grid1", "Select", ActionPhase.Before)]
            public void AssignOrdersFilter()
            {
                if (!IsTagged("Filtered"))
                {
                    AddTag("Filtered");
                    DateTime startDate = new DateTime(1998, 1, 1, 0, 0, 0, DateTimeKind.Utc);
                    DateTime endDate = new DateTime(1998, 6, 1, 23, 59, 59, DateTimeKind.Utc);
                    AssignFilter(
                        new FilterValue("OrderDate",
                            RowFilterOperation.Between, startDate, endDate),
                        new FilterValue("EmployeeLastName",
                            RowFilterOperation.Equal, "Callahan"),
                        new FilterValue("ShipViaCompanyName",
                            RowFilterOperation.Includes, "Speedy Express", "United Package"),
                        new FilterValue("Freight", 
                            RowFilterOperation.Between, 10, 30)
                    );
                    Result.ShowViewMessage("A \"soft\" filter has been applied to this list.");
                }
            }
        }
    }

    Visual Basic:

    Imports MyCompany.Data
    Imports System
    Imports System.Collections.Generic
    Imports System.Data
    Imports System.Linq
    
    Namespace MyCompany.Rules
        Partial Public Class SharedBusinessRules
            Inherits MyCompany.Data.BusinessRules
    
            <ControllerAction("Orders", "grid1", "Select", ActionPhase.Before)> _
            Public Sub AssignOrdersFilter()
                If Not IsTagged("Filtered") Then
                    AddTag("Filtered")
                    Dim startDate As DateTime = New DateTime(1998, 1, 1, 0, 0, 0, DateTimeKind.Utc)
                    Dim endDate As DateTime = New DateTime(1998, 6, 1, 23, 59, 59, 
    DateTimeKind.Utc) AssignFilter( New FilterValue("OrderDate", RowFilterOperation.Between, startDate, endDate), New FilterValue("EmployeeLastName", RowFilterOperation.Equal, "Callahan"), New FilterValue("ShipViaCompanyName", RowFilterOperation.Includes, "Speedy Express", "United Package"), New FilterValue("Freight", RowFilterOperation.Between, 10, 30) ) Result.ShowViewMessage("A ""soft"" filter has been applied to this list.") End If End Sub End Class End Namespace

    Save the code file and navigate to the page Orders. The method AssignOrdersFilter will be invoked when the data is about to be retrieved. The method will apply a filter one time only in the lifecycle of the page instance displayed in the web browser to prevent interference with application user actions.

    Notice that we are filtering by UTC dates to ensure that Microsoft.NET will not try to compensate for the time difference between the server and the web browser.

    In the end, the method will display a view-level message rendered just above the grid view informing the app user about the “soft”- filter.

    A list of orders with the 'soft' filtered applied in the business rules method

    Select data view Customers/ Orders / container1 / view in the Project Explorer.

    Data view selected in the Project Explorer

    If you enable Search On Start in the data view properties then the Orders page will open up with the search bar pre-filled with filter values and no data will be displayed. Users will have to click Search to initiate the retrieval of data.

    'Soft' filter will be displayed in the search bar if the data view property 'Search on Start' is turned on

    If you have enabled automatic selection or highlighting of the first row in the properties of the page data view then the view will perform the first action in the context menu of the first data row or simulate a click in the first row. This sort of behavior will happen even if you do not “soft” filter the data.

    You can also coincide the selection or highlighting of the first row with the assignment of a “soft” filter in business rules  by calling Result.SelectFirstRow or Result.HightlightFirstRow right after the call of ShowViewMessage method.

    For example, this is the effect of Result.HighlightFirstRow method call.

    The effect of calling AssignFilter and HighlightFirstRow methods in the business rules prior to data selection

    Developers should use access control rules or filter expressions when the application business logic does not permit cancellation of data filters at will by the application users.

    Continue to Shared Business Rules