bc-code-intelligence-mcp
Version:
BC Code Intelligence MCP Server - Complete Specialist Bundle with AI-driven expert consultation, seamless handoffs, and context-preserving workflows
255 lines (210 loc) • 8.22 kB
Markdown
# AL Binary Operator Spacing - Code Examples
## Good Examples
### Arithmetic Operators with Proper Spacing
```al
procedure CalculateOrderTotals(BaseAmount: Decimal; TaxRate: Decimal; DiscountPct: Decimal): Decimal
var
TaxAmount: Decimal;
DiscountAmount: Decimal;
NetAmount: Decimal;
FinalTotal: Decimal;
begin
// Arithmetic operations with consistent spacing
TaxAmount := BaseAmount * TaxRate / 100;
DiscountAmount := BaseAmount * DiscountPct / 100;
NetAmount := BaseAmount - DiscountAmount;
FinalTotal := NetAmount + TaxAmount;
// Complex calculations with proper spacing
FinalTotal := (BaseAmount * (1 - DiscountPct / 100)) * (1 + TaxRate / 100);
exit(FinalTotal);
end;
```
### Comparison Operators with Consistent Spacing
```al
procedure ValidateCustomerData(var Customer: Record Customer): Boolean
var
ValidationResult: Boolean;
begin
ValidationResult := true;
// Comparison operations with proper spacing
if Customer."No." = '' then
ValidationResult := false;
if Customer."Credit Limit (LCY)" <= 0 then
ValidationResult := false;
if Customer."Balance (LCY)" >= Customer."Credit Limit (LCY)" then
ValidationResult := false;
if Customer."Last Date Modified" <> Today then
Customer."Last Date Modified" := Today;
// Complex comparison with proper spacing
if (Customer."Balance (LCY)" > 0) and (Customer."Credit Limit (LCY)" > 0) then
if Customer."Balance (LCY)" / Customer."Credit Limit (LCY)" > 0.8 then
Message('Customer approaching credit limit');
exit(ValidationResult);
end;
```
### Logical Operators with Clear Spacing
```al
procedure ProcessOrderLogic(var SalesHeader: Record "Sales Header"): Boolean
var
CanProcess: Boolean;
Customer: Record Customer;
begin
Customer.Get(SalesHeader."Sell-to Customer No.");
// Logical operations with proper spacing
CanProcess := (SalesHeader.Status = SalesHeader.Status::Open) and
(not Customer.Blocked) and
(SalesHeader."Order Date" <> 0D);
// Complex logical expressions with clear spacing
if (Customer."Credit Limit (LCY)" > 0) and
(Customer."Balance (LCY)" < Customer."Credit Limit (LCY)") and
((SalesHeader."Amount Including VAT" + Customer."Balance (LCY)") <= Customer."Credit Limit (LCY)") then
CanProcess := true
else
CanProcess := false;
// Multiple condition checks with proper spacing
if (SalesHeader."Shipment Date" <> 0D) or
(SalesHeader."Requested Delivery Date" <> 0D) or
(SalesHeader."Promised Delivery Date" <> 0D) then
SalesHeader."Has Delivery Date" := true;
exit(CanProcess);
end;
```
### Assignment Operators with Consistent Formatting
```al
procedure UpdateCustomerInformation(var Customer: Record Customer; NewCredit: Decimal)
var
PreviousCredit: Decimal;
CreditIncrease: Decimal;
begin
// Assignment operations with proper spacing
PreviousCredit := Customer."Credit Limit (LCY)";
Customer."Credit Limit (LCY)" := NewCredit;
CreditIncrease := NewCredit - PreviousCredit;
// Complex assignments with proper spacing
Customer."Credit Available (LCY)" := Customer."Credit Limit (LCY)" - Customer."Balance (LCY)";
// Multiple assignments maintaining consistency
Customer."Last Date Modified" := Today;
Customer."Last Time Modified" := Time;
Customer."Modified By" := UserId;
Customer.Modify();
end;
```
### Mixed Operators in Complex Expressions
```al
procedure CalculateComplexPricing(ItemNo: Code[20]; Quantity: Decimal; CustomerNo: Code[20]): Decimal
var
Item: Record Item;
Customer: Record Customer;
BasePrice: Decimal;
VolumeDiscount: Decimal;
CustomerDiscount: Decimal;
FinalPrice: Decimal;
begin
Item.Get(ItemNo);
Customer.Get(CustomerNo);
BasePrice := Item."Unit Price";
// Complex calculations with consistent operator spacing
if Quantity >= 100 then
VolumeDiscount := 0.15
else if Quantity >= 50 then
VolumeDiscount := 0.10
else if Quantity >= 20 then
VolumeDiscount := 0.05
else
VolumeDiscount := 0.00;
// Customer type discount calculation
if Customer."Customer Price Group" = 'VIP' then
CustomerDiscount := 0.20
else if Customer."Customer Price Group" = 'PREMIUM' then
CustomerDiscount := 0.10
else
CustomerDiscount := 0.00;
// Final price calculation with proper spacing
FinalPrice := BasePrice * Quantity * (1 - VolumeDiscount) * (1 - CustomerDiscount);
exit(FinalPrice);
end;
```
## Bad Examples
### Cramped Arithmetic Operations
```al
procedure BadArithmeticSpacing(Amount: Decimal; Tax: Decimal): Decimal
var
Result: Decimal;
begin
Result:=Amount*Tax/100; // Bad: no spaces around operators
Result:=Amount+Result; // Bad: no spaces around operators
Result:=(Amount*1.1)+Tax-5; // Bad: inconsistent spacing
exit(Result);
end;
```
### Inconsistent Comparison Spacing
```al
procedure BadComparisonSpacing(Customer: Record Customer): Boolean
begin
if Customer."No."='' then // Bad: no spaces around =
exit(false);
if Customer."Credit Limit (LCY)" <=0 then // Bad: no space before <=
exit(false);
if Customer."Balance (LCY)">= Customer."Credit Limit (LCY)" then // Bad: inconsistent spacing around >=
exit(false);
exit(true);
end;
```
### Poor Logical Operator Spacing
```al
procedure BadLogicalSpacing(SalesHeader: Record "Sales Header"): Boolean
var
Customer: Record Customer;
begin
Customer.Get(SalesHeader."Sell-to Customer No.");
// Bad logical operator spacing
if(SalesHeader.Status=SalesHeader.Status::Open)and(not Customer.Blocked)and(SalesHeader."Order Date"<>0D)then // Bad: no spaces
exit(true);
if (Customer."Credit Limit (LCY)">0)and (Customer."Balance (LCY)"<Customer."Credit Limit (LCY)")then // Bad: inconsistent spacing
exit(true);
exit(false);
end;
```
### Cramped Assignment Operations
```al
procedure BadAssignmentSpacing(var Customer: Record Customer)
var
NewCredit: Decimal;
begin
NewCredit:=5000; // Bad: no spaces around :=
Customer."Credit Limit (LCY)":=NewCredit; // Bad: no spaces around :=
Customer."Credit Available (LCY)":=Customer."Credit Limit (LCY)"-Customer."Balance (LCY)"; // Bad: no spaces around operators
end;
```
### Mixed Spacing Inconsistency
```al
procedure InconsistentSpacing(Amount: Decimal; Discount: Decimal): Decimal
var
Result: Decimal;
begin
Result := Amount * (1-Discount/100); // Bad: inconsistent spacing (some operators have spaces, others don't)
Result:= Result+10; // Bad: space only on one side of :=
Result=Result *1.1; // Bad: wrong assignment operator and poor spacing
if Result> 1000 then // Bad: space only on one side of >
Result := Result- 50; // Bad: space only on one side of -
exit(Result);
end;
```
### Extremely Cramped Complex Expressions
```al
procedure CrampedComplexExpressions(Item: Record Item; Qty: Decimal; Customer: Record Customer): Decimal
var
Price: Decimal;
begin
Price:=Item."Unit Price"*Qty*(1-GetVolumeDiscount(Qty)/100)*(1-GetCustomerDiscount(Customer."No.")/100); // Bad: no spacing in complex expression
if(Item."Unit Price">0)and(Qty>0)and(Customer."Credit Limit (LCY)">Customer."Balance (LCY)")then // Bad: cramped logical expression
Price:=Price*1.1; // Bad: no spaces
exit(Price);
end;
```
## Best Practices
1. **Single space before and after** all binary operators (+, -, *, /, =, <>, <, >, <=, >=, :=)
2. **Consistent spacing** throughout all expressions and assignments
3. **Clear separation** in complex expressions with parentheses and spacing
4. **Maintain spacing** in multi-line expressions for readability
5. **Use consistent patterns** across entire codebase for professional appearance