ABAP & SAP SAP-platform
SAP-platform

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.

Op deze pagina

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

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.

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.
Gaten zijn normaal — met buffering (main memory buffering in SNRO) haalt elke applicatieserver een blok nummers tegelijk op. Snel, maar bij een herstart gaan ongebruikte nummers verloren en is de volgorde over servers heen niet chronologisch. Eis je een sluitende reeks (wettelijke factuurnummering!), zet buffering dan uit — en accepteer het performanceverlies door serialisatie.

04Systeemvelden (sy-...)

De structuur sy (type SYST) is overal beschikbaar en wordt door het systeem gevuld. De belangrijkste velden:

VeldInhoud
sy-subrcReturncode van het laatste statement (0 = succes). Hét veld van ABAP — check hem na SELECT, READ TABLE, FM-aanroepen, AUTHORITY-CHECK...
sy-tabixRegelnummer bij interne-tabelbewerkingen (LOOP, READ TABLE op index-tabellen).
sy-indexLustellerteller van DO/WHILE (níét van LOOP — dat is sy-tabix!).
sy-dbcntAantal verwerkte databaserijen.
sy-datum / sy-uzeitDatum/tijd van de applicatieserver; sy-datlo/sy-timlo in de tijdzone van de gebruiker. Zie datums.
sy-unameAangemelde gebruiker.
sy-mandtHuidige client (mandant). ABAP SQL filtert hier automatisch op.
sy-languAanmeldtaal (voor tekst-selecties: WHERE spras = @sy-langu).
sy-ucomm / sy-dynnr / sy-repid / sy-tcodeFunctiecode (knop), schermnummer, programmanaam, transactiecode.
sy-msgid/-ty/-no, sy-msgv1..4Onderdelen van de laatste melding.
sy-batch'X' als het programma in de achtergrond draait.
Valkuil — systeemvelden worden voortdurend overschreven. Sla 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
TypeGedrag (dialoog)
SSucces/status — statusbalk, programma gaat door.
IInformatie — pop-up, gaat door na OK.
WWaarschuwing — op selectieschermen: Enter = toch doorgaan.
EFout — breekt de huidige verwerking af; op selectieschermen wordt het veld invoerbaar.
AAbort — pop-up, transactie eindigt volledig.
XExit — 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.

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

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: