One Evening = One Application

I was recently asked by someone looking at using OpenInsight for the first time, “How quickly can I really build a small system in OpenInsight 10?”.  Naturally, being a salesperson, the answer was “Very quickly and you’ll be surprised just how quickly.”

This evening I had the opportunity to put this to the test.

As many of my readers will know, I am some months into building a large system that I hope to take to market very soon.  This system uses authorisation keys to set (and update) the user count and the expiry date in the system.  It is nice feature in the application, but it is not overly clever.  However, I find myself having to manually create the authorisation keys from time to time and this was becoming tedious.

I therefore decided to build myself a small application in OpenInsight 10 to help me to generate the authorisation keys and then to keep a history of who has had keys, when, with how many users, etc.

Whilst I did not time this mini- project, all of the following has been achieved by a junior application developer (me) in one evening.  That includes defining the application, building the three data tables, the four forms and all of the popups, messages, etc.  It also involved writing two commuter modules to support the Customers and Key Generation forms.

As is usual for my systems, the application operates from a main MDI Frame window, as shown below.  Granted, I need to tidy a few things up (like the menus), but remember this is an example of what can be achieved in a few short hours and by a junior.

The MDI Frame is used to display all of the application’s windows and these are launched from the three buttons on the toolbar.  The fourth button being the Exit button, which closes down everything.  All of these buttons are operated by CLICK quick-events.  i.e. I did not have to write any code to get anything working in this form.  In fact, it does not even have a commuter module defined for the window.

You could say that the MDI Frame window is a NO CODE form, but that is a private joke which anyone that follows the Google Pick discussion forum will understand ;).


The next form is the Customers form, which enables me to capture some basic contact information for my customers.  At the bottom of the screen is a table which uses some symbolic fields, a relational data table and a relational index to display all of the authorisation key records that are linked to the Customer.  This enables me to see when  keys have been generated, the user count and the expiry date for that entry.  It will build into a history of the license over time.

Again, I needed to write very little code to operate this form.  The code is pretty much limited to a Changed and a Clear event to set the toolbar buttons from disabled to enabled (and vice versa), Click events for the Cut, Copy and Paste buttons and a Click event for the Email Address label.  So very little code and what code there is in the commuter module is very basic code.  To be honest, most of the code was pulled in from my commuter module template, which already had the code for the Cut, Copy and Paste buttons and to enable and disable the Save, Clear and Delete buttons accordingly.


The Customer ID label will, when clicked, display a standard record lookup window and when the Email Address label is clicked the user’s email client will launch and the system drops in the email address automatically.  Otherwise the buttons all drive the system and the combo boxes are all populated from the System Codes data table.

KeyGen-4The System Codes window is pretty straight forward with (not including the toolbar) only two key controls which use just three dictionary items (fields) in the database.

“Again, this is a no code form where I do not even have a commuter module defined.”

The combo box is populated using the Auto-fill feature in OpenInsight, which means that the pick list will always be up to date as new code categories are added.

The user then simply adds a new code category (COUNTIES in the example) and then in the table, they enter a MultiValued list of code and descriptions.   As soon as the record is saved, those new descriptions are available to the users in the Customer’s data entry form.


The last and most complex window is the Authorisation Key Generator window.

The form itself is not at all complicated and it was very easy to build, but the commuter module behind the form took some time for me to build.

The form uses my usual quick event to launch the Popup (record lookup window) and this in turn reads (displays) the record in the form.  A similar popup is used to select the Licensee’s record ID and to write that to the appropriate edit line.  When the Licensee’s ID is chosen the Licensee’s name is displayed.  This is a calculated field (a symbolic) which brings together the customer’s First Name and Last Name from the Customer’s data table.

KGImage-5The system has been designed to cater for 1 to 9,999 users.  A message will display if the user tries to enter 10,000 or more users.  Again, the message (as shown) is created without any code and it is called using only a few very short lines of code.  The code simply checks for the number of users and then it makes a call to display the saved message if the user count is over 9,999. 

The calendar button launches a standard OpenInsight 10 calendar, from which a date can be selected and this is written to the Expiry Date edit line.  The buttons on the toolbar are all Quick Events.

