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

    SAP 中如何寻找增强

        方法一、利用TCODE寻找增强(第二代的增强)

        执行一个程序(源代码后附),在选择屏幕处输入你所需要增强的程序TCODE,执行後,就会出现一个列表,那里就有关于如何增强这个的绝大部分SMOD增强。

        点击进去,自己手动寻找需要的增强。

        这是第二代增强

        方法二、利用系统函数寻找
        
        MODX_FUNCTION_ACTIVE_CHECK

        在这个FUNCTION的代码最后添加一个断点。执行需要增强的TCODE,如果有增强,就会自动跳入DEBUG界面。在DEBUG界面,查看f_tab字段,这里面所显示的Smod就是关于这个TCODE所有的增强项目的列表。这些增强都是属于EXIT_XXXXXX_XXX这种形式。

        至于如何查看这个增强是属于哪个SMOD,可以自己查阅 MODSAP这个表(SAP Enhancements).

        这是第二代增强。

        还有一些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(屏幕增强)

        这些的使用方法和上述的一样,可以针对各种情况寻找增强。

        方法三、从程序代码中找

        在需要增强的事务里面,打开SYSTEM——》status,双击进入PROGRAM,查看所有的subroutines, 重点观察所有形似 userexit_******* 这种,由描述来确定合适的需要增强的FORM。这里是第一代的增强。

        方法四、针对BADI的增强

        转摘自网上

        1、badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中。

        2、sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。

        3、基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。

        4、se18 查找接口,se19 实现接口就可以实现用户增强。

    ************************************************************************************************************************************
    首先来讲解一下什么是出口,顾名思义,就是一段程序执行到最后必经的一段程序。

    为什么会有出口呢?因为正常的业务系统不能满足实际需求,这时可以在出口中增加一些功能,来达到要求,这也就是为什么它还叫增强。我感觉它跟给操作系统打补丁差不多。

    在Sap中出口就是标准程序最后要调用的一个函数或者功能模块,这个函数或功能模块的输入已经由Sap定义好。

           自己写的SAP出口程序在系统升级的时候会被保留,而如果更改标准程序在SAP系统升级的时候会被覆盖。

           下面介绍一下什么时候需要使用出口以及出口的种类:

           1:在业务检查时,比如在某个工厂发货,可以设定在某个库位的出货只能使用某种移动类型。

           2:在需要界面增强时,比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有些模块甚至能自定义数据库字段,并且可以在出口中增加字段输入。还有的模块能对输入数据检查,甚至实现自动替代等功能。

           3:有不规则业务时,比如按某种条件定价,可以设定从自己定义的表中按某种条件取值

           4:搜索帮助的出口,可以对Sap标准的搜索帮助做权限控制。

    等等。

    SAP有四种基本用户出口的类型:

    1.菜单出口-Menu Exits

           定义自己的菜单

    2.屏幕出口-Screen Exits

      定义自己的屏幕

    3.功能模块出口-Function Module Exits

      在SAP应用程序中添加功能

    4.关键字出口-Keyword Exits

    在ABAP/4字典中的关键字数据元素添加文档。结果是你在使用这些数据元素的字段处按F1后会出现你自定义的说明文档

           因为出口都是被Sap预先定义好的,那么怎么寻找自己需要的出口呢?

    1:可以通过配置文档的帮助和SAP library 寻找业务系统的出口,sap library 在‘implementation guide’中寻找出口,在配置功能执行按钮左边一般都有一个说明文档,描述相关的出口。

    2:为了方便我们把所有的出口名称及其描述列在文章的后面。

    下面具体介绍怎样写出口程序:

    为了对出口程序的修改进行管理,sap提供了专门用来管理出口程序的事务,事务代码是CMOD。

    ************************************************************************************************************************************
    sap的用户出口总共有三代:
    1、第一代
    sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。
    示例:USEREXIT.. in SAPMV45A

    2、第二代
    sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。

    3、第三代
    sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),可以通过EXIT_HANDLER这个单词查找BADI。

    对于第一代增强,可以用以下方法查找增强:
    打开欲增强的程序,点击工具栏上的“Display Object List”按钮,选择Subroutines,查找以“UserExit”开头的子程序,根据子程序前面的注释文档来查找用户出口

    对于第二代增强,可以用以下方法查找增强

    用户增强通常包括下面3类,顾名思义,就是增强SAP的可能没有提供的功能(通过后台配置也不能实现).
    1.E Enhancement exits :就是常说User_exit (用户出口)
    使用SE37搜索EXIT*的函数大都是做exit用的,通常里面预包含了一个Z开头
    的程序. SE16查询TFDIR(函数表)输入EXIT*也可.
    2.C GUI codes( GUI接口增强)
    3. S Subscreens (屏幕增强)
    Enhancement在表MODSAP可看到,而TFDIR字段 MAND(值为C表示此出口函数被激活).使用SMOD(CMOD)当然可激活exit function,有时候一时难以查询到相关Enhancement时可使用下面程序将出口函数激活.

    REPORT Zactexitfun .
    data ztfdir like tfdir .
    * select single * from tfdir into ztfdir
    * where FUNCNAME =
    * 'EXIT_SAPMM06E_013'.
    * ztfdir-MAND = 'C' .
    * update tfdir from ztfdir.
    * 将EXIT_SAPMM06E_013换成实际所需exit函数名
    update tfdir set MAND = 'C'.
    where FUNcname = 'EXIT_SAPMM06E_013'.

    ***当然也可SE16:MODSAP表enhancement输入EXIT_SAPMM06E_013然后得到enhancement name MM06E005后使用SMOD测试激活exit函数.
    增强相关函数和表格
    Function:
    [1].DYNP_VALUES_READ
    [2]. MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
    [3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
    由于读者可能接触user exit最多,除了附录光盘有个查找ZFINDEXIT的程序外(有些exit使用它并不能找到),另一个直接有效的方法就是使用这个函数,SE37设好断点后执行tcode如其有exit就会调用此函数.
    [4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
    [5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
    Table:
    [1]. TFDIR->function module table
    [2]. MODSAP->sap enhancement table
    [3]. TSDIR->Dynpro Areas CALL CUSTOMER SUBSCREEN(屏幕增强)
    [4]. CUATEXTS-> GUI Interface: Menu Texts Changed(GUI 菜单文本增强)

    ***注意,为了确保一个出口被真正应用,必须同时激活相关程序(SE38)和出口函数(SMOD|CMOD,反正就是要保证tfdir-mandt=’C’,用程序也可.


    *************************************************************************************************************
    1.1 SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强. 
    1.2 User exits (Function module exits)是sap提供出口,它的命名规则如下:
    EXIT_<program name><3 digit suffix> 
    示例:
    sd的VA01事务,对应的程序是SAPMV45A ,你会在程序里查到(用CALL CUSTOMER-FUNCTION字符串)如下代码:
    CALL CUSTOMER-FUNCTION '003'
      exporting
        xvbak   = vbak
        xvbuk   = vbuk
        xkomk   = tkomk
      importing
        lvf_subrc = lvf_subrc
      tables
        xvbfa = xvbfa
        xvbap = xvbap
        xvbup = xvbup.
    则exit calls function module的名称就是: EXIT_SAPMV45A_003


    2、先试用SMOD建立一个SAP增强
    2.1、选择一个增强,如:SDVFX001 ,点击修改,进入sap增强维护屏幕;
    2.2、点击“组件”按钮,进入组件维护屏;
    2.3、将光标移到“功能模块名”,输入模块名,如:EXIT_SAPLV60B_001;
    2.4、选择“代码修改”按钮进入函数模块;
    2.5、双击函数模块的包含单元,进入包含单元加入自定义代码并激活保存;

    3、使用CMOD建立增强项目
    3.1、输入自定义的项目名,点击“创建”;
    3.2、进入增强项目,选择“配置增强”,进入增强配置屏幕;
    3.3、输入增强名如:SDVFX001
    3.4、保存,并退出;

    4、使用CMOD将增强项目激活,便大工告成。

    如何查找
    *判断是否存在相应增强的定义(SMOD)
        select single name
          from  modsapa
           into mod0-name
          where name   = 'PPCO0002'.
        if sy-subrc = 0.
        endif.
        select single *
         from tadir
        into ps_tadir_db
        where pgmid      =   'R3TR'
        and   object     =  'SMOD'
        and   obj_name   =  'PPCO0002'.

    *判断是否存在相应增强项目的定义(CMOD)
              SELECT SINGLE name FROM MODATTR into mod0-name
                     WHERE NAME   = 'PPCO0002'..

    *提取增强的定义的组件 (可以用此反查增强定义)
      select * from modsap
             where name = 'PPCO0002'.

    *判断该增强是否移植到BADI实现
    *Enhancement & has already been migrated in Business Add-In definition
      select single migrated badi_def       into (migrated, exit_name)
            from modsapa where name = modname.
      if sy-subrc = 0 and migrated = seex_true.
        message s621 with modname exit_name.
        check mode ne 'CHAM'.
      endif.

    MODTYP 类型:
    E : 功能退出
    S : 屏幕
    T : 表
    C : GUI代码
    sap增强存在MODSAP表内

    *获取增强组件的参见函数MOD_SAP_MEMBER_TEXT
    *获得退出功能模块的信息
          select single * from tftit
                 where "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001'
          if sy-subrc = 0.
          endif.

    *值得学习的函数
    MOD_KUN_ACTIVATE(会操作相关报)

  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/mingdashu/p/5490184.html
Copyright © 2011-2022 走看看