Understanding the New Enhancement Framework
Understanding the New Enhancement Framework
Introduction
Has it ever occurred to you while looking at some complex technology, that you are lost as to what the technology is actually for? Have you ever had doubts as to whether the complex technology was created exclusively for the entertainment of the developers? I confess that this thought crossed my mind when I first faced the huge complexity of the new Enhancement Framework. But after a second look I found that nothing could have been further from the truth. The "complexity" of this framework has a clear function, and the basic structure that serves to accomplish this function is actually pretty simple. In this weblog I want to explain what it is exactly that the new Enhancement Framework, packaged with NetWeaver 7.0, provides the software developer. The Enhancement Framework is about resolving an old conflict in software development: standard software solutions versus proprietary solutions. What the Enhancement Framework does is to combine the advantages of both the standard (easily maintainable) with the proprietary solutions (more flexible) while avoiding the drawbacks of both standard software (lack of flexibility) and customized software (upgrade issues). At the core of this framework is a simple structure consisting of a hook or an enhancement option and an implementation element you can attach there. You may already understand that enhancements are preferable to modifications. To take full advantage of what enhancements over modifications offer, you will need the new Enhancement Framework. Its purpose: to offer you the ability to enhance the SAP standard software and to organize these enhancement options and their respective implementation elements as effectively as possible. Don't expect to learn about all the technical details of the Enhancement Framework in this particular weblog, though. This weblog will solely cover the basics of the framework. Once you have a clearer concept of the basics, you will see that the complex structures of the whole framework serve a lot of different functions and still not feel lost within these structures.
What SAP Does to Bridge the Gap between Standard Software and Proprietary Solutions
So much for the aim of this weblog; now let's start to understand the basic gap between standard software and customized software and how the Enhancement Framework brings you the best of both worlds. Standard software can have many advantages over proprietary solutions in terms of cost, ease and effort. But standard software is much like off-the-rack clothing. It doesn't always fit perfectly. There will probably be some aspects in which standard software does not optimally meet the specific requirements of a process as it is realized in a particular customer company. On the other hand, proprietary software is usually better suited to meet your specific requirements. Unfortunately having a non-standard solution also means a lot of drawbacks. Surely, your company prefers to concentrate on the things it does best, be it building cars, selling food or whatever other core business and competences it has. So it isn't really a very attractive option to resolve standard solution limitations by maintenance and further development of a proprietary IT solution. Of course, it would be great to have the best of both approaches: to have all the advantages of a standardized software solution while having the flexibility of a highly customized solution. One way to accomplish this (at least to a certain extent) is to have a standard solution that can be adapted to the individual needs of your company. SAP has gone quite a long way in this direction. Since SAP exposes and delivers the source code of all ABAP-based solutions, a customer theoretically could directly modify SAP coding. But, of course, this should happen only in a controlled way. It would do no good to change the source code in a totally ungoverned way. For this reason SAP offered so far two different technological approaches to enable the customer to adapt SAP source code:
Modifications are changes of a SAP development object. These are supported and tracked by the Modification Assistant.
Enhancements, on the other hand, do not change the SAP development object, but rather add something to it or enhance it. Up to now, there were so-called User Exits and Customer Exits where you could put in additional source code. Since release 4.6 there were also BADIs (Business Add-Ins). A BADI specifies an object-oriented interface that can be implemented by a customer.
The new Enhancement Framework, packaged with NetWeaver 2004s, is intended to unify these two approaches: the modifications and the classic enhancement technology. Up to now it integrates all the new enhancement technologies such as the new BAdI, source code plug-ins, class enhancements, and function group enhancements. The framework brings with it flexibility so that you have the freedom to adapt a solution to your own needs while keeping all the advantages of a standard solution. Simply stated, the new Enhancement Framework is an evolution of classic enhancement technologies. The concept of enhancing a development object has some important advantages over modifying it. SAP has decided to optimize the enhancement technology in such a way that you can now use enhancements in many of the situations where you formally needed to modify the source code.
an upgrade without a lot of additional work. You can organize them in a structure of their own and document all the enhancements in the system.
The Basic Idea of the Enhancement Framework: How Do Modification- Free Enhancements Work?
Before going into more detail, you should now understand the basic idea of the Enhancement Framework. It provides a modification-free enhancement technology, enhancing source code units without modifying them. The basic mechanism is to offer so-called enhancement options in development objects. These enhancement options function like hooks where you can attach the enhancements. The hooks are part of the development objects which can be enhanced. When you assign an enhancement to a hook, at runtime the enhancement is processed when the control flow reaches the hook. In other words: At runtime the enhancement behaves as if it belonged to the development object it enhances, while the enhancement as a transport object does not belong to the enhanced object. As this probably sounds a bit abstract let us have a look at a specific enhancement, the source code plug-in. At predefined positions in the source code (for example, in a report) you have a particular type of enhancement option, that is an enhancement point. At these points you can insert an enhancement that is called a source code plug-in. The respective plug-in is processed after the enhancement point is reached by the control flow. That is, the source code plug-in behaves at runtime as if it were part of the report while in fact it can belong to another package. This is what a source-code plug in looks like:
Ignore the details of the source code enhancement for the moment. This particular example only serves to illustrate the point of how enhancements function: You have the anchor point or enhancement option, which is an enhancement point in our particular example. At this enhancement point which is in the orange marked line the enhancement element 1 (in grey colour) is inserted. The spot flights_display_b and the enhancement flights_display are units you should not be interested in at this point. . In some way you can compare the enhancement technology with a closet system where you can insert different elements at particular positions. You need not drill the wood in the side walls, but nevertheless you can attach boards and other elements where there are already hooks or holders at important positions. The boards and other elements such as drawer or CD-holder look as if they were integral parts of the closet system while in fact they are only attached to the walls by hooks or holders. The holder in our analogy corresponds to the enhancement options. The different elements you can attach there such as boards, drawers, CD- elements etc. behave like the enhancements. You can not attach a board to the closet system everywhere you like, but rather only where a holder is prepared. In the same way you cannot enhance a development object anywhere, but only at predefined positions, which are called enhancement options. So irrespective of all further refinements, superimposed containers and their respective connections, the basic structure of how an enhancement functions is as simple as could be:
On the one hand, there are hooks or enhancement options where you can insert enhancement elements. Further on I will also speak of the definition side of the Enhancement Framework because it is there that the enhancement options are defined. On the other hand, there are the enhancement implementation elements that you can attach to a hook or an enhancement option.
Class Enhancements: You can add additional methods, optional parameters, pre- and post-methods to existing methods. Function group enhancements: You can enhance the interface of a function module by additional parameters using function group enhancements. Source code enhancements: Enhancement points are positions in the source code where you can attach source code plug-ins that enhance the source code at these positions. While a source code plug-in at an enhancement point is processed in addition to the original code, the code of a so-called Enhancement Section is substituted by the respective source code plug-in. The BAdI is an object-oriented enhancement option. The BAdI defines an interface that can be implemented by classes that are transport objects of their own. The new BAdI is fully integrated into the Enhancement Framework. Within the Enhancement Framework a BAdI is an enhancement option or an anchor point for an object plug-in.
It is important that you have a clear idea of this structure in mind because everything you do when creating an enhancement happens within this structure. This is due to the fact that the compliance to the rules is enforced by the framework. This means for you: Every enhancement element has to be part of an enhancement spot. When you create an enhancement from scratch you always have first to create the respective containers. You can compare this to creating a method. There is no such thing as a method on its own. A method is always part of a class. In the same way there is no stand-alone BAdI. Every BAdI is part of an enhancement spot and it is the spot that is the transport object. It is because of this fact that you cannot build a new BAdI and just forget about the framework in the way you might be accustomed to from the classic BAdI. It is also not possible to build the BAdI first and take care later of how it fits in the structure of containers. When building a BAdI you have to put the BAdI within the relevant structure from the very beginning. But it is only mandatory to have simple containers. Composite enhancements spots and composite enhancement implementations are not enforced by the tools. I mention this explicitly because, at first, it might be a bit astonishing for you when you want to create an enhancement point and you first have to create an enhancement spot. When this happens, you should keep in mind two things:
Experience has shown that structure has to be imposed by tools. Otherwise when programming it is tempting to forget about the structure because it is time saving in the beginning. You see the real costs later when you get in trouble trying to keep an overview of all the different enhancements. You should be aware of the fact that you have only the containers after having created an enhancement spot and a simple enhancement implementation. You have prepared the ground for building enhancements, but that is all. Don't delude yourself into thinking that you have already an enhancement option or the respective implementation.
Previously, in my last weblog you have learnt the basic concept of an enhancement. In this weblog you have seen the different kinds of enhancement options, you understand the difference between implicit and explicit enhancement option and you know the structure where the enhancements fit in. In other words, now you have everything you need at hand to build a BAdI. And this is what I will show you in the next weblog. We will build a BAdI and see all the pieces of theory at work that you have become acquainted with by now.
Part III: How To Define a New BAdI Within the Enhancement Framework
This is part three of the weblog series on the New Enhancement Framework. You get to know some more facts as to what a BAdI is and when to use it, and then, at last, we start with an example that shows you how to build the BAdI with the respective tools in the ABAP Workbench and how the code to instantiate and call the BAdI is integrated in the ABAP language. In the last weblogs (Part 1: What the New Enhancement Framework Is For Its Basic Structure and Elements For Beginn and The new Enhancement Framework Part 2 - What Else You Need to Know Before Building an Enhancement) you have learnt about the basic structure of an enhancement, the different enhancement technologies within the framework and the containers
for enhancement options and enhancement implementation elements. You need to know them in order not to lose your bearings within the Enhancement Framework when we now start building a BAdI. If you have a mental map of the entities in the framework, you will find it really to easy to understand what is going on in the example. So I would recommend you should take your time to recapitulate theses basics, before proceeding to the practical part of this weblog.
an enhancement option that is a BAdI, providing the respective method in its interface, and also a call of a BAdI method.
We enter a name for the enhancement spot and some short text. To name a composite enhancement spot is voluntary. We are content with our enhancement spot and need no higher level container for the example. In real life programming, you probably should take advantage of the structure the composite enhancement spots offer you and always work with these complex containers.
In the dialog window that appears we enter the BAdI name z_badi_calc_vat plus a short description and confirm. Now we have a BAdI in the list of our enhancement spot. We deselect the property "multiple use", because for our calculation we need a single use BAdI:
Selecting the Change icon leads you to the class builder, where you can create the methods you need for your BAdI in the same way that you are used to if you are familiar with the class builder. We just type in the name of the method get_vat and enter the parameters we need. A BAdI interface has to implement the interface if_badi_interface. But if we create a BAdI interface in the way just shown this marker interface is already integrated in the BAdI interface. Probably you know how to work with the class builder, but still I have inserted the following two screenshots to show you: Defining a BAdI interface is just normal ABAP Objects programming and as simple as could be for anyone familiar with the Class Builder. We define one BAdI method.
We save and activate the interface and the spot. So let us now take a breath and consider what we have created so far:
We have created an enhancement spot and a BAdI with an interface. The interface has one method so far. Of course, just building a BAdI does not suffice. It does not do anything. You need a BAdI instance, and this instance must be called somewhere in the code. This is the definition part of a BAdI. But as a BAdI only defines an interface, you need a class that implements this interface. Remember: A BAdI definition is the option to insert an object plug-in that does a job at runtime. You still need an object that is plugged in to get something done.
DATA: handle TYPE REF TO z_badi_calc_vat, sum TYPE p, vat TYPE p, percent TYPE p. sum = 50. GET BADI handle. CALL BADI handle->get_vat EXPORTING im_amount = sum IMPORTING ex_amount_vat = vat ex_percent_vat = percent. WRITE: 'percentage:', percent, 'VAT:', vat.
If we run the program it dumps. Considering what I have told you before about the single use BAdI, this is no wonder. It is mandatory, that there is exactly one active implementation for a single use BAdI. Our BAdI is a single use BAdI. One way to handle this is to catch the respective exception cx_badi_not_implemented.
The program runs with a single use BAdI without raising an exception. It is guaranteed that the fallback class is not used any more as soon as a BAdI implementation is supplied. So a fallback class is only selected conditionally. This is important, because the BAdI provider does usually not know the details of some process. This is why a BAdI is used.
We select the checkbox the bottom with the text: Call fallback class if no implementation is executed and insert a name for the class.
Clicking the change icon leads us to the class builder. Again the tools do a great job for you: The respective method of the BAdI interface is already defined. We only have to implement it:
DATA: percent TYPE p VALUE 20. ex_amount_vat = im_amount * percent / 100. ex_percent_vat = percent.
I skip this, because it is no news to anybody familiar with the Class Builder. Of course, we have to save and activate the class. Then we navigate back to the enhancement spot and activate it.
Running the program again leads to result: percentage: 20 VAT: 10. And this is the end of this weblog. Now, you know how to build an enhancement spot and a BAdI including the BAdI interface and a fallback class plus the ABAP commands to use the new BAdI. In the next weblog you learn how to create a BAdI implementation inside the respective container, that is the (simple) enhancement implementation and how to select among the different BAdI implementations using the addition FILTER to the GET BADI command.
The definition and the implementation of BAdIs are similar in one respect: Just as you need a container that is an enhancement spot for a BAdI, you cannot build a BAdI implementation unless you have the relevant container first. The relevant container type for BAdI implementations is called (simple) enhancement implementation. A simple enhancement implementation can keep many different BAdI implementations, but with one restriction: A simple enhancement implementation is uniquely assigned to an enhancement spot. That means: A (simple) enhancement implementation can keep only BAdI implementations of BAdIs that belong to the spot the simple enhancement implementation is assigned to. This has the consequence: An (simple) enhancement implementation cannot keep BAdI implementations that implement BAdIs belonging to different spots. This being so, we have first to create a container that is uniquely assigned to the enhancement spot our BAdI belongs to. Despite the fact that we have to do something pretty complex, the respective tool in the SE80 has paved a smooth way to do this. All you have to do is to press one button. This button is marked with an orange frame in the screenshot below:
We get to the dialog window, where we can create a (simple) enhancement implementation:
What are we asked to type in here? We have created so far a container for BAdI implementations, that is a (simple) enhancement implementation. This container is uniquely assigned to our enhancement spot. Once this connection is established, we can create a BAdI implementation for the BAdI within the enhancement spot. As we have defined only one BAdI within the enhancement spot, we have no choice. If we had more BAdIs in our enhancement spot, this would be the point where to select which BAdI we want to implement. As matters stand, we type in z_bdi_calc_vat_us as the name of the BAdI implementation, confirm and save the enhancement spot in the next window. There we are: This is (simple) enhancement implementation that contains the BAdI implementation z_bdi_calc_vat_us:
Obviously, the appearance of a (simple) enhancement implementation in the tool is pretty much like the one of an enhancement spot: Under the tab Enh. Implementation Elements there is a tree with the BAdI implementation(s) contained on the right-hand side. On the left, you see the properties of the marked BAdI implementation. Note: Select the property "Implementation is active" under the header "runtime behavior". If you do this the text below changes to: "Implementation is called". That is intended to help you understand what the selection you have just made is for. Farther below, there is a list that shows the properties of the BAdI definition our BAdI implementation is assigned to. To better understand the structure in which our objects are imbedded, let us have a look at this sketch:
At the top, there is the definition part: In principle, such a spot can contain many different BAdI definitions. Our enhancement spot contains only one BAdI definition. We have created a container for the BAdI implementations. This (simple) enhancement implementation is uniquely assigned to the enhancement spot, but one enhancement spot can have many enhancement implementations assigned to it. We have a one-to-many relationship between the enhancement spot and the enhancement implementation. With this relationship established, we have assigned
a BAdI implementation to our BAdI. Again, this is a one-to-many relationship: A BAdI definition can have many BAdI implementations, but a BAdI implementation uniquely belongs to a BAdI. Only if the relationship between the containers that is the enhancement spot and the enhancement implementation is established, you can assign a BAdI implementation to a BAdI definition. I have tried to show this in the picture by the large orange pipe that contains the small grey pipe. You should keep in mind: When implementing a BAdI, you have first to establish a connection between the relevant containers. Based on this connection you can go on and implement the BAdI. This principle applies to source code plug-ins in an analogous fashion. Now that we have a BAdI implementation, we need an implementing class. We click the triangle in front of the name of the BAdI implementation in the tree and next double-click Implementing Class:
It works the same way as with the creation of the fallback class in the last weblog. As we do not want to reuse an existing class we enter the name z_cl_calc_vat_us and select the Change icon. Again, we get to the Class Builder where the relevant interface methods are already defined. In our case it is only the method: get_vat( ). We implement it:
DATA: percent type p value 4 . ex_amount_vat = im_amount * percent / 100 . ex_percent_vat = percent .
We save and activate the class. If we have not activated the (simple) enhancement implementation before, we have to activate it now. Now, we return to the program:
DATA: handle TYPE REF TO z_badi_calc_vat, sum TYPE p, vat TYPE p, percent TYPE p. sum = 50. GET BADI handle. CALL BADI handle->get_vat EXPORTING im_amount = sum IMPORTING ex_amount_vat = vat ex_percent_vat = percent. WRITE: 'percentage:', percent, 'VAT:', vat.
We run the program, and what do we get? The result is a percentage of four percent. And this is because the fallback class is not selected, if we have an active BAdI implementation. As a next step, we create another BAdI implementation, this time with the VAT rate of Great Britain. To make our example more like real world programming, we create another (simple) enhancement implementation, that is another container. This is because implementing the taxes for different countries most probably belongs to different projects and because the structure of the (simple) enhancement implementations should mirror the project structure. We navigate to our enhancement spot and use the same button as we have done above. We name the simple enhancement implementation z_ei_bad_calc_gb, the BAdI implementation z_bdi_calc_vat_gb, and the implementing class Z_BDI_CALC_VAT_GB. The implementation of the
method get_vat is the same as for the USA except for the VAT rate, which is 16,5% now. After saving and activating the enhancement implementation and the class we return to the program and run it again. This time we get a short dump with the exception cx_badi_multiply_implemented. Remember: We have defined our BAdI as single use by deselecting the property "Multiple Use". When instantiating a single use BAdI you have to make sure that there exists only one active nondefault implementation. Otherwise you get the respective exceptions at runtime. These exceptions can be caught, but this is not our strategy here. We want to avoid the exceptional situation right away. Obviously, it would also make no sense, because we need exactly one result for our calculation and could not make any use of if the two BAdI implementations would be called one after another. This was just why we defined our BAdI as single use. What we need is a way to select among different BAdI implementations. And this is where the BAdI filter enters the game. What we need is to change the BAdI definition, that is one we need to add a filter. You can define one or many filters for a BAdI. We will be modest and be content with one filter. Let us just define the filter in the BAdI definition, determine filter values for the respective BAdI implementation and use the filter in the instantiation of the BAdI handle. I hope in hindsight, you will understand what we have done and why. You should keep in mind that what we do now when modifying our example does not take into account the differentiation between the BAdI provider and the implementer. In real life it is the BAdI provider who defines a BAdI with a filter or adds a filter to an existing BAdI. It is also part of this role to use the filter condition in order to select the respective BAdI implementation in the ABAP code. It is the implementer who determines the filter value(s) or an interval for one or many BAdI implementations. In the example we do all this ourselves for the sake of the example. We start by adding a filter to our BAdI (role of BAdI provider) and to this we navigate to our enhancement spot and stay in the tab "Enh. Spot Element Definition" that shows a list of all the enhancement elements the spot. We switch to the change mode, mark our BAdI in the list, and click the Filter icon above. A dialog box opens and we fill out the relevant fields as shown below:
We confirm and get to the next screen. Obviously, the filter is now visible as a property below the BAdI. After activating the enhancement spot, we double click Implementation and navigate to the respective BAdI implementation by double-clicking the respective row in the table of BAdI implementations.
We switch to the change mode, click the triangle in front of the BAdI implementation in the tree and then double-click the filter icon below. In the next window we select the Combination icon, select "Country" as filter and confirm:
Double-clicking the row below "Combination 1" leads us to the next window:
As I have told you above, adding or changing a filter value of a BAdI implementation is part of the implementer's role. After we have activated the (simple) enhancement implementation, we navigate back to the spot. Apparently, the other implementation, that is the one for USA needs also the respective filter value. So we go to the respective (simple) enhancement implementation and change the BAdI implementation in an analogous manner. The respective filter value for this country is 'US'. I skip the description of how to do this, because what we do is identical to what we have done before when creating the filter value for the BAdI implementation z_bdi_calc_vat_gb. We must take care that we do not forget to activate the (simple) enhancement implementations and to select the property "Implementation is active" for every BAdI implementation. Now it is time to return to our program and adapt it to the modified BAdI (this is also the task of the BAdI provider). Running the syntax check shows you that you need to have a filter parameter in the GET BADI command if the BAdI you try to instantiate is defined with a filter. The requisite addition to the GET BADI command is FILTERS. It is after this keyword that you insert the name of the BAdI filter and a value the filter is compared to. Of course, we also have to take care that an appropriate value can be passed to the GET BADI routine:
REPORT Z_DEMO_ENH. parameters: ctry(2) type c. DATA: handle TYPE REF TO z_badi_calc_vat, sum TYPE p, vat TYPE p, percent TYPE p. sum = 50. GET BADI handle FILTERS Country = ctry. CALL BADI handle->get_vat EXPORTING im_amount = sum IMPORTING ex_amount_vat = vat ex_percent_vat = percent. WRITE: 'percentage:', percent, 'VAT:' ,vat.
If you pass "GB" to the parameter ctry, you will get a VAT rate of 16,5 percent. If the value of the parameter ctry is "US", the VAT rate will be 4 percent. When the parameter ctry has any other value, we will still get a calculated value for the data field 'percent'. And this is because we have defined a fallback class for our BAdI. The fallback class is not only selected if no BAdI implementation is available, but also if none of the existing BAdI implementations meets the filter conditions in the GET BADI command. Accordingly, we get a VAT rate of 20 percent. And this was the VAT rate we have implemented in the method get_vat in the fallback class. And this is the end of this weblog. You have now learned how to create a BAdI implementation for a given BAdI. You know that a (simple) enhancement implementation is a container for BAdIs and moreover how and also why to assign it to a (simple) enhancement spot. That is you have understood the way the different elements of the enhancement framework interact when implementing a BAdI. And, in the second part; you have learned how to create a filter for a BAdI, how to determine filter values for BAdI implementations and what the appropriate syntax for calling a BAdI with a filter is like.
Why to Define an Enhancement Option as a Developer Outside of SAP - the Different Use-Cases
Let us start by spending some thoughts as to when and why you might want to define an enhancement option as a non-SAP developer. Of course, it should be clear at the outset that in most cases you will implement enhancement options if you are a non-SAP developer. But as you will learn soon, there is one group of non-SAP developers that will take great advantage of defining enhancement options themselves. These are the ones developing solutions that should be enhanced by somebody else later. I will treat this group in the first use case. In contrast, the second use case is not confined to a particular group, but to any developer who is interested in keeping an unavoidable modification as small as possible. 1a.Imagine, you are an ISV, develop your product in ABAP and want to enable your customers to enhance your product at certain points. In this case, you provide enhancement options where you think they are useful. 1b. The same applies to the IT department of a multinational company. It develops some solution in ABAP and wants to make room for changes or enhancements that the different local subsidiaries can implement. Again using enhancement options are the suitable way to do this. Both cases are semantically and technically pretty the same, so that I decided to subsume them under the same use case.
2. The second use case is a bit more complex to describe: You are a SAP customer and need some enhancement of a SAP solution. Let us assume that the implicit enhancement options available in the relevant development objects do not suffice to accomplish this and that there are also no suitable explicit enhancement options. So you are left with the possibility to modify the relevant SAP development objects. But still there is room for using enhancement options. To reduce the effort necessary for adapting your modifications after an upgrade it is a good strategy to keep your modifications small. To minimize the size of your modification you create enhancement options within the modifications you insert. Then you add all further code to the implementation of these enhancement options. This way the modifications only contain these enhancement options and all the other additions are part of your namespace. In this use case modifications and enhancement cooperate in an interesting way.
ENHANCEMENT-SECTION SEC_SELECT SPOTS ES_MY_SPOT. select * from sflight into table struc. END-ENHANCEMENT-SECTION.
Don't worry here about the details of the syntax. At this stage, you should just note that the code marked as an enhancement section is substituted by a source code plug-in as soon as one is provided. Obviously it is required by the logic of enhancement sections that one enhancement section can have exactly one active implementation. Let me just restate the main point about the use of source code enhancements: This enhancement technology is suitable if you want to provide an enhancement option and cannot or do not want to specify an interface.
In the next dialogue window we enter the name of the enhancement point and the name of the spot plus the name of the relevant package as shown below.
As a result an enhancement point is inserted into the code before the line where the cursor was:
This is what an enhancement point looks like. An enhancement point has a name that is unique within the source code unit it belongs to and is uniquely assigned to an enhancement spot.
There we are. We choose the right mouse menu on the line where the enhancement point is and select Create in the submenu:
As I have told you have first to provide a container for the source plug-in, that is an enhancement implementation. Let us call our enhancement implementation ei_my_implementation. Of course you should not forget the explanatory text. It is possible to create a composite enhancement implementation by using the Create icon. But it is not necessary, and so we do without this meta-container here. And there we are:
Before inserting some code just note that the source code plug-in itself is not named. It is by assigning an enhancement implementation to an enhancement point that a source code plug-in comes into being. We just enter the code: WRITE 'implementation'. After the code for the source code plug-in is supplied we should activate it by selecting the respective button:
Our enhancement point uniquely belongs to the (simple) enhancement spot es_my_spot. This spot is assigned to the (simple) enhancement implementation ei_my_implementation. (Simple) enhancement spots containing points or sections and the relevant (simple) enhancement implementations are in an n to m relationship. That means: Points belonging to one spot can be implemented by source code plug-ins belonging to different (simple) enhancement implementations. And source code plug-ins belonging to one (simple) enhancement implementation can implement points belonging to different (simple) enhancement spot. (This does of course not mean that one source code plug-in can implement different points) It is the compilation unit that holds the respective (simple) enhancement spots and (simple) enhancement implementations together: Spots containing points in one report cannot contain points in other programming units. The same is true for the enhancement implementations in an analogous way. An enhancement implementation cannot be assigned to points that belong to different programming units. Source code plug-ins are unnamed. You create a source code plug-in by assigning a (simple) enhancement implementation to an enhancement point. In turn, this means that a (simple) enhancement implementation can only be assigned once to an enhancement point. Otherwise the identity of a source-code plug-in would be blurred. So much for the details of the structure of the entities involved when creating and implementing an enhancement point. By the way, the structure of the entities and the whole process of defining and implementing is pretty the same for an enhancement section. There is one notable difference: When implementing an enhancement section you have to make sure that there is not more than one active source code plug-in.
In the next dialogue window we have to enter the name of a new (simple) enhancement implementation. For reasons already given, it has to be a new one and has to be different from the enhancement implementation to which the source code plug-in to be substituted belongs:
What we do now is pretty the same procedure as when we originally implemented our enhancement point. We enter some code and activate it by selecting the button Activate Enhancements. This is what our enhancement point looks like now:
By using the respective entries in the context menu you can also change and delete source code plug-ins. But you should keep in mind: You should not touch source code plug-ins created by SAP as this would mean to modify a SAP object, in this case, the respective (simple) enhancement implementation. If a source code plug-in created by SAP does not meet your requirements, you should replace it in the way just shown in the last use case. So you should change and delete only the source code plug-ins you have created yourself. Instead of deleting an source code plug-in created by SAP you should replace it by an empty source code plug-in. Again, this is the way to avoid a modification.
Summary
By now you should have learned a lot of different things about the source code enhancement technology. Let us first consider the definition part or the role of the enhancement option provider. You know the use cases for this enhancement technology: As an option provider source code enhancements are the means of choice if you do not know the interface of the enhancements to be made. You can also create an enhancement point as a modification and add the rest of the code you need to a source code plug-in assigned to this enhancement point. This helps keeping unavoidable modifications small. Apart from these use cases, the enhancement technology recommended by SAP, in general, is to define a BAdI. As to the implementing part, you know:
how to implement an enhancement point, how to change or delete an source code plug-in of your own, how to replace an existing source code plug-in in the SAP namespace.