CentralGauge
LLM Benchmark Results for Microsoft Dynamics 365 Business Central AL Code
Report generated: January 6, 2026
Model Rankings
Model Performance
anthropic/claude-opus-4-5-20251101
Pass Rate:66.1%
Avg Score:72.5%
First Pass:51.8%
Temperature:0.1
Thinking:-
Tokens:159,557
Cost:$2.77
Known Shortcomings (21)
- parse-failure 2x
- reserved-keyword-variable-name 1x
- message-in-event-subscriber 1x
- multiline-string-literal-syntax 1x
- isolated-storage-secrettext-overload 1x
+16 more View all 21
gemini/gemini-3-pro-preview
Pass Rate:60.7%
Avg Score:66.1%
First Pass:53.6%
Temperature:0.1
Thinking:-
Tokens:645,913
Cost:$0.50
Known Shortcomings (6)
- event-subscriber-syntax 1x
- json-value-extraction-methods 1x
- empty-or-malformed-output 1x
- variant-type-conversion 1x
- purchase-header-event-names 1x
+1 more View all 6
anthropic/claude-sonnet-4-5-20250929
Pass Rate:55.4%
Avg Score:61.4%
First Pass:42.9%
Temperature:0.1
Thinking:-
Tokens:161,423
Cost:$1.62
Known Shortcomings (25)
- parse-failure 3x
- query-count-column-syntax 1x
- jsonobject-get-method-signature 1x
- dataitem-link-cross-join-conflict 1x
- reserved-keyword-variable-name 1x
+20 more View all 25
openai/gpt-5.2-2025-12-11(guided)
Pass Rate:53.6%
Avg Score:59.0%
First Pass:35.7%
Temperature:0.1
Thinking:-
Tokens:149,235
Cost:$1.02
openai/gpt-5.2-2025-12-11
Pass Rate:51.8%
Avg Score:54.4%
First Pass:39.3%
Temperature:0.1
Thinking:-
Tokens:165,940
Cost:$1.19
Known Shortcomings (22)
- json-typed-getter-methods 4x
- table-field-property-context 2x
- query-crossjoin-syntax 2x
- report-syntax-structure 2x
- empty-or-missing-code-generation 2x
+17 more View all 22
openrouter/x-ai/grok-code-fast-1
Pass Rate:48.2%
Avg Score:52.5%
First Pass:35.7%
Temperature:0.1
Thinking:-
Tokens:239,839
Cost:$2.80
Known Shortcomings (11)
- interface-definition-syntax 2x
- json-value-extraction-methods 2x
- event-subscriber-xrec-parameter 1x
- table-definition-syntax 1x
- query-object-syntax 1x
+6 more View all 11
openrouter/deepseek/deepseek-v3.2
Pass Rate:42.9%
Avg Score:47.0%
First Pass:28.6%
Temperature:0.1
Thinking:-
Tokens:179,772
Cost:$1.99
Known Shortcomings (15)
- char-type-not-available 1x
- page-extension-field-properties 1x
- event-subscriber-attribute-syntax 1x
- errorinfo-customdimensions-api 1x
- json-asvalue-method-signature 1x
+10 more View all 15
anthropic/claude-haiku-4-5-20251001
Pass Rate:37.5%
Avg Score:43.9%
First Pass:28.6%
Temperature:0.1
Thinking:-
Tokens:182,321
Cost:$0.59
Known Shortcomings (18)
- event-subscriber-codeunit-subtype 1x
- evaluate-function-syntax 1x
- test-attribute-codeunit-subtype 1x
- pageextension-property-syntax 1x
- codeunit-enum-structure 1x
+13 more View all 18
openrouter/minimax/minimax-m2.1
Pass Rate:35.7%
Avg Score:40.6%
First Pass:28.6%
Temperature:0.1
Thinking:-
Tokens:232,181
Cost:$2.75
Task Results Matrix
P = Pass, F = Fail (hover for details)
| Task | Description | Opus 4.5 | Gemini 3 Pro | Sonnet 4.5 | gpt-5.2-2025 | GPT-5.2 | grok-code-fast | deepseek-v3.2 | Haiku 4.5 | minimax-m2.1 |
|---|---|---|---|---|---|---|---|---|---|---|
| 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) | P | P | P | P | P | P | P | P | P |
| 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 | P | P | P | P | P | P | P | P | P |
| 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) | P | P | P | P | P | P | P | P | P |
| 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]) | P | P | P | P | P | P | P | P | P |
| 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 . | P | P | P | P | P | P | F | P | P |
| 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) | P | P | P | P | P | P | F | P | F |
| 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.") | F | F | F | F | F | F | F | F | F |
| 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 | P | P | P | P | P | F | P | P | F |
| 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 | F | F | F | F | F | F | F | F | F |
| 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 - Updates a custom log or displays a message when a new item is created - Includes proper EventSubscriber attributes | F | F | F | F | P | F | F | F | F |
| CG-AL-E031 | Create a table called "CG Subscription Plan" with ID 70031. | F | F | F | F | F | F | F | F | F |
| CG-AL-E032 | Create an interface called "CG Token Provider". | P | P | P | P | P | P | P | P | P |
| CG-AL-E045 | Create a table called "Vehicle Log" with ID 70045. | P | P | P | P | P | P | P | P | P |
| CG-AL-E050 | Create an AL codeunit named "CG Text Builder" with ID 70050 that uses multiline string literals. | F | F | F | P | F | F | F | F | F |
| CG-AL-E051 | Create an AL codeunit named "CG Number Sequence" with ID 70051 that increments string values with numeric portions. | P | P | P | P | P | P | P | F | F |
| CG-AL-E052 | Create an AL codeunit named "CG Type Converter" with ID 70052 for converting simple types to text. | P | P | P | P | P | P | P | F | P |
| CG-AL-E053 | Create a page extension named "CG Item List Extension" with ID 70053 that extends the "Item List" page (Page 31). | P | P | P | P | P | P | F | F | P |
| CG-AL-H001 | Create a codeunit called "Tax Calculator" with ID 70100. The codeunit should implement international tax calculation with the following procedure: | P | P | P | P | P | P | P | P | P |
| CG-AL-H002 | Create two tables to demonstrate FlowField with CalcFormula: | F | F | F | F | F | F | F | F | F |
| CG-AL-H003 | Create a codeunit called "CG Temp Table Processor" with ID 70202 that demonstrates correct temporary table handling. | F | P | P | F | F | F | F | F | F |
| CG-AL-H004 | Create an enum and codeunit that demonstrate correct enum ordinal handling. | P | P | P | P | P | P | P | P | P |
| CG-AL-H005 | Create a table and codeunit that test understanding of Rec vs xRec and Modify behavior. | F | F | F | F | F | F | F | F | F |
| CG-AL-H006 | Create a SingleInstance codeunit that maintains state across calls within the same session. | P | P | P | P | P | P | P | P | P |
| CG-AL-H007 | Create a codeunit that demonstrates modern AL error handling with ErrorInfo. | P | P | P | P | P | P | F | F | F |
| CG-AL-H008 | Create a codeunit demonstrating TryFunction pattern for safe execution. | P | P | P | P | P | P | P | P | P |
| CG-AL-H009 | Create a codeunit that implements proper BC currency rounding patterns. | P | P | P | P | P | P | P | P | P |
| CG-AL-H010 | Create a codeunit with IntegrationEvent publishers and demonstrate proper event patterns. | P | P | P | P | P | P | P | P | P |
| CG-AL-H011 | Create an AL query object named "CG Sales Summary" with ID 70011 that: | P | P | F | F | P | F | P | F | F |
| CG-AL-H013 | Create an AL codeunit named "CG Loop Utilities" with ID 70013 that demonstrates the continue keyword: | P | P | P | P | P | P | P | P | P |
| CG-AL-H014 | Create an AL codeunit named "CG JSON Parser" with ID 70014 that uses the typed JSON getter methods: | P | F | F | F | F | F | F | F | F |
| CG-AL-H015 | 1. Define an Interface named "Payment Gateway". | P | P | P | P | P | P | P | F | F |
| CG-AL-H016 | Create an AL codeunit named "CG Secure Storage" with ID 70016 that demonstrates SecretText handling: | F | F | F | F | F | F | F | F | F |
| CG-AL-H017 | Create an AL query object named "CG Dimension Matrix" with ID 70017 that: | P | P | F | F | F | F | P | F | F |
| CG-AL-H018 | Create an AL codeunit named "CG Request Builder" with ID 70018 implementing a fluent API pattern: | P | P | P | F | F | P | F | F | F |
| CG-AL-H019 | Create an AL codeunit named "CG Internal Service" with ID 70019 demonstrating security attributes: | P | P | P | P | P | P | P | P | P |
| CG-AL-H020 | Create an AL codeunit named "CG Collection Processor" with ID 70020 demonstrating List and Dictionary types: | F | F | F | P | P | P | F | F | F |
| CG-AL-H021 | Create AL objects demonstrating Lists and Dictionaries of interfaces (available in BC 2025 Wave 1). | F | F | F | F | F | F | F | F | F |
| 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. | P | P | P | F | F | F | F | F | F |
| CG-AL-H023 | Create a codeunit named "CG Record Introspector" with ID 70226 for dynamic record manipulation and introspection using RecordRef and FieldRef. | P | F | F | F | F | F | F | F | F |
| CG-AL-H205 | Create a codeunit called "CG Line Amount Engine" with ID 70205. The codeunit must have Access = Public. | P | P | P | P | P | P | P | P | F |
| 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) | F | F | F | F | F | F | F | F | F |
| 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: | P | P | P | P | P | P | P | F | P |
| 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) | F | F | F | F | F | F | F | F | F |
| 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: | P | P | P | P | P | P | P | P | F |
| 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: | F | F | F | F | F | F | F | F | F |
| CG-AL-M006 | Create an advanced table extension called "Advanced Customer Extension" with ID 70001 that extends the Customer table. | F | F | F | F | F | F | F | F | F |
| CG-AL-M007 | Create a complex report called "Sales Performance Analysis" with ID 70001 that performs advanced data processing. | P | P | F | F | F | F | F | F | F |
| CG-AL-M008 | Create a workflow implementation codeunit called "Purchase Approval Workflow" with ID 70003. | P | F | F | F | F | F | F | F | F |
| CG-AL-M009 | Create a comprehensive interface implementation for a shipping service. | P | P | P | F | F | F | F | P | F |
| CG-AL-M010 | Create a complete multi-object scenario for a "Project Management" system with related objects: | F | F | F | F | F | F | F | F | F |
| CG-AL-M020 | Create an AL codeunit named "CG JSON Value Extractor" with ID 70120. | P | P | P | P | F | F | F | F | F |
| CG-AL-M021 | Create an AL codeunit named "CG YAML Handler" with ID 70121 that handles reading and writing YAML. | P | F | F | F | F | F | F | F | F |
| 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. | F | F | F | F | F | F | F | F | F |
| CG-AL-M023 | Create a codeunit named "CG Partial Record Loader" with ID 70123 that demonstrates the SetLoadFields method for optimized partial record loading. | F | F | F | P | F | F | F | F | P |
| CG-AL-M088 | 1. Create an Enum with ID 70188 named "Subscription Plan". | P | P | P | P | P | P | P | P | P |
| CG-AL-M112 | Create two tables: | F | F | F | F | F | F | F | F | F |