Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
Showing results for 
Search instead for 
Did you mean: 

User exit

Former Member
0 Kudos


I am from the java background and would like to know the following.

What is a USER exit in abap?

Whats the equivalent to this in java?



Former Member
0 Kudos

Hi Stride,

*Below is a sdocument about User Exits.*

User exits (Function module exits) are exits developed by SAP. The exit is implementerd as a call to a function module. The code for the function module is written by the developer. You are not writing the code directly in the function module, but in the include that is implemented in the function module.

The naming standard of function modules for functionmodule exits is:

EXIT_<program name><3 digit suffix>

The call to a functionmodule exit is implemented as:

CALL CUSTOMER.-FUNCTION ❤️ digit suffix>

To find a Exit.

Goto Transaction -- Find The Package

SMOD >f4>Use the Package here to Find the Exits In the Package.

Else if you Want to search by Application Area wise ,

There is one more tab to find the Exits in the Respective Application Area.

Implementing the Exit-- CMOD Create ProjectsAssgn your Component .

Now Run ur Transaction to Check if it Triggers.

Thats it..

Suppose you need to find out all the user exits related to a tcode.

1. Execute the Tcode.

2. Open the SAP program.

3. Get the Development Class.

4. Execute Tcode SE84.

5. Open the Node 'Envir. -> Exit Techniques -> 'Customer Exits -> Enhancements'

6. Enter the Development class and execute.

Check out this thread..

1. Type the transaction : system->status-> <PROG. NAME>

2 open SE37 , type EXIT<PROG NAME> and press F4 to get the list of function exits available.

3. Open CMOD utilities->SAP enhancements

EDIT->All selections

4.type the function module name obtained in step 2, in fields 'component name' in 'additional selections' block. and execute.

5. The displayed list contains the enhancements names for the transaction You were looking for.

6. Create a project in CMOD and the code in default include->activate.

which gives the list of exits for a tcode

For information on Exits, check these links


These links will help you to learn more on user exits.

Also please check these threads for more details about user exits.

1. Document on UserExits in FI/CO

2. Finding User Exits...

3. List of all User Exits...

Former Member
0 Kudos


Below u can understand user exit here im gving how to find exit.

take tcode and goto status dclick on pror and goto attributes take package and goto smod and F4 in that give the package name and F8 u will display some exits.

and implementing depends on the requriments .

for finding wch exit is suitable just keep break-point in all the inculdes then run the tcode u will find its triggering thn over write the code u need..

What is the difference between SMOD and CMOD? CMOD is the Project Management of SAP Enhancements (i.e., SMOD Enhancements). SMOD contains the actual enhancements and CMOD is the grouping of those SMOD enhancements.

User exits (Function module exits) are exits developed by SAP. The exit is implementerd as a call to a function module. The code for the function module is written by the developer. You are not writing the code directly in the function module, but in the include that is implemented in the function module.

The naming standard of function modules for function module exits is:

EXIT_<program name><3 digit suffix>

The call to a functionmodule exit is implemented as:

CALL CUSTOMER.-FUNCTION ❤️ digit suffix>

For Example:

The program for transaction VA01 Create salesorder is SAPMV45A

1. If you search for CALL CUSTOMER-FUNCTION program SAPMV45A you will find ( Among other user exits):



xvbak = vbak

xvbuk = vbuk

xkomk = tkomk


lvf_subrc = lvf_subrc


xvbfa = xvbfa

xvbap = xvbap

xvbup = xvbup.

The exit calls function module EXIT_SAPMV45A_003

2. How to find user exits

Display the program where you are searching for and exit and search for CALL CUSTOMER-EXIT

If you know the Exit name, go to transaction CMOD. Choose menu Utillities->SAP Enhancements.

Enter the exit name and press enter.

You will now come to a screen that shows the function module exits for the exit.

or use this ABAP program to search for user exits :-

Finding the user-exits of a SAP transaction code

3. Using Project management of SAP Enhancements