Once the User Count and Expiry Date fields have been completed, the Key button on the toolbar can be clicked and this will format the authorisation key using certain random  characters and formatted with hyphens.  The authorisation key is truly random, with a unique key being generated every time the key button is pressed, even when the user count and expiry date does not change.

Anyway, it is now getting late and I’ll leave the following items for tomorrow evening:

  1. I need to configure all of the menus.  The system is run by the buttons at the moment.
  2. I need to make sure that an expiry date is a date in the future.

It will then be completed and ready for use.  Not too much left to do then, a nice little authorisation key generation application done and a good evenings work.

All thanks to OpenInsight 10 and how easy the tool set makes it
to build systems like this 🙂

OpenInsight 10.0.7 now available.


As many of you will know, I have been internally testing OpenInsight 10.0.7 for the last week or so and I have been really pleased with the new version.

With more and more people now actively working with OI 10, this release includes a lot of customer requested fixes and enhancements.

It goes without saying that OpenInsight 10 has been a massive undertaking with the ‘whole’ product having been reviewed, modernised and made so (Ohh sooo) much easier to use.  The benefits of using OI10 over OI9 and 8 are way too many to even consider touching on here but I believe that the product is now at a point when all OpenInsight developers should be considering running their applications through the conversion tool.

If you are a current OpenInsight WORKS subscriber, you can get access to both the 10.0.7 upgrade and full install from the private WORKS area on

For now, I’m off to try a brand new module in O4W which Bryan worked on for a project that I have been working on for a few months.  My development learning curve continues at a pace 🙂

Snakes and Ladders


Over the last year or so, I’ve heard more and more about Python and how development tools need to support the language.  I’m told that students are leaving college with Python experience and it is therefore a great way to bring new, engaging and dynamic ideas into the development community and the MultiValue market could sure do with a dose of that right now.  In addition, some of the MultiValue manufacturers are riding the current wave and actively promoting their support for Python.

Whilst there have been questions from the MultiValue community about who might be using Python, I’m yet to come across many people who have actually taken the plunge and it’s been a largely mute topic within our own Revelation community in the EMEA region – until this week though.

It is no secret that many OpenInsight developers are remaining in position and not moving around too much.  Coupled with the fact that the MultiValue market place is getting older and developers are retiring (it is an inevitable fact), and we find that we need to resource projects from outside of the community.  Just recently Andrew, from Sprezzatura, has completed another series of tutorial workshops for another RevUK client.  Like the previous workshop, this one included a number of highly skilled professional developers from India.  The first OpenInsight VAR was extending their internal team using their own developers in India, this time it was a pure outsourcing deal to expand the development and support resources.

Enter the snake (Python).  Yet another OpenInsight development house looked outside of the community to expand their team and the chosen candidate has been getting to grips with the toolset ahead of starting their position later this week.  As part his first steps with OpenInsight, he asked about support for other database technologies and this week Python finally came up.

It was only to be a matter of time before someone asked me about
OpenInsight and python.

A quick email to support and Bob Carten got back to me with the usual response that I’ve become used to from the OI development team, “Of course we can do that”.

The specific request was whether Python scripts could be easily and reliably called from within OpenInsight using the Quick Event tied to a button.  The pretty straight forward and basic request resulted in a detailed reply from Bob:

“Yes, you can call Python scripts from OpenInsight.  The simplest way is to use the utility ‘RUNWIN’ service:

    cmd = 'py ': quote(filename)
    call Utility("RUNWIN", cmd, 0)

The attached py_shell (Bob included this as a .txt document in his reply email to me) is an example program which would let you pass in the name of a python file or just the body of a python script.  At the end it just calls Utility “RUNWIN”, the rest is window dressing.

However, that window dressing demonstrates some common techniques we use for writing object-ish programs in OpenInsight.  The typical use case for these techniques is creating commuter modules for OpenInsight forms.  We use the term “commuter module” to describe a program which handles all the events for a window.  We have a standard quick event which will call your commuter module.  For a window named “MYWINDOW”, the commuter module is a Basic+ program named MYWINDOW or MYWINDOW_EVENTS, which follows some conventions.  The attached RTI_LH_STATISTICS_EVENTS program (again attached in Bob’s email to me) is an example of a commuter module.  You can cannibalize it for your own modules.  The relevant parts are from line 1 to 81, which is where it implements the “interface” for commuter modules.

