User 常會說我需要捉取 Program A 和 B 的資料合起來顯示,但如果要把 Program A 和 B 程式邏級寫成 Function Module 或模組化礦日廢時,此時則可以透過 Memory ID 進行資料的 Share
主要語法 :
A) EXPORT [SOURCE INTERNAL TABLE] TO MEMORY ID '[UNIQUE_MEMORY_STRING]'.
B) IMPORT [SOURCE INTERNAL TABLE] TO [TARGET INTERNAL TABLE] FROM MEMORY ID '[UNIQUE_MEMORY_STRING]'.
下面程式提供一個範例,從 Program Z_EX_MEMORY_ID_RECEIVER 傳送參數給 Program Z_EX_MEMORY_ID_SENDER,再由 Program Z_EX_MEMORY_ID_SENDER 回傳捉到的資料給 Program Z_EX_MEMORY_ID_RECEIVER 並顯示
PROGRAM : Z_EX_MEMORY_ID_RECEIVER
REPORT Z_EX_MEMORY_ID_RECEIVER .
TABLES : BKPF.
DATA: L_TAB TYPE STANDARD TABLE OF BKPF WITH HEADER LINE.
SELECT-OPTIONS : S_BUKRS FOR BKPF-BUKRS,
S_GJAHR FOR BKPF-GJAHR,
S_BELNR FOR BKPF-BELNR.
SELECTION-SCREEN SKIP.
PARAMETERS : P_MAX TYPE I DEFAULT 5.
START-OF-SELECTION.
SUBMIT Z_EX_MEMORY_ID_SENDER
WITH S_BUKRS IN S_BUKRS
WITH S_BELNR IN S_BELNR
WITH S_GJAHR IN S_GJAHR
WITH P_MAX EQ P_MAX
AND RETURN.
"GL_TAB 不需要宣告,由 MEMORY_ID1 取得
IMPORT GL_TAB TO L_TAB FROM MEMORY ID 'MEMORY_ID1'.
FREE MEMORY ID 'MEMORY_ID1'.
LOOP AT L_TAB.
WRITE:/ L_TAB-GJAHR, L_TAB-BUKRS, L_TAB-BELNR.
ENDLOOP.
END-OF-SELECTION.
上面程式的重點在於 SUBMIT Z_EX_MEMORY_ID_SENDER 並且記得加 AND RETURN. 後由 SUBMIT Z_EX_MEMORY_ID_SENDER 回傳捉到的資料,程式透過 IMPORT 的功能把 SUBMIT Z_EX_MEMORY_ID_SENDER 宣告的 GL_TAB 的資料傳到 Local 的 Internal Table L_TAB,之後再透過 FREE MEMORY ID 釋放掉空間,因為資料已經在 Local Internal Table L_TAB,所以可直接 LOOP 該 Internal Table 的資料
PROGRAM : Z_EX_MEMORY_ID_SENDER
REPORT Z_EX_MEMORY_ID_SENDER.
TABLES : BKPF.
DATA: GL_TAB TYPE STANDARD TABLE OF BKPF WITH HEADER LINE.
SELECT-OPTIONS : S_BUKRS FOR BKPF-BUKRS,
S_GJAHR FOR BKPF-GJAHR,
S_BELNR FOR BKPF-BELNR.
SELECTION-SCREEN SKIP.
PARAMETERS : P_MAX TYPE I.
START-OF-SELECTION.
SELECT * INTO CORRESPONDING FIELDS OF TABLE GL_TAB
UP TO P_MAX ROWS
FROM BKPF
WHERE BUKRS IN S_BUKRS
AND GJAHR IN S_GJAHR
AND BELNR IN S_BELNR.
EXPORT GL_TAB TO MEMORY ID 'MEMORY_ID1'.
END-OF-SELECTION.
透過程式 Z_EX_MEMORY_ID_RECEIVER 呼叫 Z_EX_MEMORY_ID_SENDER 後,把取得的參數去捉取相關資料後,透過 EXPORT 的功能把 INTERNAL TABLE GL_TAB 傳入 MEMORY_ID1 中,供其他程式使用
要注意的事 Z_EX_MEMORY_ID_SENDER 要判斷如果不是其他程式呼叫的話,就不要跑 IMPORT 的功能
另外為了避勉 MEMORY ID 重覆,可以考慮使用 GUID_CREATE 產生 UNIQUE 的字串
CALL FUNCTION 'GUID_CREATE'
* IMPORTING
* EV_GUID_16 =
* EV_GUID_22 =
* EV_GUID_32 =
.
沒有留言:
張貼留言