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
Tuesday, July 24, 2012PrintSubscribe
FileName Action

Actions Export to Spreadsheet, Download, and Report will produce a file when executed on the server. The file name is a concatenation of the data controller and the view.

Customers generated report file named after the controller and view.

Let’s create a business rule that will assign custom names to the output files.

First, enable shared business rules and regenerate the project. Start the Project Designer and click Develop on the toolbar to open the project in Visual Studio.

In the Solution Explorer, double-click on ~\App_Code\Rules\SharedBusinessRules.cs(vb) file.

SharedBusinessRules file in the Solution Explorer.

Replace the default code with the following:

C#:

using System;
using MyCompany.Data;
using System.IO;

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

        public SharedBusinessRules()
        {
        }

        // 1. "Actions | Export to Spreadsheet" in any controller
        [ControllerAction(".", "FileName", "ExportRowset")]
        public void AssignFileNameToExportSpreadsheet(string fileName)
        {
            UpdateFieldValue("FileName", String.Format("Live {0} Data Link.iqy", 
                ControllerName));
        }

        // 2. "Actions | Download" in 'Suppliers' controller
        [ControllerAction("Suppliers", "FileName", "ExportCsv")]
        public void AssignFileNameToDownloadCsv(string fileName)
        {
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} Supplier List.csv", 
                DateTime.Now));
        }

        // 3. "Report |.." in any data controller
        [ControllerAction(".", "FileName", "Report")]
        [ControllerAction(".", "FileName", "ReportAsPdf")]
        [ControllerAction(".", "FileName", "ReportAsExcel")]
        [ControllerAction(".", "FileName", "ReportAsWord")]
        [ControllerAction(".", "FileName", "ReportAsImage")]
        public void FormatReportFileName(string fileName)
        {
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} {1}{2}",
                DateTime.Now,
                Arguments.Controller,
                Path.GetExtension(fileName)));
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System
Imports System.IO

Namespace MyCompany.Rules

    Partial Public Class SharedBusinessRules
        Inherits MyCompany.Data.BusinessRules

        Public Sub New()
            MyBase.New()
        End Sub

        ' 1. "Actions | Export to Spreadsheet" in any controller
        <ControllerAction(".", "FileName", "ExportRowset")>
        Public Sub AssignFileNameToExportSpreadsheet(fileName As String)
            UpdateFieldValue("FileName", String.Format("Live {0} Data Link.iqy",
                                                       ControllerName))
        End Sub

        ' 2. "Actions | Download" in 'Suppliers' controller
        <ControllerAction("Suppliers", "FileName", "ExportCsv")>
        Public Sub AssignFileNameToDownloadCsv(fileName As String)
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} SupplierList.csv",
                                                       DateTime.Now))
        End Sub

        ' 3. "Report |.." in any data controller
        <ControllerAction(".", "FileName", "Report")>
        <ControllerAction(".", "FileName", "ReportAsPdf")>
        <ControllerAction(".", "FileName", "ReportAsExcel")>
        <ControllerAction(".", "FileName", "ReportAsWord")>
        <ControllerAction(".", "FileName", "ReportAsImage")>
        Public Sub FormatReportFileName(fileName As String)
            UpdateFieldValue("FileName", String.Format("{0:yyyy-MM-dd} {1}{2}",
                                                       DateTime.Now,
                                                       Arguments.Controller,
                                                       Path.GetExtension(fileName)))
        End Sub
    End Class
End Namespace

Save the file.

The implementation handles FileName action with arguments equal to the action command names that require an output file. For example, Export to Spreadsheet action has it’s command set to “ExportRowset”. The application framework will try to obtain a custom filename from the business rules by raising an internal action with command name of “FileName” and argument of “ExportRowset”. If the business rules are updating the filename, then the new name will be assigned to the output file.

Press Ctrl+F5 keyboard shortcut to run the web application. Navigate to the Suppliers page. On the action bar, click Actions | Download.

