mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-08-07 09:56:52 +01:00
Add CMFRT best practices and anti-patterns documentation for various coding standards
This commit is contained in:
parent
cfcf16a00e
commit
906ddcfd72
21 changed files with 427 additions and 5 deletions
33
custom/knowledge/naming/cmfrt-caption-prefix.bad.al
Normal file
33
custom/knowledge/naming/cmfrt-caption-prefix.bad.al
Normal 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
|
||||
}
|
||||
32
custom/knowledge/naming/cmfrt-caption-prefix.good.al
Normal file
32
custom/knowledge/naming/cmfrt-caption-prefix.good.al
Normal 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'; }
|
||||
}
|
||||
26
custom/knowledge/naming/cmfrt-caption-prefix.md
Normal file
26
custom/knowledge/naming/cmfrt-caption-prefix.md
Normal 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`.
|
||||
|
|
@ -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`.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue