SAP-批量反审核采购申请及关闭

*&---------------------------------------------------------------------*
*& Report  ZRPMM_0011
*&
*&---------------------------------------------------------------------*
*&Author:XXXXXX
*&Create date:2015.12.11
*&Desc.:批量反审核及关闭采购申请单
*&---------------------------------------------------------------------*

REPORT zrpmm_0011.
TABLES:eban.

DATA:BEGIN OF gt_out OCCURS 0,
       banfn     LIKE eban-banfn,
       bnfpo     LIKE eban-bnfpo,
       bsart     LIKE eban-bsart,
       loekz     LIKE eban-loekz,
       ekgrp     LIKE eban-ekgrp,
       erdat     LIKE eban-erdat,
       txz01     LIKE eban-txz01,
       matnr     LIKE eban-matnr,
       werks     LIKE eban-werks,
       lgort     LIKE eban-lgort,
       matkl     LIKE eban-matkl,
       menge     LIKE eban-menge,
       meins     LIKE eban-meins,
       flief     LIKE eban-flief,
       preis     LIKE eban-preis,
       peinh     LIKE eban-peinh,
       eknam     LIKE t024-eknam, "采购组描述
       wgbez     LIKE t023t-wgbez,"物料组描述
       frgst     LIKE eban-frgst,
       zmeng     LIKE eban-menge, "未清数量
       zstat(30) TYPE c,
       msgty     TYPE c,
       zmsg(200) TYPE c,
       check     TYPE c,
     END OF gt_out.

DATA:gt_t024  LIKE t024 OCCURS 0 WITH HEADER LINE,
     gt_t023t LIKE t023t OCCURS 0 WITH HEADER LINE.

***alv data define
DATA:gs_layout TYPE slis_layout_alv,
     gt_fcat   TYPE slis_t_fieldcat_alv WITH HEADER LINE.

DEFINE mcr_build_fieldcat.
  gt_fcat-fieldname = &1.
  gt_fcat-seltext_l = &2.
  gt_fcat-seltext_m  = &2.
  gt_fcat-seltext_s  = &2.
  gt_fcat-ddictxt = 'L'.
  gt_fcat-inttype = &3.
  gt_fcat-intlen  = &4.
  gt_fcat-outputlen = &5.
  APPEND gt_fcat.
  CLEAR gt_fcat.
END-OF-DEFINITION.

CONSTANTS:c_pf_status    TYPE slis_formname VALUE 'FRM_SET_PF_STATUS',
          c_user_command TYPE slis_formname VALUE 'FRM_USER_COMMAND'.
***selection screen define
SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_banfn FOR eban-banfn,
               s_bsart FOR eban-bsart,
               s_ekgrp FOR eban-ekgrp,
               s_matkl FOR eban-matkl,
               s_erdat FOR eban-erdat,
               s_matnr FOR eban-matnr,
               s_werks FOR eban-werks,
               s_flief FOR eban-flief.
SELECTION-SCREEN END OF BLOCK blc.

SELECTION-SCREEN BEGIN OF BLOCK blc1 WITH FRAME TITLE text-002.
PARAMETERS:r1 RADIOBUTTON GROUP ra DEFAULT 'X',
           r2 RADIOBUTTON GROUP ra.
SELECTION-SCREEN END OF BLOCK blc1.

START-OF-SELECTION.

  PERFORM frm_get_data.
  PERFORM frm_get_fieldcat.
  PERFORM frm_output_data.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  DATA:lv_index LIKE sy-tabix.

  DATA:BEGIN OF lt_ekpo OCCURS 0,
         ebeln LIKE ekpo-ebeln,
         ebelp LIKE ekpo-ebelp,
         menge LIKE ekpo-menge,
         banfn LIKE ekpo-banfn,
         bnfpo LIKE ekpo-bnfpo,
       END OF lt_ekpo.
  DATA:lv_menge TYPE p DECIMALS 3.

  IF r1 = 'X'.
    SELECT  *
      INTO CORRESPONDING FIELDS OF TABLE gt_out
      FROM eban
      WHERE banfn IN s_banfn
        AND bsart IN s_bsart
        AND ekgrp IN s_ekgrp
        AND matkl IN s_matkl
        AND erdat IN s_erdat
        AND matnr IN s_matnr
        AND werks IN s_werks
        AND flief IN s_flief
        AND frgkz = 'R'
        AND loekz EQ space
        AND statu NE 'B'.
  ELSE.
    SELECT  *
      INTO CORRESPONDING FIELDS OF TABLE gt_out
      FROM eban
      WHERE banfn IN s_banfn
        AND bsart IN s_bsart
        AND ekgrp IN s_ekgrp
        AND matkl IN s_matkl
        AND erdat IN s_erdat
        AND matnr IN s_matnr
        AND werks IN s_werks
        AND flief IN s_flief
        AND frgkz NE 'R'
        AND ebakz = space
        AND loekz EQ space
        AND statu NE 'B'.
  ENDIF.

  IF gt_out[] IS NOT INITIAL.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_t024 FROM t024.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_t023t FROM t023t WHERE spras = sy-langu.

*    SELECT ebeln
*           ebelp
*           menge
*           banfn
*           bnfpo
*      INTO CORRESPONDING FIELDS OF TABLE lt_ekpo
*      FROM ekpo
*      FOR ALL ENTRIES IN gt_out
*      WHERE banfn = gt_out-banfn
*        AND bnfpo = gt_out-bnfpo
*        AND loekz EQ space.
  ENDIF.

  SORT gt_t024 BY ekgrp.
  SORT gt_t023t BY matkl.

  LOOP AT gt_out.
    lv_index = sy-tabix.

*    CLEAR:lv_menge.
*    LOOP AT lt_ekpo WHERE banfn = gt_out-banfn AND bnfpo = gt_out-bnfpo.
*      lv_menge = lv_menge + lt_ekpo-menge.
*    ENDLOOP.
*
*    IF lv_menge >= gt_out-menge.
*      DELETE gt_out INDEX lv_index.
*      CONTINUE.
*    ELSE.
*      gt_out-zmeng = gt_out-menge - lv_menge.
*    ENDIF.

    READ TABLE gt_t024 WITH KEY ekgrp = gt_out-ekgrp BINARY SEARCH.
    IF sy-subrc = 0.
      gt_out-eknam = gt_t024-eknam.
    ENDIF.
    READ TABLE gt_t023t WITH KEY matkl = gt_out-matkl BINARY SEARCH.
    IF sy-subrc = 0.
      gt_out-wgbez = gt_t023t-wgbez.
    ENDIF.
    gt_out-zstat = icon_light_out.
    MODIFY gt_out INDEX lv_index.
  ENDLOOP.
ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_fieldcat .

  mcr_build_fieldcat:'CHECK'   '选择'         'C'     '1'    '4',
                     'ZSTAT'   '状态'         'C'     '30'   '4',
                     'ZMSG'    '消息'         'C'     '200'  '15',
                     'BANFN'   '采购申请号'   'C'     '10'   '8',
                     'BNFPO'   '项次' 'N'     '5'    '5',
                     'BSART'   '订单类型'     'C'     '4'    '4',
                     'EKGRP'   '采购组'       'C'     '3'    '6',
                     'EKNAM'   '采购组名称'   'C'     '18'   '10',
                     'ERDAT'   '创建日期'     'D'     '10'   '8',
                     'MATNR'   '物料号码'     'C'     '18'   '10',
                     'TXZ01'   '物料描述'     'C'     '40'   '20',
                     'WERKS'   '工厂'         'C'     '4'    '4',
                     'LGORT'   '库位'         'C'     '4'    '4',
                     'MATKL'   '物料组'       'C'     '9'    '6',
                     'WGBEZ'   '物料组描述'   'C'     '20'    '10',
                     'MENGE'   '数量'         'P'     '15'   '8',
                     'MEINS'   '单位'         'C'     '3'    '3',
                     'FLIEF'   '固定供应商'   'C'     '10'   '8',
                     'PREIS'   '评估价格'     'P'     '15'   '8',
                     'PEINH'   '价格单位'     'I'     '5'   '5'.

  LOOP AT gt_fcat.
    IF gt_fcat-fieldname = 'CHECK'.
      gt_fcat-checkbox = 'X'.
      gt_fcat-edit = 'X'.
      gt_fcat-input = 'X'.
    ENDIF.
    IF gt_fcat-fieldname = 'MENGE'.
      gt_fcat-qfieldname = 'MEINS'.
    ENDIF.
    IF gt_fcat-fieldname = 'MEINS'.
      gt_fcat-ref_fieldname  = 'MEINS'.
      gt_fcat-ref_tabname = 'MARA'.
    ENDIF.
    IF gt_fcat-fieldname = 'BANFN' OR gt_fcat-fieldname = 'MATNR'.
      gt_fcat-no_zero = 'X'.
    ENDIF.
    IF gt_fcat-fieldname = 'BANFN'.
      gt_fcat-hotspot = 'X'.
    ENDIF.
    IF r2 = 'X' AND ( gt_fcat-fieldname = 'PREIS' OR gt_fcat-fieldname = 'PEINH' ).
      gt_fcat-edit = 'X'.
    ENDIF.
    MODIFY gt_fcat INDEX sy-tabix.
  ENDLOOP.
