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
Monday, June 25, 2012PrintSubscribe
SQL Upsert

Upsert is an insert operation with detection of duplicates. The application will update the existing record when a duplicate is detected instead of creating a new record instance. Modern database engines support a dedicated SQL command Merge that performs this function. Applications created with Code On Time offer an elegant mechanism of SQL Business Rules that allows creating flexible and configurable Merge operations.

Let’s implement upsert for the Products table of the Northwind sample. The picture below shows two duplicate records of the product “Chai”.

New Chai product entered into the list.

The upsert implementation will detect an attempt to insert a duplicated product, and will update the values of the existing one.

Delete the duplicate “Chai” record from the list of Products, and paste the following query into SQL Server Management Studio:

-- debug
declare @ProductID int
declare @ProductName nvarchar(40) = 'Chai'
declare @SupplierID int
declare @CategoryID int
declare @QuantityPerUnit nvarchar(20)
declare @UnitPrice money = 42
declare @UnitsInStock smallint
declare @UnitsOnOrder smallint
declare @ReorderLevel smallint
declare @Discontinued bit
declare @BusinessRules_PreventDefault int
-- end debug

select @ProductID = ProductID
from Products
where ProductName = @ProductName

if @ProductID is not null
begin 
    set @BusinessRules_PreventDefault = 1
    update Products
    set 
        SupplierID = IsNull(@SupplierID,SupplierID),
        CategoryID = IsNull(@CategoryID,CategoryID),
        QuantityPerUnit = IsNull(@QuantityPerUnit,QuantityPerUnit),
        UnitPrice = IsNull(@UnitPrice,UnitPrice),
        UnitsInStock = IsNull(@UnitsInStock,UnitsInStock),
        UnitsOnOrder = IsNull(@UnitsOnOrder,UnitsOnOrder),
        ReorderLevel = IsNull(@ReorderLevel,ReorderLevel),
        Discontinued = IsNull(@Discontinued,Discontinued)
    where ProductID = @ProductID
end

The sample debug parameters represent values of a new product where Product Name is “Chai”, and Unit Price is “42”. The script will try to find an existing product that matches the Product Name. If a match is found, then the application framework is instructed to prevent executing the default Insert command. This is accomplished by setting the value of @BusinessRules_PreventDefault parameter to true. Then the new record values will be used to update the existing product. If a new column value is null, then the current column value is preserved with the help of IsNull function.

Execute the query. A message will state that 1 row was affected. Go back to the application and refresh the view, and you will see that the query has only updated the existing “Chai” record.

New Chai product only updates the existing record.

Let’s integrate this script in a new business rule of Products controller.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. Right-click on Products / Business Rules node, and select New Business Rule option.

Create New Business Rule for Products controller.

Use the following properties.

Property Value
Command Name Insert
Type SQL
Phase Before
Script

Copy and paste the script from above.

This business rule will execute before every Insert command.

The application framework will ignore the debug section. You can keep the debug section in the script or take it out – it will not make any difference.

Press OK to save the new business rule. On the toolbar, click Browse option.

Navigate to the Products page. Create a new product with the following field values:

Field Value
Product Name Chang
Category Name Condiments
Unit Price 99

Instead of creating the new record, the application updated the existing product. It is automatically selected in the user interface.

When creating a new record with the same name, the field values will be applied to the existing record.

This business rule will also work with the Import action. Create a spreadsheet, and paste in the following table:

Product Name Supplier Company Name Unit Price
Alice Mutton   120
Aniseed Syrup Tokyo Traders 44
ABCDE   42

Save the spreadsheet as a CSV (Comma delimited) file type.

Save file as a CSV.

On the action bar of the web application, select Actions | Import from File option.

Import From File action on the Products list.

Make sure that the columns are matching, and press Import.

Make sure the field map is correct, and press Import.

Confirm the operation. Sort by the Product Name field by clicking on the header text. Two of the records already existed, and Unit Price and Supplier Company Name for these records has been updated. The “ABCDE” Product Name was unique, so the row was added.

Records with matching Product Name are updated thanks to Upsert implementation.

There are advantages of using SQL Business Rules over the standard Merge operation. If additional processing is required or duplicate records have to be staged in a separate table, then business rules provide more flexibility over the insert/update combination offered by Merge.

Monday, June 25, 2012PrintSubscribe
Maximum Value Count

Field samples, multi value filters, and search bar auto complete entries display up to 200 related lookup items.

Supplier Company Name multi value select with 29 items available for selection.

