Business Rules/Logic

Labels
AJAX(112) App Studio(8) 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(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(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
Sunday, April 22, 2012PrintSubscribe
Changing Parent of a Child on Master/Detail Pages

Code On Time web applications automatically hide the foreign key field of a detail data view on master/detail page if the field is used for relationship filtering.

Here is the screen shot that shows a master/detail relationship between Suppliers and Products in the Northwind sample application. Data rows visible in the list of products are linked to the supplier New Orleans Cajun Delights. The application client library hides the column Products.SupplierID to avoid repeating the same value in each child data row.

Master-detail relationship in the Northwind sample created with Code On Time web application generator

Automatic hiding of the foreign key field involved in master/detail filter will maximize the real estate of the page. The side effect of this convenient feature is that it is not possible for a user to change the product supplier by editing a product record in the detail data view. 

A product supplier can be changed if there is a dedicated page of products. Users will have to navigate away to that page. It will also take some time to locate the record in a dedicated view.

Foreign key fields are not hidden in data views if they are not involved in master/detail filtering

Fortunately,  a simple SQL action can be implemented to allow changing the parent of a child record even if the foreign key field is hidden by the master/detail relationship filter.

First, we need to create an action confirmation data controller.

Start the Project Designer and activate the Controllers tab at the top of the designer home page. Select New | New Controller option on the action bar, enter the following properties, and click OK button to save the controller.

Property Value
Name SupplierSelector

Activate the Controllers tab in Project Explorer and right-click the SupplierSelector / Fields node.

Adding a new field to a data controller using Project Explorer

Enter the following properties and save the field by clicking OK button.

Property Value
Name ProductName
Type String
Code Default
SelectFieldValue("Context_ProductName")
Label Product
Values of this field cannot be edited Yes

Create two more fields – SupplierCompanyName and SupplierID.

Properties of the field SupplierCompanyName.

Property Value
Name SupplierCompanyName
Type String
Code Default
SelectFieldValue("Context_SupplierCompanyName")
Label Supplier
Values of this field cannot be edited Yes

Properties of the field SupplierID.

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

The hierarchy of the SupplierSelector node shall look as follows.

The hierarchy of the 'SupplierSelector' data controller node in Project Explorer

The SupplierSelector data controller allows collecting a new Supplier ID.

Now we need to define a new SQL action in the Products data controller and use SupplierSelector as a modal confirmation form.

Right-click Products / Actions / ag1 (Grid) action group node on the Controllers tab in the Project Explorer and select the New Action option in the context menu.

Adding a new action to a group with 'Grid' scope in a web app created with Code On Time web application generator

Enter the following values in the action properties and click OK button to save the changes.

Property Value
Command Name SQL
Header Text Change Supplier
Data
update Products
set SupplierID = @Parameters_SupplierID
where ProductID = @ProductID
Confirmation

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

Click Browse on the Project Designer toolbar, navigate to the Suppliers page when the application opens in your default web browser. Open the context menu of any product and select Change Supplier option in the context menu of the product data row.

Activating a custom 'SQL' action in the context menu of a data row in Code On Time web application

The modal action confirmation will show up. Select a new supplier and click OK button to execute the action.

Modal action confirmation forms allow easy collection of parameters from the application end users

The product will disappear from the detail view. You will find it liked to the supplier record selected in the action confirmation form.

The product data row is now linked to another supplier selected in the modal action confirmation form

It is easy to access the values of fields entered in the action confirmation.

Action Change Supplier defines the following SQL script.

update Products
set SupplierID = @Parameters_SupplierID
where ProductID = @ProductID

Simply prefix the field name from the action confirmation data controller with “Parameters_”. The action implementation updates the SupplierID of selected product with the value selected in the modal confirmation.

If you are implementing custom business rules or shared business rules then you can access the values of action parameters as fields with the same “Parameters_” prefix.

Modal confirmation shows the name and current supplier of the selected product. Both fields are configured as read-only and use a similar Code Default expression. Here the expression from the SupplierSelector.SupplierCompanyName field.

SelectFieldValue("Context_SupplierCompanyName")

This code works with both C# and Visual Basic. The prefix “Context_” allows the action confirmation data controller business rules to access the field values of the controller that will be effected by the action. In our example, the name “Context_SupplierCompanyName” is referring to the SupplierCompanyName field of  Products data controller.

Saturday, April 21, 2012PrintSubscribe
Complex Action Confirmations

Application business requirements may specify actions demanding user-defined values. Field values of a selected data record are not sufficient to complete such actions.

Consider the example of implementing a custom business logic with “SQL” action. The example explains how to create a Standard Discount action that can be executed on any order in the Northwind sample application. The action will increment the discount of line items of a selected order by 1%.

The screen shot shows the application in action.

A custom action in the group with 'Grid' scope in a web app created with Code On Time application generator

The properties of the action are defined as follows.

Property Value
Command Name SQL
Header Text Standard Discount
Data
update "Order Details"
set Discount = 0
where 
    OrderID = @OrderID and Discount = 0.1
    
update "Order Details"
set Discount = cast(Discount as decimal(3,2)) + 0.01
where 
    OrderID = @OrderID and Discount < 0.1
Confirmation The discount will be increased by 1%.

If the action is selected then a simple confirmation is displayed.

A simple action confirmation in a web app created with Code On Time

A more flexible implementation of this action would allow a user to enter the exact discount that will apply to order line items. Let’s implement a confirmation that will allow capturing the discount and have it passed to the action implementation.

Start the application generator and click on the project name, click Design to activate the Project Designer. Select the Controllers tab in Designer and choose New | New  Controller option on the action bar.

Creating a new data controller in a Code On Time web application

Enter the following property values and click OK button.

Property Value
Name DiscountDialog

Right-click the DiscountDialog / Fields node on the Controllers tab in Project Explorer and select the New Field option.

Adding a new field to a data controller

Enter the following property values and click OK button to save the new field.

Property Value
Name Discount
Type Double
Code Default 0.01
Label Discount
Data Format String p

Our “confirmation” data controller is ready.

Select Orders / Actions / ag1 (Grid) / a100 – SQL | Standard Discount action node on the Controllers tab in Project Explorer.

Action with command name 'SQL' selected in Project Explorer

Change the action properties and click OK button.

Property New Value
Header Text Apply Discount
Data
update "Order Details"
set Discount = @Parameters_Discount
where 
    OrderID = @OrderID
Confirmation

_controller=DiscountDialog
_title=Apply Discount to Order Details
_width=500

Click Browse on the Project Designer toolbar to have the application generated. The home page of the app will open in the default web browser. Navigate to the Orders page and select Apply Discount option in the context menu of an order.

The modal form view will display. Enter a discount and click OK button to execute the action.

 A modal confirmation of 'SQL' action in a web app created with Code On Time web application generator

Any field values entered in the modal action parameter form are accessible in the “SQL” action script if your prefix the field name with “Parameters_”. Our script is referencing the entered Discount as @Parameters_Discout parameter.

If you are writing a custom business rules class or implementing shared business rules then you can reference the action parameter field by name “Parameters_Discount” as you would use any other field of a data controller.

The application client library displays a modal view if you define the confirmation property of the action as a collection of name/value arguments.

The library supports the following arguments. Only the “_controller” attribute is mandatory.

Argument Description
_controller The name of the data controller.
_view The ID of the view that must be activated in the modal popup. If left blank, then the first view of the data controller is activated. Optional.
_commandName The name of the start command. If left blank, then New command is the start command. Optional.
_commandArgument The optional argument of the start command.
_title The title of the action confirmation modal popup. If left blank, then the view label is displayed instead. Optional.
_width The width of the action confirmation modal popup. If left blank, then the default width of 800 is used. If the specified value exceeds 80% of the browser window width, then the popup width will be reduced to that value. Optional

The DiscountDialog controller defines a single field. There are no commands, views, or actions.

A data controller must define one or more fields to be used as an 'action confirmation'

The application framework treats data controllers that do not have a command as virtual controllers. Virtual Data Controllers are not based on a database table or view. The assumption is made that the controller has one data row only.

If the controller does not define its own views or actions then the application framework will complete the controller definition at runtime. This configuration is equivalent to the custom-defined controller shown in the picture.

A minimal 'action confirmation' data controller with custom views and actions

The virtual data controller used for action confirmation is not different from any other data controller based on a real database table or view. You can implement business rules and custom actions that may in turn require other virtual controllers for confirmation.

Developers can apply data controller virtualization techniques to customize the data controller actions at runtime according to the custom workflow requirements. For example, the action properties Data and Confirmation may be stored in a dedicated database table and applied to data controllers based on user identity.

Friday, April 20, 2012PrintSubscribe
Implementing Business Logic with SQL Action

Complex business logic can be implemented either with custom business rules or with the help of SQL action.

Consider the following example.

End user selects an order in a sample Northwind web application.
Multiple line items (order details) must be discounted with a single
user interface command.

Master-detail page in a web app created with Code On Time web application generator

Let’s add the user interface command.

Select the project on the start page of application generator and click Design.

Right-click Orders / Actions / ag1 (Grid) action group node on the Controllers tab in the Project Explorer and select New Action.

Creating a new action in 'Grid' scope in a Code On Time web application

Enter the following values in the action properties and click OK button.

Property Value
Command Name SQL
Header Text Standard Discount
Data
update "Order Details"
set Discount = 0
where 
    OrderID = @OrderID and Discount = 0.1
    
update "Order Details"
set Discount = cast(Discount as decimal(3,2)) + 0.01
where 
    OrderID = @OrderID and Discount < 0.1
Confirmation The discount will be increased by 1%.

Click Browse on the Project Designer toolbar, navigate to the Orders page, select an existing order and choose Standard Discount option in the context menu of the order data row.

Discounting order line items with 'SQL' action

Confirm the action and the standard discount of 1% will be added to each line item that have a discount less than 10%. If you keep discounting the order details, then the discount will revert to 1% after reaching 10%.

Data view Order Details is shown after execution of SQL action Standard Discount four times.  The standard discount of 4% has been assigned to all line items that have the discount less than 10%.

Data view 'Order Details' after execution of SQL action 'Standard Discount' defined in 'Orders' data controller.  The standard discount of 4% has been assigned to all line items that have the discount less than 10% by selecting 'Standard Discount' option four times.

You can affect multiple rows with the same definition of SQL action if you enable multiple selection in the Orders data view.

First, add a new action to the action group Orders / Actions / ag4 (ActionBar) – Edit/Delete.

Adding a new action to a 'flat' action group in a Code On Time web application

Set its properties as follows and click OK button.

Property Value
Command Name SQL
Header Text Discount
Data
update "Order Details"
set Discount = 0
where 
    OrderID = @OrderID and Discount = 0.1
    
update "Order Details"
set Discount = cast(Discount as decimal(3,2)) + 0.01
where 
    OrderID = @OrderID and Discount < 0.1
Confirmation The discount will be increased by 1% in all selected orders.
When Client Script
this.get_selectedValues().length > 0

The JavaScript expression in the When Client Script property is evaluated at runtime in the web browser to enable the Discount option on the action bar. The Discount option becomes visible when at least one item is selected.

Note that the SQL script is identical to the script of action placed in the group with Grid scope. You may want to consider creating a stored procedure and specifying an expression in the Data property of both actions similar to the the one shown below:

execute sp_IncreaseOrderDiscount @OrderID

Next, enable multiple data row selection mode for Customers / Orders / container1 / view1 (Orders, grid1) data view node in Project Designer.

A master data view selected in Project Explorer

Property New Value
Selection Mode Multiple

Browse to the order page of the Northwind sample application and select multiple orders.

Click Discount option on the action bar to apply a discount to the details of selected orders.

A custom 'SQL' action on the action bar of an app created with Code On Time web application generator

The application framework is aware of multiple selection and will perform one SQL action for each selected primary key value. 

Remember that application end users always have an option to go over each line item to rapidly change the Discount in the Data Sheet view by hand.

Data Sheet view in a Code On Time web application