Kennismaking met de SAP-programmeertaal ABAP
Klantrelaties, logistiek, boekhouding – in bijna alle grote ondernemingen wordt gebruikgemaakt van SAP. De bijbehorende programmeertaal is ABAP, en ABAP-programmeurs zijn veelgevraagd. Kennismaken met de taal kan ook zonder eigen SAP-omgeving.
De TIOBE-index claimt de populariteit van programmeertalen te meten. Op die ranglijst staat de taal ABAP slechts op de 36e plaats, maar dat doet geen recht aan het belang van de taal. Per slot van rekening zijn 98 van de 100 grootste bedrijven ter wereld klant van SAP en zijn alle SAP-klanten samen verantwoordelijk voor 84 procent van de wereldhandel. Dat is tenminste wat SAP zelf beweert.
Klanten gebruiken de Enterprise Resource Planning (ERP) software van SAP en die software wordt geprogrammeerd in ABAP. De taal is onlosmakelijk verbonden met SAP’s ERP-software en de technische basis daarvan, het ABAP-platform. In de afgelopen 50 jaar heeft het zich ontwikkeld van een ‘algemeen documentanalyseprogramma’ tot een moderne gereedschapskist.
Er zijn belangrijke redenen om vertrouwd te raken met de programmeertaal ABAP en het bijbehorende ecosysteem. Als je voor een SAP-klant werkt, zelf SAP-software gebruikt en problemen wilt oplossen in ABAP, of als je als softwareontwikkelaar op zoek bent naar een lucratief nieuw werkterrein, dan is het zeker de moeite waard om er eens naar te kijken.
Dit artikel geeft je inzicht in wat je kunt verwachten van programmeren in ABAP en hoe je je eigen code kunt schrijven en testen.
Verder lezen?
Laat je e-mailadres achter en lees dit artikel direct gratis verder. Daarnaast ontvang je onze wekelijkse nieuwsbrief, zodat je op de hoogte blijft van alles wat speelt in de (zakelijke) techwereld.
Achtergrond
In de begindagen van SAP maakten de oprichters het voor het eerst mogelijk om gegevens op een praktische manier realtime te verwerken. Gebruikers konden boekingen of goederenbewegingen direct in een computerterminal invoeren in schermmaskers, zogenaamde Dynpros (dynamische programma’s), en die gegevens afdrukken in lijsten.
Er werd een reeks assembler-macro’s ontwikkeld om de gegevens uit de database te selecteren en als lijst op te maken. In de loop der jaren werden die macro’s gebruikt om de ABAP-programmeertaal te ontwikkelen.
Met het product R/2 werden gegevensdefinities die nodig waren voor alle programma’s centraal opgeslagen in een zogenaamde Data Dictionary en ABAP werd voortaan ABAP/4 genoemd.
Met R/3 werd de systeemarchitectuur omgezet naar een drielaagse client-server architectuur. Ook werd de SAP-kernel volledig opnieuw geïmplementeerd in C, zodathet mogelijk was om het te kunnen draaien op UNIX-systemen.
SAP ontwikkelde vevolgens de SAP-GUI for Windows voor de presentatielaag. Daarnaast werden alle overgebleven assembler-macro’s uit het R/2-tijdperk volledig opnieuw geïmplementeerd in ABAP/4.
In de jaren negentig werd ABAP vervolgens uitgebreid tot een objectgeoriënteerde taal. Met de release 4.6C van SAP R/3 in december 1999 werd ABAP Objects officieel en volledig geïntegreerd in de SAP-standaard en verving het puur procedureel programmeren.
Met de introductie van de SAP Business Suite 2003 werden de zakelijke softwaresuite (SAP Business Suite) en de technische basis (aanvankelijk SAP Web Application Server, later SAP NetWeaver) op de markt gebracht als onafhankelijke producten met hun eigen namen.
Het NetWeaver-tijdperk zag ook de ontwikkeling van ABAP Core Data Services, waarmee ontwikkelaars datamodellen kunnen definiëren die de klassieke ABAP-dictionary-weergave aanvullen met semantische informatie. Sindsdien is het bijvoorbeeld mogelijk om teksten voor gebruikers in verschillende talen op te slaan, de gebruikersinterface op te maken en relaties te leggen met gegevens uit andere datamodellen.
Rond 2011 ontwikkelde SAP de in-memory database SAP HANA en kort daarna SAP Fiori. Dat betekende dat ontwikkelaars toen JavaScript konden gebruiken om gebruikersinterfaces te ontwerpen die met een browser kunnen worden gebruikt.
De evolutie van ABAP
ABAP is samen met het bijbehorende platform vanaf 1976 uitgegroeid tot een moderne ontwikkelingstool.

