首页 > 代码库 > SAP ABAP之第一,二,三代出口类型BADI实现 概念解释

SAP ABAP之第一,二,三代出口类型BADI实现 概念解释

BADI是用户的第三代出口类型,我们来看看其具体的是如何实现的。一,用户出口的类型1,第一代sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。示例:USEREXIT.. in SAPMV45A 2,第二代sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。3,第三代sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),你可以通过EXIT_HANDLER这个单词查找BADI。 另外还有一种出口叫BTE,在前一个项目里我们做的OPENFI就是用的这个BTE相关TCODE: FIBFBusiness Transaction Events (Open FI) 二,用户出口比较 第一代用户出口是form出口  如FORM USEREXIT_FIELD_MODIFICATION. * CASE SCREEN-GROUP3.*   WHEN ‘900‘.*     IF VBAK-VBTYP NE ‘A‘.*       SCREEN-ACTIVE = 0.*     ENDIF.* ENDCASE. * CASE SCREEN-NAME.*   WHEN ‘VBAK-VBELN‘.*     SCREEN-ACTIVE = 0.* ENDCASE. ENDFORM. 找法省略。 SD的用户出口和定价的用户出口等多采用这种方式。第二代用户出口多是 call customer-function ‘001’ 这种方式实现的。 后面我们会详细介绍此方法,此方法是现在SAP系统开发用的最多的一种第三代用户出口 BADI badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中(参见SECE包),sap程序都会调用cl_exithandler=>get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP 和 V_EXT_ACT)进行查询和搜索。基于这个机理,我查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。 在SAP系统中 BADI 相关类的 类图 如下:三,BADI的解释BADI实现主要通过SE18和SE19实现的,看看如下:SE18ZIF_EX_BADI (Interface)ZCL_EX_BADI (Class)Method()SE19ZIF_EX_BADI (Interface)ZCL_IM_BADI (Class)实装Method()下面能过代码分析 BAdI 机制背后的一些设计问题:1. 定义指向BAdI interface的Reference DATA: exit_ref TYPE REF TO ZIF_EX_BADI.2. 获得继承BAdI interface的子类实例CALL METHOD cl_exithandler=>get_instance    CHANGING        instance = exit_ref.这里的cl_exithandler=>get_instance方法是一个简化的Abstract Factory.a) 为什么说它是个简化的Abstract Factory呢? 因为CL_EXITHANDLER没有一个抽象的工厂类, 只有一个产品簇, 只完成单一的创建工作。b) 为什么cl_exithandler=>get_instance要用工厂模式呢?在Client代码端看来,通过调用get_instance这个方法就可以得到具体实现类实例,然后调用下面的方法:CALL METHOD exit_ref->CUSTOM_VALIDATION    IMPORTING        param = ‘xxx‘    EXPORTING        flt_val = ‘xxx‘.就调用到实现类中的接口方法了。但通过Debug代码你会发现这个调用返回的是Adapter Class ‘ZCL_EX_BADI‘而非我们的Impl Class!其实这就是创建型模式的意义 - 隐藏对象的创建细节. 也就是说当我们调用CUSTOM_VALIDATION时,其实是调用了ZCL_EX_BADI->CUSTOM_VALIDATION.四,BADI的实现A.BADI定义 1.SE18。 2.输入要创建的BADI的名字,点击"Create"。 3.输入BADI的描述性文本,在"Interface"选项卡上输入接口的名字,也可以采用SAP建议的接口的名字。同时,BADI类也会被创建。 例如:对于BADI "ZTEST",SAP会建议"ZIF_EX_TEST"作为接口的名字,"ZCL_EX_TEST"作为类的名字。 4.保存BADI。 5.双击接口的名字,会跳转到Class Builder界面,在这里你可以定义接口的方法。 6.保存并激活接口。 B.在应用程序中调用BADI 1.声明一个BADI接口的参考引用变量。 例如:DATA exit_ref TYPE REF TO zif_ex_test. 2.调用类CL_EXITHANDLER的静态方法GET_INSTANCE,将返回一个请求对象的实例。 例如: CALL METHOD CL_EXITHANDLER=>GET_INSTANCECHANGING instance = exit_ref。 3.现在你可以调用BADI的所有方法了 C.BADI实现 1.SE19。 2.输入BADI实现的名字,点击"Create"。 3.输入BADI定义的名字。 4.输入实现的描述性文本,在"Interface"选项卡上输入实现类的名字。可以采用SAP建议的名字。 例如:"ZIMPTEST",SAP会建议"ZCL_IM_IMPTEST"。 5.保存实现。 6.双击某一方法名会跳转到Class Builder界面,在这里你可以添加代码来重定义接口方法。 7.激活实现五,查找BADI本帖隐藏的内容BADI是SAP的第三代用户出口,采用了面向对象的方式,据说在4.6A版本之后才引入的BADI。使用st05查找BADI1)ST05,选择SQL trace、buffer trace,然后activate trace2)运行TCODE3)deactivate trace4)display trace,显示display trace的对话框,在表的栏位上加上? V_EXT_IMP和 V_EXT_ACT5)查看以IF_EX_开头的字符串,这是interface class 的名字,IF_EX_后面的就是BADI。例如IF_EX_EQUI_UPDATE