使用RFC跳过权限校验的方法
1、业务背景
由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题。例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用功能。
2、使用RFC跳过权限
2.1、实现原理
将被权限限制的逻辑,封装成RFC函数,在调用时,使用拥有大权限的账号,远程调用目标系统(实际还是本系统)的RFC,则实际上在代码运行时,是使用了大权限的账号,执行了该函数。最终在凭证中的更改日志,也是记录了大权限账号的修改记录。
2.2、封装RFC
例如将销售订单修改逻辑封装到RFC中
复制BAPI_SALESORDER_CHANGE到ZBAPI_SALESORDER_CHANGE,确保远程模式
原参数保持不变,多增加一个返回结构E_RESULT,将调用BAPI的最终结果处理后返回,这样外部调用时,可以避免重复编写处理BAPI消息的代码
将commit和rollback写在函数中,待凭证处理完之后,执行事务,防止事务一直未提交,出现锁单情况
"--------------------@斌将军--------------------
FUNCTION zbapi_salesorder_change.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(SALESDOCUMENT) LIKE BAPIVBELN-VBELN
*" VALUE(ORDER_HEADER_IN) LIKE BAPISDH1 STRUCTURE BAPISDH1
*" OPTIONAL
*" VALUE(ORDER_HEADER_INX) LIKE BAPISDH1X STRUCTURE BAPISDH1X
*" VALUE(SIMULATION) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
*" VALUE(BEHAVE_WHEN_ERROR) LIKE BAPIFLAG-BAPIFLAG DEFAULT SPACE
*" VALUE(INT_NUMBER_ASSIGNMENT) LIKE BAPIFLAG-BAPIFLAG DEFAULT
*" SPACE
*" VALUE(LOGIC_SWITCH) LIKE BAPISDLS STRUCTURE BAPISDLS OPTIONAL
*" VALUE(NO_STATUS_BUF_INIT) LIKE BAPIFLAG-BAPIFLAG DEFAULT SPACE
*" EXPORTING
*" VALUE(E_RESULT) TYPE BAPIRETURN
*" TABLES
*" RETURN STRUCTURE BAPIRET2
*" ORDER_ITEM_IN STRUCTURE BAPISDITM OPTIONAL
*" ORDER_ITEM_INX STRUCTURE BAPISDITMX OPTIONAL
*" PARTNERS STRUCTURE BAPIPARNR OPTIONAL
*" PARTNERCHANGES STRUCTURE BAPIPARNRC OPTIONAL
*" PARTNERADDRESSES STRUCTURE BAPIADDR1 OPTIONAL
*" ORDER_CFGS_REF STRUCTURE BAPICUCFG OPTIONAL
*" ORDER_CFGS_INST STRUCTURE BAPICUINS OPTIONAL
*" ORDER_CFGS_PART_OF STRUCTURE BAPICUPRT OPTIONAL
*" ORDER_CFGS_VALUE STRUCTURE BAPICUVAL OPTIONAL
*" ORDER_CFGS_BLOB STRUCTURE BAPICUBLB OPTIONAL
*" ORDER_CFGS_VK STRUCTURE BAPICUVK OPTIONAL
*" ORDER_CFGS_REFINST STRUCTURE BAPICUREF OPTIONAL
*" SCHEDULE_LINES STRUCTURE BAPISCHDL OPTIONAL
*" SCHEDULE_LINESX STRUCTURE BAPISCHDLX OPTIONAL
*" ORDER_TEXT STRUCTURE BAPISDTEXT OPTIONAL
*" ORDER_KEYS STRUCTURE BAPISDKEY OPTIONAL
*" CONDITIONS_IN STRUCTURE BAPICOND OPTIONAL
*" CONDITIONS_INX STRUCTURE BAPICONDX OPTIONAL
*" EXTENSIONIN STRUCTURE BAPIPAREX OPTIONAL
*" EXTENSIONEX STRUCTURE BAPIPAREX OPTIONAL
*"----------------------------------------------------------------------
DATA:lv_check TYPE char1,
lv_message TYPE char255.
"修改销售订单
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = salesdocument
* order_header_in = order_header_in
order_header_inx = order_header_inx
logic_switch = logic_switch
TABLES
return = return
order_item_in = order_item_in
order_item_inx = order_item_inx
schedule_lines = schedule_lines
schedule_linesx = schedule_linesx
extensionin = extensionin.
CLEAR:lv_check,lv_message,e_result.
LOOP AT return INTO DATA(ls_return) WHERE type CA 'AEX'.
lv_message = lv_message && ls_return-message.
lv_check = 'E'.
CLEAR:ls_return.
ENDLOOP.
IF lv_check = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
e_result-type = 'E'.
e_result-message = lv_message.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
e_result-type = 'S'.
e_result-message = '修改成功'.
ENDIF.
ENDFUNCTION.
"--------------------@斌将军--------------------
2.3、配置目标系统
创建ABAP连接
?目标系统
?拥有大权限的账密
?Unicode
连接测试成功。点击远程登录,则能直接用配置的账号登录SAPGUI
2.4、调用RFC
"--------------------@斌将军--------------------
DATA:gv_system TYPE rfcdes-rfcdest.
"目标系统
gv_system = sy-sysid && '_' && sy-mandt."S4D_300
"修改销售订单
PERFORM frm_salesorder_change.
IF ls_result-type = 'E'.
"失败
ELSE.
"成功
ENDIF.
FORM frm_salesorder_change.
"修改销售订单
CALL FUNCTION 'ZBAPI_SALESORDER_CHANGE' DESTINATION gv_system
EXPORTING
salesdocument = lv_salesdocument
* order_header_in = ls_order_header_in
order_header_inx = ls_order_header_inx
logic_switch = ls_logic_switch
IMPORTING
e_result = ls_result
TABLES
return = lt_so_return
order_item_in = lt_order_item_in
order_item_inx = lt_order_item_inx
schedule_lines = lt_schedule_lines
schedule_linesx = lt_schedule_linesx
extensionin = lt_extensionin.
ENDFORM.
"--------------------@斌将军-------------------
2.5、关于通讯类型Unicode
Unicode:表示目标系统能够处理Unicode字符集。Unicode是一种全球通用的字符编码标准,用于表示世界上几乎所有语言的字符。使用Unicode通讯类型,可以在SAP系统中处理并传输多种语言的数据,包括特殊字符和非拉丁字母字符。
非Unicode:表示目标系统只能处理非Unicode字符集。即系统仅支持传输和处理特定的字符集,如ANSI和ASCII字符集。非Unicode通讯类型适用于处理少数语言或特定的本地化需求。
区别:在于系统对字符集的支持和处理能力。Unicode通讯类型允许SAP系统处理更广泛的字符集,使其具有更好的国际化和本地化能力。而非Unicode通讯类型的系统则限制了字符集的范围,可能导致在处理和传输多语言数据时出现问题。在选择目标系统的通讯类型时,需要根据具体的业务需求和语言环境来考虑。如果需要处理多语言数据或具有全球化的需求,建议选择Unicode通讯类型。而如果业务仅涉及特定的语言或本地化需求,非Unicode通讯类型可能更加适合。
定期更文,欢迎关注
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!