SAP als platform
Met de introductie van SAPS/4HANA werd de technische basis omgedoopt tot ABAP Platform en begon de ontwikkeling van het ABAP Restful Application Programming Model (RAP). Met dat programmeermodel kunnen ontwikkelaars grotendeels gestandaardiseerde programma’s ontwikkelen waarvoor de ABAP runtime-omgeving hen voorziet van standaardfuncties voor het maken, lezen, wijzigen en verwijderen van gegevens. Ze hoeven alleen maar aan te geven welke van die functies ze nodig hebben.
SAP blijft zich verder ontwikkelen, zoals met de beschikbaarheid van de AI-assistent Joule binnen SAP-oplossingen.
Door de nauwe integratie van de ABAP-programmeertaal met het ABAP-platform, moet je als ABAP-programmeur niet alleen de ABAP-programmeertaal beheersen, maar ook het platform zelf kennen en rekening houden met de regels van het ontwikkelen op dat platform.
Dat begint al met het feit dat je je programma’s niet opslaat in bestanden zoals bij andere talen, maar in de database van een ABAP-systeem. In de SAP-wereld wordt dat gedeelte van de database de ABAP-repository genoemd.
Voor professionele ABAP-ontwikkeling heb je dus een ontwikkelomgeving nodig waarmee je toegang hebt tot deze opslagplaats. Met de ABAP Development Tools (ADT) levert SAP zelf plug-ins voor de geïntegreerde ontwikkelomgeving Eclipse, die je kunt gebruiken om toegang te krijgen tot de repository en ABAP-programma’s te ontwikkelen.
Zoals je in de afbeelding hieronder kunt zien, is de ABAP-repository hiërarchisch georganiseerd in pakketten en elk repository-object moet worden toegewezen aan precies één van die pakketten. De afbeelding laat ook zien dat het archief niet alleen programmacode bevat (in de map Source Code Library), maar ook veel andere repository-objecten.
Lagen in ABAP-systemen
ABAP-systemen zijn client-server-systemen met 3 lagen: een datalaag, een applicatielaag en een presentatielaag.