See “

Please drop me an email if you would like a copy of the py_shell.txt and rti_lh_statistics_events.txt files that Bob included in his email.

So that’s the snake, what about the ladder?

OpenInsight 10 is giving developers a real step up the ladder when it comes to Rapid Application Development.  So much is done for you and I find myself simply setting a property in the Property Panel, rather than writing, debugging and maintaining lines of code.  Better still, I’m then using optimised professionally written code and not code that I have cobbled together – well I’m no professional developer.

Anyway, I’m told that support for third party code gets even better in OpenInsight 10 and Bob is using the new technique a lot as part of RTI_GIT, which is one of OpenInsight’s native support programs for Git.

More on that in another posting, coming soon.

OI10 Conversion Process and New Examples Application

OpenInsight 10 LogoOK, I lie ever so slightly, the new Examples application is the old examples application but with a slightly enhanced user interface but it certainly feels new.

I have now converted a few applications from OpenInsight 9.x to OpenInsight version 10 and I’m always pleased with the results.  It started with me cutting my teeth on the EXAMPLES application and then I moved on to my larger RevSoft UK Contact Manager.  The later benefited from a couple of weeks of evenings working on the user interface before I deleted the old 9.4.2 version and moved 100% OI10.

So, a few people have asked me to produce a video of the conversion process and I’m pleased to announce that both that video and a look at an early version of the new examples application is now online and copied below.

Please note that this is a relatively new YouTube Channel.  I decided to drop the old one with the old 9.x videos in order to provide a clean break between the two and avoid confusion.  For this reason, please subscribe to the new YouTube channel for periodic updates as I produce more OI10 videos.



z4OK, so yes, I did go a little mad the other weekend.  I’ve hankered for a roadster for many years and this little beauty presented itself and I took the leap. She’s garaged and only comes out at the weekends. However, that does not matter because she puts a smile on my face whilst she’s standing still as well as when I behind the wheel, feeding that 2.5 litre straight six and pushing her on through some sweeping bends.

Whilst modern she retains some glorious traditional lines, she looks fast when she’s standing still and when you open her up she’s as responsive as you like and she just flies.

OpenInsight 10 (OI10), for many of us has been a project that has seen the interface chance considerably. Whilst hugely functional, the old desktop interface was looking aged and not overly intuitive for new users. For experienced developers, the interface required a fair amount of clicking down through layers to achieve things or, at best you needed to know the shortcut keys. OI10 delivers a brand-new interface that is way more intuitive to use. There is no more clicking down through layers, so much more is right there in the interface or one click away and so, so much more has been exposed in the way of new controls, properties and more.

Whilst the O4W interface is still pretty new, it’s early releases were based around a two-column approach but OI10 opens up an array of new possibilities with multi-column design and drag and drop development.

I’ve played with the latter Alpha releases and I’m now getting more and more into the beta to convert my personally written contact manager that I use on a daily basis at RevSoft. I’m fast learning that OI10 all adds up to an easier to use interface with productivity gains to be found everywhere. I cannot believe how much code I can now remove from my forms by just setting one simple property in the Property Panel – that’s usually a case of inserting a single value (numeric or text), or making a picklist selection or toggling a property. OI10 is making our application developer easier than ever and introducing standards that will no doubt deliver better applications through consistency, stability and refined code.

So, the interface enhancements are nice, the O4W design options are more powerful but people still want better performance and on more than one occasion recently I’ve had discussions about indexing large files.

At conference last year, Bob spoke about the way that the conversion tools will optimise your tables. It is still work in progress but Revelation are mastering the dark art of balancing file-sizes with thresholds and a whole load of things that I really don’t understand. Bob’s also worked on caching things and using memory better and Andrew at Sprezzatura continues to explore ways to better configure the system for Linear Hash and find performance gains.

