Blog: Posts from April, 2012

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
Posts from April, 2012
Wednesday, April 11, 2012PrintSubscribe
Creating a Custom Business Rules Handler

The framework of a generated application relies on the concept of business rules  to handle various events in the application lifecycle.

Consider the following form view in a web application created with Code On Time generator. Suppose you want to capture the moment when user clicks OK button and the record is saved to the database. If this event has occurred then a visual confirmation must be displayed in the client web browser.

Form view 'editForm1' in edit mode

The client library of  application will collect all entered field values and send a request to the server components of the application to execute the Update action.

You can create a business rules class to handle this and many other situations on the server.

Start the web application generator, select the project name and click Design.

Select Products data controller on the Controllers tab in Project Explorer if you are working with the Northwind sample.

Enter ProductsBusinessRules in the Handler property of the data controller in the Business Rules section.

Properties of a data controller in Project Designer of Code On Time web application generator

Click OK button to save the changes. Press Exit button on the Designer toolbar and proceed to generate the application.

The code generator will create a file named ProductsBusinessRules.cs(vb) either in ~/App_Code/Rules folder (Web Site Factory project type) or in the ~/Rules folder of the class library of your app (all other types of projects). The file will be created only if it does not exist yet. Subsequent code generation sessions will not overwrite the file contents.

You can edit the file content in your favorite text editor. If you have installed Microsoft Visual Studio  or Microsoft Visual Web Developer than follow these steps.

Click on the project name on the start page of the application generator and choose Develop option. Visual Studio or Visual Web Developer will start. Find the file in the Solution Explorer and double-click its name to open the file in the text editor.

Business Rules class in Solution Explorer of Visual Studio in a Web Site Factory app created with Code On Time web application generator

The business rules class will look like the one shown next.

C#:

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

namespace MyCompany.Rules
{
    public partial class ProductsBusinessRules : MyCompany.Data.BusinessRules
    {
    }
}

Visual Basic:

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

Namespace MyCompany.Rules
    
    Partial Public Class ProductsBusinessRules
        Inherits MyCompany.Data.BusinessRules
    End Class
End Namespace

The definition of the standard class is empty and will have no effect on the application.

Let’s display a browser message in response to the Update action.

C#:

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

namespace MyCompany.Rules
{
    public partial class ProductsBusinessRules : MyCompany.Data.BusinessRules
    {
        [ControllerAction("Products", "Update", ActionPhase.After)]
        private void DisplayMessageOnUpdate(FieldValue productName, int productId)
        {
            Result.ExecuteOnClient(
                "alert('Product \"{1}\" with ID={0} has been changed. " + 
                 "Old product name is \"{2}\".')", 
                productId, 
                JavaScriptString(productName.Value),
                JavaScriptString(productName.OldValue)
                );
            Result.Continue();
        }

        private string JavaScriptString(object text)
        {
            return HttpUtility.JavaScriptStringEncode(Convert.ToString(text));
        }
    }
}

Visual Basic

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

Namespace MyCompany.Rules

    Partial Public Class ProductsBusinessRules
        Inherits MyCompany.Data.BusinessRules

        <ControllerAction("Products", "Update", ActionPhase.After)>
        Private Sub DisplayMessageOnUpdate(ByVal productName As FieldValue,
                                           ByVal productId As Integer)
            Result.ExecuteOnClient(
                "alert('Product ""{1}"" with ID={0} has been changed. " + _
                "Old product name is ""{2}"".')",
                productId,
                JavaScriptString(productName.Value),
                JavaScriptString(productName.OldValue)
                )
            Result.Continue()
        End Sub

        Private Function JavaScriptString(ByVal text As Object) As String
            Return HttpUtility.JavaScriptStringEncode(Convert.ToString(text))
        End Function

    End Class
End Namespace

Make sure to save the file. Bring up the application generator, select the project name on the start page and press Browse.The application will start in your default web browser.

Start editing any product and save the changes. A message will be displayed when the server application returns control to the web browser.

The result of execution of a business rule in an app created with Code On Time web application generator

Method DisplayMessageOnUpdate is executed after the record has been successfully saved to the database.

The method composes a JavaScript string that will be executed by the client library of application in the web browser. Custom function JavaScriptString is used to encode old and current product names to ensure that any characters that have a potential of “breaking” a JavaScript expression are taken care of.

If a custom JavaScript expression is passed to the client and you want to continue execution of the standard action state machine, then you need to call Result.Continue method. The client library will return to the list of products if Result.Continue has been executed in the business rules method. The method needs to be called one time only. If you comment this line out, then the record will stay in the edit mode.

Preparation of a JavaScript expression for execution in the web browser is not the only utility of custom business rules. You can perform all sorts of processing and data validation when needed. The full power of Microsoft.NET is at your disposal.

Wednesday, April 11, 2012PrintSubscribe
Focus in Tabbed Forms, Modal Window Height

Code On Time update 6.0.0.24 includes the following bug fixes and improvements:

  • If there was an exception when saving a many-to-many field then the operation is aborted and the exception is displayed to the user.
     
  • Client library will set focus on the first input field when users select a tab in a form view in edit mode.
     
  • Fixed the bug with lost focus in modal form views displayed in Internet Explorer.
     
  • The height of a modal from view will not exceed 80% of the browser window height.
     
  • Annotation plugin will correctly process the primary key fields that do not have a value in the database.
     
  • If the there is no designer change log and if the baseline file has not changed then the subsequent changes in Settings -> Refresh -> Generate sequence will be reflected in the generated application.

    For example, if you change the page layout in Project Settings, refresh the project without selecting controllers and generate the app then you will see the new layout in action. This sequence can be repeated multiple times with different project settings.
     
  • “ Bittersweet” theme is now less bitter and more sweet. On the eyes.
     
  • Floating row container issue has been fixed. This was causing incorrect rendering of pages in applications with right-to-left language cultures.
     
  • Business object builder will only consider the fields in the base table of the data controller for inclusion in the primary key.
     
  • The sequence of initialization of annotation plugin has been reverted to the one prior to the last update. The last update was causing problems when virtualization has been performed on a data controller with annotations.

     
Labels: Release Notes
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.

    Continue to "Floating" Categories