[ABAP] Dynamisch Programmcode erzeugen und persistent auf der Datenbank speichern

* Programmname
DATA: lv_prg_name TYPE sy-repid VALUE 'ZREPORT1'.
* Compilerausgaben
DATA: lv_msg TYPE string.
DATA: lv_line TYPE string.
DATA: lv_word TYPE string.
DATA: lv_off TYPE string.
* iTab mit Quellcode
DATA: it_src TYPE STANDARD TABLE OF char1024.

* Codezeilen zu iTab hinzufügen
APPEND |REPORT { lv_prg_name }.| TO it_src.
APPEND |WRITE: / 'Hallo Welt!'.| TO it_src.

* ausführbares Programm (TYPE '1') anlegen, es wird persistent auf der Datenbank gespeichert,
* aber keinem Paket zugeordnet und ist global verfügbar
INSERT REPORT lv_prg_name FROM it_src PROGRAM TYPE '1' UNICODE ENABLING 'X'.

* Programmcode compilieren, existierender Programmcode wird überschrieben
GENERATE REPORT lv_prg_name MESSAGE lv_msg LINE lv_line WORD lv_word OFFSET lv_off.

IF sy-subrc = 0.
* wenn Compilierung ok: Code ausführen
  SUBMIT (lv_prg_name) AND RETURN.
ELSE.
* Im Fehlerfall: Fehlerausgabe
  WRITE: / 'Error during generation in line: ', lv_line.
  IF lines( it_src ) > 0.
    WRITE: it_src[ lv_line ].
  ENDIF.
  WRITE: / lv_msg.
  WRITE: / 'Word: ', lv_word.
  WRITE: / 'Offset: ', lv_off.
ENDIF.

* aktives Programm wieder aus der DB löschen
DELETE REPORT lv_prg_name.

CASE sy-subrc.
  WHEN 0.
    WRITE: / |{ lv_prg_name } gelöscht.|.
  WHEN 4.
    WRITE: / |{ lv_prg_name } nicht vorhanden.|.
  WHEN OTHERS.
    WRITE: / |Anderer Fehler.|.
ENDCASE.

Weiterführende Infos: Link