采购订单审批及反审批:
DATA:lt_zsdt008 LIKE TABLE OF zsdt008,
ls_zsdt008 LIKE LINE OF lt_zsdt008,
lt_zsdt027 TYPE TABLE OF zsdt027,
ls_zsdt027 TYPE zsdt027,
lt_zsdt028 TYPE TABLE OF zsdt028,
ls_zsdt028 TYPE zsdt028,
ls_zsdt001 TYPE zsdt001,
ls_zrfct002 TYPE zrfct002,
lt_ekko TYPE TABLE OF ekko,
ls_ekko TYPE ekko.
CLEAR:lt_zsdt028,ls_zsdt028.
SELECT SINGLE * INTO ls_zsdt028 FROM zsdt028 WHERE zrfc_logid = i_id." AND bsart = 'PO'.
IF sy-subrc <> 0.
e_code = 'E'.
e_msg = '无可执行数据'.
RETURN.
ENDIF.
CLEAR:lt_ekko.
SELECT *
INTO TABLE lt_ekko
FROM ekko
WHERE ebeln = ls_zsdt028-vbeln.
READ TABLE lt_ekko INTO ls_ekko INDEX 1.
IF sy-subrc <> 0.
e_code = 'E'.
e_msg = '无可执行数据'.
RETURN.
ENDIF.
PERFORM frm_release_po USING ls_ekko-ebeln
'' "反审
'X'"审批
CHANGING e_code e_msg e_flow_end.
* MESSAGE '审批成功' TYPE 'I'.
IF e_code = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL METHOD zcl_rfc=>get_source
EXPORTING
i_id = i_id
i_canum = i_canum
IMPORTING
e_zrfct002 = ls_zrfct002.
* RECEIVING
* R_SOURCE = LS_SOURCE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
CLEAR:ls_zsdt008.
ls_zsdt008-canum = ls_zrfct002-canum.
ls_zsdt008-objtype = ls_zrfct002-objtype_save.
ls_zsdt008-objkey = ls_ekko-ebeln.
ls_zsdt008-zrfcid = ls_zrfct002-zrfcid.
ls_zsdt008-zrfc_logid = i_id.
APPEND ls_zsdt008 TO lt_zsdt008.
MODIFY zsdt008 FROM TABLE lt_zsdt008.
e_code = 'S'.
CONCATENATE 'PO:' ls_ekko-ebeln '审批成功' INTO e_msg.
DATA:ls_zrfct005 TYPE zrfct005.
CLEAR:ls_zrfct005.
ls_zrfct005-status = '53'.
ls_zrfct005-msgty = e_code.
ls_zrfct005-msgid = '00'.
ls_zrfct005-msgno = '001'.
ls_zrfct005-msgv1 = e_msg.
ls_zrfct005-msgv4 = ls_ekko-ebeln.
APPEND ls_zrfct005 TO et_return.
ENDIF.
FORM frm_release_po USING uv_ebeln TYPE ekko-ebeln
uv_status10
uv_status20
CHANGING cv_code TYPE msgty
cv_msg TYPE msgtxt
cv_flow_end TYPE char01.
DATA:ls_ekko TYPE ekko.
DATA:ls_t16fs TYPE t16fs.
DATA:l_level TYPE n, "当前订单已审批通过级别数
l_last_char TYPE n, "当前订单最后审批通过级别
l_pre_field TYPE string VALUE 'FRGC', "所有审批组对应字段相同部分
l_fieldname TYPE string. "由l_pre_field + l_last_char组成对应审批组字段
DATA:lv_index TYPE n.
FIELD-SYMBOLS:<fs_field> TYPE t16fs-frgc1, "当前审批组值
<fs_t16fs> TYPE t16fs.
IF uv_status20 IS NOT INITIAL. "审批
SELECT SINGLE * INTO ls_ekko FROM ekko WHERE ebeln = uv_ebeln.
SELECT SINGLE * INTO ls_t16fs FROM t16fs WHERE frggr = ls_ekko-frggr AND frgsx = ls_ekko-frgsx. "审批策略
IF sy-subrc <> 0.
cv_code = 'E'.
cv_msg = '审批策略不存在'.
RETURN.
ENDIF.
CLEAR:l_level,
l_last_char,
l_fieldname.
l_last_char = STRLEN( ls_ekko-frgzu ). ""当前已审批级数
DO 8 TIMES.
UNASSIGN:<fs_field>.
lv_index = sy-index.
CONCATENATE l_pre_field lv_index INTO l_fieldname.
ASSIGN COMPONENT l_fieldname OF STRUCTURE ls_t16fs TO <fs_field>.
IF <fs_field> IS INITIAL.
l_level = sy-index - l_last_char - 1."需要审批的次数
EXIT.
ENDIF.
ENDDO.
CLEAR:l_last_char.
DO l_level TIMES.
WAIT UP TO '0.5' SECONDS.
l_last_char = l_last_char + 1.
CONCATENATE l_pre_field l_last_char INTO l_fieldname.
ASSIGN COMPONENT l_fieldname OF STRUCTURE ls_t16fs TO <fs_field>.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
purchaseorder = uv_ebeln
po_rel_code = <fs_field>
* USE_EXCEPTIONS = 'X'
* NO_COMMIT = ' '
* IMPORTING
* REL_STATUS_NEW =
* REL_INDICATOR_NEW =
* RET_CODE =
* TABLES
* 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 sy-subrc <> 0.
cv_code = 'E'.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
INTO cv_msg.
RETURN.
ENDIF.
ENDDO.
ELSEIF uv_status10 IS NOT INITIAL. "反审
SELECT SINGLE * INTO ls_ekko FROM ekko WHERE ebeln = uv_ebeln.
SELECT SINGLE * INTO ls_t16fs FROM t16fs WHERE frggr = ls_ekko-frggr AND frgsx = ls_ekko-frgsx. "审批策略
IF sy-subrc <> 0.
cv_code = 'E'.
cv_msg = '审批策略不存在'.
RETURN.
ENDIF.
IF ls_ekko-frgzu IS INITIAL. ""还未审批,不需要撤销审批
RETURN.
ENDIF.
CALL FUNCTION 'BAPI_PO_RESET_RELEASE' ""撤销审批只需要撤销第一级审批即可
EXPORTING
purchaseorder = uv_ebeln
po_rel_code = ls_t16fs-frgc1
* USE_EXCEPTIONS = 'X'
* IMPORTING
* REL_STATUS_NEW =
* REL_INDICATOR_NEW =
* TABLES
* 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 sy-subrc <> 0.
cv_code = 'E'.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
INTO cv_msg.
RETURN.
ENDIF.
ENDIF.
ENDFORM.