1. 程式人生 > >採購訂單收貨後不能修改價格的增強

採購訂單收貨後不能修改價格的增強

SE19

 說明,非教程,所以控制點如下。

1 價格和資訊記錄不符不能控制

2 反審批、ZUB訂單、無價值、自定義表某使用者名稱給'X'跳出增強

3 Z005 退貨訂單入庫不能修改價格(因為小數點的問題,淨值差小於0.03 不算修改價格,如果用原值就比價麻煩了)

  METHOD if_ex_me_process_po_cust~check.     IF sy-uname EQ 'WXJ'.       EXIT.     ENDIF. * d     DATA: lv_bname TYPE  zmmt999-bname  .     CLEAR lv_bname  .     SELECT SINGLE bname INTO lv_bname       FROM zmmt999       WHERE bname = sy-uname        AND  mark EQ 'X' .     IF  lv_bname IS NOT INITIAL .       EXIT .     ENDIF .     DATA: BEGIN OF ls_s1,             knumh TYPE komv-knumh,             kopos TYPE komv-kopos,             pstyp TYPE ekpo-pstyp,             kwert TYPE komv-kwert,           END OF ls_s1.     DATA: lt_s1 LIKE TABLE OF ls_s1.     DATA: BEGIN OF ls_slhz,             matnr TYPE mara-matnr,             pstyp TYPE ekpo-pstyp,             menge TYPE mseg-menge,           END OF ls_slhz.     DATA: lt_slhz LIKE TABLE OF ls_slhz.     DATA: lt_data TYPE purchase_order_items,           ls_data TYPE purchase_order_item.     DATA: ls_item TYPE mepoitem.     DATA: lt_item TYPE mepoitem.     DATA: ls_head TYPE mepoheader.     DATA: lv_class TYPE REF TO if_purchase_order_item_mm.     DATA: lv_mtart   TYPE mara-mtart.     DATA: lt_konp TYPE TABLE OF konp,           ls_konp TYPE konp.     DATA: lt_konm TYPE TABLE OF konm,           ls_konm TYPE konm.     DATA: ls_konm_b TYPE konm.     DATA: lt_mmpur_tkomv TYPE  mmpur_tkomv,           ls_mmpur_tkomv LIKE LINE OF  lt_mmpur_tkomv. *    DATA: lt_tkomv TYPE  mmpur_tkomv, *          ls_tkomv LIKE LINE OF  lt_mmpur_tkomv.     DATA: lt_prcd_elements TYPE TABLE OF prcd_elements,           ls_prcd_elements TYPE prcd_elements.     DATA: lv_kopos TYPE konp-kopos.     DATA: lv_tabix LIKE sy-tabix. *    DATA: lv_tabix_1 LIKE sy-tabix.     DATA: lv_kwert TYPE konv-kwert.     DATA: BEGIN OF ls_prcd,             knumh TYPE konp-knumh,             kopos TYPE konp-kopos,           END OF ls_prcd.     DATA: lt_prcd LIKE TABLE OF ls_prcd.     DATA: lv_msg TYPE string.     DATA: lv_flg.     DATA: ls_a017 TYPE a017.     DATA: lv_s1 TYPE prcd_elements-kwert.     DATA: lv_s2 TYPE konm-kstbm.     DATA: lv_bfb TYPE p DECIMALS 4.     DATA: lv_01 TYPE p DECIMALS 1.     DATA: lv_kstbm TYPE string.     DATA: lv_lines LIKE sy-tabix.     DATA: gv_c TYPE c .     DATA: gv_c2  TYPE c .     DATA: lv_menge TYPE ekbe-menge .     DATA: BEGIN OF gs_ekbe,             menge TYPE ekbe-menge,             bewtp TYPE ekbe-bewtp,           END OF gs_ekbe.     DATA: gt_ekbe LIKE TABLE OF gs_ekbe.     DATA: lv_netpr TYPE ekpo-netpr.     lv_01 = 10 / 100.     DATA: lv_count TYPE i.     CALL METHOD im_header->get_data       RECEIVING         re_data = ls_head.     IF ls_head-ebeln BETWEEN '0000800000' AND '0000899999'.       EXIT.     ENDIF.     IF ls_head-bsart  EQ 'ZUB' ." OR  ls_head-bsart  EQ 'Z006'  .       EXIT.     ENDIF . *    2017-08-12 modify by lxf     IMPORT  p1 TO  gv_c  FROM   MEMORY ID 'dd'.     IF sy-subrc NE 0. " 傳值失敗       EXPORT p1 FROM  ls_head-frgke  TO MEMORY ID 'dd' .       EXPORT p2 FROM  ls_head-frgke  TO MEMORY ID 'ee' .     ENDIF .     IMPORT p2 TO  gv_c2 FROM  MEMORY ID 'ee' .     IF gv_c2  EQ 'R'  .       EXIT.     ENDIF. *    2017-08-12 modify by lxf     CALL METHOD im_header->get_items       RECEIVING         re_items = lt_data.     SORT lt_konm BY kstbm.     LOOP AT lt_data INTO ls_data.       lv_class = ls_data-item.       CLEAR: ls_item.       CALL METHOD lv_class->get_data         RECEIVING           re_data = ls_item.       IF ls_item-umson EQ 'X'.         CONTINUE.       ENDIF. *      退貨跳過增強       "       IF ls_item-retpo EQ 'X'. *        CONTINUE.       ENDIF.       IF ls_item-loekz IS NOT INITIAL.         CONTINUE.       ENDIF.       SELECT SINGLE mtart       INTO lv_mtart       FROM mara       WHERE matnr = ls_item-matnr.       IF ( lv_mtart BETWEEN 'Z001' AND 'Z010' ) OR   ( lv_mtart EQ 'Z020' ) .         IF ls_item-infnr IS INITIAL.           MESSAGE e004(zhele) WITH ls_head-lifnr ls_item-matnr.         ENDIF.       ELSE.         CONTINUE..       ENDIF.       "退貨採購訂單交貨價格不能更改       CLEAR gt_ekbe[].       IF ls_head-bsart  EQ 'Z005' ." OR  ls_head-bsart  EQ 'Z006'  .         SELECT menge bewtp INTO TABLE gt_ekbe           FROM ekbe           WHERE ebeln = ls_item-ebeln           AND   ebelp = ls_item-ebelp.         CLEAR lv_menge .         LOOP AT gt_ekbe INTO gs_ekbe.           IF gs_ekbe-bewtp EQ 'S'.             lv_menge = lv_menge + gs_ekbe-menge  .           ELSE .             lv_menge = lv_menge - gs_ekbe-menge .           ENDIF .         ENDLOOP .         IF lv_menge <> 0.           CLEAR lv_netpr .           SELECT SINGLE netpr INTO lv_netpr FROM ekpo             WHERE ebeln = ls_item-ebeln             AND   ebelp = ls_item-ebelp . *          IF lv_netpr <> ls_item-netpr .           IF abs( lv_netpr -  ls_item-netpr ) * 100  > 3 .             MESSAGE e000(zhele) WITH  '行' ls_item-ebelp ':已收貨,不允許修改價格'.           ENDIF .         ENDIF.         CONTINUE.       ENDIF .       CLEAR: lt_mmpur_tkomv.       CALL METHOD lv_class->get_conditions         IMPORTING           ex_conditions = lt_mmpur_tkomv. *      READ TABLE lt_mmpur_tkomv INTO ls_mmpur_tkomv INDEX 1. *      READ TABLE lt_s1 WITH KEY knumh = ls_mmpur_tkomv-knumh kopos = ls_mmpur_tkomv-kopos pstyp = ls_item-pstyp *                       TRANSPORTING NO FIELDS. *      IF sy-subrc <> 0.       LOOP AT lt_mmpur_tkomv INTO ls_mmpur_tkomv.         IF ls_mmpur_tkomv-kschl <> 'PB00' AND ls_mmpur_tkomv-kschl <> 'PBXX'.           CONTINUE.         ENDIF.         ls_s1-knumh = ls_mmpur_tkomv-knumh.         ls_s1-kopos = ls_mmpur_tkomv-kopos.         ls_s1-pstyp = ls_item-pstyp.         ls_s1-kwert = ls_mmpur_tkomv-kwert.         COLLECT ls_s1 INTO lt_s1.       ENDLOOP. *      ENDIF.       ls_slhz-matnr = ls_item-matnr.       ls_slhz-pstyp = ls_item-pstyp.       ls_slhz-menge = ls_item-menge.       COLLECT ls_slhz INTO lt_slhz.       CLEAR: ls_slhz.     ENDLOOP.     CLEAR: lt_mmpur_tkomv.     LOOP AT lt_data INTO ls_data.       lv_class = ls_data-item.       CLEAR: ls_item.       CALL METHOD lv_class->get_data         RECEIVING           re_data = ls_item.       IF ls_item-umson EQ 'X'.         CONTINUE.       ENDIF.       IF ls_item-retpo EQ 'X'.         CONTINUE.       ENDIF.       IF ls_item-loekz IS NOT INITIAL.         CONTINUE.       ENDIF.       SELECT SINGLE mtart       INTO lv_mtart       FROM mara       WHERE matnr = ls_item-matnr.       IF ( lv_mtart BETWEEN 'Z001' AND 'Z010')  OR   ( lv_mtart EQ 'Z020' ) .         IF ls_item-infnr IS INITIAL.           MESSAGE e004(zhele) WITH ls_head-lifnr ls_item-matnr.         ENDIF.       ELSE.         CONTINUE..       ENDIF.       READ TABLE lt_slhz INTO ls_slhz WITH KEY matnr = ls_item-matnr pstyp = ls_item-pstyp.       CALL METHOD lv_class->get_conditions         IMPORTING           ex_conditions = lt_mmpur_tkomv. *第一步       LOOP AT lt_mmpur_tkomv INTO ls_mmpur_tkomv.         IF ls_mmpur_tkomv-kschl <> 'PB00' AND ls_mmpur_tkomv-kschl <> 'PBXX'.           CONTINUE.         ENDIF.         IF ls_mmpur_tkomv-knumh IS INITIAL. *1.2.1 當PRCD_ELEMENTS-KNUMH=空白,則報錯“物料XXXXX的價格跟採購資訊記錄不一致”           MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '的價格跟採購資訊記錄不一致'.         ELSE.           SELECT COUNT(*)               FROM konp               WHERE knumh = ls_mmpur_tkomv-knumh                 AND kopos = ls_mmpur_tkomv-kopos                 AND loevm_ko = 'X'.           IF sy-subrc EQ 0.             MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '採購資訊記錄有修改,請檢查!'.           ENDIF.           IF ls_mmpur_tkomv-kschl = 'PB00'.             SELECT SINGLE *               INTO ls_a017               FROM a017               WHERE kappl = 'M'                 AND kschl = ls_mmpur_tkomv-kschl                 AND lifnr = ls_head-lifnr                 AND matnr = ls_item-matnr                 AND ekorg = ls_head-ekorg                 AND werks = ls_item-werks                 AND esokz = ls_item-pstyp                 AND knumh = ls_mmpur_tkomv-knumh                 AND datbi >= ls_head-bedat."失效日期             IF ls_a017-datbi >= ls_head-bedat AND ls_a017-datab <=  ls_head-bedat.               IF ls_a017-knumh <> ls_mmpur_tkomv-knumh.                 MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '採購資訊記錄有修改,請檢查!'.               ENDIF.             ELSE.               MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '採購資訊記錄有修改,請檢查!'.             ENDIF.           ENDIF.           IF ls_mmpur_tkomv-kstbs EQ 0.             SELECT SINGLE *               INTO ls_konp               FROM konp               WHERE knumh = ls_mmpur_tkomv-knumh                 AND kopos = ls_mmpur_tkomv-kopos.             IF ls_konp-kbetr <> ls_mmpur_tkomv-kbetr OR                 ls_konp-konwa <> ls_mmpur_tkomv-waers OR                 ls_konp-kpein <> ls_mmpur_tkomv-kpein OR                ls_konp-kmein <> ls_mmpur_tkomv-kmein OR               sy-subrc <> 0. *1.2.2.1.1如果有不相等的,則報錯“物料XXXXX的價格跟採購資訊記錄不一致”。               MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '的價格跟採購資訊記錄不一致'.             ENDIF.           ELSE.             CLEAR: lv_s1,lv_s2,ls_s1.             READ TABLE lt_s1 INTO ls_s1 WITH KEY knumh = ls_mmpur_tkomv-knumh                                                  kopos = ls_mmpur_tkomv-kopos                                                  pstyp = ls_item-pstyp.             IF sy-subrc EQ 0.               lv_s1 = ls_s1-kwert.             ENDIF. **第二步。             CLEAR: ls_konp.             SELECT SINGLE *              INTO ls_konp              FROM konp              WHERE knumh = ls_mmpur_tkomv-knumh                AND kopos = ls_mmpur_tkomv-kopos. ***1.2.2.2當PRCD_ELEMENTS-KSTBS≠0時             CLEAR: lt_konm[].             SELECT *               INTO TABLE lt_konm               FROM konm              WHERE knumh = ls_konp-knumh                AND kopos = ls_konp-kopos.             IF sy-subrc <> 0.               MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '的價格跟採購資訊記錄不一致'.             ENDIF.             SORT lt_konm BY kstbm.             LOOP AT lt_konm INTO ls_konm_b.               lv_tabix = sy-tabix.               IF ls_konm_b-kstbm >= ls_slhz-menge."ls_mmpur_tkomv-kstbs.                 EXIT.               ENDIF.             ENDLOOP.             IF ls_konm_b-kstbm > ls_slhz-menge.               lv_tabix = lv_tabix  - 1.             ENDIF. *            lv_tabix = lv_tabix  - 1.             IF lv_tabix > 0.               READ TABLE lt_konm INTO ls_konm INDEX lv_tabix.             ELSE.               MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '的價格跟採購資訊記錄不一致'.             ENDIF.             IF ls_konm_b-kstbm = ls_slhz-menge.               DESCRIBE TABLE lt_konm LINES lv_lines.               IF lv_tabix = lv_lines.                 lv_flg = 'X'.               ELSE.                 lv_tabix = lv_tabix  + 1.                 READ TABLE lt_konm INTO ls_konm_b INDEX lv_tabix.               ENDIF.             ENDIF.             IF ls_konm_b-kstbm < ls_slhz-menge.               lv_flg = 'X'.             ENDIF.             IF ls_konm-kbetr <> ls_mmpur_tkomv-kbetr OR                          ls_konp-konwa <> ls_mmpur_tkomv-waers OR                        ls_konp-kpein <> ls_mmpur_tkomv-kpein OR                        ls_konp-kmein <> ls_mmpur_tkomv-kmein. *1.2.2.2.1如果有不相等的,則報錯“物料XXXXX的價格跟採購資訊記錄不一致”。               MESSAGE e000(zhele) WITH  '物料' ls_item-matnr '的價格跟採購資訊記錄不一致'.             ELSE.               IF lv_flg = 'X'.                 CLEAR: lv_flg.                 CONTINUE.               ENDIF.               CLEAR:  lv_s2,lv_bfb.               IF ls_konp-kpein <> 0.                 lv_s2 = ls_konm_b-kbetr / ls_konp-kpein * ls_konm_b-kstbm.               ENDIF.               IF lv_s1 >= lv_s2.                 MESSAGE e005(zhele) WITH ls_item-matnr ls_konm_b-kstbm .               ELSE.                 IF lv_s2 <> 0.                   lv_bfb = ( lv_s2 - lv_s1 ) / lv_s2.                 ENDIF.                 IF lv_bfb <= lv_01.                   lv_kstbm = ls_konm_b-kstbm .                   CONCATENATE '物料' ls_item-matnr '採購數量'  lv_kstbm '可能更划算!'                   INTO lv_msg.                   CALL FUNCTION 'Z_CALL_MSG'                     EXPORTING                       iv_msg = lv_msg. *                  MESSAGE i005(zhele) WITH ls_item-matnr ls_konm_b-kstbm.                 ENDIF.               ENDIF.             ENDIF.           ENDIF.         ENDIF.       ENDLOOP.     ENDLOOP.   ENDMETHOD.