Blog: Posts from December, 2011

Posts from December, 2011
Friday, December 16, 2011PrintSubscribe
Search and Core Library Enhancements

Code On Time has released update that includes several enhancements and bug fixes described below.

  • Search in Quick Find or Automatic Search Bar will clear the selected record and hide any related details link to previously selected master. Applying a filter will also reset the selected record.
  • Date and numeric “fuzzy” values are now accepted in automatic search bar and filter filters. For example, users can now enter "Thu" in the search field of DateTime type or enter a date as 12162011 (for 12/16/2011).
  • Virtual method HandleException can be implemented to perform global exception processing for all exceptions raised when actions are executed.
  • Data access objects and BLOB processing code of the application framework now uses class ControllerUtilities to determine the "standard" views that must be used to execute SELECT / UPDATE / INSERT / DELETE operations.
    All operations with the exception of INSERT are using "editForm1". INSERT is using "createForm1". The utility class allows overriding the decision making process, which allows a non-generic view name to be returned for certain data controller when executing specific actions.
  • Calls to UpdateFieldValue in the business rule method execute in response to Command Name = "Custom" and Command Argument = "abc.." will refresh updated fields.
    This can be used as an alternative to "Calculated" fields to update values in the record in response to user-initiated action.
  • BLOB processing will allow caching if IE 6,7,8 is downloading the binary object over SSL. Otherwise it is impossible to see the downloaded file on the client.
  • Time dropdown is displayed for fields with Data Format String of "{0:g} or "{0:G}". The dropdown now correctly handles am/pm values.
  • User-defined filter "'Field' Does Not Equal 'Empty'" will now work correctly.
  • Prevents an exception raised when an empty area of Project Explorer is clicked and selected node is not available.
  • Fixed the bug with processing of "_display" argument that can specified in the URL along with data controller URL parameters.
  • Preview and Generate actions executed from within Project Designer will not raise and exception if IIS Express is not installed on the computer. The code generator will try to use the local web development server that comes standard with Visual Studio.
  • Code generator validates presence of resources referenced in the "*.*proj" files of generated projects. If the resource (file) does not exist then the reference is excluded.
    The major side effect is the ability to change the theme in the projects other than Web Site Factory without breaking the generated web app. Developers can try all available themes in all types of projects without issues.
  • Various cosmetic changes to the code generator UI.

Examples of ControllerUtilities class and sample implementation of HandleException are presented below.

The first class instructs the application framework to use myCreateForm when application data access objects are trying to insert records through MyController data controller.

The second class shows how to display a custom message instead of a generic error reported by SQL Server when DELETE statement fails due to foreign key constraints.

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

namespace MyCompany.Data

    public partial class ControllerUtilities
        public override string GetActionView(string controller, string view, string action)
            if (controller == "MyController" && action == "Insert")
                return "myCreateForm";
            return base.GetActionView(controller, view, action);

namespace MyCompany.Data

    public partial class Controller
        protected override void HandleException(Exception ex, ActionArgs args, ActionResult result)
            if (ex.Message.Contains("DELETE"))
                result.Errors.Add("Can't delete a record");
                base.HandleException(ex, args, result);
Tuesday, December 13, 2011PrintSubscribe
EASE Auditing

Tracking of user activities is a frequent requirement in many line-of-business applications. Knowing when a particular database record has been created, as well as who changed it is crucial in many industries.

Application developers rely on a proven set of techniques to satisfy data auditing requirements. They introduce data auditing columns in relevant database tables and utilize event logs to keep a journal of the system events. Values of auditing columns are updated by the application.

If the field name contains words “create”, “modified” or “update” , it’s purpose is probably to track user actions.


Consider customer table of Sakila database used to train MySQL developers. Field create_date tells when the record was created. Field last_update indicates when the customer record has changed.


If you generate an app based on this database then you will find out that additional manual configuration will be required to prevent users from entering values directly in the input fields and to ensure that fields are updates as intended. Manual configuration of auditing fields is described at /Documents/CB-CreatedBy_CreatedOn_ModifiedBy_ModifiedOn.pdf.


