---
title: "C/AL-eigenaardigheden en codeanalyse | NAVtoBC.de"
description: "C/AL begrijpen: triggers, FlowFields, objecten, transacties en dynamische afhankelijkheden. Analyse op basis van TXT-objectexporten."
url: https://navtobc.de/nl/cal-besonderheiten
language: nl
---

# C/AL-eigenaardigheden en codeanalyse

DE BIJZONDERHEDEN VAN C/AL

## Weinig code. Veel impact.

In Navision zit bedrijfslogica niet alleen in functies. Ook veldeigenschappen, triggers, filters en de uitvoeringscontext bepalen wat er werkelijk gebeurt.

Wie C/AL geautomatiseerd analyseert, moet deze verbanden in samenhang lezen. Hier zijn de belangrijkste bijzonderheden voor een onderbouwde analyse en migratieplanning.

C/AL GOED PLAATSEN

### Van Navision tot Business Central 14.

**C/AL staat voor Client/server Application Language.** De taal werd gebruikt in Navision en Dynamics NAV en was nog beschikbaar in Business Central 14 (Spring 2019, on-premises). Vanaf Business Central 15 werd C/AL vervangen door AL.

ONZE ANALYSEBASIS

### TXT-objectexports.

Wij lezen de als **TXT geëxporteerde NAV-objecten** met C/AL-code en objecteigenschappen. **Native FOB-bestanden worden niet rechtstreeks verwerkt.**

Zijn er alleen FOB-bestanden, dan worden de objecten eerst in een geschikte NAV-ontwikkelomgeving geïmporteerd en daar als TXT geëxporteerd. Daarvoor zijn een passende versie en de vereiste ontwikkelaarslicentie nodig. Een hernoemde bestandsextensie volstaat niet.

EEN KLEIN VERSCHIL MET GEVOLGEN

### Toewijzen of valideren?

Beide regels zetten een waarde in de recordbuffer. `VALIDATE` voert daarnaast de veldvalidatie uit, inclusief `OnValidate`. Deze trigger kan andere velden wijzigen, bedrijfslogica activeren en zelf databasewijzigingen doorvoeren.

Directe toewijzing

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

Met veldvalidatie

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

### Wat bij de analyse bij elkaar hoort.

Klap de onderwerpen open en ontdek de technische details.

****Taal & waarden** Pascal-syntaxis, Code, opties en inhoudelijke gegevenstypen**

- **Door Pascal geïnspireerde syntaxis:** `BEGIN … END`, `:=` voor toewijzingen en `//` en `{ … }` voor commentaar. Namen en sleutelwoorden zijn niet hoofdlettergevoelig. Variabelen worden globaal in het object of lokaal in functies en triggers gedeclareerd. `VAR`-parameters kunnen de waarde bij de aanroeper wijzigen.
- **Code is een eigen gegevenstype:** het zet tekst om in hoofdletters en verwijdert voorloop- en naloopspaties. De gedefinieerde lengte van `Code` en `Text` hoort bij de analyse. Tekenreeksen en arrays worden vanaf positie 1 geadresseerd.
- **Opties hebben een volgorde:** `OptionString` definieert de leden; hun numerieke waarden beginnen bij 0. Naam, positie en vertaald bijschrift moeten worden onderscheiden. Een ombouw naar AL-enums moet rekening houden met de bestaande waarden. AL ondersteunt ook nog steeds `Option`; de overstap naar enums is niet automatisch verplicht.
- **Inhoudelijke waarden in plaats van louter getallen:** `0D`, afsluitdatums, `WORKDATE` en datumformules hebben een eigen betekenis. Afrondingsregels en taalafhankelijke conversies met `FORMAT` en `EVALUATE` kunnen resultaten en koppelingen beïnvloeden.

**Voor de analyse:** gelijke zichtbare waarden kunnen technisch verschillend worden behandeld. Gegevenstype, lengte, taal en parameteroverdracht horen daarom bij de bevinding.

****Objecten & metadata** Type plus ID, veldnummers en eigenschappen**

