Programma-opbouw & selectieschermen
De soorten ABAP-objecten die je tegenkomt, de vaste event-structuur van een report, en hoe selectieschermen met PARAMETERS en SELECT-OPTIONS werken.
01Soorten ABAP-objecten
De verschillende "soorten" ABAP-code die je tegenkomt, en hoe ze zich tot elkaar verhouden.
| Objecttype | Wat het is | Aanmaken/bekijken |
|---|---|---|
| Report (executable) | Op zichzelf staand, direct uitvoerbaar programma — begint met REPORT zmijn_report. | SE38 / SE80 |
| Include | Stuk code dat in een ander programma wordt ingeladen met INCLUDE znaam. — puur om grote programma's op te delen. Een include is zelf niet uitvoerbaar. | SE38 |
| Function group | Container voor één of meer functiemodules, met eigen gedeelde (globale) data en eigen includes (TOP-include voor declaraties). | SE37 / SE80 |
| Class (globaal) | Op zichzelf staande class, systeembreed zichtbaar — zie OO-ABAP. | SE24 / ADT |
| Interface (globaal) | Contract dat classes kunnen implementeren — zie interfaces. | SE24 / ADT |
| Module pool | Ouder programmatype achter klassieke schermen (dynpro's), naam begint vaak met SAPMZ.... Wordt gestart via een transactiecode, niet direct. | SE80 |
| CDS-view | Database-view met semantische annotaties, gedefinieerd als broncode — zie CDS. | alleen ADT (Eclipse) |
| Transactiecode | Snelkoppeling (bijv. ZMIJN_APP) die een programma, scherm of class start. Standaardcodes: zie de transactiecode-index. | SE93 |
02Events in een klassiek report
Een executable report bestaat uit vaste "event"-blokken die de runtime in een vaste volgorde aanroept. Je schrijft dus geen main-functie: je vult blokken in.
REPORT zmijn_report.
INITIALIZATION.
" vóór het tonen van het selectiescherm: standaardwaarden zetten
p_datum = sy-datum.
AT SELECTION-SCREEN ON p_werk.
" validatie van één veld; MESSAGE type E houdt de gebruiker op het scherm
IF p_werk IS INITIAL.
MESSAGE 'Vul een werk (plant) in' TYPE 'E'.
ENDIF.
START-OF-SELECTION.
" hoofdlogica: data ophalen en verwerken
END-OF-SELECTION.
" afronding: resultaten tonen (bijv. ALV)
| Event | Moment |
|---|---|
LOAD-OF-PROGRAM | Eénmalig bij het laden van het programma in het geheugen. |
INITIALIZATION | Vóór het selectiescherm; ideaal voor standaardwaarden. |
AT SELECTION-SCREEN OUTPUT | Telkens vóór het (opnieuw) tonen van het selectiescherm; velden tonen/verbergen. |
AT SELECTION-SCREEN (evt. ON veld) | Na Enter/uitvoeren: invoervalidatie. Een MESSAGE type E toont de fout en laat het veld invoerbaar. |
START-OF-SELECTION | De hoofdverwerking. Als je géén event schrijft, valt losse code impliciet hieronder. |
END-OF-SELECTION | Na de hoofdverwerking; klassiek gebruikt voor output. |
TOP-OF-PAGE / END-OF-PAGE | Kop- en voetregels bij klassieke WRITE-lijsten. |
AT LINE-SELECTION / AT USER-COMMAND | Interactie op klassieke lijsten (dubbelklik, eigen knoppen). |
03Selectieschermen: PARAMETERS & SELECT-OPTIONS
Het selectiescherm is het invoerscherm dat SAP automatisch genereert uit declaraties in je code.
PARAMETERS — één invoerveld
PARAMETERS: p_werk TYPE werks_d OBLIGATORY, " verplicht veld
p_datum TYPE dats DEFAULT sy-datum, " met standaardwaarde
p_test TYPE xfeld AS CHECKBOX DEFAULT 'X', " checkbox
p_optie1 RADIOBUTTON GROUP grp1,
p_optie2 RADIOBUTTON GROUP grp1.
Veelgebruikte toevoegingen: OBLIGATORY (verplicht), DEFAULT, AS CHECKBOX, RADIOBUTTON GROUP, LOWER CASE (anders wordt invoer naar hoofdletters omgezet!), NO-DISPLAY (variabele bestaat wel, veld niet zichtbaar), MATCHCODE OBJECT (zoekhulp koppelen).
SELECT-OPTIONS — reeksen en meervoudige selectie
DATA: gv_matnr TYPE matnr. " referentieveld is verplicht
SELECT-OPTIONS: s_matnr FOR gv_matnr.
Een select-option is onder de motorkap een interne tabel met vier velden per regel — de zogeheten range-tabel:
| Veld | Betekenis | Voorbeeldwaarden |
|---|---|---|
SIGN | Insluiten of uitsluiten | I (include) / E (exclude) |
OPTION | Vergelijkingsoperator | EQ, BT (between), CP (pattern), GE, LE, NE… |
LOW | (Onder)waarde | 100 |
HIGH | Bovenwaarde (alleen bij BT) | 200 |
In een SELECT gebruik je hem met WHERE matnr IN s_matnr. Een lege range-tabel selecteert álles. Je kunt zelf ook range-tabellen declareren zonder scherm: DATA lr_matnr TYPE RANGE OF matnr. en vullen met VALUE #( ( sign = 'I' option = 'EQ' low = '100' ) ).
Opmaak van het scherm
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_werk TYPE werks_d.
SELECT-OPTIONS: s_matnr FOR gv_matnr.
SELECTION-SCREEN END OF BLOCK b1.
TEXT-001 verwijst naar een tekstsymbool: vertaalbare teksten die bij het programma horen (menu: Goto → Text Elements). Ook selectieteksten (labels naast de velden) beheer je daar — zo blijft het programma meertalig.
Varianten
Gebruikers kunnen ingevulde selectieschermen opslaan als variant en die later hergebruiken — essentieel voor achtergrondjobs, die altijd met een variant draaien. Dynamische datums (bijv. "altijd gisteren") regel je met variant-attributen (selection variables).
04Een net programma opbouwen
Hoe professionele reports doorgaans zijn georganiseerd.
- Includes per rol — klassiek patroon:
ZMIJN_REPORT_TOP(declaraties),..._SEL(selectiescherm),..._F01(routines/logica). Het hoofdprogramma bevat dan vrijwel alleenINCLUDE-regels en events. - Lokale class in het report — modern patroon: alle logica in een lokale class (
CLASS lcl_app DEFINITION ... IMPLEMENTATION), en de events roepen alleen methodes aan:lcl_app=>run( ).Zo is de logica testbaar en geordend — zie classes. - Meldingen aan de gebruiker via MESSAGE, nooit via ongecontroleerde dumps.
- Documentatieblok bovenin met auteur, datum, wijzigingshistorie en verwijzing naar het transportnummer — in veel organisaties verplicht.
"---------------------------------------------------------------
" Report : ZMM_VOORRAAD_OVERZICHT
" Auteur : J. Jansen Datum: 2026-07-01
" Doel : Voorraadoverzicht per plant met ALV-uitvoer
"---------------------------------------------------------------
REPORT zmm_voorraad_overzicht.
CLASS lcl_app DEFINITION.
PUBLIC SECTION.
CLASS-METHODS run.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
METHOD run.
" ... logica ...
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_app=>run( ).