新增PR(采购申请)类型

发布时间 2023-07-24 17:37:10作者: 蛀牙首领

  福建下东莞的采购订单时,为了从编码上做出区分,新增PR类型(ZNB6)和PO类型。具体配置,另行百度,这里

说明一点,配置上传后,在处理PO类型的'核发程序'配置的时候,需要在正式机的事务码CL24N中处理。

因为新增PR的时候,有在MD04中,把计划订单直接转PR的,也有在ME51N直接新建PR的。而且增强点不同,

主要是检查虎门(5100工厂)不能下这个类型的PR,供应商也只能选择虎门的供应商,这里直接放代码

ZXM02U12

*&---------------------------------------------------------------------*
*&  INCLUDE           ZXM02U12
*&---------------------------------------------------------------------*
*BREAK-POINT.
DATA: LS_IM_EBAN LIKE EBAN.
DATA:LS_EBAN    LIKE LINE OF IM_T_EBAN,
     LS_EBKN    LIKE LINE OF IM_T_EBKN,
     LS_MESSAGE TYPE BAPIRET2.




LOOP AT IM_T_EBAN INTO LS_IM_EBAN.
  IF LS_IM_EBAN-BSART EQ 'ZNB6'.
    IF LS_IM_EBAN-WERKS EQ '5100'.
      LS_MESSAGE-TYPE   = 'E'.
      LS_MESSAGE-ID     = 'ZMM'."消息类
      LS_MESSAGE-NUMBER = '000'.
      LS_MESSAGE-ROW    = LS_EBAN-BNFPO.
      LS_MESSAGE-MESSAGE_V1 = '虎門不能下虎門的採購單,'.
      APPEND LS_MESSAGE TO EX_MESSAGES.
    ENDIF.
*    IF LS_IM_EBAN-EKORG NE '6100'.
*      LS_MESSAGE-TYPE   = 'E'.
*      LS_MESSAGE-ID     = 'ZMM'."消息类
*      LS_MESSAGE-NUMBER = '000'.
*      LS_MESSAGE-ROW    = LS_EBAN-BNFPO.
*      LS_MESSAGE-MESSAGE_V1 = '銷售組織不是6100(福建)'.
*      APPEND LS_MESSAGE TO EX_MESSAGES.
*    ENDIF.
*    IF LS_IM_EBAN-FLIEF NE '0000005100'."固定供應商不為5100(虎門)
*      LS_MESSAGE-TYPE   = 'E'.
*      LS_MESSAGE-ID     = 'ZMM'."消息类
*      LS_MESSAGE-NUMBER = '000'.
*      LS_MESSAGE-ROW    = LS_EBAN-BNFPO.
*      LS_MESSAGE-MESSAGE_V1 = '固定供應商不是5100(虎門)'.
*      APPEND LS_MESSAGE TO EX_MESSAGES.
*    ENDIF.
  ENDIF.
ENDLOOP.
View Code

LM61HF10

*----------------------------------------------------------------------*
*   INCLUDE LM61HF10: Pruefungen von Bildschirmeingaben                *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
*  CHECK_PLANT                                                         *
*                                                                      *
*  Prueft Existenz des Werks ohne Seiteneffekte auf die globale        *
*  Struktur MT61D                                                      *
*----------------------------------------------------------------------*
FORM check_plant
     USING iv_matnr LIKE mt61d-matnr
           iv_werks LIKE mt61d-werks.

  DATA: BEGIN OF mtcom.
          INCLUDE STRUCTURE mtcom.
  DATA: END OF mtcom.

  IF  gs_mt61d-matnr <> iv_matnr         "Daten noch nicht gelesen
  OR  gs_mt61d-werks <> iv_werks.

    CLEAR mtcom.
    mtcom-kenng = 'MT61D'.
    mtcom-spras = sy-langu.
    mtcom-matnr = iv_matnr.
    mtcom-werks = iv_werks.

    CALL FUNCTION 'MATERIAL_READ'
      EXPORTING
        schluessel         = mtcom
      EXCEPTIONS
        material_not_found = 04
        plant_not_found    = 08
        account_not_found  = 12.
    IF sy-subrc > 0.
      MESSAGE e004 WITH iv_matnr iv_werks.
    ENDIF.
  ENDIF.
ENDFORM.                    "CHECK_PLANT