Unlimited edition of Code On Time offers a powerful option that makes configuration of auditing fields virtually effortless.

Select your project on the start page of the code generator and choose Settings action.

Select Features and activate EASE Configuration section.

Click on the “here” link under Audit Field Map to create sample map entries. Change the entries as shown below or in the picture.

Modified By User Name =
Modified By User ID =
Modified On Date = last_update
Created By User Name =
Created By User ID =
Created On Date = create_date


Click Finish  and regenerate the project. Try to update existing records or create new ones - you will notice that users are not able to change the auditing  fields directly, and that values of the fields are processed automatically.


Consider another example.

Almost all tables in the sample Adventure Works database are provided with ModifiedDate column. There are 99 tables and views in the R2 release of this popular training database used to illustrate the capabilities of Microsoft SQL Server 2008.


Here is how the audit field ModifiedDate look is presented if you generate a brand new Adventure Works application.


Change the Audit Field Map as follows:

Modified By User Name =
Modified By User ID      =
Modified On Date          = ModifiedDate
Created By User Name  =
Created By User ID       =
Created On Date           =

Generate the app and the same screen will look differently. Try editing records and observe that the field value is changed accordingly.


Understanding Audit Field Map

Audit Field Map associates predefined “logical” field names with the patterns of actual field names of the application database tables and views.

The “logical” field names are self-explanatory. If your application does not require a specific type of auditing then do not enter a pattern matching the logical audit field or delete the logical field from the map.

The pattern is treated as a regular expression. If you are consistently using the same field names for auditing purposes then enter the full field names as patterns. If there are variations of the fields conceptually playing the same audit role then separate the full names or name fragments with the symbol of “|” (do not include  double quotes).

Let’s build an application with the complete set of audit fields in at least one database table.

Start by creating a Web Site Factory application using the Northwind Sample.

Locate the Products page in the generated web application and begin editing a product record. Here is our version of the Products page.


Modify the Products table in SQL Server Management Studio by adding the six audit columns that follow right after the Discontinued column in the next screenshot. Allow null values in the new columns and save the changes.


Code generator does not know that the database has changed. We need to refresh the application baseline.

Select the project name on the start page of the code generator and choose Refresh action.


Toggle the check box next to the name of the data controller Products and click OK button.


Generate the application and select a product record one more time. New fields are now available and clearly require additional configuration.


Select the project on the start page of the code generator and choose Settings. Proceed to Features | EASE Configuration and enter the following Audit Field Map.

Modified By User Name = ModifiedByUserName
Modified By User ID      = ModifiedByUserId
Modified On Date          = ModifiedOnDate
Created By User Name  = CreatedBy
Created By User ID       = CreateId
Created On Date           = CreatedOn

Generate the web application and edit the exact same record.

If you compare the previous screen with the next one then you will notice that we are left with the four visible audit fields. The two fields designed to capture user IDs are not visible. Both CreateId and ModifiedByUserId are hidden from the application end users. The rest of the new audit fields are blank.

Click OK button to save the record.


Start editing the same record one more time. If you are signed in as user admin then your will see “admin” in the fields Created By and Modified By User Name.

Notice that both field names are rendered as links. If you click on a link then the default email software installed on your computer will be activated with the user’s email in the “To” input of the new message.


The physical ID of the user has been captures as well.


We suggest that you experiment edited data under different user identities to see the audit processing in action.

If you start creating new records then the audit fields will be prepopulated right away.

Future Audit Enhancements

The impressive ease of EASE Auditing will not stop here.

