Code Generator

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
Code Generator
Tuesday, June 22, 2010PrintSubscribe
Using My Own Folder For Code On Time Files

Q. How can I change the working directory for a project generated by CodeOnTime?

A.

Code OnTime Generator uses [My Documents]\Code OnTime folder to install the code generation library templates. The same folder is used to create code generation projects.

Download the file at /documents/codeontime.exe.zip.

The archive contains CodeOnTime.exe.config file. The contents of the file are listed below:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
            ..............
    </configSections>
    <applicationSettings>
        <CodeOnTime.Properties.Settings>
            <setting name="MyDocuments" serializeAs="String">
                <value>c:\Code OnTime Root</value>
            </setting>
        </CodeOnTime.Properties.Settings>
    </applicationSettings>
</configuration>

Unzip and copy the attached file to the [Program Files]\Code OnTime LLC\Code OnTime Generator folder.

Create a folder on your local hard drive and replace "c:\Code OnTime Root" in the CodeOnTime.exe.config with the path to your folder. The generator will start using this folder instead of [My Documents], when you restart the program.

Friday, May 21, 2010PrintSubscribe
Sort and Filter

Web Site Factory applications can now use declarative sort and filter expressions on data views. This feature allows effecting just-in-time ORDER BY and WHERE clause automatically created by the application framework at runtime without the need to modify the command.

Multiple views can use the same command and offer different sort and filter expression.

Sort Expression

Run Code OnTime Generator and select your project. Click Design button and select the data controller. Activate Views tab and choose grid1. The following screen is presented if you edit the view and enter the sort expression. Sort expression is a list of data field names of this view, each followed by optional asc or desc suffix.

Here is how the grid1 view looks if you enter the sort expression in the application created from the Northwind database.

image

If you save the changes and preview the data controller in the Test Bench then the initial list of customers will look like then one in the picture.

image

The actual SQL  statement executed at runtime looks like the one below. Notice that ORDER BY in the common table expression has been expanded with the actual table column names represented by Country and CompanyName fields.

with page_cte__ as (
select
row_number() over (order by "Customers"."Country" ,"Customers"."CompanyName"  desc) as row_number__
,"Customers"."CustomerID" "CustomerID"
,"Customers"."CompanyName" "CompanyName"
,"Customers"."ContactName" "ContactName"
,"Customers"."ContactTitle" "ContactTitle"
,"Customers"."Address" "Address"
,"Customers"."City" "City"
,"Customers"."Region" "Region"
,"Customers"."PostalCode" "PostalCode"
,"Customers"."Country" "Country"
,"Customers"."Phone" "Phone"
from
"dbo"."Customers" "Customers"

)
select * from page_cte__ where row_number__ > 0 and row_number__ <= 5

Filter Expression

Filter expression must be compatible with the back-end database server syntax. Data field names used in filter are automatically expanded into appropriate SQL expressions as defined in command.

Suppose you enter the following filter expression in the Northwind sample.

image

This filter expression will result in the following expression executed by the framework at runtime.

with page_cte__ as (
select
row_number() over (order by "Customers"."Country" ,"Customers"."CompanyName"  desc) as row_number__
,"Customers"."CustomerID" "CustomerID"
,"Customers"."CompanyName" "CompanyName"
,"Customers"."ContactName" "ContactName"
,"Customers"."ContactTitle" "ContactTitle"
,"Customers"."Address" "Address"
,"Customers"."City" "City"
,"Customers"."Region" "Region"
,"Customers"."PostalCode" "PostalCode"
,"Customers"."Country" "Country"
,"Customers"."Phone" "Phone"
from
"dbo"."Customers" "Customers"

where
(
ContactTitle='Owner')
)
select * from page_cte__ where row_number__ > 0 and row_number__ <= 5

The filter expression is inserted verbatim in the command text.

Filter expressions support parameters. Parameters must be prefixed by "@" or ":" symbol. You must implement a business rules class for the data controller with a property or field that matches the parameter name.

If you modify the filter expression as follows then additional configuration steps are needed.

ContactTitle = @ContactTitleFilter

First you need to define the name of the business rules class for your data controller. We have entered CustomerRules in the field Handler as displayed in the screen shot.

image

Then you need to generate the application. This will create the business rules class in the file ~/App_Code/Rules/CustomerRules.cs(vb).

The file will not be overwritten if you re-generate the code next time. It is safe to place your custom business logic in it. The sample filter implementation of property ContactTitleFilter in C# is performing conditional filtering of customers by Contact Title.

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

