ToB企服应用市场:ToB评测及商务社交产业平台

标题: SAP ABAP 当标准BAPI或事务无法指定用户名执行的处理办法 [打印本页]

作者: 万万哇    时间: 2023-11-16 12:24
标题: SAP ABAP 当标准BAPI或事务无法指定用户名执行的处理办法
@
目录

需求

有时我们会面对某一标准事务或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。
  1. FUNCTION zbapi_acc_document_rev_post.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *"  IMPORTING
  5. *"     VALUE(REVERSAL) LIKE  BAPIACREV STRUCTURE  BAPIACREV
  6. *"     VALUE(BUS_ACT) LIKE  BAPIACHE09-BUS_ACT
  7. *"  EXPORTING
  8. *"     VALUE(OBJ_TYPE) LIKE  BAPIACREV-OBJ_TYPE
  9. *"     VALUE(OBJ_KEY) LIKE  BAPIACREV-OBJ_KEY
  10. *"     VALUE(OBJ_SYS) LIKE  BAPIACREV-OBJ_SYS
  11. *"  TABLES
  12. *"      RETURN STRUCTURE  BAPIRET2
  13. *"----------------------------------------------------------------------
  14.   DATA:lv_error TYPE char1.
  15.   CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
  16.     EXPORTING
  17.       reversal = reversal
  18.       bus_act  = bus_act
  19.     IMPORTING
  20.       obj_type = obj_type
  21.       obj_key  = obj_key
  22.       obj_sys  = obj_sys
  23.     TABLES
  24.       return   = return.
  25.   LOOP AT return[] INTO DATA(ls_return) WHERE type EQ 'E'.
  26.     lv_error = 'X'.
  27.     EXIT.
  28.   ENDLOOP.
  29.   IF lv_error IS NOT INITIAL.
  30.     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
  31. *     IMPORTING
  32. *       RETURN        =
  33.       .
  34.   ELSE.
  35.     CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  36.       EXPORTING
  37.         wait = 'X'
  38. *       IMPORTING
  39. *       RETURN        =
  40.       .
  41.   ENDIF.
  42. ENDFUNCTION.
复制代码
实现代码:
  1. *首先判断destination是否存在
  2. CALL FUNCTION 'CAT_CHECK_RFC_DESTINATION'
  3.     EXPORTING
  4.       rfcdestination = 'ZDEST_FOR_TEST'
  5.     IMPORTING
  6.       msgv1          = lv_msg1
  7.       msgv2          = lv_msg2
  8.       rfc_subrc      = lv_subrc.
  9.       CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
  10.         IMPORTING
  11.           own_logical_system = lv_system.
  12.       ls_reversal-obj_type   = 'BKPFF'.
  13.       ls_reversal-obj_key    = ls_bkpf-awkey.
  14.       ls_reversal-obj_key_r  = ls_bkpf-awkey.
  15.       ls_reversal-comp_code  = ls_bkpf-bukrs.
  16.       ls_reversal-obj_sys = lv_system .
  17.       ls_reversal-pstng_date = gs_date-zcxdate.
  18.       CALL FUNCTION 'ZBAPI_ACC_DOCUMENT_REV_POST'  "  使用带commit远程rfc
  19.         DESTINATION 'ZDEST_FOR_XGF'   " 使用HELPDESK冲销
  20.         EXPORTING
  21.           reversal = ls_reversal
  22.           bus_act  = 'RFBU'
  23.         IMPORTING
  24.           obj_key  = lv_obj_key
  25.         TABLES
  26.           return   = lt_return.
  27.       READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
  28.       IF sy-subrc = 0.
  29.         READ TABLE lt_return INTO ls_return_id WITH KEY number = 361 id = 'F5'.""已被冲销
  30.         IF sy-subrc = 0.
  31.           MESSAGE '凭证号:' && ls_bkpf-awkey && '已冲销' TYPE 'E'.
  32.         ELSE.
  33.           ROLLBACK WORK.
  34.           cv_status = 'E'.
  35.           MESSAGE '凭证冲销失败,凭证号:' && ls_bkpf-awkey TYPE 'E'.
  36.           RETURN.
  37.         ENDIF.
  38.       ELSE.
  39.         cv_status = 'S'.
  40.       ENDIF.
复制代码
二、创建SE38程序 通过调用后台作业的方式指定用户名执行

submit后跟用户名,程序内代码这里就自己补充啦
代码如下(示例):
  1. *      安排作业  立即执行
  2.       CALL FUNCTION 'JOB_OPEN'
  3.         EXPORTING
  4.           jobname          = lv_name
  5.         IMPORTING
  6.           jobcount         = lv_number
  7.         EXCEPTIONS
  8.           cant_create_job  = 1
  9.           invalid_job_data = 2
  10.           jobname_missing  = 3.
  11.       IF sy-subrc EQ 0.
  12.         SUBMIT zreport WITH SELECTION-TABLE lt_seltab
  13.           USER lv_user AND RETURN
  14.           VIA JOB lv_name NUMBER lv_number.
  15.         IF sy-subrc EQ 0.
  16.           CALL FUNCTION 'JOB_CLOSE'
  17.             EXPORTING
  18.               jobcount  = lv_number
  19.               jobname   = lv_name
  20.               strtimmed = 'X'.  "立即开始
  21.               
  22.         ENDIF.
复制代码
总结

以上

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4