1

Custom error message for PM Order Components (iw31/iw32)

 1 year ago
source link: https://blogs.sap.com/2023/01/03/custom-error-message-for-pm-order-components-iw31-iw32/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Searching User Exits and BADI

In this blog, we will look at another way to debug and find a place to enhance custom error message. Also, I am going to explain the problem we faced and the solution to it.

P.S You can read my previous blog about the enhancement for Fiori.

Problem: The customer wants to get the error message when the user tries to modify any components of the order.

Clarifying the problem: in SAP GUI run t-code IW32 -> enter test order -> and click on Components

image8-10.png

So, if the user is not in set ZUSERS and the order type is ‘PM01’, in this case, the user shouldn’t modify the components and get the error message with the text “You are not authorized to change order components! For further information contact authorized staff.”

For solving this problem, first, we are going to find an enhancement point for this screen. We start with searching BADIs.

Method for finding BADI:

Run t-code SE24 and display class CL_EXITHANDLER -> set a breakpoint on method get_class_name_by_interface in class-method GET_INSTANCE – because of this breakpoint, we’ll be redirected to the debugger screen when we click/run any button/t-code. Just press F8 to continue.

image3-9.png

-> Go back and run t-code IW32 -> Enter test order and open Components -> On item line add a new component -> In debug screen open exit_name value – this is a BADI for Components screen. (IWO1_ORDER_BADI) If we continue with F8 exit_name will be changed to W_RETAILSYSTEM_IDENT. It means we can implement both of these BADIs for controlling components.

image9-8.png

To make sure that one of these BADIs is relevant to our problem we have to look through the methods of BADI and the import/export parameters of the methods.

image2-9.png

For instance, in this BADI (IWO1_ORDER_BADI) there is AUTHORITY_CHECK_AUART_ACTIVIT which looks relevant according to its import/export parameters. But when we implement this BADI, the result of this implementation is if the user is not in ZUSERS, then the user won’t be able to even open the order. So that’s why our implementation won’t be successful. And we have the same situation in W_RETAILSYSTEM_IDENT BADI. That’s why we cannot write the error message in this BADI too.

Another method to find BADI is searching BADI using CALL BADI statement in debugger. After setting a breakpoint at statement ‘CALL BADI’ we reach the other two BADIs but according to their parameters we cannot implement these BADIs for our problem.

Because of unsuccessful implementation in BADI, we are going to search for User Exits to enhance for Components screen.

One of the ways for finding user exits is by searching exits according to their package. First, find the package of Components screen: in Components screen click on System -> Status -> double click on Program (Subdynpro) name – you can find the package name from program Attributes.

image5-11.png

Go to SE84 and open: Enhancement -> Customer Exits -> Enhancement – execute package of Components screen. The list of user exits and their description will be displayed.

image6-7.png

Through the package, we reach limited user exits and none of them is relevant to our problem. That’s why we explain below another method for finding user exits.

In Components screen turn on the debugger with /h and add any component. In debugger screen set a breakpoint at statement CALL CUSTOMER-FUNCTION.

image11-6.png

Then continue with F8 and you will see the codes below:

image13-5.png

While you continue with F8 you will see a function module with different parameters and id. For choosing the right user exit for our solution, again, we have to focus on the user exit’s parameters. For example, this exit which is shown above picture doesn’t have parameters for the error message or exception. So, we continue with F8 until we find the exit with relevant parameters.

During debugging I found these two user exits (mentioned below pictures) which look relevant according to their parameters. After finding the user exit place, our next step will be finding their name and project.

Tips: while debugging for user exits, if we click F5 to see what code is inside the user exit. If it is redirecting to include of exit it means this exit has already been implemented and has been assigned to any project, and if it’s not redirecting to the include it means it’s not implemented.

image14-1-1.png
image15-1-1.png

In our system, none of these user exits has been implemented and we are going to find exit name for assigning it to the project.

In t-code SE80 open include shown picture and search for user exit id (011 or 014). We will continue with user exit with id 011. Enter to function module with id ‘011’ to see the code inside.

image12-6.png

Take the function module name and execute table ‘MODSAP’ in t-code se16. ‘MODSAP’ is a standard table that contains user exits’ names and members. In the selection screen, paste the function module name to the Member field and execute.

image1-9.png

This is the user exit name that we are going to implement. By using MODACT table we can find out if this user exit has been assigned to any project.

So, in t-code CMOD we can create a project and assign user exit to it. User exit will be activated when it is assigned to the project. After assigning we can write a custom error message in the include ZXCN2U13. The code is below:

image10-8.png

So, we used the exit’s import/export parameters and POPUP_FOR_INTERACTION standard function module for getting the popup.

After activating the include, function module, and project we can test it now.

image4-7.png

All is done!

Conclusion: using these methods we can find BADI and User Exits in any standard screen and implement them. While choosing BADI or User Exits just focus on its import/export parameters and when it triggers. Because if we implement the wrong BADI or User Exits it’s not going to work and even if we write the code correctly.

Hope this will help to solve the problem you faced. You can share your thoughts about the topic in comments.

P.S. All of the pictures in this blog have taken by me from our demo system.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK