Blog: Posts from May, 2019

AJAX(112) Apple(1) Application Builder(242) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) 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(11) 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) DotNetNuke(12) EASE(20) Email(6) Features(99) Firebird(1) Form Builder(14) Globalization and Localization(6) Hypermedia(2) Installation(4) 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(15) OAuth(5) OAuth Scopes(1) OAuth2(6) Offline(14) Oracle(10) PKCE(1) PostgreSQL(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(163) Reports(48) REST(26) RESTful(21) RESTful Workshop(13) RFID tags(1) SaaS(7) Security(75) SharePoint(12) SPA(5) SQL Anywhere(3) SQL Server(26) Stored Procedure(4) Teamwork(15) Tips and Tricks(81) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(331) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(39) Web.Config(9) Workflow(28)
Posts from May, 2019
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!

Wednesday, May 29, 2019PrintSubscribe
Multi File Upload
Code On Time release introduces Multi-File Upload. End users can select multiple files and submit them for upload at once to create multiple database records. Application framework automatically inserts a table row for each file, uploads the file, and persists the data either to the database or to an external storage system.

Here is how it works:

1) Start upload.

2. Select multiple files.

3. Preview the selection and tap Submit.

4. Multiple database records are created for each file and associated with a parent if needed.

The feature is activated when the Upload action is executed by the data controller. A built-in form is displayed to allow selecting multiple files for upload.  User submits the form and the framework starts processing files one by one. For each file an Insert action is executed through the same data controller. By default, the view createForm1 is used to figure a list of data fields for Insert. An alternative view can be specified in Command Argument of Insert action.  Special fields are detected to store File Name, Content Type, and Length of the file. For child data views, the master field values are also included. If insert is successful, then the physical file is uploaded to the server and stored in the first on-demand field of Byte[] type. Failure to insert a record or to upload a file will interrupt the processing. The data view is refreshed when processing of all files has been completed.

Consider the following database schema that allows associating documents with the supplier records.

Table Docs defines three explicit fields to maintain information about the files: FileName, ContentType, and Length. The physical data will be stored outside of the database and processed with File System Blob adapter.

Start Code On Time and create an app with two data models - Suppliers and Docs. Next, start Project Designer and begin defining the new field with the name Data and type Byte[] in Docs controller. Mark the field as On Demand. Enter DocID in Source Fields and DocsData in On Demand Handler. Choose Thumbnail in On Demand Style drop down to have a file preview in the app. Save the new field and drag it to createForm1, editForm1, and grid1 in the Docs controller.

Select Docs data controller and enter the following in the Blob Adapter Config property:

Field: Data
Storage-System: File 
Path-Template: C:\app\DocsFileData\{DocID}-{FileName}
File-Name-Field: FileName
Content-Type-Field: ContentType
Length-Field: Length

Make sure that the specified folder C:\app\DocsFileData does exist on your device. Application will use the primary key of the Docs record and the file name to create physical copies of the files submitted to the virtual on-demand Data field.

Add a new action with command name set to Upload to action group Docs / Actions / ag3 .

Proceed to drag Docs controller onto Suppliers controller or copy Docs and paste onto Suppliers. This will create a new field with type DataView and name Docs in the fields of Suppliers controller. Drag the new field to editForm1 view in the same controller.

Run the application and select a supplier.

Select Upload action and choose multiple files to upload.

Tap submit and see the corresponding records appear in the app.

The entire process take a few seconds. User can choose individual records to add comment. There is also an alternative it to create one record at a time if a more deliberative data input mode is desired.

Multi-file upload significantly improves ease-of-use for document management applications.

Monday, May 27, 2019PrintSubscribe
Code On Time With Command Line
Code On Time release makes possible creating mobile and web apps directly from command line. New command line parameters allow configuring, generating, and refreshing apps without requiring developer to go through Project Wizard and Model Builder. Now the app generator can be integrated in automated scripts to produce custom apps.

For example, the following command line will instantly produce a basic app:

codeontime -generate "c:\apps\app1" -theme "Citrus" -run -appname "Hello World"

The app will be displayed in the default web browser when the code generation is completed.

This application is not connected to a database and displays no data. Next command will connect it to a database and produce data models, data controllers, and pages for Products, Suppliers, and Categories. The app will have a built-in membership manager and content management system.

codeontime -generate "c:\apps\app1" -dbconnection "Data Source=;Initial Catalog=northwind-cmd;Integrated Security=True;" -objects products,suppliers,categories -dbmembership -dbcms

This command will remove CMS (Content Management System), enable reporting, change the theme to "Petal", and make the app display Shippers and Customers tables.

