How-to: Create Notifications – Steps to Take

In a recent VSCode/AL update training the topic notifications, as part of SaaSifying your solution, was tackled. After a short introduction of what these notifications (functionally) are about I explained and demoed how to develop them. Inviting the attendees thereafter to pose their questions, one of them, a seasoned C/SIDE developer whom I will call Bogdan, marked that he had been implementing them a couple of times and still had issues with the different parts that have to be developed. He asked: “Could you give me a clear overview on what steps I have to take?”

It was special to experience how this resonated in me as that was exactly what I ran into when preparing this part of the training. Notifications as a functional feature are efficient, simple and powerful. To code them isn’t surely rocket science, but to have a clear overview what is needed and how it can be structured can indeed be somewhat muddy. Triggered by Bogdan’s question I came up with the following steps:

  1. Create function label NotificationId
  2. Create sender method
  3. Create recaller method
  4. Create method with send-or-recall logic
  5. Trigger send-or-recall method in event subscribers to relevant publishers

Let me elaborate on these steps by means of an example taken from Daniel Rimmelzwaan’s video Develop SAAS user experiences for Dynamics 365 Business Central.

1.Create function label NotificationId

Each notification should have a unique id being a Guid. For reusability ease you need to create a function label that will allow you to assign and retrieve this id.

local procedure NotificationId()Guid;
    NotificationIdLbl: Label ‘b60c6e03-569c-411b-b65f-4df942d978e2’, Locked = true;

Note that you have to fill in your own, unique Guid.

2.Create sender method

The code part that sets up your notification is called the sender. This is how it could look like:

local procedure SendCompanyInfoMissingNotification()
    CompanyInfoMissingNotification: Notification;
    CompanyInfoMissingNotification.ID := NotificationId();NotificationIdLbl;
    CompanyInfoMissingNotification.Message := CompanyInfoMissingNotificationMsg;
    CompanyInfoMissingNotification.Scope := NotificationScope::LocalScope;
    CompanyInfoMissingNotification.AddAction(OpenCompanyInfoTxt, Codeunit::”Notication Company Info”, ‘ShowCompanyInfomationWizard’);

3.Create recaller method

Each sender should in general be accompanied by a recaller:

local procedure RecallCompanyInfoMissingNotification()
    CompanyInfoMissingNotification: Notification;
    CompanyInfoMissingNotification.ID := NotificationId()NotificationIdLbl;

4.Create method with send-or-recall logic

Given sender and recaller we can now build the send-or-recall logic that will define whether a notification should be sent or recalled.

local procedure SendOrRecallCompanyInfoMissingNotification()
    CompanyInfo: Record “Company Information”;
    if (CompanyInfo.Name = ) or (CompanyInfo.“E-Mail” = then

5.Trigger send-or-recall method in event subscribers to relevant publishers

Eventually, now having all logic in place to create a notification and determine to get it shown, the last part we need to setup is when it should be triggered.

[EventSubscriber(ObjectType::PagePage::”Sales Order”, ‘OnAfterGetCurrRecordEvent’, false, false)]
local procedure CompanyInfoMissingNotifOnAfterGetCurrRecordEvent(var Rec: Record “Sales Header”)

And of course add two labels for the notification and the action texts

    OpenCompanyInfoTxt: Label ‘Open company information’;
    CompanyInfoMissingNotificationMsg: Label ‘Company information is missing.’;

Hope this makes sense and can be of help.

Update 20201117

An interesting discussion occurred on my tweet regarding this post. Have a look. One of the spin offs is that I replaced the NotificationId() function by a label, locked against translation

Update 20201119

Waldo has added this a a snippet tnotificationcodeunitwaldo to his CRS AL Language Extension.

Leave a Reply

Your email address will not be published. Required fields are marked *