Move modules – Remove IPP – OutSystems

I needed to move some modules from one infrastructure to another so first I needed to remove IPP  (Intellectual Property Protection).

1 – In Service Studio, open your module and goto Module -> Export -> Save As…

Export OML

2 – Navigate to Intellectual Property Protection (IPP) Rights Validation

Here you need to enter your email, the destination activation code for your target infrastructure, and upload your OML

IPP Validation

3 – You will receive an email with the OML file without IPP protection. Download the file.

4 – In Service Studio goto Module -> Open File…

Open module

5 – Publish your module

No data type ‘TYPE’ could be found – OutSystems Combo Box

I was trying to set up a Combo Box bounded to a static entity and I got this error when I published the website:

Internal Error 
No data type 'Status' could be found. 
Exception Details:
[1] Internal Error: No data type 'Status' could be found.
at OutSystems.HubEdition.Compiler.WebWidgets.ComboBox.dumpEntityDeclaration(TextWriter res)
 at OutSystems.HubEdition.Compiler.WebWidgets.ComboBox.DumpDataBindingCode(TextWriter writer)
 at OutSystems.HubEdition.Compiler.AbstractServerWebWidget.DumpOnDataBinding(TextWriter writer, NodeViewState viewState)
 at OutSystems.HubEdition.Compiler.AbstractServerWebWidget.DumpHandler(TextWriter writer, NodeViewState viewState)
 at OutSystems.HubEdition.Compiler.WebWidgets.ComboBox.DumpHandler(TextWriter res, NodeViewState viewState)
 at OutSystems.HubEdition.Compiler.Nodes.WebScreen.Dump(TextWriter writer)
 at OutSystems.HubEdition.Compiler.Flows.WebFlow.Dump()
 at OutSystems.HubEdition.Compiler.WebFlows.WebHandler.Dump(IEnumerable`1 webFlows)
 at OutSystems.HubEdition.Compiler.ESpace.Dump()
 at OutSystems.HubEdition.Compiler.Compiler.InnerCompile(CompilationContext context)
 at OutSystems.HubEdition.Compiler.Compiler.Compile(CompilationContext context)
 at OutSystems.HubEdition.Compiler.Utils.CompilerUtils.WithOverridenSettings(IDictionary`2 settingsOverride, Action body)
 at OutSystems.HubEdition.Compiler.Compiler.<>c__DisplayClass3.<Compile>b__1()
 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
 at System.Threading.ThreadHelper.ThreadStart()

But TrueChange didn’t show me any errors or warnings. I got this error only when I tried to publish the application.

The problem was that the variable that I defined to hold the value entered by the user was of the Static Entity type instead of the Static Entity Identifier type.

That variable “Status” was defined like this:

And must be defined like this:

It must be a Status Identifier instead of the Status (static entity).

Converting a Vertical Table to an Horizontal Table in SQL Server

Today I’ve encountered a vertical table in an SQL Database and I wanted to transform it to an horizontal one. A vertical table is described as an EAV model.

Imagine you have this table

CREATE TABLE VerticalTable
Id int,
Att_Id varchar(50),
Att_Value varchar(50)

INSERT INTO VerticalTable
SELECT 1, 'FirstName', 'John' UNION ALL
SELECT 1, 'LastName', 'Smith' UNION ALL
SELECT 1, 'Email', '' UNION ALL
SELECT 2, 'FirstName', 'Jack' UNION ALL
SELECT 2, 'LastName', 'Daniels' UNION ALL
SELECT 2, 'Email', ''

If you run

SELECT * FROM VerticalTable

you get this

Id Att_Id Att_Value
1 1 FirstName John
2 1 LastName Smith
3 1 Email
4 2 FirstName Jack
5 2 LastName Daniels
6 2 Email


To convert this into an horizontal table I’m going to use PIVOT.

SELECT [Id], [FirstName], [LastName], [Email] 
 SELECT Id, Att_Id, Att_Value FROM VerticalTable
) as source
 MAX(Att_Value) FOR Att_Id IN ([FirstName], [LastName], [Email])
) as target

And I will get this

Id FirstName LastName Email
1 1 John Smith
2 2 Jack Daniels


You can find the code here.

Speaker at Collab 365


I’m proud to announce that I was selected to present a session at Collab 365 Global Conference 2016. This is a global online conference delivering sessions about SharePoint, Office 365 and Azure on the 19th-20th October.  And it’s free. Register here.

In my session I will talk about event driven applications with Azure Functions, it will cover triggers and webhooks that Azure Functions provide. It will also have a look at various integrations and at last, it will check the scaling and costs.

See you there

log4net PatternLayout and PatternConverter

I have the following scenario:

I’m using Unity dependency injection container and interception techniques to log some WCF operation calls. I need to log the input parameters and also the result of these operations so I’ve implemented a CallHandler that I can apply to whatever methods that I need to intercept.

In this CallHandler I’ve defined a class called LogEntry and I’m logging with log4net. Something like this:

LogEntry logEntry = new LogEntry();
// set some base properties
logEntry.MethodName = input.MethodBase.Name;
logEntry.TypeName = input.Target.GetType().FullName;
// set input parameters
logEntry.Input = ....;
// set return value
logEntry.ReturnValue = result.ReturnValue;
// set total method duration
logEntry.CallTime = stopwatch.Elapsed.TotalMilliseconds;

// use log4net logger to log this information

So this LogEntry class has some properties that will hold the information that I want to log. Now I need to capture these properties and configure the log4net appenders properly.

I’m using log4net PatternLayout and PatternConverter features. Let’s start with PatternLayout

