One of the new features in Instant Developer 13.5 is support for Windows 8.1 and Windows Phone 8.1, and today I am happy to report that the new version of Caravel is already available on the Windows Phone Store and will soon be available on the Windows Store as well.

If you’ve just started following us, I should explain that Caravel is a browser with evolved surfing features that allows you to easily test apps created with InDe, without the need to create an installation package. It’s a very useful tool because it greatly increases the speed of development and testing, also allowing you to debug an application directly on the target device. And this is very easy to do: after compiling the project, simply capture the QR Code with the device’s camera or manually enter the address of the application.

In this new version, the user interface of Pro Gamma’s browser was adapted to the guidelines for the two systems from the Redmond company, differentiating it from the versions for iOS and Android. The changes introduced by version 8.1 have allowed us to create a Universal App (in other words, usable both on smartphones/tablets and on PCs) with improved user interface responsiveness.

This is a useful feature and one that you too can enjoy, because with the new template your apps can be universal as well.

As with previous new versions, the changes to Caravel have corresponding changes in the template for creating installation packages, but starting with Instant Developer 13.5, they are now compatible with Windows 8.1 and Windows Phone 8.1. Check out the release notes for more information on how to compile and publish these apps on the stores.

If you have a Windows 8.1 or Windows Phone 8.1 device, I recommend trying the beta release of version 13.5 right now and, as always, would be glad to hear your impressions.

Compatibility is important, but if you had to target only one system, which would you choose?

  •    iOS
  •    Android 4.1+
  •    Windows 8.1 / Windows Phone 8.1
  •    Other (Blackberry / FireFox OS / Ubuntu Touch / Jolla / etc)


In today’s post I can finally reveal the mysterious feature that Andrea mentioned to you a while ago. It has to be said though, that saying “We also want to connect another popular ERP. Want to know which one? The name has three letters and starts with S.” didn’t leave much to the imagination. It’s my great pleasure today to announce integration with SAP, made possible thanks to the SAP NetWeaver Gateway technology, which allows for exporting of APIs based on OData architecture.

OData is a communications protocol introduced by Microsoft as part of Microsoft Open Specification Promise and then standardized by OASIS in March of this year. In addition to Microsoft Dynamics CRM, many Web services have adopted it, and one of these is SAP. That’s why in version 13.5 of Instant Developer we’ve extended WebAPI support to OData services as well.

