ME21N 采购订单新增页签增强

定制采购订单界面:添加页签与功能组实现
文章描述了如何在采购订单界面中按需添加页签,包括增强结构、创建FunctionGroup和BADIME_PROCESS_PO_CUST的FIELDSELECTION_HEADER方法,以实现在ME23N中显示新增字段。同时涉及数据映射和传输过程。

1、实现效果

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

2、增强实现

2.1、增强结构

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

2.2、函数组

仿照Function Group MEPOBADIEX建一个Function Group

函数组:

2.3、增强实施

2.3.1、BADI:ME_GUI_PO_CUST

方法:SUBSCRIBE

"--------------------@斌将军--------------------
method IF_EX_ME_GUI_PO_CUST~SUBSCRIBE.
  DATA: LS_SUBSCRIBERS TYPE MEPO_SUBSCRIBERS.
*1 抬头
  IF IM_APPLICATION = 'PO' AND IM_ELEMENT = 'HEADER'.
    CLEAR RE_SUBSCRIBERS[] .
    CLEAR LS_SUBSCRIBERS.
    LS_SUBSCRIBERS-NAME        = SUBSCREEN_H."屏幕名称
    LS_SUBSCRIBERS-DYNPRO      = '9001'."函数组的屏幕编号
    LS_SUBSCRIBERS-PROGRAM     = 'SAPLZMMPO001'."调用的函数组
    LS_SUBSCRIBERS-STRUCT_NAME = 'CI_EKKODB'."增强的结构
    LS_SUBSCRIBERS-LABEL       = '其他数据'."页签名称
    LS_SUBSCRIBERS-POSITION    = 30."页签处于的位置
    LS_SUBSCRIBERS-HEIGHT      = 7."页签高度
    APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS.
  ENDIF.
*2 
*  IF IM_APPLICATION = 'PO' AND IM_ELEMENT = 'ITEM'.
*    CLEAR RE_SUBSCRIBERS[] .
*    CLEAR LS_SUBSCRIBERS.
*    LS_SUBSCRIBERS-NAME        = SUBSCREEN_I.
*    LS_SUBSCRIBERS-DYNPRO      = '9100'.
*    LS_SUBSCRIBERS-PROGRAM     = 'SAPLZMM003'.
*    LS_SUBSCRIBERS-STRUCT_NAME = 'CI_EKPODB'.
*    LS_SUBSCRIBERS-LABEL       = 'Badi增强行项目屏幕'.
*    LS_SUBSCRIBERS-POSITION    = 24.   "页签处于的位置
*    LS_SUBSCRIBERS-HEIGHT      = 4.
*    APPEND LS_SUBSCRIBERS TO RE_SUBSCRIBERS.
*  ENDIF.
  endmethod.
"--------------------@斌将军--------------------

定义相关属性

方法:MAP_DYNPRO_FIELDS

"--------------------@斌将军--------------------
method IF_EX_ME_GUI_PO_CUST~MAP_DYNPRO_FIELDS.
  FIELD-SYMBOLS: <mapping> LIKE LINE OF ch_mapping.

  LOOP AT ch_mapping ASSIGNING <mapping>.
    CASE <mapping>-fieldname.
    WHEN 'ZEJFL'. <mapping>-metafield = mmmfd_cust_01.  "抬头
*    WHEN 'ZHEAD02'. <mapping>-metafield = mmmfd_cust_02.
*    WHEN 'ZZ001'.   <mapping>-metafield = mmmfd_cust_03.  "明细
*    WHEN 'ZZ005'.   <mapping>-metafield = mmmfd_cust_04.
*      "自定义字段
*    WHEN 'ZFIELD3'.<mapping>-metafield = mmmfd_cust_05.
    ENDCASE.
  ENDLOOP.
  endmethod.
"--------------------@斌将军--------------------

方法:TRANSPORT_FROM_MODEL

"--------------------@斌将军--------------------
method IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_MODEL.
  DATA: ls_header     TYPE REF TO if_purchase_order_mm,
        ls_mepoheader TYPE mepoheader,
        ls_item       TYPE REF TO if_purchase_order_item_mm,
        ls_mepoitem   TYPE mepoitem.
*1 抬头
  IF im_name = subscreen_h.
    mmpur_dynamic_cast ls_header im_model.
    IF ls_header IS NOT INITIAL.
      ls_mepoheader = ls_header->get_data( ).
      MOVE-CORRESPONDING ls_mepoheader TO dynp_data_pbo_h.
    ENDIF.
  ENDIF.
