---
title: "C/AL-särdrag och kodanalys | NAVtoBC.de"
description: "Förstå C/AL: triggers, FlowFields, objekt, transaktioner och dynamiska beroenden. Analys baserad på objektexporter i TXT-format."
url: https://navtobc.de/se/cal-besonderheiten
language: sv
---

# C/AL-särdrag och kodanalys

SÄRDRAGEN I C/AL

## Lite kod. Stor verkan.

I Navision finns affärslogiken inte bara i funktioner. Även fältegenskaper, triggrar, filter och körningskontexten avgör vad som faktiskt händer.

Den som analyserar C/AL automatiserat måste läsa dessa samband tillsammans. Här är de viktigaste särdragen för en välgrundad analys och migreringsplanering.

SÄTT C/AL I RÄTT SAMMANHANG

### Från Navision till Business Central 14.

**C/AL står för Client/server Application Language.** Språket användes i Navision och Dynamics NAV och fanns fortfarande i Business Central 14 (Spring 2019, on-premises). Från och med Business Central 15 ersattes C/AL av AL.

VÅRT ANALYSUNDERLAG

### TXT-objektexporter.

Vi läser de **NAV-objekt som exporterats som TXT** med C/AL-kod och objektegenskaper. **FOB-filer i originalformat bearbetas inte direkt.**

Om det bara finns FOB-filer importeras objekten först i en lämplig NAV-utvecklingsmiljö och exporteras där som TXT. Det kräver en passande version och den nödvändiga utvecklarlicensen. Det räcker inte att byta filändelse.

EN LITEN SKILLNAD MED KONSEKVENSER

### Tilldela eller validera?

Båda raderna sätter ett värde i postbufferten. `VALIDATE` kör dessutom fältvalideringen inklusive `OnValidate`. Den här triggern kan ändra andra fält, utlösa affärslogik och själv göra ändringar i databasen.

Direkt tilldelning

```
Customer.Name := 'Beispiel';
```

Med fältvalidering

```
Customer.VALIDATE(Name, 'Beispiel');
```

### Det här hör ihop i analysen.

Fäll ut ämnena och upptäck de tekniska detaljerna.

****Språk & värden** Pascal-syntax, Code, Option och affärsnära datatyper**

- **Pascal-präglad syntax:** `BEGIN … END`, `:=` för tilldelningar samt `//` och `{ … }` för kommentarer. Identifierare och nyckelord skiljer inte på versaler och gemener. Variabler deklareras globalt i objektet eller lokalt i funktioner och triggrar. `VAR`-parametrar kan ändra värdet hos anroparen.
- **Code är en egen datatyp:** Den omvandlar text till versaler och tar bort inledande och avslutande blanksteg. Den definierade längden för `Code` och `Text` ingår i utvärderingen. Teckensträngar och matriser adresseras från position 1.
- **Option-värden har en ordningsföljd:** `OptionString` definierar medlemmarna; deras numeriska värden börjar på 0. Namn, position och översatt visningstext måste hållas isär. En övergång till AL-enums måste ta hänsyn till befintliga värden. AL stöder även fortsättningsvis `Option`; övergången till enums är inte automatiskt nödvändig.
- **Affärsmässiga värden i stället för bara tal:** `0D`, bokslutsdatum, `WORKDATE` och datumformler har egen betydelse. Avrundningsregler och språkberoende konverteringar med `FORMAT` och `EVALUATE` kan påverka resultat och integrationer.

**För analysen:** Samma synliga värden kan hanteras olika tekniskt. Datatyp, längd, språk och parameteröverföring hör därför till iakttagelsen.

****Objekt & metadata** Typ plus ID, fältnummer och egenskaper**

- **Objekt i stället för enskilda källfiler:** Beroende på NAV-version ingår Table, Page, Report, Codeunit, Query, XMLport och MenuSuite; äldre generationer har även Form och Dataport. Det är kombinationen av **objekttyp och ID** som är unik. Intervallet 50000–99999 är klassiskt avsett för kundanpassningar; partnerintervall och användbarhet beror även på licensen.
- **Egenskaper bär affärslogik:** `TableRelation`, `CalcFormula`, `SourceTableView`, `RunObject` och `RunPageLink` skapar relationer, filter och anrop utanför den egentliga C/AL-koden. Fältnummer, nycklar, rapporters DataItems och XMLport-strukturer hör också till modellen.
- **Identifierare är inte visningstexter:** `CaptionML` och `OptionCaptionML` ger flerspråkiga visningstexter, till exempel på tyska och engelska. De ersätter varken objekt- eller fältidentiteter. TXT-exportens språkversion och teckenkodning måste bevaras.

**För analysen:** En fullständig objektexport innehåller mer kunskap än utkopierade funktioner. Metadata är en del av programmet.

****Triggrar & affärslogik** VALIDATE, RunTrigger och dolda följdåtgärder**

- **Triggrar och funktioner:** C/AL har globala och lokala funktioner. Därtill finns tabelltriggrar som `OnInsert`, `OnModify`, `OnDelete` och `OnRename`, fälttriggrar som `OnValidate` och `OnLookup` samt Page- och Report-triggrar. Ordningsföljd och anropskontext är avgörande.
- **En parameter ändrar förloppet:** Vid `INSERT`, `MODIFY` och `DELETE` styr `RunTrigger` om den tillhörande tabelltriggern körs. Om den utelämnas är den `FALSE`. `MODIFY(TRUE)` kör `OnModify` men validerar inte automatiskt varje fält. Massoperationer måste betraktas separat.
- **Kontrollera, överföra och validera är olika saker:** `TESTFIELD` kontrollerar ett fältvärde. `TRANSFERFIELDS` tilldelar värden via fältnummer och kör inga `OnValidate`-triggers. En direkt fälttilldelning kringgår också denna fältvalidering.
- **Implicit kontext:** `Rec`, `xRec` och `WITH` påverkar vad ett uttryck refererar till. Lokala och globala variabler har olika räckvidd. Globala variabler kan behålla tillstånd inom en objektinstans; `SingleInstance`-Codeunits delar sin instans inom en session.

**För analysen:** Ett funktionsnamn ensamt förklarar inte förloppet. Även triggerflaggor, variabelkontext och utlösta följdåtgärder måste spåras.

****Record-tillstånd & beräkningar** Filter, FlowFields, temporära data och företag**

- **Records minns mer än fältvärden:** Filter, filtergrupper, nycklar och aktuell post påverkar åtkomsten. `SETRANGE`, `SETFILTER`, `FILTERGROUP`, `RESET`, `FINDSET`, `FINDFIRST` och `NEXT` måste läsas i sitt sammanhang. `GET` använder primärnyckeln och ignorerar vanliga filter; säkerhetsfilter måste beaktas separat.
- **FlowField är inte FlowFilter:** Ett FlowField lagrar inte sitt beräknade resultat permanent i tabellen. `CalcFormula` beskriver beräkningen, till exempel en summa eller en lookup. `CALCFIELDS` beräknar värdet; beroende på hur fältet används sköter även användargränssnittet detta. Ett FlowFilter ger filtervillkor för sådana beräkningar och beräknar inte själv något resultatvärde.
- **Samma tabell, annan kontext:** Temporära record-variabler bearbetar data i minnet. `CHANGECOMPANY` byter företag för dataåtkomsten; triggers körs fortfarande i det aktuella företagets kontext. `DataPerCompany` skiljer mellan företagsspecifika och gemensamma tabeller.

**För analysen:** Tabellnamn och fältvärde räcker inte. Filter, beräkningsdefinition, temporärt tillstånd och företag avgör vad värdet faktiskt säger.

****Dynamiska beroenden & events** RecordRef, FieldRef, anrop och subscribers**