namespace MyCompany.Rules
{
    public partial class CustomerRules : MyCompany.Data.BusinessRules
    {
        public string ContactTitleFilter
        {
            get
            {
                if (Context.User.IsInRole("Administrators"))
                    return "Owner";
                else
                    return "Sales Agent";
            }
        }
    }
}

This is the screen shot of Customers screen presented to user account user/user123%.

image

Thursday, February 11, 2010PrintSubscribe
Test Bench, Relationship Discovery, Denormalization Field Map, Auto Generated Fields in Grid Views

Test Bench

Code OnTime Designer has been enhanced with the Test Bench. This tool is designed to speed testing of data controllers without leaving the design environment. Action bar displayed above the settings of a data controller elements now features the “Preview” action.

If you click on the action then Code OnTime Generator will automatically create a test site based on Web Site Factory premium project. The test project will feature a single page named after the currently selected data controller. A browser window will open automatically as soon as the project has been generated. If this is your first time invoking the Test Bench then it will take some time to generate the initial code of the test site. Subsequent requests to preview data controllers will run much faster and will allow quickly testing changes without generating the entire project.

This illustration shows the Preview action on the action bar of the data view category list of Employees data controller from the Northwind sample. We just have changed the Floating attribute of Employees category to Yes.

image

We click on the Preview button and the Test Bench web site is opened in a new browser window in just a few seconds. If we select an employee then the following presentation will be rendered.

image

Denormalization Field Map

The code generator will automatically discover relationships between data objects in your database and create the corresponding business objects by denormalizing the data object relationships.

For example, sample database Northwind features Products and Suppliers tables. Products  table refers to Suppliers via foreign key that links dbo.Products.SupplierID and dbo.Suppliers.SupplierID fields. The code generator will automatically include the first most appropriate field from the Supliers table to complement dbo.Products.SupplierID field. The automatically selected field is Suppliers.CompanyName, which is included into Products business object as SupplierCompanyName.

You will probably agree that this make sense. Sometimes the code generator will select a field that does not make much sense at all. You can assist the code generator by supplying a denormalization field map on Business Logic Layer page of the project configuration wizard.

 image

Here is a sample denormalization field map:

dbo.Products => dbo.Suppliers
ContactName
ContactTitle
Fax
Phone

dbo.Employees=>dbo.Employees
LastName
FirstName

dbo.Orders=>dbo.Employees
LastName
FirstName

dbo.Order Details=>dbo.Products
UnitPrice

This map will ensure that ContactName, ContactTitle, Fax, and Phone are included into Products business object and any other business objects that include references to the products.

For example, OrderDetails business object will also include ContactName, ContactTitle, Fax and Phone of the product supplier with the appropriate prefix (ProductSupplieContactName, ProductSupplierContactTitle, etc.)  in front of the field name.

Employees business object is based on a self-referring Employees data object. The foreign key name is ReporsTo. The business object will have ReportsToLastName and ReportsToFirstName fields automatically included in its field roster by the code generator.

Another option of denormalization is to use Code OnTime Designer to add the appropriate formula fields directly to the data controllers. The advantage of using a denormalization map is that it will save you a bunch of mouse clicks in the Designer. The advantage of using the Code OnTime Designer for denormalization purposes is that explicitly declared formula fields can include custom expressions that go beyond a simple field reference delivered through the map.

Relationship Discovery

If you are missing a foreign key in a database or opted not to have an explicit foreign key for some other reasons then you can use Relationship Discovery mechanism to enter the missing relationships, which will help the code generator to construct the correctly denormalized business objects.

image

Here is an example:

foreign key dbo.Products(SupplierID) references dbo.Suppliers(SupplierID)

foreign key dbo.Orders(CustomerID) references dbo.Customers(CustomerID)

foreign key dbo.Order Details(OrderID) references dbo.Orders(OrderID)

foreign key dbo.Order Details(ProductID) references dbo.Products(ProductID)

Any child/parent relationship specified in relationship discovery overrides the corresponding physical foreign keys automatically discovered in the database. You can set the discovery depth to zero to take complete control over the fields that will be automatically included into composed business objects during denormalization process.

If there is a relationship specified in Relationship Discovery then the discovery depth is ignored when the code generator is following the relationship during denormalization.

The relationship discovery will be updated in the future to support primary key definitions, which will allow to automatically build business objects based on database views.

Auto-Generated Fields in Grid Views

Standard grid views created by the code generator automatically will include ten first fields that are suitable for display to end users. You can change this number on the Features page of the project configuration wizard as shown on the picture below.

image

You can use Code OnTime Designer to re-arrange any data fields that were automatically generated.

Continue to Learn by Example