← Tilbage til blog

NoImplicitWith: Skriv Sikkerere AL-Kode i Business Central

bcalkodestandardappsource

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:

  1. Tvetydighed: Hvis du har flere records i scope, er det ikke altid klart hvilken record der kaldes på
  2. Læsbarhed: Koden bliver sværere at følge når man ikke eksplicit ser hvilken variabel der bruges
  3. 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

FordelForklaring
KlarhedDet er altid tydeligt hvilken record der arbejdes på
SikkerhedMindre risiko for at kalde metoder på forkert record
VedligeholdLettere at refactor og debugge
AppSourceKræ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:

  1. Fjern alle WITH-blokke
  2. Gør alle record-references eksplicitte
  3. 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: