Model Builder

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(8) OAuth Scopes(1) OAuth2(11) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(10) PKCE(2) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(179) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(80) 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)
Model Builder
Thursday, May 30, 2019PrintSubscribe
VS 2019, Multi File Upload, Command Line Mode
Code On Time release brings support for Visual Studio 2019, Multi-File Upload in Touch UI applications, and new command line options that allow creating apps with automated scripts.

Start using Visual Studio 2019 with your projects. The new development environment is fully integrated in the app generator. If you do have an existing project and want to migrate to the latest tools from Microsoft, then select the app on the start page of the generator and choose Open option. File Explorer will show the project files. Either delete the file with *.sln extension and regenerate your app or right-click the solution file, open it with Visual Studio 2019, select the solution file item in Solution Explorer, and press Ctrl+S.

Multi-file Upload is now available in Touch UI if you add Upload action to a compatible data controller. End users of your app will be able to choose multiple files to upload. The app will create a database record for each file, have the file submitted to the server, and persist it to the first BLOB field.

Command Line support is now available in the app generator.

Enter the following in the command line to generate a database app that works on mobile devices and in the web browser:

codeontime -Generate "c:\apps\myapp3" -DbConnection "Data Source=;Initial Catalog=northwind-cmd;Integrated Security=True;" -run

Build mobile and web database apps in seconds in command line. Use generated apps to validate your ideas, prototype data input forms, enter sample data, and much more. Apps built with Code On Time are metadata-driven. Create you own customization tools to invoke codeontime.exe in command line mode. The upcoming Code On Time v9 will be using command line mode extensively since the entire development environment is incorporated directly in the apps.

The following features and fixes also included in this release:
  • (Model Builder) All words in field labels are capitalized when a model is created.
  • (Touch UI) Optimized packaging of JSON properties of FieldValue object instances to minimize footprint for offline/disconnected logging.
  • (Client Library) Values of static Check Box List are correctly displayed when more than one item is selected.
  • (Framework) Blob adapter configuration is not included in the JSON controller descriptor.
  • (Touch UI) Selection of files in BLOB input will make the input focused.
  • (Framework) New TemporaryFileStream class is used for temporary storage of BLOB content.
  • (Touch UI) Method $app.confim support chained alternative execution of code with promises when confirmation is canceled.
  • (Offline Sync) Concurrent uploading of BLOBs is implemented with optional reconciliation of failed to upload blobs.
  • (Offline Sync) End user can opt to sync without data refresh. The option will remain selected until data refresh is explicitly requested. This makes possible working offline and only uploading changes to the server.
  • (Framework) Batch Editing of many-to-many fields works correctly when the primary key field is explicitly included in the view.
  • (Framework) Batch Editing will not erase values of many-to-many fields that are not selected in the Batch Edit form.
  • (Framework) Surveys accept inline functions and non-string values as "Visible When" and "Read Only When" expressions in questions and topics.
  • (Framework) Signature prompt is vertically aligned to the middle.
  • (Touch UI) Download icon is not displayed anymore next to "DOWNLOAD" button.
  • (Offline Sync) Added support for signatures.
  • (Touch UI) Placing $none in "Notify" property of action will prevent notification from being displayed.
  • (ODP) Completed implementation of thumbnail production on the client.
  • (Model Builder) New implementation of multi-level construction of Copy property of lookups for both 1-to-Many and 1-to-1 relationships.
  • (Classic) Implementation of BLOB uploading is now moved to Offline Data Processor.
  • (Framework) Download cookie is set on the server only when specified in the request.
  • (Framework) Azure Blob Adapter now uses HTTPS by default.
  • (Touch UI) Fixed signature resizing.
  • (Model Builder) "Enter" key in the property of the last field will post changes and re-select the same field property.
  • (Localization) Italian localization contributed by Massimo Ciurleo.
  • (ODP) Signatures in child data views are fully supported in transactional mode (when odp is enabled).
  • (Project Wizard) New "Addons" section in Features.
  • (Framework) Filter expression in the model will not cause errors when advanced search is executed.
  • (Framework) Default transaction scope is "sequence",
  • (Offline Sync) If transaction scope is "sequence" then ODP-assigned sequence is overridden with an offline sequence number. If transaction scope is explicitly set to "all", then the sequence is assigned to 0 for all transactions in the log.
  • (Touch UI) Button "driving directions" correctly composes Google Maps query based on fields tagged as map-latitude and map-longitude.
  • (Client Library)  Failed blob will be abandoned since there is not much that the user can do. The row was either inserted or updated already. The blob was rejected by the server. Abandoning of blob eliminates infinite loop of submission.
  • (Framework) A registration record for on-demand fields with blank "On Demand Handler" is not generated in Blob.generated.cs(vb) to prevent duplicate "empty" handlers when more than one such field is defined.
  • (Classic) Rich Text editor correctly sets the value produced in custom editors.
  • (Classic UI) Data views correctly synchronize with the inserted record.
  • (Touch UI) Forced notifications without text will not cause an empty alert displayed when ui.notification.enabled = false.
  • (Framework) Generated data access object has a unique name to prevent clashing with parameters created from access control rules.
  • (Framework) New property ApplicationServices.DisplayName returns application name. The value is derived either from the default app name or from the value stored in appName property in ~/touch-settings.json.
  • (Framework) Method ApplicationServices.ValidateBlobAccess ensures that user can access the row that contains the BLOB field. The field must also be accessible to the user. Otherwise access to blob is denied.
  • (Touch UI) Context menu options for child data views that were defined in their own containers are not displayed anymore. Use fields of DataView type to display child data instead. Previously visible context options have caused exceptions at runtime.
  • (Framework) Method NodeSetCollection.SetTag correctly sets tags for both data fields and views in both singular and chained calls.
  • (Touch UI) Inline editing in child data views will not cause identity fields to be marked as "Modified" and allow entering rows without errors
  • (Touch UI) Refactored panel opening and closing.