*----------------------------------------------------------------------*
* Lesen und Prüfen der Seriennummer SERNR aus Tab. SNUM                *
*----------------------------------------------------------------------*
FORM check_bom_explosion_nr
     USING iv_sernr LIKE snum-sernr
           iv_pwwrk LIKE mt61d-werks
           iv_matnr LIKE mt61d-matnr.
  SELECT SINGLE * FROM snum WHERE sernr = iv_sernr.
  IF sy-subrc > 0.
    MESSAGE e571 WITH iv_sernr.   "Seriennummer & ist nicht vorhanden
  ENDIF.
  IF NOT snum-xloek IS INITIAL.
    MESSAGE e367 WITH iv_sernr.  "Seriennummern & zum löschen vorgemerkt
  ENDIF.
  IF snum-snsta = snsta_inactive.
    MESSAGE e341 WITH iv_sernr.   "Seriennummern & ist nicht aktiv
  ENDIF.
  IF NOT snum-werks IS INITIAL AND snum-werks NE iv_pwwrk.
    MESSAGE e342 WITH iv_sernr snum-werks.
  ENDIF.
  IF NOT snum-matnr IS INITIAL          "SNUM gültig für Material ?
  AND    snum-matnr NE iv_matnr.
    MESSAGE e343 WITH iv_sernr snum-matnr snum-werks.
  ENDIF.
ENDFORM.                    "CHECK_BOM_EXPLOSION_NR


*---------------------------------------------------------------------*
*  GET_NEW_REVISION_LEVEL                                             *
*---------------------------------------------------------------------*
FORM get_new_revision_level.
  PERFORM read_t460p USING mdba-pstyp.
  IF t460p-kzsta EQ minus AND gs_mt61d-kzrev = xflag.
    CLEAR mdba-revlv.                                       "TL 46C
    CALL FUNCTION 'REVISION_LEVEL_SELECT'
      EXPORTING
        datuv              = mdba-frgdt
        matnr              = mdba-matnr
      IMPORTING
        arevlv             = mdba-revlv
      EXCEPTIONS
        date_not_found     = 01
        ecn_not_found      = 02
        ecn_no_revision    = 03
        input_incomplete   = 04
        input_inconsistent = 05
        revision_not_found = 06.
  ENDIF.
ENDFORM.                    "GET_NEW_REVISION_LEVEL


*----------------------------------------------------------------------*
*  CHECK_REQUISITION_QUANTITY                                          *
*----------------------------------------------------------------------*
FORM check_requisition_quantity.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Form CHECK_REQUISITION_QUANTITY, Start                                                                                                            A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 3  ZHM_MD15.    "active version
IF SY-UNAME = 'MISHM'.

ENDIF.

ENDENHANCEMENT.
*$*$-End:   (1)---------------------------------------------------------------------------------$*$*
*{   INSERT         DEVK911252                                        1
*
  IF mdba-BSART eq 'ZNB6'.
    IF mdba-WERKS EQ '5100'.
*      LS_MESSAGE-TYPE   = 'E'.
*      LS_MESSAGE-ID     = 'ZMM'."消息类
*      LS_MESSAGE-NUMBER = '000'.
*      LS_MESSAGE-ROW    = LS_EBAN-BNFPO.
      MESSAGE E000(ZMM) WITH '虎門不能下虎門的採購單,'.
*      APPEND LS_MESSAGE TO EX_MESSAGES.
    ENDIF.
*    IF mdba-EKORG NE '6100'.
**      LS_MESSAGE-TYPE   = 'E'.
**      LS_MESSAGE-ID     = 'ZMM'."消息类
**      LS_MESSAGE-NUMBER = '000'.
**      LS_MESSAGE-ROW    = LS_EBAN-BNFPO.
*      MESSAGE E000(ZMM) WITH '銷售組織不是6100(福建)'.
**      APPEND LS_MESSAGE TO EX_MESSAGES.
*    ENDIF.
*    IF mdba-FLIEF NE '0000005100'."固定供應商不為5100(虎門)
**      LS_MESSAGE-TYPE   = 'E'.
**      LS_MESSAGE-ID     = 'ZMM'."消息类
**      LS_MESSAGE-NUMBER = '000'.
**      LS_MESSAGE-ROW    = LS_EBAN-BNFPO.
*      MESSAGE E000(ZMM) WITH '固定供應商不是5100(虎門)'.
**      APPEND LS_MESSAGE TO EX_MESSAGES.
*    ENDIF.
  ENDIF.
*}   INSERT
  DATA: lv_restquantity LIKE plaf-gsmng.
