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
"--------------------@斌将军--------------------
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中,激活后就成功了。
定期更文,欢迎关注

- 中文(简体)
 - 中文(繁体)
 - 丹麦语
 - 乌克兰语
 - 乌尔都语
 - 亚美尼亚语
 - 俄语
 - 保加利亚语
 - 克罗地亚语
 - 冰岛语
 - 加泰罗尼亚语
 - 匈牙利语
 - 卡纳达语
 - 印地语
 - 印尼语
 - 古吉拉特语
 - 哈萨克语
 - 土耳其语
 - 威尔士语
 - 孟加拉语
 - 尼泊尔语
 - 布尔语(南非荷兰语)
 - 希伯来语
 - 希腊语
 - 库尔德语
 - 德语
 - 意大利语
 - 拉脱维亚语
 - 挪威语
 - 捷克语
 - 斯洛伐克语
 - 斯洛文尼亚语
 - 旁遮普语
 - 日语
 - 普什图语
 - 毛利语
 - 法语
 - 波兰语
 - 波斯语
 - 泰卢固语
 - 泰米尔语
 - 泰语
 - 海地克里奥尔语
 - 爱沙尼亚语
 - 瑞典语
 - 立陶宛语
 - 缅甸语
 - 罗马尼亚语
 - 老挝语
 - 芬兰语
 - 英语
 - 荷兰语
 - 萨摩亚语
 - 葡萄牙语
 - 西班牙语
 - 越南语
 - 阿塞拜疆语
 - 阿姆哈拉语
 - 阿尔巴尼亚语
 - 阿拉伯语
 - 韩语
 - 马尔加什语
 - 马拉地语
 - 马拉雅拉姆语
 - 马来语
 - 马耳他语
 - 高棉语
 
一律不翻译英语
一律不翻译i.cnblogs.com
ME21N 采购订单新增页签增强的更多相关文章
- SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值?
		
SAP S4HANA如何取到采购订单ITEM里的'条件'选项卡里的条件类型值? 最近在准备一个采购订单行项目的增强的function spec.其中有一段逻辑是取到采购订单行项目条件里某个指定的条件类 ...
 - 采购订单me22n 或者me21n增强 (点击保存和回车)
		
IF_EX_ME_PROCESS_PO_CUST DATA:l_header TYPE mepoheader, l_item TYPE mepoitem. DATA:lt_items TYPE pur ...
 - SAP采购订单屏幕增强
		
转自<http://blog.csdn.net/heng0757/article/details/8073875> 为采购订单增加一个页标签,在其中放入客户自定义字段, 1. CMOD 增 ...
 - SAP采购订单入库后不允许修改单价增强
		
需求:在根据采购订单做了入库凭证之后,如果用户反审批采购订单去修改单价,系统提示‘已收货,不允许修改单价’. 判断流程:是否有入库凭证 如果采购订单条件按采购信息记录定价,这个价格本来就不能修改,只能 ...
 - SAP 采购订单行项目客制化字段增强
		
需求: 在采购订单行项目中新增客制化字段,区分采购的项目中的物料是量产还是研发物料 开发步骤 主要使用二代增强出口:MM06E005 创建增强项目 事务码T-code:CMOD 创建项目ZEMM001 ...
 - ME_PROCESS_PO_CUST 实现采购订单行项目增强
		
用户希望创建采购订单时,输入行项目时,能根据采购订单类型,自动带出科目分类类别. 业务顾问看了一下配置,不能实现这个功能,所以用增强实现. 采购订单BADI增强:ME_PROCESS_PO_CUST. ...
 - 【MM系列】SAP 采购订单收货后不能修改价格的增强
		
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 采购订单收货后不能修改价格的 ...
 - SAP采购订单审批记录增强
		
采购订单审核函数: BAPI_PO_RELEASE 结尾加上 ENHANCEMENT ZME28_PO. "active version DATA:LS_EKKO TYPE EKKO. DA ...
 - 002 MIRO发票校验采购订单项目科目分配类别检查增强-20150819
		
BADI SE19:ZINVOICE_UPDATE MIRO发票检验过账好模拟时,检查采购订单line 是否有固定资产的行项目,如果有固定资产项目,则弹出提示框,提示消息:存在规定资产采购项目! ...
 - SAP IDOC 通过采购订单输出消息生成销售订单
		
题记: 在网络上看到一篇类似的公众号文章,叫<通过IDoc逐步指导PO&SO集成>,个人觉得整个配置过程中还是少了一些重点配置,也少了说明整个功能的核心逻辑,那么,趁着这个机会,就 ...
 
随机推荐
- .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
			
2023年11月15日,对.net的开发圈是一个重大的日子,.net 8.0正式版发布. 圈内已经预热了有半个月有余,性能不断超越,开发体验越来越完美,早在.net 5.0的时候就各种吹风Aot编译, ...
 - 【NOI2014】 魔法森林---解题报告
			
传送门 题目大意 给定 \(n\) 个点和 \(m\) 条边.每条边包含起点终点和两个精灵的最低限制,求最少需要携带的精灵数量. 题目解析 直接套 LCT 板子 将所有边按照进行升序排序,从小到大将边 ...
 - Modbus转Profinet 网关 TS-180
			
产品简介 实现 PROFINET 网络与串口网络之间的数据通信,三个串口可分别连接具有 RS232 或 RS485 接口的设 备到 PROFINET 网络.即将串口设备转换为 PROFINET 设备. ...
 - 【外包杯】【报错】(表面解决实际未解决)微信小程序报错:[渲染层错误] TypeError: Cannot read property ‘$$‘ of undefined
			
半解不解吧,反正实现了就行 渲染层出错,滑动图片组件无法显示,(swiper是轮播图插件,因此错误应该出现在swiper渲染中) 可以这样移动,但是没有图片 我觉得是路径的问题 兄弟们,目前没有解决接 ...
 - WinForm遍历控件
			
1 foreach (Control c in this.Controls) 2 { 3 if (c is TextBox) 4 ((TextBox)c).Text = "1111" ...
 - [AGC030D]  Inversion Sum
			
Problem Statement You are given an integer sequence of length $N$: $A_1,A_2,...,A_N$. Let us perform ...
 - vue3.3实验性新特性defineModel
			
子父之间使用v-model双向绑定数据,子组件每次都要写emit和props觉得麻烦? vue3.3新的实验性特性defineModel可以完全不写emit和props. 由于是实验性特性,所以需要配 ...
 - JavaScript数组及方法总结
			
数组的创建方法 1.常规方式: var myCars=new Array(); myCars[0]="Saab"; myCars[1]="Volvo"; myC ...
 - Ubuntu 20.04 安装Odoo17
			
1.升级系统 sudo apt-get update 2.更新系统 sudo apt-get upgrade 3.查看系统Python3版本 python3 -V 4.更新Python3.8到3.10 ...
 - python在容器内克隆拉取git私有仓库
			
前言 目前有个python应用需要在容器镜像内拉取git私有仓库的代码,一开始的想法是用GitPython,折腾一番ssh私钥和known_hosts问题后,发现还是在镜像中封装个git最省事,然后用 ...