Blog: Posts from March, 2011

Posts from March, 2011
Wednesday, March 23, 2011PrintSubscribe
Using $external() Function in Filter Expressions

Code On Time applications support custom functions in view filter expressions. The new function $external() has been introduced in the latest web application generator update. You can use this function to access values in the URLs of the pages and values of fields listed in Context Fields property of lookup fields.

Consider the EmployeeTerritories table from the Northwind sample database.

Any territory can be associated with an employee only once due to the primary key constraint.


Here is the screen shot of the form that allows creating new EmployeeTerritories records.


The employee last name is already selected. If a user clicks on (select) link in Territory Description field then an entire set of 53 territories will be presented.


Let’s make sure the the territories that are already assigned to a selected employee are not available in the list. For example, if we assign a new territory to employee Davolio then the last territory on the first page  in the list of territories in the screen shot above, Wilton from Eastern region, is not listed along with a couple of other territories.

Start the code generator, click on the project name, click Design button, and select EmployeeTerritories data controller, click Edit, and enter EmployeeID in the input labeled Context Fields under Dynamic Properties section. Save changes.

From now on, the application will pass the value of the selected EmployeeID to the lookup view Territories.grid1 attached to field TerritoryID. If the lookup view has the field EmployeeID then the rows of Territories will be automatically filtered to match the value of EmployeeID selected in the new record.

Well, there is no field named EmployeeID in the table Territories.

Let’s create a filter expression for grid1 view in data controller Territories. Click on Home link in the bread crumbs of the Designer at the top of the page. Select Territories data controller. Activate Views tab and choose grid1. Click Edit button.

Enter the following in Filter Expression property:

