zoukankan      html  css  js  c++  java
  • SAP 中如何寻找增强

    http://blog.csdn.net/edifierliu/article/details/5978824

    查找SAP标准事务代码中使用的BADI

    在SE24中,查看类对象CL_EXITHANDLER,在其方法(Methods)GET_INSTANCE 的第14行打断点,之后运行事务代码;

    当有BADI将会被执行的时候,这时候会进入类CL_EXITHANDLER的GET_INSTANCE方法,按F6执行这个方法之后,参数EXIT_NAME中的值便是BADI定义(SE18中看到的东西),参数CLASS_NAME则是类对象名称(SE24里面看到的东西),所有的方法实现都是存在于类对象中;

     

     

    通过查找类方法中的参数(Parameter)和对对象的属性(Attribute),如果能满足自己需要实现的功能,则可以通过实现这个BADI来做增强。

     

    实现BADI的方法(ECC6.0版本下):

    进入SE19,选择Create Implementation中的Classic BADi,输入刚才查找到的EXIT_NAME;

     

    点击Create Impl,输入实现名;

     

    点绿勾;

     

    点击保存,激活(如果是ECC6.0版本,则还需要指定对应的Enhancement Spot,才可以完全创建成功。但是这里有个疑问:我第一次创建BADI实现需要指定Enhancement Spot,这次创建保存激活时直接创建成功,并没有提示我需要指定Enhancement Spot,不知道为什么!);

     

    双击进入方法CHANGE_SEGMENT_PSEGMENT,即可在里面实现功能;

     

    下面再运行F-02,执行程序,即可进入此段代码。

     

     

    查找SAP标准事务代码中使用的USER_EXIT

    在SE37中,查看函数MODX_FUNCTION_ACTIVE_CHECK ,在最后一行打断点;

     

       当有USER_EXIT将会被执行的时候,这时候函数MODX_FUNCTION_ACTIVE_CHECK中的参数L_FUNCNAME 会显示出口的名称。

     

     

    如果要使用这个出口,必须先激活(已经激活的则不需要);

    先去表MODSAP中查找这个程序名的出口名;

     

     

    进入CMOD,创建出口对象(以下图例使用的是一个已经存在的增强对象);

     

     

    选择Enhacement assignments;

     

    在这里输入增强对象名,也就是刚才在MODSAP表里面查到的F180A001,点击组件;

     

    选择修改,激活这些增强,双击进入EXIT_SAPLF048_001 程序;

     

    创建INCLUDE ZXF48U01;

     

    运行F-02,便会进入此出口程序。

    ***方法一****************************************

    通过SE30,运行TCODE后,点Evaluate后,查看运行时间分析评估:命中清单。

    找以“exit”开头的SAP程序,如:EXIT_SAPLIE01_007,

    这个FUNCTION就是TCODE提供的一个出口。

    至于如何查看这个增强是属于哪个SMOD,能够查阅 MODSAP这个表(SAP Enhancements).

    ***方法二****************************************

    通过SE37中的:MODX_FUNCTION_ACTIVE_CHECK 函数来找,

    在函数的最后一行打个断点,再运行TCODE的,如果有增强则会跳入DEBUG界面,在DEBUG界面中,查看L_FUNCNAME字段对应的值,此值就是就是要找的出口,

    再去SE11中通过MODSAP来查看出口对就的是那个SMOD,

    接下来就可以在CMOD中创建增强组了,把找到的增强填入,

    最后根据实际的业务进行处理。

    以上的两种方法是用来找第二代增强。

    ***方法三****************************************

    找BADI的方法。

    先运行SE24,查看类对象CL_EXITHANDLER, 在其方法:GET_INSTANCE的14行( CALL METHOD CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE)打上一个断点。

    接下来运行事务代码,当有BADI是将会被执行,这时在DEBUG模式下,会进入类CL_EXITHANDLER 的GET_INSTANCE 方法,按F6执行这个方法之后,点参数EXIT_NAME查看其对应的值,所有的方法实现都在此类对象中,此时就是我们所要找的BADI。

    实现BADI的方法

    进入SE19,选择Create Implementation中的Classic BADi

    另一种方法(跟上面的差不多)

    查找源程序,在程序中查找代码段 CL_EXITHANDLER => GET_INSTANCE

    就可以找到该程序所用到的BADI。

    ***方法四****************************************

    通过开发类找出口

    以ME21N事务代码为例,进入TCODE后,选择点系统 -》状态 -》程序名称,双击后进入到程序中,再点菜单栏中的 转到 -》属性,找到开发类的名称,比如ME21N的开发类是‘ME’。

    如果是打出口,则到SMOD事务代码中,点 加强边的按纽,在开发类中输入‘ME’,回车后就会显示出所有的出口。

    找BADI也是同样的过程,只是到SE18中去确定BADI

    不过此方法找出来的出口,不是针对某个程序的出口,而是把开发类所对应的出口全找出口,所以

    还要通过自己的判断找到所需求的出口

    *******************************************

    增强相关函数和表格

    Function:

    [1].DYNP_VALUES_READ

    [2]. MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)

    [3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)

    [4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)

    [5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)

  • 相关阅读:
    变量使用的注意事项
    计算机存储单元
    常量
    mybatis报错There is no getter for property named '***' in 'class ***'
    sonar-scanner扫描各种出错解决
    SonarQube搭建的各种问题
    linux每日命令(18):whereis命令
    Django视图层之路由配置系统(urls)
    Django---MTV模型、基本命令、简单配置
    web框架
  • 原文地址:https://www.cnblogs.com/goodsmith/p/3584712.html
Copyright © 2011-2022 走看看