下面这段代码允许用户从前台输入一个公式,如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 *>> 1. get 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).
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 *>> 1. get 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).