<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ApplicationCop on ALCops</title><link>https://alcops.dev/docs/analyzers/applicationcop/</link><description>Recent content in ApplicationCop on ALCops</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://alcops.dev/docs/analyzers/applicationcop/index.xml" rel="self" type="application/rss+xml"/><item><title>DrillDownPageId and LookupPageId must be defined for tables used in list pages (AC0001)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0001/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0001/</guid><description>&lt;p&gt;When a table is used as the source for a list page, users expect to be able to drill down into records and open lookups in a consistent and predictable way. The DrillDownPageId and LookupPageId table properties define which pages are used for these interactions.&lt;/p&gt;
&lt;p&gt;Without these properties, the Business Central client cannot provide the expected navigation experience, potentially confusing users and breaking standard UX patterns.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following table is used by a list page but does not define both required properties:&lt;/p&gt;</description></item><item><title>Single-field primary key requires the NotBlank property (AC0002)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0002/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0002/</guid><description>&lt;p&gt;In tables that define a primary key consisting of a single field of type Code or Text, the primary key field must explicitly set the NotBlank property. This ensures that empty values cannot be used as primary keys, which would violate database integrity principles.&lt;/p&gt;
&lt;p&gt;Explicitly declaring NotBlank makes the design intent clear and prevents runtime errors when attempting to insert records with blank primary key values.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;</description></item><item><title>Set NotBlank property to false when No. Series TableRelation exists (AC0003)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0003/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0003/</guid><description>&lt;p&gt;When the &amp;lsquo;No. Series&amp;rsquo; TableRelation is present on the table, assigning the primary key might occur after inserting the record, which could cause an error due to the NotBlank property.&lt;/p&gt;
&lt;p&gt;Number series functionality in Business Central allows records to be inserted with an empty primary key value initially, with the actual value being assigned afterward through the number series logic. Setting NotBlank to true on such fields prevents this pattern from working correctly.&lt;/p&gt;</description></item><item><title>Confirm() must be implemented through the Confirm Management codeunit (AC0004)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0004/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0004/</guid><description>&lt;p&gt;Direct calls to Confirm() bypass the safeguards and features provided by the Confirm Management codeunit in the System Application. Using Confirm Management ensures automatic validation of IsGuiAllowed(), prevents runtime failures in non-GUI contexts, and allows explicit control over the default response (true or false).&lt;/p&gt;
&lt;p&gt;The Confirm Management codeunit centralizes confirmation dialog handling and provides a consistent, testable pattern across the application.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following code uses the built-in Confirm method directly:&lt;/p&gt;</description></item><item><title>GlobalLanguage() must be implemented through the Translation Helper codeunit (AC0005)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0005/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0005/</guid><description>&lt;p&gt;Direct use of GlobalLanguage() leads to verbose, error-prone code and often requires manual state management, hardcoded language IDs, or duplicated logic. The Translation Helper codeunit from the Base Application centralizes global language handling by automatically preserving and restoring the previous language, supporting both LanguageId and LanguageCode, and allowing a safe reset to the default application language without hardcoding values such as 1033.&lt;/p&gt;
&lt;p&gt;This pattern ensures that language switches are always properly cleaned up and prevents side effects in multi-language scenarios.&lt;/p&gt;</description></item><item><title>Use the Page Management codeunit instead of invoking Page.Run directly (AC0006)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0006/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0006/</guid><description>&lt;p&gt;Direct calls to Page.Run bypass the centralized logic provided by the Page Management codeunit. Using Page Management improves correctness and extensibility by automatically resolving the appropriate page based on record context, table relationships, and configuration.&lt;/p&gt;
&lt;p&gt;The Page Management codeunit provides a single point of control for page selection logic, making it easier to extend and customize page navigation behavior across the application.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;</description></item><item><title>Install and Upgrade codeunits should have Access set to Internal (AC0007)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0007/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0007/</guid><description>&lt;p&gt;Install and Upgrade codeunits are intended for lifecycle execution only and are not designed to expose reusable APIs. Declaring them as Public unnecessarily broadens their surface area and increases coupling between extensions.&lt;/p&gt;
&lt;p&gt;Making these codeunits internal ensures they are only accessible within the extension that defines them, preventing external dependencies on implementation details that are meant to run only during installation or upgrade.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;</description></item><item><title>DataPerCompany must be explicitly set on table objects (AC0008)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0008/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0008/</guid><description>&lt;p&gt;In projects where company data isolation matters, table objects must explicitly define the DataPerCompany property. Relying on implicit defaults makes the data scope unclear and can lead to incorrect assumptions about whether data is shared across companies or stored per company.&lt;/p&gt;
&lt;p&gt;Explicitly declaring this property ensures that the design intent is clear and documented in the code, preventing data isolation issues in multi-company environments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This rule is disabled by default. Enable it in your project&amp;rsquo;s &lt;code&gt;.editorconfig&lt;/code&gt; or ruleset file if you want to enforce explicit DataPerCompany declarations.&lt;/p&gt;</description></item><item><title>The Caption of permissionset objects should not exceed the maximum length (AC0009)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0009/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0009/</guid><description>&lt;p&gt;PermissionSet captions should remain within a defined maximum length (30 characters) to avoid issues in translated captions. When no MaxLength or Locked subproperty is specified, translations can exceed the intended limit and cause inconsistent or truncated UI labels.&lt;/p&gt;
&lt;p&gt;Setting an explicit MaxLength constraint or marking the caption as Locked ensures that translated captions do not break the UI or cause display issues.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;</description></item><item><title>All application objects must be covered by a PermissionSet (AC0010)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0010/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0010/</guid><description>&lt;p&gt;Every application object in an extension must be explicitly granted permissions through at least one permission set or permission set extension, defined in AL or XML. This ensures that when the extension is deployed, users with the appropriate permission sets can access all functionality.&lt;/p&gt;
&lt;p&gt;Without explicit permission coverage, objects may be inaccessible to users, leading to runtime errors or broken functionality even though the objects are technically deployed.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following table is not covered by any permission set:&lt;/p&gt;</description></item><item><title>Captions must be defined on user-facing objects and controls (AC0011)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0011/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0011/</guid><description>&lt;p&gt;All user-facing application objects and controls must explicitly define a Caption to ensure a consistent, accessible, and localizable user interface. Captions provide users with meaningful labels for pages, fields, actions, and other UI elements.&lt;/p&gt;
&lt;p&gt;Without explicit captions, the Business Central client may fall back to object names or technical identifiers, resulting in a poor user experience and making localization impossible.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following page action is missing a Caption:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;page&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyPage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;actions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;area&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;Processing&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;action&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;MyAction&lt;span style="color:#f92672"&gt;) &lt;/span&gt;&lt;span style="color:#75715e"&gt;// A user-facing object or control is missing a Caption. [AC0011]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;trigger&lt;/span&gt; OnAction&lt;span style="color:#f92672"&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, add a Caption property:&lt;/p&gt;</description></item><item><title>Integration events must not be declared in codeunits with Access set to Internal (AC0012)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0012/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0012/</guid><description>&lt;p&gt;Integration events are designed to be consumed by extensions and therefore must be accessible outside the defining app. When an IntegrationEvent is declared in a codeunit with Access = Internal, the event cannot be subscribed to by extensions, rendering it ineffective.&lt;/p&gt;
&lt;p&gt;If the event is intended for internal use only within the same app, it should be declared as an InternalEvent instead.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;</description></item><item><title>DropDown and Brick fieldgroups must be defined (AC0013)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0013/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0013/</guid><description>&lt;p&gt;Table objects must explicitly define both the DropDown and Brick fieldgroups. These fieldgroups control how records are displayed in dropdown lists and tile views throughout the Business Central client.&lt;/p&gt;
&lt;p&gt;The DropDown fieldgroup determines which fields are shown when users select records from a lookup, while the Brick fieldgroup defines the tile representation used in certain UI contexts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This rule is disabled by default. Enable it in your project&amp;rsquo;s &lt;code&gt;.editorconfig&lt;/code&gt; or ruleset file if you want to enforce fieldgroup definitions.&lt;/p&gt;</description></item><item><title>ToolTip must end with a dot (AC0014)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0014/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0014/</guid><description>&lt;p&gt;End ToolTips with a dot to keep phrasing consistent and clearly separated from surrounding UI text. This follows the Business Central user assistance model and ensures a professional, polished appearance.&lt;/p&gt;
&lt;p&gt;Consistent punctuation in ToolTips improves readability and makes the UI feel more cohesive.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following field has a ToolTip without a trailing dot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyTable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;field&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; MyField; &lt;span style="color:#66d9ef"&gt;Integer&lt;/span&gt;&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ToolTip = &lt;span style="color:#e6db74"&gt;&amp;#39;Specifies the value&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// ToolTip must end with a dot. [AC0014]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, add a dot at the end:&lt;/p&gt;</description></item><item><title>ToolTip should start with Specifies (AC0015)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0015/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0015/</guid><description>&lt;p&gt;For field ToolTips, the Business Central user assistance model expects the text to start with the verb &amp;lsquo;Specifies&amp;rsquo; to describe what the field represents. This convention provides a consistent voice and format across all field documentation.&lt;/p&gt;
&lt;p&gt;Starting with &amp;lsquo;Specifies&amp;rsquo; helps users quickly understand the purpose of a field in a standardized way.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following field has a ToolTip that doesn&amp;rsquo;t start with &amp;lsquo;Specifies&amp;rsquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyTable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;field&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; MyField; &lt;span style="color:#66d9ef"&gt;Integer&lt;/span&gt;&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ToolTip = &lt;span style="color:#e6db74"&gt;&amp;#39;The field value.&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// ToolTip should start with the verb &amp;#39;Specifies&amp;#39;. [AC0015]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, rewrite the ToolTip to start with &amp;lsquo;Specifies&amp;rsquo;:&lt;/p&gt;</description></item><item><title>Do not use line breaks in ToolTip (AC0016)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0016/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0016/</guid><description>&lt;p&gt;The Business Central user assistance model does not support formatting in ToolTips. Line breaks are not rendered and make the ToolTip harder to read. Keep ToolTips as a single, continuous sentence.&lt;/p&gt;
&lt;p&gt;Line breaks in ToolTips can cause display issues and result in unpredictable rendering across different clients and contexts.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following field has a ToolTip with line breaks:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyTable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;field&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; MyField; &lt;span style="color:#66d9ef"&gt;Integer&lt;/span&gt;&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ToolTip = &lt;span style="color:#e6db74"&gt;&amp;#39;Specifies the value.\This is a second line.&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// ToolTip text must not contain line breaks. [AC0016]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, remove the line break and keep the text as a single sentence:&lt;/p&gt;</description></item><item><title>ToolTip should not exceed 200 characters (AC0017)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0017/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0017/</guid><description>&lt;p&gt;The user assistance model recommends keeping ToolTips short (about 200 characters including spaces) so users can scan them quickly. The UI can render longer ToolTips, but longer text reduces scannability and consistency.&lt;/p&gt;
&lt;p&gt;Concise ToolTips improve the user experience by providing essential information without overwhelming the reader.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following field has a ToolTip that exceeds the recommended length:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyTable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;field&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; MyField; &lt;span style="color:#66d9ef"&gt;Integer&lt;/span&gt;&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ToolTip = &lt;span style="color:#e6db74"&gt;&amp;#39;Specifies the value that is used for this particular field and contains a very long description that exceeds the recommended maximum length of 200 characters, which makes it harder for users to quickly scan and understand the purpose of this field.&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// ToolTip exceeds the recommended maximum length of 200 characters. [AC0017]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, shorten the ToolTip to focus on essential information:&lt;/p&gt;</description></item><item><title>Empty captions should be locked (AC0018)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0018/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0018/</guid><description>&lt;p&gt;When a Caption property is intentionally left empty, it should always be marked with Locked = true. An empty caption without locking is still extracted into translation files, resulting in meaningless entries that waste translator time and bloat translation resources.&lt;/p&gt;
&lt;p&gt;Marking empty captions as locked makes the design intent explicit and prevents unnecessary translation overhead.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following table field has an empty caption without the Locked property:&lt;/p&gt;</description></item><item><title>Reserve Enum value zero (0) for empty value (AC0019)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0019/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0019/</guid><description>&lt;p&gt;Zero (0) should be reserved as the empty Enum value. Business Central stores Enums as integers and does not support null; new records (and existing records after adding a field via table extension) default to 0, which makes non-empty meaning at 0 ambiguous.&lt;/p&gt;
&lt;p&gt;By reserving 0 as an empty sentinel value, you ensure that default record states are clearly distinguished from intentional enum selections.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following enum assigns a meaningful value to 0:&lt;/p&gt;</description></item><item><title>Labels suffixed with Tok must be locked (AC0020)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0020/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0020/</guid><description>&lt;p&gt;Labels ending with the suffix &amp;lsquo;Tok&amp;rsquo; represent tokens: hardcoded, non-translatable values. Such labels must explicitly have the Locked property set to true to prevent translation.&lt;/p&gt;
&lt;p&gt;The &amp;lsquo;Tok&amp;rsquo; suffix is a widely-adopted naming convention in Business Central AL development to indicate that a label contains a technical identifier, API constant, or other value that should never be translated.&lt;/p&gt;
&lt;p&gt;A code fix is available for this diagnostic.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following label is suffixed with &amp;lsquo;Tok&amp;rsquo; but not locked:&lt;/p&gt;</description></item><item><title>Locked Label must have a suffix Tok (AC0021)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0021/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0021/</guid><description>&lt;p&gt;A label with the Locked property set to true is explicitly marked as non-translatable and represents a hardcoded value. To make this intent explicit and consistent, locked labels must be suffixed with &amp;lsquo;Tok&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;This naming convention helps developers immediately recognize that a label contains a technical value that should not be translated, improving code readability and maintainability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This rule is disabled by default. Enable it in your project&amp;rsquo;s &lt;code&gt;.editorconfig&lt;/code&gt; or ruleset file if you want to enforce the &amp;lsquo;Tok&amp;rsquo; suffix convention for all locked labels.&lt;/p&gt;</description></item><item><title>Empty Enum value should not have a Caption property specified (AC0022)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0022/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0022/</guid><description>&lt;p&gt;Enum values with an empty name act as sentinel or placeholder values in Business Central. These values are not selectable, not accessible from AL code, and never displayed in the client.&lt;/p&gt;
&lt;p&gt;Defining a Caption for an empty enum value is meaningless since the caption will never be shown or used. Removing it reduces clutter and makes the design intent clearer.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following enum has an empty value with a Caption:&lt;/p&gt;</description></item><item><title>Enum value must have non-empty Caption to be selectable in the client (AC0023)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0023/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0023/</guid><description>&lt;p&gt;Enum values with a non-empty name are intended to be selectable and visible in the Business Central client. If the Caption is empty, the value is hidden from the UI, leading to unexpected behavior and incomplete user interaction.&lt;/p&gt;
&lt;p&gt;Every selectable enum value must have a meaningful Caption so users can see and choose it in the UI.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following enum value has a name but an empty Caption:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyEnum
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;value&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; MyValue&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Caption = &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// The enum value &amp;#39;MyValue&amp;#39; has an empty Caption and will not be shown or be selectable in the client. [AC0023]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, provide a meaningful Caption:&lt;/p&gt;</description></item><item><title>Event publisher methods should not be public (AC0024)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0024/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0024/</guid><description>&lt;p&gt;Event publisher methods are intended solely to raise events within the extension that defines them. When declared as public, they can be called by external dependency apps, which is a design smell and breaks the intended event-driven pattern. Additionally, public event publishers are treated as part of the public API, meaning their parameter signature cannot be extended in the future without introducing breaking changes.&lt;/p&gt;
&lt;p&gt;Declaring event publishers as local or internal ensures they can only be raised within the defining extension while still allowing external extensions to subscribe to the events.&lt;/p&gt;</description></item><item><title>Use the (CR)LFSeparator from the Type Helper codeunit (AC0025)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0025/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0025/</guid><description>&lt;p&gt;Avoid manually creating helper methods or assigning character values (e.g., Char := 10 or Text[1] := 10) to define line feed (LF) or carriage return (CR) variables. Instead, use the LFSeparator and CRLFSeparator constants provided by the &amp;ldquo;Type Helper&amp;rdquo; codeunit from the Base Application.&lt;/p&gt;
&lt;p&gt;Using the centralized Type Helper constants ensures consistency, improves code readability, and reduces duplication.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following code manually assigns the LF character:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;codeunit&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyCodeunit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;procedure&lt;/span&gt; MyProcedure&lt;span style="color:#f92672"&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LineFeed: &lt;span style="color:#66d9ef"&gt;Char&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LineFeed &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Use the (CR)LFSeparator from the &amp;#34;Type Helper&amp;#34; codeunit from the Base Application to define a line feed (LF) or carriage return (CR) variable. [AC0025]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, use the Type Helper codeunit:&lt;/p&gt;</description></item><item><title>Explicitly set AllowInCustomizations for excluded fields (AC0026)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0026/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0026/</guid><description>&lt;p&gt;Fields that are not included on pages can still be exposed through page customizations. To avoid unintended visibility or customization behavior, the AllowInCustomizations property must be set explicitly for such fields.&lt;/p&gt;
&lt;p&gt;This ensures that developers consciously decide whether omitted fields should be available for user customizations, preventing accidental exposure of internal or deprecated fields.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following table field is not exposed on any page and lacks the AllowInCustomizations property:&lt;/p&gt;</description></item><item><title>Use the Tok suffix for token labels (AC0027)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0027/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0027/</guid><description>&lt;p&gt;When a label value is identical to its name, the label represents a fixed token rather than translatable text. Such labels must use the &amp;lsquo;Tok&amp;rsquo; suffix to make this intent explicit.&lt;/p&gt;
&lt;p&gt;Token labels typically contain technical identifiers, API paths, or other values that mirror their variable name and should not be translated.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following label has a value identical to its name but lacks the &amp;lsquo;Tok&amp;rsquo; suffix:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;codeunit&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyCodeunit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ApiVersion: &lt;span style="color:#66d9ef"&gt;Label&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ApiVersion&amp;#39;&lt;/span&gt;, Locked = true; &lt;span style="color:#75715e"&gt;// Label &amp;#39;ApiVersion&amp;#39; represents a token but does not use the required &amp;#39;Tok&amp;#39; suffix. [AC0027]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, add the &amp;lsquo;Tok&amp;rsquo; suffix:&lt;/p&gt;</description></item><item><title>Table field must define a ToolTip (AC0028)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0028/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0028/</guid><description>&lt;p&gt;It is better to apply the ToolTip property on the table field instead of the page field. When a page field has a ToolTip but the underlying table field does not, the ToolTip is duplicated across every page that uses the field, leading to maintenance overhead and inconsistency.&lt;/p&gt;
&lt;p&gt;Defining the ToolTip on the table field ensures that all pages using the field automatically inherit the same ToolTip, promoting consistency and reducing duplication.&lt;/p&gt;</description></item><item><title>Duplicate ToolTip between page and table field (AC0029)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0029/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0029/</guid><description>&lt;p&gt;When both a page field and its underlying table field define the same ToolTip value, the page field&amp;rsquo;s ToolTip is redundant and should be removed. The ToolTip defined on the table field will automatically be inherited by all pages using the field.&lt;/p&gt;
&lt;p&gt;Removing duplicate ToolTips reduces maintenance overhead and ensures consistency across all pages that use the field.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following page field and table field have identical ToolTips:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyTable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fields&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;field&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; MyField; &lt;span style="color:#66d9ef"&gt;Integer&lt;/span&gt;&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ToolTip = &lt;span style="color:#e6db74"&gt;&amp;#39;Specifies the value.&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;page&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50100&lt;/span&gt; MyPage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SourceTable = MyTable;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;layout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;area&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;Content&lt;span style="color:#f92672"&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt; &lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;field&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;MyField; Rec&lt;span style="color:#f92672"&gt;.&lt;/span&gt;MyField&lt;span style="color:#f92672"&gt;) &lt;/span&gt;&lt;span style="color:#75715e"&gt;// The ToolTip property of page field &amp;#39;MyField&amp;#39; and its table field &amp;#39;MyField&amp;#39; have the same value and therefore the page field&amp;#39;s ToolTip can be removed. [AC0029]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ToolTip = &lt;span style="color:#e6db74"&gt;&amp;#39;Specifies the value.&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To fix this, remove the ToolTip from the page field:&lt;/p&gt;</description></item><item><title>Use return value for better error handling (AC0030)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0030/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0030/</guid><description>&lt;p&gt;Database read methods, like Record.Get(), returns a boolean indicating whether the record was successfully retrieved. Failing to use this return value can lead to uncaught errors, poor error handling, and a lack of actionable feedback for users when something goes wrong.&lt;/p&gt;
&lt;p&gt;By checking the return value, you can provide meaningful error messages, implement fallback logic, or prevent downstream code from executing with invalid data.&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The following code discards the return value of a database read method:&lt;/p&gt;</description></item><item><title>Informs the user that there are missing permission to access tabledata (AC0031)</title><link>https://alcops.dev/docs/analyzers/applicationcop/ac0031/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://alcops.dev/docs/analyzers/applicationcop/ac0031/</guid><description>&lt;p&gt;Whenever the code performs data access, the containing object should include the Permissions property to allow the user to run the code with indirect permissions.&lt;/p&gt;
&lt;p&gt;This is especially important when the table access is restricted to indirect access trough the users license. For example indirect write on ledger entry tables, or indirect read on the table Sent Emails&lt;/p&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;For procedure calls the following statements will raise this info:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-al" data-lang="al"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Insert
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Insert&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Modify
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Modify&lt;/span&gt;&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Rename&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Read
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Find&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FindFirst&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FindLast&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;FindSet&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;IsEmpty&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Delete
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Delete&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MyTable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DeleteAll&lt;span style="color:#f92672"&gt;()&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On Reports and Queries each dataitem as to have read permissions&lt;/p&gt;</description></item></channel></rss>