You want to create a project to enhance transaction VA01

Go to transaction CMOD

Create a project called ZVA01

Choose the Enhancement assign radio button and press the Change button

In the first column enter V45A0002 Predefine sold-to party in sales document . Note that an enhancement can only be used for 1 project. If the enhancement is allready in use, and error message will be displayed

Press Save

Press Components. You can now see that enhancement uses user exit EXIT_SAPMV45A_002.

Double Click on the exit.

Now the function module is displayed. Double click on include ZXVVAU04 in the function module

Insert the following code into the include: E_KUNNR = '2155'.

Activate the include program. Go back to CMOD and activate the project.

Goto transaction VA01 and create a salesorder. Note that Sold-to-party now automatically is "2155"


SMOD is just to see all the enhancements in the sap system.

CMOD is the customer projects where enhancements are implemented. If you want to implement any enhancements then you will create a project and assign the enhancement and do the coding in exits.

To customize an existing SAP application we have been provided the user exits by SAP. These exits are packaged under enhancements. You choose an enhancement according to your requirements e.g. enhancement MM06E005 is used for adding custom field in me21/me21n. SAP has limited no of enhancements for any transactions, you have to choose only from them to cater your requiement you cant create them.

After selecting your enhancements you have to inherit them in your project in CMOD. Thereafter you do coding and other things like making your subscreens or adding fields to standard tables in respective exits.

To see the effect of your whole project you must activate each componnents of your enhancements

User Exits.



When writing the user exit, take note of the following restrictions and considerations:

The user exit must be written in C.

The user exit must be reentrant.

Threads must not be switched within the user exit.

Multiple copies of the user exit can be invoked simultaneously.

The integrity of the CICS listener must not be damaged.

The user exit must not use EXEC CICS commands.

The supplied user exit prototype must be included in the user exit program.

The supplied exit-specific structure cics_UE115052_t must be included in the user exit program.

The supplied cics_UE_Header structure must be included in the user exit program.

The header structures and function prototypes are defined within the include file cicsue.h.

The entry point for all user exit programs is cics_UE_entry.

The user exit is called with two parameter structures:

A pointer to the cics_UE_Header_t parameter list

A pointer to the exit specific parameter list cics_UE115052_t

Care is required if using system calls from the user exit, because they can block execution of other listener threads.

No specific facilities are provided for handling errors in user exit programs. Any exceptions that are generated are caught, and the exit is disabled.

The exit must set a return code that is defined as being supported for the user exit. Otherwise, the exit program takes the default action, which can result in the user exit's being disabled.

No facilities are provided for accessing CICS resources within a user exit program.

Version numbers are provided on the two structures that are provided to the user exit. You must ensure that the user exit program checks the version number and uses the correct version of the structures.

A task work area is provided for sharing between user exit calls within the listener. You must ensure that no conflicts exist in the use of fields within this work area. The work area is initialized to zeroes before the first user exit call.

The length of the task work area is fixed at 128 bytes and cannot be changed.

Signal handlers must not be included in the user exit program.

The user exit is called with shared memory attached. You must ensure that the user exit code does not compromise the integrity of the CICS region.

The semistatic method of associating exit programs with user exits, based on the UserExitNumber attribute in the Program Definitions (PD), is also used for this exit. The exit number for the IIOP Security exit is 52 and the name is UE115052.

The PD UserExitNumber attribute is used as a generic method for associating a single program with a single user exit. The association is held as a table in the region control area (RCA). A user exit is regarded as active if it has a program associated with it. A user exit is regarded as inactive if no program is associated with it in the RCA table.

This relationship is passed to new processes when they are created. The exit is permanently loaded for the lifetime of the process. The IIOP listener is always running for the lifetime of the region, which means that the user exit must be defined before the region is started; it cannot be changed during the lifetime of the region. If a problem occurs during the loading of the exit at region startup, the exit is disabled for the lifetime of the listener.

The user exit UE115052 is invoked at the following times:



