Temporäre Unterprogramme anlegen und starten 

Die in den übrigen Topics diese Abschnitts beschriebenen dynamischen Programme werden im R/3-Repository erzeugt. Der vorliegende Abschnitt beschreibt, wie Sie dynamische Unterprogramme temporär im Hauptspeicher anlegen und aufrufen können.

Den Quelltext der Unterprogramme schreiben Sie hierfür wie unter Ein neues Programm dynamisch anlegen beschrieben in eine interne Tabelle. Zur Generierung des Programms verwenden sie folgende Anweisung:

Syntax

GENERATE SUBROUTINE POOL <itab> NAME <prog> [<options>].

Diese Anweisung erzeugt einen sogenannten Subroutinen-Pool im Hauptspeicherbereich des laufenden Programms. Den Quelltext des Subroutinen-Pools übergeben Sie in der internen Tabelle <itab>. Die Anweisung liefert Ihnen im Feld <prog>, welches vom Typ C der Länge 8 sein sollte, den Namen des Subroutinen-Pools zurück. Sie verwenden den Namen in <prog>, um die in der Tabelle <itab> definierten externen Unterprogramme über dynamische Unterprogrammaufrufe (siehe Den Namen des Unterprogramms zur Laufzeit angeben) zu starten.

Der Subroutine-Pool existiert nur zur Laufzeit des generierenden Programms und kann nur innerhalb des generierenden Programms aufgerufen werden. Sie können bis zu 36 temporäre Subroutine-Pools zu einem Programm anlegen.

Tritt ein Generierungsfehler auf, wird SY-SUBRC auf 8, ansonsten auf 0 gesetzt.

Sie können folgende Optionen <options> in der Anweisung GENERATE SUBROUTINE POOL verwenden:

Im Fall eines Syntaxfehlers enthält das Feld <mess> die Fehlermeldung.

Im Fall eines Syntaxfehlers enthält das Feld <incl> den Namen eines eventuellen Include-Programms, in dem der Fehler auftrat.

Im Fall eines Syntaxfehlers enthält das Feld <line> die Nummer der fehlerhaften Zeile.

Im Fall eines Syntaxfehlers enthält das Feld <word> das fehlerhafte Wort.

Im Fall eines Syntaxfehlers enthält das Feld <offs> den Offset des fehlerhaften Worts in der Zeile.

Durch die Verwendung dieser Option schalten Sie den Tracemodus ein und das Feld <trac> enthält die Traceausgaben.

Im Vergleich zu INSERT REPORT stellt die Anweisung GENERATE SUBROUTINE POOL die performantere Alternative dar. Weiterhin müssen Sie bei GENERATE SUBROUTINE POOL keine Namenskonventionen und nicht die Einschränkungen des Reparatur- und Transportwesens beachten.

REPORT demo_special_tech_subroutine_2.
DATA: code TYPE TABLE OF rssource-line,
      prog(8) TYPE c, msg(120) TYPE c, lin(3) TYPE c,
      wrd(10) TYPE c, off(3) TYPE c.

APPEND 'PROGRAM SUBPOOL.'
        TO code.
APPEND 'FORM DYN1.'
        TO code.

APPEND
   'WRITE / ''Hello, I am the temporary subroutine DYN1!''.'
        TO code.
APPEND 'ENDFORM.'
        TO code.
APPEND 'FORM DYN2.'
        TO code.
APPEND
   'WRITE / ''Hello, I am the temporary subroutine DYN2!''.'
        TO code.
APPEND 'ENDFORM.'
        TO code.

GENERATE SUBROUTINE POOL code NAME prog
                         MESSAGE msg
                         LINE    lin
                         WORD    wrd
                         OFFSET  off.

IF sy-subrc <> 0.
  WRITE: / 'Error during generation in line', lin,
         / msg,
         / 'Word:', wrd, 'at offset', off.
ELSE.
  WRITE: / 'The name of the subroutine pool is', prog.
  SKIP 2.
  PERFORM dyn1 IN PROGRAM (prog).
  SKIP 2.
  PERFORM dyn2 IN PROGRAM (prog).

ENDIF.

In diesem Programm wird ein Subroutine-Pool von zwei Unterprogrammen in die Tabelle CODE gestellt. Beachten Sie, daß das temporäre Programm eine REPORT- oder PROGRAM-Anweisung enthalten muß. Mit GENERATE SUBROUTINE POOL wird das temporäre Programm generiert. Die Ausgabe sieht wie folgt aus:

Da die WRITE-Anweisung im zweiten Unterprogramm DYN2 falsch geschrieben ist, tritt ein Fehler beim Generieren auf. Nach folgender Korrektur der entsprechenden Zeile:

APPEND
   'WRITE / ''Hello, I am the temporary subroutine DYN2!''.'
        TO code.

sieht die Ausgabe so aus:

Die Generierung ist erfolgreich. Der interne Programmname wird ausgegeben. Danach werden die Unterprogramme des Subroutine-Pools aufgerufen. Beachten Sie, daß für diese Aufrufe die explizite Kenntnis des Programmnamens nicht notwendig ist.