程序間獲取ALV數據的兩種方法:
方法1:通過修改SUBMIT的目標程序,把內表EXPORT到內存,SUBMIT后IMPORT ,
該方法需要修改目標程序,可以任意設置目標程序的中斷點;
* Execute transaction IA09 to get all Functional Location Tasklists SUBMIT riplko10 WITH SELECTION-TABLE lt_selscreen WITH pn_iflo = abap_true "Select Func Loc Tasklists WITH dy_tcode = 'IA09' WITH dy_selm = 'D' "Dark mode AND RETURN IMPORT sel_tab FROM MEMORY ID 'RIPLKO10'.
這種方法性能比較高但是依賴源程序,需要事先將需要的數據EXPORT到內存,如果是標准程序就需要做增強。
方法2:SUBMIT前屏蔽ALV GRID的顯示,使用SUBMIT,然后調用CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF方法獲取數據(包括顯示數據,布局數據,字段數據,過濾器等),這個是SAP提供的API所以我們不關心如何存儲所以
該方法不需要修改目標程序就可以直接得到ALV顯示的結果,但不能設置目標程序的中斷點,需顯示ALV的函數執行完畢方可獲取到數據。
FIELD-SYMBOLS <lt_pay_data> TYPE ANY TABLE. DATA lr_pay_data TYPE REF TO data. DATA lt_selscreen TYPE TABLE OF rsparams. "初始設置 CALL METHOD cl_salv_bs_runtime_info=>set EXPORTING display = abap_false metadata = abap_false data = abap_true. * 調用目標程序 SUBMIT h99cwtr0 WITH SELECTION-TABLE lt_selscreen AND RETURN. TRY. "獲取ALV顯示數據 CALL METHOD cl_salv_bs_runtime_info=>get_data_ref IMPORTING r_data = lr_pay_data. ASSIGN lr_pay_data->* TO <lt_pay_data>. CATCH cx_salv_bs_sc_runtime_info. MESSAGE `無法取得ALV術` TYPE 'E'. ENDTRY. "結束 cl_salv_bs_runtime_info=>clear_all( ).
CL_SALV_BS_RUNTIME_INFO與讀取ALV有關的方法:
SET() - 此方法初始化類(清除內存區域),然后允許標志的設置讓任何后續ALV對象如何工作。它應該在裝程序調用ALV報告程序之前被調用。
參數:
- DISPLAY - 將它設為abap_false強制所有后續ALV報告在“黑暗模式”下運行,也就是說,ALV不會被輸出到GUI。
- METADATA - 將它設為abap_false防止基本信息(布局,字段目錄等)被取到內存中......一般我們不需要。
- DATA - 將它設為abap_true迫使數據表導出到內存而不是顯示報表。
GET_DATA_REF() - 非常靈活的GET_DATA*方法,這種方法可以用來訪問該數據表變量的引用(動態而且易用),所以即使不知道ALV數據表的結構也沒關系。
參數:
- R_DATA - 輸出ALV數據表。
- R_DATA_LINE - 如果執行的ALV有HEADER的(可選)。
GET_DATA() - 如果知道需要調用的ALV數據表的結構,可以使用這個方法。
參數:
- T_DATA - 輸出參數數據表。
- T_DATA_LINE - 如果執行的ALV有HEADER(可選)。
CLEAR_ALL() - 此方法清除在set()方法設置的標志。如果之后本程序還需要顯示其他ALV 那么這個方法尤為重要。如果不清除設置,你的ALV就不會被顯示出來。