在ABAP遇到的业务场景中,可能会遇到一种情况,需要调用其他报表的数据来发送或者二次加工,这个时候又不想对源程序做大的改动、有以下几种思路解决。
1.修改源程序,将需要展示的数据存储到DB中,然后主程序再从DB中读取;(增加存储开销)
2.Submit配合EXPORT/IMPORT :将数据临时存放到内存中,然后主程序再从内存中读取,及时Free Memory ID;(增加内存开销)
3.修改主程序和源程序的逻辑,增加耦合;(后期运维困难)
4.Copy出源程序的代码逻辑后,将源程序大卸八块,只要逻辑不变,随便怎么改就要能跑起来就行;(推荐这一种)
下面推荐第二种方法:
源程序【被调用程序】:
1 *&---------------------------------------------------------------------* 2 *& Report ZCHENH072 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------------------------------------* 8 9 REPORT zchenh072. 10 PARAMETERS:p_call TYPE c NO-DISPLAY. " 被调用的标志 11 12 IF p_call IS INITIAL. 13 WRITE:/,'未被其他程序调用'. 14 ELSE. 15 * WRITE:/,'被其他程序调用开始'. 16 17 DATA:lv_key TYPE i, 18 lv_value TYPE string, 19 BEGIN OF lt_tab OCCURS 0, 20 key TYPE i, 21 value TYPE string, 22 END OF lt_tab. 23 DO 3 TIMES. 24 lv_key = sy-index. 25 lv_value = '测试值'. 26 lt_tab-key = lv_key. 27 lt_tab-value = lv_value. 28 APPEND lt_tab. 29 ENDDO. 30 EXPORT lt_tab TO MEMORY ID 'EXPORTID'. 31 * WRITE:/,'被其他程序调用结束'. 32 ENDIF.
接口【主程序】:
1 *&---------------------------------------------------------------------* 2 *& Report ZCHENH072_1 3 *& 4 *&---------------------------------------------------------------------* 5 *& 6 *& 7 *&---------------------------------------------------------------------* 8 9 REPORT zchenh072_1. 10 DATA:BEGIN OF lt_tab OCCURS 0, 11 key TYPE i, 12 value TYPE string, 13 END OF lt_tab. 14 15 16 SUBMIT zchenh072 WITH p_call = 'X' 17 AND RETURN. 18 IMPORT lt_tab FROM MEMORY ID 'EXPORTID'. 19 FREE MEMORY ID 'EXPORTID'. 20 BREAK-POINT.
此处注释掉Write的原因,请自行尝试后体会.
使用时注意以下几点:
1.export与import两边的内表(包含内表名称),字段结构(包括长度/内型/小数位数/字段的多少)保持完全一致,建议Copy源程序中的内表到主程序【接口】中,或SE11定义全局结构和内表。
2.Submit后要and return,将数据返回到主程序中。
3.该方法缺点:当后期源程序逻辑变动或者内表结构发生改变,风险极大,不轻易推荐使用。