Custom Filter Tokens

by May 3, 2022AL Language

Home 9 Development 9 AL Language 9 Custom Filter Tokens

As a user of the Business Central you have some constants you can use to filter or insert values. These constants contain useful values for data manipulation such as

  • t / today for date field – return current date
  • q / quarter for date field filters – return range of the current quarter
  • w / week, m / month, y / year ….

However, in some cases, we need some other constants. For that reason, we can use codeunit 41 “Filter Tokens” (codeunit 58 “Filter Tokens Impl.”). It contains functionality that allows defining our own constants for custom fields. Source codes for this functionality are on Microsoft’s GitHub.

Let’s look at some details.

Available procedures & events in “Filter Tokens” codeunit

We have four different procedures for filter token validation based on the requested data type. All procedures accept filter token as a parameter and returns (within the same input-output parameter) date value or date filter value.

procedure MakeDateFilter(var DateFilterText: Text)
procedure MakeTimeFilter(var TimeFilterText: Text)
procedure MakeTextFilter(var TextFilter: Text)
procedure MakeDateTimeFilter(var DateTimeFilterText: Text)

These procedures have support for some constants by default.

For text variables, supported constants are ME, USER (return UserId()) and COMPANY (returns CompanyName()).

For date, time and DateTime variables we have similar constants to the constants available for standard table filters such as NOW, TODAY, WORKDATE, YESTERDAY, TOMORROW, WEEK, MONTH, YEAR.

However, the biggest advantage of this functionality is that we can use our own constants. To add support for a new constant we have to define constant transformation (to date or time variables) using the following OnResolve publishers.

procedure OnResolveDateFilterToken(DateToken: Text; var FromDate: Date; var ToDate: Date; var Handled: Boolean)
procedure OnResolveTextFilterToken(TextToken: Text; var TextFilter: Text; var Handled: Boolean)
procedure OnResolveTimeFilterToken(TimeToken: Text; var TimeFilter: Time; var Handled: Boolean)
procedure OnResolveDateTokenFromDateTimeFilter(DateToken: Text; var DateFilter: Date; var Handled: Boolean)
procedure OnResolveTimeTokenFromDateTimeFilter(TimeToken: Text; var TimeFilter: Time; var Handled: Boolean)

How to add own constants

Imagine we want to add support for new constants Monday to Sunday from Last, This and Next week. To do that, just implement OnResolveDateFilterToken from Codeunit Filter Tokens. See code below.

[EventSubscriber(ObjectType::Codeunit, Codeunit::"Filter Tokens", 'OnResolveDateFilterToken', '', false, false)]
local procedure OnResolveDateFilterTokenFilterTokens(DateToken: Text; var FromDate: Date; var ToDate: Date; var Handled: Boolean)
var
    StartingDate: Date;
begin
    StartingDate := WorkDate();
    if DateToken.Contains('last') then
        StartingDate := CalcDate('<-CW-1D>', WorkDate());
    if DateToken.Contains('this') then
        StartingDate := CalcDate('<-CW>', WorkDate());
    if DateToken.Contains('next') then
        StartingDate := CalcDate('<+CW+1D>', WorkDate());

    case true of
        DateToken.Contains('monday'):
            FromDate := CalcDate('<-CW>', StartingDate);
        DateToken.Contains('tuesday'):
            FromDate := CalcDate('<-CW+1D>', StartingDate);
        DateToken.Contains('wednesday'):
            FromDate := CalcDate('<-CW+2D>', StartingDate);
        DateToken.Contains('thursday'):
            FromDate := CalcDate('<-CW+3D>', StartingDate);
        DateToken.Contains('friday'):
            FromDate := CalcDate('<-CW+4D>', StartingDate);
        DateToken.Contains('saturday'):
            FromDate := CalcDate('<-CW+5D>', StartingDate);
        DateToken.Contains('sunday'):
            FromDate := CalcDate('<-CW+6D>', StartingDate);
        else begin
                Handled := false;
                exit;
            end;
    end;
    ToDate := FromDate;
    Handled := true;
end;

That’s all. We can try it for example in sales orders. Using “friday..next friday” we will get all orders with a posting date between this Friday and the next one (inclusive).

Recent Articles from the category

Data types under the microscope: List

Data types under the microscope: List

The List data type in AL language represents an ordered collection of objects that can be accessed by their index. Unlike an Array data type, a List does not have a fixed size and does not need to have its dimension specified when it is declared. The List data type...

read more
Connect to Azure Function in BC 2022 wave 2 (v21)

Connect to Azure Function in BC 2022 wave 2 (v21)

The new version of the Microsoft Dynamics 365 Business Central brought a new system module "Azure Functions" that makes integration with Azure Functions much easier and straightforward. The typical scenario, why to use Azure Functions together with Business Central,...

read more
Collectible Errors?! Is it already in use?

Collectible Errors?! Is it already in use?

Collectible Errors?! Is it already in use? This is the second part of my new article series about Collectible Errors. Let's check out the first part here: Collectible Errors?! | Microsoft Dynamics 365 - Ing. Tomáš Kapitán (kepty.cz) or you might be interested in my...

read more
Collectible Errors?!

Collectible Errors?!

Collectible Errors?! It has been already almost a year since ErrorInfo datatype & CollectibleErrors were introduced (I already have an article about basic structure: ErrorInfo data type & Collectible Errors). This article was released for the first time in...

read more
Substituting standard reports

Substituting standard reports

Report objects cannot be extended in versions previous to the Business Central 2021 release wave 1 version when ReportExtensions object was introduced. Since then, many of changes we need to do in reports can be done without creating a new copy of object. On the other...

read more
Isolated events

Isolated events

With Business Central 2022 wave 1, a new setting for event publishers was introduced. Until this version, any error in any event subscriber caused interruption to the current running process and stopped the whole activity. In some cases (such as log-in), this is...

read more

Sign Up for News

Certifications

Highest certification
Microsoft Data Management and
also in D365 Business Central

Microsoft Certified: Dynamics 365 Business Central Functional Consultant Associate

See other certifications here