*--> Banf-Menge eingegeben ?
  IF mdba-menge <= 0.
    MESSAGE e212.
  ENDIF.
*--> BANF-Menge kleiner PLAF-Menge ?
  IF mdba-menge < cm61p-gsmng.
    lv_restquantity = cm61p-gsmng - mdba-menge.
    IF  plaf-gsmng > 0.
      MOVE lv_restquantity TO plaf-gsmng.
      MOVE xflag           TO plaf-auffx.
      MOVE vstatt          TO cm61p-pstat.
      MESSAGE s056.
    ENDIF.
  ENDIF.
*--> BANF-Menge groesser PLAF-Menge ?
  IF mdba-menge GE cm61p-gsmng.
    MOVE cm61p-gsmng TO plaf-gsmng.
    CLEAR plaf-auffx.
    CLEAR cm61p-pstat.
  ENDIF.
ENDFORM.                    "CHECK_REQUISITION_QUANTITY


*----------------------------------------------------------------------*
*  CHECK_ORDER_TYPE_VS_ITEM_CAT                                        *
*----------------------------------------------------------------------*
FORM check_order_type_vs_item_cat
     USING iv_bsart LIKE mdba-bsart
           iv_pstyp LIKE mdba-pstyp.

  IF  t161p-bsart = iv_bsart
  AND t161p-bstyp = 'B'
  AND t161p-pstyp = iv_pstyp.
    EXIT.
  ENDIF.

  SELECT SINGLE * FROM t161p
         WHERE bsart = iv_bsart
         AND   bstyp = 'B'
         AND   pstyp = iv_pstyp.
  IF sy-subrc > 0.
*   MESSAGE E020(ME).
    MESSAGE e020(me) WITH iv_bsart 'B' iv_pstyp.
  ENDIF.
ENDFORM.                    "CHECK_ORDER_TYPE_VS_ITEM_CAT


*----------------------------------------------------------------------*
*  CHECK_ORDER_TYPE                                                    *
*----------------------------------------------------------------------*
FORM check_order_type USING iv_bsart LIKE mdba-bsart.
  IF  t161-bsart = iv_bsart
  AND t161-bstyp = 'B'.
    EXIT.
  ENDIF.

  SELECT SINGLE * FROM t161 WHERE bsart = iv_bsart AND bstyp = 'B'.
  IF sy-subrc > 0.
    MESSAGE e013(me) WITH iv_bsart 'B'.
  ENDIF.
ENDFORM.                    "CHECK_ORDER_TYPE

*&---------------------------------------------------------------------*
*&      Form  READ_MARC
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Lesen Material direkt aus Datenbank                                  *
*----------------------------------------------------------------------*
FORM read_marc USING matnr LIKE marc-matnr
                     werks LIKE marc-werks.
*--> Kommunikationsworkaera fuellen
  CLEAR mtcom.
  MOVE 'MARC'      TO mtcom-kenng.
  MOVE matnr       TO mtcom-matnr.
  MOVE werks       TO mtcom-werks.
*--> Materialstamm fuer Disposition lesen
  CALL FUNCTION 'MATERIAL_LESEN'
    EXPORTING
      schluessel         = mtcom
    IMPORTING
      matdaten           = marc
      return             = mtcor
    TABLES
      seqmat01           = dummy
    EXCEPTIONS
      material_not_found = 04
      plant_not_found    = 08
      account_not_found  = 12.
  IF sy-subrc NE 0. RAISE error. ENDIF.                     "TL 46c
ENDFORM.                    " READ_MARC

*&---------------------------------------------------------------------*
*&      Form  SUB_SCRAP                                        "TL: 46B
*&---------------------------------------------------------------------*
*       Baugruppenausschuss von Gesamtmenge subtrahieren
*----------------------------------------------------------------------*
FORM sub_scrap CHANGING iv_gsmng LIKE plaf-gsmng
                        iv_avmng LIKE plaf-avmng.
*--> Exit-Bedingungen
  CHECK iv_avmng GT 0.
  CHECK iv_gsmng GT iv_avmng.
*--> Baugruppenausschuss abziehen
  iv_gsmng = iv_gsmng - iv_avmng.
  CLEAR iv_avmng.
ENDFORM.                    " SUB_SCRAP

*&---------------------------------------------------------------------*
*&      Form  ADD_SCRAP                                        "TL: 46B
*&---------------------------------------------------------------------*
*       Baugruppenausschuss zur Gesamtmenge addieren
*       Berechnung erfolgt ueber proportionale Anpassung des
*       urspruenglichen Baugruppenausschusses
*----------------------------------------------------------------------*
FORM add_scrap USING    iv_gsmng_old LIKE plaf-gsmng
                        iv_avmng_old LIKE plaf-avmng
               CHANGING iv_gsmng_new LIKE plaf-gsmng
                        iv_avmng_new LIKE plaf-avmng.
*--> lokale Daten
  DATA: lv_gsmng_old LIKE plaf-gsmng.
*--> Exit-Bedingungen
  CHECK iv_avmng_old GT 0.
  CHECK iv_gsmng_old GT iv_avmng_old.
  CHECK iv_avmng_new EQ 0.
*--> Baugruppenausschuss berechnen
  lv_gsmng_old = iv_gsmng_old - iv_avmng_old.
  iv_avmng_new = iv_avmng_old * iv_gsmng_new / lv_gsmng_old.
  PERFORM read_t006 USING gs_mt61d-meins.
* PERFORM MENGEN_AUFRUNDUNG USING T006-ANDEC IV_AVMNG_NEW.   "n_1869151
  CALL FUNCTION 'ROUND'                                      "n_1869151
       EXPORTING
            DECIMALS      = T006-ANDEC
            INPUT         = IV_AVMNG_NEW
            SIGN          = '+'
       IMPORTING
            OUTPUT        = IV_AVMNG_NEW
       EXCEPTIONS
            INPUT_INVALID = 1
            OVERFLOW      = 2
            TYPE_INVALID  = 3
            OTHERS        = 4.
  iv_gsmng_new = iv_gsmng_new + iv_avmng_new.
ENDFORM.                    " ADD_SCRAP

*&---------------------------------------------------------------------*
*&      Form  READ_T006                                        "TL: 46B
*&---------------------------------------------------------------------*
*       Lesen Tabelle 006
*----------------------------------------------------------------------*
FORM read_t006 USING iv_meins LIKE mt61d-meins.
*--> Exitbedingung prüfen
  IF iv_meins EQ t006-msehi.
    EXIT.
  ENDIF.
*--> Tabelleneintrag nachlesen
  SELECT SINGLE * FROM  t006
                  WHERE msehi EQ iv_meins.
  IF sy-subrc > 0.
    MESSAGE e001 WITH iv_meins 'T006 '.
  ENDIF.

ENDFORM.                                                    " READ_T006
*&---------------------------------------------------------------------*
*&      Form  CHECK_CTR_IDS
*&---------------------------------------------------------------------*
*        Check Contract IDs (ERP-Contract vs. Central Contract SRM)
*----------------------------------------------------------------------*
FORM check_ctr_ids .

  DATA: l_ebeln_srm TYPE bbp_bapi_ebeln_k,
        l_ebelp_srm TYPE bbp_itemno,
        l_ebeln_erp TYPE ebeln,
        l_ebelp_erp TYPE ebelp,
        l_conv      TYPE REF TO cl_mmbsi_cc_conv.

** Check for EhP4-Switch CCM
  CHECK cl_ops_switch_check=>mm_sfws_p2pse( ) = 'X'.

  CLEAR: l_ebeln_srm, l_ebelp_srm,
         l_ebeln_erp, l_ebelp_erp.

  LOOP AT SCREEN.
    IF screen-name EQ 'MDBA-KONNR'.
      EXIT.
    ENDIF.
  ENDLOOP.
  IF screen-input          EQ '0'     AND
     cm61o-trtyp           NE 'A'     AND NOT
     mdba-konnr            IS INITIAL AND
     mdba-srm_contract_id  IS INITIAL AND
     mdba-srm_contract_itm IS INITIAL.
    CLEAR: mdba-konnr, mdba-konps.
    request_kz = 'X'.
    EXIT.
  ENDIF.
  IF ( NOT mdba-srm_contract_id  IS INITIAL AND
           mdba-srm_contract_itm IS INITIAL OR
           mdba-srm_contract_id  IS INITIAL AND
       NOT mdba-srm_contract_itm IS INITIAL ) OR
     ( NOT mdba-konnr            IS INITIAL AND
           mdba-konps            IS INITIAL OR
           mdba-konnr            IS INITIAL AND
       NOT mdba-konps            IS INITIAL ).
    SET CURSOR FIELD 'MDBA-SRM_CONTRACT_ID'.
    MESSAGE e008(mm_ccm).
  ENDIF.

  IF NOT mdba-konnr IS INITIAL AND
         screen-input EQ '1'.
