CentralGauge
LLM Benchmark Results for Microsoft Dynamics 365 Business Central AL Code
Report generated: February 14, 2026 at 8:13 PM
Benchmark data: Feb 8, 2026 – Feb 13, 2026
Model Rankings
Analytics
Compare pass rate and cost across models at a glance.
Performance vs Cost
Performance by Theme
How models perform across different AL code categories
Data Modeling
Tables, fields, enums, keys, FlowFields, CalcFormulas, and table extensions
User Interface
Pages, page extensions, reports, XMLports, and API pages
Business Logic
Codeunits, calculations, algorithms, and string manipulation
Interfaces & Events
Interface definitions, implementations, event publishers and subscribers
Data Exchange
JSON handling, HTTP integration, XMLport I/O, and external APIs
Error Handling & Safety
TryFunction, ErrorInfo, SecretText, permissions, and security attributes
Advanced AL Patterns
RecordRef, FieldRef, Queries, SingleInstance, Fluent API, and modern collections
Model Performance
anthropic/claude-opus-4-6
Known Shortcomings (6)
- reserved-keyword-as-parameter-name 1x
- cross-join-dataitem-link 1x
- incomplete-procedure-body 1x
- flowfield-calcfields-requirement 1x
- parse-failure 1x
anthropic/claude-opus-4-5-20251101@thinking=50000
Known Shortcomings (8)
- page-extension-with-table-extension 1x
- reserved-keyword-as-parameter-name 1x
- dictionary-iteration-syntax 1x
- empty-or-malformed-code-generation 1x
- temporary-table-parameter-handling 1x
openai/gpt-5.2-2025-12-11@thinking=high
Known Shortcomings (10)
- interface-definition-syntax 2x
- table-field-caption-property 1x
- query-object-syntax 1x
- query-crossjoin-syntax 1x
- parse-failure 1x
anthropic/claude-sonnet-4-5-20250929
Known Shortcomings (8)
- multiline-string-literals 1x
- query-filter-element-syntax 1x
- jsonobject-get-method-signature 1x
- cross-join-dataitem-link-constraints 1x
- reserved-keyword-as-variable-name 1x
openrouter/moonshotai/kimi-k2.5
Known Shortcomings (3)
- event-subscriber-parameter-syntax 1x
- page-extension-cardpageid-override 1x
- parse-failure 1x
gemini/gemini-3-pro-preview
Known Shortcomings (9)
- multiline-string-literals 1x
- inherent-permissions-syntax 1x
- query-crossjoin-column-datasource 1x
- complete-codeunit-generation 1x
- yaml-parsing-string-manipulation 1x
openrouter/x-ai/grok-code-fast-1
Known Shortcomings (12)
- query-object-syntax 2x
- multiline-string-literals 1x
- page-extension-cardpageid-override 1x
- json-api-methods 1x
- recordref-fieldref-dynamic-manipulation 1x
openrouter/deepseek/deepseek-v3.2
Known Shortcomings (18)
- dictionary-clear-method 1x
- application-area-in-page-extension-field 1x
- multiline-string-literals 1x
- page-extension-cardpageid-override 1x
- errorinfo-custom-dimensions-api 1x
openrouter/qwen/qwen3-max-thinking
Known Shortcomings (12)
- option-field-optionmembers-required 2x
- enum-frominteger-syntax 1x
- list-iteration-pattern 1x
- variant-type-argument-and-interface-definition 1x
- json-object-api-methods 1x
openrouter/z-ai/glm-5
Known Shortcomings (17)
- list-dictionary-of-interface-clear-method 1x
- event-subscriber-event-name 1x
- al-string-literal-escaping 1x
- query-object-syntax 1x
- fluent-api-return-self-codeunit 1x
openrouter/minimax/minimax-m2.5
Known Shortcomings (18)
- interface-definition-syntax 2x
- text-char-conversion-copystr 1x
- page-object-definition 1x
- event-subscriber-attribute-syntax 1x
- page-extension-and-table-extension-generation 1x
openrouter/qwen/qwen3-coder-next
Known Shortcomings (19)
- codeunit-generation-empty-output 5x
- interface-definition-syntax 3x
- query-object-syntax 2x
- initvalue-vs-defaultvalue 1x
- text-trim-method-unavailable 1x
Task Results Matrix
N/M = passed N of M runs (hover for details)
| Task | Description | Claude Opus 4.6 | Claude Opus 4.5 (50K) | GPT-5.2 | Claude Sonnet 4.5 | Kimi K2.5 | Gemini 3 Pro | Grok Code Fast 1 | Deepseek V3.2 | Qwen3 Max Thinking | Glm 5 | Minimax M2.5 | Qwen3 Coder Next |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CG-AL-E001 | Create a simple AL table called "Product Category" with ID 70000. The table should have the following fields: - Code (Code[20], primary key) - Description (Text[100]) - Active (Boolean, default true) - Created Date (Date) | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 | 0/3 |
| CG-AL-E002 | Create a simple AL card page called "Product Category Card" with ID 70001. The page should be based on the existing "Product Category" table (ID 69001) and display the following fields: - Code - Description - Active - Created Date | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 1/3 | 3/3 |
| CG-AL-E003 | Create a simple AL enum called "Priority Level" with ID 70000. The enum should have the following values: - Low (value 0) - Medium (value 1) - High (value 2) - Critical (value 3) | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 | 3/3 |
| CG-AL-E004 | Create a table extension called "Item Extension" with ID 70000 that extends the standard Item table. Add the following new fields: - Warranty Period (Integer, representing months) - Supplier Rating (Option with values: Not Rated, Bronze, Silver, Gold, Platinum) - Last Maintenance Date (Date) - Special Instructions (Text[250]) | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 |
| CG-AL-E005 | Create a simple AL codeunit called "Text Utilities" with ID 70000. The codeunit should have the following public procedures: - CapitalizeFirstLetter(InputText: Text): Text - capitalizes the first letter of input text - CountWords(InputText: Text): Integer - counts the number of words in the input text - IsValidEmail(EmailAddress: Text): Boolean - basic validation to check if text contains @ and . | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 | 3/3 | 1/3 | 3/3 | 0/3 | 2/3 |
| CG-AL-E006 | Create a page extension called "Customer Card Extension" with ID 70000 that extends the Customer Card page (page 21). Add the following controls to the General group: - Preferred Contact Method (Option field with values: Email, Phone, Mail, SMS) - Customer Notes (Text field for internal notes) - VIP Customer (Boolean field to mark important customers) | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 0/3 | 2/3 | 3/3 | 1/3 | 0/3 |
| CG-AL-E007 | Create a simple AL report called "Customer List Report" with ID 70000. The report should use the Customer table as its data source and display: - Customer No. (column name: No_Customer, source: "No.") - Customer Name (column name: Name_Customer, source: Name) - City (column name: City_Customer, source: City) - Phone No. (column name: PhoneNo_Customer, source: "Phone No.") | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-E008 | Create a simple AL interface called "Payment Processor" with ID 70000. The interface should define the following procedures: - ProcessPayment(Amount: Decimal; PaymentMethod: Text): Boolean - ValidatePayment(PaymentData: Text): Boolean - GetTransactionFee(Amount: Decimal): Decimal | 3/3 | 3/3 | 2/3 | 3/3 | 2/3 | 3/3 | 1/3 | 1/3 | 3/3 | 1/3 | 0/3 | 0/3 |
| CG-AL-E009 | Create a simple AL XMLport called "Item Export" with ID 70000. The XMLport should export Item data with the following structure: - Root element: Items - Item element containing: No, Description, Unit Price, Inventory | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-E010 | Create a simple AL codeunit called "Item Event Subscriber" with ID 70001 that subscribes to Item table events. Create an event subscriber procedure that: - Subscribes to the OnAfterInsert event of the Item table - Displays a message when a new item is created - Includes proper EventSubscriber attributes | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 0/3 | 3/3 | 3/3 | 1/3 | 0/3 | 3/3 |
| CG-AL-E031 | Create a table called "CG Subscription Plan" with ID 70031. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-E032 | Create an interface called "CG Token Provider". | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 0/3 |
| CG-AL-E045 | Create a table called "Vehicle Log" with ID 70045. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 0/3 | 3/3 | 2/3 |
| CG-AL-E050 | Create an AL codeunit named "CG Text Builder" with ID 70050 that uses multiline string literals. | 3/3 | 1/3 | 2/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-E051 | Create an AL codeunit named "CG Number Sequence" with ID 70051 that increments string values with numeric portions. | 3/3 | 3/3 | 3/3 | 2/3 | 0/3 | 2/3 | 2/3 | 0/3 | 0/3 | 1/3 | 0/3 | 0/3 |
| CG-AL-E052 | Create an AL codeunit named "CG Type Converter" with ID 70052 for converting simple types to text. | 3/3 | 3/3 | 3/3 | 3/3 | 0/3 | 0/3 | 3/3 | 1/3 | 3/3 | 1/3 | 2/3 | 3/3 |
| CG-AL-E053 | Create a page extension named "CG Item List Extension" with ID 70053 that extends the "Item List" page (Page 31). | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 0/3 | 3/3 | 3/3 | 1/3 | 3/3 |
| CG-AL-H001 | Create a codeunit called "Tax Calculator" with ID 70100. The codeunit should implement international tax calculation with the following procedure: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 |
| CG-AL-H002 | Create two tables to demonstrate FlowField with CalcFormula: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-H003 | Create a codeunit called "CG Temp Table Processor" with ID 70202 that demonstrates correct temporary table handling. | 3/3 | 3/3 | 0/3 | 0/3 | 2/3 | 3/3 | 0/3 | 0/3 | 0/3 | 3/3 | 0/3 | 0/3 |
| CG-AL-H004 | Create an enum and codeunit that demonstrate correct enum ordinal handling. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-H005 | Create a table and codeunit that test understanding of Rec vs xRec and Modify behavior. | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H006 | Create a SingleInstance codeunit that maintains state across calls within the same session. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-H007 | Create a codeunit that demonstrates modern AL error handling with ErrorInfo. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 0/3 | 2/3 | 2/3 | 0/3 |
| CG-AL-H008 | Create a codeunit demonstrating TryFunction pattern for safe execution. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-H009 | Create a codeunit that implements proper BC currency rounding patterns. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 |
| CG-AL-H010 | Create a codeunit with IntegrationEvent publishers and demonstrate proper event patterns. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 |
| CG-AL-H011 | Create an AL query object named "CG Sales Summary" with ID 70011 that: | 0/3 | 3/3 | 1/3 | 1/3 | 0/3 | 3/3 | 0/3 | 3/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H013 | Create an AL codeunit named "CG Loop Utilities" with ID 70013 that demonstrates the continue keyword: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| CG-AL-H014 | Create an AL codeunit named "CG JSON Parser" with ID 70014 that uses the typed JSON getter methods: | 3/3 | 3/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H015 | 1. Define an Interface named "Payment Gateway". | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 2/3 | 2/3 | 2/3 | 0/3 |
| CG-AL-H016 | Create an AL codeunit named "CG Secure Storage" with ID 70016 that demonstrates SecretText handling: | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H017 | Create an AL query object named "CG Dimension Matrix" with ID 70017 that: | 3/3 | 3/3 | 0/3 | 0/3 | 0/3 | 1/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H018 | Create an AL codeunit named "CG Request Builder" with ID 70018 implementing a fluent API pattern: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 0/3 | 0/3 | 2/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H019 | Create an AL codeunit named "CG Internal Service" with ID 70019 demonstrating security attributes: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 0/3 | 2/3 | 2/3 | 3/3 | 3/3 | 0/3 | 3/3 |
| CG-AL-H020 | Create an AL codeunit named "CG Collection Processor" with ID 70020 demonstrating List and Dictionary types: | 3/3 | 0/3 | 3/3 | 0/3 | 0/3 | 1/3 | 1/3 | 2/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H021 | Create AL objects demonstrating Lists and Dictionaries of interfaces (available in BC 2025 Wave 1). | 0/3 | 0/3 | 0/3 | 0/3 | 1/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H022 | Create a codeunit named "CG Dynamic Record Handler" with ID 70224 that demonstrates advanced RecordRef and FieldRef usage for dynamic record manipulation. | 3/3 | 3/3 | 2/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 1/3 | 0/3 |
| CG-AL-H023 | Create a codeunit named "CG Record Introspector" with ID 70226 for dynamic record manipulation and introspection using RecordRef and FieldRef. | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-H205 | Create a codeunit called "CG Line Amount Engine" with ID 70205. The codeunit must have Access = Public. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 | 3/3 | 0/3 |
| CG-AL-M001 | Create a comprehensive API page called "Product API" with ID 70100 that provides full CRUD operations for a Product table. The API should: - Support GET, POST, PATCH, DELETE operations - Include proper error handling and validation - Have fields: id (SystemId), productCode, description, unitPrice, stockQuantity, categoryId - Include proper OData annotations and API versioning (v1.0) - Add business logic validation (price must be positive, stock must be non-negative) - Include proper captions, publisher info (mycompany), and API group (products) | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M002 | Create a comprehensive business logic codeunit called "Sales Order Calculator" with ID 70001. The codeunit should implement sales calculations including: - CalculateLineTotal(Quantity: Decimal; UnitPrice: Decimal): Decimal - basic calculation - CalculateLineTotal(Quantity: Decimal; UnitPrice: Decimal; DiscountPercent: Decimal): Decimal - with discount - CalculateOrderTotal(LineTotals: List of [Decimal]): Decimal - sum all line totals from list - ApplyVolumeDiscount(OrderTotal: Decimal): Decimal - apply tiered discounts: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 0/3 | 0/3 | 3/3 | 3/3 | 2/3 |
| CG-AL-M003 | Create a complex table called "Sales Contract" with ID 70002 that includes comprehensive validation. Fields should include: - Contract No. (Code[20], primary key, auto-generated) - Customer No. (Code[20], with TableRelation to Customer) - Start Date and End Date (Date fields with validation) - Contract Value (Decimal with minimum value validation) - Status (Option: Draft, Active, Suspended, Terminated, Closed) - Payment Terms (Code[10] with TableRelation) | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M004 | Create an interactive page called "Sales Order Workspace" with ID 70101 that provides comprehensive order management. The page should be PageType Card, based on Sales Header table (filtered to Document Type::Order), and include: | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 0/3 | 3/3 | 2/3 | 3/3 | 0/3 | 2/3 | 0/3 |
| CG-AL-M005 | Create an integration codeunit called "External Payment Service" with ID 70002 that handles external API communication. The codeunit should implement the following procedures: | 2/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M006 | Create an advanced table extension called "Advanced Customer Extension" with ID 70001 that extends the Customer table. | 3/3 | 3/3 | 0/3 | 3/3 | 1/3 | 0/3 | 0/3 | 2/3 | 0/3 | 0/3 | 2/3 | 0/3 |
| CG-AL-M007 | Create a complex report called "Sales Performance Analysis" with ID 70001 that performs advanced data processing. | 0/3 | 0/3 | 1/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M008 | Create a workflow implementation codeunit called "Purchase Approval Workflow" with ID 70003. | 0/3 | 0/3 | 0/3 | 1/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M009 | Create a comprehensive interface implementation for a shipping service. | 0/3 | 2/3 | 1/3 | 3/3 | 1/3 | 3/3 | 0/3 | 0/3 | 0/3 | 1/3 | 0/3 | 0/3 |
| CG-AL-M010 | Create a complete multi-object scenario for a "Project Management" system with related objects: | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M020 | Create an AL codeunit named "CG JSON Value Extractor" with ID 70120. | 3/3 | 3/3 | 0/3 | 0/3 | 2/3 | 1/3 | 2/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M021 | Create an AL codeunit named "CG YAML Handler" with ID 70121 that handles reading and writing YAML. | 3/3 | 3/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |
| CG-AL-M022 | Create a codeunit named "CG Weather Service" with ID 70122 that makes HTTP calls to an external weather API. This tests whether the LLM can properly implement HttpClient usage. | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 | 0/3 | 3/3 | 0/3 | 2/3 | 0/3 | 0/3 |
| CG-AL-M023 | Create a codeunit named "CG Partial Record Loader" with ID 70123 that demonstrates the SetLoadFields method for optimized partial record loading. | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 | 3/3 | 3/3 | 3/3 | 1/3 | 3/3 |
| CG-AL-M088 | 1. Create an Enum with ID 70188 named "Subscription Plan". | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 1/3 |
| CG-AL-M112 | Create two tables: | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 | 0/3 |