第二章srfc就没做笔记了,毕竟同步rfc应该时平时用的最多的,感觉没啥好写的
arfc的调用处理流程如下
、
arfc注意事项:
1、每次函数调用都会生成一个DIA类型的进程,可在事务码SM50中查看,使用异步调用时需注意控制生成的进程数量,防止进程全部占完导致其他正常业务排队或数据库提交错误
2、arfc调用时没有返回参数和异常捕获(communication_failure和system_failure这两个异常除外),返回参数和异常捕获放在获取返回参数的form中
3、需保证所有异步任务执行结束再开始后续程序的执行,否则容易漏掉数据
arfc调用测试,获取500个物料的mrp数据,以及并发执行和单线程执行的效率对比
CONSTANTS:con_max_available_thread TYPE i VALUE 10.
DATA:lt_mrp_be TYPE TABLE OF zmrp_be_s.
DATA:lt_mrp_ar TYPE TABLE OF zmrp_ar_s.
DATA:lt_mrp_vc TYPE TABLE OF zmrp_vc_s.
DATA:lt_mrp_vj TYPE TABLE OF zmrp_vj_s.
DATA:lt_mrp_po TYPE TABLE OF zmrp_be_s.
DATA:lt_mrp_ot TYPE TABLE OF zmrp_ot_s.
DATA:lt_supply_sto TYPE TABLE OF zsupply_sto_s.
DATA:lt_supply_po_qm TYPE TABLE OF zsupply_sto_s.
DATA:lt_supply_po_tr TYPE TABLE OF zsupply_sto_s.
DATA:lt_mrp_request TYPE TABLE OF zmrp_request_s.
.
DATA:gt_marc TYPE TABLE OF zmrp_mara_s.
DATA:gs_marc TYPE zmrp_mara_s.
DATA:lv_task_name TYPE c LENGTH 15.
DATA:lv_free_thread_num TYPE i.
SELECT marc~werks marc~matnr marc~ekgrp marc~eisbe marc~eislo marc~dispo matkl maktx INTO CORRESPONDING FIELDS OF TABLE gt_marc UP TO 500 ROWS
FROM marc
INNER JOIN mara ON marc~matnr EQ mara~matnr
INNER JOIN makt ON marc~matnr EQ makt~matnr
WHERE marc~lvorm EQ space
AND ( marc~beskz EQ 'X' OR marc~beskz EQ 'F' )
AND ( marc~mmsta NE 'Z3' AND marc~mmsta NE 'Z4' AND marc~mmsta NE 'Z3' AND marc~mmsta NE 'Z7' )
AND makt~spras EQ sy-langu
AND marc~werks = '1010'.
PERFORM frm_multiple_threads.
PERFORM frm_sigle_thread.
FORM frm_sigle_thread.
LOOP AT gt_marc INTO gs_marc..
CALL FUNCTION 'ZRFC_GET_MRP_DATA'
EXPORTING
is_mara = gs_marc
TABLES
et_mrp_be = lt_mrp_be
et_mrp_ar = lt_mrp_ar
et_mrp_vc = lt_mrp_vc
et_mrp_vj = lt_mrp_vj
et_mrp_po = lt_mrp_po
et_mrp_ot = lt_mrp_ot
et_supply_sto = lt_supply_sto
et_supply_po_qm = lt_supply_po_qm
et_supply_po_tr = lt_supply_po_tr
et_mrp_request = lt_mrp_request.
ENDLOOP.
endform.
FORM frm_multiple_threads.
SORT gt_marc BY werks matnr.
*---执行获取MRP
LOOP AT gt_marc INTO gs_marc.
lv_task_name = 'TASK' && sy-tabix.
lv_free_thread_num = lv_free_thread_num + 1.
CALL FUNCTION 'ZRFC_GET_MRP_DATA' STARTING NEW TASK lv_task_name PERFORMING receive_result ON END OF TASK
EXPORTING
is_mara = gs_marc.
WAIT UNTIL lv_free_thread_num <= con_max_available_thread.
ENDLOOP.
"确保所有异步任务执行完毕
WAIT UNTIL lv_free_thread_num <= 0 UP TO 1200 SECONDS.
ENDFORM.
FORM receive_result USING taskid TYPE clike.
lv_free_thread_num = lv_free_thread_num - 1.
RECEIVE RESULTS FROM FUNCTION 'ZRFC_GET_MRP_DATA'
TABLES
et_mrp_be = lt_mrp_be
et_mrp_ar = lt_mrp_ar
et_mrp_vc = lt_mrp_vc
et_mrp_vj = lt_mrp_vj
et_mrp_po = lt_mrp_po
et_mrp_ot = lt_mrp_ot
et_supply_sto = lt_supply_sto
et_supply_po_qm = lt_supply_po_qm
et_supply_po_tr = lt_supply_po_tr
et_mrp_request = lt_mrp_request.
IF sy-subrc = 0.
* APPEND LINES OF lt_mrp_be TO gt_mrp_be.
* APPEND LINES OF lt_mrp_ar TO gt_mrp_ar.
* APPEND LINES OF lt_mrp_vc TO gt_mrp_vc.
* APPEND LINES OF lt_mrp_vj TO gt_mrp_vj.
* APPEND LINES OF lt_mrp_po TO gt_mrp_po.
* APPEND LINES OF lt_mrp_ot TO gt_mrp_ot.
* APPEND LINES OF lt_supply_sto TO gt_supply_sto_data.
* APPEND LINES OF lt_supply_po_qm TO gt_supply_po_qm_data.
* APPEND LINES OF lt_supply_po_tr TO gt_supply_po_tr_data.
* APPEND LINES OF lt_mrp_request TO gt_request_data.
ENDIF.
ENDFORM.