(一)页面设计
处理逻辑:
A:
*&---------------------------------------------------------------------*
*& Include ZMMPR005TOP Report ZMMPR005
*&
*&---------------------------------------------------------------------*
REPORT zmmpr005.
INCLUDE zfrm_report_register.
TYPE-POOLS: slis.
DATA: gt_headercat TYPE slis_t_listheader,
gs_headercat TYPE slis_listheader,
gt_fieldcat TYPE slis_t_fieldcat_alv,
gs_fieldcat TYPE slis_fieldcat_alv,
gs_layout TYPE slis_layout_alv,
gt_sortcat TYPE slis_t_sortinfo_alv,
gs_sortcat TYPE slis_sortinfo_alv,
gt_eventcat TYPE slis_t_event,
gs_eventcat TYPE slis_alv_event,
gs_keyinfo TYPE slis_keyinfo_alv.
TABLES:eban.
DATA:BEGIN OF gt_list OCCURS 0,
sex TYPE c,
badat LIKE eban-badat,
erdat LIKE eban-erdat,
banfn LIKE eban-banfn, "采购申请编号
bnfpo LIKE eban-bnfpo,"行项目编号
bsart LIKE eban-bsart,"采购申请凭证类型
ebakz LIKE eban-ebakz,"结算标识
ekgrp LIKE eban-ekgrp,"采购组
afnam LIKE eban-afnam,"需求者/请求者姓名
matnr LIKE eban-matnr,"物料号
txz01 LIKE eban-txz01,
werks LIKE eban-werks,"工厂
lgort LIKE eban-lgort,"库存地点
bednr LIKE eban-bednr,"需求跟踪号
matkl LIKE eban-matkl ,"物料组
menge LIKE eban-menge,"数量
meins LIKE eban-meins,"单位
lfdat LIKE eban-lfdat,"交货日期
dispo LIKE eban-dispo,"MRP 控制者
bsmng LIKE eban-bsmng,"订单数量
bz TYPE string,
END OF gt_list.
DATA:gt_lista LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_listx LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_listi LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_liste LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:ls_listi LIKE gt_list,
ls_listj LIKE gt_list,
ls_liste LIKE gt_list,
ls_listf LIKE gt_list.
DATA lt_pritem LIKE bapimereqitemimp OCCURS 0 WITH HEADER LINE.
DATA lt_pritemx LIKE bapimereqitemx OCCURS 0 WITH HEADER LINE.
DATA lt_acco LIKE bapimereqaccount OCCURS 0 WITH HEADER LINE.
DATA lt_accox LIKE bapimereqaccountx OCCURS 0 WITH HEADER LINE.
DATA lt_ret LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA:lt_123 LIKE bapimereqheader OCCURS 0 WITH HEADER LINE.
DATA:lt_123x LIKE bapimereqheaderx OCCURS 0 WITH HEADER LINE.
DATA:lt_124 LIKE bapimereqitem OCCURS 0 WITH HEADER LINE.
DATA:lt_listw LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:BEGIN OF lt_eban OCCURS 0,
bsmng LIKE eban-bsmng,
badat LIKE eban-badat,
erdat LIKE eban-erdat,
banfn LIKE eban-banfn, "采购申请编号
bnfpo LIKE eban-bnfpo,"行项目编号
bsart LIKE eban-bsart,"采购申请凭证类型
loekz LIKE eban-loekz,"删除标识
ekgrp LIKE eban-ekgrp,"采购组
afnam LIKE eban-afnam,"需求者/请求者姓名
matnr LIKE eban-matnr,"物料号
werks LIKE eban-werks,"工厂
lgort LIKE eban-lgort,"库存地点
bednr LIKE eban-bednr,"需求跟踪号
matkl LIKE eban-matkl ,"物料组
menge LIKE eban-menge,"数量
meins LIKE eban-meins,"单位
lfdat LIKE eban-lfdat,"交货日期
dispo LIKE eban-dispo,"MRP 控制者
txz01 LIKE eban-txz01,
frgkz LIKE eban-frgkz,
frgst LIKE eban-frgst,
frggr LIKE eban-frggr,
ebakz LIKE eban-ebakz,"结算标识
END OF lt_eban.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_bsart FOR eban-bsart , "采购申请凭证类型
s_banfn FOR eban-banfn," 采购申请编号
s_ekgrp FOR eban-ekgrp,"采购组
s_lfdat FOR eban-lfdat,"交货日期
s_bednr FOR eban-bednr, "需求跟踪号
s_badat FOR eban-badat.
*PARAMETER p_loekz LIKE eban-loekz."删除标记
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
SELECT-OPTIONS:s_matkl FOR eban-matkl, "物料组
s_matnr FOR eban-matnr,"物料号
s_mrp FOR eban-dispo,"MRP控制者
s_lgort FOR eban-lgort."仓库
PARAMETER p_werks LIKE eban-werks OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b2.
B:
*&---------------------------------------------------------------------*
*& 包含 ZMMPR005E01
*&---------------------------------------------------------------------*
INITIALIZATION.
PERFORM chshi.
AT SELECTION-SCREEN.
PERFORM check.
START-OF-SELECTION.
PERFORM save_report_register.
PERFORM getdata.
PERFORM build_fieldcat.
PERFORM build_sortcat.
PERFORM build_event.
PERFORM build_layout.
END-OF-SELECTION.
PERFORM dispaly_alv_data.
C:
*&---------------------------------------------------------------------*
*& 包含 ZMMPR005F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form CHSHI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM chshi .
ENDFORM. " CHSHI
*&---------------------------------------------------------------------*
*& Form CHECK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM check .
ENDFORM. " CHECK
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM getdata .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_eban
FROM eban
WHERE banfn IN s_banfn
AND bsart IN s_bsart
AND ekgrp IN s_ekgrp
AND lfdat IN s_lfdat
AND matkl IN s_matkl
AND matnr IN s_matnr
AND werks = p_werks
AND lgort IN s_lgort
AND bednr IN s_bednr
AND dispo IN s_mrp
AND badat IN s_badat
AND loekz <> 'X'
AND ebakz <> 'X'
AND frgkz IN ('','X', 'E').
IF lt_eban[] IS INITIAL.
MESSAGE'未发现符合条件的数据,请查证后重新输入条件'
TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
LOOP AT lt_eban.
MOVE-CORRESPONDING lt_eban TO gt_list.
IF lt_eban-bsmng = lt_eban-menge.
CONTINUE.
ENDIF.
APPEND gt_list.
CLEAR: gt_list, lt_eban.
ENDLOOP.
IF gt_list[] IS INITIAL.
MESSAGE'未发现符合条件的数据,请查证后重新输入条件'
TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
gt_lista[] = gt_list[].
ENDFORM. " GETDATA
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_fieldcat .
FIELD-SYMBOLS <lfs_fieldcat> TYPE slis_fieldcat_alv.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_internal_tabname = 'GT_LIST'
i_inclname = sy-repid
CHANGING
ct_fieldcat = gt_fieldcat.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT gt_fieldcat ASSIGNING <lfs_fieldcat>.
CASE <lfs_fieldcat>-fieldname.
WHEN 'SEX'.
<lfs_fieldcat>-tech = 'X'.
WHEN 'EBAKZ'.
<lfs_fieldcat>-edit = 'X'.
* WHEN'MENGE'.
* <lfs_fieldcat>-edit = 'X'.
* WHEN'LFDAT'.
* <lfs_fieldcat>-edit = 'X'.
* WHEN'BSMNG'.
* <lfs_fieldcat>-tech = 'X'.
WHEN'BZ'.
<lfs_fieldcat>-seltext_l = text-f01.
<lfs_fieldcat>-seltext_m = text-f01.
<lfs_fieldcat>-seltext_s = text-f01.
<lfs_fieldcat>-reptext_ddic = text-f01.
ENDCASE.
ENDLOOP.
ENDFORM. " BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form BUILD_SORTCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_sortcat .
ENDFORM. " BUILD_SORTCAT
*&---------------------------------------------------------------------*
*& Form BUILD_EVENT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_event .
ENDFORM. " BUILD_EVENT
*&---------------------------------------------------------------------*
*& Form BUILD_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM build_layout .
gs_layout-colwidth_optimize = 'X'. " 自动调整列宽
gs_layout-box_fieldname = 'SEX'.
ENDFORM. " BUILD_LAYOUT
*&---------------------------------------------------------------------*
*& Form DISPALY_ALV_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM dispaly_alv_data .
DATA:lv_settings TYPE lvc_s_glay.
lv_settings-edt_cll_cb = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = gt_fieldcat
it_sort = gt_sortcat
it_events = gt_eventcat
is_layout = gs_layout
i_save = 'A'
i_grid_settings = lv_settings
i_callback_user_command = 'USER_COMMAND'
i_callback_pf_status_set = 'SET_PF_STATUS'
TABLES
t_outtab = gt_list
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " DISPALY_ALV_DATA
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZMMPR005'.
* SET TITLEBAR 'TITLE' .
ENDFORM.
FORM user_command USING r_ucom LIKE sy-ucomm
rs_selfield TYPE slis_selfield .
DATA: g_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = g_grid.
* CALL METHOD G_GRID->REFRESH_TABLE_DISPLAY.
CALL METHOD g_grid->check_changed_data.
rs_selfield-refresh = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
CASE r_ucom.
WHEN 'ZALL'.
LOOP AT gt_list.
gt_list-ebakz = 'X'.
MODIFY gt_list .
CLEAR gt_list.
ENDLOOP.
WHEN'ZRAL'.
LOOP AT gt_list.
gt_list-ebakz = ''.
MODIFY gt_list .
CLEAR gt_list.
ENDLOOP.
WHEN 'ZSAV'.
PERFORM bapi_creat .
LOOP AT gt_list WHERE bz IS INITIAL.
DELETE gt_list.
CONTINUE.
ENDLOOP.
IF gt_list[] IS INITIAL.
MESSAGE'本次关闭全部成功' TYPE 'S'.
LEAVE PROGRAM.
ENDIF.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BAPI_CREAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM bapi_creat .
SORT gt_list BY banfn bnfpo.
SORT lt_eban BY banfn bnfpo.
LOOP AT gt_list WHERE ebakz = 'X'.
READ TABLE lt_eban WITH KEY banfn = gt_list-banfn
bnfpo = gt_list-bnfpo
frgkz = ''
BINARY SEARCH.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING gt_list TO lt_listx.
APPEND lt_listx.
ENDIF.
READ TABLE lt_eban WITH KEY banfn = gt_list-banfn
bnfpo = gt_list-bnfpo
frgkz = 'X'
BINARY SEARCH.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING gt_list TO lt_listx.
APPEND lt_listx.
ENDIF.
READ TABLE lt_eban WITH KEY banfn = gt_list-banfn
bnfpo = gt_list-bnfpo
frgkz = 'I'
BINARY SEARCH.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING gt_list TO lt_listi.
APPEND lt_listi.
ENDIF.
READ TABLE lt_eban WITH KEY banfn = gt_list-banfn
bnfpo = gt_list-bnfpo
frgkz = 'E'
BINARY SEARCH.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING gt_list TO lt_liste.
APPEND lt_liste.
ENDIF.
CLEAR:lt_eban,gt_list,lt_listx,lt_listi,lt_liste.
ENDLOOP.
IF lt_listx[] IS NOT INITIAL.
CLEAR:lt_listw,lt_listw[].
lt_listw[] = lt_listx[].
PERFORM bapi.
ENDIF.
IF lt_listi[] IS NOT INITIAL.
CLEAR:lt_listw,lt_listw[].
lt_listw[] = lt_listi[].
PERFORM release.
PERFORM bapi.
PERFORM shenpi.
ENDIF.
IF lt_liste[] IS NOT INITIAL.
CLEAR:lt_listw,lt_listw[].
lt_listw[] = lt_liste[].
PERFORM release.
COMMIT WORK AND WAIT.
WAIT UP TO '0.5'SECONDS.
PERFORM bapi.
COMMIT WORK AND WAIT.
WAIT UP TO '0.5'SECONDS.
PERFORM shenpi.
ENDIF.
ENDFORM. " BAPI_CREAT
*&---------------------------------------------------------------------*
*& Form BAPI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM bapi .
DATA:ls_listz LIKE gt_list.
DATA:ls_listy LIKE gt_list.
DATA:lt_restabc LIKE gt_list OCCURS 0 WITH HEADER LINE.
SORT lt_listw BY banfn bnfpo.
LOOP AT lt_listw INTO ls_listz.
lt_pritem-preq_item = ls_listz-bnfpo.
lt_pritem-closed = 'X'.
APPEND lt_pritem.
lt_pritemx-preq_item = ls_listz-bnfpo.
lt_pritemx-closed = 'X'.
APPEND lt_pritemx.
ls_listy = ls_listz.
AT END OF banfn.
CALL FUNCTION 'BAPI_PR_CHANGE'
EXPORTING
number = ls_listy-banfn
TABLES
return = lt_ret
pritem = lt_pritem
pritemx = lt_pritemx.
IF sy-subrc EQ 0.
LOOP AT lt_ret WHERE type = 'E'.
lt_restabc-banfn = ls_listy-banfn.
lt_restabc-bz = lt_restabc-bz && lt_ret-message.
APPEND lt_restabc.
CLEAR:lt_ret,lt_restabc.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
CLEAR:lt_ret,lt_ret[],ls_listy,lt_pritem,lt_pritem[],
lt_pritemx,lt_pritemx[].
ENDAT.
CLEAR:lt_listw,ls_listz.
ENDLOOP.
IF lt_restabc[] IS NOT INITIAL.
LOOP AT gt_list.
READ TABLE lt_restabc WITH KEY banfn = gt_list-banfn.
IF sy-subrc EQ 0.
gt_list-bz = lt_restabc-bz.
MODIFY gt_list.
CLEAR:gt_list,lt_restabc.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " BAPI
*&---------------------------------------------------------------------*
*& Form RELEASE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM release .
DATA:lt_resa LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_qxyjc LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_ret_sq LIKE zsxx_fc01 OCCURS 0 WITH HEADER LINE.
DATA:ls_qxyja LIKE gt_list,
ls_qxyjb LIKE gt_list.
lt_resa[] = lt_listw[].
DELETE ADJACENT DUPLICATES FROM lt_resa COMPARING banfn.
LOOP AT lt_resa.
CALL FUNCTION 'ZMM_OA_RELEASE_REQ'
EXPORTING
i_banfn = lt_resa-banfn
i_zrst = '2'
TABLES
t_return = lt_ret_sq.
LOOP AT lt_ret_sq WHERE msgty = 'E'.
lt_qxyjc-banfn = lt_resa-banfn.
lt_qxyjc-bz = lt_ret_sq-msgtx.
APPEND lt_qxyjc.
CLEAR:lt_ret_sq,lt_qxyjc.
ENDLOOP.
ENDLOOP.
LOOP AT gt_list.
READ TABLE lt_qxyjc WITH KEY banfn = gt_list-banfn.
IF sy-subrc EQ 0.
gt_list-bz = lt_qxyjc-bz.
MODIFY gt_list.
CLEAR:gt_list,lt_qxyjc.
ENDIF.
ENDLOOP.
LOOP AT lt_listw.
READ TABLE lt_qxyjc WITH KEY banfn = lt_listw-banfn.
IF sy-subrc EQ 0.
DELETE lt_listw.
CLEAR:lt_listw,lt_qxyjc.
CONTINUE.
ENDIF.
ENDLOOP.
ENDFORM. " RELEASE
*&---------------------------------------------------------------------*
*& Form SHENPI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM shenpi .
DATA:lt_resb LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_yjsp LIKE gt_list OCCURS 0 WITH HEADER LINE.
DATA:lt_ret_sqa LIKE zsxx_fc01 OCCURS 0 WITH HEADER LINE.
CLEAR:lt_resb,lt_resb[].
lt_resb[] = lt_listw[].
DELETE ADJACENT DUPLICATES FROM lt_resb COMPARING banfn.
LOOP AT lt_resb.
CALL FUNCTION 'ZMM_OA_RELEASE_REQ'
EXPORTING
i_banfn = lt_resb-banfn
i_zrst = '5'
TABLES
t_return = lt_ret_sqa.
LOOP AT lt_ret_sqa WHERE msgty = 'E'.
lt_yjsp-banfn = lt_resb-banfn.
lt_yjsp-bz = lt_ret_sqa-msgtx.
APPEND lt_yjsp.
CLEAR:lt_ret_sqa,lt_yjsp.
ENDLOOP.
ENDLOOP.
LOOP AT gt_list.
READ TABLE lt_yjsp WITH KEY banfn = gt_list-banfn.
IF sy-subrc EQ 0.
gt_list-bz = lt_yjsp-bz.
MODIFY gt_list.
CLEAR:gt_list , lt_yjsp.
ENDIF.
ENDLOOP.
LOOP AT lt_listw.
READ TABLE lt_yjsp WITH KEY banfn = lt_listw-banfn.
IF sy-subrc EQ 0.
DELETE lt_listw.
CLEAR:lt_listw,lt_yjsp.
CONTINUE.
ENDIF.
ENDLOOP.
ENDFORM. " SHENPI