结合两个SAP标准的函数完成仅是修改内部订单基本主数据
1、KAUF_ORDER_READ
2、KAUF_ORDER_STORE
如果还要需要修改AUFK表中的订单状态 和 结算规则系统状态需要再加一个内部订单状态的标准函数
3、STATUS_CHANGE_INTERN
1-3 组可以修改整个内部订单的数据
DATA i_actvt TYPE tact-actvt.
DATA i_aufnr TYPE aufk-aufnr.
DATA e_afko TYPE afko.
DATA e_afpo TYPE afpo.
DATA e_coas_old TYPE coas.
DATA lv_desp LIKE zpv_s_lgcont-desp.
DATA ls_coas TYPE coas."订单信息
DATA ls_kauf TYPE kauf.
DATA lt_set_stat TYPE STANDARD TABLE OF jstat.
DATA:ls_set_stat TYPE jstat.
DATA:lt_jest TYPE TABLE OF jest.
DATA:ls_jest TYPE jest.
"读取内部订单信息信息
CALL FUNCTION 'KAUF_ORDER_READ'
EXPORTING
i_actvt = '03'
i_aufnr = p_aufnr
IMPORTING
e_coas = ls_coas
e_kauf = ls_kauf
* e_coas_old = e_coas_old
EXCEPTIONS
auart_not_found = 1
foreign_lock = 2
no_authority = 3
order_not_found = 4
order_type_not_valid = 5
wrong_input = 6
logsystem_inconsistent = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
PERFORM frm_build_msg USING sy-msgid sy-msgno
sy-msgv1 sy-msgv2
sy-msgv3 sy-msgv4
CHANGING lv_desp.
pt_ret-type = c_e.
pt_ret-message = '内部订单状态修改失败' && lv_desp.
APPEND pt_ret. CLEAR pt_ret.
RETURN.
ENDIF.
ls_coas-phas3 = abap_true.
ls_coas-phas1 = abap_false.
ls_coas-phas2 = abap_false.
ls_coas-phas0 = abap_false.
CALL FUNCTION 'KAUF_ORDER_STORE'
EXPORTING
i_check = 'N'
i_coas = ls_coas
* I_DIALOG = ' '
i_kauf = ls_kauf
i_save_flag = 'X'
EXCEPTIONS
illegal_change = 1
order_not_in_buffer = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
PERFORM frm_build_msg USING sy-msgid sy-msgno
sy-msgv1 sy-msgv2
sy-msgv3 sy-msgv4
CHANGING lv_desp.
pt_ret-type = c_e.
pt_ret-message = '内部订单状态修改失败' && lv_desp.
APPEND pt_ret. CLEAR pt_ret.
RETURN.
ELSE.
CONSTANTS:
l_con_stk_crtd TYPE jest-stat VALUE 'I0001',"建立 PHAS1 状态 "订单建立"
l_con_stk_rel TYPE jest-stat VALUE 'I0002',"已释放 PHAS2 状态 "订单完成"
l_con_stk_setc TYPE jest-stat VALUE 'I0028',"结算规则维护 这个状态 保持激活状态
l_con_stk_teco TYPE jest-stat VALUE 'I0045',"技术实现 PHAS2 状态 "订单完成"
l_con_stk_clsd TYPE jest-stat VALUE 'I0046'."算结算 PHAS3 状态 "订单关闭"
REFRESH lt_set_stat.
SELECT * FROM jest
INTO TABLE lt_jest
WHERE stat IN ('I0001','I0002','I0045','I0046')
AND objnr EQ ls_coas-objnr.
LOOP AT lt_jest INTO ls_jest.
IF ls_jest-stat EQ l_con_stk_clsd.
CLEAR:ls_jest-inact.
ELSE.
ls_jest-inact = abap_true.
ENDIF.
MOVE-CORRESPONDING ls_jest TO ls_set_stat.
APPEND ls_set_stat TO lt_set_stat.
CLEAR:ls_set_stat.
ENDLOOP.
CALL FUNCTION 'STATUS_CHANGE_INTERN'
EXPORTING
objnr = ls_coas-objnr
TABLES
status = lt_set_stat
EXCEPTIONS
object_not_found = 1
status_inconsistent = 2
status_not_allowed = 3
OTHERS = 4.
IF sy-subrc <> 0.
PERFORM frm_build_msg USING sy-msgid sy-msgno
sy-msgv1 sy-msgv2
sy-msgv3 sy-msgv4
CHANGING lv_desp.
pt_ret-type = c_e.
pt_ret-message = '内部订单状态修改失败' && lv_desp.
APPEND pt_ret. CLEAR pt_ret.
RETURN.
ELSE.
COMMIT WORK AND WAIT.
PERFORM frm_build_msg USING sy-msgid sy-msgno
sy-msgv1 sy-msgv2
sy-msgv3 sy-msgv4
CHANGING lv_desp.
pt_ret-type = c_s.
pt_ret-message = '内部订单状态修改成功' && lv_desp.
APPEND pt_ret. CLEAR pt_ret.
ENDIF.
ENDIF.