Domain 3 β€” Module 4 of 5 80%
9 of 28 overall
Domain 3: Design and Develop AOT Elements Free ⏱ ~16 min read

Forms, Menus, and UI Patterns

Build user interfaces in D365 F&O β€” form creation, form patterns (Details Master, Simple List, Workspace), form controls, data sources, menus, menu items (Display/Output/Action), and the label system for localisation.

Forms are how users see your data

Every table, view, and entity you’ve built so far is invisible to users until you create a form. Forms are the AOT objects that render the browser-based UI in D365 Finance & Operations.

Simple explanation

Think of a restaurant menu and ordering system.

The kitchen (database) has all the ingredients (data). But customers don’t walk into the kitchen β€” they sit at a table and use a menu (the form) to see what’s available, make choices, and place orders. The waiter (form data source) carries requests back and forth between the customer and the kitchen.

The restaurant also follows a layout standard β€” every menu has starters at the top, mains in the middle, desserts at the bottom. This is a form pattern. It means customers always know where to look, no matter which restaurant they visit.

D365 F&O forms work the same way. They follow standard patterns (Detail Master, Simple List, Workspace) so that every screen in the system feels consistent. Users learn one layout, and it works everywhere.

Form patterns

Form patterns are mandatory layout templates. When you create a form, you apply a pattern, and Visual Studio validates that your form structure matches the pattern’s requirements.

Major form patterns

Choose the pattern that matches your scenario β€” the platform validates compliance
PatternUse CaseStructure
Details MasterViewing/editing a single record with full detailNavigation list (left) + detail view (right) with header and tab-based FastTabs
Details TransactionHeader-line transactions (sales orders, purchase orders)Header fields at top + line grid below with line details
Simple ListFlat list of records (setup tables, reference data)Grid with inline editing, no separate detail view
Simple List and DetailsList with a detail paneGrid on left + detail fields on right/below
List PageBrowse and filter records before opening detailsFull-width grid with filter pane, preview pane, FactBoxes
WorkspaceRole-based dashboards with tiles, lists, and linksTiles + tabbed lists + links + charts β€” configurable by user
DialogModal input forms (confirmations, parameters)Simple field layout with OK/Cancel buttons
Drop DialogQuick input that drops down from a buttonMinimal fields, compact layout, no modal overlay
LookupLookup popup from a fieldGrid showing lookup results with search

Sub-patterns

Sub-patterns apply to sections within a form, not the whole form:

  • Fields and Field Groups β€” standard field layout within a group
  • Toolbar and List β€” action buttons above a grid
  • Tabular Fields β€” multi-column field layout
  • Filters and Toolbar β€” filter fields + action buttons above content
  • Section Tiles β€” tile layout for workspace sections
Exam tip: pattern compliance

Visual Studio shows a pattern indicator on each form node. Green = compliant, yellow = missing optional elements, red = required elements missing.

The exam may ask: β€œA developer creates a form but sees red pattern violations. What should they check?” Answer: the form’s control hierarchy doesn’t match the pattern’s required structure β€” missing an ActionPane, wrong group nesting, or controls in the wrong order.

Question

What form pattern would you use for a sales order form that shows a header and order lines?

Click or press Enter to reveal answer

Answer

Details Transaction. This pattern is designed for header-line documents β€” it shows header fields at the top, a line grid below, and line details beneath or beside the grid. Examples: SalesTable form, PurchTable form.

Click to flip back

Form data sources

A form’s data sources connect it to tables, views, or queries.

Key data source properties

PropertyPurposeCommon Values
TableWhich table/view to bindAny AOT table or view
IndexWhich index to use for initial sortTypically the primary index
AllowEditWhether users can edit recordsYes / No
AllowCreateWhether the New button worksYes / No
AllowDeleteWhether the Delete button worksYes / No
InsertIfEmptyAuto-create a blank record if the data source is emptyYes (for parameter forms) / No
JoinSourceParent data source for master-detailReferences another data source on the same form
LinkTypeHow child data source relates to parentActive (filter by selected parent), Delayed, InnerJoin, OuterJoin, ExistJoin

Linking data sources (master-detail)

// Form: AxionInspectionDetails
// Data Sources:
//   AxionInspectionTable (primary β€” the header)
//     JoinSource: (none β€” root data source)
//   AxionInspectionLine (child β€” the lines)
//     JoinSource: AxionInspectionTable
//     LinkType: Active
//     (relation: InspectionId == InspectionId β€” auto-resolved from table relation)