To integrate SAP, or any OData service, in your InDe 13.5 application, simply:

  • open the project in which you want the service to interact;
  • open the import wizard from the Tools -> WebAPI Importer menu item;
  • enter the service URL (such as;
  • click Import to get the list of entities exposed by the service;
  • select the entities you want and click Create.

Then, all you have to do is create the panels, the trees, and the books on the imported classes to implement CRUD operations in your applications directly on SAP.

If you’re interested in SAP integration and OData services, have you already tried Instant Developer 13.5 Beta?

Do you have OData services waiting to be integrated into your project?

  •    Definitely! I can't wait to try 13.5 to integrate an OData service like SAP.
  •    Most services I need to integrate do not use the OData standard.
  •    I don't think that integrating Web services is really the future.

{ 1 comment }

The time factor

by Giuseppe Lanzi on 10/03/2014

Autumn began about ten days ago, and once again it’s time for us to turn our attention to the Instant Developer technical support service.

I’ll get the formalities out of the way by mentioning that last quarter the average score rose again from 4.28 to 4.38, and that 58% of sessions received a score. These results are founded on the feedback you give us, for which we sincerely thank you.

Based on an analysis of feedback from the first and second quarters, at the beginning of July I said that the average score for closed malfunction reports due to non-reproducible errors was 2 out of 5. That day I proposed an experiment: to be able to reopen sessions by simply replying to the closure email and indicating that you have more information to give that can help us replicate the behavior. Well, I have to admit I’m pleased, because the experiment worked just as I’d hoped: the average score for closed malfunction reports due to a non-reproducible error rose from 2 to 3.5. A promise is a promise: soon you’ll be able to reopen this sort of request by simply clicking on the response message.

But now, enough talk about scores. Let’s talk about time.

In my never-ending quest to improve service, I analyzed the flow of support requests and noticed that about 23% of issues require more than one session to resolve. It’s normal for certain requests to require intervention from an additional technician, or to take more time than expected, but 23 is a percentage I’d definitely like to bring down. Looking at the requests in question, I noticed that in most of these cases, the first session didn’t resolve the issue because:

  • multiple questions were included in the request text;
  • the case in question was significantly more complicated than the request made clear.

Of course, when you have more than one question to ask, the simplest method is to enter them all in the text of a single request, but to respond more effectively to two different questions, two different techs might be needed. It’s also easy to see how difficult it can be to convey the complexity of the problem to someone who’s not familiar with your application.

So, I have another experiment to propose:

  • When sorting a request, the support department can break it into two parts so that they can assign each question to the tech who can address it best. That way, you can plan two distinct sessions.
  • When you think it will be necessary, explicitly request a 60 minute session. In this case, at least 60 minutes will still be deducted from the total hours, but more time will be assigned beginning with the first session.

Once again, if the experiment is successful this may become part of standard procedure.

What do you think? Are you onboard?

Image: Vito Parlato.


I have to admit that I wasn’t expecting this kind of success, but it appears that the Tips & Tricks post was hugely popular with many readers. That’s why once again today I’m writing to answer a question I get asked a lot, and one that many of you voted for: is there a practical example of a document lock?

When you need to implement the lock on entities in an application, you have to start with a few simple questions, because the answers will give us the rules we need to implement the service:

  • where do I save the locks?
  • how do I identify the locks and the locked entities?
  • how long before a lock is considered obsolete?

The first question masks an implicit idea: there is no standard way to store application locks. We can save them to XML files, we can store them as a new field in each table of each entity, we can keep them temporarily in memory in a server session. The route I prefer is adding a locks table to the database.

The second question derives directly from my answer to the first: if I only use one table, how can I recognize a lock on an Invoice from a lock on a Client? In this case, we get help from the Document Orientation getDNA function, which returns a unique identifier of the entity throughout the application. It doesn’t matter whether I use the DocID or the normal counters, a DNA is always unique (within the same database). So, to correctly identify the locks of all entities in my application, I just need to have a Locks table with the fields ID, DocDNA, User, and Date Time to indicate who has taken a lock on which entity and when.

The third question always arises during implementation. The idea behind the lock service is this: when the user starts changing an entity, the system tries to get a lock. If it can do so, it writes it to the database; if it can’t, it cancels the change and alerts the user. When the user stops working on the entity, the lock is released. But what happens if a lock is in place and then the application crashes, the server is rebooted, or there is an error? The lock won’t be released, and that entity will be locked forever. That’s why you always have to make sure that locks will be considered obsolete, and therefore null, after a day.

Once we’ve answered these questions we can get started with implementation. Like many Document Orientation services, the document lock is based on use of a Document Helper, the class that allows us to globalize the behavior of the application classes. In this example project I have implemented the lock using the getLock and releaseLock events.

In the getLock, I check whether the entity the user modified is locked by another operator searching for it by DNA and then, depending on the result, I react differently to set the value of the Result input/output parameter:

  • if I can’t find it, I insert the row in the database, saving the time and current user, and I set result to true;
  • if I can find it and the user locking it is the current user, I refresh the lock, updating the time, and set result to true;
  • if I can find it and the user locking it is not the current user but the lock is obsolete (more than a day old), I release the lock, insert a new one and set result to true;
  • if I can find it and the user locking it is not the current user and the lock is not obsolete, I set result to false and display a message to the user.

Try it and see: launch the example project and log in two times from two different browsers using two different usernames. Change a row in the first browser and leave the panel in updated status. Then go to the second and try to edit the same row. You won’t be able to edit the entity from this second window, and you’ll see an error on screen.

Don’t say I never did anything for you. :)

What would you like to see addressed in the next edition of Tips & Tricks?

  •    Team Works and components: how do I handle the code in the work group?
  •    Web APIs, a practical example.
  •    How to have multiple domains in the sync.
  •    Optimizing synchronization of documents with BLOB properties.


Infinite report and beyond


One of the functionalities of Instant Developer 13.1 we haven’t talked about yet is that now you can create reports of infinite length. I’d like to dedicate this post to describing it to you. It’s not the first time I’ve talked to you about the InDe reporting system. As many of you know, this module [...]

Read the full article →

Still in the clouds


About a year ago I wrote my first post on this blog to announce the release of IDCloud, the Instant Developer component designed to integrate cloud-based services like Gmail, Google Calendar, and Dropbox into your applications, as well as web functionalities like PayPal payments and logins using Facebook/Google. There are many projects in which IDCloud [...]

Read the full article →

Tips & Tricks: synchronizing external changes


By way of greeting you all as we return from our summer break, I’d like to start up the blog again by discussing the Tips & Tricks subject you’ve been the most interested in: synchronizing changes to the database made by external software. As you know, the Document Orientation sync service uses two different methods [...]

Read the full article →

Shall we talk?


In recent months we’ve seen growing confirmation of the importance that voice interfaces will have in the applications of the future. Just consider how many wearable devices have come to market, and the extent to which Google is still continuing to add voice functions to its browser. We are increasingly certain that our applications will [...]

Read the full article →

Academic year 2014/15


I have to say, time flies. It’s already been a year since I presented to you our virtual training options for Instant Developer. This academic year has given us a chance to build up some experience and collect feedback and suggestions that we’d like to use to further improve the service. The classes have proven [...]

Read the full article →

Integration with Salesforce is now instantaneous


As already reported by Andrea, one of the main new features of version 13.1 is integration with Salesforce, the cloud-based CRM tool for sales force management, customer service, support, and help desk. Now, integrating this Customer Relationship Management tool into your applications is very simple. A special wizard allows you to authenticate on Salesforce and [...]

Read the full article →