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中,激活后就成功了。

定期更文,欢迎关注

 
 
 
 
 
 
 
此页面的语言为英语
 
翻译为中文(简体)
 
 
 
 
  • 中文(简体)
  • 中文(繁体)
  • 丹麦语
  • 乌克兰语
  • 乌尔都语
  • 亚美尼亚语
  • 俄语
  • 保加利亚语
  • 克罗地亚语
  • 冰岛语
  • 加泰罗尼亚语
  • 匈牙利语
  • 卡纳达语
  • 印地语
  • 印尼语
  • 古吉拉特语
  • 哈萨克语
  • 土耳其语
  • 威尔士语
  • 孟加拉语
  • 尼泊尔语
  • 布尔语(南非荷兰语)
  • 希伯来语
  • 希腊语
  • 库尔德语
  • 德语
  • 意大利语
  • 拉脱维亚语
  • 挪威语
  • 捷克语
  • 斯洛伐克语
  • 斯洛文尼亚语
  • 旁遮普语
  • 日语
  • 普什图语
  • 毛利语
  • 法语
  • 波兰语
  • 波斯语
  • 泰卢固语
  • 泰米尔语
  • 泰语
  • 海地克里奥尔语
  • 爱沙尼亚语
  • 瑞典语
  • 立陶宛语
  • 缅甸语
  • 罗马尼亚语
  • 老挝语
  • 芬兰语
  • 英语
  • 荷兰语
  • 萨摩亚语
  • 葡萄牙语
  • 西班牙语
  • 越南语
  • 阿塞拜疆语
  • 阿姆哈拉语
  • 阿尔巴尼亚语
  • 阿拉伯语
  • 韩语
  • 马尔加什语
  • 马拉地语
  • 马拉雅拉姆语
  • 马来语
  • 马耳他语
  • 高棉语
 
随时将英语翻译为中文(简体)PRO
一律不翻译英语
一律不翻译i.cnblogs.com

ME21N 采购订单新增页签增强的更多相关文章

  1. SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值?

    SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值? 最近在准备一个采购订单行项目的增强的function spec.其中有一段逻辑是取到采购订单行项目条件里某个指定的条件类 ...

  2. 采购订单me22n 或者me21n增强 (点击保存和回车)

    IF_EX_ME_PROCESS_PO_CUST DATA:l_header TYPE mepoheader, l_item TYPE mepoitem. DATA:lt_items TYPE pur ...

  3. SAP采购订单屏幕增强

    转自<http://blog.csdn.net/heng0757/article/details/8073875> 为采购订单增加一个页标签,在其中放入客户自定义字段, 1. CMOD 增 ...

  4. SAP采购订单入库后不允许修改单价增强

    需求:在根据采购订单做了入库凭证之后,如果用户反审批采购订单去修改单价,系统提示‘已收货,不允许修改单价’. 判断流程:是否有入库凭证 如果采购订单条件按采购信息记录定价,这个价格本来就不能修改,只能 ...

  5. SAP 采购订单行项目客制化字段增强

    需求: 在采购订单行项目中新增客制化字段,区分采购的项目中的物料是量产还是研发物料 开发步骤 主要使用二代增强出口:MM06E005 创建增强项目 事务码T-code:CMOD 创建项目ZEMM001 ...

  6. ME_PROCESS_PO_CUST 实现采购订单行项目增强

    用户希望创建采购订单时,输入行项目时,能根据采购订单类型,自动带出科目分类类别. 业务顾问看了一下配置,不能实现这个功能,所以用增强实现. 采购订单BADI增强:ME_PROCESS_PO_CUST. ...

  7. 【MM系列】SAP 采购订单收货后不能修改价格的增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 采购订单收货后不能修改价格的 ...

  8. SAP采购订单审批记录增强

    采购订单审核函数: BAPI_PO_RELEASE 结尾加上 ENHANCEMENT ZME28_PO. "active version DATA:LS_EKKO TYPE EKKO. DA ...

  9. 002 MIRO发票校验采购订单项目科目分配类别检查增强-20150819

    BADI SE19:ZINVOICE_UPDATE   MIRO发票检验过账好模拟时,检查采购订单line 是否有固定资产的行项目,如果有固定资产项目,则弹出提示框,提示消息:存在规定资产采购项目! ...

  10. SAP IDOC 通过采购订单输出消息生成销售订单

    题记: 在网络上看到一篇类似的公众号文章,叫<通过IDoc逐步指导PO&SO集成>,个人觉得整个配置过程中还是少了一些重点配置,也少了说明整个功能的核心逻辑,那么,趁着这个机会,就 ...

随机推荐

  1. 大白话说Python+Flask入门(三)

    写在前面 今天状态很不好,我发现学这部分知识的时候,会出现溜号或者注意力无法集中的情况. 我能想到的是,大概率是这部分知识,应该是超出了我现在的水平了,也就是说我存在知识断层了,整体感觉真的是一知半解 ...

  2. SpringBoot + 通义千问 + 自定义React组件,支持EventStream数据解析!

    一.前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 最近ChatGPT非常受欢迎,尤其是在编 ...

  3. 小心C#中的只读结构体成员

    示例 我们先来看一段结构体的代码 (基于 VS2022 + .NET 8.0) public struct MyStruct(int number) { public int Number = num ...

  4. Python接口自动化项目----Anan

    优点 本效果展示仅是整体样式功能,更详细的使用方法和优点,需要参考使用手册. 整体的优点包括: 1.测试接口的统一管理 2.支持多环境 3.测试报告展示 4.定时任务 5.支持代码驱动 6.便捷的交互 ...

  5. DDD学习与感悟——总是觉得自己在CRUD怎么办?

    一.DDD是什么? DDD全名叫做Domins drives Design:领域驱动设计.再说的通俗一点就是:通过领域建模的方式来实现软件设计. 问题来了:什么是软件设计?为什么要进行软件设计? 软件 ...

  6. [ABC265B] Explore

    Problem Statement Takahashi is exploring a cave in a video game. The cave consists of $N$ rooms arra ...

  7. Mongodb安装篇+可视化工具篇

    下载MongoDB 官网下载地址:Download MongoDB Community Server | MongoDB   Version 选择:稳定版4.4.2 Mongo的版本分为稳定版和开发版 ...

  8. MybatisPlus高级特性之ActiveRecord模式

    1.是什么? ActiveRecord是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表:而模型类的一个实例对应表中的一行记录.ActiveRecord 一直广受解释型动态语言 ( PHP ...

  9. Asp.net core Webapi 如何执行定时任务?

    前言 在计算机系统中,定时执行一些后台任务是很常见的场景,比如定时发送邮件.备份数据等等. 那么,.NET 技术如何通过编程灵活地实现项目里复杂的自定义任务呢? 如果是 Windows 生态,通常来说 ...

  10. 技本功|统计信息对SQL执行效率的影响

    在一个风和日丽的下午,奋哥哥突然接到业务方线上业务数据库CPU资源告警信息,立马放下手里的枸杞登录业务方阿里云控制台查看具体问题. 对于数据库当前正在发生中的问题,我们首先从数据库实时会话信息中尝试抓 ...