** Check, if there is a corresponding SRM-ID
    l_conv = cl_mmbsi_cc_conv=>get_instance( cl_mmpur_constants=>bstyp_b ). "1632920
    CALL METHOD l_conv->conv_erp2srm
      EXPORTING
        iv_ebeln        = mdba-konnr
        iv_ebelp        = mdba-konps
      IMPORTING
        ev_ebeln_srm    = l_ebeln_srm
        ev_ebelp_srm    = l_ebelp_srm
      EXCEPTIONS
        no_srm_contract = 1
        OTHERS          = 2.

    IF sy-subrc EQ 0.
      IF NOT mdba-srm_contract_id  IS INITIAL     AND (
             mdba-srm_contract_id  NE l_ebeln_srm OR
             mdba-srm_contract_itm NE l_ebelp_srm     ).
        MESSAGE e009(mm_ccm).
      ELSEIF mdba-srm_contract_id IS INITIAL.
        MOVE: l_ebeln_srm TO mdba-srm_contract_id,
              l_ebelp_srm TO mdba-srm_contract_itm.
      ENDIF.
    ELSEIF NOT mdba-srm_contract_id IS INITIAL.
      MESSAGE e009(mm_ccm).
    ENDIF.
  ELSEIF NOT mdba-srm_contract_id IS INITIAL.
    CALL FUNCTION 'MMBSI_GET_ERP_ID'
      EXPORTING
        iv_ebeln              = mdba-srm_contract_id
        iv_ebelp              = mdba-srm_contract_itm
        iv_ekorg              = mdba-ekorg
        iv_werks              = mdba-werks
        iv_dialog             = 'X'
      IMPORTING
        ev_ebeln_erp          = l_ebeln_erp
        ev_ebelp_erp          = l_ebelp_erp
      EXCEPTIONS
        no_srm_contract       = 1
        cancelled_by_user     = 2
        no_unique_entry_found = 3
        OTHERS                = 4.

    IF sy-subrc EQ 1.
      SET CURSOR FIELD 'MDBA-SRM_CONTRACT_ID'.
      MESSAGE e010(mm_ccm).
    ELSEIF sy-subrc NE 0.
      MESSAGE e011(mm_ccm).
    ENDIF.
    MOVE: l_ebeln_erp TO mdba-konnr,
          l_ebelp_erp TO mdba-konps.
    request_kz = 'X'.
  ENDIF.

ENDFORM.                    " CHECK_CTR_IDS
View Code

se19->ME_PROCESS_PO_CUST->CHECK()

METHOD IF_EX_ME_PROCESS_PO_CUST~CHECK.

*    BREAK MISHM.
  DATA: LS_POITEM TYPE MEPOITEM.
  DATA: LS_ITEM TYPE PURCHASE_ORDER_ITEM.
  DATA: LT_ITEM TYPE PURCHASE_ORDER_ITEMS.
  DATA: LS_HEAD TYPE MEPOHEADER,
        LV_BSART TYPE EBAN-BSART.
  CALL METHOD IM_HEADER->GET_DATA
    RECEIVING
      RE_DATA = LS_HEAD.
  CALL METHOD IM_HEADER->GET_ITEMS
    RECEIVING
      RE_ITEMS = LT_ITEM.
  LOOP AT LT_ITEM INTO LS_ITEM.
    CALL METHOD LS_ITEM-ITEM->GET_DATA
      RECEIVING
        RE_DATA = LS_POITEM.
    IF LS_POITEM-EBELN IS INITIAL.
      IF LS_POITEM-BANFN NE ''.
        SELECT SINGLE BSART
          INTO LV_BSART
          FROM EBAN
         WHERE BANFN EQ LS_POITEM-BANFN.
        IF LV_BSART EQ 'ZNB6'.
          IF LS_HEAD-BSART NE 'ZNB6'.
            MESSAGE E000(ZMM) WITH '訂單類型請選擇''******'''.
          ENDIF.
          IF LS_HEAD-LIFNR NE '0000005100'.
            MESSAGE E000(ZMM) WITH '供應商請選擇5100(虎門)'.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDMETHOD.
View Code