- **Objecten in plaats van losse bronbestanden:** afhankelijk van de NAV-versie horen Table, Page, Report, Codeunit, Query, XMLport en MenuSuite erbij; oudere generaties kennen ook Form en Dataport. Uniek is de combinatie van **objecttype en ID**. Het bereik 50000–99999 is klassiek bedoeld voor klantaanpassingen; partnerbereiken en bruikbaarheid hangen ook af van de licentie.
- **Eigenschappen dragen bedrijfslogica:** `TableRelation`, `CalcFormula`, `SourceTableView`, `RunObject` en `RunPageLink` creëren relaties, filters en aanroepen buiten de eigenlijke C/AL-code. Veldnummers, sleutels, report-DataItems en XMLport-structuren horen eveneens bij het model.
- **Namen zijn geen bijschriften:** `CaptionML` en `OptionCaptionML` leveren meertalige weergaven, bijvoorbeeld Duits en Engels. Ze vervangen geen object- of veldidentiteiten. Taalversie en tekencodering van de TXT-export moeten behouden blijven.

**Voor de analyse:** een volledige objectexport bevat meer kennis dan losgekopieerde functies. Metadata zijn een onderdeel van het programma.

****Triggers & bedrijfslogica** VALIDATE, RunTrigger en verborgen vervolgacties**

- **Triggers en functies:** C/AL biedt globale en lokale functies. Daarnaast zijn er tabeltriggers zoals `OnInsert`, `OnModify`, `OnDelete` en `OnRename`, veldtriggers zoals `OnValidate` en `OnLookup`, en page- en reporttriggers. Volgorde en aanroepcontext zijn doorslaggevend.
- **Eén parameter verandert het verloop:** bij `INSERT`, `MODIFY` en `DELETE` bepaalt `RunTrigger` of de bijbehorende tabeltrigger wordt uitgevoerd. Zonder opgave is hij `FALSE`. `MODIFY(TRUE)` voert `OnModify` uit, maar valideert niet automatisch elk veld. Bulkbewerkingen moeten apart worden bekeken.
- **Controleren, overdragen en valideren zijn verschillende dingen:** `TESTFIELD` controleert een veldwaarde. `TRANSFERFIELDS` wijst waarden toe op basis van veldnummers en voert geen `OnValidate`-triggers uit. Ook een directe veldtoewijzing omzeilt deze veldvalidatie.
- **Impliciete context:** `Rec`, `xRec` en `WITH` bepalen waarnaar een expressie verwijst. Lokale en globale variabelen hebben verschillende geldigheidsbereiken. Globale variabelen kunnen hun toestand binnen een objectinstantie behouden; `SingleInstance`-codeunits delen hun instantie binnen een sessie.

**Voor de analyse:** Een functienaam alleen verklaart het verloop niet. Ook triggerschakelaars, variabelencontext en de vervolgacties die worden uitgelokt, moeten worden herleid.

****Recordtoestand & berekeningen** Filters, FlowFields, tijdelijke gegevens en bedrijven**

- **Records onthouden meer dan veldwaarden:** Filters, filtergroepen, sleutels en het huidige record bepalen mee hoe gegevens worden benaderd. `SETRANGE`, `SETFILTER`, `FILTERGROUP`, `RESET`, `FINDSET`, `FINDFIRST` en `NEXT` moeten in samenhang worden gelezen. `GET` gebruikt de primaire sleutel en negeert gewone filters; met beveiligingsfilters moet afzonderlijk rekening worden gehouden.
- **FlowField is niet hetzelfde als FlowFilter:** Een FlowField slaat zijn berekende resultaat niet blijvend op in de tabel. `CalcFormula` beschrijft de berekening, bijvoorbeeld een som of een lookup. `CALCFIELDS` berekent de waarde; afhankelijk van hoe het veld is ingebonden, doet de gebruikersinterface dit ook. Een FlowFilter levert filtervoorwaarden voor zulke berekeningen en berekent zelf geen resultaatwaarde.
- **Zelfde tabel, andere context:** Tijdelijke recordvariabelen verwerken gegevens in het geheugen. `CHANGECOMPANY` wijzigt het bedrijf waarop de gegevenstoegang betrekking heeft; triggers blijven in de context van het huidige bedrijf draaien. `DataPerCompany` maakt onderscheid tussen bedrijfsgebonden en gedeelde tabellen.

