S/4HANA, CDS, RAP & Clean ABAP
De moderne ABAP-wereld: code pushdown naar HANA, geavanceerde CDS-features, AMDP, OData-services, het RESTful ABAP Programming Model (RAP), ABAP Cloud en de Clean-ABAP-principes.
01HANA & code pushdown
S/4HANA draait verplicht op HANA: een in-memory, kolomgeoriënteerde database. Dat draait een oude vuistregel om.
Klassiek (data-to-code)
- Database is traag/schaars → haal data zo snel mogelijk op
- Reken en aggregeer in ABAP, in interne tabellen
- "Houd de database dom"
HANA (code-to-data)
- Database is razendsnel in set-operaties
- Duw berekeningen, joins en aggregaties naar de database: code pushdown
- Gereedschap: moderne SQL-expressies, CDS-views, AMDP
Kolomgeoriënteerde opslag betekent ook: SELECT * is op HANA relatief duurder dan ooit (elke kolom is een aparte structuur), en klassieke secundaire indexes zijn grotendeels overbodig geworden. De adviezen uit SQL-performance blijven gelden — alleen de reden verschuift.
02CDS-views verdiept
De basis staat bij ABAP SQL & CDS; hier de features die CDS tot méér maken dan een database-view: associaties, annotaties en toegangscontrole.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Verkooporders met klant'
define view entity Z_I_SalesOrder
as select from vbak
association [1..1] to kna1 as _Klant
on $projection.kunnr = _Klant.kunnr
{
key vbak.vbeln,
vbak.kunnr,
vbak.netwr,
@Semantics.currencyCode: true
vbak.waerk,
-- expressies rechtstreeks in de view (pushdown!):
case when vbak.netwr > 10000 then 'GROOT' else 'KLEIN' end as OrderKlasse,
_Klant -- associatie mee-exposen
}
- Associaties — gedeclareerde relaties ("joins on demand") die pas uitgevoerd worden als een gebruiker het pad volgt:
Z_I_SalesOrder\_Klant-name1in een query, of navigatie in een Fiori-app. - Annotaties (
@...) — metadata met gevolgen:@Semantics(valuta/eenheid-koppeling),@UI(genereert Fiori Elements-schermen),@Analytics(maakt de view een analytische kubus),@OData.publish(genereert direct een OData-service). - DCL / toegangscontrole — een bijbehorende access control (DCL-bestand) filtert rijen automatisch op de autorisaties van de gebruiker — de
@AccessControl-annotatie hierboven verwijst ernaar. - Virtual Data Model (VDM) — SAP's eigen CDS-laag in S/4HANA, met naamgeving
I_...(interface views) enC_...(consumption views). Advies: bouw opI_-views in plaats van rechtstreeks op tabellen. define view entityis de moderne vorm; oudere views metdefine view+@AbapCatalog.sqlViewName(DDIC-based) kom je nog veel tegen.
03AMDP — database-procedures in ABAP-classes
Kan een berekening niet in SQL of CDS uitgedrukt worden, dan is er AMDP (ABAP Managed Database Procedures): methods waarvan de body in SQLScript (HANA's proceduretaal) is geschreven, maar die beheerd en getransporteerd worden als gewone ABAP-class.
CLASS zcl_omzet DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb. " markeert: hier zit AMDP in
CLASS-METHODS omzet_per_klant
IMPORTING VALUE(iv_jaar) TYPE gjahr
EXPORTING VALUE(et_omzet) TYPE ztt_omzet.
ENDCLASS.
CLASS zcl_omzet IMPLEMENTATION.
METHOD omzet_per_klant BY DATABASE PROCEDURE FOR HDB
LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING vbak.
-- vanaf hier SQLScript, geen ABAP:
et_omzet = SELECT kunnr, SUM(netwr) AS omzet
FROM vbak
WHERE gjahr = :iv_jaar
GROUP BY kunnr;
ENDMETHOD.
ENDCLASS.
- Alleen te bewerken in Eclipse/ADT; alleen op HANA uitvoerbaar.
- Parameters gaan by value; gebruikte tabellen/views moeten in de
USING-lijst staan. - Gebruik het spaarzaam: eerst gewone ABAP SQL, dan CDS, en pas AMDP als het echt niet anders kan (bijv. iteratieve berekeningen over grote datasets, window-functies die je release nog niet in SQL kent).
04OData-services
OData is een op HTTP/REST gebaseerde standaard voor data-API's — het protocol waarmee Fiori en externe systemen met de ABAP-backend praten, en functioneel de opvolger van RFC/BAPI voor nieuwe interfaces.
# alles is een URL — voorbeeld-requests:
GET /sap/opu/odata/sap/ZSD_ORDER_SRV/OrderSet # lijst
GET /sap/opu/odata/sap/ZSD_ORDER_SRV/OrderSet('0000012345') # één order
GET .../OrderSet?$filter=Kunnr eq '1000'&$top=50&$expand=Items
POST/PATCH/DELETE voor aanmaken/wijzigen/verwijderen
- Entiteiten & sets — een service beschrijft entiteitstypen (Order, OrderItem) met properties en navigaties; de metadata zijn zelf opvraagbaar (
$metadata). - Queryopties —
$filter,$select,$orderby,$top/$skip(paginering),$expand(navigaties meenemen). - SAP Gateway — de ABAP-component die OData serveert. Klassiek bouw je een service in
SEGW: het systeem genereert provider-classes waarvan je de methoden (GET_ENTITYSET,CREATE_ENTITY…) implementeert of "mapt" op een BAPI of CDS-view. - Modern — met de annotatie
@OData.publish: trueop een CDS-view, of via service definitions/bindings in RAP, is nauwelijks nog handwerk nodig. Activeren/monitoren van services:/IWFND/MAINT_SERVICE, foutlog:/IWFND/ERROR_LOG. - V2 vs V4 — OData V4 is de huidige standaard (efficiënter, rijker datamodel); V2-services vormen nog de meerderheid in bestaande systemen.
05RAP — het RESTful ABAP Programming Model
RAP is SAP's voorgeschreven model voor nieuwe transactionele apps: een vaste architectuur waarin CDS het datamodel levert, een behavior definition het gedrag beschrijft, en het framework de hele OData-service en Fiori-UI genereert.
De bouwstenen
| Object | Rol |
|---|---|
| CDS view entity | Datamodel: de business object-structuur (root + child-entiteiten, bijv. Order + Items) |
| Behavior definition (BDEF) | Declareert wat kan: create; update; delete;, acties (action vrijgeven;), validaties, determinations, locking, draft |
| Behavior implementation | ABAP-class (...FOR BEHAVIOR OF...) met de logica achter validaties, determinations en acties |
| Service definition + binding | Welke entiteiten naar buiten gaan, en via welk protocol (OData V2/V4, UI of API) |
" fragment van een behavior definition:
managed implementation in class zbp_i_order unique;
define behavior for Z_I_Order alias Order
persistent table ztorder
lock master
{
create;
update;
delete;
action vrijgeven result [1] $self;
validation controleer_klant on save { create; update; }
}
- Managed vs unmanaged — managed: het framework verzorgt lezen, schrijven, locken en transacties zelf (nieuwbouw op eigen Z-tabellen); unmanaged: jij implementeert alles zelf, bijv. bovenop bestaande BAPI's.
- Draft — ingebouwde "concept"-ondersteuning: halverwege stoppen en later verdergaan, zonder eigen tussentabellen.
- EML (Entity Manipulation Language) — nieuwe ABAP-statements om vanuit code met RAP-objecten te praten:
READ ENTITIES,MODIFY ENTITIES,COMMIT ENTITIES— de RAP-tegenhanger van BAPI-aanroep + commit.
06ABAP Cloud, BTP & Steampunk
"ABAP Cloud" is het ontwikkelmodel voor de cloudwereld: alleen vrijgegeven API's, alleen moderne objecttypen — afgedwongen door het systeem zelf.
- SAP BTP, ABAP environment (codenaam Steampunk) — een volledig door SAP beheerde ABAP-runtime in de cloud, los van S/4HANA. Ontwikkeling uitsluitend in Eclipse/ADT en met git (gCTS/abapGit) in plaats van klassieke transporten.
- Embedded Steampunk — hetzelfde model bínnen S/4HANA Cloud (en optioneel on-premise): maatwerk in een afgeschermde "tenant", strikt gescheiden van de SAP-kern ("keep the core clean").
- Released API's — in ABAP Cloud mag je alleen objecten gebruiken die SAP expliciet heeft vrijgegeven (contract C1); directe SELECT's op SAP-tabellen of aanroep van willekeurige functiemodules blokkeert de compiler/ATC. Vrijgegeven alternatieven zijn CDS-views (
I_...) en BAPI-vervangende API-classes. - Geen SAP GUI — geen dynpro's, geen WRITE-lijsten; UI = Fiori, services = OData/RAP.
- Taalversies — een object heeft een taalversie: Standard ABAP (alles mag), ABAP for Cloud Development (het strikte cloudprofiel). Dezelfde broncode kan dus in het ene profiel wel en het andere niet compileren.
07Clean ABAP — de moderne stijlgids
"Clean ABAP" is de breed geadopteerde, door SAP gepubliceerde stijlgids (afgeleid van Clean Code). De kernpunten, met het waarom:
- Kleine methods met één taak — liever tien leesbare methods van tien regels dan één van honderd; namen zeggen wát, de body hoe.
- Betekenisvolle namen zonder Hongaarse prefixen — Clean ABAP raadt
lv_/ls_-prefixen (zie naamgeving) af omdat types al door het systeem bewaakt worden. In de praktijk botst dit met bestaande huisstandaarden — volg de standaard van het project. - RETURNING boven EXPORTING — functionele methods (
rv_result) maken aanroepen nestbaar en testbaar. - Class-based exceptions boven sy-subrc en klassieke EXCEPTIONS — zie exception handling.
- Geen dode code, geen commentaar dat de code naspreekt — commentaar legt waarom uit, niet wat; versiebeheer bewaart de historie, niet uitgecommentarieerde blokken.
- Constructor injection & interfaces — afhankelijkheden via de constructor binnenbrengen (als interface, zie interfaces) maakt classes testbaar met test doubles in ABAP Unit.
- Moderne syntax waar het de leesbaarheid dient —
VALUE,COND, inline-declaraties (zie moderne syntax) — maar niet nesten tot onleesbaarheid.
De volledige gids staat op GitHub: github.com/SAP/styleguides (ook in het Nederlands vertaald beschikbaar). Veel ATC-varianten bevatten checks die rechtstreeks op Clean ABAP gebaseerd zijn ("Code Pal for ABAP").