SAP ABAP 当标准BAPI或事务无法指定用户名执行的处理办法
@目录
[*]需求
[*]一、远程调用RFC的方式
[*]
[*]1.SM59配置
[*]2.指定用户需要满足以下条件
[*]3.创建远程RFC
[*]二、创建SE38程序 通过调用后台作业的方式指定用户名执行
[*]总结
需求
有时我们会面对某一标准事务或bapi需要以特定账户执行,以财务的过账、冲销举例,过账时可以在header中填写用户名指定创建人,这里不做阐述。
如果面对BAPI_ACC_DOCUMENT_REV_POST这样用于冲销且没有指定用户名字段的BAPI,但又需要冲销到指定用户名下,有以下方法
1.远程调用RFC的方式
2.创建SE38程序 通过调用后台作业的方式指定用户名执行
一、远程调用RFC的方式
1.SM59配置
新建ABAP类型连接
https://img-blog.csdnimg.cn/4d250b7250a845dbb7693ff7a96c1197.png
指定client和用户名
https://img-blog.csdnimg.cn/e73725aed0fd444e884ed57d67f9b5d3.png
注意系统是否为Unicode
https://img-blog.csdnimg.cn/b2cd1ca2bcb04545989fbeb374686742.png
连接测试通过即可
https://img-blog.csdnimg.cn/331b8b69c47a4ad28103f699d1f900cc.png
2.指定用户需要满足以下条件
①.未被锁定
②.有S_RFCACL和S_RFC权限
3.创建远程RFC
BAPI调用成功后需要在当前luw中调用commit。
FUNCTION zbapi_acc_document_rev_post.
*"----------------------------------------------------------------------
*"*"本地接口:
*"IMPORTING
*" VALUE(REVERSAL) LIKEBAPIACREV STRUCTUREBAPIACREV
*" VALUE(BUS_ACT) LIKEBAPIACHE09-BUS_ACT
*"EXPORTING
*" VALUE(OBJ_TYPE) LIKEBAPIACREV-OBJ_TYPE
*" VALUE(OBJ_KEY) LIKEBAPIACREV-OBJ_KEY
*" VALUE(OBJ_SYS) LIKEBAPIACREV-OBJ_SYS
*"TABLES
*" RETURN STRUCTUREBAPIRET2
*"----------------------------------------------------------------------
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.总结
以上
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]