1 Introduction
This is a exmaple for releaseing po and reseting po.
2 Example
DATA:lw_in TYPE zmms015,
lw_out TYPE zmms015_out,
lt_head LIKE TABLE OF ZMMT003_head,
lw_head TYPE ZMMT003_head,
lt_item TYPE zmmt003_item_t,
lt_spjd TYPE ZMMT003_spjd_T.
DATA:lv_rel_code LIKE bapimmpara-rel_code.
DATA:lt_return TYPE TABLE OF bapireturn,
ls_return TYPE bapireturn.
DATA:lv_str TYPE string,lv_offset TYPE i.
DATA:BEGIN OF ls_grp,
frgco TYPE t16fc-frgco,
END OF ls_grp,
lt_grp LIKE TABLE OF ls_grp.
FIELD-SYMBOLS:<lfs_v1> TYPE any.
* logic part
lw_in = ps_in.
lt_item = lw_in-is_value-it_items1.
lt_spjd = lw_in-is_value-it_items2.
MOVE-CORRESPONDING lw_in-is_value TO lw_head .
IF lw_in-is_value-ebeln IS INITIAL.
ps_out-es_value-code = 'E'.
ps_out-es_value-msg = '采购单号必填,请核实数据!'.
RETURN.
ENDIF.
LOOP AT lt_item ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-ebeln IS INITIAL.
ps_out-es_value-code = 'E'.
ps_out-es_value-msg = '采购单号必填,请核实数据!'.
RETURN.
ENDIF.
IF <fs_item>-ebelp IS INITIAL.
ps_out-es_value-code = 'E'.
ps_out-es_value-msg = '采购行项目必填,请核实数据!'.
RETURN.
ENDIF.
ENDLOOP.
LOOP AT lt_spjd ASSIGNING FIELD-SYMBOL(<fs_spjd>).
IF <fs_spjd>-ebeln IS INITIAL.
ps_out-es_value-code = 'E'.
ps_out-es_value-msg = '采购订单必填,请核实数据!'.
RETURN.
ENDIF.
ENDLOOP.
* Get po's approve code and get apporve leve code
IF lw_head-zspbs = 'R' . " Approve po
SELECT k~ebeln,k~frgzu,s~frgc1,s~frgc2,s~frgc3,s~frgc4,
s~frgc5,s~frgc6,s~frgc7,s~frgc8
FROM t16fs AS s
INNER JOIN ekko AS k
ON k~frggr = s~frggr
AND k~frgsx = s~frgsx
WHERE k~ebeln = @lw_head-ebeln
AND k~frgrl = @abap_true "FRGRL 字段标示审批是否结束
INTO TABLE @DATA(lt_t16fs).
READ TABLE lt_t16fs ASSIGNING FIELD-SYMBOL(<lfs_t16fs>) INDEX 1.
IF sy-subrc EQ 0.
DO 8 TIMES.
lv_str = sy-index.
lv_str = 'FRGC' && lv_str.
CONDENSE lv_str NO-GAPS.
ASSIGN COMPONENT lv_str OF STRUCTURE <lfs_t16fs> TO <lfs_v1>.
IF sy-subrc EQ 0.
IF <lfs_v1> IS NOT INITIAL.
DATA(lv_x) = <lfs_t16fs>-frgzu+lv_offset(1).
IF lv_x IS INITIAL."未审批
ls_grp-frgco = <lfs_v1>.
APPEND ls_grp TO lt_grp.
ENDIF.
ENDIF.
ENDIF.
lv_offset = lv_offset + 1.
ENDDO.
CLEAR lv_str.
ENDIF.
* Approve po's order
LOOP AT lt_grp INTO ls_grp.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
purchaseorder = lw_head-ebeln
po_rel_code = ls_grp-frgco
TABLES
return = lt_return.
LOOP AT lt_return INTO ls_return
WHERE type = 'E' OR type = 'A'.
lv_str = lv_str && '|' && ls_return-message.
DATA(lv_flag) = abap_true.
ENDLOOP.
SHIFT lv_str LEFT DELETING LEADING '|'.
IF lv_flag EQ abap_true.
EXIT.
ENDIF.
WAIT UP TO 1 SECONDS.
ENDLOOP.
IF lv_flag EQ abap_true."失败
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ps_out-es_value-code = 'E'.
ps_out-es_value-msg = '审核失败'.
ELSE."成功
ps_out-es_value-code = 'S'.
ps_out-es_value-msg = '审核成功'.
ENDIF.
* Disapprove po's order .
ELSE. "
CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
EXPORTING
purchaseorder = lw_head-ebeln
po_rel_code = 'R2'
use_exceptions = 'X'
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.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ps_out-es_value-code = 'E'.
ps_out-es_value-msg = '审核失败'.
ELSE.
ps_out-es_value-code = 'S'.
ps_out-es_value-msg = '审核成功'.
ENDIF.
ENDIF.
MODIFY ZMMT003_head FROM lw_head.
MODIFY ZMMT003_item FROM TABLE lt_item.
MODIFY ZMMT003_spjd FROM TABLE lt_spjd.
IF sy-subrc = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK .
ENDIF.