When the user selects an inspection header, the lines data source automatically filters to show only that inspection’s lines. This is Active linking β€” the child refreshes whenever the parent selection changes.

Scenario: Sophie's form data source confusion

Sophie Chen at Ferris Industries creates a form with two data sources β€” Products and ProductVariants. She sets the JoinSource but forgets to set the LinkType. The form shows ALL variants regardless of which product is selected.

Mentor Carl explains: β€œWithout LinkType = Active, the child data source doesn’t know to filter when the parent selection changes. Set LinkType to Active for master-detail relationships where the child should refresh on parent selection.”

Form controls

Controls are the visual elements on a form β€” buttons, fields, grids, tabs.

Common control types

ControlPurposeExample
StringEditText input fieldCustomer name, description
IntEdit / RealEditNumber inputQuantity, amount
DateEditDate pickerOrder date, due date
ComboBoxDropdown (bound to enum)Status, type
CheckBoxBoolean toggleActive, approved
GridTabular data displayOrder lines, item list
ActionPaneRibbon-style toolbarNew, Delete, Post, Print buttons
FastTab (Tab)Collapsible sectionsGeneral, Financial, Delivery tabs
FormPartEmbedded FactBox or sub-formRelated records, quick info
MenuButtonDropdown menu on action paneFunctions menu, Inquiries menu

Binding controls to data

Controls bind to data source fields automatically when you drag a field from the data source onto the design. The control type is determined by the field’s EDT:

  • str β†’ StringEdit
  • int β†’ IntEdit
  • TransDate β†’ DateEdit
  • Enum β†’ ComboBox
Question

What determines the default control type when you drag a field onto a form design?

Click or press Enter to reveal answer

Answer

The field's Extended Data Type (EDT) or base type. A string EDT creates a StringEdit, a date EDT creates a DateEdit, an enum creates a ComboBox. You can override the control type, but the default comes from the EDT.

Click to flip back

Users don’t open forms directly β€” they click menu items. A menu item is a pointer that opens a form, runs a report, or triggers an action.

Three types of menu items

Display = open a form, Output = run a report, Action = execute a process
TypeIconWhat It OpensExamples
DisplayπŸ“‹A form for viewing/editing dataAll Customers, Sales Orders, Inspection List
OutputπŸ–¨οΈA report (SSRS) or outputInvoice print, Packing slip report
Action⚑Runs a class (batch job, process)Post invoice, Recalculate prices, Close period
PropertyPurpose
ObjectThe form, report, or class this menu item opens
ObjectTypeForm, Class, or SSRSReport
LabelWhat the user sees (should use a label reference)
NormalImageIcon displayed in menus and tiles
SecurityKeySecurity privilege required to access this menu item
RunOnWhere the code executes β€” Client, Server, or CalledFrom
Exam tip: menu item security

Menu items are the entry points for the D365 security model. Privileges grant access to menu items, roles contain privileges.

Exam pattern: β€œUsers in the Quality Inspector role cannot see the Inspection List form.” The fix is to check that the role includes a privilege that grants access to the AxionInspectionList Display menu item. Security is based on menu items, not forms.

Menus organise menu items into the navigation structure:

  • Main Menu β†’ appears in the module navigation
  • Submenus β†’ group related items
  • Menu Item References β†’ pointers to Display/Output/Action menu items
// Menu: AxionQualityModule
//   Submenu: Inspections
//     Display Menu Item: AxionInspectionList
//     Display Menu Item: AxionInspectionDetails
//   Submenu: Setup
//     Display Menu Item: AxionInspectionTypes
//     Display Menu Item: AxionInspectionParameters
//   Submenu: Reports
//     Output Menu Item: AxionInspectionReport
//   Submenu: Periodic
//     Action Menu Item: AxionCloseInspectionPeriod
Question

What are the three types of menu items in D365 F&O?

Click or press Enter to reveal answer

Answer

1. Display β€” opens a form for viewing/editing data. 2. Output β€” runs a report (SSRS). 3. Action β€” executes a class (batch job, process). Menu items are also the entry points for the security model β€” privileges are granted on menu items.

Click to flip back

Labels: the localisation system