- **Återanvändning utan klassmodell:** C/AL har inga namnrymder i språket och inga inbyggda interfacedefinitioner. En egen klassmodell med arv ingår inte heller i språket. Codeunits tillhandahåller globala funktioner; `CODEUNIT.RUN` startar deras `OnRun`-trigger. Referenser kan lösas upp via namn, deklarerade objektsubtyper eller nummer.
- **Anropsmålet kan avgöras först vid körning:** `RecordRef`, `FieldRef`, `Variant` och objekt-ID:n som skickas in som variabler möjliggör generisk bearbetning. Även konfigurationstabeller kan styra vilken kod som faktiskt anropas.
- **Events finns redan i C/AL:** Sedan NAV 2016 kan publishers och subscribers skapa ytterligare anropsrelationer. Analysen måste ta hänsyn till dessa bindningar; en sökning efter direkta funktionsanrop fångar dem inte fullständigt.

**För analysen:** Beroenden som kan beläggas statiskt redovisas separat från relationer som bara kan lösas upp med hjälp av konfiguration eller kunskap om körningen.

****Transaktioner & SQL** COMMIT, felhantering, nycklar och låsning**

- **Transaktioner hanteras delvis implicit:** C/AL startar och avslutar databastransaktioner automatiskt. `COMMIT` sätter en uttrycklig gräns. Ett senare fel återställer inte ändringar som redan har bekräftats.
- **Felhantering är en del av logiken:** Returvärden från databasfunktioner, det utvärderade booleska returvärdet från `CODEUNIT.RUN` och `TryFunction` förändrar fel- och transaktionsflödet. Databasändringar inom en TryFunction återställs inte automatiskt vid ett fångat fel; vilka skrivåtgärder som är tillåtna beror på version och serverkonfiguration.
- **C/AL påverkar SQL utan att visa SQL:** `SETCURRENTKEY`, filter, `LOCKTABLE`, `FINDSET`, nycklar och SIFT-aggregat påverkar åtkomst och låsningsbeteende. En vald nyckel garanterar ingen bestämd exekveringsplan i SQL. Iögonfallande mönster ger utgångspunkter; deras faktiska prestanda mäts.

**För analysen:** Datakonsistens och prestanda kan bara bedömas utifrån transaktionsgränser, felvägar och den konkreta databasdriften.

****Historik & standardjämförelse** TXT-format, Version List, landsversioner och anpassningar**

- **Ett eget, dokumenterat exportformat:** C/SIDE hanterar objekt i databasen och exporterar dem som FOB eller TXT. TXT innehåller källkod och metadata som Version List, datum, klockslag och Modified-flagga. Sådana exporter kan versionshanteras med Git; teknisk metadata kan dock fylla jämförelser med ytterligare ändringar. Microsoft tillhandahåller själv verktyg för jämförelse och konvertering.
- **Anpassningar kan finnas i standardkoden:** I klassiska NAV-projekt ändrades Microsofts kod ofta direkt. `Version List` är en indikation, inte ett fullständigt bevis på ändringar. Tillförlitlig blir klassificeringen först genom en jämförelse med rätt oförändrad utgångsversion och befintlig projektdokumentation.
- **Rätt bas är avgörande:** NAV-version, build respektive kumulativ uppdatering, landsversion och partnerlösningar måste stämma överens. Tyska, österrikiska eller schweiziska lokaliseringar kan innehålla andra standardobjekt och affärsregler.

**För analysen:** Först med rätt jämförelseversion syns vilken logik som hör till standarden, till lokaliseringen, till ett add-on eller till en kundspecifik anpassning.

****Körning, behörigheter & integrationer** Klientgenerationer, rättigheter och externa ingångspunkter**