*2 明细
*  IF im_name = subscreen_i.
*    mmpur_dynamic_cast ls_item im_model.
*    IF ls_item IS NOT INITIAL.
*      ls_mepoitem = ls_item->get_data( ).
*      MOVE-CORRESPONDING ls_mepoitem TO dynp_data_pbo_i.
*    ENDIF.
*  ENDIF.
  endmethod.
"--------------------@斌将军--------------------

方法:TRANSPORT_TO_DYNP

"--------------------@斌将军--------------------
METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_DYNP.
    CASE IM_NAME.
*1 抬头
      WHEN SUBSCREEN_H.
        call function 'ZMMPO001_PUSH'
          EXPORTING
            IM_DYNP_DATA = DYNP_DATA_PBO_H.
*2 明细
*  WHEN subscreen_i.
*    CALL FUNCTION 'ZMMPO002_PUSH'
*    EXPORTING
*      im_dynp_data = dynp_data_pbo_i.
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.
"--------------------@斌将军--------------------

方法:TRANSPORT_FROM_DYNP

"--------------------@斌将军--------------------
METHOD IF_EX_ME_GUI_PO_CUST~TRANSPORT_FROM_DYNP.
    CASE IM_NAME.
*1 抬头
      WHEN SUBSCREEN_H.
        call function 'ZMMPO001_POP'
          IMPORTING
            EX_DYNP_DATA = DYNP_DATA_PAI_H.
        IF DYNP_DATA_PAI_H <> DYNP_DATA_PBO_H.
          RE_CHANGED = MMPUR_YES.
        ENDIF.
*2 明细
*  WHEN subscreen_i.
*    CALL FUNCTION 'ZMMPO002_POP'
*    IMPORTING
*      ex_dynp_data = dynp_data_pai_i.
*    IF dynp_data_pai_i <> dynp_data_pbo_i.
*      re_changed = mmpur_yes.
*    ENDIF.
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.
"--------------------@斌将军--------------------

方法:TRANSPORT_TO_MODEL

"--------------------@斌将军--------------------
method IF_EX_ME_GUI_PO_CUST~TRANSPORT_TO_MODEL.
  DATA: ls_header           TYPE REF TO if_purchase_order_mm,
        ls_mepoheader       TYPE mepoheader,
        ls_po_head_customer TYPE ci_ekkodb,
        ls_po_header_handle TYPE REF TO cl_po_header_handle_mm,
        ls_item             TYPE REF TO if_purchase_order_item_mm,
        ls_mepoitem         TYPE mepoitem,
        ls_po_item_customer TYPE ci_ekpodb,
        ls_po_item_handle   TYPE REF TO cl_po_item_handle_mm.

  CASE im_name.
*1 抬头
  WHEN subscreen_h.
    mmpur_dynamic_cast ls_header im_model.
    IF ls_header IS NOT INITIAL.
      ls_mepoheader = ls_header->get_data( ).
      IF  dynp_data_pbo_h-ZEJFL <> dynp_data_pai_h-ZEJFL.
*      OR dynp_data_pbo_h-zhead02 <> dynp_data_pai_h-zhead02.
        ls_mepoheader-ZEJFL = dynp_data_pai_h-ZEJFL.
*        ls_mepoheader-zhead02 = dynp_data_pai_h-zhead02.
        CALL METHOD ls_header->set_data
        EXPORTING
          im_data = ls_mepoheader.
      ENDIF.
    ENDIF.
*2 明细
*  WHEN subscreen_i.
*    mmpur_dynamic_cast ls_item im_model.
*    IF ls_item IS NOT INITIAL.
*      ls_mepoitem = ls_item->get_data( ).
*      IF  dynp_data_pbo_i-zz001 <> dynp_data_pai_i-zz001
*      OR dynp_data_pbo_i-zz005 <> dynp_data_pai_i-zz005.
*
*        ls_mepoitem-zz001 = dynp_data_pai_i-zz001.
*        ls_mepoitem-zz005 = dynp_data_pai_i-zz005.
*
*        CALL METHOD ls_item->set_data
*        EXPORTING
*          im_data = ls_mepoitem.
*      ENDIF.
*    ENDIF.
  WHEN OTHERS.
  ENDCASE.
  endmethod.
"--------------------@斌将军--------------------

2.3.2、BADI:ME_PROCESS_PO_CUST

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

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