We are working on adding three major auditing enhancements that will become available in February of 2012.

  1. Access By/On columns will allow tracking the event of the web application user selecting a master record on the page. Typically users are looking for a record and then drill in the details. This moment in time and the user identity will be captured when needed. A perfect example of such event is a customer service representative accessing a customer account. Nothing has been changed but the fact of a person looking at the data is captured.
  2. Deleted By/On columns will help implementing a “soft delete”. The application will detect the presence of such fields and will convert “Delete” action into “Update” of the field values. The application will also filter out the “deleted” rows. Many businesses are now trying to avoid a loss of important business information and “soft delete” is a popular technique.
  3. Code On Time  web applications have unique knowledge of the data and actions that pass from the client to the server. The upcoming release of Dynamic Access Control List will also introduce an automatic logging of all user actions as a part of EASE Auditing.
Monday, December 12, 2011PrintSubscribe
Live Inspection, EASE Auditing, New Themes

Code On Time has released update The new updates includes a collection of new features and bug fixes described below: 

  • Live Inspection is now available.
  • Integrated EASE Auditing is now available in Unlimited edition.
  • New Modern and Dark Knight themes.
  • Reduced metadata footprint with all databases. Previous version would have enumerated all table columns even if the tables are not selected in the project.
  • Custom project references (for example, external assemblies) are not lost when Visual Basic projects are re-generated.
  • Mr. Adalberto Hernandez Vega has contributed Spanish localization for es-HN culture. Thank you!
  • Client Library now supports new data controller URL parameter, which allows indicating, which URL filter fields shall remain visible. The default behavior is to hide the data fields specified in the URL.
    A comma-separated list of fields can be specified as follows: _display=Field1,Field2,Field3. The client library will also populate field values from the values in the URL when _commandName is New. Read more about data controller URL parameters at /blog/2011/01/data-controller-url-parameters.html
  • Left Shift + Click on the project name will re-generate the project.
  • If the HyperlinkFormatString property of a field starts with “mailto:” then the links is formatted correctly.
  • The header text of the action group with scope "Action Column" is displayed in the header of the action column. If the text is blank then "Actions" is displayed instead.
  • Various cosmetic improvements to Project Designer.
  • Project Explorer tracks and updates multiple visible nodes linked to the same data controller on all tabs.
  • Client library detects HTML tags and does not perform HTML formatting in menus and "filter details" area of views if HTML is detected.
  • Automatic expansion of collapsed nodes in Project Explorer upon refresh of a node by monitor. 
  • Code generator will not try to delete project folders under control of Subversion.
  • Multi-field filter fields (up to five) are now available to allow multi-level master detail configuration with multi-column primary keys.
  • Client library now supports [Master.FieldName] expressions in When Client Script of actions and in new Visible When property of data views.
    Multiple-value filter fields are now working correctly.
  • Visual style of buttons in "Action Column" scope has changed.
  • Data Field Visibility is now a property of a Data Field instead of a list of Visibility expressions.
  • Shortcuts to Value/Text Items and Validators are displayed in fields and data fields.
  • Fixed the bug that was preventing deletion of visibility expressions on data fields in grid views.
  • Core.css has been changed to use the new Outer CSS class for icons. Existing apps will require modification to support custom action icons.
    For example: .NewIcon .Outer, .FlatGroupIcon.NewIcon
  • Fix the problem with disappearing “Reports|*”  nodes due to wrong schemas deduced from "_" in the names of tables.
  • Preview window is maximized if the Designer window is maximized.
  • Data controller URL parameters now support _commandName2 and _commandArgument2. The second command is executed as a follow up to the first set of _commandName and _commandArgument. Use the first set to select a record and the second command to execute a custom action on the activated record when needed.
  • CloudApp project file in Azure Factory applications is now compatible with Azure SDK 1.6.4
  • Action groups and actions feature Id property. It is used as as a CSS style on all user interface elements representing actions.
  • App Preview shows precisely on top of the Designer window. 
  • Utility Css classes are assigned to UI elements representing actions to support Designer inspection.
  • Icon column in grid views now renders a span to allow better formatting.
  • Menu options now feature Inner, Outer, and Self CSS classes to allow sophisticated styling.
  • Restored ability to go back from Controller Summary page in Project Wizard.