SAP-MM批量关闭PR用户版

(一)页面设计

处理逻辑:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值