Hello everyone.
This time I want to try Preprocessor Directives in AL. This feature applies to Business Central 2020 release wave 2 and later.
In AL, like in other programming languages, preprocessor directives can be used to make code conditional, to suppress warnings, or to enable expand and collapse in code. Preprocessor directives can be divided into the following groups. For more information about each type, use the links provided below.
https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/directives/devenv-directives-in-al#conditional-directives
・Conditional directives
・Regions
・Pragmas
Any code can be made conditional, including table fields, and checked using a conditional directive. To check code using a conditional directive, you must define a symbol to check. A symbol returns a boolean value;trueorfalse. Symbols can be defined at the beginning of a source file and the scope of the specific symbol is the file that it is defined within. You can also define symbols in theapp.jsonfile, and then the scope is global for the extension.
I will do a simple test one by one in this blog.
Conditional Directive (conditional compilation)
The following conditional preprocessor directives are supported in AL.
| Conditional preprocessor directive | Description |
|---|---|
| #if | Specifies the beginning of a conditional clause. The #endif clause ends it. Compiles the code between the directives if the specified symbol being checked is defined. |
| #else | Specifies a compound conditional clause. If none of the preceding clauses evaluates to true, the compiler will evaluate code between #else and #endif. |
| #elif | Combines else and if. If #elif is true the compiler evaluates all code between #elif and the next conditional directive. |
| #endif | Specifies the end of a conditional clause that begins with #if. |
| #define | Defines a symbol that can be used to specify conditions for a compilation. For example, #define DEBUG. The scope of the symbol is the file that it was defined in. |
| #undef | Undefines a symbol. |
You can add “Conditional directives” anywhere in AL. Please note that the most important thing here is the preprocessor symbol.
For Example: ZYDebug

Symbols can be defined globally in the app.json file.
For Example: “preprocessorSymbols”: [“ZYDebug”],

The code will run only when the “Symbol name” in “app.json” is consistent with the “Symbol name” in “Conditional directives”. In other cases, it does not run, this will be very helpful in debugging.

Region Directive (expand/collapse regions of code)
The
https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/directives/devenv-directive-region#regiondirective is used to mark a block of code that you can expand or collapse. This can, for example, be useful for larger files for better readability or for focusing on code that you are currently working on. The#endregionspecifies the end of a#regionblock of code.
A #region block must be terminated with a #endregion directive.
A #region block cannot overlap with an #if block. However, a #region block can be nested in an #if block, and an #if block can be nested in a #region block.

Then you can expand or collapse the codes in the regions.

This feature can improve the Readability of Your Code.
Pragma Directive (disable/enable warnings and implicitwith)
The
https://docs.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/directives/devenv-directive-pragma#pragmadirective gives the compiler special instructions for the compilation of the file in which it appears. The#pragmadirective has a number of actions that can be used with the pragma instructions below, these aredisable,restore, andenable.
Now AL supports the following pragma instructions (2020/10/05):
Pragma ImplicitWith
The
#pragma implicitwithinstruction changes the compiler behavior to not create an implicit with. This can be used as a temporary solution to avoid getting warnings on the usage of implicit with statements in the code, that you plan on rewriting but just have not fixed yet. With the#pragma implicitwith disableyou disable the emit of implicit with warnings for a specific location in code that follows the instruction, and with#pragma implicitwith restoreyou restore the warning back to it’s original state. If you do notrestore, thedisableinstruction is valid for the rest of the file.
The
#pragma warninginstruction can enable or disable certain warnings. This can be used as a solution to avoid getting warnings on, for example, string length on fields that you cannot change. With the#pragma warning disablestatement you disable the emit of the warning for a specific location in code, and with#pragma warning restoreyou restore the warning back to it’s original state. If you do notrestore, thedisableinstruction is valid for the rest of the file.
#pragma implicitwith is just to deal with the warning of “with” function, let’s test #pragma warning.
For example, there are 100 warnings in the following object “NewCustomerList.Page.al”.

You can enter “#pragma warning disable” to ignore all warning.

Or, enter “#pragma warning disable AL0604” to ignore “AL0604” warning.

These Preprocessor Directives have long existed in other languages, such as C#, and this time I am so happy that it has been added to AL.
Update 2023.04.12: Business Central 2023 wave 1 (BC22): New rule to enforce pragma warning ‘disable’ specifying a disabled rule (CodeCop Warning AA0246)
Hope this will help.
Thanks.




コメント