"--------------------@斌将军--------------------
method IF_EX_ME_PROCESS_PO_CUST~FIELDSELECTION_HEADER.
DATA:ex_data TYPE mepoheader.
  DATA: LV_PERSISTENT TYPE MMPUR_BOOL.
  FIELD-SYMBOLS: <FS> LIKE LINE OF CH_FIELDSELECTION.

  DEFINE SET_INPUT.
    READ TABLE ch_fieldselection ASSIGNING <fs> WITH TABLE KEY metafield = &1.
    IF sy-subrc = 0.
      IF im_header->is_changeable( ) = mmpur_yes.
        <fs>-fieldstatus = '+'."'-'代表hidden, '+'或'.'表示editable, '*'代表display
      ELSE.
        <fs>-fieldstatus = '*'.
      ENDIF.
    ENDIF.
  END-OF-DEFINITION.

  LV_PERSISTENT = IM_HEADER->IS_PERSISTENT( ).

  SET_INPUT MMMFD_CUST_01.
    "获取订单数据
    CLEAR:ex_data.
*   ex_data = im_header->get_data( ).
*  SET_INPUT MMMFD_CUST_02.
endmethod.
"--------------------@斌将军--------------------

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

定期更文,欢迎关注

<think> 我们参考了站内的引用内容,特别是引用[2]中提到的为事务代码添加新授权检查的方法。用户的问题是:在ABAP中为ME23N事务码新增打印功能。 注意:ME23N是SAP标准的事务代码,用于显示采购订单。通常,新增功能可以通过用户出口(User Exit)、BADI(Business Add-In)或增强点(Enhancement Spot)来实现,以避免直接修改SAP标准程序。 思路: 1. 我们需要在ME23N的界面上添加一个打印按钮(或菜单选项),并实现打印功能。 2. 打印功能的实现可能需要调用一个打印程序或者生成一个Smartform/Adobe Form,然后输出。 3. 考虑到权限,如果需要新的权限对象,可以按照引用[2]中的方法创建权限对象并在程序中检查。 步骤建议: 第一步:使用增强技术添加按钮 - 查找合适的增强点(例如使用CMOD/SMOD)来增强ME23N的界面。常用的增强点是屏幕增强(Screen Exit)或菜单增强Menu Exit)。 - 在ME23N的标准程序中,有一个子程序`USER_COMMAND`(或者使用增强点)可以捕获用户命令。 第二步:实现打印功能 - 打印功能可以通过调用一个自定义的报表程序来实现,该程序根据当前显示的采购订单号(从ME23N中获取)打印所需内容。 - 或者,可以在ME23N中直接编写打印逻辑(例如调用Smartform或Adobe Form)。 第三步:权限检查(如果需要) - 如果这个打印功能需要特殊的权限,那么需要创建一个自定义的权限对象(比如Z_ME23N_PRINT),然后在点击打印按钮时使用`AUTHORITY-CHECK`语句检查权限。 具体步骤: 1. 增强ME23N的界面: - 使用事务码SE80或SE41查找ME23N的屏幕和菜单栏。通常,ME23N的程序名为SAPMM06E,屏幕号为0300。 - 使用增强点:在SAPMM06E中,可以使用菜单增强Menu Exit)来添加一个自定义的按钮或菜单项。例如,在标准菜单中添加一个“自定义打印”按钮。 - 创建增强项目: a. 事务码CMOD,创建一个项目,比如ZME23N_PRINT。 b. 选择“SAPMM06E”,然后选择组件“MEREQ001”(这是一个采购订单增强点,具体需要查一下ME23N对应的增强点,可能为MEREQ001或类似的)。 c. 在增强点中,我们可以添加一个菜单项(通过包含文件ZXM06UXX中的子程序)或者屏幕增强(在标准屏幕中添加一个按钮)。 2. 在用户命令处理中捕获自定义命令: - 在标准程序中,有一个用户命令处理子程序(例如`USER_COMMAND_XXXX`),我们可以通过增强在用户点击我们添加的按钮时捕获命令(例如,我们定义一个命令码为'ZPRINT')。 - 在增强中,当命令为'ZPRINT'时,调用我们的打印功能。 3. 打印功能实现: - 获取当前采购订单号:在ME23N中,采购订单号存储在变量`EKKO-EBELN`中(程序SAPMM06E中可能有不同的全局变量,需要查看程序结构,比如可能存储在`MEREQ001-EBELN`)。 - 调用Smartform或Adobe Form:可以创建一个打印表单,然后使用函数模块(如`SSF_FUNCTION_MODULE_NAME`)调用该表单。 - 或者,也可以调用一个自定义的事务码(比如ZME23N_PRINT)来执行打印,这样可以通过CALL TRANSACTION或者SUBMIT的方式。 4. 权限检查(可选): - 如果希望控制用户使用打印功能,可以在执行打印前检查权限: ``` AUTHORITY-CHECK OBJECT 'Z_ME23N_PRINT' ID 'ACTVT' FIELD '03' " 活动:打印 ID 'EKORG' FIELD ekorg. " 采购组织(根据需求) IF sy-subrc <> 0. MESSAGE e208(00) WITH '无权打印'. ENDIF. ``` - 注意:需要先在SU21中创建权限对象Z_ME23N_PRINT,并在角色中分配。 5. 考虑使用BADI: - 另外,SAP可能为ME23N提供了BADI,例如:`ME_GUI_PO_CUST`。我们可以实现这个BADI,在方法`PROCESS_CUSTOM_FCODE`中处理自定义功能码。 具体实现步骤(使用BADI): - 查找并实现BADI:`ME_GUI_PO_CUST`。 - 在BADI的实现中,我们可以处理自定义的功能码(比如ZPRINT)。 - 在方法`PROCESS_CUSTOM_FCODE`中,检查功能码是否等于'ZPRINT',然后执行打印逻辑。 总结: 由于直接修改标准程序不被允许,我们通常使用增强来实现。使用BADI `ME_GUI_PO_CUST` 是一种更现代且推荐的方式。 因此,具体步骤为: 1. 创建BADI实现:使用事务码SE18,查找BADI `ME_GUI_PO_CUST`,然后使用SE19创建实现(例如ZME_GUI_PO_CUST)。 2. 在实现中,重写方法`PROCESS_CUSTOM_FCODE`,在方法中处理自定义功能码ZPRINT。 ``` METHOD if_ex_me_gui_po_cust~process_custom_fcode. CASE fcode. WHEN 'ZPRINT'. " 获取当前采购订单号,可以通过cl_gui_control=>get_focus获取当前屏幕的字段值?或者从全局数据获取 " 实际上,在ME23N中,采购订单号存储在内存中(例如,使用EXPORT/IMPORT内存ID),或者可以从BADI提供的参数中获取? " 注意:根据BADI文档,可能需要从全局变量中获取。在ME23N中,采购订单号通常存储在内存ID 'BEST'中。 IMPORT ebeln FROM MEMORY ID 'BEST'. IF sy-subrc = 0. " 调用打印程序或表单 CALL FUNCTION 'Z_ME23N_PRINT_FORM' EXPORTING iv_ebeln = ebeln. ENDIF. ENDCASE. ENDMETHOD. ``` 3. 在ME23N的界面上添加一个按钮:可以使用菜单增强或者使用BADI中的方法`SET_CUSTOM_FCODE`(但注意这个BADI是否支持在界面上添加按钮?)。实际上,BADI `ME_GUI_PO_CUST` 中有一个方法`SET_CUSTOM_FCODE_HANDLING`,我们可以用它来注册自定义功能码,这样系统会自动在应用工具栏上添加一个按钮。具体步骤: - 在BADI的实现中,还需要重写方法`SET_CUSTOM_FCODE_HANDLING`,将我们的功能码添加到自定义功能码列表中。 ``` METHOD if_ex_me_gui_po_cust~set_custom_fcode_handling. APPEND 'ZPRINT' TO ct_fcode_list. ENDMETHOD. ``` 这样,系统在初始化工具栏时会添加一个功能码为ZPRINT的按钮。但是,按钮的文本和图标需要在哪里设置?我们可以通过设置GUI status(状态)来添加按钮,但标准程序可能不允许直接修改。因此,另一种方法是使用应用工具栏增强(APPEND_TO_TOOLBAR)方法。 4. 但是,根据SAP标准,使用BADI `ME_GUI_PO_CUST` 来添加自定义按钮,需要在BADI实现中实现方法`APPEND_TOOLBAR`。 - 在SE19中,编辑BADI实现,重写方法`APPEND_TOOLBAR`,添加按钮: ``` METHOD if_ex_me_gui_po_cust~append_toolbar. " 定义一个按钮 DATA: ls_button TYPE stb_btn. ls_button-function = 'ZPRINT'. ls_button-butn_type = '0'. " 普通按钮 ls_button-text = '打印'.. APPEND ls_button TO ct_toolbar. ENDMETHOD. ``` 这样,在启动ME23N时,工具栏上就会多出一个“打印”按钮。 5. 打印功能的具体实现:编写一个函数模块或子程序,根据采购订单号打印。可以使用Smartform或Adobe Form,或者直接输出ALV。 注意:以上步骤是理想情况,实际实施中可能需要根据SAP版本和具体环境调整。 另外,如果打印功能比较复杂,也可以考虑创建一个新的报表程序,然后在点击按钮时调用这个报表(使用SUBMIT),并将采购订单号传递过去。 综上所述,为ME23N新增打印功能的主要步骤是: - 使用BADI `ME_GUI_PO_CUST` 来添加自定义按钮并处理点击事件。 - 在事件处理中获取当前采购订单号,调用打印程序或表单。 最后,关于权限:如果新增的功能需要权限控制,则创建自定义权限对象,并在执行打印前检查。 注意:以上内容需要根据实际系统环境进行测试和调整。 相关问题: 1. 如何查找事务码对应的BADI? 2. 在ABAP中如何实现Smartform打印? 3. 如何为自定义功能创建权限对象? 4. 在SAP中如何增强标准事务的屏幕? 5. 如何使用内存传递参数? </think> 根据引用内容,结合SAP ABAP开发标准流程,为事务码ME23N新增打印功能的实现步骤如下: ### 实现方法 1. **创建打印功能模块** ```abap FUNCTION z_print_me23n. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(iv_ebeln) TYPE EBELN "采购订单号 *"---------------------------------------------------------------------- " 1. 获取数据逻辑 SELECT * FROM ekko WHERE ebeln = @iv_ebeln INTO @DATA(ls_ekko). " 2. 调用SmartForms/Adobe Forms输出 CALL FUNCTION '/1BCDWB/SF00000001' EXPORTING order_data = ls_ekko. ENDFUNCTION. ``` 2. **增强ME23N界面** - 使用事务码`SPRO`创建增强项目 - 在采购订单屏幕增强点`MM06E005`中添加自定义按钮: ```abap MODULE status_0300 OUTPUT. " 添加打印按钮到工具栏 SET PF-STATUS 'ZME23N_TOOLBAR' EXCLUDING it_excl. ENDMODULE. ``` 3. **实现BADI处理逻辑** ```abap CLASS zcl_me23n_print IMPLEMENTATION. METHOD if_ex_me_gui_po_cust~process_custom_fcode. CASE fcode. WHEN 'ZPRINT'. " 获取当前采购订单号 GET PARAMETER ID 'BES' FIELD DATA(lv_ebeln). " 调用打印函数 CALL FUNCTION 'Z_PRINT_ME23N' EXPORTING iv_ebeln = lv_ebeln. ENDCASE. ENDMETHOD. ENDCLASS. ``` 4. **权限配置** - 在SU21创建权限对象`Z_ME23N_PRINT` - 在程序中添加权限检查: ```abap AUTHORITY-CHECK OBJECT 'Z_ME23N_PRINT' ID 'ACTVT' FIELD '23'. "打印权限 IF sy-subrc <> 0. MESSAGE e208(00) WITH '无打印权限'. ENDIF. ``` 5. **事务码绑定** - 在TSTC表中注册新功能为独立事务码 ```abap INSERT tstc VALUES ( tcode = 'ZME23NPRT' pgmna = 'SAPLZPRINT_MODULE' dynpr = '1000' ). ``` ### 技术要点 1. **增强方式选择** - 首选标准BADI `ME_GUI_PO_CUST`处理自定义功能码[^2] - 避免直接修改标准程序,确保升级兼容性 2. **打印技术选项** ```mermaid graph LR A[打印技术] --> B[SmartForms] A --> C[Adobe Forms] A --> D[ALV打印] ``` 推荐SmartForms确保格式兼容性 3. **权限集成** - 需在PFCG角色中添加新建的权限对象[^1] - 活动字段值分配: - 23:执行打印 - 01:显示按钮 4. **传输管理** - 所有对象需加入传输请求 - 使用包`ZMM_ENHANCEMENT`隔离自定义开发 > **注意事项**:生产环境部署前需在测试系统验证打印布局和权限配置,避免影响标准采购流程[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值