MIRO屏幕增强

文章描述了如何在MIRO业务场景中实现客制化字段的展示,特别关注BADI_FDCB_SUBBAS04的实例化管理,包括检查是否已实例化、激活/取消激活状态,并涉及多个模块的调用和数据交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 业务场景
    MIRO需要新增客制化字段展示,或者RBKP有的字段,但是INVFO没有的字段展示,或者RBKP和INVFO都存在的字段。增强点:BADI_FDCB_SUBBAS04,由于该BADI只能实例化一次,如果已经实例化过,我们新建的BADI增强就不能激活,所以我们可以先SXC_EXIT查找BADI实例化的地方,
    在这里插入图片描述然后SXC_ATTR查看这两个实例化激活状态,如果FPIA_APP_FU_MM这个显示是激活状态,我们就必须先给它取消激活,才可以进一步激活我们创建的BADI
    在这里插入图片描述

  2. 效果图片
    我这里是RBKP存在的字段,在INVFO里面不存在
    在这里插入图片描述

  3. 增强结构
    ACMM_VENDOR_COMP在这里插入图片描述INVFO
    在这里插入图片描述

6.建一个函数组ZFG_MIRO
在这里插入图片描述
LZFG_MIROTOP

FUNCTION-POOL zfg_miro.                     "MESSAGE-ID ..
INCLUDE LZFG_MIROD...                      " Local class definition

TABLES:invfo.
DATA: o_badi_fdcb_subbas04 TYPE REF TO if_ex_badi_fdcb_subbas04.
CONSTANTS exit_name_fdcb_subbas04 TYPE exit_def
                          VALUE 'BADI_FDCB_SUBBAS04'.

LZFG_MIROO01

*----------------------------------------------------------------------*
***INCLUDE LZFG_MIROO01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module GET_INSTANCE OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE get_instance OUTPUT.
  IF o_badi_fdcb_subbas04 IS INITIAL.

    CALL METHOD cl_exithandler=>get_instance_for_subscreens
      CHANGING
        instance                      = o_badi_fdcb_subbas04
      EXCEPTIONS
        no_reference                  = 1
        no_interface_reference        = 2
        no_exit_interface             = 3
        data_incons_in_exit_managem   = 4
        class_not_implement_interface = 5
        OTHERS                        = 6.

    IF sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*     WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

  ENDIF.


* object created
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.


* get data from main screen
  CALL METHOD o_badi_fdcb_subbas04->get_data_from_screen_object
    IMPORTING
      ex_invfo = invfo.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module SCREEN_MODIFY OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE screen_modify OUTPUT.
  LOOP AT SCREEN.
    CASE sy-tcode.
      WHEN 'FB60' OR 'FB65' OR 'FB70' OR 'FB75'
         OR 'MIRO' OR 'MIRA' OR 'MIR7'.

        screen-input = 1.
      WHEN OTHERS.
        screen-input = 0.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.
ENDMODULE.

LZFG_MIROI01

*----------------------------------------------------------------------*
***INCLUDE LZFG_MIROI01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  RECEIVE_ACTUAL_DATA  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE receive_actual_data INPUT.
* object created
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.

* get data from main screen
  CALL METHOD o_badi_fdcb_subbas04->get_data_from_screen_object
    IMPORTING
      ex_invfo = invfo.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
* object created
  CHECK NOT o_badi_fdcb_subbas04 IS INITIAL.

* put data to main screen
  CALL METHOD o_badi_fdcb_subbas04->put_data_to_screen_object
    EXPORTING
      im_invfo = invfo.
ENDMODULE.

屏幕:9001

PROCESS BEFORE OUTPUT.
* MODULE STATUS_9001.
  MODULE get_instance.
  MODULE screen_modify.

PROCESS AFTER INPUT.
  MODULE receive_actual_data.
  FIELD:invfo-ername.
  MODULE user_command_9001.
  1. BADI处理
    首先配置自己新建的屏幕在这里插入图片描述PUT_DATA_TO_SCREEN_OBJECT
   METHOD if_ex_badi_fdcb_subbas04~put_data_to_screen_object.
    me->if_ex_badi_fdcb_subbas04~invfo = im_invfo.
  ENDMETHOD.

