Dynamisch erzeugtes Programm

Es ist möglich zur Laufzeit ein neues Programm zu generieren. Das kann schon mal nötig sein wenn man ein Programm braucht, dass sich an ständig verändernde Bedingungen anpassen soll. In diesem Beispiel wird innerhalb der Laufzeit des Rahmenprogramms ein neues Unterprogramm angelegt und später als externes Unterprogramm mit Parameterübergabe aufgerufen.

Voraussetzung ist das anlegen einer Struktur ZRSSOURCE mit der Komponente LINE C 255.

In einer Tabelle, die hier ZNEBP_FILTER genannt wird, befinden sich einige Filterbedingungen. Aus diesen Einträgen wird ein Programm erzeugt, dass daraus IF-Bedingungen zusammenstellt. 

110718110621_1

DATA:
     CODE TYPE TABLE OF ZRSSOURCELINE,
     PROG TYPE C LENGTH 8.

FORM PROG_GEN
USING P_FART
       FILTER_WERT.

CLEAR I_FILTER[].
CLEAR I_RUN.
CLEAR TRUE.
SELECT * FROM ZNEBP_FILTER INTO I_FILTER WHERE
     FART = P_FART.
   APPEND I_FILTER.
ENDSELECT.
IF SY-SUBRC = 0. “ nur ausführen wenn Filterbedingungen definiert sind
   I_RUN = ‚X‘.
ELSE.
   TRUE = ‚X‘. “ wenn kein Filter definiert ist, dann nimm einfach alles
ENDIF.
* 1.2 Filterbedingung anwenden
CLEAR CODE[].
CLEAR LINK_AD.
CLEAR I_TAB_COND.
* APPEND ‚PROGRAM SUBPOOL.‘ TO CODE.
IF I_RUN = ‚X‘.
   CONCATENATE ‚DYNAM_‘ P_FART INTO PROG.
   CONCATENATE ‚REPORT ‚ PROG ‚.‘ INTO CODE_LINE SEPARATED BY SPACE.
   APPEND CODE_LINE TO CODE.
   APPEND ‚FORM DYN_IF CHANGING TRUE.‘ TO CODE.
* Zusammenbasteln des IF-Statements
* Low und High-Wert vorhanden, dann kommt ein AND dazwischen
   LOOP AT I_FILTER.
     IF NOT I_FILTER-HIGH IS INITIAL.
       LINK = ‚AND‘.
     ELSE.
       LINK = .
     ENDIF.
*   Ab zweitem Eintrag weitere Bedingungen UND-verknüpfen
     IF SY-TABIX = 1.
*   Include oder Exclude, erweitern durch das Schlüsselwort NOT
       IF I_FILTER-ZSIGN EQ ‚E‘.
         MOVE ‚IF NOT‘ TO I_TAB_COND.
       ELSE.
         MOVE ‚IF‘ TO I_TAB_COND.
       ENDIF.
     ELSE.
       IF I_FILTER-ZSIGN EQ ‚E‘.
         LINK_AD = ‚AND NOT‘.
       ELSE.
         LINK_AD = ‚OR‘.
       ENDIF.
     ENDIF.

     CONCATENATE I_TAB_COND LINK_AD INTO I_TAB_COND SEPARATED BY SPACE.
     CONCATENATE I_TAB_COND ““ INTO I_TAB_COND SEPARATED BY SPACE.
     CONCATENATE I_TAB_COND FILTER_WERT INTO I_TAB_COND.
     CONCATENATE I_TAB_COND ““ INTO I_TAB_COND.
     CONCATENATE I_TAB_COND I_FILTER-ZOPTION INTO I_TAB_COND SEPARATED BY SPACE.
     CONCATENATE I_TAB_COND ““ INTO I_TAB_COND SEPARATED BY SPACE.
     CONCATENATE I_TAB_COND I_FILTER-LOW INTO I_TAB_COND.
     CONCATENATE I_TAB_COND ““ INTO I_TAB_COND.
     IF NOT I_FILTER-HIGH IS INITIAL.
       CONCATENATE I_TAB_COND LINK INTO I_TAB_COND SEPARATED BY SPACE.
       CONCATENATE I_TAB_COND ““ INTO I_TAB_COND SEPARATED BY SPACE.
       CONCATENATE I_TAB_COND I_FILTER-HIGH INTO I_TAB_COND.
       CONCATENATE I_TAB_COND ““ INTO I_TAB_COND.
     ENDIF.
   ENDLOOP.

   CONCATENATE I_TAB_COND ‚.‘ INTO I_TAB_COND.
   CONDENSE I_TAB_COND.
* Zum Schluß wird das Programm generiert
   APPEND I_TAB_COND TO CODE.
   APPEND ‚TRUE = “X“.‘ TO CODE.
   APPEND ‚ENDIF.‘ TO CODE.
ENDIF.
APPEND ‚ENDFORM.‘ TO CODE.

INSERT REPORT PROG FROM CODE.

* es gibt hier zwei Möglichkeiten: entweder den Code mit INSERT einfügen oder

* als externes Unterprogramm generieren
* GENERATE SUBROUTINE POOL CODE NAME PROG
*         MESSAGE MSG
*         LINE LIN
*         WORD WRD
*         OFFSET OFF.

ENDFORM.                   „PROG_GEN

Schreibe einen Kommentar