/// Extended version of <see cref="PatternLayout"/>
/// </summary>

public class ExtendedPatternLayout : PatternLayout
 /// Initializes a new instance of the <see cref="ExtendedPatternLayout"/> class.
 /// </summary>;

 public ExtendedPatternLayout()
   this.AddConverter(new ConverterInfo()
     Name = "logEntry",
     Type = typeof(LogEntryConverter),

This layout just adds a new Converter named “logEntry” implemented by the class LogEntryConverter. There is no reference to LogEntry class here. And the LogEntryConverter class is here:

 /// <summary>
 /// Custom <see cref="PatternConverter"/> to handle <see cref="LogEntry"/>
 /// </summary>
 public class LogEntryConverter : PatternConverter
   /// <summary>
   /// Converts the specified writer.
   /// </summary>
   /// <param name="writer">The writer.</param>
   /// <param name="state">The state.</param>
   protected override void Convert(System.IO.TextWriter writer, object state)
       var loggingEvent = state as LoggingEvent;
       var logEntry = loggingEvent.MessageObject as LogEntry;

       if (logEntry != null)
          switch (this.Option.ToLower())
             case "calltime":
               writer.Write(logEntry.CallTime.HasValue ? logEntry.CallTime.Value : 0);
             case "methodname":
             case "returnvalue":

I’ve made the code smaller but you need to check for null references!

I’m using a JSON serialization technique to grab the representation of the method’s return value.

I need to override the Convert method and access state object that is a log4net LoggingEvent object. This object has my logged object from the CallHandler which is a LogEntry object. Based on the Option property of the converter I can choose which property to write.

And finally I can configure my log4net like this

<layout type="ExtendedPatternLayout">
  <conversionPattern value="%logEntry{CallTime}" />

You can see the conversionPattern follows this syntax: %convertername{option}

nettiers – GetBy Index problem with StoredProcedure long name

Today I’ve discovered a problem with CodeSmith nettiers templates because it was possible to generate two SPs with the same name, for different entities.

This happens when there are two indexes for two different tables that have the same column names and the column names reach the maximum lenght (128 for SQL). In this case the generated SP name doesn’t contain the table name as a prefix.

Here is the original nettiers code for the GetProcNameForGetByIX method in CommonSqlCode.cs:

// get the key names one at a time until we run out of space
stringbuilder names = new stringbuilder(maxlen);
string keyname;
for(int x = 0; x < keys.length; x++)
  keyname = getpropertyname(keys[x]);
  if (names.length + keyname.length <= maxlen)
return names.tostring();

I’ve upgraded the method to receive the index name and the new code is:

if (string.IsNullOrEmpty(indexName))
   throw new Exception("Need index name");
 string name = string.Concat(prefix, indexName);
 if (name.Length > maxLen)
   throw new Exception("SP name continues to be greater than maxlen");
 return name;

Then I needed to pass the index name on all the places that this method was call. Just use find in files and search for that method.

Got my first IoT device


yesterday I got my first Arduino. Here it is my first sketch… the blink sketch 🙂


And the Arduino IDE blink sketch

// the setup function runs once when you press reset or power the board
void setup() {
 // initialize digital pin 13 as an output.
 pinMode(13, OUTPUT);

// the loop function runs over and over again forever
void loop() {
 digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
 delay(150); // wait
 digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
 delay(150); // wait

SQL Persisted Computed Column ANSI_NULLS

I had to recreate a table in SQL Server just because it was created with ANSI_NULLS ON

Here you can check the requirements to create a persisted  computed column on SQL Server.

“…the SET options in the following table must be set to the values shown in the Required value column…”

SET options Required value Default server value Default

OLE DB and ODBC value


DB-Library value



Add WCF Message Id in every log4net message

I needed to have the WCF message identifier in every log message because I needed to correlate the log messages from a particular WCF call.

The best way to achieve this with log4net is to use context properties.

Since I’m already using Unity and Interception on my WCF Services, I’ve decided to implement a custom Call Hander

namespace CustomCallHandlers
 using System;
 using Microsoft.Practices.Unity.InterceptionExtension;

 /// <summary>
 /// Call Handler to setup wcf message id in log4net context
 /// </summary>
 public class ServiceCallHandler : ICallHandler
 /// <summary>
 /// The message identifier
 /// </summary>
 private const string MessageIdKey = "MessageId";

 /// <summary>
 /// Initializes a new instance of the <see cref="ServiceCallHandler"/> class.
 /// </summary>
 /// <param name="order">The call handler's execution order.</param>
 public ServiceCallHandler(int order)
  this.Order = order;

 /// <summary>
 /// Gets or sets the order.
 /// </summary>
 public int Order { get; set; }

 /// <summary>
 /// Invokes the specified input.
 /// </summary>
 /// <param name="input">The input.</param>
 /// <param name="getNext">The get next.</param>
 /// <returns>The method return for the nexte invocation</returns>
 public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
  if ((System.ServiceModel.OperationContext.Current != null) &&
      (System.ServiceModel.OperationContext.Current.IncomingMessageHeaders != null))
   if (System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.MessageId != null)
    string messageId = System.ServiceModel.OperationContext.Current.IncomingMessageHeaders.MessageId.ToString();
    log4net.ThreadContext.Properties[MessageIdKey] = messageId == "(null)" ? Guid.NewGuid().ToString() : messageId;

  IMethodReturn resultado = getNext()(input, getNext);

  // Cleaning
  log4net.ThreadContext.Properties[MessageIdKey] = null;

  return resultado;

If you want to see how to configure log4net appenders to write custom properties check this post.