业务目的:开发一个接口,传入生产订单号,审批状态和文本备注,调用BAPI修改采购订单的审批策略,审批状态为’1’审批通过,审批状态’2’审批不通过。
接口传入:
接口传出:
直接上接口代码,复制即可使用:
FUNCTION Z_MM_MODIFY_APPROVAL_STATUS.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_HEAD) TYPE ZMMSMAS
*" EXPORTING
*" VALUE(E_MSG_TYP) TYPE ZMSG_TYPE
*" VALUE(E_RET_MSG) TYPE ZRET_MSG
*" VALUE(E_PROCESS_NUMBER) TYPE ZOA_PROCESS_NUMBER
*"----------------------------------------------------------------------
TYPES:BEGIN OF TY_EKKO,
EBELN TYPE EKKO-EBELN, "采购订单编号
FRGGR TYPE EKKO-FRGGR, "审批组
FRGSX TYPE EKKO-FRGSX, "审批策略
FRGZU TYPE EKKO-FRGZU, "版本状态
BSART TYPE EKKO-BSART, "采购凭证类型
EKORG TYPE EKKO-EKORG. "采购组织
TYPES END OF TY_EKKO.
DATA:LT_TLINE TYPE TABLE OF TLINE,
LS_TLINE TYPE TLINE.
DATA:FNAME TYPE THEAD-TDNAME.
DATA:LT_EKKO TYPE TABLE OF TY_EKKO.
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_RETURN TYPE STRING.
* DATA:LT_T16FD TYPE TABLE OF T16FD.
FIELD-SYMBOLS: <FS_FIELD> TYPE T16FS-FRGC1. "当前审批组值
CLEAR: L_LEVEL,
L_LAST_CHAR,
L_FIELDNAME.
SELECT EBELN "采购订单
FRGGR "审批组
FRGSX "审批策略
FRGZU "版本状态
BSART "采购凭证类型
EKORG "采购组织
INTO TABLE LT_EKKO
FROM EKKO
WHERE EBELN = I_HEAD-EBELN.
"根据审批组取对应批准策略
SELECT *
INTO TABLE @DATA(LT_T16FS)
FROM T16FS
FOR ALL ENTRIES IN @LT_EKKO
WHERE FRGGR = @LT_EKKO-FRGGR "审批组
AND FRGSX = @LT_EKKO-FRGSX. "审批策略
WITH +DATA AS ( SELECT DISTINCT FRGGR FROM @LT_EKKO AS LT_DATA )
SELECT +DATA~FRGGR,
T16FD~FRGCT
FROM +DATA
INNER JOIN T16FD
ON +DATA~FRGGR = T16FD~FRGGR
INTO TABLE @DATA(LT_T16FD).
READ TABLE LT_EKKO ASSIGNING FIELD-SYMBOL(<FS_EKKO>) WITH KEY EBELN = I_HEAD-EBELN.
IF SY-SUBRC EQ 0 AND <FS_EKKO>-FRGZU IS NOT INITIAL.
"根据采购订单的审批组、审批策略取对应的审批组
READ TABLE LT_T16FS ASSIGNING FIELD-SYMBOL(<FS_T16FS>) WITH KEY FRGGR = <FS_EKKO>-FRGGR FRGSX = <FS_EKKO>-FRGSX.
"计算审批通过级数
L_LEVEL = STRLEN( <FS_EKKO>-FRGZU ).
"取消采购订单,只取消第一级审批就可以,不需要逐级取消审批,如果逐级取消审批后造成采购订单被锁定错误
IF I_HEAD-RESULT = '2'.
"组成字段名
CONCATENATE L_PRE_FIELD '1' INTO L_FIELDNAME.
"通过指针获取批准代码
ASSIGN COMPONENT L_FIELDNAME OF STRUCTURE <FS_T16FS> TO <FS_FIELD>.
CALL FUNCTION 'BAPI_PO_RESET_RELEASE'
EXPORTING
PURCHASEORDER = <FS_EKKO>-EBELN
PO_REL_CODE = <FS_FIELD>
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.
CALL FUNCTION 'MESSAGE_TEXT_BUILD' "对于没有返回文本信息的BAPI可以调用此函数查看返回信息
EXPORTING
MSGID = SY-MSGID
MSGNR = SY-MSGNO
MSGV1 = SY-MSGV1
MSGV2 = SY-MSGV2
MSGV3 = SY-MSGV3
MSGV4 = SY-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_RETURN.
E_RET_MSG = LV_RETURN.
E_MSG_TYP = 'E'.
ENDIF.
IF E_MSG_TYP NE 'E'.
PERFORM FRM_UPDATA_EKKO USING I_HEAD-EBELN '08'.
ENDIF.
ENDIF.
IF I_HEAD-RESULT = '1'. "批准采购订单,由前往后逐级审批
L_LEVEL = LINES( LT_T16FD ).
DO L_LEVEL TIMES.
L_LAST_CHAR = SY-INDEX.
CONCATENATE L_PRE_FIELD L_LAST_CHAR INTO L_FIELDNAME.
ASSIGN COMPONENT L_FIELDNAME OF STRUCTURE <FS_T16FS> TO <FS_FIELD>.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
PURCHASEORDER = <FS_EKKO>-EBELN
PO_REL_CODE = <FS_FIELD>
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 AND L_LEVEL = SY-TABIX.
CLEAR LV_RETURN.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = SY-MSGID
MSGNR = SY-MSGNO
MSGV1 = SY-MSGV1
MSGV2 = SY-MSGV2
MSGV3 = SY-MSGV3
MSGV4 = SY-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_RETURN.
E_RET_MSG = LV_RETURN.
E_MSG_TYP = 'E'.
ENDIF.
ENDDO.
IF E_MSG_TYP NE 'E'.
PERFORM FRM_UPDATA_EKKO USING I_HEAD-EBELN '05'.
ENDIF.
ENDIF.
IF I_HEAD-RESULT NE '1' AND I_HEAD-RESULT NE '2'.
E_MSG_TYP = 'E'.
E_RET_MSG = '批准状态 ' && I_HEAD-RESULT && '错误,请检查输入'.
ENDIF.
"写入文本备注
IF I_HEAD-HEADTXT1 IS NOT INITIAL.
CALL FUNCTION 'C14W_STRING_TO_TLINE'
EXPORTING
I_STRING = I_HEAD-HEADTXT1
TABLES
E_TLINE_TAB = LT_TLINE.
FNAME = I_HEAD-EBELN .
CALL FUNCTION 'CREATE_TEXT' "创建长文本
EXPORTING
FID = 'F01'
FLANGUAGE = '1'
FNAME = FNAME
FOBJECT = 'EKKO'
SAVE_DIRECT = 'X'
TABLES
FLINES = LT_TLINE.
ENDIF.
ENDIF.
IF E_MSG_TYP IS INITIAL.
E_MSG_TYP = 'S'.
CLEAR LV_RETURN.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = SY-MSGID
MSGNR = SY-MSGNO
MSGV1 = SY-MSGV1
MSGV2 = SY-MSGV2
MSGV3 = SY-MSGV3
MSGV4 = SY-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_RETURN.
E_RET_MSG = LV_RETURN.
IF SY-MSGNO = '000'.
E_RET_MSG = '操作成功 未发现错误'.
ENDIF.
ENDIF.
ENDFUNCTION.
FORM FRM_UPDATA_EKKO USING EBELN PROCSTAT.
WAIT UP TO 2 SECONDS.
UPDATE EKKO SET PROCSTAT = PROCSTAT WHERE EBELN = EBELN.
COMMIT WORK AND WAIT .
ENDFORM.
对于创建长文本,调用CREATE_TEXT函数即可
CALL FUNCTION 'C14W_STRING_TO_TLINE'
EXPORTING
I_STRING = I_HEAD-HEADTXT1
TABLES
E_TLINE_TAB = LT_TLINE.
FNAME = I_HEAD-EBELN .
CALL FUNCTION 'CREATE_TEXT' "创建长文本
EXPORTING
FID = 'F01'
FLANGUAGE = '1'
FNAME = FNAME
FOBJECT = 'EKKO'
SAVE_DIRECT = 'X'
TABLES
FLINES = LT_TLINE.
双击长文本框,然后点击 转到->表头 查看文本信息