Add CMFRT best practices and anti-patterns documentation for various coding standards

This commit is contained in:
BeytullahCengiz88 2026-07-05 20:10:55 +02:00
parent cfcf16a00e
commit 906ddcfd72
21 changed files with 427 additions and 5 deletions

View file

@ -0,0 +1,33 @@
table 55008 "CMFRT AQ Setup"
{
fields
{
field(55011; "CMFRT AQ FS Jnl. Template Name"; Code[10])
{
Caption = 'FS Journal Template Name'; // missing CMFRT AQ prefix
DataClassification = CustomerContent;
}
}
}
page 55020 "CMFRT AQ Setup"
{
layout
{
area(Content)
{
field("CMFRT AQ FS Jnl. Template Name"; Rec."CMFRT AQ FS Jnl. Template Name")
{
ApplicationArea = All;
// Page-level overrides duplicate the table definition and drift apart.
Caption = 'FS Journal Template Name';
ToolTip = 'Specifies the Job Journal Template used for material lines created by the Field Service API.';
}
}
}
}
enum 55040 "CMFRT AQ Buffer Status"
{
value(55000; "CMFRT AQ Pending") { Caption = 'Pending'; } // missing prefix
}

View file

@ -0,0 +1,32 @@
table 55008 "CMFRT AQ Setup"
{
fields
{
field(55011; "CMFRT AQ FS Jnl. Template Name"; Code[10])
{
Caption = 'CMFRT AQ FS Journal Template Name';
ToolTip = 'Specifies the Job Journal Template used for material lines created by the Field Service API.';
DataClassification = CustomerContent;
}
}
}
page 55020 "CMFRT AQ Setup"
{
layout
{
area(Content)
{
field("CMFRT AQ FS Jnl. Template Name"; Rec."CMFRT AQ FS Jnl. Template Name")
{
ApplicationArea = All; // Caption and ToolTip inherited from the table field
}
}
}
}
enum 55040 "CMFRT AQ Buffer Status"
{
value(55000; "CMFRT AQ Pending") { Caption = 'CMFRT AQ Pending'; }
value(55001; "CMFRT AQ Processed") { Caption = 'CMFRT AQ Processed'; }
}

View file

@ -0,0 +1,26 @@
---
bc-version: [all]
domain: naming
keywords: [caption, prefix, enum-value, field-caption, tooltip, table-level, page-override, translation]
technologies: [al]
countries: [w1]
application-area: [all]
---
# CMFRT caption prefix and table-level captions
## Description
Captions in a CMFRT extension follow the same prefix rule as names: every field caption and every enum value caption carries the `CMFRT <ABBR>` prefix — for example `Caption = 'CMFRT AQ FS Journal Template Name'` on a field and `Caption = 'CMFRT AQ Pending'` on an enum value. Captions and tooltips are defined once, on the table field (or enum value), never overridden on pages. Pages inherit the table-level `Caption` and `ToolTip`, so the text is maintained in one place and every page showing the field stays consistent.
## Best Practice
Set `Caption` with the full `CMFRT <ABBR>` prefix and `ToolTip` on the table field definition. On pages, declare only `ApplicationArea` for the field — no `Caption`, no `ToolTip`. Give every enum value a prefixed caption matching its prefixed value name.
See sample: `cmfrt-caption-prefix.good.al`.
## Anti Pattern
An unprefixed caption (`Caption = 'Pending'`, `Caption = 'FS Journal Template Name'`), or a page field that repeats or overrides the table-level `Caption`/`ToolTip`. Unprefixed captions are indistinguishable from base-application text for users and translators, and duplicated page-level text drifts from the table definition the first time either copy is edited.
See sample: `cmfrt-caption-prefix.bad.al`.

View file

@ -1,7 +1,7 @@
---
bc-version: [all]
domain: naming
keywords: [object-id, id-range, numbering, product-extension, customer-extension, range]
keywords: [object-id, id-range, numbering, product-extension, customer-extension, range, field-id, enum-value-id]
technologies: [al]
countries: [w1]
application-area: [all]
@ -11,7 +11,7 @@ application-area: [all]
## Description
CMFRT object IDs are partitioned into two non-overlapping numeric ranges by deployment scope. Product extensions — features delivered to all customers under the CMFRT product — use IDs from `2045081` to `2046580`. Customer-specific extensions — functionality tailored to a single customer deployment — use IDs from `55000` to `55999`. Always pick the next free ID in the correct range. A removed object's ID must never be recycled; the platform retains historical references to deleted object IDs and recycling causes silent conflicts with upgrade and telemetry systems.
CMFRT object IDs are partitioned into two non-overlapping numeric ranges by deployment scope. Product extensions — features delivered to all customers under the CMFRT product — use IDs from `2045081` to `2046580`. Customer-specific extensions — functionality tailored to a single customer deployment — use IDs from `55000` to `55999`. The range applies to member IDs as well as object IDs: table fields and enum values declared by the extension take IDs from the same licensed range (for example `field(55011; ...)`, `value(55000; ...)`), even on tables the extension owns. Always pick the next free ID in the correct range. A removed object's ID must never be recycled; the platform retains historical references to deleted object IDs and recycling causes silent conflicts with upgrade and telemetry systems.
## Best Practice
@ -21,6 +21,6 @@ See sample: `cmfrt-object-id-ranges.good.al`.
## Anti Pattern
Assigning an ID outside both ranges, choosing a round-number ID that has no relation to the next free slot, or reusing an ID from a previously removed object. ID conflicts between extensions produce runtime application errors that are difficult to reproduce and trace, because the conflict may only manifest when both extensions are installed in the same environment.
Assigning an ID outside both ranges, choosing a round-number ID that has no relation to the next free slot, reusing an ID from a previously removed object, or numbering table fields or enum values outside the licensed range (for example `field(10; ...)` on a customer-range table). ID conflicts between extensions produce runtime application errors that are difficult to reproduce and trace, because the conflict may only manifest when both extensions are installed in the same environment.
See sample: `cmfrt-object-id-ranges.bad.al`.