@
目录
- 需求
- 一、远程调用RFC的方式
- 1.SM59配置
- 2.指定用户需要满足以下条件
- 3.创建远程RFC
- 二、创建SE38程序 通过调用后台作业的方式指定用户名执行
- 总结
需求
有时我们会面对某一标准事务或bapi需要以特定账户执行,以财务的过账、冲销举例,过账时可以在header中填写用户名指定创建人,这里不做阐述。
如果面对BAPI_ACC_DOCUMENT_REV_POST这样用于冲销且没有指定用户名字段的BAPI,但又需要冲销到指定用户名下,有以下方法
1.远程调用RFC的方式
2.创建SE38程序 通过调用后台作业的方式指定用户名执行
一、远程调用RFC的方式1.SM59配置
新建ABAP类型连接
指定client和用户名
注意系统是否为Unicode
连接测试通过即可
2.指定用户需要满足以下条件
①.未被锁定
②.有S_RFCACL和S_RFC权限
3.创建远程RFC
BAPI调用成功后需要在当前luw中调用commit。
FUNCTION zbapi_acc_document_rev_post.*"----------------------------------------------------------------------*"*"本地接口:*" IMPORTING*" VALUE(REVERSAL) LIKE BAPIACREV STRUCTURE BAPIACREV*" VALUE(BUS_ACT) LIKE BAPIACHE09-BUS_ACT*" EXPORTING*" VALUE(OBJ_TYPE) LIKE BAPIACREV-OBJ_TYPE*" VALUE(OBJ_KEY) LIKE BAPIACREV-OBJ_KEY*" VALUE(OBJ_SYS) LIKE BAPIACREV-OBJ_SYS*" TABLES*" RETURN STRUCTURE BAPIRET2*"---------------------------------------------------------------------- DATA:lv_error TYPE char1. CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST' EXPORTING reversal = reversal bus_act = bus_act IMPORTING obj_type = obj_type obj_key = obj_key obj_sys = obj_sys TABLES return = return. LOOP AT return[] INTO DATA(ls_return) WHERE type EQ 'E'. lv_error = 'X'. EXIT. ENDLOOP. IF lv_error IS NOT INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'* IMPORTING* RETURN = . ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'* IMPORTING* RETURN = . ENDIF.ENDFUNCTION.
实现代码:
*首先判断destination是否存在CALL FUNCTION 'CAT_CHECK_RFC_DESTINATION' EXPORTING rfcdestination = 'ZDEST_FOR_TEST' IMPORTING msgv1 = lv_msg1 msgv2 = lv_msg2 rfc_subrc = lv_subrc. CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET' IMPORTING own_logical_system = lv_system. ls_reversal-obj_type = 'BKPFF'. ls_reversal-obj_key = ls_bkpf-awkey. ls_reversal-obj_key_r = ls_bkpf-awkey. ls_reversal-comp_code = ls_bkpf-bukrs. ls_reversal-obj_sys = lv_system . ls_reversal-pstng_date = gs_date-zcxdate. CALL FUNCTION 'ZBAPI_ACC_DOCUMENT_REV_POST' " 使用带commit远程rfc DESTINATION 'ZDEST_FOR_XGF' " 使用HELPDESK冲销 EXPORTING reversal = ls_reversal bus_act = 'RFBU' IMPORTING obj_key = lv_obj_key TABLES return = lt_return. READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0. READ TABLE lt_return INTO ls_return_id WITH KEY number = 361 id = 'F5'.""已被冲销 IF sy-subrc = 0. MESSAGE '凭证号:' && ls_bkpf-awkey && '已冲销' TYPE 'E'. ELSE. ROLLBACK WORK. cv_status = 'E'. MESSAGE '凭证冲销失败,凭证号:' && ls_bkpf-awkey TYPE 'E'. RETURN. ENDIF. ELSE. cv_status = 'S'. ENDIF.
二、创建SE38程序 通过调用后台作业的方式指定用户名执行
submit后跟用户名,程序内代码这里就自己补充啦
代码如下(示例):
* 安排作业 立即执行 CALL FUNCTION 'JOB_OPEN' EXPORTING jobname = lv_name IMPORTING jobcount = lv_number EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3. IF sy-subrc EQ 0. SUBMIT zreport WITH SELECTION-TABLE lt_seltab USER lv_user AND RETURN VIA JOB lv_name NUMBER lv_number. IF sy-subrc EQ 0. CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = lv_number jobname = lv_name strtimmed = 'X'. "立即开始 ENDIF.
总结
以上