事务码 ME57 可以查看系统中所有的采购申请现有用户提需求需要在显示的行项目中增加 ‘未清数量’ 和 ‘物料采购订单文本’ 这两个字段。看网上关于ME57的增强多是子屏幕增强对于行项目列表新增字段的增强实施比较少故记录一下。要实现的效果如下增强实施的思路全过程↪想省流看精简版首先梳理一下数据来源行项目用到的屏幕是SAPLMEGUI的 3214 屏幕。双击查看屏幕的逻辑流打断点查看数据DYN_3214ITEMS[]表记录行项目中所有要显示的数据DYN_3214ITEMS是其工作区DYN_3214ITEMS是参照类创建的对象其数据从 MY_DATA 中获取查看能不能在PBO处实施隐式增强。PBO处没有实施增强的选项在方法event_pbo_tc中无增强点因此无法在此处更改值SE51查看该屏幕在何处调用屏幕的调用是在LMEGUICK1的第96行此处对应的方法是constructor。在该函数的开头可以加入增强代码。但一直执行到方法的末尾DYN_3214ITEMS[]的值仍为空因此不能在此处实施增强调用方法transport_from_model此处调用的两个方法为本地类lcl_req_item_apr_tc的方法 其类定义在该函数组对应的LMEGUICJY文件中在此处获取到了行项目信息然后到方法 中赋值赋值就在15行DYN_3214ITEMS[]和TC_TABLE指向同一个地址这是一层一层进入到类中即便是可以实施增强也不应实施在此处。调转方向看下怎么行项目上添加字段。现在其结构中添加增强字段查看在何处设置展示的字段列。在LMEGUICK1的 96行TC_3214-COL中记录了列名称。但是发现一个很奇怪的现象就是在方法内的赋值让人感到莫名其妙第17行是赋值实际上就是将tc_structure指向ch_tc_structure的源数据奇怪的地方在于这个变量实际上是参数在类中并不是一个存储数据的变量不知道数据时从哪里来的。ME57查看行项目结构CH_TC_STRUCTURE然后更改此处记录的结构也并未影响到ME57的行项目此处更改会一直影响到上方说到的数据赋值的PBO中。ME57更改行项目结构CH_TC_STRUCTURE总感觉方向不对核心数据的获取都在在类里面即便是能实施增强也不应该在类中针对ME57进行更改。重新调整思路查看ME57对应的程序RM06BZ00这是一个可执行程序在程序的Start-Of-Selection处打断点看程序的取值逻辑。果然发现了获取数据的方法但也有个很奇怪的现象在Debug至 168行之后209行之前中间是被注释代码会进入SAPDBBAM的put_eban方法在此处获取到采购申请的数据此处数据的表结构是EBAN如果在此处实施增强就要同时更改EBAN的结构往下看看有没有其他地方可以添加在往下之前先了解一下 PUT 和 GET执行完 PUT 和 GET 之后执行END-OF-SELECTION事件流中的语句在SAPFM06B的submit中 执行MEGUI_ASSIGN_AND_PROCESS_REQS函数后显示执行后的界面MEGUI_ASSIGN_AND_PROCESS_REQS调用MEGUI_MAINTAIN MEGUI_MAINTAIN函数第239 行CALL METHOD l_application-init_first_plugin init_first_plugin方法中l_plugin my_plugin_manager-get_plugin( im_process l_process ).这看着越往后越不行啊还是再考虑一下在EBAN中加增强结构的事情吧。EBAN新增附加结构MEREQ3214 行项目结构新增字段新增采购申请行项目字段一直以来都想着怎么在结构中添加新的字段怎么加都不会影响最后的显示突然想起这是屏幕啊直接在3214屏幕上添加不就可以了拉到最后一列新增字段字段在ME57的采购行项目中就显示出来了我们在获取采购申请信息的地方更改一下请购原因的值看能直接带到 3214 屏幕不能没带过来原因是在BPO中存储数据的DYN_3214ITEMS-model-my_data结构中没有这两个字段这里记录了最后会显示的数据的值看下这个结构怎么处理MY_DATA参照的结构是MEREQ_ITEM需要在这个行项目结构上添加增强字段应该就可以了。应该Include一个增强结构才对不应该使用Append调整一下。标准的结构不允许编辑而使用include有需要先进入编辑状态才可以还是使用append吧新增增强结构手动赋值执行结果完全行的通接下来就是要在获取到采购申请的地方进行隐式增强就写在PUT EBAN.循环之后。SAPDBBAM - PUT_EBAN点击这个像海螺化石一样的图标即可进入增强模式创建增强实施点击声明创建分配请求点击更改按钮写入增强代码ME21N采购申请转采购订单等多处会从这里获取数据因此需要限定事务码为ME57DATA:lv_txt TYPE string.IF sy-tcodeME57AND it_eban IS NOT INITIAL.LOOP AT it_eban ASSIGNING FIELD-SYMBOL(fs_eban). 采购未清fs_eban-zomengfs_eban-menge-fs_eban-bsmng.IFfs_eban-zomeng0.fs_eban-zomeng0.ENDIF. 采购申请 CLEAR:lv_txt.CALL FUNCTIONZFM_GET_EBAN_LTXTEXPORTING i_banfnfs_eban-banfn i_bnfpofs_eban-bnfpo IMPORTING e_ltxtlv_txt.fs_eban-zqgyy_tlv_txt.ENDLOOP.ENDIF.测试在增强处成功写入数据ME57 执行结果为空为什么呢我知道了因为PUT在PUT处会触发RM06BZ00的GET eban,在SAP中实际上是在此处将采购申请的数据传到 ME57 的程序中的也就是说增强实施错了地方。在SAPDBBAM中应该是方法daten_lesen之后Loop 之前。在RM06BZ00中就是GET eban之后INITIALIZATION之前。在事件流中无法实施隐式增强可以找其中一个一定会执行的方法来执行增强操作比如最后一个调用的方法ban_aufbauen还是刚才的步骤重新创建增强执行结果还是没有回想刚才Demo时是怎么操作的在SAPDBBAM的Loop之前手动更改的。难到说在 PUT-GET 时数据就已经定型了还真得在SAPDBBAM的daten_lesen方法里实施增强了。排查在本地类transport_from_model中是获取到了数据的3214的PBO中也有数据还没发现问题不过验证了另一个猜想那就是对值的改变要在PUT之前获取到采购申请数据之后在Debug时跳过了获取EBAN数据时的赋值使其在 Get EBAN.之后给字段赋值在PBO处是没值的。似乎找到了在 3214 屏幕的PBO中有个循环这个循环中会重新分配数据在这里新增的两个字段值是空的我尝试给第一行的字段赋值执行结束后在画面中显示了该字段的值在类CL_TABLE_VIEW_MM 的 PBO_TC_LINE方法中又回到了类不太好搞喔。先研究一下这个方法的赋值在transport_to_dynp中给DYN_DATA赋值在transport_to_dynp的conversions_output方法中转换数据并在299行将转换后的数据赋值给屏幕结构转换时为空所以在2314屏幕上不显示数据。L_ITEM_DATA_ENTRY对象包含MODEL和DATA两个属性其中屏幕赋值是将DATA中的数据传递过去Data中这两个字段值是空的但MODEL中却是另一番场景是不是很神奇进入这个方法看下L_ITEM_DATA_ENTRY-DATA是怎么赋值的。路径LMEGUICJY- 本地类lcl_req_item_apr_tc的transport_to_dynp方法中 CALLMETHOD conversions_output语句 LMEGUICJY的282行 在1325行按照字段匹配赋值后续都是单独更新Data中的指定的字段值因此要看下l_mereq_item的赋值是怎么做的l_mereq_item im_item-get_data( ).进入 GET_ITEM 方法进来之后判断my_real_object是否为空如果为空使其等于My_data的话是没问题的但是偏偏my_real_object不等于空这个是在哪里赋值的呢在进入这个方法之前就是 1308 行定义的l_proxy进入到Get_Data方法中的my_real_object-get_data( )中 这个方法所处的位置是IF_PURCHASE_REQUISITION_ITEM~GET_DATA (LCL_REQ_ITEM)双击get_data方法并没有跳转查看其类的IF_PURCHASE_REQUISITION_ITEM~GET_DATA方法和im_item-get_data方法内容是一致的也就是说进入的新方法是重定义的本地方法找到了在LMEREQF10隶属于另一个功能组虽然这里是根源但最好不在这里更改因为已经到了另一个通用的功能组中。能改的地方有两处1、在conversions_output方法的im_item-get_data( )中更改2、在conversions_output方法的最后实施增强手动更新ex_data这两个字段的值但是在我双击get_data方法时弹出一个窗口让我选择是要进入类原本的方法还是进入类重定义的方法这两个都位于MEREQ中那么就不能在①处更改了。在conversions_output末尾实施增强编辑- 创建实施增强创建好准备写代码发现天塌了……IM_ITEM中的MY_DATA属性是受保护的只能通过GET_DATA方法来获取到(绑定后一列为‘可用性’绿色为公开属性黄色为保护红色为私有 )增强又实施错地方了…. , 就应该实施在①处。啊啊啊啊啊举步维艰…….重新实施增强执行ME57查看结果有了OHHHHHHHHHHHHHHHHHHHHHHHHHH至此结束ME57采购申请行项目增强-精简版上面的过程比较繁琐记录的是整个过程这里提供一个速通省流版。实施步骤1、先将新增的结构写入以下表或结构中表 EBAN原因ME57获取到采购申请的数据后会写入EBAN类型的表中后续用到的数据都是从这里传过去的因此要在该表总添加增强结构结构 MEREQ3214原因ME57显示行项目的屏幕是 3214因此想要在屏幕中显示就要在这个结构中添加相关的增强结构结构 MEREQ_ITEM原因在PBO的数据处理中会将数据传递给该结构的变量随后传递给3214屏幕变量如果此结构不添加增强结构会导致在PBO数据传递时造成数据丢失2、实施一处屏幕增强行项目的显示屏幕是功能组的3214屏幕需要在该屏幕中添加要新加字段的显示列这样在ME57的行项目中就能显示相关列了3、实施两处隐式增强在 SAPDBBAM 获取到采购申请数据后ME57 对应的程序是RM06BZ00在该程序的START-OF-SELECTION.事件中获取数据数据来源是程序SAPDBBAM。是不是很奇怪为什么是两个程序其实是这样子的SAPDBBAM是数据库程序在该程序中使用put eban方法获取相应的采购申请数据取得是表EBAN中所有符合条件的数据。获取到数据后使用 PUT 语句将获取到采购申请一行一行地传递到RM06BZ00的START-OF-SELECTION.事件做处理如何传递的呢是通过 PUT 触发RM06BZ00中的 GET 。对采购申请数据的修改要在 PUT 之前因此在方法daten_lesen的最后实施增强。进入方法daten_lesen点击小海螺后光标放在方法的最后一行点击编辑-创建实施实施增强代码在类CL_REQ_ITEM_PROXY_MM 获取数据后ME57 执行时会多次执行3214的PBO部分其PBO有两部分组成一个是方法EVENT_PBO,一个是dyn_3214items[]对象表的循环dyn_3214items[]表会记录行项目要展示的数据该变量的赋值在程序第三次调用PBO方法EVENT_PBO后具体来说是在EVENT_PBO方法第三次执行CALL METHOD call_view-handle_event( PBO )语句中会完成赋值。同样的语句为什么多次调用但只有第三次会给dyn_3214items[]赋值呢虽然是同一条语句传入的参数也都是‘PBO’但是由于每次执行时CALL_VIEW参照的类不同因此其执行的方法也会不同相当于每次进来执行的是不同类的handle_event方法。以下是前三次进入时CALL_VIEW参照的不同的类需要关注的第三次参照的类该类以LCL开头说明是个本地类。LCL_REQ_ITEM_APR_TC处于功能组MEGUI的include文件LMEGUICJY中。一步步执行最终会落到这个类名为PBO的方法中数据的转换发生在transport_from_model方法中从方法名就可看出从Model中传输放置数据的对象包含一个MODEL的属性数据存储在MODEL对象中在这个方法中调用conversions_output方法conversions_output中通过调用get_data方法来获取实际的明细数据在该方法的最后会将l_mereq_item赋值给ex_data。ex_data就是上一个方法的l_item_data_entry,而l_item_data_entry会添加到表item_data_pbo中从表名就可以知道这是3214的item数据debug发现在1321行获取行项目数据后新增加的字段并没有被赋值所以现在的关键问题是如何给l_mereq_item的新增字段赋值。双击get_data方法可以看到这里有个判断my_data变量中是包含新增字段的值的但是另一个对象my_real_object中是没有的如果my_real_object为空那就完美了可惜大多数时候这个对象都是不为空的。这个变量就是conversions_output中的l_proxy。PS在上面详细的步骤中会发现一开始在没有实施增强代码时手动给其中前四行数据赋值发现第四行的文本带了出来由此判定这种方法是行得通的当时能带出来等我新创建一个采购申请后却发现文本根本没带出来究其原因应该就是最后一个文本行执行到此处时my_real_object为空直接将my_data赋值给了my_real_object。现在想想真是有点运气在身上如果没有这最后一行看到的结果是文本没有带出来肯定更没信心了。现在有两种方案一个是在此处实施增强将my_Data中的数写入re_Data中另一种是在conversions_output的最后直接更改ex_Data-data的值使其等于im_item对象中my_data变量的值。我一开始选择了方案2在实施的过程中发现属性my_Data是受保护的变量不能在类外访问遂放弃使用方案1。查看执行结果调整行项目字段显示顺序需求将新添加的 采购未清数量 调整到交货日期之前。双击交货日期查看其所在的列数同样双击 采购未清 查看列数。将34更改为16关闭字段属性按钮。点击一下其他字段或者回车。字段顺序就会发生变更ME57效果