bc-code-intelligence-mcp
Version:
BC Code Intelligence MCP Server - Complete Specialist Bundle with AI-driven expert consultation, seamless handoffs, and context-preserving workflows
218 lines (193 loc) • 7.45 kB
Markdown
# AL Line Start Keyword Positioning - Code Examples
## Good Examples
### Proper Keyword Line Positioning
```al
procedure ProcessCustomerOrder(CustomerNo: Code[20])
var
Customer: Record Customer;
SalesHeader: Record "Sales Header";
OrderCreated: Boolean;
begin
// Each keyword starts at appropriate line position
if Customer.Get(CustomerNo) then
begin
if not Customer.Blocked then
begin
SalesHeader.Init();
SalesHeader."Sell-to Customer No." := CustomerNo;
if SalesHeader.Insert(true) then
begin
OrderCreated := true;
Message('Order created successfully');
end
else
begin
OrderCreated := false;
Error('Failed to create order');
end;
end
else
begin
Error('Customer %1 is blocked', CustomerNo);
end;
end
else
begin
Error('Customer %1 does not exist', CustomerNo);
end;
end;
```
### Control Flow Keyword Positioning
```al
procedure ValidateOrderData(var SalesHeader: Record "Sales Header"): Boolean
var
Customer: Record Customer;
ValidationPassed: Boolean;
begin
ValidationPassed := true;
// Proper if-then-else positioning
if SalesHeader."Sell-to Customer No." = '' then
begin
ValidationPassed := false;
Error('Customer number is required');
end;
// Proper case statement positioning
case SalesHeader."Document Type" of
SalesHeader."Document Type"::Quote:
begin
if SalesHeader."Quote Valid Until Date" = 0D then
begin
ValidationPassed := false;
Error('Quote validity date is required');
end;
end;
SalesHeader."Document Type"::Order:
begin
if SalesHeader."Requested Delivery Date" = 0D then
begin
ValidationPassed := false;
Error('Delivery date is required');
end;
end;
end;
// Proper while loop positioning
while Customer.Next() <> 0 do
begin
if Customer.Blocked then
begin
Customer.Blocked := false;
Customer.Modify();
end;
end;
exit(ValidationPassed);
end;
```
### Function Declaration Positioning
```al
codeunit 50100 "Order Management"
{
procedure CreateOrder(CustomerNo: Code[20]): Code[20]
var
SalesHeader: Record "Sales Header";
begin
// Implementation
exit(SalesHeader."No.");
end;
procedure UpdateOrder(OrderNo: Code[20]; NewDate: Date)
var
SalesHeader: Record "Sales Header";
begin
// Implementation
end;
local procedure ValidateOrder(var SalesHeader: Record "Sales Header"): Boolean
var
ValidationResult: Boolean;
begin
// Implementation
exit(ValidationResult);
end;
trigger OnRun()
begin
// Implementation
end;
}
```
## Bad Examples
### Poor Keyword Line Positioning
```al
procedure BadKeywordPositioning(CustomerNo: Code[20])
var Customer: Record Customer; SalesHeader: Record "Sales Header"; // Wrong: multiple declarations on one line
begin if Customer.Get(CustomerNo) then begin // Wrong: multiple keywords on one line
if not Customer.Blocked then begin SalesHeader.Init(); SalesHeader."Sell-to Customer No." := CustomerNo; // Wrong: cramped formatting
if SalesHeader.Insert(true) then begin Message('Success'); end else begin Error('Failed'); end; // Wrong: entire conditional on one line
end else begin Error('Customer blocked'); end; // Wrong: else statement positioning
end else begin Error('Customer not found'); end; // Wrong: else statement positioning
end;
```
### Inconsistent Indentation and Positioning
```al
procedure InconsistentPositioning(OrderNo: Code[20])
var
SalesLine: Record "Sales Line";
Item: Record Item;
begin
SalesLine.SetRange("Document No.", OrderNo); // Wrong: not indented
if SalesLine.FindSet() then // Wrong: over-indented
repeat // Wrong: should be on new line with proper indentation
if SalesLine.Type = SalesLine.Type::Item then // Wrong: inconsistent indentation
begin // Wrong: should align with if
Item.Get(SalesLine."No."); // Wrong: poor indentation
Item.Inventory -= SalesLine.Quantity; // Wrong: inconsistent with previous line
end // Wrong: missing semicolon and poor positioning
else begin // Wrong: else positioning and indentation
SalesLine."Unit Price" := 0; // Wrong: inconsistent indentation
end; // Wrong: inconsistent with begin
until SalesLine.Next() = 0; // Wrong: poor positioning
end;
```
### Cramped Control Structures
```al
procedure CrampedStructures(Status: Option Open,Released,Pending)
begin
case Status of Status::Open: begin Message('Open'); EnableEditing(); end; Status::Released: begin Message('Released'); DisableEditing(); end; Status::Pending: begin Message('Pending'); RequestApproval(); end; end; // Wrong: entire case statement on one line
if Status = Status::Open then begin EnableEditing(); SetStatusColor('Green'); end else if Status = Status::Released then begin DisableEditing(); SetStatusColor('Blue'); end else begin DisableEditing(); SetStatusColor('Red'); end; // Wrong: complex conditional on one line
end;
```
### Poor Function Declaration Formatting
```al
codeunit 50101 "Bad Formatting"
{
procedure CreateCustomer(Name: Text[100]; Email: Text[80]; Phone: Text[30]): Code[20] var Customer: Record Customer; CustomerNo: Code[20]; begin Customer.Init(); CustomerNo := NoSeriesMgt.GetNextNo(Setup."Customer Nos.", 0D, true); Customer."No." := CustomerNo; Customer.Name := Name; exit(CustomerNo); end; // Wrong: entire procedure on few lines
local procedure ValidateData(Name: Text[100]): Boolean begin if Name = '' then exit(false); exit(true); end; // Wrong: procedure body on declaration line
trigger OnRun() begin Message('Running'); end; // Wrong: trigger not properly positioned
}
```
### Mixed Line Positioning Styles
```al
procedure MixedStyles(OrderNo: Code[20])
var
SalesHeader: Record "Sales Header";
ProcessingResult: Boolean;
begin
if SalesHeader.Get(SalesHeader."Document Type"::Order, OrderNo) then begin // Style 1: keywords on same line
ProcessingResult := true;
Message('Order found');
end
else // Style 2: else on separate line
begin
ProcessingResult := false;
Error('Order not found');
end;
case SalesHeader.Status of // Style 3: case body on same line
SalesHeader.Status::Open: ProcessingResult := true;
SalesHeader.Status::Released: // Style 4: case action on new line
ProcessingResult := false;
end;
end;
```
## Best Practices
1. **Start each major keyword** (if, case, while, for) on its own line
2. **Consistent indentation** for all keywords at the same logical level
3. **Align related keywords** (begin/end pairs, if/then/else structures)
4. **Separate complex logic** across multiple lines for readability
5. **Maintain consistent style** throughout the entire codeunit