NoImplicitWith: Skriv Sikkerere AL-Kode i Business Central
Når du udvikler extensions til Business Central, er der en indstilling som kan gøre din kode markant mere sikker og vedligeholdelig: NoImplicitWith. I denne artikel forklarer vi hvad det betyder, hvorfor du bør bruge det, og hvordan det påvirker din daglige udvikling.
Hvad er NoImplicitWith?
NoImplicitWith er et features flag i app.json som kræver at alle WITH-blokke er eksplicitte. Når dette flag er aktiveret, tillader kompilatoren ikke implicitte WITH-statements på record- og page-variabler.
Sådan ser det ud i app.json
{
"id": "din-app-id",
"name": "Din App",
"version": "1.0.0.0",
"features": ["NoImplicitWith"]
}
Problemet med Implicit With
Før NoImplicitWith blev standard, var det almindeligt at skrive kode sådan her:
WITH Customer DO BEGIN
SETRANGE("No.", '10000');
MODIFY();
END;
Inde i WITH-blokken refererer SETRANGE og MODIFY implicit til Customer-recordet. Det ser måske uskyldigt ud, men det skaber flere problemer:
- Tvetydighed: Hvis du har flere records i scope, er det ikke altid klart hvilken record der kaldes på
- Læsbarhed: Koden bliver sværere at følge når man ikke eksplicit ser hvilken variabel der bruges
- Refactoring: Når du flytter kode, er det lettere at introducere fejl
Den Moderne Tilgang
Med NoImplicitWith skal du skrive koden eksplicit:
Customer.SETRANGE("No.", '10000');
Customer.MODIFY();
Dette ser måske ud som mere kode, men fordelene er klare:
✅ Fordele ved eksplicit kode
| Fordel | Forklaring |
|---|---|
| Klarhed | Det er altid tydeligt hvilken record der arbejdes på |
| Sikkerhed | Mindre risiko for at kalde metoder på forkert record |
| Vedligehold | Lettere at refactor og debugge |
| AppSource | Kræves til AppSource-godkendelse |
Eksempel: Før og Efter
❌ Før (ikke tilladt med NoImplicitWith)
local procedure UpdateCustomerPrices()
var
Customer: Record Customer;
Price: Decimal;
begin
Customer.GET('10000');
WITH Customer DO BEGIN
Price := "LCY Code";
MODIFY();
END;
end;
✅ Efter (eksplicit og sikkert)
local procedure UpdateCustomerPrices()
var
Customer: Record Customer;
Price: Decimal;
begin
Customer.GET('10000');
Price := Customer."LCY Code";
Customer.MODIFY();
end;
Hvornår Gælder Det?
NoImplicitWith påvirker:
- Record-variabler:
Customer,SalesHeader,Item, osv. - Page-variabler: Når du arbejder med page objects
- Temp records: Også midlertidige records
Det påvirker ikke:
- Lokale variabler af simple typer (Integer, Text, Decimal)
- Global functions i codeunits (her er WITH sjældent nødvendigt alligevel)
Anbefalinger
1. Brug Altid NoImplicitWith i Nye Apps
Hvis du starter en ny extension, skal NoImplicitWith være slået til fra dag 1:
"features": ["NoImplicitWith"]
2. Opgrader Eksisterende Apps
For eksisterende apps bør du planlægge en refactoring hvor du:
- Fjern alle
WITH-blokke - Gør alle record-references eksplicitte
- Test grundigt efter ændringer
3. Brug din Linter
De fleste AL linting tools flagrer implicit WITH som en warning. Brug dem aktivt i dit CI/CD pipeline.
Konklusion
NoImplicitWith er ikke bare en teknisk detalje — det er en bedste praksis som gør din kode mere robust og fremtidssikret. Microsoft kræver det til AppSource, og det gør din kode lettere at vedligeholde.
Næste gang du skriver en WITH-blok, så spørg dig selv: Er det virkelig værd at spare de få tegn? Svaret er næsten altid nej.
Relaterede ressourcer: