SAP_ABAP_MM_BADI清单案例教程——PR采购申请创建_ME_PROCESS_REQ_CUST_ME51N

SAP ABAP 顾问(开发工程师)能力模型_Terry谈企业数字化的博客-CSDN博客目标:基于对SAP abap 顾问能力模型的梳理,给一年左右经验的abaper 快速成长为三年经验提参考ALV/REPORT|SMARTFROM|SCREEN|OLE|BAPI|BDC|PI|IDOC|RFC|API|WEBSERVICE|Enhancement|UserExits|Badi|Debughttps://blog.csdn.net/java_zhong1990/article/details/132469977


一 背景说明

1.1 BADI的概念

        SAP BADI(Business Application Development Interface)是SAP在标准程序中为客户自定义逻辑所预留的接口(属于第三代增强),在技术本质上是一个interface,通过实现类的向上继承,完成用户逻辑的调用。

1.2 BADI清单

采购申请创建 | 采购订单创建 | 采购订单审批 | 采购订单收货 | 采购发票校验 

生产订单收货 |

采购申请创建ME_PROCESS_REQ_CUSTSAP_MM_ABAP_BADI清单案例教程——PR采购申请创建_ME_PROCESS_REQ_CUST_ME51N_Terry谈企业数字化的博客-CSDN博客
采购订单创建ME_PROCESS_PO_CUSTSAP_MM_ABAP_BADI清单案例教程——PO采购订单创建_ME_PROCESS_PO_CUST_ME21N-CSDN博客
采购订单审批

ZME_PURCHDOC_POSTED

SAP_MM_ABAP_BADI清单案例教程——PO采购订单审批_ME_PURCHDOC_POSTED_ME29N-CSDN博客
采购订单收货MB_MIGO_BADISAP_MM_ABAP_BADI清单案例教程——PO采购订单收货_MB_MIGO_BADI_MIGO_Terry谈企业数字化的博客-CSDN博客
采购发票校验

INVOICE_UPDATE

SAP_MM_ABAP_BADI清单案例教程——PO采购发票校验_INVOICE_UPDATE_MIRO-CSDN博客
生产订单收货

ZMB_DOCUMENT_BADI

SAP_MM_ABAP_BADI清单案例教程——生产订单收货_MB_DOCUMENT_BADI_MB1B_Terry谈企业数字化的博客-CSDN博客

二 实施步骤

参考:https://blog.csdn.net/java_zhong1990/article/details/133642824

2.1 BADI名称 ME_PROCESS_REQ_CUST

2.2 实施BADI,输入Tcode SE19

ZCL_IM_ME_PROCESS_REQ_CUST 

三 实施细节

INITIALIZEABAP ABAP 代码Initializations (Invoked Once Only)
OPENABAP ABAP 代码Open a Purchase Requisition
PROCESS_HEADERABAP ABAP 代码Processing of Header Data
PROCESS_ITEMABAP ABAP 代码Processing of Item Data
PROCESS_ACCOUNTABAP ABAP 代码Processing of Account Assignment Data
CHECKABAP ABAP 代码Closing Check
POSTABAP ABAP 代码Post
CLOSEABAP ABAP 代码Closing Processing
FIELDSELECTION_HEADER_REFKEYSABAP ABAP 代码Field Selection Reference Key Document Header
FIELDSELECTION_HEADERABAP ABAP 代码Special Field Selection Header
FIELDSELECTION_ITEM_REFKEYSABAP ABAP 代码Field Selection Reference Key Document Item
FIELDSELECTION_ITEMABAP ABAP 代码Special Field Selection Item

CHECK

获取采购订单行数据

    DATA lt_header TYPE mereq_header.

    DATA:lt_items     TYPE mmpur_requisition_items,
         ls_items     TYPE mmpur_requisition_item,
         ls_item_data TYPE mereq_item,
         ls_item      TYPE REF TO if_purchase_requisition_item.

    lt_header = im_header->get_data( ).
    lt_items  = im_header->get_items( ).

  LOOP AT lt_items INTO ls_items.
      ls_item = ls_items-item.
      
      CLEAR ls_item_data.
      ls_item_data = ls_item->get_data( ). //获取行中的信息

