天天看點

動态生成ABAP程式

動态生成ABAP程式.

參考程式:

Tcode ABAPdocu-->

BC - ABAP Programming-->

The ABAP Programming Language-->

Special Techniques-->

Generating Programs Dynamically.

1.僅動态生成程式代碼:

   REPORT demo_special_tech_dyn_insert.

DATA: code TYPE TABLE OF rssource-line.

* type of an editor line: rssource-line

APPEND  'REPORT ZDYN1.'

         TO code.

APPEND  'WRITE / ''Hello, I am dynamically created!''.'

         TO code.

INSERT REPORT 'demo_special_tech_ZDYN1' FROM code.

WRITE: text-001, 'demo_special_tech_ZDYN1'.

2.動态更改程式代碼

REPORT demo_special_tech_dyn_read_rep .

DATA: code TYPE TABLE OF rssource-line.

* type of an editor line: rssource-line

READ REPORT 'demo_special_tech_ZSTRUC1' INTO code.

APPEND 'SKIP.' TO code.

APPEND 'WRITE / ''And I am a dynamic extension!''.' TO code.

INSERT REPORT 'demo_special_tech_ZDYN2' FROM code.

WRITE: text-001, 'demo_special_tech_ZDYN2'.

3 動态生成 并 調用

REPORT demo_special_tech_dyn_start.

DATA: code TYPE TABLE OF rssource-line.

* type of an editor line: rssource-line

DATA lin TYPE i.

READ REPORT 'demo_special_tech_zdyn1' INTO code.

SUBMIT demo_special_tech_zdyn1 AND RETURN.

DESCRIBE TABLE code LINES lin.

MODIFY code INDEX lin FROM

           'WRITE / ''Dynamic Program Changed!''.'.

INSERT REPORT 'demo_special_tech_zdyn1' FROM code.

SUBMIT demo_special_tech_zdyn1.

4 生成并增加include

REPORT demo_special_tech_include_1.

TYPES code_type TYPE rssource-line.

* type of an editor line: rssource-line

DATA code TYPE TABLE OF code_type.

DATA lin TYPE i.

READ REPORT 'demo_special_tech_ZINCLUD1' INTO code.

DESCRIBE TABLE code LINES lin.

MODIFY code INDEX lin FROM

            'WRITE / ''Changed INCLUDE program!''.'.

INSERT REPORT 'demo_special_tech_ZINCLUD1' FROM code.

INCLUDE demo_special_tech_zinclud1.

5. 調用其他程式的子程式

REPORT demo_special_tech_include_2 .

TYPES code_type(72) TYPE c.

DATA code TYPE TABLE OF code_type.

READ REPORT 'demo_special_tech_ZINCLUD1' INTO code.

APPEND 'WRITE / ''Extension of INCLUDE program!''.' TO code.

INSERT REPORT 'demo_special_tech_ZINCLUD1' FROM code.

PERFORM sub1(demo_special_tech_zform1).

6. 生成動态 臨時 子程式 并調用(生成的代碼有錯 writ 應該是 write).

REPORT demo_special_tech_subroutine_1.

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!''.' "#EC NOTEXT

        TO code.

APPEND 'ENDFORM.'

        TO code.

APPEND 'FORM DYN2.'

        TO code.

APPEND

   'WRIT / ''Hello, I am the temporary subroutine DYN2!''.'  "#EC NOTEXT

        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,           "#EC NOTEXT

         / msg,

         / 'Word:', wrd, 'at offset', off.                   "#EC NOTEXT

ELSE.

  WRITE: / 'The name of the subroutine pool is', prog.       "#EC NOTEXT

  SKIP 2.

  PERFORM dyn1 IN PROGRAM (prog).

  SKIP 2.

  PERFORM dyn2 IN PROGRAM (prog).

ENDIF.

----------------------------------------

核心代碼 :

GENERATE SUBROUTINE POOL code NAME prog

                         MESSAGE msg

                         LINE    lin

                         WORD    wrd

                         OFFSET  off.

生成 子程式池,檢查代碼錯誤.

_____________________________

7. 生成動态 臨時 子程式 并調用(生成的代碼正确).

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!''.' "#EC NOTEXT

        TO code.

APPEND 'ENDFORM.'

        TO code.

APPEND 'FORM DYN2.'

        TO code.

APPEND

   'WRITE / ''Hello, I am the temporary subroutine DYN2!''.' "#EC NOTEXT

        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,           "#EC NOTEXT

         / msg,

         / 'Word:', wrd, 'at offset', off.                   "#EC NOTEXT

ELSE.

  WRITE: / 'The name of the subroutine pool is', prog.       "#EC NOTEXT

  SKIP 2.

  PERFORM dyn1 IN PROGRAM (prog).

  SKIP 2.

  PERFORM dyn2 IN PROGRAM (prog).

ENDIF.(完)

References:http://blog.chinaunix.net/u2/64908/showart_538144.html