Van idee naar programma
Zodra je een programma hebt opgeslagen in de ABAP-repository, is het direct beschikbaar voor alle andere gebruikers van het systeem. Om ervoor te zorgen dat jij en je collega-ontwikkelaars de productieve werkzaamheden in het bedrijf niet verstoren, werk je met een ontwikkelsysteem dat speciaal voor dat doel opgezet is.
Nieuwe ontwikkeling en wijzigingen van het ontwikkelteam worden daar vastgelegd in een zogenaamd transportverzoek (wijzigingsverzoek), dat eerst moet worden aangemaakt door de projectmanager. Als het team klaar is met het ontwikkelwerk, geeft de transportmanager het transportverzoek vrij, zodat het eerst door de basisbeheerders naar een kwaliteitsborgingssysteem kan worden getransporteerd.
De medewerkers van de specialistische afdelingen testen daar dan hun programma’s en staan pas na succesvol testen toe dat ze naar het productieve systeem worden getransporteerd. Wat bij de SAP-wereld is ingeburgerd, is vergelijkbaar met CI/CD-omgevingen (zoals GitHub Actions, GitLab of Jenkins) met releaseprocessen die gebruikelijk zijn in andere gebieden van softwareontwikkeling.
Het is ook belangrijk om te weten hoe programma’s worden uitgevoerd door een ABAP-systeem. ABAP-systemen zijn drielaagse client-server systemen. Op de databaselaag bevindt zich een relationeel databasesysteem dat de ABAP-archiefobjecten opslaat, evenals configuratiegegevens voor de programma’s en de bedrijfsgegevens (stamgegevens zoals zakenpartners en transactiegegevens zoals verkooporders).
Op de applicatielaag voeren een of meer applicatieservers hun taken uit en voeren ze de ABAP-programma’s uit voor de gebruikers van het ABAP-systeem. Die starten de ABAP-programma’s via acties in een clientprogramma op hun eindapparaat, voeren daar informatie in waarmee de ABAP-programma’s moeten werken en krijgen daar ook de resultaten van de programma-uitvoering te zien.
Lange tijd was het belangrijkste clientprogramma voor eindgebruikers (en ontwikkelaars) de SAP-GUI voor Windows, die nu is vervangen door het Fiori Launchpad. Dat is een webapplicatie die werkt in elke moderne browser op elk eindapparaat (desktops, tablets of smartphones), terwijl de SAP-GUI voor Windows alleen op Windows draait.
Sommige ontwikkelaars gebruiken de SAP-GUI voor Windows nog steeds, maar sinds enkele jaren gebruiken ze ook steeds vaker ADT in Eclipse om te communiceren met de ABAP-server en in het bijzonder met de ABAP-repository.

Testen zonder SAP
Als je ABAP serieus wilt bekijken, heb je absoluut toegang nodig tot een ABAP-systeem waarop je ook kunt ontwikkelen. Maar om een eerste indruk te krijgen van de programmeertaal en de syntaxis, heb je alleen een browser nodig. Je kunt de voorbeelden in dit artikel testen met een vrij toegankelijke tool op internet. Daarvoor hoef je geen SAP-klant te zijn.
Open de abaplint Transpiler van ontwikkelaar Lars Hvam, die je kunt vinden op transpiler.abaplint.org. In die omgeving kun je ABAP-code direct in de browser typen en uitvoeren.