Listener IIOP request method invocation (UE_IIOP_REQUEST or UE_IIOP_SSL_REQUEST)

Figure 11 shows the structure that defines the security exit:

Figure 11. IIOP security exit data structure

/* Constants */

#define cics_UE115052_VERSION 1 /* All version number start at 1 */

/* Data Types */

typedef enum UE_IiopType /* Reason for UE invocation */








} cics_UE_IiopType_t;

typedef struct


cics_ushort_t UE_Version;

cics_UE_IiopType_t UE_IiopType;

cics_ubyte_t *UE_IiopBufptr;

cics_ulong_t UE_IiopBuflgth;

cics_char_t *UE_IiopBodyptr;

cics_ulong_t UE_IiopBodylgth;

cics_char_t *UE_IiopClassptr;

cics_ulong_t UE_IiopClasslgth;

cics_char_t *UE_IiopMethodptr;

cics_ulong_t UE_IiopMethodlgth;

cics_char_t *UE_IiopPrinptr;

cics_ulong_t UE_IiopPrinlgth;

cics_ulong_t UE_IiopIpaddress;

cics_ushort_ UE_IiopIpport;

cics_ubyte_t UE_IiopFlag;

cics_ulong_t UE_IiopMinor;

cics_char_t UE_IiopUser[cics_UE_USER_MAX+1];

cics_char_t UE_IiopTran[cics_UE_TRAN_MAX+1];

} cics_UE115052_t;

cics_UE_Return_t cics_UE115052(cics_UE_Header_t *UE_Header,

cics_UE115052_t *UE_Specific);

Descriptions of the variables taht are in this user exit data structure follow:

The UE_version field is the version number for this structure and takes the value that is defined in cics_UE115052_VERSION. It is advisable to check this in user exit programs to ensure that the version number that is passed when the user exit is called is the same as that which is contained in the cicsue.h file that was used when the program was generated. If a mismatch is detected, the contents of fields are unpredictable. The user exit program must be regenerated with the correct version of cicsue.h.

The UE_IiopType field identifies the reason why the user exit was invoked. This takes the following values:


The exit was called by the non-SSL listener at startup.


The exit was called by the non-SSL listener for an IIOP request.


The exit was called by the non-SSL listener at region termination.


The exit was called by the SSL listener at startup.


The exit is was called by the SSL listener for an IIOP request.


The exit was called by the SSL listener at region termination.

The UE_IiopBufptr field is a pointer to the IIOP request message buffer as received by the IIOP listener from the network. The buffer pointer starts with the IIOP value GIOP.

The UE_IiopBuflgth field is the length of the IIOP request message buffer as received by the IIOP listener from the network. It corresponds to the sum of the size of the IIOP message header plus the message size value from the IIOP message converted to this machine's byte order.

The UE_IiopBodyptr field is a pointer to the request body that is in the received IIOP message. This cannot be a pointer to the first element that is in the body because it possibly is a pointer to an alignment pad that is before the first element in the body. Only the marshaler of the elements that are in the body knows whether a pad exists. The user exit program uses the information that is stored in the UE_IiopBodyptr variable, the UE_IiopBufptr variable, and its knowledge of the method signature to determine whether a pad exists at this location.

The UE_IiopBodylgth field is the length of the request body that is in the received IIOP message.

The UE_IiopClassptr field is a pointer to the class name for the received IIOP message. The class name is determined from the object key that is in the received message.

The UE_IiopClasslgth field is the length of the class name.

The UE_IiopMethodptr field is a pointer to the method name and operation that are in the received IIOP message. The method has a null termination character.

The UE_IiopMethodlgth field is the length of the method name without the trailing null character.

The UE_IiopPrinptr field is a pointer to the requesting principal that is in the received IIOP message.

The UE_IiopPrinlgth field is the length of the requesting principal.

The UE_IiopIpaddress field is the IP address of the requesting client in the byte order of the host as a 32-bit field.

