C/AL

Uit Wikipedia, de vrije encyclopedie

C/AL (C/SIDE® Application Language of ook Client/Server Application Language) is een programmeertaal die binnen Microsoft Dynamics NAV (voorheen ook Navision Atain) en Microsoft 365 Business Central tot en met versie 14 gebruikt kon worden, om dit ERP systeem aan te passen. De syntaxis is gebaseerd op Pascal. In nieuwere versies van Microsoft Business Central is de taal vervangen door AL.

Programmeertaal[bewerken | brontekst bewerken]

De C/AL programmeertaal staat op zich los van Navision. De functionaliteit van het ERP systeem Navision is geprogrammeerd in deze taal. Ontwikkelaars die het ERP systeem willen aanpassen hebben toegang tot de sourcecode van dit systeem, en kunnen dit aanpassen. Dus ontwikkelen in Navision bestond uit twee onderdelen: de programmeertaal C/AL leren kennen, en de werking van de bestaande objecten en standaardfuncties die specifiek voor Navision zijn, begrijpen.

Vanaf Navision versie 5.0 en later zou C/AL afgeschaft worden en zou overgegaan worden naar .NET met mogelijkheid om codesnippets C/AL te gebruiken. Echter bleef de programmeertaal op zich dezelfde.

C/AL is Event-gebaseerd, niet object-georiënteerd. Bijna alle functies die Navision biedt, zijn in C/AL geprogrammeerd en aldus ook beschikbaar aan de Solution Centers. Dit betekent dus dat Navision volledig kan aangepast worden aan de noden van de gebruiker. Gebruikerstoegang tot de C/AL code kan optioneel verkregen worden via de licentie. Zo krijgen programmeurs de mogelijkheid om zo het programma aan te passen of uit te breiden volgens hun noden.

Er bestaan ook veel extra modules, dat zijn extra onderdelen die door Solution Centra gecreëerd zijn en te koop aangeboden worden. Ook deze objecten worden vergrendeld of vrijgegeven in de licentie. De gecreëerde objecten kunnen simpel geïmporteerd of geëxporteerd worden via een binaire of tekstuele export-/importfunctie.

Sinds Navision versie 2009 is het mogelijk om .NET te gebruiken (als datatype DotNet). Echter enkel in de rolgebaseerde client. Het is niet mogelijk om het .NET framework rechtstreeks aan te roepen vanuit C/AL, maar enkel een uitgebreide groep van beschikbaar gestelde bibliotheken. De reden dat de .NET functionaliteit niet rechtstreeks beschikbaar is, heeft te maken met de eigen objecten van Navision die intern ook .NET zijn (een record in .NET is bijvoorbeeld een NAVRecord class) . Op deze manier kan afgeblokt worden dat de gebruikers Navision objecten aangeroepen en deze misbruiken. Iedere versie van Navision heeft daarom telkens ook slechts een versie van .NET framework beschikbaar. Een nieuwe versie installeren van het .NET framework, maakt het niet mogelijk deze in C/AL code te gebruiken. Een omweg die wel mogelijk was, is het maken van COM objecten. Deze los staande objecten konden wel geprogrammeerd worden in .NET, maar staan in principe los van de C/AL runtime omgeving.

Met Navision versie 2013 werd het mogelijk om ook in de application server (Navision service die gebruikerscode kan uitvoeren) .NET te gebruiken.

Voorbeelden[bewerken | brontekst bewerken]

Hello World[bewerken | brontekst bewerken]

Dit is het klassiek Hello World voorbeeld. Aangezien C/SIDE geen console heeft om output te tonen, gebruikt dit voorbeeld een dialoog scherm.

  MESSAGE('hello, world');

Filteren en ophalen records[bewerken | brontekst bewerken]

Variabelen in C/AL zijn niet gedefinieerd in de code, maar door variable declaratie in het menu van editor. In dit voorbeeld Item verondersteld een variabele van het type Record te zijn.

  IF Item.GET('31260210') THEN
    MESSAGE('Item name is: %1',Item.Description);

  Item.RESET;
  Item.SETFILTER("No.", '%1..%2', FromItem, ToItem);
  Item.FINDLAST;

Looping en data manipulatie[bewerken | brontekst bewerken]

Looping door een volledige recordset en het wijzigen van individuele records wordt bekomen door slechts een beperkt aantal lijnen code.

  Item.RESET;
  Item.SETRANGE("Blocked",TRUE);
  IF Item.FINDSET THEN
    REPEAT
      IF Item."Profit" < 10 THEN BEGIN
        Item.VALIDATE("Profit %", 10);
        Item.MODIFY(TRUE);
      END;
    UNTIL Item.NEXT = 0;
  Item.MODIFYALL("Blocked",FALSE);