Our next goal is to release Offline Data Processor and Offline Sync in update due out by the end of June 2019. We are skipping release numbering since both features are being released together. Cloud On Time for Android will be out in July 2019. The new roadmap has been prepared and will be unveiled soon!

Tuesday, March 5, 2019PrintSubscribe
Build Apps Faster With Maps and Postal Address Verification
Code On Time release brings the upcoming live designer another step closer to reality and introduces various cool features in the application framework including Postal Address Verification, external JavaScript business rules, enhanced batch editing of many-to-many fields, maps in forms, and much more. We also hope that you will notice the significant increase in the code generation speed.

For the past few years we were developing a new innovative development environment to revolutionize Rapid Application Development of custom business applications that work offline, online, and on-premises. This particular release makes your apps ready for Code On Time v9. Today you are starting the Design environment by selecting the corresponding option in the project wizard. In the very near future your own app will be launched with the new design environment  overplayed on top! The upcoming live designer is implemented as addon.appbuilder.dll automatically included in the ~/app/bin folder of apps created with v9. The add-on integrates its own scripts in the application. The design environment is composed of Project Explorer and Object Inspector. Developer can click on user interface elements of their live app to inspect properties of the corresponding elements and have them changed when needed.  Changes to some properties (such as labels), will provide instant feedback in the user interface of the live app. Any significant changes will cause the app to be re-generated and restarted when the developer is ready to see the end result.

The mechanism of code generation has been changed significantly in release to speed-up the code generation and improve the start time of the app. In many cases the app generator will replace only a few files in the source code and eliminate the need for hard restart of the app.

Published app will not include the add-on DLL in the output. App Builder add-on is not required for your apps to work. It is activated only if Code On Time generator is installed on the machine and if your app is accessed via localhost address. Both Touch UI and Classic UI apps will work with the new app builder, when released. You will be able maintain the source code of your apps in Visual Studio and work with the source control systems such as Git. Nothing will change from the development prospective.

Autofill and Postal Address Verification

Postal Address Verification is the new feature built on top of Autofill, the mechanism embedded in the universal input elements of apps created with Unlimited Edition.

An autofill group is created by tagging multiple fields with tags that start with "autofill-" prefix. For example, autofill-address-city. Component "address" in the tag defines the name of the group. Component "city" is the group-specific purpose of the field and does not need to match the physical field name. The trigger field in the group will cause "AutoFill" command to execute. More than one trigger can be declared by tagging multiple fields with autofill-[groupname]-trigger attribute. All trigger fields must have values for "AutoFill" command to execute.

The framework implements processing of autofill-address-, autofill-geocode-, and autofill-map- groups. Group address will verify postal addresses with Google Geocoding API. Addresses in the United States can be also optionally verified with USPS.  Group geocode will perform address lookup from latitude and longitude fields in the group. On-Demand field tagged as autofill-(address|geocode)-map will resolve the address into a static map presented to the user.


New event is triggered on the document to allow a custom script to form. For example, the following script will display a login form if Test item is selected in the menu.