Some people don’t think that Revelation are taking performance seriously and listening to their customer base. I know for a fact that this is not the case. You only have to sit in the car with Mike on the way back from a User Group meeting to know that he personally takes customer needs and requested extremely seriously. On more than one occasion (in fact on many occasions) I’ve been driving him across the UK and he’s bashing away on his keyboard like it’s going to give up on him in the next ten minutes. We get to our destination and he shows me an example of something a client has suggested or requested and with a big smile on his face, he tells me that I can let my client know that it’s in the next release – subject to testing and quality control of course. It’s the little details like this that have kept me loyal to Revelation for the last 20 years, in a sales role that would normally have seen half a dozen sales people come and go.

Like the motorcar currently sitting in my garage just a few feet away from me, OpenInsight is maturing into one of IT’s classics which continues to deliver on the needs of the modern application developer. Not only does it look good and it’s wonderful to work with, hidden under the hood are a number of highly sought-after enhancements that are set to deliver some of those performance gains that the OpenInsight community have been asking for.

Just yesterday, after yet another call with a client looking at index performance on files with 500,000 plus rows, Andrew told me about some more of Bob’s enhancements to OpenInsight. Well, I just had to get some highlights from the man himself and, as a teaser, this is his reply:

“I have re-written index builds and updates. The high points are:

  • Rebuild uses in-memory hashtables and removes 64k workarounds which were in the legacy build.
  • Rebuild all for a table rebuilds all indexes in one pass, rather than individual passes
  • Update_Index is rewritten so that there is less contention on the root of the index. I made changes to SI.MFS as well.


I don’t fully understand indexing but Bob tells me that the current system has to make numerous passes. One test that he undertook had to make six passes through a system with 500,000 rows. His greatly refined solution now makes just one pass through 500,000 rows, rather than having to work through 3,000,000 rows. He therefore has a very high level of confidence that the rebuild process work well and performance gains will be experienced across the board. I don’t have the figures, but he tells me that the 500,000 row rebuild was much faster and that’s good enough for me.

Other enhancements include a brand new update process that makes use of multiple sessions updating many tables at the same time. This has proven to be robust and fast during internal testing and we look forward to hearing the results obtained by our beta testers in the real world and running against real databases with hundreds of thousands or millions of rows.

I’m looking forward to getting out in the Z4 with Joanna, putting the convertible roof down and enjoying the wind in our hair. In the same way, I’m looking forward to working with the fresh looking OpenInsight toolset, modernising my applications and sharing this new gem of a toolset with the wider MultiValue community and the application development community in general.

We now have a fully integrated, highly functional toolset that is easy to use, powerful and fast. I can’t wait for the official OI10 release and to hear what Mike, Carl, Bob and the team have in the pipeline for OI11.

It’s going to be a great ride for the foreseeable future.

DBTA – MV Vendors Look to the Role of MV in the Future

1P7A8552Database Trends and Applications have just published a new article that looks at the role of MultiValue technologies in the future.

Author Stephanie Simone, talks to six of the key leaders in the MultiValue community to get their viewpoint on the future of our great technologies into the future.

Here is what Mike Ruane, President and CEO, Revelation Software had to say on the subject.

“At Revelation Software, we are incorporating features, capabilities, and integrations into OpenInsight (our MultiValue database development environment) to address the challenges of evolving data environments.

We are providing MV developers with a browser-based rapid application development tool that lets them generate responsive forms, reports, and dashboards, and we are supporting the “develop once and deploy to the desktop, tablet, or a mobile device” design philosophy.

With a development environment that tightly integrates with the Git source code management system, we offer an environment that allows for collaborative development teams as well as source code management.

Moreover, our database development environment seamlessly integrates with cloud databases. Building applications that utilize NoSQL cloud-based data storage allows us to support large numbers of concurrent users, deliver highly responsive experiences to a globally distributed base of users, provide high availability, and also handle semi-structured and unstructured data.

Enhancing usability, OpenInsight offers a development user interface within MV that is similar to what developers outside the MV world are accustomed to, provides a database environment that utilizes industry-standard AES encryption and policies, and enables end users who work with MV data stores to view their data in today’s BYOD world.”

Your can view the entire article on DBTA’s website here.

MultiValue Vendors Pushing Boundaries – DBTA

The 25th February 2015 edition of DBTA magazine featured an article titled ‘MultiValue Vendors Pushing Boundaries’ which features Revelation Software and Mike Ruane.

