采购订单检查/保存BADI使用

来源:互联网 发布:项目数据库设计 编辑:程序博客网 时间:2024/05/22 17:50
BADI:ME_PROCESS_PO_CUST
 
需求:
2.1 根据采购申请是否经过修改或采购申请的类型,确定订单为一级审批还是二级审批。一级
审批订单汇总号为80,二级审批订单汇总号为90。系统默认订单汇总号为80,以下情况下订
单需要做二级审批,程序增强将汇总号由80 变为90:
1)类型为NB 的采购申请转采购订单时,如果用户修改了行项目的数量;
2)类型为NB 的采购申请转采购订单时,如果用户未按货源清单或设定的配额分配订单时;
3)从类型为NB 的采购申请转成的采购订单,用户通过ME22N 修改采购订单;
4)类型为ZPR1、ZPR2、ZPR8(备货采购、紧急采购、退货)的采购申请转采购订单时;
5)定线订单的确认数量经过修改时;
2.2 读取最新的改版信息,与用户录入的版次进行校验,提示用户最新的改版版本
对于类型为ZP02(包材)的订单,用户在行项目的批次栏填入物料的版次号,保存订单
时,系统从物料主数据读取最新的改版信息(字段:MARA-ZEINR),并与用户录入的版次号进
行校验,如不一致,发出警告“*****物料的最新版次号为*****”。
2.3 订单保存时检查运输商和供应商是否同一个。
订单保存时,如果该订单涉及到运费(国际贸易条件不是“100”),系统检查运输商和供
应商是否为同一个编码,如果为同一编码,发出警告“供应商与运输商为同一个公司”
系统逻辑:查找采购订单的条件记录ZFR1 中的运输商与采购订单的供应商
2.4 订单保存时提示用户某物料有改版控制量。
对于类型为ZP02(包材)的订单,用户保存订单时,系统检查该物料该版次在相应时间
段内是否有改版限制量,如果有,则给出发出警告“*****物料有改版限制量,请运行改版物
资完成量报表”。
系统逻辑:查找ZMM_GB 数据表中某物料某版次改版限制量的有效期,如果下订单的时
间在有效期内,则发出警告。(具体见功能说明书《改版物资限制量》)。
2.5 类型为ZP01、ZP02 的订单必须有采购申请的来源才能创建订单。
 
(1)订单header处理
  method IF_EX_ME_PROCESS_PO_CUST~PROCESS_HEADER.

  include MM_MESSAGES_MAC.
  DATA:l_head TYPE mepoheader.
  DATA:l_item TYPE mepoitem.

  DATA:L_BANFN TYPE EBAN-BANFN,"
       wa_EBAN type eban."采购申请头

  data:items type purchase_order_items,
       item_obj type  purchase_order_item.

  l_head = IM_HEADER->get_data( ).

  items = im_header->get_items( ) .

  clear:wa_EBAN.
  loop at items into item_obj .
    l_item = item_obj-item->get_data(  ).
    if l_item-BANFN <> ''.
      select single * into wa_EBAN from EBAN where BANFN = l_item-BANFN and BNFPO = l_item-BNFPO.
      case wa_EBAN-BSART.
        when 'ZPR1' OR 'ZPR2' OR 'ZPR8'.
          L_HEAD-SUBMI = '90'.
          IM_HEADER->set_data( IM_DATA = L_HEAD ).
          CONTINUE.
        WHEN 'NB' OR 'NB1' OR 'NB2' OR 'NB3'.
          if wa_EBAN-MENGE <> l_item-MENGE.
            L_HEAD-SUBMI = '90'.
            IM_HEADER->set_data( IM_DATA = L_HEAD ).
            CONTINUE.
          endif.
      endcase.
    endif.
  endloop.
  BREAK zhangdq.
  if sy-TCODE = 'ME21N' .
    IF l_head-BSART = 'ZPO1' OR l_head-BSART = 'ZPO2' OR l_head-BSART = 'ZPO3'
      OR l_head-BSART = 'ZPO4' OR l_head-BSART = 'ZPO5' OR l_head-BSART = 'ZPO6'
      OR l_head-BSART = 'ZPO7' OR l_head-BSART = 'ZPO8' OR l_head-BSART = 'ZPO9'.
      if L_HEAD-SUBMI = '' .
        L_HEAD-SUBMI = '80'.
        IM_HEADER->set_data( IM_DATA = L_HEAD ).
      endif.
    ENDIF.
  ENDIF.



endmethod.
 
(2)订单ITEM处理
  method IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM.
  include MM_MESSAGES_MAC.
  data:wa_mara type mara.
  DATA : re_header TYPE mepoheader.
  DATA:l_item TYPE mepoitem.
  DATA: l_header TYPE REF TO if_purchase_order_mm."采购订单抬头

  DATA: WA_ZMMT_GB TYPE ZMMT_GB.

  DATA:L_BANFN TYPE EBAN-BANFN,"
     wa_EBAN type eban."采购申请头

  l_header = im_item->get_header( ).
  re_header = l_header->get_data( )."获取头信息

  l_item =  im_item->get_data( ).


