参考:
资料:SAP所有模块用户出口(User Exits) _coopa003-CSDN博客
SAP ABAP常用增强记录文档_sap自动过账增强-CSDN博客
https://www.cnblogs.com/zyhcs/p/15759434.html
需求:
增加给OA传输接口的字段。 采购申请增加历史价格显示。
已经有的信息:
SE11字段信息
cmod中已经有了增强Zmm002
增强分配:
组件:
分别双击对应的功能出口:
001
包含文件zxm02u01双击
代码功能:
将PRitem的值写入Ci_ebandb表。
增强exit_saplmereq_003, 包含 ZXM02U03.
ZXM02U03的代码如下。
代码功能, 将CI_EBANDB的数据写入PRitem.
exit_saplmereq_005内容为空。
exit_sapLMEREQ_010, 包含 ZXM02U12。
ZXM02U12的代码如下:
检查对应数据是否发送OA、
分别打上断点,运行ME52N,检查系统运行逻辑。
先进入ZXM02U01断点,从PR中读取数据写入CI_EBANDB中。F8执行后进入主界面。
修改字段信息:
回车后进入另一个断点ZXM02U03
CI_EBANDB信息为屏幕信息,PRitem信息为之前信息。
运行之后,PRitem信息变更。《可以在这里通过select查询显示历史订单信息。》
之后重新调用增强01. 进入PR屏幕。
保存时,先调用增强03。然后调用增强010 include ZXM02U012检查OA传递报表。
重新调用增强01。运行后进入“显示采购申请”主界面。退回F3,重新调用增强03.然后清屏返回主界面。
创建PR时,每次回车,系统同先调用增强03,再调用增强01.
通过zflg跟踪, 推送OA的信息。
在zMMFU004实施断点,检查堆栈,推送给OA的信息,在ZCL_IM_ME_PROCESS_REQ里面实施。在这个类的方法中构造传给OA的数据。
在对应的方法上断点看程序:
推送的信息,可以在这个方法中实施。
需要做的事情:
1, CI_EBANDB增加字段. SE11
2, ME51N 屏幕增加字段。CMOD
3,屏幕字段查询赋值
4, 增加推送OA字段。
实施过程
1, 增加字段。
增加四个字段
组件类型zlowestpr需要创建数据元素
创建curr类型的字段需要特殊设置。
2, ME51N 屏幕增加字段。CMOD
双击屏幕出口,
选择布局,选择表,字段,放入屏幕。
双击对应四个字段的显示位置,修改属性。
属性区域,选择程序, 取消输入字段选项。
保存激活。
测试屏幕:
3,屏幕字段查询赋值
CMOD进入增强用户出口, EXIT_SAPLMEREQ_003的包含文件ZXM02U03中增加下面的代码。
激活运行ME51N输入零件号和数量,回车后屏幕显示如下:
4, 增加推送OA字段。
按照之前debug的信息,找到增强类 ZCL_IM_ME_PROCESS_REQ_CUST。
post方法的代码如下:
METHOD if_ex_me_process_req_cust~post.DATA: lo_s0001 TYPE REF TO zco_si_sap_purchase_odr_out,ls_output TYPE zcreat_purchase_requisition_w1,ls_input TYPE zcreat_purchase_requisition_wo,lt_item TYPE zpurchase_requisition_deta_tab,ls_item TYPE zpurchase_requisition_detail_r.DATA lt_zmmt002 TYPE TABLE OF zmmt002.DATA ls_zmmt002 TYPE zmmt002.DATA:gs_item TYPE mmpur_requisition_item.DATA:gt_item TYPE mmpur_requisition_items.DATA:ls_eban TYPE mereq_item.DATA is_req TYPE /zjt/sappo_req_info.DATA es_ret TYPE /zjt/sappo_ret_info.IF sy-ucomm = 'MESAVE'.SELECT SINGLE COUNT(*) FROM zmmt002 WHERE banfn EQ im_banfn AND zbj = 'X'.IF sy-subrc EQ 0.MESSAGE '订单已推送OA' TYPE 'E'.ENDIF.ENDIF.CALL METHOD im_header->get_itemsRECEIVINGre_items = gt_item.IF sy-ucomm = 'MESAVE' AND ( sy-tcode = 'ME51N' OR sy-tcode = 'ME52N' ).LOOP AT gt_item INTO gs_item.CLEAR ls_eban.CALL METHOD gs_item-item->get_dataRECEIVINGre_data = ls_eban.ls_item-bnfpo = ls_eban-bnfpo. "采购申请行项目号ls_item-ekgrp = ls_eban-ekgrp. " 采购组ls_item-frgkz = ls_eban-frgkz. "批准标识ls_item-knttp = ls_eban-knttp. "科目分配类别ls_item-kostl = ls_eban-kostl. "成本中心ls_item-lfdat = ls_eban-lfdat. "交货日期ls_item-loekz = ls_eban-loekz. "删除标识ls_item-matkl = ls_eban-matkl. "物料组ls_item-matnr = ls_eban-matnr. "物料编码ls_item-meins = ls_eban-meins. "单位ls_item-menge = ls_eban-menge. "申请数量ls_item-peinh = ls_eban-peinh. "价格单位ls_item-preis = ls_eban-preis. "采购申请中的价格ls_item-pstyp = ls_eban-pstyp. "项目类别ls_item-txz01 = ls_eban-txz01. "物料描述ls_item-werks = ls_eban-werks. "工厂ls_item-afnam = ls_eban-afnam. "申请人ls_item-zbrand = ls_eban-zbrand. "品牌ls_item-zbudget = ls_eban-zbudget. "是否已签合同ls_item-zcontract = ls_eban-zcontract. "所属预算ls_item-zreason = ls_eban-zreason. "申请理由ls_item-zshychx = ls_eban-zshychx. "使用产线ls_item-zshyshb = ls_eban-zshyshb. "具体使用设备CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'EXPORTINGinput = ls_item-matnrIMPORTINGoutput = ls_item-matnr.CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'EXPORTINGinput = ls_item-bnfpoIMPORTINGoutput = ls_item-bnfpo.APPEND ls_item TO lT_item.ls_output-in0-banfn = im_banfn. "采购申请编号CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'EXPORTINGinput = ls_output-in0-banfnIMPORTINGoutput = ls_output-in0-banfn.ls_zmmt002-banfn = im_banfn. "采购申请编号ls_output-in0-bname = ls_eban-ernam. "创建人CLEAR ls_item.ENDLOOP.* DATA(lt_item_two) = lt_item.
* SORT lt_item_two BY bnfpo loekz.
* DELETE ADJACENT DUPLICATES FROM lt_item_two COMPARING bnfpo loekz.
* SORT lt_item BY bnfpo.
*
* LOOP AT lt_item_two INTO DATA(ls_item_two).
*
*
* ENDLOOP.ls_output-in0-item-purchase_requisition_detail_re = lt_item.DELETE lt_item WHERE loekz = 'X'.IF lt_item IS NOT INITIAL.CALL FUNCTION 'ZMMFU004'EXPORTINGoutput = ls_output
* is_req = is_reqIMPORTINGinput = ls_input.
* es_ret = es_ret.ENDIF.* CALL FUNCTION 'ZMMFU004'
* EXPORTING
* output = ls_output
** is_req = is_req
* IMPORTING
* input = ls_input.
** es_ret = es_ret.* TRY .
* CREATE OBJECT lo_s0001.
* lo_s0001->si_sap_purchase_odr_out(
* EXPORTING
* output = ls_output
* IMPORTING
* input = ls_input
* ).
*
* COMMIT WORK .IF ls_input-out-flag = '0'.ls_zmmt002-zbj = 'X'.
* ELSE.
* MESSAGE ls_input-out-message TYPE 'S' DISPLAY LIKE 'E'.ENDIF.* CATCH cx_root INTO DATA(cx_root).
* DATA(lv_msg) = cx_root->get_text( ).
* MESSAGE ls_input-out-message TYPE 'S' DISPLAY LIKE 'E'.
* ENDTRY.ls_zmmt002-zname = sy-uname.ls_zmmt002-zdate = sy-datum.ls_zmmt002-ztime = sy-uzeit.ls_zmmt002-zmes = ls_input-out-message.APPEND ls_zmmt002 TO lt_zmmt002.IF lt_zmmt002 IS NOT INITIAL.MODIFY zmmt002 FROM TABLE lt_zmmt002.IF sy-subrc = 0.COMMIT WORK.ELSE.ROLLBACK WORK.ENDIF.ENDIF.ENDIF.ENDMETHOD.
对应的字段信息可以在如图位置插入。
但是,ls_item类型定义中并没有对应的字段设置。
zpurchase_requisition_detail_r,系统内的属性为 Proxy structure (generated),不可增加字段。
点击代理编辑器:
结论,数据结构是通过接口定义的。另外zpurchase_requisition_detail_r内部所有字段类型都是String。下一步需要在接口定义的地方增加新字段。