$external('EmployeeID') is null or not TerritoryID in (
   select "TerritoryID" from "EmployeeTerritories"
   where "EmployeeID" = $external('EmployeeID')


Save changes, exit Designer and generate the application, navigate to Employee Territories page, select Davolio in the Employee Last Name field, and click (select) in Territory Description input. You will see a lookup window with 50 records in it. The three records that are already assigned to Ms. Davolio are not presented in the list.


Navigate to dedicated Territories page and observe that 53 records are still available there. If you enter a URL parameter EmployeeID with value of “1” in the address bar of your browser and hit Enter key then 50 records will be displayed as well. Your URL may look as the one below.


The filter expression assigned to grid1 view does not work if there is no external filter passed in the page URL or in the Context Fields of the lookup view. This is guaranteed by the first comparison in the expression.

$external('EmployeeID') is null or . . .

The second part of the filter expression will test the TerritoryID to ensure that it is not matched to any territories that are already present in EmployeeTerritories and uses $external(‘EmployeeID’) to further limit the scope of test.

Notice the use of double quotations around field and table names. Please use the appropriate symbol that works with your database server to ensure that application will not be trying to resolve the name against the dictionary of fields of the data controller.

Here is physical SQL statement executed by your application. Note that parameters @p0 and @p1 will be replaced with the value of the EmployeeID passed in a URL or as a context field.

with page_cte__ as (
row_number() over (order by "Territories"."TerritoryID") as row_number__
,"Territories"."TerritoryID" "TerritoryID"
,"Territories"."TerritoryDescription" "TerritoryDescription"
,"Territories"."RegionID" "RegionID"
,"Region"."RegionDescription" "RegionRegionDescription"
"dbo"."Territories" "Territories"
    left join "dbo"."Region" "Region" on "Territories"."RegionID" = "Region"."RegionID"

(((@p0) is null or not "Territories"."TerritoryID" in (
   select "TerritoryID" from "EmployeeTerritories"
   where "EmployeeID" = (@p1)
select * from page_cte__ where row_number__ > @PageRangeFirstRowNumber and row_number__ <= @PageRangeLastRowNumber
Monday, March 21, 2011PrintSubscribe
Hot Fix

The last update has introduced breaking changes to the baseline application generation in several instances.

Download the update and re-generate your project. If you are using the Designer Spreadsheet then please make sure to press Sync button on the project wizard page with the summary of data controllers to reflect the changes.

The previously introduced "enhancement" had no affect on our test projects and the assumption was made that there will be no harm in deploying the change. This has proven to have a significant negative effect on some projects. We apologize for any inconvenience this may have caused.

Labels: Release Notes
Tuesday, March 15, 2011PrintSubscribe
MySQL Web Applications in Minutes

Code On Time generator creates powerful user-friendly line-of-business web applications straight from MySQL databases with Microsoft Office look and feel.

Here is how you can get started.


Download the code generator at The installation program will also install Microsoft.NET 4.0, IIS Express 7.5, and Microsoft Report Viewer 2010. These components are available at no cost and fully supported by Microsoft.

The code generator will use IIS Express to run generated web applications on your computer. It can be installed alongside the production version of IIS available in several versions of Microsoft Windows.

The report viewer component will render will render dynamically created reports in PDF, Word, Excel, and TIFF formats.

Follow installation instructions and click on Code OnTime Generator shortcut created on the desktop after installation.

Generating an Application

Start new Web Site Factory project and enter MyFirstApp as the project name.

Click Next until your reach Data Connection page in the project wizard.

Select MySQL option in data provider and then either “Click here if you need assistance to build the connection string” or enter the connection to your database directly in Connection String.


Here is the connection configuration screen that will assist in entering a valid connection string. In the screenshot below we have specified a connection to the demo “SAKILA” database available from


Test the connection, press OK button and click Next until you arrive to Reporting page.

Enable dynamic and static reporting in your project.


Click next and you will see Authentication and Membership page of the project wizard.

Select the check box titled “Enable support for ASP.NET Membership with membership bar user manager”.

Select the check box “Membership will use a standalone database that already exist”. Select MySQL option in Provider Name.

You can enter a connection to the project database  (sakila database in our example).

You can also point the connection string to a brand new MySQL database to store ASP.NET membership data that can be shared between multiple projects. Note that you have to create the database on your own. For example, you can have MySQL execute “create database users”  command. Specify the name of the “users” database in the membership connection string.

The generated application will automatically initialize supporting data structures and stored procedures though MySQL ASP.NET Membership provider. This provider is included with MySQL Connector/NET that you already have on your computer if you are using MySQL with ASP.NET and Microsoft tools.

Click Next several times until your see a list of data controllers created from your database.


Now you are ready to generate an application and see it in action.

Click next and wait for the application to be displayed in your web browser. If the browser page comes out blank then simply give it a few moments and hit Refresh button. This may happen if your computer is busy and IIS Express is still getting ready to start the generated web application.

You should see the following screen.


Using Generated Web Application

Make sure to keep the code generator running. Code On Time will automatically shut down the started IIS Express instances if close the web application generator window.

Sign-in using one of the user accounts automatically created by application.  We suggest that you sign in as admin / admin123% . This user account is authorized to see the membership manager.

Click around and play with the generated pages.

Here is the screenshot of the Film page if you select a record. Master record is shown in edit mode with the detail records tabbed at the bottom. Several other standard page layout are available. You can use the project Designer to create custom layouts. Click on the link to see an example of a custom Order Form.


Note that detail records can be edited in modal forms if you are using a commercial edition of the web application generator.


Filter some data to try Quick Find and multiple-value adaptive filtering.


Select Report | Adobe PDF option from the action bar of any grid view and take a look at PDF printout of your data with custom filters displayed in the report header.


Select Actions | View RSS Feed and subscribe to the feed to be notified by your RSS feed reader when new movies with the filtering criteria become available. How needs email anymore?


Try some cool data analysis features that allow extending your application and data to the end-user desktops enabling safe and efficient data delivery to business users.

Select Actions | Export to Spreadsheet to export data for analysis.


A prompt will show up to warn you that some data is being downloaded.


Press Open button to open the file. This will start Microsoft Excel. You will see a warning about potential security concern.


We are downloading data from our own application – there is no risk involved. Press Enable button to continue.

The data will be downloaded into a new Worksheet. You may be asked to identify yourself. Enter admin/admin123% or any other valid user account registered in the application membership database.


Select Insert on the ribbon and click PivotTable button.


Confirm the creation of a data range.


Now you are good to go. Here is the pivot view of the movies database that shows distribution of movie categories by rating.


With a few clicks turn that into a Pivot Chart.


Within minutes business users can make sense of their data and have amazing dashboards built in the tool they know best –Microsoft Excel. 

The data feed embedded into the spreadsheet is live. Users can save the spreadsheet on the hard drive.

To refresh the data users can open the spreadsheet and select Refresh button on the Data tab of the ribbon.


Users will be prompted to re-enter the user name and password. The user’s identity will be verified against the database and the data feed will be refreshed.


Astonishing  business features and friendly user interface of generated web application make your MySQL database instantly a heart of the business operations.

Review code customization techniques at to learn how to use application designer to enhance the application and how to write custom business rules if the standard features of the generated application need to be enhanced.