二维码

[二代] 使用Userexit增强实现将PR头文本复制到PO的头文本中

Twilight发表于 2015-05-22 15:36Twilight 最后回复于 2015-05-22 15:36 [复制链接] 5277 0

场景:我们基于采购申请(Purchase Requestion)创建采购订单(Purchase Order)时,将PO的Header Note Text自动填充到PO Header Text中。

一、查找user exit
1、查找Package
ME21N ->  System -> status -> Program
PO Userexit 1.jpg
SAPLMEGUI ->Goto ->Attributes -> Package
PO Userexit 2.jpg

2、在Package中,识别合适的user exit
PO Userexit 3.jpg
CMOD -> Utilities -> SAP Enhancements
PO Userexit 4.jpg
F8查找Package中所有的增强
PO Userexit 5.jpg
根据描述查找我们需要的增强点,然后双击
PO Userexit 6.jpg
根据描述查找需要的Function module exit,然后双击
PO Userexit 9.jpg
看到function中有一个没有创建的include,这是SAP预留用于增强的,双击回车创建include
第一代增强是预留的perform,这是第二点增强在function中预留了include,优点是不受系统升级的影响,缺点是不能想第一代增强那样使用全局变量了,只能使用Function中的传入参数

二、验证查找user exit是否正确
方法:在找到的include中添加断点,然后me21n创建PO,若能进入断点,说明增强点找对了,但是SAP防止我们过多的增强出现混乱,所以必须对我们的增强进行管理并激活,SAP才能调用我们增强的代码。
1、CMOD创建Project
PO Userexit 7.jpg
2、将找到的Enhancement 分配到Project中
PO Userexit 8.jpg
3、激活Project

三、在include中添加代码
  1. DATA : lt_tekpo  TYPE TABLE OF bekpo,
  2.        ls_tekpo  TYPE bekpo,
  3.        lt_lines  TYPE TABLE OF tline,
  4.        lv_tdname TYPE thead-tdname,
  5.        ls_header TYPE thead.

  6. lt_tekpo[] = tekpo[].

  7. LOOP AT lt_tekpo INTO ls_tekpo.

  8.   lv_tdname = ls_tekpo-banfn."Purchase Requisition Number

  9.   CALL FUNCTION 'READ_TEXT'
  10.     EXPORTING
  11.       client                  = sy-mandt
  12.       id                      = 'B01'
  13.       language                = sy-langu
  14.       name                    = lv_tdname
  15.       object                  = 'EBANH'
  16.     TABLES
  17.       lines                   = lt_lines
  18.     EXCEPTIONS
  19.       id                      = 1
  20.       language                = 2
  21.       name                    = 3
  22.       not_found               = 4
  23.       object                  = 5
  24.       reference_check         = 6
  25.       wrong_access_to_archive = 7
  26.       OTHERS                  = 8.
  27.   IF sy-subrc <> 0.
  28.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  29.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  30.   ENDIF.

  31.   ls_header-tdobject = 'EKKO'.
  32.   ls_header-tdid     = 'F01'.
  33.   ls_header-tdspras  = sy-langu.

  34.   CALL FUNCTION 'SAVE_TEXT'
  35.     EXPORTING
  36.       client   = sy-mandt
  37.       header   = ls_header
  38.       insert   = 'X'
  39.     TABLES
  40.       lines    = lt_lines
  41.     EXCEPTIONS
  42.       id       = 1
  43.       language = 2
  44.       name     = 3
  45.       object   = 4
  46.       OTHERS   = 5.
  47.   IF sy-subrc <> 0.
  48.     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  49.             WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  50.   ENDIF.
  51. ENDLOOP.
复制代码

注:READ_TEXT 从Purchase Requestion中读取header note text
SAVE_TEXT 将PR中的头文本保存到PO的头文本中

ME51N 创建采购申请,输入头文本,然后双击
PO Userexit 10.jpg
GOto -> header
PO Userexit 11.jpg
在这里就能查找到文本的Object、ID、Name等

四、测试效果
ME21N创建采购订单
PO Userexit 12.jpg
我们debug是发现,当我们点击检查按钮时,就会执行我们增强的代码,保存生成采购订单,打开采购订单时就可以看到效果了
PO Userexit 13.jpg
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表