(function () {
    $(document).on('', function (e) {
        if (e.item.url === '/pages/test') {
                controller: 'MyProfile', 
                view: 'loginForm',
                startCommand: 'New',
                startArgument: 'loginForm'
            return false;

This is how the app will behave in response to the user actions:

External JavaScript Business Rules

It is now possible to create JavaScript business rules without explicit definition in the data controller. Save the file in ~/js folder of the app, put a breakpoint, and hit Ctrl+F5 when the app is loaded in the browser. Your custom business rules will execute in Before phase giving you complete control over various behaviors of the app. This type of business rules is also support in native mode.

This particular sample when force the user to enter USA in the Country field of Suppliers controller for the record to save. This is a perfect example of client-side validation.

Also the user will not be able to execute New command and therefore will not be able to bring up the form to create new records.

(function () {
    $app.rules = {
        'Suppliers': {
                function (dataView, args) {
                    var data =;
                    if (data.Country !== 'USA') {
                            fieldName: 'Country',
                            message: 'Only USA is allowed in this field.'
                        return false;
            'New': function (dataView, args) {
                $app.touch.notify('You are not allowed to create new records.');
                return false;


This how it make look at runtime:

Also Included

The following features and bug fixes are included in this release:

  • (Batch Edit) Many-to-Many fields display "keep original selection" and "delete original selection" options to allow either expanding the set of selected options or to have it replaced with a new set.
  • (EASE) Tracking of created/modify by/on fields does not overwrite the values of Created By/On fields when blobs are uploaded.
  • (EASE) Modified/Created By/On fields are displayed on form views in edit/read mode.
  • (EASE)  Modifed/Created By/On fields are not displayed in form views in "new" mode.
  • (Classic UI) Projects with advanced options and "Classic UI" are correctly generating the theme folder.
  • (Framework) Data access objects based on models without a primary key will not result in compilation error when the app is generated.
  • (Touch UI) Floating category without wrapping will display 2 or 3 columns of fields with the minimal width of the form equal or greater than MD and LG accordingly.
  • (Touch UI) Floating category with wrapping will display 2, 3 or 4 columns of fields with the minimal width of the form equal or greater than SM, MD,  and LG accordingly.
  • (Touch UI) Import treats dates serialized in Excel files as UTC dates and performs de-serialization equivalent to the one performed when getting data from the server.
  • (Touch UI) Smart dates are instantly refreshed if a date value is changed by user via direct input without using the calendar popup.
  • (Touch UI) Map locations on iOS and Mac open via OS-specific URLs.
  • (Touch UI) URLs prefixed with "_blank:" will open in the default OS web browser when running in native mode (Cloud On Time or branded host app).
  • (Classic) Modal forms with conditionally visible content are resized after dragging.
  • (Classic) Initial state of "form" buttons with When Client Script expressions is calculated correctly.
  • (Touch UI) JavaScript expressions specified in When Client Script property of actions are evaluating the current row using the same mechanism as the Visible When and Read Only When expressions of fields and categories. This improves performance and addresses issue of incorrect values tested when form views are opened.
  • (Touch UI) RTF editor toolbar is fully visible whatever the position of the "Rich Text" field in the form view.
  • (Touch UI) RTF fully supports "Dark" theme.
  • (Touch UI) Calendar view does not display "New/grid1" option when user clicks the calendar to create an event.
  • (AppGen) Display name of the projects is used as application name when the app name is not defined in the project features.
  • (Touch UI) ListBox/RadioButtonList/CheckBoxList do not cut the bottom of item in FireFox browser.
  • (Classic)  Dedicated Login page correctly links bootstrap CSS file.
  • (AppGen) It is now again possible to create new projects based on ASPX page model with the framework in the class library.
  • (Framework) Message "unable to load..." with either the name of the resource script of path to the script is reported if there was an exception while enumerating client library scripts.
  • (App Gen) All translated files are created with UTF-8 encoding Byte Order Marker. If the translated resources are the same, then the files are not overwritten.
  • (AppGen)  All files are saved in UTF-8 format with explicit Byte Order Marker during the build process of the project.
  • (AppGen) VB projects with the core framework in the class library are generated correctly.
  • (Touch UI) Confirmation controller will display the value of "data field" of the context record in the header of the form.
  • (Touch UI) Action with confirmation controller will cause explicit validation of field value before execution. If action causes validation error, then the confirmation controller will not execute until all validation errors are fixed.
  • (Action State Machine) Calling BusinessRules.PreventDefault() method will cause action state machine to stop processing of actions unless Result.Continue() was explicitly requested or the command name was Insert|Update|Delete. 
  • (Action State Machine) If a value is assigned to Result.NavigateUrl in business rules, then the framework will stop processing of the actions unless Result.Continue() is called explicitly in business rules.
  • (Touch UI) Event is triggered on the document whenever a form layout is required. Event is triggered once and the output is cached as needed.
  • (Project Wizard)  App generator version is embedded in DataAquairum.Project.xml to ensure regeneration of core framework files when f the project has been cloned/copied after a product update installation.
  • (Project Wizard) Data Model List or Business Entity List is automatically focused when Data Model & Business Logic page is activated.
  • (Project Wizard) Data Model List is fully redrawn after a new model is added.   Business Entity List is fully extended when there are no models.
  • (Client Framework) Method $app.execute accepts filter in the form of an object. For example, filter: {CategoryID:5}.
  • (Client Library) Method returns an object with properties representing current values of fields. New object property "_modified" will have its own properties representing old values of modified fields.
  • (Framework) XmlConverter automatically locates the first element in XML document and takes its name for the root JSON property if the root is not specified.
  • (AppGen) Removed redundant parenthesis for simple "Not" unary expressions in the code of c# projects.
  • (Framework) XmlConverter performs a robust enhanced conversion of XML to JSON to support v9 Project Designer and Inspector.
  • (Framework) User settings embedded in the page do not include "server" section from ~/touch-settings.json. This section is removed before inclusion in the page.
  • (Framework) Developers can implement method ApplicationServices.ValidateBlobAccess to alter the verification of user access to the row with the blob and the blob field itself. The overridden method can return false to disable blob access validation.
  • (Framework) Removed "download done" cookie creation when Blob.DirectAccessMode is true.
  • (Touch UI) Partially visible summary view is not scrolled into view when an option on its toolbar is selected.
  • (Touch UI) Fixed the bug in the implementation of auto focus on the last input when the window is activated.
  • (Framework) Added auto-registration of Code On Time App Builder v9.
  • (Touch UI) Reduced redundant functionality of jQuery Mobile for a more compact code.
  • (Touch UI) JavaScript business rules automatically skip updating values of fields with unchanged values.
  • (Touch UI) JavaScript event is triggered on document object before the menu option is selected. Event property "item" provides access to "url", "description", "title", and cssClass associated with the selected menu item. If an event handler returns false or prevents default then the menu option is not processed by the framework. Use this method to execute custom actions always available in the user interface.
  • (Client Framework) Added support for declarative JavaScript business rules that do not require explicit definition of the rule.
  • (Touch UI) Method $ accepts object as "filter" property in the options for simplified syntax of filter definition.
  • (Framework) TLS12 is always enabled in the apps.
  • (Framework) Apps with ASPX page implementation do not serve files with *.json extension over HTTP.
  • (Framework) Denies HTTP access to acl.json, touch-settings.json, ~/permissions, and ~/reports folders in apps with SPA implementation of pages.
  • (Framework) Default settings from ~/touch-settings.json are stored in application cache for improved performance.
  • (Touch UI) Email icon is displayed in context menu as an independent action for "email" fields.
  • (Touch UI) Script error is displayed as notification when an exception is raised in the rendering phase of the view on the client
  • Tuesday, November 13, 2018PrintSubscribe
    Release Hot Fix 1

    The following features and bug fixes are included in release

    • It is now possible to manually connect  1-to-1 entities in the model builder even when the foreign keys are not defined in the database.
    • Legacy ASPX page implementation does not reveal static content in Touch UI.
    • Unlimited Edition Trial  now supports cultures other than en-US.
    • Method BusinessRules.PreventDefault now accepts optional "cancelSelectedValues" argument. If set to "true" then processing of multiple values is immediately interrupted. This may be useful to avoid iteration over each selected row when the business rule has performed processing of Arguments.SelectedValues array on the first selected value
    • (Classic UI) Bootstrap pages are correctly "sized" for "lg" screen with the expected container width of 970 pixels.
    • (Classic UI) Fixed "match not defined" in _registerSpecialAction method of DataView.
    • "Left join" to "inner join" optimization is now disabled when selecting data if “Quick Find” or “Is Null” filters are detected.
    • (Touch UI) If a new lookup item is created in a from then the parent form in "edit" mode will not lose its selected key value.
    • Fixed incorrect exception reporting from forms. Exceptions were not delivered to the client if there was no transaction on the server.
    • Distinct requests to get values will override the model-defined Order By statement when creating a Group By expression.
    • (Touch UI) Import process correctly starts after the mapping of fields has been completed.
    • Fixed the error with view-level sort expression being ignored.
    • Fixed compilation issue in Standard edition apps caused by new Business Rule Builder available in Site Content.

    Model Builder has been enhanced in this release with additional support for 1-to-1 entities. Borrowed/inherited required columns are displayed as bold. The legend in the Spec displays both “W” and “B” letters signifying that the field is writeable and borrowed. If a developer is manually connecting primary key of one entity to another then the 1-to-1 relationship is established.

    This is a simplified model of HumanResources.Employee2 table from Adventure Works sample database. The table inherits columns from Person.Person2 and Person.BusinessEntity.

    1-to-1 entity in the Model Builder of Code On Time.

    The form of Employee will display writable columns from all tables of the 1-to-1 relationship and persist them in a context of a transaction.

    Entering a 1-to-1 entity in the app created with Code On Time app builder.

    Please note that “rowguid” and “ModifiedDate” columns were also marked as hidden in this sample.