There are always new buzzwords coming along. But whether you call it “SMAC” or “CAMS,” there is no doubt that today the confluence of trends (analytics, cloud, social, and mobile) is proving to be a disruptive force that is causing many to reassess their approaches to data management.

Over the years, MultiValue technologies have evolved and adapted, pushing boundaries in order to integrate with new data sources and targets, address new analytics needs, and keep pace with emerging requirements. This has enabled customers to continue to rely on their trusted, and often highly specialized, MultiValue applications and data management systems.

Revelation’s website has a link to the full DBTA article and links ot the various speakers thoughts.

Securing data over the web within an O4W solution

There are three main areas of consideration when securing Linear Hash data over the web as part of an O4W based solution.  Those are the data that resides on the web server (or data server), the data whilst in transmission and then the data displayed within the browser.

Whilst these notes are written with an O4W solution in mind, it should be recognised that the provision for securing your data actually resides outside of the O4W system itself.

Liner Hash
It is worth mentioning that most hackers are familiar with relational data of the SQL type and understandably most people would prefer to work with data that they understand.  With MultiValue database driven solutions (like OpenInsight and O4W’s linear Hash) the data structure is usually unfamiliar to many hackers and therefore a lesser target in itself.

However, if you are running a high profile system, such as a bank with client financial details, a clinical system with patient data and the like, then you will still want to consider the security of your data and to do everything that you can to avoid those nightmare news headlines.

Data at rest
One of the first considerations that you will be faced with is where exactly should you house your data.  Locating it on the web server is usually fairly easy, it’s local, there are no networking (path) issues to consider and you can easily backup the whole system.  However, locating the data on the web server itself comprises a potential security risk in itself.

It is therefore recommended that a separate Data Server be used to locate the application’s data.  This server can then be hidden behind one or  more firewalls, so if your web server is compromised in anyway, the hacker will have more than one large hurdle to overcome.

Furthermore, with Revelation Software, you can utilise a Universal Driver between the web server and the data server and configure the system so that only access to the data is permitted through the Universal Driver.  Now that provides any external or internal hacker with yet another problem to overcome.

For those who need their data secure whilst it is residing on the data server, industry standard encryption tools can be used to encrypt the data to 128-bit encryption levels, for example.  A Google search for 128-bit encryption will provide you with plenty of information and solutions for  Advanced Encryption Standard (AES) and Data Encryption Standard (DES).

In addition, from OpenInsight 9.3, the toolset itself will support Data Encryption At Rest, making it even easier for Revelation developers to secure their data in single use, LAN, WAN and Web based solutions.

Data in transit
One of the weakest points before the data reaches the browser is during transmission.  Your precious data contained within one or more data packets is passed through countless networks, computers, hubs, etc. and at anytime these packets could be intercepted and interrogated.  If you have decrypted the data within the O4W application ready for it to be read by the user, then anyone could hijack it.

Fortunately, Hyper Text Transfer Protocol Secure (HTTPS) is your friend here.  HTTPS has been around for many years and it is well known as the industry standard for secure transmission of data over the web.  It has been supported since Internet Explorer 2 was around, so that really highlights that we are talking about a technology that is well tried and very well tested.

HTTPS is a secure version of the Hyper Text Transfer Protocol (HTTP) which allows for secure ecommerce transactions, such as online banking.  The technology effectively brings together HTTP and the SSL/TLS protocol to provide encrypted communication and secure identification of a network web server.

It is usually the System Administrator (or whoever has overall responsibility for the Web server) who configures the server to use HTTPS.  This is usually simply as case of acquiring a public key certificate for the web server from a trusted certificate authority.  This certificate must be signed by that authority for the web browser to accept and use the certificate.

It is also possible for the system to be configured for client authorisation.  Configuring a system in this way can limit access to a web server and thereby only permit authorised users.  This is achieved by the System Administrator creating a certificate for each user and this certificate is then loaded into the user’s browser during the session.  The certificate usually contains some identifying information (e.g. name and email address) and this is automatically verified by the server on each reconnect.

Web browsers such as Internet Explorer (IE) and Firefox display a padlock icon to indicate to the user that the website is secure.  In addition, the web address (URL) begins with https:\\, rather than http:\\.  When a user connects to a website via HTTPS, the site encrypts the session with a

