邓明辉的实名博客

记下来,是怕会忘记。
  首页  :: 新随笔  :: 联系 :: 管理

ABAP/TIPS - 动态程序/动态公式示例

Posted on 2008-08-21 14:34  邓明辉  阅读(799)  评论(0编辑  收藏  举报

下面这段代码允许用户从前台输入一个公式,如A=B+C,同时通过表的方式指定每个变量的值。

稍加改动,简直就可以替代SAP的条件表技术了,呵呵。 

 1 *&---------------------------------------------------------------------*
 2 *& Report       : zdyncode
 3 *& Tcode        : zdyncode
 4 *&---------------------------------------------------------------------*
 5 *& Date Created : 2008/06/06
 6 *& Created By   : 邓明辉
 7 *& Description  : 动态公式测试
 8 *&---------------------------------------------------------------------*
 9 *& Modification :
10 *&   Date Modified    Modified By   Description
11 *&---------------------------------------------------------------------*
12 
13 REPORT zdyncode NO STANDARD PAGE HEADING.
14 
15 DATA : str(10) TYPE c,
16        confirm_flag TYPE c.
17 
18 DATA: code TYPE TABLE OF rssource-line,
19       prog(8) TYPE c, msg(120) TYPE c, lin(3) TYPE c,
20       wrd(10) TYPE c, off(3) TYPE c.
21 
22 DATA: cnt TYPE i,
23       ofs TYPE i,
24       len TYPE i.
25 
26 PARAMETERS: istr LIKE (str).    " Formula input by user
27 
28 START-OF-SELECTION.
29 
30 *>> 1get formula with par.  
31   istr = 'A + B'.               " Hardcode formula.
32   WRITE: /2 istr.               " Sample formula: A + B
33 
34 *>> 2. replace par for formula.
35   REPLACE ALL OCCURRENCES OF 'A' IN:
36          istr WITH '20'
37               REPLACEMENT COUNT  cnt
38               REPLACEMENT OFFSET ofs
39               REPLACEMENT LENGTH len.
40   REPLACE ALL OCCURRENCES OF 'B' IN:
41          istr WITH '19820200'
42               REPLACEMENT COUNT  cnt
43               REPLACEMENT OFFSET ofs
44               REPLACEMENT LENGTH len.
45 
46 *>> 3. real formula.
47   WRITE: /2 istr. " A + B
48 
49 *>> 4. make dynamic subroutine.  
50   APPEND 'PROGRAM SUBPOOL.'               TO code.
51   APPEND 'FORM DYN1.'                     TO code.
52   APPEND 'DATA: reslt TYPE i.'            TO code.
53   APPEND ' reslt = '                      TO code.
54   APPEND       istr                       TO code.
55   APPEND '          .'                    TO code.
56   APPEND 'WRITE / reslt.'                 TO code.
57   APPEND 'ENDFORM.'                       TO code.
58 
59 *>> 5. generate subroutine.
60   GENERATE SUBROUTINE POOL code NAME prog
61                          MESSAGE msg
62                          LINE    lin
63                          WORD    wrd
64                          OFFSET  off.
65   IF sy-subrc <> 0.
66     WRITE: / 'Error during generation in line', lin,
67            / msg,
68            / 'Word:', wrd, 'at offset', off.        
69   ELSE.
70     WRITE: / 'The name of the subroutine pool is', prog.
71   ENDIF.
72 
73 *>> 6. call subroutine.
74   PERFORM dyn1 IN PROGRAM (prog).