GET_DATA_FROM_SCREEN_OBJECT

  METHOD if_ex_badi_fdcb_subbas04~get_data_from_screen_object.
    DATA lv_ername TYPE rbkp-ername.

    IF ex_invfo-ername IS NOT INITIAL.
      lv_ername = ex_invfo-ername.
    ENDIF.

    ex_invfo = me->if_ex_badi_fdcb_subbas04~invfo.

    IF ex_invfo-ername IS INITIAL AND lv_ername IS NOT INITIAL.
      ex_invfo-ername = lv_ername.
    ENDIF.
    CLEAR lv_ername.
  ENDMETHOD.
### 关于SAP MIRo增强开发与配置 在处理SAP MIRo(Material Incoming Invoice)增强时,主要关注点在于调整发票验证逻辑以及集成其他业务流程。对于涉及付款条件和折扣的具体情况,在MIRO使用净值加付款条件下,当采用特定计价方式如'S'时,原本应计入库存科目的金额差异会被重新分配至价格差异科目内[^3]。 为了实现更复杂的自定义需求,可以通过以下几种方式进行SAP MIRo增强: #### 使用BAdI (Business Add-In) 通过创建并激活相应的BAdI来扩展标准功能而不改变原程序代码。这允许开发者针对特定场景定制化处理逻辑而不会影响系统的稳定性。 ```abap CLASS zcl_miro_enhancement DEFINITION. PUBLIC SECTION. METHODS: on_invoice_verification FOR EVENT invoice_verification OF cl_fi_rm07g00 IMPORTING ebeln " Purchase Order Number ebelp " Item number of purchase order item lifnr " Vendor Number CHANGING wa_bseg TYPE bseg. ENDCLASS. CLASS zcl_miro_enhancement IMPLEMENTATION. METHOD on_invoice_verification. " Custom logic here to enhance the verification process based on business requirements ENDMETHOD. ENDCLASS. ``` #### 用户退出(User Exits) 利用用户出口函数模块对现有事务进行补充或修改。这些出口提供了插入额外处理步骤的机会,比如更改默认值、增加新的字段校验等。 ```abap FUNCTION USEREXIT_MIRO_CHECK. *"---------------------------------------------------------------------- *"*" Local Interface: *" IMPORTING *" VALUE(VBELN) LIKE VBRK-VBELN *"---------------------------------------------------------------------- DATA: lv_message(80). IF sy-subrc EQ 0. CASE vbeln. WHEN 'SPECIFIC_CONDITION'. CONCATENATE 'Custom validation failed for PO:' vbeln INTO lv_message SEPARATED BY space. MESSAGE lv_message TYPE 'E'. ENDCASE. ENDIF. ENDFUNCTION. ``` #### 自定义Z程序 编写专门的应用程序以满足特殊的企业政策或是优化某些操作流程。这类程序可以直接调用现有的BAPIs或者RFC接口与其他系统交互。 ```abap REPORT zmiro_custom_processing. PARAMETERS: p_ebeln TYPE ekko-ebeln OBLIGATORY, p_lifnr TYPE lfa1-lifnr DEFAULT 'VENDOR'. START-OF-SELECTION. PERFORM fetch_data USING p_ebeln p_lifnr. PERFORM perform_custom_logic. PERFORM update_database. ... FORM fetch_data USING iv_ebeln iv_lifnr. SELECT SINGLE * FROM ekpo WHERE ebeln = iv_ebeln AND lifnr = iv_lifnr. IF sy-subrc NE 0. WRITE: / 'No matching records found.'. ENDIF. ENDFORM. ``` 以上三种方法可以根据实际项目的需求灵活选用一种或多组合起来应用。重要的是要确保所有的变更都经过充分测试,并遵循公司内部的最佳实践指导方针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值