ME51N ME52N创建修改采购申请时的一个BADI_

时间:2022-10-12 20:00:51


无论是类里打断点、或者st05跟踪,或者是spro里找都行



我这个badi比较简单,网上一搜或者群里一问大家都知道



ME_PROCESS_REQ_CUST



这里简单实现里面的check






ME51N ME52N创建修改采购申请时的一个BADI_

​​
FM内具体代码见最后





这里说下不借助其他帮助的时候,怎么找到想要的方法,怎么找到需要的值



ME51N ME52N创建修改采购申请时的一个BADI_

 显示参数


ME51N ME52N创建修改采购申请时的一个BADI_



ME51N ME52N创建修改采购申请时的一个BADI_


双击进入im_header 

 

一般都会有get_data.此处还有个get_tiems 


ME51N ME52N创建修改采购申请时的一个BADI_


打开参数


ME51N ME52N创建修改采购申请时的一个BADI_


双击查看该结构


ME51N ME52N创建修改采购申请时的一个BADI_


就是想要的采购申请号和行项目号,不过描述是:last item number

说明是一条数据,而不是个表

注意看看后面的描述

然后看get_items,一般情况这两个方法是常用的


ME51N ME52N创建修改采购申请时的一个BADI_


会发现re_itmes是 个内表

而且这个内表参考类型,是个类IF_PURCHASE_REQUISITION_ITEM


ME51N ME52N创建修改采购申请时的一个BADI_


一般也会有get_data.

 一层层跟下去,调用的时候定义类对象,调用其方法即可


另外:ME53N查看时,点编辑按钮,进入编辑状态,可以在ME_PROCESS_REQ_CUST -- open方法中写逻辑


FM内代码:

 

FUNCTION zlm_fm_me52n.

*"----------------------------------------------------------------------

*"*"Local interface:

*"  IMPORTING

*"     VALUE(IM_HEADER) TYPE REF TO  IF_PURCHASE_REQUISITION OPTIONAL

*"  EXPORTING

*"     VALUE(E_ITEM_DATA) TYPE  MEREQ_ITEM

*"  EXCEPTIONS

*"      ERROR

*"----------------------------------------------------------------------

*"*"Local interface:

*"  IMPORTING

*"     VALUE(IM_HEADER) TYPE REF TO  IF_PURCHASE_REQUISITION OPTIONAL

*

*1、  通过Tcode:ME52N进行采购申请修改时,

*     更改行项目物料编码保存时需判断已更换物料是否未冻结物料,

*     如果为冻结物料,则禁止采购申请保存并给与错误提示:行项目XXX新更换物料XXXXXXX已冻结,请选择其他物料。

*2、  冻结物料判断逻辑如下:

*     当物料主数据MARA-MATNR的跨工厂物料状态MARA-MSTAE为非空时表示该物料已经冻结;

*     当物料主数据MARA-MATNR的MARA-LVORM字段为“X”表示该物料已删除

*"----------------------------------------------------------------------


  DATA: wa_head     TYPE mereq_header.                           "表头数据:采购申请号等

  DATA: it_item     TYPE mmpur_requisition_items.                "行项目表:采购申请下各行项目

  DATA  wa_item     LIKE LINE OF it_item.                        "行项目工作区

  DATA  cl_item     TYPE REF TO if_purchase_requisition_item.    "获取行项目数据的类

  DATA  l_item_data TYPE mereq_item.                             "行项目中具体值

  DATA: l_matnr     TYPE matnr.

  DATA:

        BEGIN OF str_dongjie,

        mstae     TYPE mstae,

        lvorm     TYPE lvorm,

         END OF str_dongjie,

        wa_dongjie LIKE str_dongjie.


  "获取头数据

  CALL METHOD im_header->get_data

    RECEIVING

      re_data = wa_head.


  "如果不是ME52N进入,没有采购申请单号,采购申请单号第一位是‘#’,不需要进行后续校验

  IF wa_head-banfn(1) = '#'.

    RETURN.

  ENDIF.


  "获取行项目

  CALL METHOD im_header->get_items

    RECEIVING

      re_items = it_item.


  "解析行项目

  LOOP AT it_item INTO wa_item.


    "获取行项目数据的类

    cl_item = wa_item-item.


    "获取行项目值

    CALL METHOD cl_item->get_data

      RECEIVING

        re_data = l_item_data.


    CLEAR l_matnr.


    "获取采购申请物料号

    SELECT SINGLE matnr

      FROM eban

      INTO l_matnr

      WHERE banfn = wa_head-banfn AND

            bnfpo = l_item_data-bnfpo.


    "如果修改了物料,检查更新的物料是否被冻结,冻结则输出物料信息、抛出异常并退出

    IF l_item_data-matnr <> l_matnr.


      SELECT SINGLE mstae lvorm

        INTO wa_dongjie

        FROM mara

        WHERE matnr = l_item_data-matnr.

      IF sy-subrc = 0 AND ( wa_dongjie-mstae IS NOT INITIAL OR wa_dongjie-lvorm = 'X'  ) .

        e_item_data = l_item_data.

        RAISE error.

        RETURN.

      ENDIF.

    ENDIF.

  ENDLOOP.


ENDFUNCTION.



欢迎关注订阅号:SAP学习记录 (SAPlearning )

ME51N ME52N创建修改采购申请时的一个BADI_