The UE_IiopIpport field is the IP port of the requesting client in the byte order of the host.

The UE_IiopFlag field is the byte order (or flags octet) from the received IIOP message. For consistency between GIOP 1.0 and 1.1, the least-significant bit indicates the byte ordering that is used in subsequent elements of the message. A value of 0 (zero) indicates big-endian byte ordering, and a value of 1 indicates little-endian byte ordering.

The UE_IiopMinor field is the field that is to return the minor code that is to be used in a Common Object Request Broker (CORBA) NO_PERMISSION system exception if the exit returns a value of E_NotAuthenticated. Currently, the ORB can return the value 0 (zero) on a NO_PERMISSION system exception.

The UE_IiopUser field is the user ID that is to be used to execute the requested method. The field is initially set to the configured listener user ID or the CICS default user ID if unset. The exit can modify this field to enable method execution under a different user ID. The modified user ID must have a user definition entry in the region database.

The UE_IiopTran field is the transaction ID that is to be used when the requested method is executed. The field is initially set to the configured listener transaction ID value or CPMI if unset. The exit can modify this field to enable method execution under a different transaction ID. The modified transaction ID must have a transaction definition entry in the region database. Standard CICS transaction and resource level checking apply to the returned transaction ID.

Return codes can be set to the following values:


Initial call only.


The request is authenticated; continue processing.


The request is not authenticated; reject request.

Any other return code setting from the UE_IIOP_INITIAL or UE_IIOP_REQUEST call is logged, and the exit is disabled for the rest of the region's lifetime. The return code setting for UE_IIOP_TERMINATE is ignored.

For UE_IIOP_REQUEST, the fields UE_IiopUser, UE_IiopMinor, and UE_IiopTran can be updated on return. Other fields can be updated. For example, the IIOP request message can be updated, because the data is not in write-protected storage. However, this practice is not recommended.

Reward Points if found helpfull..


Chandra Sekhar.

Former Member
0 Kudos

Code SE18 is used to Identify the BADI available.

Look for the string 'CL_EXITHANDLER' in the standard program. This is a class which has a method 'GET_INSTANCE' which is used to trigger BADI's from the Standard Program. The interface parameter for this static method 'EXIT_NAME' is used to pass the BADI to the method.

Open Standard Program and do a global search 'CL_EXITHANDLER'.

SE18 > give the BADI name found through above search.

CUSTOMER_ADD_DATA > which has a method SAVE_DATA.

T.Code SE19 is used to Implement BADI.

SE19 > give the implementation name > Give the Definition name as CUSTOMER_ADD_DATA and the Short Text.


Check these links for info about badi..



check any fo the below links. this will def help u.

And also download this file....

There are other tutorials on this site...

What are BAdIs?

-> is an anticipated point of extension – these points act like sockets and exist in the original source code

-> based on ABAP Objects. BAdI defines an interface that can be implemented by BAdI-implementations that are transport objects of their own

->Important! There are 2 roles: Enhancement Option-provider & Implementer.

-> In the above context, Enhancement Implementation can be done only if option (hook) is provided by the Option-provider. In simple words there are no implicit BAdIs.

Note: In the following slides, Definitions are created so as to understand the method of BAdI definition & for example purpose. As stated above this is the role of Enhancement Option-Provider.

Classic BAdIs already exist since SAP Release 4.6

BAdIs have been Re-implemented in ECC7.0 under the new Enhancement Framework & Switch Framework

Classic BAdIs

To understand what a powerful pattern a BAdI is, we will now define & then implement a BAdI

BADI Class is created automatically.

The various options are described below in detail:

1. Enhanceable: Enhanceability of filter types can only be specified for filter-dependent BADI definitions under very special conditions. For example, the domain belonging to the filter type must be linked with a value table that is of the type E or G. A BADI implementation can then be created in one step by creating a new filter value that is automatically entered into the value table at save and also copied into the transport order of the BADI implementation. In addition, it is also possible to create a new filter value and, at the same time, a BADI implementation with the same name. Naturally, you can also specify existing filter values.

