• ME21N 采购订单新增页签增强


    1、实现效果

    根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签。效果如下:

    2、增强实现

    2.1、增强结构

    因为是在抬头上边添加,所以增强CI_EKKODB结构

    2.2、函数组

    仿照Function Group MEPOBADIEX建一个Function Group

    函数组:

    2.3、增强实施

    2.3.1、BADI:ME_GUI_PO_CUST

    方法:SUBSCRIBE

    1. "--------------------@斌将军--------------------
    2. method IF_EX_ME_GUI_PO_CUST~SUBSCRIBE.
    3. DATA: LS_SUBSCRIBERS TYPE MEPO_SUBSCRIBERS.
    4. *1 抬头
    5. IF IM_APPLICATION = 'PO' AND IM_ELEMENT = 'HEADER'.
    6. CLEAR RE_SUBSCRIBERS[] .
    7. CLEAR LS_SUBSCRIBERS.
    8. LS_SUBSCRIBERS-NAME = SUBSCREEN_H."屏幕名称
    9. LS_SUBSCRIBERS-DYNPRO = '9001'."函数组的屏幕编号
    10. LS_SUBSCRIBERS-PROGRAM = 'SAPLZMMPO001'."调用的函数组
    11. LS_SUBSCRIBERS-STRUCT_NAME = 'CI_EKKODB'."增强的结构
    12. LS_SUBSCRIBERS-LABEL = '其他数据'."页签名称
    13. LS_SUBSCRIBERS-POSITION = 30."页签处于的位置
    14. LS_SUBSCRIBERS-HEIGHT = 7."页签高度
    15. APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS.
    16. ENDIF.
    17. *2
    18. * IF IM_APPLICATION = 'PO' AND IM_ELEMENT = 'ITEM'.
    19. * CLEAR RE_SUBSCRIBERS[] .
    20. * CLEAR LS_SUBSCRIBERS.
    21. * LS_SUBSCRIBERS-NAME = SUBSCREEN_I.
    22. * LS_SUBSCRIBERS-DYNPRO = '9100'.
    23. * LS_SUBSCRIBERS-PROGRAM = 'SAPLZMM003'.
    24. * LS_SUBSCRIBERS-STRUCT_NAME = 'CI_EKPODB'.
    25. * LS_SUBSCRIBERS-LABEL = 'Badi增强行项目屏幕'.
    26. * LS_SUBSCRIBERS-POSITION = 24. "页签处于的位置
    27. * LS_SUBSCRIBERS-HEIGHT = 4.
    28. * APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS.
    29. * ENDIF.
    30. endmethod.
    31. "--------------------@斌将军--------------------

    定义相关属性

    方法:MAP_DYNPRO_FIELDS

    1. "--------------------@斌将军--------------------
    2. method IF_EX_ME_GUI_PO_CUST~MAP_DYNPRO_FIELDS.
    3. FIELD-SYMBOLS: LIKE LINE OF ch_mapping.
    4. LOOP AT ch_mapping ASSIGNING .
    5. CASE -fieldname.
    6. WHEN 'ZEJFL'. -metafield = mmmfd_cust_01. "抬头
    7. * WHEN 'ZHEAD02'. -metafield = mmmfd_cust_02.
    8. * WHEN 'ZZ001'. -metafield = mmmfd_cust_03. "明细
    9. * WHEN 'ZZ005'. -metafield = mmmfd_cust_04.
    10. * "自定义字段
    11. * WHEN 'ZFIELD3'.-metafield = mmmfd_cust_05.
    12. ENDCASE.
    13. ENDLOOP.
    14. endmethod.
    15. "--------------------@斌将军--------------------

    方法:TRANSPORT_FROM_MODEL

    1. "--------------------@斌将军--------------------
    2. method IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_MODEL.
    3. DATA: ls_header TYPE REF TO if_purchase_order_mm,
    4. ls_mepoheader TYPE mepoheader,
    5. ls_item TYPE REF TO if_purchase_order_item_mm,
    6. ls_mepoitem TYPE mepoitem.
    7. *1 抬头
    8. IF im_name = subscreen_h.
    9. mmpur_dynamic_cast ls_header im_model.
    10. IF ls_header IS NOT INITIAL.
    11. ls_mepoheader = ls_header->get_data( ).
    12. MOVE-CORRESPONDING ls_mepoheader TO dynp_data_pbo_h.
    13. ENDIF.
    14. ENDIF.
    15. *2 明细
    16. * IF im_name = subscreen_i.
    17. * mmpur_dynamic_cast ls_item im_model.
    18. * IF ls_item IS NOT INITIAL.
    19. * ls_mepoitem = ls_item->get_data( ).
    20. * MOVE-CORRESPONDING ls_mepoitem TO dynp_data_pbo_i.
    21. * ENDIF.
    22. * ENDIF.
    23. endmethod.
    24. "--------------------@斌将军--------------------

    方法:TRANSPORT_TO_DYNP

    1. "--------------------@斌将军--------------------
    2. METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_DYNP.
    3. CASE IM_NAME.
    4. *1 抬头
    5. WHEN SUBSCREEN_H.
    6. call function 'ZMMPO001_PUSH'
    7. EXPORTING
    8. IM_DYNP_DATA = DYNP_DATA_PBO_H.
    9. *2 明细
    10. * WHEN subscreen_i.
    11. * CALL FUNCTION 'ZMMPO002_PUSH'
    12. * EXPORTING
    13. * im_dynp_data = dynp_data_pbo_i.
    14. WHEN OTHERS.
    15. ENDCASE.
    16. ENDMETHOD.
    17. "--------------------@斌将军--------------------

    方法:TRANSPORT_FROM_DYNP

    1. "--------------------@斌将军--------------------
    2. METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP.
    3. CASE IM_NAME.
    4. *1 抬头
    5. WHEN SUBSCREEN_H.
    6. call function 'ZMMPO001_POP'
    7. IMPORTING
    8. EX_DYNP_DATA = DYNP_DATA_PAI_H.
    9. IF DYNP_DATA_PAI_H <> DYNP_DATA_PBO_H.
    10. RE_CHANGED = MMPUR_YES.
    11. ENDIF.
    12. *2 明细
    13. * WHEN subscreen_i.
    14. * CALL FUNCTION 'ZMMPO002_POP'
    15. * IMPORTING
    16. * ex_dynp_data = dynp_data_pai_i.
    17. * IF dynp_data_pai_i <> dynp_data_pbo_i.
    18. * re_changed = mmpur_yes.
    19. * ENDIF.
    20. WHEN OTHERS.
    21. ENDCASE.
    22. ENDMETHOD.
    23. "--------------------@斌将军--------------------

    方法:TRANSPORT_TO_MODEL

    1. "--------------------@斌将军--------------------
    2. method IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL.
    3. DATA: ls_header TYPE REF TO if_purchase_order_mm,
    4. ls_mepoheader TYPE mepoheader,
    5. ls_po_head_customer TYPE ci_ekkodb,
    6. ls_po_header_handle TYPE REF TO cl_po_header_handle_mm,
    7. ls_item TYPE REF TO if_purchase_order_item_mm,
    8. ls_mepoitem TYPE mepoitem,
    9. ls_po_item_customer TYPE ci_ekpodb,
    10. ls_po_item_handle TYPE REF TO cl_po_item_handle_mm.
    11. CASE im_name.
    12. *1 抬头
    13. WHEN subscreen_h.
    14. mmpur_dynamic_cast ls_header im_model.
    15. IF ls_header IS NOT INITIAL.
    16. ls_mepoheader = ls_header->get_data( ).
    17. IF dynp_data_pbo_h-ZEJFL <> dynp_data_pai_h-ZEJFL.
    18. * OR dynp_data_pbo_h-zhead02 <> dynp_data_pai_h-zhead02.
    19. ls_mepoheader-ZEJFL = dynp_data_pai_h-ZEJFL.
    20. * ls_mepoheader-zhead02 = dynp_data_pai_h-zhead02.
    21. CALL METHOD ls_header->set_data
    22. EXPORTING
    23. im_data = ls_mepoheader.
    24. ENDIF.
    25. ENDIF.
    26. *2 明细
    27. * WHEN subscreen_i.
    28. * mmpur_dynamic_cast ls_item im_model.
    29. * IF ls_item IS NOT INITIAL.
    30. * ls_mepoitem = ls_item->get_data( ).
    31. * IF dynp_data_pbo_i-zz001 <> dynp_data_pai_i-zz001
    32. * OR dynp_data_pbo_i-zz005 <> dynp_data_pai_i-zz005.
    33. *
    34. * ls_mepoitem-zz001 = dynp_data_pai_i-zz001.
    35. * ls_mepoitem-zz005 = dynp_data_pai_i-zz005.
    36. *
    37. * CALL METHOD ls_item->set_data
    38. * EXPORTING
    39. * im_data = ls_mepoitem.
    40. * ENDIF.
    41. * ENDIF.
    42. WHEN OTHERS.
    43. ENDCASE.
    44. endmethod.
    45. "--------------------@斌将军--------------------

    2.3.2、BADI:ME_PROCESS_PO_CUST

    到此处,ME23N就可以看到新增的页签,但是ME21N和ME22N看不到,还需要实现一个BADI:ME_PROCESS_PO_CUST的FIELDSELECTION_HEADER方法。

    该BADI只能创建一个实施,如果已经有多个实施,必须将其他实施停用,否则将达不到效果。

    1. "--------------------@斌将军--------------------
    2. method IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER.
    3. DATA:ex_data TYPE mepoheader.
    4. DATA: LV_PERSISTENT TYPE MMPUR_BOOL.
    5. FIELD-SYMBOLS: LIKE LINE OF CH_FIELDSELECTION.
    6. DEFINE SET_INPUT.
    7. READ TABLE ch_fieldselection ASSIGNING WITH TABLE KEY metafield = &1.
    8. IF sy-subrc = 0.
    9. IF im_header->is_changeable( ) = mmpur_yes.
    10. -fieldstatus = '+'."'-'代表hidden, '+''.'表示editable, '*'代表display
    11. ELSE.
    12. -fieldstatus = '*'.
    13. ENDIF.
    14. ENDIF.
    15. END-OF-DEFINITION.
    16. LV_PERSISTENT = IM_HEADER->IS_PERSISTENT( ).
    17. SET_INPUT MMMFD_CUST_01.
    18. "获取订单数据
    19. CLEAR:ex_data.
    20. * ex_data = im_header->get_data( ).
    21. * SET_INPUT MMMFD_CUST_02.
    22. endmethod.
    23. "--------------------@斌将军--------------------

    对抬头和行项目输入数据的检查可放在方法:PROCESS_HEADER和PROCESS_ITEM中,激活后就成功了。

    定期更文,欢迎关注

  • 相关阅读:
    FPGA实验记录五:I2C读取AHT10温湿度传感器
    【.NET Core】使用 Castle 实现 AOP,以及 Autofac 集成 Castle
    第六天 变量的区别,必使用代码中的命令行参数,可变参数
    jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(2)
    mac磁盘清理的方法大全
    Builder 请进:波卡最新开发入门指南
    LoadRunner VUG 脚本
    【进阶版】机器学习之贝叶斯分类器细节回顾及原理完善(10)
    车载网络SOA服务之SOMEIP介绍
    极致CMS翻译插件自动批量多语种翻译
  • 原文地址:https://blog.csdn.net/BinGeneral/article/details/132803147