ENDFORM.                    " FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_output_data .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       = ' '
*     I_BUFFER_ACTIVE          = ' '
      i_callback_program       = sy-repid
      i_callback_pf_status_set = c_pf_status
      i_callback_user_command  = c_user_command
*     I_CALLBACK_TOP_OF_PAGE   = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME         =
*     I_BACKGROUND_ID          = ' '
*     I_GRID_TITLE             =
*     I_GRID_SETTINGS          =
*     IS_LAYOUT                =
      it_fieldcat              = gt_fcat[]
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS        =
*     IT_SORT                  =
*     IT_FILTER                =
*     IS_SEL_HIDE              =
      i_default                = 'X'
      i_save                   = 'A'
*     IS_VARIANT               =
*     IT_EVENTS                =
*     IT_EVENT_EXIT            =
*     IS_PRINT                 =
*     IS_REPREP_ID             =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        = 0
*     I_HTML_HEIGHT_END        = 0
*     IT_ALV_GRAPHICS          =
*     IT_HYPERLINK             =
*     IT_ADD_FIELDCAT          =
*     IT_EXCEPT_QINFO          =
*     IR_SALV_FULLSCREEN_ADAPTER        =
* IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
    TABLES
      t_outtab                 = gt_out[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.                    " FRM_OUTPUT_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_set_pf_status  USING rt_extab TYPE slis_t_extab.

  IF r1 = 'X'.
    SET PF-STATUS 'S0100' EXCLUDING 'ZCLOSE'.
  ELSE.
    SET PF-STATUS 'S0100' EXCLUDING 'ZCANCELREL'.
  ENDIF.

ENDFORM.                    " FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                            rs_selfield TYPE slis_selfield..
  DATA:lv_grid TYPE REF TO cl_gui_alv_grid.

  rs_selfield-refresh = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lv_grid.

  CALL METHOD lv_grid->check_changed_data( ).

  CASE r_ucomm.
    WHEN 'ZALL'.
      PERFORM frm_select_data USING 'X'.
    WHEN 'ZDALL'.
      PERFORM frm_select_data USING space.
    WHEN 'ZCANCELREL'.
      PERFORM frm_cancel_release_pr.
    WHEN 'ZCLOSE'.
      PERFORM frm_change_pr.
    WHEN '&IC1'.
      PERFORM frm_click_data USING rs_selfield.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    " FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*&      Form  FRM_SELECT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0739   text
*----------------------------------------------------------------------*
FORM frm_select_data  USING  u_flag TYPE c.
  LOOP AT gt_out WHERE check NE u_flag.
    gt_out-check = u_flag.
    MODIFY gt_out INDEX sy-tabix TRANSPORTING check.
  ENDLOOP.
ENDFORM.                    " FRM_SELECT_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_CANCEL_RELEASE_PR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_cancel_release_pr .
  DATA:lt_return LIKE bapireturn OCCURS 0 WITH HEADER LINE.
  DATA:lv_index LIKE sy-tabix.

  READ TABLE gt_out WITH KEY check = 'X'.
  IF sy-subrc <> 0.
    MESSAGE '请至少选择一行数据' TYPE 'I'.
    EXIT.
  ENDIF.

  LOOP AT gt_out WHERE check = 'X' AND msgty NE 'S'.
    lv_index = sy-tabix.
    REFRESH lt_return.
    CALL FUNCTION 'BAPI_REQUISITION_RESET_RELEASE'
      EXPORTING
        number                   = gt_out-banfn
        item                     = gt_out-bnfpo
        rel_code                 = gt_out-frgst
*       USE_EXCEPTIONS           = 'X'
*       NO_COMMIT_WORK           = ' '
      TABLES
        return                   = lt_return
      EXCEPTIONS
        authority_check_fail     = 1
        requisition_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.
    LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
      EXIT.
    ENDLOOP.
    IF sy-subrc = 0.
      gt_out-msgty = 'E'.
      gt_out-zstat = icon_red_light.
      gt_out-zmsg = lt_return-message.
    ELSE.
      gt_out-msgty = 'S'.
      gt_out-zstat = icon_green_light.
      gt_out-zmsg = '撤销审批成功'.
    ENDIF.
    MODIFY gt_out INDEX lv_index.
  ENDLOOP.
ENDFORM.                    " FRM_CANCEL_RELEASE_PR
*&---------------------------------------------------------------------*
*&      Form  FRM_CHANGE_PR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_change_pr .
  DATA:lv_index LIKE sy-tabix.
  DATA:lt_out LIKE gt_out OCCURS 0 WITH HEADER LINE.

  DATA:lt_pritem  LIKE bapimereqitemimp OCCURS 0 WITH HEADER LINE,
       lt_pritemx LIKE bapimereqitemx OCCURS 0 WITH HEADER LINE,
       lt_return  LIKE bapiret2 OCCURS 0 WITH HEADER LINE.

  FIELD-SYMBOLS:<fs_data> LIKE LINE OF gt_out.

  READ TABLE gt_out WITH KEY check = 'X'.
  IF sy-subrc <> 0.
    MESSAGE '请至少选择一行数据' TYPE 'I'.
    EXIT.
  ENDIF.

  APPEND LINES OF gt_out TO lt_out.
  DELETE lt_out WHERE check EQ space OR msgty EQ 'S'.

  SORT lt_out BY banfn bnfpo.

  LOOP AT lt_out ASSIGNING <fs_data>.

    AT NEW banfn.
      REFRESH:lt_return,lt_pritem,lt_pritemx.
      CLEAR:lt_return,lt_pritem,lt_pritemx.
    ENDAT.

    lt_pritem-preq_item = <fs_data>-bnfpo.
    lt_pritem-closed = 'X'.
    IF r2 = 'X'.
      lt_pritem-preq_price = <fs_data>-preis.
      lt_pritem-price_unit = <fs_data>-peinh.
    ENDIF.
    APPEND lt_pritem.
    CLEAR lt_pritem.

    lt_pritemx-preq_item = <fs_data>-bnfpo.
    lt_pritemx-closed = 'X'.
    IF r2 = 'X'.
      lt_pritemx-preq_price = 'X'.
      lt_pritemx-price_unit = 'X'.
    ENDIF.
    APPEND lt_pritemx.
    CLEAR lt_pritemx.

    AT END OF banfn.
      REFRESH lt_return.
      CALL FUNCTION 'BAPI_PR_CHANGE'
        EXPORTING
          number  = <fs_data>-banfn
        TABLES
          return  = lt_return[]
          pritem  = lt_pritem[]
          pritemx = lt_pritemx[].

      LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
        EXIT.
      ENDLOOP.
      IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT gt_out WHERE banfn = <fs_data>-banfn AND check = 'X' AND msgty NE 'S'.
          gt_out-msgty = 'E'.
          gt_out-zstat = icon_red_light.
          gt_out-zmsg = lt_return-message.
          MODIFY gt_out INDEX sy-tabix.
        ENDLOOP.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        LOOP AT gt_out WHERE banfn = <fs_data>-banfn AND check = 'X' AND msgty NE 'S'.
          gt_out-msgty = 'S'.
          gt_out-zstat = icon_green_light.
          gt_out-zmsg = '执行成功'.
          MODIFY gt_out INDEX sy-tabix.
        ENDLOOP.
      ENDIF.
    ENDAT.
  ENDLOOP.

ENDFORM.                    " FRM_CHANGE_PR
*&---------------------------------------------------------------------*
*&      Form  FRM_CLICK_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_click_data  USING  rs_selfield TYPE slis_selfield.

  IF rs_selfield-fieldname = 'BANFN'.
    SET PARAMETER ID 'BAN' FIELD rs_selfield-value.
    CALL TRANSACTION 'ME53N' AND SKIP FIRST SCREEN.
  ENDIF.
ENDFORM.                    " FRM_CLICK_DATA

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小啊曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值