digital certificate before any data is transmitted to the user’s browser.  O4W supports HTTPS, so transmitting your data using 128-bit encryption levels is super easy.  System Administrators can find a lot more information about the acquisition and use of public key certificates by running a Google search.

Data in the browser
So, we have our data encrypted at rest on our data server and we are using HTTPS to secure the data during transmission.  What about data in the browser?

Securing data in the browser is a tough one, mainly because the user needs to view the data in human readable format on the screen.  Or do they?

And herein lays the answer.

If the user needs to view the sensitive data in the browser, then you will have to revert to good old education.  Don’t leave your screen showing the data when you leave your desk, run your password protected screen saver before leaving your desk and, if you are near a customer facing position, make sure no unauthorised person can see your screen.

However, if the data does not need to be humanly read in the browser, why display it in the first place?  Leave the data on the data server and use some other form of key to interact with that sensitive data on the server, behind your firewall.  Many systems use this approach for user IDs.  The system maintains a cookie in the user’s browser and this contains some form of unique identifier – it could simply be a random number;  1234657684346846 (a session token of some kind).  It is this non-descript information that is then passed backwards and forwards over the web to identify the user.  When this key is received by your web application, you have code that takes the key, reads it and matches it to the user’s record.  Your program code can then use the sensitive login data to run the application on the web server as required.

To summarise
As an O4W web developer, you’ll want to concern yourself with protecting sensitive data within your specific application.  For example, credit card details; you will need to both protect a credit card field and audit who has access to the field and when it is accessed.  This is usually achieved by the developer including access controls to protect fields and the display of sensitive information.  As a conscientious developer, you may want to encrypt each record individually so that it can only be decrypted with a pin number that only the user knows and you’ll want to run a check to verify that user is legitimate.

This level of security in the application is good because it prevents an administrator from potentially stealing information from the system.  However, this does present new obstacles because the developer now has to code around the in ability to freely access all of the fields. How do you report on fields you can’t decrypt? What if the user forgets their pin, can the data be reset and re-encrypted or will the loss of data be irreversible?

The developer has to choose a balance in the application’s design between ease of access to data and the level of security. More security inevitably creates complexity so it’s important consider the risks and benefits of exposing the data.

The System Administrator should be responsible to ensure the underlying environment that the application runs on will be secure. If an attacker can gain administrator access in the operating system then the entire applications security protections could be rendered useless.  By protecting the environment (server, network, and client) at the operating system level the system administrator will be protecting the application.

Developers and administrators handle different levels of security that complement each other. The developer should be responsible for the application level access to the data while an administrator should be responsible for system level access.

But O4W helps . . .
Whilst you ‘could’ leave the question of data security up to someone else, effectively passing the problem on, there are ways that O4W can help.

From OpenInsight version 9.3, Revelation Software plan to introduce data encryption at rest.  This will be delivered through a new encryption service’ that system administrators can deploy to encrypt OpenInsight (OI) and O4W data on a field by field level.  The data will naturally be encrypted using industry standard encryption routines (DES, AES, TRIPLEDES, etc.).  This encryption service will use the Windows Communication Foundation (WCF) to communicate, thus ensuring that the data is also encrypted in transit.

In terms of protecting data in O4W ‘specifically’, O4W (in 9.2.1 and above) encrypts the user passwords when stored in OpenInsight, and never transmits any password information between the browser and the server.  When validating user information, O4W encrypts the user-entered password in the browser itself, and then returns only an impenetrable hash which the server then uses in its own calculations to determine if this is a valid logon.

In addition, the O4W programming paradigm is to ‘never’ send sensitive data to the browser if it can be helped.  Instead, temporary, unique records are created with the sensitive information, and stored on the server, and only the unique identifiers for these records are transmitted back and forth to the browser.

Of course, with the 9.3 release, the encryption service can apply encryption to any fields in the OpenInsight database, including those that are used by O4W, so by using https:// and the encryption service ‘any’ record and ‘any’ field can be protected all the way from “at rest” in the server,  through the engine server, through the web server, and to the browser.

My thanks to Bryan Shumsky (Revelation Software, Inc.) and Andrew McAuley (Sprezzatura) for their help and advice without which this posting would not have been completed.