In het linkervenster is er ruimte voor de ABAP-code, in de middelste kolom wordt die code vertaald (getranspileerd) naar JavaScript en in het rechtervenster wordt de uitvoer van het programma weergegeven. Als je enigszins bekend bent met JavaScript, helpt de directe vertaling je om de syntaxis van ABAP sneller te doorgronden.
De coderegel WRITE 'hello'., waarmee de pagina je standaard begroet, laat al zien hoe ABAP-programma’s in principe opgebouwd zijn. Ze bestaan uit een reeks instructies die worden ingeleid met een sleutelwoord (in dit geval dus WRITE), aangevuld met sleutelwoordspecifieke toevoegingen (in dit geval de tekenreeks 'hello'). Het geheel wordt afgesloten met een punt.
Met die grammatica volgt ABAP het voorbeeld van COBOL, de Common Business Oriented Language die in 1959 werd ontwikkeld onder leiding van computerpionier Grace Hopper (en die ABAP ver achter zich laat met plaats 23 op de TIOBE-index).
Eerste programma
Genoeg inleiding, tijd voor het eerste programma. Het voorbeeld voor dit artikel is bedoeld om de voor- en achternaam van een persoon vast te leggen en uit te voeren in een dataobject. Je kunt de volledige code vinden in de listing hieronder en ook als download.
REPORT zct_hello.
* Klassedefinitie
CLASS lcl_person DEFINITION.
PUBLIC SECTION.
METHODS constructor
IMPORTING
i_first_name TYPE string
i_last_name TYPE string.
METHODS write_to_list.
PRIVATE SECTION.
DATA m_first_name TYPE string.
DATA m_last_name TYPE string.
ENDCLASS.
* Klasse-implementatie
CLASS lcl_person IMPLEMENTATION.
METHOD constructor.
me->m_first_name = i_first_name.
me->m_last_name = i_last_name.
ENDMETHOD.
METHOD write_to_list.
WRITE me->m_first_name.
WRITE ' '.
WRITE me->m_last_name.
ENDMETHOD.
ENDCLASS.
* Datadeclaratie
DATA o_person TYPE REF TO lcl_person.
* Programma-uitvoering
START-OF-SELECTION.
o_person = NEW #(
i_first_name = 'Frank'
i_last_name = 'Verhoeven'
).
o_person->write_to_list( ).
Het programma begint met een inleidend statement dat het type specificeert. In dit geval is het een REPORT. Dat is de naam van een programma dat een rapport in lijstvorm maakt. Het sleutelwoord REPORT wordt gevolgd door de naam van het programma (zct_hello) en het hele statement wordt afgesloten met een punt – zoals alle ABAP-statements. Dat kun je eenvoudig controleren bij het doornemen van de code.
In de tweede regel zie je nog een eigenaardigheid van ABAP. Commentaarregels beginnen met een * in de – en dat is met name belangrijk – eerste kolom van een regel.
Er is nog een andere manier om commentaar te plaatsen: als je ergens dubbele aanhalingstekens '' schrijft, markeer je de rest van de regel als commentaar. Commentaar wordt gebruikt om het programma uit te leggen aan de menselijke lezer en wordt genegeerd wanneer het programma uitgevoerd wordt.
Klassen en objecten
Het sleutelwoord CLASS verraadt het al: ABAP kan objectgeoriënteerd worden geschreven. Net als in C++ definieer je eerst een klasse (CLASS lcl_person DEFINITION.) voordat je de code ervoor implementeert (CLASS lcl_person IMPLEMENTATION.).
De instanties van de klasse uit het voorbeeld moeten personen met voor- en achternamen voorstellen. Net als C++ of Java ondersteunt ABAP het principe van inkapseling en verdeelt het de variabelen van een klasse in publieke (PUBLIC SECTION.), beschermde en private (PRIVATE SECTION.) gebieden. Alleen de publieke variabelen van een klasse kunnen worden gebruikt door programmacode buiten de klasse.
Declaratie
Een instantie van de klasse lcl_person slaat de voor- en achternaam van een persoon op in de twee private attributen m_first_name en m_last_name. Je begint de declaratie van dataobjecten – dataobjecten zijn voor de ABAP-ontwikkelaar wat variabelen zijn voor andere programmeurs – met het sleutelwoord DATA, gevolgd door de naam van het dataobject.
Dat wordt gevolgd door het trefwoord TYPE, waarmee je het type gegevens specificeert dat je wilt opslaan in het dataobject. In ons geval wil je een reeks tekens opslaan en ABAP herkent daarvoor het gegevenstype string.
ABAP is een statisch getypeerde programmeertaal. Elk dataobject heeft een datatype dat tijdens runtime niet kan veranderen, in tegenstelling tot bij programmeertalen als JavaScript en Python. Gegevensdeclaraties binnen de klasse moeten ook worden afgesloten met een punt.
In het publieke deel van de klasse gebruiken we het sleutelwoord METHODS om twee methoden te definiëren, dat wil zeggen uitvoerbare code van de klasse die kan worden aangeroepen door programmacode buiten de klasse.
De constructor, die altijd de gereserveerde naam constructor moet hebben, is verantwoordelijk voor het initialiseren van de twee instantie-attributen.
Daarvoor heeft hij de twee importparameters i_first_name en i_last_name nodig, die door de aanroepende code moeten worden meegegeven. In tegenstelling tot C++ kent ABAP geen overload van constructors, dus je kunt maar één constructor per keer definiëren.
De tweede methode, write_to_list, heeft geen parameters en is bedoeld om de voor- en achternaam van de persoon in een afdruklijst weer te geven.
De implementatie van de methoden volgt daarna. De code volgt tussen de sleutelwoorden METHOD en ENDMETHOD. De constructor neemt de twee importparameters i_first_name en i_last_name en kopieert hun waarde naar de twee instantie-attributen m_first_name en m_last_name.
Binnen elke instantie-methode is er een referentievariabele genaamd me, die je kunt gebruiken om toegang te krijgen tot de attributen en methoden van het object via welke de instantie-methode werd aangeroepen. In C++ of Java is er de referentievariabele this, in Python speelt self die rol.
In de implementatie van de methode write_to_list schrijven de WRITE-instructies eerst de voornaam, dan een spatie en dan de achternaam in een afdruklijst.
De klasse lcl_person wordt gedefinieerd en geïmplementeerd, waarna in de code de referentievariabele o_person volgt, die een instantie moet bevatten van de klasse lcl_person tijdens de runtime van het programma.
Net als bij Java, C++ of JavaScript moet je die instantie tijdens het uitvoeren van het programma eerst aanmaken met de NEW-operator voordat je hem kunt gebruiken.
Het programma starten
Dat gebeurt in het uitvoerbare deel van het programma, dat wordt geïntroduceerd door het sleutelwoord START-OF-SELECTION. Dat sleutelwoord is een overblijfsel uit de tijd dat ABAP nog een ‘algemeen document analyseprogramma’ was en markeert het moment waarop de gegevens uit de database worden geselecteerd en vervolgens worden uitgevoerd in een afdruklijst.
In de voorbeeldcode wordt een instantie van de klasse lcl_person aangemaakt en een referentie opgeslagen in de referentievariabele o_person. De importparameters i_ first_name en i_last_name van de constructor bevatten de tekenreeksen Frank en Verhoeven.
Vervolgens kun je werken met het nieuw aangemaakte object. Dat gebeurt in de laatste regel waarin de methode write_to_list wordt aangeroepen.
Het resultaat wordt weergegeven in de transpiler in het rechtervenster in de lijstuitvoer.
ABAP in de echte wereld
Dit voorbeeld heeft je vertrouwd gemaakt met de syntaxis en structuur van ABAP-programma’s. Als je ABAP serieuzer wilt bekijken, heb je toegang nodig tot een echt ABAP-systeem.
Als je niet werkt voor een SAP-klant met een ontwikkelomgeving en je je verder wilt verdiepen, dan kun je de SAP BTP ABAP Environment gebruiken, die je kunt benutten met een gratis SAP BTP Trial Account.
Het SAP Business Technology Platform (BTP) is een Platform-as-a-Service (PaaS) van SAP, waarmee ontwikkelaars programma’s kunnen maken voor verschillende runtime-omgevingen en die daar ook kunnen uitvoeren. Een van die runtime-omgevingen is de SAP BTP ABAP Environment. Omdat het aanmaken van het gebruikersaccount en de omgeving niet helemaal triviaal is, heeft SAP twee tutorials gepubliceerd (die je kunt vinden via de link bij dit artikel) die je moet volgen.
De eerste tutorial is Get an Account on SAP BTP Trial. Daarin wordt uitgelegd hoe je een gratis gebruikersaccount aanmaakt, de SAP BTP Cockpit opent en een subaccount aanmaakt in jouw regio.
De tutorial Create an SAP BTP ABAP Environment Trial User laat vervolgens zien hoe je een ABAP-testomgeving aanmaakt. In een volgend artikel leer je hoe je een online testomgeving verbindt met de ontwikkelaarstools ADT en hoe je een ABAP-programma maakt voor het beheren van persoonsgegevens.
Michael Wegelin en Marco den Teuling
Praat mee