检验批过账冲销函数.docx
《检验批过账冲销函数.docx》由会员分享,可在线阅读,更多相关《检验批过账冲销函数.docx(21页珍藏版)》请在冰豆网上搜索。
检验批过账冲销函数
FUNCTION ZRFC.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(PI_PRUEFLOS) TYPE QALS-PRUEFLOS
*" EXPORTING
*" VALUE(PO_TYPE) TYPE CHAR1
*" VALUE(PO_MESS) TYPE BAPI_MSG
*"----------------------------------------------------------------------
DATA prueflos TYPE qals-prueflos.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = pi_prueflos
IMPORTING
output = prueflos.
CALL FUNCTION 'ENQUEUE_EQQALS1'
EXPORTING
prueflos = prueflos
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
CLEAR g_qals.
CALL FUNCTION 'QPSE_LOT_READ'
EXPORTING
i_prueflos = prueflos
i_reset_lot = 'X'
IMPORTING
e_qals = g_qals
EXCEPTIONS
no_lot = 1.
IF sy-subrc = 0.
PERFORM check_lot USING g_qals
g_subrc.
IF NOT g_subrc IS INITIAL.
CASE g_subrc.
WHEN 256.
g_msgv1 = 'Lot & does not refer to a material doc'.
WHEN 128.
g_msgv1 = 'Material & is serialized'.
REPLACE '&' WITH g_qals-matnr INTO g_msgv1.
WHEN 64.
g_msgv1 = 'Lot & is not stock relevant'.
WHEN 32.
g_msgv1 = 'Lot &:
No stock transferred'.
WHEN 16.
g_msgv1 = 'Lot & is cancelled'.
WHEN 8.
g_msgv1 = 'Lot & is archived'.
WHEN 4.
g_msgv1 = 'Lot & is blocked'.
WHEN 2.
g_msgv1 = 'Lot & is HU managed'.
ENDCASE.
REPLACE '&' WITH prueflos INTO g_msgv1.
po_type = 'E'.
po_mess = g_msgv1.
ENDIF.
ELSE.
po_type = 'E'.
po_mess = '检验批不存在'.
ENDIF.
IF po_mess IS INITIAL.
CLEAR g_qamb_tab[].
SELECT * FROM qamb INTO TABLE g_qamb_tab
WHERE prueflos = g_qals-prueflos
AND typ = '3'.
IF sy-subrc <> 0.
po_type = 'E'.
po_mess = '检验批尚未过账'.
ELSE.
CLEAR g_mkpf_tab[].
PERFORM read_mkpf USING g_qamb_tab
g_mkpf_tab
g_subrc.
CLEAR g_mseg_tab[].
PERFORM read_mseg USING g_mkpf_tab
g_mseg_tab
g_subrc.
PERFORM check_mseg USING g_mseg_tab
g_qamb_tab
g_subrc.
PERFORM create_goods_movement USING g_qals
g_mseg_tab
g_subrc
po_mess.
IF po_mess IS INITIAL.
PERFORM post_goods_movement.
PERFORM post_data USING g_qals
g_qals_leiste
g_qamb_tab
g_qamb_vb_tab
g_subrc .
IF NOT g_subrc IS INITIAL.
po_mess = 'E'.
MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
INTO po_mess
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
COMMIT WORK AND WAIT.
po_type = 'S'.
po_mess = '冲销成功'.
ENDIF.
ELSE.
po_type = 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Form CHECK_LOT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_QALS text
* -->P_SUBRC text
*----------------------------------------------------------------------*
FORM check_lot USING p_qals LIKE qals
p_subrc LIKE sy-subrc.
DATA:
l_stat LIKE jstat,
l_stat_tab LIKE jstat OCCURS 0 WITH HEADER LINE.
p_subrc = 256.
*/No reference to material document
IF p_qals-zeile IS INITIAL.
EXIT.
ELSE.
p_subrc = 128.
ENDIF.
*/Serialized Material
IF NOT p_qals-sernp IS INITIAL.
EXIT.
ELSE.
p_subrc = 64.
ENDIF.
*/BERF
CALL FUNCTION 'STATUS_CHECK'
EXPORTING
objnr = p_qals-objnr
status = 'I0203'
EXCEPTIONS
status_not_active = 2.
IF NOT sy-subrc IS INITIAL.
EXIT.
ELSE.
p_subrc = 32.
ENDIF.
*/BTEI & BEND
CLEAR l_stat. CLEAR l_stat_tab. REFRESH l_stat_tab.
l_stat-stat = 'I0219'. APPEND l_stat TO l_stat_tab. "BTEI
l_stat-stat = 'I0220'. APPEND l_stat TO l_stat_tab. "BEND
CALL FUNCTION 'STATUS_OBJECT_CHECK_MULTI'
EXPORTING
objnr = p_qals-objnr
TABLES
status_check = l_stat_tab.
IF l_stat_tab[] IS INITIAL.
EXIT.
ELSE.
p_subrc = 16.
ENDIF.
*/LSTO & LSTV
CLEAR l_stat. CLEAR l_stat_tab. REFRESH l_stat_tab.
l_stat-stat = 'I0224'. APPEND l_stat TO l_stat_tab. "LSTO
l_stat-stat = 'I0232'. APPEND l_stat TO l_stat_tab. "LSTV
CALL FUNCTION 'STATUS_OBJECT_CHECK_MULTI'
EXPORTING
objnr = p_qals-objnr
TABLES
status_check = l_stat_tab.
IF NOT l_stat_tab[] IS INITIAL.
EXIT.
ELSE.
p_subrc = 8.
ENDIF.
*/ARSP & ARCH & REO1 & REO2 & REO3
CLEAR l_stat. CLEAR l_stat_tab. REFRESH l_stat_tab.
l_stat-stat = 'I0225'. APPEND l_stat TO l_stat_tab. "ARSP
l_stat-stat = 'I0226'. APPEND l_stat TO l_stat_tab. "ARCH
l_stat-stat = 'I0227'. APPEND l_stat TO l_stat_tab. "REO3
l_stat-stat = 'I0228'. APPEND l_stat TO l_stat_tab. "REO2
l_stat-stat = 'I0229'. APPEND l_stat TO l_stat_tab. "REO1
CALL FUNCTION 'STATUS_OBJECT_CHECK_MULTI'
EXPORTING
objnr = p_qals-objnr
TABLES
status_check = l_stat_tab.
IF NOT l_stat_tab[] IS INITIAL.
EXIT.
ELSE.
p_subrc = 4.
ENDIF.
*/SPER
CALL FUNCTION 'STATUS_CHECK'
EXPORTING
objnr = p_qals-objnr
status = 'I0043'
EXCEPTIONS
status_not_active = 2.
IF sy-subrc IS INITIAL.
EXIT.
ELSE.
p_subrc = 2.
ENDIF.
*/HUM
CALL FUNCTION 'STATUS_CHECK'
EXPORTING
objnr = p_qals-objnr
status = 'I0443'
EXCEPTIONS
status_not_active = 2.
IF sy-subrc IS INITIAL.
EXIT.
ELSE.
p_subrc = 0.
ENDIF.
ENDFORM. " CHECK_LOT
*&---------------------------------------------------------------------*
*& Form READ_MKPF
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_QAMB_TAB text
* -->P_MKPF_TAB text
* -->P_SUBRC text
*----------------------------------------------------------------------*
FORM read_mkpf USING p_qamb_tab TYPE qambtab
p_mkpf_tab TYPE t_mkpf_tab
p_subrc LIKE sy-subrc.
DATA:
BEGIN OF l_mkpf_key_tab OCCURS 0,
mblnr LIKE mkpf-mblnr,
mjahr LIKE mkpf-mjahr,
END OF l_mkpf_key_tab.
DATA:
l_qamb LIKE qamb,
l_mkpf LIKE mkpf,
l_trtyp LIKE t158-trtyp VALUE 'A',
l_vgart LIKE t158-vgart VALUE 'WQ',
l_xexit LIKE qm00-qkz.
p_subrc = 4.
LOOP AT p_qamb_tab INTO l_qamb.
l_mkpf_key_tab-mblnr = l_qamb-mblnr.
l_mkpf_key_tab-mjahr = l_qamb-mjahr.
COLLECT l_mkpf_key_tab.
ENDLOOP.
LOOP AT l_mkpf_key_tab.
CALL FUNCTION 'ENQUEUE_EMMKPF'
EXPORTING
mblnr = l_mkpf_key_tab-mblnr
mjahr = l_mkpf_key_tab-mjahr
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF NOT sy-subrc IS INITIAL.
l_xexit = 'X'.
EXIT.
ENDIF.
CLEAR:
l_mkpf.
CALL FUNCTION 'MB_READ_MATERIAL_HEADER'
EXPORTING
mblnr = l_mkpf_key_tab-mblnr
mjahr = l_mkpf_key_tab-mjahr
trtyp = l_trtyp
vgart = l_vgart
IMPORTING
kopf = l_mkpf
EXCEPTIONS
error_message = 1.
IF NOT sy-subrc IS INITIAL.
l_xexit = 'X'.
EXIT.
ELSE.
APPEND l_mkpf TO p_mkpf_tab.
ENDIF.
ENDLOOP.
IF NOT l_xexit IS INITIAL.
EXIT.
ELSE.
p_subrc = 0.
ENDIF.
ENDFORM. " READ_MKPF
*&---------------------------------------------------------------------*
*& Form READ_MSEG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_MKPF_TAB text
* -->P_MSEG_TAB text
* -->P_SUBRC text
*----------------------------------------------------------------------*
FORM read_mseg USING p_mkpf_tab TYPE t_mkpf_tab
p_mseg_tab TYPE t_mseg_tab
p_subrc LIKE sy-subrc.
DATA:
l_mkpf LIKE mkpf,
l_mseg_tab LIKE mseg OCCURS 0 WITH HEADER LINE,
l_trtyp LIKE t158-trtyp VALUE 'A',
l_xexit LIKE qm00-qkz.
p_subrc = 4.
LOOP AT p_mkpf_tab INTO l_mkpf.
CLEAR:
l_mseg_tab. REFRESH:
l_mseg_tab.
CALL FUNCTION 'MB_READ_MATERIAL_POSITION'
EXPORTING
mblnr = l_mkpf-mblnr
mjahr = l_mkpf-mjahr
trtyp = l_trtyp
*/ ZEILB = P_ZEILE
*/ ZEILE = P_ZEILE
TABLES
seqtab = l_mseg_tab
EXCEPTIONS
error_message = 1.
IF NOT sy-subrc IS INITIAL.
l_xexit = 'X'.
EXIT.