- **NAV-generationen förändrar miljön:** Classic Client, RoleTailored Client från och med NAV 2009, Forms och Pages samt Dataports och XMLports hör till olika utvecklingsstadier. .NET-interop infördes redan med **NAV 2009 R2**. Automation/COM, .NET-komponenter och körning på klient respektive server måste bedömas utifrån respektive version.
- **Behörigheter syns bara delvis i exporten:** Objektegenskapen `Permissions` hör till källmaterialet. Tilldelade behörighetsuppsättningar, användarbehörigheter, säkerhetsfilter och licensomfattning måste kartläggas separat. Indirekta behörigheter kan påverka genom vilket flöde data får ändras.
- **Användning börjar även utanför koden:** Jobbköer, publicerade webbtjänster, filsökvägar, externa komponenter och anslutna SQL- och EDI-system eller webbutiker kan starta eller styra flöden. `GUIALLOWED` och klientberoende funktioner är relevanta för bakgrundskörningar. Att statiska anrop saknas bevisar därför inte att något är oanvänt.

**För analysen:** TXT-exporten kompletteras med konfiguration som godkänts för analysen, kunskap om integrationerna och lämpliga belägg för användning. Öppna beroenden klargörs målinriktat med IT och verksamheten.

VAD DU FÅR UT AV DET

### Förstå affärsreglerna. Planera migreringen på säker grund.

En tillförlitlig analys förenar C/AL-kod, objektmetadata och den faktiska driften. Då blir regler, beroenden och öppna frågor spårbara – som underlag för standard i Business Central, lämpliga moduler och målinriktad AL-utveckling.

[Begär en C/AL-analys](https://navtobc.de/se/kontakt?thema=nav-analyse)

**Källor & bakgrund**

Kontrollerat 2026-10-09 mot Microsofts dokumentation. Översikten samlar de viktigaste särdragen för analysen; detaljerna beror på NAV-version, objektversion och driftmiljö.

- [C/AL fram till Business Central 14 och TXT-objektexporter](https://learn.microsoft.com/sv-se/dynamics365/business-central/dev-itpro/developer/devenv-txt2al-tool)
- [FOB/TXT: exportera och importera objekt](https://learn.microsoft.com/sv-se/dynamics365/business-central/dev-itpro/cside/cside-import-objects)
- [.NET-interop i NAV 2009 R2](https://www.microsoft.com/en-us/dynamics-365/blog/no-audience/2010/10/27/net-interoperability-in-nav-2009-r2/)
- [Events i C/AL sedan NAV 2016](https://www.microsoft.com/en-us/dynamics-365/blog/business-leader/2015/10/15/integration-events-in-microsoft-dynamics-nav-2016/)
- [C/AL-funktioner, variabler och VALIDATE](https://www.microsoft.com/en-us/dynamics-365/blog/no-audience/2012/12/03/writing-unit-tests-in-cal/)
- [FlowFields i NAV 2018](https://learn.microsoft.com/sv-se/previous-versions/dynamicsnav-2018-developer/FlowFields)
- [TXT-objekt, metadata och standardjämförelse](https://learn.microsoft.com/sv-se/dynamics365/business-central/dev-itpro/upgrade/comparing-and-merging-application-object-source-files)
- [TryFunctions och felhantering i C/AL](https://www.microsoft.com/en-us/dynamics-365/blog/business-leader/2015/10/28/nav-design-pattern-tryfunction-net-exception-handling-in-cal/)
- [SingleInstance, arbetsdatum och sidoeffekter](https://www.microsoft.com/en-us/dynamics-365/blog/it-professional/2015/10/19/test-isolation-in-the-application-test-automation-suite/)
- [Språkjämförelse: Option finns även i AL](https://learn.microsoft.com/sv-se/dynamics365/business-central/dev-itpro/developer/methods-auto/option/option-data-type)
- [CHANGECOMPANY och triggerkontext (AL-referens)](https://learn.microsoft.com/sv-se/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-changecompany-method)
- [Permissions och indirekta behörigheter (AL-referens)](https://learn.microsoft.com/sv-se/dynamics365/business-central/dev-itpro/developer/properties/devenv-permissions-property)

[Så kombinerar vi kodanalys och AI](https://navtobc.de/se/methoden)
