Class是object的抽象描述,object只是在程序运行时才能存在。Object是由class描述的,并包含两个层次,inner layer和outer layer。Object的public component就是这个object的interface。Oo的主要目的就是为了保证object本身状态的consistency。Object的attributes一般是internal的,只能被它的method修改。对于具有相同attributes和methods的object他们也有自己的identity来区分。与OO概念相似的有function group,不同的是function group只能有一个instance,而object可以有任意个instance。
l
l
l
创建badi时,几个相关的部件就会被创建:interface和为实现interface而生成的class。生成的class主要实现下面的任务:过滤,如果你实施了一个过滤badi,那么这个class就会保证只有相关的implementation才会被调用。
Badi的执行流程:首先service class CL_EXITHANDLER会创建一个object reference,并产生调用program enhancement method的条件。当你定义BADI时,就会产生一个BADI class,用来implement badi interface。调用时,badi class的interface method就会被调用。Badi会搜索所有的BADI Implementation并调用implemented methods。
Badi在调用程序中的实现源代码如下:
REPORT <program_using_badi>.
DATA: r_var TYPE REF TO <badi-interface>.
START-OF-SELECTION.
CALL METHOD cl_exithandler=>get_instance
CALL METHOD r_var->method
END-OF-SELECTION.
首先你必须定义一个指向badi interface的reference variable。这个reference variable的名字不一定要包括badi的名字。第一次调用时一个object reference就会被创建,只用interface的method才会被这个reference object调用。可以通过这个reference object来调用你需要的enhancement中的方法。
可以通过t-code SE19来implement badi。
可以给implement class分配任何的名字,不过最好遵循以下规则:namespace以Y或Z开始,对于class的name以CL开始,implementation的name以IM开始,要implement method只要双击method name即可,系统会自动启动Class Builder editor。一旦完成代码编写,一定要激活它。
如果badi被激活,当调用程序执行时,相应的implementation methods也会被执行。一旦diactivate这个implementation,相应的方法就不会被调用。然而应用程序中的相关调用仍然会被执行。不同的是adapter class的instance不会找到激活的implementations。并不像CALL CUSTOMER-FUNCTION,CALL METHOD CL_EXITHANDLER=>GET_INSTANCE即使没用implementations,仍然会被调用。只有在original system中才可以activate或deactivate implementations,而subsequent systems则只能transport。如果badi只能有一个implementation,那么系统中仍然可以存在这个badi的多个implementation,只不过只能有一个激活版本。
同customer exit一样badi中也有menu enhancements。但是必须满足以下两个条件:1,必须预留了menu enhancement。2,必须在Badi的implementation中实现。Menu enhancements的function codes必须以+开始。如果相应的enhancement的badi implementation被激活,那么menu就会显示出来。你只能为single use badi创建function code,而且badi不能是filter dependent。这样就保证了一个或多个的badi不出现矛盾。如果用户在程序中选择了相应的以+开始的function code,那么系统就会调用相应的method。Method call和Menu enhancement是不可分离的,它们只能属于同一个badi。
DATA: r_var TYPE REF TO <badi-interface>.
START-OF-SELECTION.
CALL METHOD
CALL METHOD r_var-><method>
如果使用filter dependent badi,要给参数flt_val传递一个适当的值。
对于ABAP virtual machine,screens和class是不能绑定到一块的。所以只用classical programs(type I,For M)才能作为screen的容器。Badi的screen enhancement也必须考虑到这点。当创建badi screen enhancement时,在应用程序的screen上要保留一块subscreen area。然后implementing program就会填充它。应用程序和subscreen的container program并不直接交换信息,而是通过生成的badi class。如果badi包含screen enhancements那么它就不能是reusable的。在subscreen tab你需要输入calling program,screen number和subscreen area。Implementing program和subscreen number是在implementation过程中指定的。
如果想通过badi实现screen enhancement,在应用程序中要实现以下步骤:
l
l
l
l
l
在main screen的PAI,需要调用另外一个method把修改后的数据传回给application program。
实现screen enhancement的几个步骤:
l
l
l
l
l
l
Implement badi screen enhancement的步骤如下:
l
l
l
l
l
l
得到badi class instance的方法是CALL METHOD cl_exithandler=>get_instance_for_subscreens,这个reference是通过方法cl_exithandler=>set_instance_for_subscreen来传递的。这允许你在implementation中访问badi的attributes以及interface methods。Implementing program通过方法:exit->get_data IMPORTING <data>来获取badi中的data。通过方法exit1->put_data EXPORTING <data>将修改后的data传回给badi class的instance。
Filter type扩展性局限于以下几个方面:
l
?
?
?
如果没有active implementations,那么由enhancement provider提供的default implementation就会被执行。在badi definition中通过goto->default code就可以创建default implementation。还可以创建一个sample implementation。通过goto->sample code就可以创建。几种增强方法的比较:
| Customer Exit | BTE | BADI |
Source code | + | + | + |
Menus | + | - | + |
Screens | + | - | + |
Table | + | - | [+] |
Administration levels | + | - | + |
reusable | - | + | + |
Filter specific | - | + | + |
BADI DEFINITION中的name conventions
l
l
l
l
BADI IMPLEMENTATION中的name conventions
l
l
l
l
找到badi的方法:
l
l
l
1,BADI 对message type 是有限制的,如果你放'E',程序会dump
2,BADI是一个class interface,里面包含多个方法,before update or after update,可以选择具体的method来看他的参数。
3,within classes and interfaces, you can only use "type" to refer to abap dictionary types, not "like" or "structure"; and, the addition occurs is no longer supported in the oo context.use "table
of...initial size"instead; and,tables with headers are no longer supprted in the oo context.
badi对象的信息存储在SXS_INTER, SXC_EXIT, SXC_CLASS 和SXC_ATTR 这四个表中。
评论