You should select this feature if there is a prerequisite that a new filter value is created together with a new BADI implementation - that is, that BADI implementations are not created solely with existing filter values, although this, too, is possible.

2. Multiple-Use

3. Filter-Dependent

Instance Methods can access all of the attributes of a class and can trigger all events of a class. Static Methods can only access static attributes and static events.



Events can be defined in classes or in interfaces. Corresponding methods can trigger these events with the RAISE EVENT statement. Each class (or interface) that is going to handle the corresponding event must implement a relevant handler method, and register it using the SET HANDLER statement. When an event occurs, the system calls all of the handler methods registered for that event.

Like method definitions, events have a parameter interface. The only difference is that events may only have EXPORTING parameters.

BADI : Businees Add IN's

Business Add-Ins are SAP enhancement technique based on ABAP Objects.

Where the SAP standard program is not going to fullfill the client requirement , we are going to add our own program to SAP standard program, without changing the standard prog.

Each Business Add-In has

– at least one Business Add-In definition

– a Business Add-In interface

– a Business Add-In class that implements the interface

Each BADI has two different Views.

1.Definition view

2.Implementation view

T.C for BADI Definition is SE18.

T.C for BADI Implementation is SE19.

There are multiple ways of searching for BADI.


• Finding BADI Using SQL Trace (TCODE-ST05).

• Finding BADI Using Repository Information System (TCODE- SE84).

1. Go to the Transaction, for which we want to find the BADI, take the example of Transaction VD02. Click on System->Status. Double click on the program name. Once inside the program search for ‘CL_EXITHANDLER=>GET_INSTANCE’.

Make sure the radio button “In main program” is checked. A list of all the programs with call to the BADI’s will be listed.

The export parameter ‘EXIT_NAME’ for the method GET_INSTANCE of class CL_EXITHANDLER will have the user exit assigned to it. The changing parameter ‘INSTANCE’ will have the interface assigned to it. Double click on the method to enter the source code.Definition of Instance would give you the Interface name.

2. Start transaction ST05 (Performance Analysis).

Set flag field "Buffer trace"

Remark: We need to trace also the buffer calls, because BADI database tables are buffered. (Especially view V_EXT_IMP and V_EXT_ACT)

Push the button "Activate Trace". Start transaction VA02 in a new GUI session. Go back to the Performance trace session.

Push the button "Deactivate Trace".

Push the button "Display Trace".

The popup screen "Set Restrictions for Displaying Trace" appears.

Now, filter the trace on Objects:



Push button "Multiple selections" button behind field Objects


All the interface class names of view V_EXT_IMP start with IF_EX_. This is the standard SAP prefix for BADI class interfaces. The BADI name is after the IF_EX_.


3. Go to “Maintain Transaction” (TCODE- SE93).

Enter the Transaction VD02 for which you want to find BADI.

Click on the Display push buttons.

Get the Package Name. (Package VS in this case)

Go to TCode: SE84->Enhancements->Business Add-inns->Definition

Enter the Package Name and Execute.

Here you get a list of all the Enhancement BADI’s for the given package MB.

Have a look at



Rewards if useful.

Former Member
0 Kudos

SAP have some standard functionality and related code which is provided through SAP suit and written in a language called ABAP.

The standard programs starts with any other letter except 'Y' and 'Z'. 'Y' and 'Z' are for customised programs.

Now, various client wants to modify the sap standard functionality to make is more useful and efficient to relate their buisness. This is done through customizing SAP standard functionality.

Now, if we modify the standard SAP code then that part will get overwritten during upgradetion. SAP do not take care of those modification. So, to avoid such problem SAP came out with a solution called user exit. These are like hooks in the standard codes. When upgrade these hooks ( user exits) remain uneffected.

There are certain technical approach for modifying the standard code like: user exits, customer exits, BADI etc. Now all of these brought under a umbrella called enhancement framework.