Let’s change the maximum number of lookup items displayed for Supplier Company Name of Products controller.

Start the web application generator. Click on the project name, and select Develop option. Visual Studio will start.

In the Solution Explorer, right-click 0n ~\App_Code folder, and select Add New Item.

Add New Item to AppCode folder of your web application. 

Select Class item from the list, and press Add.

Create a class in Microsoft Visual Studio.

Replace the entire sample content of the file with the following:

C#:

using System;
using System.Web;
namespace MyCompany.Data
{
    public partial class DistinctValueRequest
    {
        public override int MaximumValueCount
        {
            get
            {
                if (Controller == "Products")
                {
                    if (FieldName == "SupplierCompanyName")
                        return 10;
                    else
                        return 20;
                }
                return base.MaximumValueCount;
            }
            set
            {
                base.MaximumValueCount = value;
            }
        }
    }
}
Visual Basic:
Imports Microsoft.VisualBasic
Imports System
Imports System.Web

Namespace MyCompany.Data
    Partial Public Class DistinctValueRequest
        Public Overrides Property MaximumValueCount As Integer
            Get
                If Controller = "Products" Then
                    If FieldName = "SupplierCompanyName" Then
                        Return 10
                    Else
                        Return 20
                    End If
                End If
                Return MyBase.MaximumValueCount
            End Get
            Set(value As Integer)
                MyBase.MaximumValueCount = value
            End Set
        End Property
    End Class
End Namespace

This class will instruct the application framework to use 20 distinct value samples for all fields in the Products controller with the exception of Supplier Company Name. The limit for Supplier Company Name is 10. No other controllers will be affected.

Save the class. On the keyboard, press Ctrl+F5 to start the web application. Navigate to the Products page.

Activate the Supplier Company Name header dropdown. Only the first 10 items will be available for selection.

10 samples displayed for Supplier Company Name filter.

Open the advanced search bar, and activate the Auto Complete dropdown for Supplier Company Name. Only 10 items will be displayed at one time.

Advanced Search Bar auto complete dropdown only shows 10 items.

The Multi Value Filter window will only display 10 items.

Supplier Company Name multi value filter only shows 10 items.

Other fields in the Products controller will display 20 distinct value samples, such as the Quantity Per Unit header dropdown.

Quantity Per Unit distinct value sampleshow only 20 items.

Tuesday, June 19, 2012PrintSubscribe
Capturing Current User Identity

Many applications require that the name and identity of the user be captured when a record is modified. Let’s create a ModifiedByID and ModifiedByName field in the Orders table that will be updated by an SQL Business Rule whenever an order is modified.

First, let’s add the columns to the table. Start SQL Server Management Studio. In the Object Explorer, right-click on Databases / Northwind / Tables / dbo.Orders table node, and select Design.

Design the Orders table in the Northwind database.

Configure two new columns:

Column Name Data Type Allow Nulls
ModifiedByID uniqueidentifier True
ModifiedByName nvarchar(50) True

Save the table modifications. Switch to the web application generator, and refresh the Orders controller.

Refresh the Orders controller.

Regenerate the web application. Next, let’s remove the ModifiedBy fields from the presentation, and create a business rule to update these fields.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. Right-click on Orders / Views / editForm1 / c1 – Orders / ModifiedByUserID data field node, and select Delete option.

Delete ModifiedByUserID data fields from the edit form of Orders.

Confirm the operation. Right-click on Orders / Views / editForm1 / c1 – Orders / ModifiedByUserName data field node, and delete this data field as well.

Delete ModifiedByUserName data field from edit form of Orders controller.

Right-click on Orders / Business Rules node, and select New Business Rule.

New Business Rule for Orders controller.

Assign this business rule the following properties:

Property Value
Command Name Insert|Update
Name UpdatingModifiedBy
Type SQL
Phase After
Script
update Orders 
set ModifiedByUserID = @BusinessRules_UserId, 
    ModifiedByUserName = @BusinessRules_UserName
where OrderID = @OrderID

Press OK to save the business rule.

Make sure to spell the business rule properties correctly – for example, if the “@BusinessRules_UserId” function was capitalized as “@BusinessRules_UserID”, the function will not be found and an exception will be thrown.

On the toolbar, press Browse to regenerate the web application.

Navigate to the Orders page, edit a record, and save.

Edit an Order record and save changes.

View the record in SQL Server Management Studio. The relevant UserId and Name have been saved.

ModifiedByUserID and ModifiedByUserName columns have been populated by the business rule.

Continue to Value Conversion