提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
采购订单审批在外围系统审批完后到SAP直接审批,原先的逻辑是外围系统通过不同审批节点调用SAP接口审批,但是节点太多不好处理,现改为外围系统只调用一次就把所有节点全部审批.
提示:以下是本篇文章正文内容,下面案例可供参考
一、审批策略
对于采购订单审批BAPI BAPI_PO_RELEASE我们需要的传参只有采购订单编号和审批代码,对于审批策略的查看我们可以通过IMG—物料管理—采购—采购订单—采购订单的下达过程—定义采购定单的审批过程或者table T16FV来查看
二、代码实现
DATA: lv_purchaseorder TYPE bapimmpara-po_number,
lv_po_rel_code TYPE bapimmpara-po_rel_cod,
lv_release TYPE char1,
lv_last TYPE char1,
lv_frga TYPE string,
lv_last_frga TYPE string,
lv_msg TYPE string.
DATA: lt_return TYPE TABLE OF bapireturn.
FIELD-SYMBOLS:<lf_frga> TYPE any,
<lf_last_frga> TYPE any.
"采购订单编号
lv_purchaseorder = i_ebeln.
"获取审批组,审批策略,审批代码,发布状态
SELECT
ekko~ebeln,
ekko~frggr,
ekko~frgsx,
ekko~frgke,
ekko~frgzu
INTO @DATA(ls_ekko)
FROM
ekko
WHERE
ebeln EQ @i_ebeln AND
frggr NE '' AND
frgsx NE ''.
ENDSELECT.
SELECT
*
INTO TABLE @DATA(lt_t16fv)
FROM
t16fv
WHERE
frggr EQ @ls_ekko-frggr AND
frgsx EQ @ls_ekko-frgsx
.
SELECT SINGLE
ekko~frgzu
INTO @DATA(lv_frgzu)
FROM
ekko
WHERE
ebeln EQ @i_ebeln.
SELECT SINGLE
ekko~frgke
INTO @DATA(lv_frgke)
FROM
ekko
WHERE
ebeln EQ @i_ebeln.
IF NOT ls_ekko IS INITIAL.
IF i_cancel IS INITIAL.
WHILE lv_frgke NE 'R'.
lv_last = strlen( ls_ekko-frgzu ) + 1. "获取已审批节点
lv_release = strlen( ls_ekko-frgzu ) + 2. "获取发布状态以判断在第几节点
lv_frga = 'FRGA' && lv_release. "将审批节点字段
IF lv_last GT 0.
lv_last_frga = 'FRGA' && lv_last. "已审批节点字段
ELSEIF lv_last EQ 0.
lv_last_frga = lv_frga. "已审批节点字段
ENDIF.
LOOP AT lt_t16fv INTO DATA(ls_t16fv).
"先判断将审批节点是否为空,若为空则判断上个节点是否不为空,符合条件下取审批代码
ASSIGN COMPONENT lv_frga OF STRUCTURE ls_t16fv TO <lf_frga>.
IF <lf_frga> IS ASSIGNED.
IF <lf_frga> IS INITIAL.
ASSIGN COMPONENT lv_last_frga OF STRUCTURE ls_t16fv TO <lf_last_frga>.
IF <lf_last_frga> IS ASSIGNED.
IF NOT <lf_last_frga> IS INITIAL.
lv_po_rel_code = ls_t16fv-frgco.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
CLEAR ls_t16fv.
ENDLOOP.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
purchaseorder = lv_purchaseorder
po_rel_code = lv_po_rel_code
TABLES
return = lt_return
EXCEPTIONS
authority_check_fail = 1
document_not_found = 2
enqueue_fail = 3
prerequisite_fail = 4
release_already_posted = 5
responsibility_fail = 6
OTHERS = 7.
IF line_exists( lt_return[ type = 'EAX' ] ).
EXIT.
ENDIF.
CLEAR lv_frgke.
SELECT SINGLE
ekko~frgke
INTO @lv_frgke
FROM
ekko
WHERE
ebeln EQ @i_ebeln.
ENDWHILE.
IF lt_return IS INITIAL.
o_type = 'S'.
o_msg = '审批成功'.
ELSE.
o_type = 'E'.
LOOP AT lt_return INTO DATA(ls_return).
o_msg = o_msg && ls_return-message.
CLEAR ls_return.
ENDLOOP.
ENDIF.
ELSE.
WHILE NOT lv_frgzu IS INITIAL.
lv_last = strlen( ls_ekko-frgzu ) - 1. "获取将取消审批节点上个节点
lv_release = strlen( ls_ekko-frgzu ). "获取发布状态已判断在第几节点
lv_frga = 'FRGA' && lv_release. "将取消审批节点字段
lv_last_frga = 'FRGA' && lv_last. "将取消审批节点上个节点字段
IF lv_last GT 0.
lv_last_frga = 'FRGA' && lv_last. "已审批节点字段
ELSEIF lv_last EQ 0.
lv_last_frga = lv_frga. "已审批节点字段
ENDIF.
LOOP AT lt_t16fv INTO ls_t16fv.
"先判断次审批节点是否不为空,若不为空则判断上个节点是否不为空,符合条件下取审批代码
ASSIGN COMPONENT lv_frga OF STRUCTURE ls_t16fv TO <lf_frga>.
IF <lf_frga> IS ASSIGNED.
IF NOT <lf_frga> IS INITIAL.
ASSIGN COMPONENT lv_last_frga OF STRUCTURE ls_t16fv TO <lf_last_frga>.
IF <lf_last_frga> IS ASSIGNED.
IF NOT <lf_last_frga> IS INITIAL.
lv_po_rel_code = ls_t16fv-frgco.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
CLEAR ls_t16fv.
ENDLOOP.
CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
EXPORTING
purchaseorder = lv_purchaseorder
po_rel_code = lv_po_rel_code
use_exceptions = 'X'
TABLES
return = lt_return
EXCEPTIONS
authority_check_fail = 1
document_not_found = 2
enqueue_fail = 3
prerequisite_fail = 4
release_already_posted = 5
responsibility_fail = 6
no_release_already = 7
no_new_release_indicator = 8
OTHERS = 9.
IF line_exists( lt_return[ type = 'EAX' ] ).
EXIT.
ENDIF.
CLEAR lv_frgzu.
SELECT SINGLE
ekko~frgzu
INTO @lv_frgzu
FROM
ekko
WHERE
ebeln EQ @i_ebeln.
ENDWHILE.
IF lt_return IS INITIAL.
o_type = 'S'.
o_msg = '取消审批成功'.
ELSE.
o_type = 'E'.
LOOP AT lt_return INTO ls_return.
o_msg = o_msg && ls_return-message.
CLEAR ls_return.
ENDLOOP.
ENDIF.
ENDIF.
CLEAR: lv_purchaseorder,
lv_po_rel_code,
lv_release,
lv_last,
lv_frga,
lv_last_frga,
lv_msg.
ELSE.
o_type = 'S'.
o_msg = '此采购订单无需审批'.
ENDIF.
三.注意事项
现在是一次性审批/取消审批所有节点,若想按节点审批可以取消while循环即可变成节点审批
总结
对于此次功能的开发使自己对采购订单审批功能有了一定的了解,有很多的收获