Download action in the suppliers grid view.

The name of the file will be the current date followed by “Supplier List”.

Download action produced a file with a custom name.

Report action file output will be named with the date and controller name.

PDF Report produced a file with a custom name.

The Export to Spreadsheet action will name the file “Live Suppliers Data Link”.

Export action also produces a file with a custom name.

Monday, July 23, 2012PrintSubscribe
Custom Modal Forms with SQL Business Rules

Custom modal forms can be used to collect parameters from the user and pass them to business rules for processing.

A custom data controller without a command can define fields, presentation views, and actions. Such controllers may be used as confirmations for actions for the purpose of collecting input parameters.

Let’s consider the steps involved in the creation of a confirmation data controller using a Northwind sample application.

Child views in a master/detail relationship will automatically hide the foreign key field to prevent duplicate display of the field value. This means that the Supplier Company Name field in the list of supplier products controller is hidden.

Suppliers page with Products child view. Products view does not display the foreign key field.

However, sometimes the user may want to change the foreign key of a child record. This may occur if a product is incorrectly associated with a supplier. One solution is to navigate to the standalone Products page where the supplier lookup is visible. A better alternative would be to create a custom action displaying a modal form that will allow the user to change the foreign key field in the child list of products.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. On the toolbar, press New Controller icon.

New Controller icon on the Project Explorer toolbar.

Give this controller the following name:

Property Value
Name SupplierSelector

Press OK to save the controller. In the Project Explorer, right-click on SupplierSelector / Fields node, and select New Field option.

New Field context menu option for Fields node in the Project Explorer.

Give this field the following properties:

Property Value
Name ProductName
Type String
Length 40
Label Product
Values of this field cannot be edited True

Press OK to save. Create another field:

Property Value
Name SupplierCompanyName
Type String
Length 40
Label Supplier
Values of this field cannot be edited True

Save this field, and create one more.

Property Value
Name SupplierID
Type int32
Label New Supplier
Items Style Lookup
Items Data Controller Suppliers
Items Value Field SupplierID
Items Text Field CompanyName

Save the field. Right-click on SupplierSelector / Business Rules node, and select New Business Rule option.

New Business Rule context menu option in the Project Explorer.

Give this business rule the following properties:

Property Value
Type SQL
Command Name New
Phase Execute
Script
set @ProductName = @Context_ProductName
set @SupplierCompanyName = @Context_SupplierCompanyName

Press OK to save.

SQL Business Rule handling New action in SupplierSelector data controller.

In the Project Explorer, right-click on Products / Actions / ag1 (Grid) node and select New Action option.

New Action context menu option in the Project Explorer.

Give this action the following properties:

Property Value
Command Name Custom
Command Argument CustomModalForm
Header Text Change Supplier
Confirmation

_controller=SupplierSelector
_title=Select a New Product Supplier
_width=500

Press OK to save. Right-click on Products / Business Rules node, and select New Business Rule option.

New Business Rule context menu option for Products controller.

Use the following properties:

Property Value
Type SQL
Command Name Custom
Command Argument CustomModalForm
Phase Execute
Script
--update the product supplier
update Products
set SupplierID = @Parameters_SupplierID
where ProductID = @ProductID
--'forget' the previously selected product
set @ProductID = null
--force the data view to refresh
set @Result_Refresh = 1

Press OK to save.

SQL business rule processing custom action for Products controller in Code On Time Project Explorer.

On the toolbar, press Browse.

Navigate to the Suppliers page, and select a supplier. In the context menu of a product, select Change Supplier.

Change Supplier context menu action in the list of products.

A custom modal form will open, displaying the current Product and Supplier.

Custom modal form allowing user to select a new product supplier.

Use the lookup to select a new supplier.

Suppliers lookup.

Press OK to confirm, and the supplier of the product will change to the new supplier.

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
Continue to Code Value