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 allows you to print PDF and to display data on screen in any form. You can create invoices, catalogs with images, or simple video games like I told you about at the beginning of the year.

Recently, some of you have been asking me the same question: “I have about 100,000 lines in my database and I’d like to make a report that can show all of them. How can I do that?”. It was a very interesting question because it implies that there is a limitation in the reporting system. The report module worked like this: first, the system loaded all the data, and then it prepared the pages as the user requested them, differentially. The fact that the data had to be loaded when opening the report was a limitation, because it could take too long or use too much memory, but thinking of the solution I realized that it could be achieved if I’d had a way to use delayed loading of collections in reports as well.

This is precisely the change that I implemented in version 13.1. The idea is simple: all you have to do is create a collection and indicate that it can contain, for example, 100,000 lines. At this point, if the collection is provided to the report and a preview is displayed, the system will ask the programmer to provide the missing documents progressively as it needs them. With this system, you can make applications like Twitter and Facebook, where the page grows infinitely and the data are loaded when the user wants to see them.

This system also makes it possible to jump forward a bunch of pages without having to load all the documents in between. For example, if the user jumps from page 10 to page 100, the system knows that pages 11 through 99 aren’t needed yet, so it doesn’t request all the intervening documents. Instead, it “leaves gaps”. That way, the amount of memory occupied is reduced to the minimum. Then, if the user goes to page 50, the system requests the missing documents it needs to display that page.

And now it’s time to show you what you can do with this new functionality. Click here, open the file Movies.idp with Instant Developer 13.1, and have a look at what you can do. What do you think?

Are you already planning applications with an infinite interface?

  •    These day, an infinite interface is a must! We'll use this feature soon.
  •    Interesting technique, but the opportunity hasn't presented itself yet.
  •    I'm not interested in “Facebook style” interfaces; more consolidated UIs are better.
  •    I don't know, I've never thought about it.

Image: sffoutpost


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 has made it possible to read and send emails using a Gmail account, without creating too many headaches for the developer. Now, beginning with version 13.1 of the component, you can do even more, like create an actual mail client that works with any IMAP account and lets you make automatic rules for filtering and storing mail. Today you can:

  • specify any IMAP mail server as the incoming and outgoing server
  • move email from one folder to another
  • access a given email directly using its ID

Given how much enthusiasm we’ve seen regarding integrating Google Calendar, we’ve also improved this service by adding the extended properties: now, for each event you can specify custom properties that can be kept private or made available for sharing with other event participants.

And last but not least, we’ve updated PayPal to keep it in line with the version of the most recent APIs.

For more information on these new features, have a look at the Instant Developer Components Guide.

Are you ready to implement your personal Outlook?

  •    I can't wait to integrate email management into my applications.
  •    It would be great, but I need to manage POP accounts.
  •    I prefer to use a library that I wrote myself.
  •    I rarely push beyond simply sending/receiving mail.


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 depending on the conditions: full or partial. When the user syncs for the first time (or if they haven’t done so in a long time), a full sync is run, in which all documents are read from the corresponding database tables and sent to the device. When the user only needs to receive the most recent changes, a partial sync is used, and in this case the data is read from the ZZ_Sync table. The framework writes the changes to ZZ_Sync every time changes are made to a document with the Synchronization flag enabled.

The problem arises when other software is making changes to the same database, because in this case no one is in charge of writing the changes, and therefore they won’t be sent to the device during the next partial sync. To get around this, we must figure out how to update ZZ_Sync correctly.

To do so, it’s not a good idea to update the database directly, because it’s complicated and we’d have to know the right syntax. A better approach is to use the same framework, simulating a save. In this example project, we achieve the desired result for the Product class by using:

  1. The Product.LastExternalChange class property.
  2. The HandleExternalChanges procedure.
  3. The Product.BeforeSave event.