*1...读取最新的改版信息,与用户录入的版次进行校验,提示用户最新的改版版本
*对于类型为ZP02(包材)的订单,用户在行项目的批次栏填入物料的版次号,保存订单
*时,系统从物料主数据读取最新的改版信息(字段:MARA-ZEINR),并与用户录入的版次号进
*行校验,如不一致,发出警告“*****物料的最新版次号为*****”。


*2....对于类型为ZP02(包材)的订单,用户保存订单时,系统检查该物料该版次在相应时间
*段内是否有改版限制量,如果有,则给出发出警告“*****物料有改版限制量,请运行改版物
*资完成量报表”。
*系统逻辑:查找ZMM_GB 数据表中某物料某版次改版限制量的有效期,如果下订单的时
*间在有效期内,则发出警告。(具体见功能说明书《改版物资限制量》)。

  BREAK ZHANGDQ.
  CLEAR:wa_mara,WA_ZMMT_GB.
  if re_header-BSART = 'ZPO2' .
    select single * into wa_mara from mara where matnr =  l_item-matnr.
    if  l_item-CHARG <> wa_mara-ZEINR .
      mmpur_message 'W' 'ZMSG' '001' wa_mara-MATNR wa_mara-ZEINR '' ''.
    ENDIF.

    SELECT SINGLE * INTO WA_ZMMT_GB FROM ZMMT_GB WHERE MATNR = l_item-MATNR
                                                   AND VERID = l_item-CHARG
                                                   AND SDATE <= l_item-EINDT
                                                   AND EDATE >= l_item-EINDT.
    IF SY-SUBRC = 0 .
      mmpur_message 'W' 'ZMSG' '002' wa_mara-MATNR '' '' ''.
    ENDIF.

  ENDIF.

  if l_item-BANFN <> ''.
    select single * into wa_EBAN from EBAN where BANFN = l_item-BANFN and BNFPO = l_item-BNFPO.
    case re_header-BSART.
      when 'ZPR1' OR 'ZPR2' OR 'ZPR8'.
        re_HEADer-SUBMI = '90'.
      WHEN 'NB' OR 'NB1' OR 'NB2' OR 'NB3'.
        if wa_EBAN-MENGE <> l_item-MENGE.
          re_HEADer-SUBMI = '90'.
        endif.
        if re_header-BSART = 'NB' AND re_header-LIFNR <> wa_EBAN-FLIEF ."如果采购申请是NB类型,并且申请供应商和采购供应商不一致,直接设置为90
        re_HEADer-SUBMI = '90'.
        ENDIF.
    endcase.
    l_header->set_data( IM_DATA = re_HEADer ).
  endif.

*订单保存时检查运输商和供应商是否同一个。
*订单保存时,如果该订单涉及到运费(国际贸易条件不是“100”),系统检查运输商和供
*应商是否为同一个编码,如果为同一编码,发出警告“供应商与运输商为同一个公司”
*系统逻辑:查找采购订单的条件记录ZFR1 中的运输商与采购订单的供应商
  DATA:wa_im_komv TYPE komv.
  DATA:l_get_conditions TYPE mmpur_tkomv.

endmethod.
 
(3)订单CHECK
  method IF_EX_ME_PROCESS_PO_CUST~CHECK.
  include MM_MESSAGES_MAC.
  DATAheader TYPE mepoheader,
items TYPE purchase_order_items,
line_item TYPE purchase_order_item,
po_line TYPE mepoitem,
po_condition type mmpur_tkomv,
wa_im_komv TYPE komv,
eipo_line type MEPO_EIPO. "Foreign Trade: Export/Import: Item Data

data:l_flag(1)."是否能手工创建采购订单标志,只是限制ZPO1,ZPO2的订单类型

  header = im_header->get_data( ).

  items = im_header->get_items( ).
  CLEAR:l_flag.
  LOOP AT items INTO line_item.

    po_line = line_item-item->get_data( ).

    IF PO_LINE-BANFN = ''.
    l_flag = 'X'.
    ENDIF.
    CALL METHOD line_item-item->get_conditions
      IMPORTING
        ex_conditions = po_condition.
    IF header-INCO1 <> '100'.
      loop at po_condition into wa_im_komv.
        IF wa_im_komv-KSCHL = 'ZFR1' AND wa_im_komv-LIFNR = header-LIFNR.
          mmpur_message 'W' 'ZMSG' '003' wa_im_komv-KPOSN '' '' ''.
        ENDIF.
        clear wa_im_komv.
      endloop.
    endif.
  endloop.

 IF ( header-BSART = 'ZPO1' OR header-BSART = 'ZPO2' ) AND l_flag = 'X' and sy-TCODE = 'ME21N'.
    mmpur_message 'E' 'ZMSG' '004' '' '' '' ''.
 ENDIF.
endmethod.
 
 
(4)SE91消息设置
001 &1物料的最新版次号为&2
002 &1物料有改版限制量,请运行改版物资完成量报表 
003 采购订单&1行供应商与运输商为同一个公司 
004 类型为ZPO1、ZPO2的订单必须有采购申请的来源才能创建订单
0 0
原创粉丝点击