Transacties, locks, berichten & autorisaties
De runtime-concepten van SAP: de SAP LUW en commit-logica, update-modules, locks (enqueue), nummerreeksen, systeemvelden, het MESSAGE-statement, autorisatiecontroles en batch-verwerking.
01SAP LUW, COMMIT WORK & de update-task
Een LUW (Logical Unit of Work) is een ondeelbare reeks databasewijzigingen: alles of niets. SAP maakt onderscheid tussen de database-LUW (die de database bij elke dialogstap impliciet afsluit) en de SAP-LUW, die meerdere dialogstappen kan overspannen en pas eindigt bij COMMIT WORK.
" Wijzigingen bundelen in de update-task:
CALL FUNCTION 'Z_SLA_OP_ORDER' IN UPDATE TASK
EXPORTING is_order = ls_order.
CALL FUNCTION 'Z_SLA_OP_HISTORIE' IN UPDATE TASK
EXPORTING is_hist = ls_hist.
COMMIT WORK AND WAIT. " nu pas draaien beide FM's — samen, of geen van beide
IN UPDATE TASKregistreert de FM alleen; uitvoering gebeurt gebundeld in een apart update-werkproces bijCOMMIT WORK. Mislukt er één, dan wordt alles teruggedraaid (en zie je de fout in SM13).COMMIT WORK AND WAITwacht tot de update-task klaar is — nodig als je direct daarna de data leest. KaleCOMMIT WORKis asynchroon.ROLLBACK WORKdraait de huidige SAP-LUW terug en gooit geregistreerde update-FM's weg.PERFORM ... ON COMMITregistreert een subroutine die (één keer, ook bij meervoudige registratie) bij de commit draait — veel gezien in user exits.- Let op verborgen commits: elke
CALL SCREEN, RFC-aanroep ofWAITbeëindigt de database-LUW. Daarom bestaat het hele update-task-mechanisme. - BAPI's +
BAPI_TRANSACTION_COMMITzijn een schil om ditzelfde mechanisme — zie BAPI's.
02Locks: ENQUEUE & DEQUEUE
SAP-locks zijn logische vergrendelingen op applicatieniveau (niet database-locks). Je definieert een lock-object in SE11 (naam begint met EZ of E_); het systeem genereert daarvoor twee FM's: ENQUEUE_<naam> en DEQUEUE_<naam>.
CALL FUNCTION 'ENQUEUE_EZORDER'
EXPORTING
vbeln = lv_vbeln
mode_vbak = 'E' " E=exclusief, S=gedeeld, X=exclusief niet-cumulatief
EXCEPTIONS
foreign_lock = 1 " iemand anders heeft hem
system_failure = 2
OTHERS = 3.
IF sy-subrc = 1.
MESSAGE i042(zx) WITH sy-msgv1. " sy-msgv1 bevat de blokkerende gebruiker
ENDIF.
" ... wijzigen ...
CALL FUNCTION 'DEQUEUE_EZORDER' EXPORTING vbeln = lv_vbeln.
- Locks zijn een afspraak: alleen programma's die netjes ENQUEUE aanroepen respecteren elkaar. Directe
UPDATE-statements trekken zich er niets van aan. - De parameter
_SCOPEbepaalt de levensduur:2(default) = lock gaat over naar de update-task en wordt na de commit vrijgegeven;1= alleen dialoogproces;3= beide. - Bij het einde van het programma worden resterende locks automatisch vrijgegeven. Actuele locks bekijken/verwijderen: transactie SM12.
- Standaardobjecten bestaan voor de meeste SAP-tabellen (bijv.
ENQUEUE_EVVBAKEvoor verkooporders).
03Nummerreeksen
Documentnummers (ordernummers, factuurnummers, eigen Z-nummers) komen uit number range objects, beheerd in transactie SNRO (intervallen: vaak via de module-eigen customizing).
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01'
object = 'ZORDER'
IMPORTING
number = lv_nummer
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
OTHERS = 8.
04Systeemvelden (sy-...)
De structuur sy (type SYST) is overal beschikbaar en wordt door het systeem gevuld. De belangrijkste velden:
| Veld | Inhoud |
|---|---|
sy-subrc | Returncode van het laatste statement (0 = succes). Hét veld van ABAP — check hem na SELECT, READ TABLE, FM-aanroepen, AUTHORITY-CHECK... |
sy-tabix | Regelnummer bij interne-tabelbewerkingen (LOOP, READ TABLE op index-tabellen). |
sy-index | Lustellerteller van DO/WHILE (níét van LOOP — dat is sy-tabix!). |
sy-dbcnt | Aantal verwerkte databaserijen. |
sy-datum / sy-uzeit | Datum/tijd van de applicatieserver; sy-datlo/sy-timlo in de tijdzone van de gebruiker. Zie datums. |
sy-uname | Aangemelde gebruiker. |
sy-mandt | Huidige client (mandant). ABAP SQL filtert hier automatisch op. |
sy-langu | Aanmeldtaal (voor tekst-selecties: WHERE spras = @sy-langu). |
sy-ucomm / sy-dynnr / sy-repid / sy-tcode | Functiecode (knop), schermnummer, programmanaam, transactiecode. |
sy-msgid/-ty/-no, sy-msgv1..4 | Onderdelen van de laatste melding. |
sy-batch | 'X' als het programma in de achtergrond draait. |
sy-subrc of sy-tabix direct op in een eigen variabele als je er ná een volgend statement nog iets mee wilt.05Meldingen: MESSAGE
Meldingen komen uit berichtklassen (transactie SE91): genummerde, vertaalbare teksten met tot vier &-plaatshouders.
MESSAGE e001(zmm) WITH lv_matnr. " fout, klasse ZMM, nr 001
MESSAGE s002(zmm). " succes (statusbalk)
MESSAGE 'Vrije tekst' TYPE 'I'. " zonder berichtklasse
MESSAGE e001(zmm) INTO DATA(lv_tekst). " niet tonen, alleen tekst ophalen
MESSAGE s003(zmm) DISPLAY LIKE 'E'. " rood tonen, maar niet afbreken
| Type | Gedrag (dialoog) |
|---|---|
S | Succes/status — statusbalk, programma gaat door. |
I | Informatie — pop-up, gaat door na OK. |
W | Waarschuwing — op selectieschermen: Enter = toch doorgaan. |
E | Fout — breekt de huidige verwerking af; op selectieschermen wordt het veld invoerbaar. |
A | Abort — pop-up, transactie eindigt volledig. |
X | Exit — forceert een dump (MESSAGE_TYPE_X). Alleen voor "dit kan echt niet"-situaties. |
Let op: het gedrag van E/W hangt af van de context (dialoog, achtergrond, update-task). In een achtergrondjob beëindigt een E-message de job. In methoden liever exceptions gooien en de MESSAGE pas op UI-niveau tonen.
06Autorisaties: AUTHORITY-CHECK
Autorisatieobjecten (SU21) bestaan uit maximaal tien velden. Een gebruiker heeft autorisaties in zijn rollen/profielen (PFCG); jouw code controleert ze expliciet — het systeem doet dat niet automatisch bij SELECT's!
AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
ID 'ACTVT' FIELD '03' " 01=aanmaken 02=wijzigen 03=tonen
ID 'WERKS' FIELD lv_werks.
IF sy-subrc <> 0.
MESSAGE e077(s#) WITH lv_werks. " geen autorisatie
ENDIF.
ID ... DUMMYslaat de controle op dat veld over.- Transactiestart wordt wél automatisch gecontroleerd via object
S_TCODE. - Mislukte controle analyseren: de gebruiker draait direct daarna transactie SU53 ("laatste mislukte autorisatiecheck"). Traceren: ST01/STAUTHTRACE.
- sy-subrc: 0 = ok, 4 = geen autorisatie, 12 = object niet in het gebruikersprofiel.
07Achtergrondjobs & batch input
Langlopende programma's draai je in de achtergrond: plannen in SM36, bewaken in SM37. Een job bestaat uit stappen (programma + variant) en een starttijd of trigger (event, na een andere job).
" Programmatisch een job plannen:
CALL FUNCTION 'JOB_OPEN'
EXPORTING jobname = lv_jobnaam
IMPORTING jobcount = lv_jobnr.
SUBMIT zr_mijn_rapport WITH p_werks = lv_werks
VIA JOB lv_jobnaam NUMBER lv_jobnr AND RETURN.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING jobname = lv_jobnaam jobcount = lv_jobnr
strtimmed = abap_true. " direct starten
- In de achtergrond is er geen scherm: geen pop-ups, geen
CALL SCREEN. Checksy-batchen schrijf voortgang metMESSAGE ... TYPE 'S'(komt in de joblog) of het application log (BAL_LOG_*-FM's, bekijken in SLG1). SUBMITzonder job start een ander programma in dezelfde sessie:SUBMIT zr_x WITH p_y = 1 AND RETURN.— metEXPORTING LIST TO MEMORYvang je zelfs de uitvoer op.
Batch input (BDC) & CALL TRANSACTION
Voor massaverwerking via bestaande transacties zonder BAPI: je bouwt een tabel met schermvolgorde en veldwaarden (op te nemen met de recorder in SM35/SHDB) en speelt die af.
DATA lt_bdc TYPE STANDARD TABLE OF bdcdata.
" gevuld met program/dynpro/dynbegin en fnam/fval-regels ...
CALL TRANSACTION 'MM02' USING lt_bdc
MODE 'N' " N=onzichtbaar, A=alles tonen, E=alleen bij fouten
UPDATE 'S' " S=synchroon
MESSAGES INTO lt_meldingen.
BDC is fragiel (schermwijzigingen breken de opname); gebruik waar mogelijk een BAPI. Maar in de praktijk kom je BDC's nog overal tegen, zeker in migratieprogramma's.
08Geheugen: ABAP memory & SAP memory
Twee mechanismen om data tussen programma's door te geven zonder database:
- ABAP memory (binnen één sessie/hoofdprogrammaketen):
EXPORT lt_data TO MEMORY ID 'ZKEY'.en in het aangeroepen programmaIMPORT lt_data FROM MEMORY ID 'ZKEY'.Werkt bijvoorbeeld overSUBMIT ... AND RETURNheen. - SAP memory (hele gebruikerssessie, alle vensters): SET/GET-parameters.
SET PARAMETER ID 'MAT' FIELD lv_matnr.vult o.a. schermvelden automatisch voor (dezelfde parameter-ID's als in SU3/gebruikersprofiel). Klassiek duo metCALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN. - Voor gedeeld geheugen tussen gebruikers/sessies bestaan shared objects (area classes) — zeldzamer in de praktijk.