**Voor de analyse:** Tabelnaam en veldwaarde zijn niet voldoende. Filters, berekeningsdefinitie, tijdelijke toestand en bedrijf bepalen wat een gegeven werkelijk zegt.

****Dynamische afhankelijkheden & events** RecordRef, FieldRef, aanroepen en subscribers**

- **Hergebruik zonder klassenmodel:** C/AL kent geen naamruimten op taalniveau en geen native interfacedefinities. Een eigen klassenmodel met overerving maakt evenmin deel uit van de taal. Codeunits stellen globale functies beschikbaar; `CODEUNIT.RUN` start hun `OnRun`-trigger. Verwijzingen kunnen worden opgelost via namen, gedeclareerde objectsubtypen of nummers.
- **Doelen kunnen pas tijdens runtime vaststaan:** `RecordRef`, `FieldRef`, `Variant` en variabel doorgegeven object-ID's maken generieke verwerking mogelijk. Ook configuratietabellen kunnen bepalen welke code daadwerkelijk wordt aangeroepen.
- **Events maken al deel uit van C/AL:** Sinds NAV 2016 kunnen publishers en subscribers extra aanroeprelaties tot stand brengen. De analyse moet met deze bindingen rekening houden; wie alleen naar directe functieaanroepen zoekt, brengt ze niet volledig in beeld.

**Voor de analyse:** Statisch aantoonbare afhankelijkheden en relaties die pas met configuratie- of runtimekennis kunnen worden opgelost, worden afzonderlijk vermeld.

****Transacties & SQL** COMMIT, foutafhandeling, sleutels en vergrendelingen**

- **Transacties verlopen deels impliciet:** C/AL opent en sluit databasetransacties automatisch. `COMMIT` legt een expliciete grens. Een latere fout draait reeds bevestigde wijzigingen niet terug.
- **Foutafhandeling maakt deel uit van de logica:** Retourwaarden van databasefuncties, de geëvalueerde Booleaanse retourwaarde van `CODEUNIT.RUN` en `TryFunction` veranderen het fout- en transactieverloop. Databasewijzigingen binnen een TryFunction worden bij een afgevangen fout niet automatisch teruggedraaid; welke schrijfbewerkingen zijn toegestaan, hangt af van versie en serverconfiguratie.
- **C/AL beïnvloedt SQL zonder SQL te tonen:** `SETCURRENTKEY`, filters, `LOCKTABLE`, `FINDSET`, sleutels en SIFT-aggregaties werken door in gegevenstoegang en vergrendelingsgedrag. Een ingestelde sleutel garandeert geen bepaald SQL-uitvoeringsplan. Opvallende patronen bieden aanknopingspunten; de werkelijke prestaties worden gemeten.

**Voor de analyse:** Gegevensconsistentie en prestaties zijn alleen te beoordelen in samenhang met transactiegrenzen, foutpaden en de concrete databaseomgeving.

****Historie & standaardvergelijking** TXT-formaat, Version List, landversies en aanpassingen**

- **Een eigen, gedocumenteerd exportformaat:** C/SIDE beheert objecten in de database en exporteert ze als FOB of TXT. TXT bevat broncode en metagegevens zoals Version List, datum, tijd en Modified-vlag. Zulke exports zijn met Git te beheren; technische metagegevens kunnen vergelijkingen echter vervuilen met extra wijzigingen. Microsoft levert zelf vergelijkings- en conversietools.
- **Aanpassingen kunnen in de standaard zitten:** In klassieke NAV-projecten werd Microsoft-code vaak rechtstreeks gewijzigd. De `Version List` is een aanwijzing, geen volledig bewijs van wijzigingen. Betrouwbaar wordt de indeling pas door een vergelijking met de passende ongewijzigde uitgangsversie en de beschikbare projectdocumentatie.
- **De juiste basis telt:** NAV-versie, build of cumulatieve update, landversie en partneroplossingen moeten op elkaar aansluiten. Duitse, Oostenrijkse of Zwitserse lokalisaties kunnen andere standaardobjecten en functionele regels bevatten.

**Voor de analyse:** Pas de passende vergelijkingsbasis laat zien welke logica bij de standaard, de lokalisatie, een add-on of het maatwerk hoort.

****Runtime, rechten & koppelingen** Clientgeneraties, machtigingen en externe ingangspunten**