Labels are the way D365 F&O handles multi-language text. Instead of hardcoding strings like β€œCustomer” or β€œSave,” you create a label and reference it everywhere.

Label syntax

// Label file: @AxionLabels
// Label ID: @AxionLabels:InspectionId
// English (en-us): "Inspection ID"
// German (de): "PrΓΌfungs-ID"
// French (fr): "ID d'inspection"

// Usage in AOT:
// EDT Label property: @AxionLabels:InspectionId
// Menu Item Label: @AxionLabels:InspectionList

// Usage in X++ code:
info("@AxionLabels:InspectionId");
// At runtime, displays in the user's language

Label best practices

DoDon’t
βœ… Create a label file per model❌ Reuse Microsoft’s @SYS labels for custom text
βœ… Use descriptive label IDs❌ Use label IDs like @AxionLabels:Label001
βœ… One label per unique concept❌ Create duplicate labels for the same text
βœ… Use %1, %2 for dynamic values❌ Concatenate strings with labels
βœ… Translate all labels before go-live❌ Leave labels in developer language only

The @SYS prefix

Microsoft’s standard labels use the @SYS prefix β€” for example, @SYS14352 means β€œDescription” in every language. You can reference @SYS labels in your objects, but never modify them.

Exam tip: labels are exam-relevant

The MB-500 exam explicitly tests label knowledge:

  • Every user-visible string must use a label β€” never hardcode text
  • Labels are stored in .label files per language in your model
  • @SYS labels are Microsoft’s β€” reference them but don’t modify
  • Label search: In Visual Studio, use the Label Editor to find existing labels before creating new ones
  • String parameters: Use strFmt("@AxionLabels:InspectionCount", numInspections) with %1 placeholders β€” never concatenate translated strings

If a question asks β€œhow to display a form title in the user’s language,” the answer always involves labels.

Question

Why should you never concatenate strings with labels for localisation?

Click or press Enter to reveal answer

Answer

Because word order differs between languages. 'Inspection count: 5' in English might be '5 inspections' in Japanese. Using strFmt('@Label:InspCount', 5) with a '%1' placeholder lets each translation put the number in the correct position for that language.

Click to flip back

Putting it together: form development checklist

When Vik builds a new form at Axion, he follows this flow:

  1. Choose the pattern β€” Details Master, Simple List, etc.
  2. Add data sources β€” primary table, set JoinSource and LinkType for children
  3. Apply the pattern β€” right-click form Design β†’ Apply Pattern
  4. Build the layout β€” add ActionPane, groups, tabs per pattern requirements
  5. Drag fields β€” from data source, let EDT determine control type
  6. Create menu items β€” Display for the form, Action for any process buttons
  7. Add to a menu β€” so users can navigate to the form
  8. Label everything β€” use existing @SYS or create @Axion labels
  9. Set security β€” configure privileges on the menu items
  10. Test pattern compliance β€” green indicator = ready
Scenario: Elena's workspace form

Elena Vasquez at PacificForge Manufacturing builds a Quality Manager workspace. CTO Gregor wants: a tile showing overdue inspections, a list of today’s inspections, and quick links to setup forms.

Elena applies the Workspace pattern:

  • Section Tiles: Overdue Inspection Count (tile with a query counting overdue records)
  • Section Tabbed List: Today’s Inspections (form part showing a filtered list)
  • Section Related Links: Setup links (menu item references to parameter and setup forms)

The workspace pattern handles responsive layout automatically β€” tiles wrap on smaller screens, lists stack vertically.

Knowledge Check

Vik needs to create a form for viewing and editing individual inspection records. The form should show a list of inspections on the left and full details (with multiple FastTabs) on the right. Which form pattern should he apply?

Knowledge Check

Sophie creates a form with two data sources β€” InspectionHeader and InspectionLines. She sets InspectionLines.JoinSource to InspectionHeader but when she selects different headers, the lines grid always shows all lines from all inspections. What did she miss?

Knowledge Check

Nikhil hardcodes the string 'Inspection saved successfully' in an info() call in his X++ code. A German-speaking user reports that the message still appears in English. What should Nikhil have done instead?

Knowledge Check

A security administrator reports that users in the 'Quality Inspector' role can't access the Inspection List form. The form exists and works for admins. Where should the developer check first?


Next up: Classes, Events, and Extensions β€” create X++ classes, extend standard behaviour with event handlers, and use attributes for metadata.