动态生成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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值