资料: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字段。
增加四个字段
组件类型zlowestpr需要创建数据元素
创建curr类型的字段需要特殊设置。
双击屏幕出口,
选择布局,选择表,字段,放入屏幕。
双击对应四个字段的显示位置,修改属性。
属性区域,选择程序, 取消输入字段选项。
保存激活。
测试屏幕:
CMOD进入增强用户出口, EXIT_SAPLMEREQ_003的包含文件ZXM02U03中增加下面的代码。
激活运行ME51N输入零件号和数量,回车后屏幕显示如下:
按照之前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_items
RECEIVING
re_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_data
RECEIVING
re_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'
EXPORTING
input = ls_item-matnr
IMPORTING
output = ls_item-matnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = ls_item-bnfpo
IMPORTING
output = ls_item-bnfpo.
APPEND ls_item TO lT_item.
ls_output-in0-banfn = im_banfn. "采购申请编号
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = ls_output-in0-banfn
IMPORTING
output = 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'
EXPORTING
output = ls_output
* is_req = is_req
IMPORTING
input = 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。下一步需要在接口定义的地方增加新字段。