在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.該方法缺點:當后期源程序邏輯變動或者內表結構發生改變,風險極大,不輕易推薦使用。