The LastExternalChange property contains the answer to the question “when did the external application change the product in the database?”. This is the only real requirement that must be met. Unless you answer this question, it’s impossible to know which products must be handled. In our case, the value is set by the SimulateExternalChange procedure with an update to the table. You can test this immediately: launch the project applications and synchronize the mobile app. Then use the SimulateExternalChange button in the web application and sync again; you’ll see that this second change is ignored.

In the HandleExternalChanges procedure, we take all the products changed by the external applications, set the inserted property to true, and set a skipupdating tag with a value of -1. Then we save the product.

In the Product.BeforeSave event, if the skipupdating tag is set to -1, we simulate the save by setting the skip parameter to true.

Thanks to inserted = true, the product is viewed as requiring insertion into the database, and thanks to skip = true, the save is not actually performed. In this particular case, the framework will still write a new change in ZZ_Sync containing all the document properties, including those changed by the external application. Use the web application’s HandleExternalChanges command, and then sync the mobile app again to see the result.

Happy syncing everyone! :)

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

  •    Optimizing synchronization of documents with BLOB properties.
  •    Document locks, a practical example.
  •    How to have users with multiple domains in the sync.


Shall we talk?

by Vittoria Marino on 08/01/2014

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 have to have a voice interface.

To reach our goal, the first step was to introduce Voice Commands in Instant Developer 13.0, which, thanks to the use of Google’s Speech API, make it possible to use voice to interact with web applications inside Chrome. A review of the feedback we received through our roadmap enabled us to choose the right direction for our next step.

The first implementation let you continue hands free while giving commands to the application, but you still had to look at the device to read the answer. Also, only panels supported voice commands, making it necessary to use your hands when working with interfaces based on books.

And this was our starting point in deciding what to introduce next in the second version of Instant Developer voice commands, which I’m pleased to present to you today:

  • voice synthesizer;
  • support for voice commands for books;
  • new, even more natural interaction.

Thanks to the voice synthesizer, the application now responds by speaking to user commands, making it possible to interact with the device without needing to look at it to see the effect of a command. New usage options are now possible in cases where conventional interaction with the application is difficult, such as when the screen is very small or the device must be used while moving. I’m thinking of small, round devices with a strap.

Support for voice commands for books now makes it possible to move between pages and search for text in a report without using your hands.

Finally, given that the language we use is important, in order to break down even more barriers between app and user we have improved the interaction, making it more natural and more accommodating of language that sounds closer to how we’d speak to another person. And all of this while still preserving options for the developer to customize commands and voice recognizer responses, so they fit better into the context of your app.

Stay tuned, because the next step will deal with offline apps: they’re just itching to talk to you.

Do you already have an application that you'd like to talk to?

  •    I've already implemented voice commands; I just need to update to 13.1.
  •    Now that apps respond, I know where to use voice commands.
  •    Not yet. I need voice commands in offline apps.
  •    I don't think the interface of the future will involve voice.

Image: Mustafa Khayat


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 →

The fruits of feedback


June has come and gone, and as promised, it’s time once again to talk about Instant Developer technical support. However, this time I want to go beyond just presenting performance indicators. I’d like to dig a little deeper and look at the real value underlying user feedback. Since the start of the second quarter, the [...]

Read the full article →

Writing is easier with ID Editor


One of the features that developers are often asked to include in web applications is the ability for users to write HTML-formatted text, for example to send an e-mail using the bold or italic modifiers. To do this, your application must contain an HTML editor. With Instant Developer, it is very easy to include a [...]

Read the full article →

Instant Developer 13.1 – another step


It is with great pleasure that I write this article to announce the release of the new 13.1 version of Instant Developer. If the purpose of the version in March was to implement significant changes in terms of the overall product, in June our goal was to optimize and improve the product in response to [...]

Read the full article →

One language, many languages


June 2nd was date of the much-anticipated Apple WWDC. I watched it in real-time and I was struck by some new things I’d like to share with you. For starters, the effort Apple has made to make the WebViews more powerful. Not only will they be activating Nitro, which will make hybrid web applications much [...]

Read the full article →