Recently while working with a client, we were seeing some unusual behavior. Long story short, they had a button on a screen that was doing some work and then launching a Process that starts with a Human Activity in BPT, then doing a message to the user and redirecting them to another screen. That button was taking 30 seconds to get them to see the message, and the work that was expected to be done by the Human Activity’s OnReady was not getting done for an additional minute. What was happening?

We dug a little deeper into the logs, and…

On OutSystems projects with multi-tenancy, there will invariably be a moment where a developer will ask me, “what does the ‘IsMultiTenant’ property of the Module do?” Based on the naming, they are wondering if that setting has any impact on whether or not multi-tenancy works as-expected if it is set to False.

The most mysterious of all settings!

All that setting does is control the default behavior of the items in a Module that can be multi-tenant:

  • Entities
  • Site Properties
  • Timers

Each of these items has an “Is Multi-tenant” property on them, that by default is blank. If they are left on blank, they will behave…

A common need in OutSystems is to use a GUID as an Entity Identifier, but unfortunately the platform does not natively support this (there is an Idea on the Ideas board for this). Luckily, it is not too hard to do this yourself, especially when using the CRUD wrapper patterns to save data.

“Goo-ID” not “goo-EY”

But first…

Why would you want to do this in the first place? Using a GUID for an Identifier has a number of advantages, and a disadvantage or two as well.


  • When the Id is used in a URL that could be public (such as a link in an…

Becoming a better programmer is often a matter of small improvements rather than big leaps of experience. One area that is made up of incremental things rather a “big bang” change is the area of “coding hygiene”, the things we do to make our code clean, easy-to-read, and maintainable. One of the nicest things I have done for myself on this topic is to start using a “NotImplemented” Exception. Let me explain.

Imagine the following statement: “if A then B, else C”. All well and good. Now, in some situations, “if not A then C” may be a perfectly correct…

This is it… what should be the final article to wrap up the CRUD Wrapper Saga! In this article we are going to take a look at how we take the wonderful CRUD wrappers that have been written and use them in your application. I promise this will not be hard! After all, we didn’t go through all of this work only to have a bad experience living with the CRUD wrappers. So let’s get them used in our application.

I was actually looking for a 3.5" floppy to put in this image when I discovered I owned a VHS tape! That’s got the ultrasound of one of my kids on it. Also, time to clean my cooling vents on the PC, yuck!

One of the tricks with the Remove and Upsert Actions we wrote was to violate the parameter naming convention that…

We are nearly at the end of our lengthy tour of CRUD wrappers! The last article looked at removing data, and today we will take a look at reading data. The first question you might be asking yourself, is, “why would I want a CRUD wrapper to read data?” (besides hitting the “R” in “CRUD” for completeness) and that is a truly good question.

I feel so off brand here, I tried my best to shoehorn my way into this picture and there wasn’t a good way to do it, and the alternative was to try buying punchcards off eBay and I really didn’t feel like waiting another week for those to show up before publishing this…

Let’s look at some pros and cons:


  • You can log/audit who/when/where a read occurred. …

Alright! We just figured out how to get data into the database… and now it’s time to get rid of it when it is no longer needed. Time to remove data. (As always, the full implementation of this code can be found in the Application Framework.)

By the way, please note how I wrote remove and not delete. Any ideas why? You got it, because in general I prefer to not delete data. Before we go on, let’s clear up some terminology and weigh the pros and cons of how we get data out of our applications. …

Whew! We are almost there, I promise! Let’s work on two sample Entities to show how we build them out, and then get data saved to them. They will be called SampleEntity and SampleEntityFK. As always, the reference code is the Application Framework on the OutSystems Forge!

How do I get this data into the system? Bueller? Bueller?


First, let’s make sure that your application is organized correctly. Are you following Four Layer Canvas, or at least something close to it (it’s often difficult to be 100% aligned with it)? Good. In your Model, we are going to make a folder under Logic, with the same name as your Entity (“SampleEntity”)…

I have a checklist of tasks that I like to make sure get done before going life for a project for the first time. I have also found it helpful to go through this list periodically to ensure code quality. None of these items are particularly tricky or difficult, but they require that you pay attention and not zone out while going through the code. Here’s the list!

There needs to be a checklist for “how to regain my sanity after 10 days of a rental car”.
  • Verify the the role access in each Screen’s properties are correct to the business rules.
  • Use HTTPS/SSL on all pages unless you have a really good reason (such as HTML2PDF using “localhost”…

When building CRUD wrappers in your OutSystems project, there are a number of things you will always need to ask yourself along the way to make sure that they are built properly. Here is a checklist of items in the CRUD wrapper building process:

Let’s see who gets this joke besides Miguel Seabra Melo
  • Do we need to remove child records when deleting the parent record? If so, we need to find those child records in the GetCanRemove action, and call their GetCanRemove actions, and if there are any failures, add them to our messages list. We will also need to validate that we have no messages accumulated, and if…

Justin James

OutSystems MVP & longtime technical writer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store