知者何南 发表于 2023-11-18 16:27:52

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]
查看完整版本: SAP ABAP 当标准BAPI或事务无法指定用户名执行的处理办法