codeontime -generate c:\apps\app1 -dbcms false -reports -theme Petal -objects Shippers,Customers

Notice that previously specified project options are persisted in the project file and do not need to be re-entered. Use double quotes to surround property values with spaces. Value "true" for Boolean properties can be omitted.

The app generator folder is not included in the Path variable of the machine during installation. Make sure to add C:\Program Files (x86)\Code OnTime LLC\Code OnTime Generator path to the Path environment variable. Otherwise use a full path to the app generator executable codeontime.exe when using the app generator in command line mode.

The three core commands controlling the app generator from command line require a path to the project folder. If the specified folder does not exist, then it will be created. If there is no file DataAquarium.Project.xml in the specified location, then the file will be created with the default settings. All three commands will change the project file if the configuration options are also specified in the command line. 


Use -config command to create a project, change its options, or view the current option values. For example, this command will create a project configured for Microsoft SQL Server database, implemented in Visual Basic with MyBiz namepace, and build-in user and role management.

codeontime -Config "c:\apps\myapp1" -DbConnection "Data Source=;Initial Catalog=northwind-cmd;Integrated Security=True;" -Language VisualBasic -Namespace MyApp1 -DbMembership

This command will alter the project to have it presented in Berry theme. The app will start in a default web browser after the code generation.

codeontime -Config "c:\apps\myapp1" -Run -Theme Berry

The summary of the project configuration is display after successful -config command.

There will be a single file in the project folder.


Use -generate command to produce application source code. The app will be displayed in default web browser if -run option is specified for the project.

codeontime -generate "c:\apps\myapp1" 

Here is an example of application generated for the previously configured project. It includes every database object from the northwind database.

The project will look like this:

Please note that you can build this app with a single -generate command if you specify the same set of options in the command line. Command -generate first creates a project file or modifies the file according to the specified options. Code generation is performed only if every single configuration option has been successfully processed.

You can customize the generated app in the Project Wizard and Project Designer if you start the app generator without command line parameters and choose "Add an existing application" option. The new application will be displayed on start page.


Command -refresh deletes cached database metadata (information about tables, views, columns, etc) and rebuilds all data models, data controller, and corresponding pages from scratch. Use this command to generate the app if database schema has changed. 

It behaves just as -generate command in every other aspect.


App generators supports many database engines. Option -DbProvider allows specifying the data provider for the app. By default, the assumption is that Microsoft SQL Server is the database engine of application. The equivalent command line option would be:

-dbprovider sqlclient

The supported data providers are the same ones available in the Project Wizard:

The command line processor will match the text specified by -dbprovider option in case insensitive fashion to one of the options in Supported Data Providers list.

Use mariadb or mysql for MySql or Maria DB server.

Use oracle for Oracle database.

Use ibm or db2 for DB2 databases.

Use sqlanywhere, postgres, or firebird for the corresponding database engines.

Automated App Building

The new command line support enables automated production of mobile and web applications with Code On Time app generator. Consider using Code On Time if you are a database administrator, application architect, or project manager. Just a few keystrokes will help to validate a database schema, provide high qualify data input screens, and eliminate tremendous amount of man hours.

Applications produced with Code On Time are metadata driven. Data modes and controllers are defined in XML files stored in ~/app/controllers folder of generated application. This makes possible to use the app generator to build apps from custom metadata. For example, a set of custom labels for table columns can be maintained in Excel spreadsheet or incorporated directly in the command line text manipulation commands. 

If your apply customization to data models then make sure to delete the corresponding data controllers. The app generator will build the dropped data controllers if you issue a -generate command. If you choose to modify the data controllers directly then the app will reflect the changes right away.

Code On Time v9

The upcoming new development environment incorporates the Project Designer and Object Inspector directly in the app. The development environment is activated at runtime from the app user interface. All project configuration options are arranged in a single hierarchy. The hierarchy will synchronize with the contents visible at the moment when developer activates "design" mode in the live app. Object Inspector presents properties of the selected hierarchy element in a unified presentation similar to the one found in Visual Studio. Developer will be able to perform live app inspection and drag hierarchy elements onto live pages.

New development environment is integrated into each app as add-on DLL. It will execute the app generator in command line mode when project configuration is changed. The add-on is removed from the code base when application is published.

The project creation and management will also change in v9. The app generator started without parameters will generate a management app displaying a list of projects. The management app will display in the default web browser.  A new project created from the management app will include a start page similar to the first app screenshot above. Developer will activate Project Designer from the live app to connect databases, create data models, pages, etc.