METHOD if_ex_me_process_req_cust~check.

    DATA lt_header TYPE mereq_header.

    DATA:lt_items     TYPE mmpur_requisition_items,
         ls_items     TYPE mmpur_requisition_item,
         ls_item_data TYPE mereq_item,
         ls_item      TYPE REF TO if_purchase_requisition_item.

    lt_header = im_header->get_data( ).
    lt_items  = im_header->get_items( ).

    DATA:l_flag  TYPE c.
    DATA:l_flag2 TYPE c."交货日期 用
    DATA:l_flag3 TYPE c."数量用
    DATA:l_frgkz  TYPE eban-frgkz.
    DATA:l_frgkz2 TYPE eban-frgkz."已存在的批准标识
    DATA:eflag  TYPE c.
    DATA:eflag2 TYPE c.
    DATA:eflag3 TYPE c.
    DATA:oflag  TYPE c.
    l_frgkz  = ''.
    l_flag   = ''.
    l_frgkz2 = ''.
    l_flag2  = ''.
    l_flag3  = ''.
    eflag    = 0.
    eflag2   = 0.
    eflag3   = 0.
    oflag    = 0.
    "判断所有行项是否存在已传输
    LOOP AT lt_items INTO ls_items.
      ls_item = ls_items-item.
	  
      CLEAR ls_item_data.
      ls_item_data = ls_item->get_data( ).

      l_frgkz  = ls_item_data-frgkz.
      l_frgkz2 = ls_item_data-frgkz.

      "判断从P->X 的行项是否为订单已删除行项
      IF lfrgkz = 'P' AND l_frgkz2 = 'X'.
	  
        SELECT SINGLE loekz INTO @DATA(lloekz) FROM ekpo WHERE bnfpo = @ls_item_data-bnfpo AND banfn = @lt_header-banfn .
        IF lloekz = 'L' OR lloekz IS INITIAL .
        ELSE.
		
          IF ls_item_data-lfdat <> llfdat OR ls_item_data-menge <> lmenge OR ls_item_data-knttp <> lknttp OR ( lfrgkz = 'P' AND l_frgkz2 = 'X' ).
            eflag2 = 1.
          ENDIF.
		  
        ENDIF.
		
      ENDIF.
	  
      "已审批 不可修改交货日期 LFDAT
      "IF lfrgkz = 'P'.
      "改前改后交货日期不一致则计数
      "判断是否已转采购订单
      SELECT COUNT(*) INTO @DATA(lcount) FROM ekpo WHERE bnfpo = @ls_item_data-bnfpo AND banfn = @lt_header-banfn AND loekz <> 'L'.

      IF lcount > 0."OR ls_item_data-menge <> lmenge  OR ( lfrgkz = 'P' AND l_frgkz2 = 'X' )
        IF ls_item_data-lfdat <> llfdat  OR ls_item_data-knttp <> lknttp .
          eflag = 1.
        ENDIF.
        oflag = 1.
      ENDIF.

      "ZMM007已传输 不可从P到X
      SELECT SINGLE statu,menge,lfdat INTO (@DATA(lstatu),@DATA(lmenge2),@DATA(llfdat2))
        FROM ztmm0007 WHERE bnfpo = @ls_item_data-bnfpo AND banfn = @lt_header-banfn.
      IF lstatu = 'S'.
        IF   lfrgkz = 'P' AND l_frgkz2 = 'X' ."lfrgkz <> l_frgkz2 .
          MESSAGE e000(zmm01)  WITH '项目' && ls_item_data-bnfpo && ':已推送OA不可修改'.
        ENDIF.
        IF ls_item_data-menge < lmenge2.
          MESSAGE e000(zmm01)  WITH '项目' && ls_item_data-bnfpo && ':数量小于已传输OA的数量'.
        ENDIF.
        IF ls_item_data-lfdat < llfdat2.
          MESSAGE e000(zmm01)  WITH '项目' && ls_item_data-bnfpo && ':交货日期小于已传输OA的交货日期'.
        ENDIF.
      ENDIF.

      CLEAR:lstatu.
      CLEAR:lcount,lloekz.
      CLEAR:lmenge2,llfdat2.
      CLEAR:lfrgkz,llfdat,lmenge,lknttp.

    ENDLOOP.

    IF oflag = 1.
      IF eflag = 1.
        MESSAGE '采购申请已转单' TYPE 'E'."采购订单不可修改
      ENDIF.
    ENDIF.

    IF eflag2 = 1.
      MESSAGE '采购申请已审批不可修改' TYPE 'E'.
    ENDIF.

  ENDMETHOD.
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Terry谈企业数字化

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

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

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

打赏作者

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

抵扣说明:

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

余额充值