- **De NAV-generatie verandert de omgeving:** Classic Client, RoleTailored Client vanaf NAV 2009, Forms en Pages en ook Dataports en XMLports horen bij verschillende ontwikkelgeneraties. .NET-interop werd al met **NAV 2009 R2** geïntroduceerd. Automation/COM, .NET-componenten en uitvoering op client of server moeten per versie worden beoordeeld.
- **Rechten zijn maar deels zichtbaar in de export:** De objecteigenschap `Permissions` hoort bij de broncode. Toegewezen machtigingensets, gebruikersrechten, beveiligingsfilters en licentieomvang moeten aanvullend worden vastgelegd. Indirecte machtigingen kunnen bepalen via welk proces gegevens mogen worden gewijzigd.
- **Gebruik begint ook buiten de code:** Taakwachtrijen, gepubliceerde webservices, bestandspaden, externe componenten en gekoppelde SQL- en EDI-systemen of webshops kunnen processen starten of sturen. `GUIALLOWED` en clientafhankelijke functies zijn relevant voor achtergrondprocessen. Ontbrekende statische aanroepen bewijzen daarom niet dat iets ongebruikt is.

**Voor de analyse:** De TXT-export wordt aangevuld met vrijgegeven configuratie, kennis van de koppelingen en geschikte gebruiksbewijzen. Openstaande afhankelijkheden worden gericht met IT en vakafdelingen opgehelderd.

WAT HET U OPLEVERT

### Bedrijfsregels begrijpen. Migratie onderbouwd plannen.

Een betrouwbare analyse verbindt C/AL-code, objectmetagegevens en het werkelijke gebruik in de praktijk. Zo worden regels, afhankelijkheden en open vragen inzichtelijk – als basis voor standaard Business Central, geschikte modules en gerichte AL-ontwikkeling.

[C/AL-analyse aanvragen](https://navtobc.de/nl/kontakt?thema=nav-analyse)

**Vakbronnen & context**

Gecontroleerd op 09-10-2026 aan de hand van de Microsoft-documentatie. Dit overzicht bundelt de belangrijkste bijzonderheden voor de analyse; details hangen af van NAV-versie, objectstand en operationele omgeving.

- [C/AL tot en met Business Central 14 en TXT-objectexports](https://learn.microsoft.com/nl-nl/dynamics365/business-central/dev-itpro/developer/devenv-txt2al-tool)
- [FOB/TXT: objecten exporteren en importeren](https://learn.microsoft.com/nl-nl/dynamics365/business-central/dev-itpro/cside/cside-import-objects)
- [.NET-interop in NAV 2009 R2](https://www.microsoft.com/en-us/dynamics-365/blog/no-audience/2010/10/27/net-interoperability-in-nav-2009-r2/)
- [Events in C/AL sinds 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-functies, variabelen en VALIDATE](https://www.microsoft.com/en-us/dynamics-365/blog/no-audience/2012/12/03/writing-unit-tests-in-cal/)
- [FlowFields in NAV 2018](https://learn.microsoft.com/nl-nl/previous-versions/dynamicsnav-2018-developer/FlowFields)
- [TXT-objecten, metagegevens en standaardvergelijking](https://learn.microsoft.com/nl-nl/dynamics365/business-central/dev-itpro/upgrade/comparing-and-merging-application-object-source-files)
- [TryFunctions en foutafhandeling in 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, werkdatum en neveneffecten](https://www.microsoft.com/en-us/dynamics-365/blog/it-professional/2015/10/19/test-isolation-in-the-application-test-automation-suite/)
- [Taalvergelijking: opties bestaan ook in AL](https://learn.microsoft.com/nl-nl/dynamics365/business-central/dev-itpro/developer/methods-auto/option/option-data-type)
- [CHANGECOMPANY en triggercontext (AL-referentie)](https://learn.microsoft.com/nl-nl/dynamics365/business-central/dev-itpro/developer/methods-auto/record/record-changecompany-method)
- [Permissions en indirecte rechten (AL-referentie)](https://learn.microsoft.com/nl-nl/dynamics365/business-central/dev-itpro/developer/properties/devenv-permissions-property)

[Zo combineren wij codeanalyse en AI](https://navtobc.de/nl/methoden)
