SAP Solution Manager Development has received many customer requests to add new object types to the tabs of transactions SOLAR01, SOLAR02 and SOLMAN_DIRECTORY. Although we have added some new object types, we could not satisfy all requests, because of the development effort required for each new type. Some customers also wanted to hide object types they did not use in their projects.
With support package 9 in release 7.0 and ST-PI 2005_1_700 SP3 in the satellite systems a dream comes true for all our customers: We have encapsulated the object type functionality so that customers with basic ABAP development skills can extend it for their own needs. You can now add or hide object types to the Type value help.
This includes full support for navigation, reporting, where-used list, history, blueprint and configuration guide generation, copying, comparing etc. as for any standard object type we ship. This can be done for the tabs “Transactions”, “Configuration” and “Development”.
As of SP15 you can implement note 1302204 that allows you to add new types on the Development tab and to create new ones. It will be part of the standard in EHP2. With the implementation of this note in the Solution Manager system and
the managed systems, you will receive a new enhancement spot SA_TYPES_ON_DEV_TAB that and some implementations of new development objects that add the following new object types to the development tab:
- XI BAdi Implementation (for classical BAdIs)
- ENHO Enhancement Implementation
- SFPF Form (Adobe)
- TABL Table (Database Tables)
- WDYA Web Dynpro Application
- WDYN Web Dynpro Component/Interface
These new object types behave exactly as the existing ones on the tab. They can be added directly by typing into the ID field or using the value help there. They support also multiple value selection in F4. Implementing a further development object type that is fully supported by the Object Navigator framework of the Development Workbench (SE80) is possible in less than an hour of time since it requires only the implementation of the enhancement spot SA_TYPES_ON_DEV_TAB in the Solution Manager system and no custom developments in the managed systems. How to find out if an object type is fully supporting the Workbench Framwork and how it can be implemented is described in section “Adding Object Types to Dev Tab” below.
The entry point for this customizing is the SAP Solution Manager IMG. Call transaction SPRO and push button “SAP Reference IMG”. Expand SAP Solution Manager – (Advanced Configuration) – Scenario-Specific Settings – Implementation – Tabs – Tab Extension. Here you find the activities “Tab Page Extension” and “Reduction of Object Types on Tab Pages by BAdIs”.
If you have never implemented a BAdI before, you should read the blog How to implement a BAdI And How to Use a Filter – Part 4 of the Series on the New Enhancement Framework, ignoring the part about filters that is not required here.
Let’s start with the second BAdI, to reduce object types as a warm up.
Reduction of Object Types on Tab Pages by BAdIs
Assume you want to hide the object type ‘eCatt Test Configuration’ from the Configuration tab, on all types of nodes in projects and solutions. Access the BADI_SA_HIDE_TYPES_ON_TABS, as described above, via the IMG, or call it directly via transaction SE18. Now read the IMG description (or BAdI documentation, and click on the Execution icon of the activity. Choose the button “Create Implementation” in the pop-up window displayed. Enter a descriptive name for the “Enhancement Implementation”, e.g. “z_hide_ecatt_on_config_tab” and a corresponding short text. Choose a package and a transport request. In the next screen, specify a name for the BAdI Implementation, e.g. “z_hide_ecatt_on_config_tab”. Now go to the tab “Enh. Implementation Elements”, choose the “Implementing Class” node in the hierarchy and enter a class name in the field “Implementing Class”, e.g. “z_hide_ecatt_on_config_tab”. Press Enter. Answer the question “Class does not exist. Do you want to create the object?” with “Yes”. Double-click on the class name to navigate to your class. When you are prompted to save, save your work. Now you should be in the class builder for your new class and can edit it’s method IF_SA_HIDE_TYPES_ON_TABS~CHECK_TYPE. Go to change mode and double-click on it. To test it, generate everything you have done so far and set a break-point at the “endmethod” statement. Now when you start transaction SOLAR01, SOLAR02 or SOLMAN_DIRECTORY, you should stop at this break-point. If not, check that your BAdI implementation is in state active (an active flag needs to be set at the BAdI implementation, as well as generating the developments). When you stop at the break-point, you can check what parameters need to be passed to your BAdI. The BAdI is called once for every type. Depending of the parameters, you can return the flag “hide_type”. For the Config. tab in a project, you might see the following values for the parameters of the BADI, after pushing F8 a few times.
How do you tell which is the object type you want to hide? How do you know eCATT is object type ECTC? Here’s the trick: Click Alt+F12 and choose “Options…” and the “Expert” tab. Check “Show Keys in All Drop-Down Lists”.
If you want to hide this eCATT type, put the following code into your implementation:
The object type ECTC will be hidden when you restart the transaction. You can limit this hiding to certain tabs or projects or solutions. If you don’t want to hide the type in Directory you can check whether SOLUTION_ID is initial. By checking the node type you can limit hiding to specified node types, e.g. configuration structure or scenarios nodes. The following code would only hide ECTC for scenarios in projects (not in Directory):
Adding Object Types to Role Tab
You can add additional existing HR object types e.g. position to the role tab simply maintaining mainenance view V_SAROLECUST in transaction SM30.
Adding Object Types to Dev Tab
Before you can start adding new object types you need to imlement note 1302204
with transaction SNOTE in you solman and satelite systems. After the implementation you will find the new object types
- XI BAdi Implementation (for classical BAdIs)
- ENHO Enhancement Implementation
- SFPF Form (Adobe)
- TABL Table (Database Tables)
- WDYA Web Dynpro Application
- WDYN Web Dynpro Component/Interface
on the dev tab. If you want to add further development workbench objects on the tab you should first check if the prerquisites are fulfilled for that:
- Find out the transport or TADIR object id. This is maximum 4 digits long and can be displayed from almost every editor via menu “Goto – Object directory entry”. If you don’t find it change or create a new object and look at it’s object type ID in the transport order.
- Call transaction SE16 for table EUOBJ and enter this ID into field ID. Check if you find an entry.
- Call transaction SE16 for table WBREGISTRY, enter the TYPE found in EUOBJ into field TYPE and check if you find an entry. If you don’t you will not be able to navigate to the apropriate tool for this object type from the tab to display it using the workbench framework. In this case you should give up this approach and continue with the next chapter “Adding Object Types to Tabs by BAdI”.
- Check if your new object can be found in the Repository Info System (SE90). If you don’t find it there look for a search help. You often find a search help in the maintenance transaction on the ID field. The name of the search help can be found with F1 on the field and then button “Technical Information”.
If you are successfull in all three steps you have a 90% chance to implement the object type in just a few minutes work. If you do not find a value help, it is still possible to use the object for manual entry and for navigation.
To implement the BAdI go to SE18, enter Enhancement Spot SA_TYPES_ON_DEV_TAB and push display. You should first look at some existing implementations to understand what you have to do.
Start with looking at SA_TYPES_ON_DEV_TAB_WDYN, that implements the object type WDYN Web Dynpro Component and is also the sample implementation to copy from. The TADIR object type is WDYN to explain the name. The implementating code looks like this:
You just need to fill structure l_object_type and append it to table object_types. At runtime this Implementation is called for each type until all object type definition data are in that table.
In the field obj_type you enter the transport or TADIR object type.
In field ddic_type you enter the name of the dataelement that is used for maintaining the object ID. You find it in the maintenance transaction on the ID field. The name of data element can be found with F1 on the field and then button “Technical Information”.
in field text you add the name for the type. Don’t forget to doubelclick it to update the text symbols.
In most of the cases you are done with these few steps. So here are the exceptions: If the object type is not supported by the repository info system you have two options: Either you set no_f4 = ‘X’, then of course there will be no value help available or you set the name of the search help you found in field search_help. An example for this is the imlementation SA_TYPES_ON_DEV_TAB_SFPF. In implementation SA_TYPES_ON_DEV_TAB_XI the field selection_variant is filled, since the Repository Info System function module REPOSITORY_INFO_SYSTEM_F4 needs to be called with a parameter variant for this object type, which is a quite exotic case.
Still you may find object types that are not fully supported by the workbench framwork, E.g. CMOD projects or SMARTFORMS. You can add them, select them but you can’t navigate to them because there is no entry in WBREGISTRY (and of course no implementation!).
Adding Object Types to Tabs by BAdI
Now let’s have a look at the first IMG activity “Tab page extension”. Here you have two options:
- Add an object type that is already implemented but currently not offered in the object type F4 help on the tab where you want to use it. For example, you could add the type Web-Dynpro for ABAP Applications on the Development or Config. tab
- Add an object type that is already implemented but is currently not used on any SAP Solution Manager tab. For example, you may want to add the type Role (BMSO_PFCG_ROLE) to the Configuration tab, to centrally administrate PFCG roles in your satellite systems. Basically you can add any objects in the Easy Access menu (the first thing you see when you enter an SAP system) by choosing Ctrl+Shift+F7 (The “Role” type is hidden there by default.)
- Add any object type from that list to any of the tabs Transactions, Configuration and Development. For example, you could add the object type Dictionary Table. We come to this later.
Let’s now go through what you have to do to add an existing object type step by step:
Add an existing object type to another tab
If you want to use the type “Web Dynpro Application” on the “Configuration” tab as well as the “Transactions” tab, you need to implement the BAdI at the above-mentioned IMG activity “Tab Page Extension”,or via SE18, under the name BADI_SA_OBJECT_TYPE_ACTIVATION.
Go ahead as you did with BADI_SA_HIDE_TYPES_ON_TABS. In this case you will get a pop up asking you:
Sample classes specified for BAdI definition
- Create a new empty class
- Copy one of the sample classes
- Inherit from a sample class not declared as final.
Select the example CL_EX_OBJECT_TYPE_ACTIVATION and push the button “Copy Sample Class.” Then navigate into the generated method. You should see the following parameters and code
This is sample code that has changed with SP17. When you activate it, the behavior in SAP Solution Manager will immediately change: You will see a new type, SAPSCRIPT, on the Transaction tab. This is an object type used in the Easy Access menu, but not in SAP Solution Manager by default. Compare it with the fall-back implementation in CL_SA_OBJECT_TYPE_ACTIVATION, which is the standard code that is active when no BAdI has been implemented. You can find the TAB_NAME and NODE_TYPE by debugging. The OBJECT_TYPES passed to this method are the complete list of object types you can use (see the next chapter to extend that list). Most of them are in the Easy Access menu value help (see above). When you test them you will find that, some of them do not seem to work. In this case it doesn’t help much asking me. Instead you can create a customer message and ask if the function modules need any specific customizing or parameters to work. Table URL_EXITS tells you which function modules implement each object type and where they originate. Now coming back to our example activating the web dynpro object type, you need to remove the SAPSCRIPT object type if you don’t want it, and add WDY_APPLICATION to the TAB_NAME CONFIG. Respond to the three comments:
* activate selected object types
* describe the maximum lenght of the concatenated URL of that URL type
* determine which object types should be called in remote system via rfc
In our example:
- Activate WDY_APPLICATION for the Transaction and Config tabs.
- Set the maximum length of the URL to 255 (longest possible value). For other object types you should use the key length here.
- Determine that the object type is to be called in the satellite system. The logical component field will then be enabled for the object type. Otherwise it is gray, and all objects are created in the SAP Solution Manager system.
Our coding looks now like this, and the job is done:
I have split up the activation and the setting of the maximum length for clarity. You may wonder why there is a check for tab_name IS INITIAL. This is to get the object type in value helps outside tabs, e.g. in reporting. You may also wonder why we need an additional BAdI to hide object types when we could deactivate them here, but this only works for the “Other objects” from Easy Access which we use, not for the hard-coded object types on our tabs. To hide those you need the BAdI BADI_SA_HIDE_TYPES_ON_TABS.
As of SP17 the behavior will change slightly so that you will always see your self defined object typs plus the SAP defined. So you will never miss new object types SAP delivers by default with an upcoming support package. However this implies that you must hide all SAP standard object types that you don’t want to see impelmenting BAdI BADI_SA_HIDE_TYPES_ON_TABS. Also as of SP17 the BAdI definition allows multiple implementation of the BAdI.
Play around with this and activate some more (or all) object types on the Development tab, or go straight to the last chapter.
Add a completely new object type
Now we want to enhance the existing functionality dramatically, for example by adding the object type “database table” to the Development tab. Unfortunately you won’t find such object in the Easy Access menu or in the table URL_EXITS. Adding a type using SM30 alone won’t help. You need some function modules to provide value help and navigation capability. And if you want to assign objects in the satellite systems, you need these functions and the URL_EXITS entry, in each of those systems. Luckily you need to build this only once in one satellite system and can transport it to all other systems later. This is not a modification of the satellite systems, just an enhancement. If you define the interfaces of your function modules as described here, they will work even down to a 4.6B release satellite system (requires 4.0 SP10 or note 1007462 in the SAP Solution Manager system). Now here is what you exactly have to do:
First of all you need to find an existing value help and (if required) a navigation functionality that you can use. In our example, you want to select a DB table from the Data Dictionary of the satellite system, and you want to be able to navigate to that development object. To find it you first need to get some knowledge of the standard functionality. You will find that there is a value help for tables in SE11 and in SE90. In the list provided by SE90, you can navigate to a table. Now you have to find out how this is implemented. For the value help, first check if there is a search help available. Push F1 on the field, and then go to “Technical Info”. Check whether there is a search help attached to the dynpro field and the data element. If so, you can call it as I called the PFCG role search help in the function module /SDF/BMSO_PFCG_ROLE_CREATE. But unfortunately for tables you won’t find a search help. In this case you need to debug the value help with /h. Set a breakpoint at statement “CALL FUNCTION” and step through all the function calls you find. With this method you will probably find what you are looking for. In our example, you’ll find the function module ‘RS_DD_F4_OBJECT’. Unfortunately it doesn’t return the table text. If you want that, you need to either continue searching, or find a function that reads the text of a table. The same debugging procedure works to find a navigation function module. In our example this is ‘RS_TOOL_ACCESS’.
Second you need to decide whether to build your prototype in the SAP Solution Manager system or in your satellite system. In the first case you need to maintain table URL_EXITS and the function modules in the SAP Solution Manager system only. In the second case you need the table entry in both systems and the function modules in the satellite system. If you decided create the entry using transaction SM30. You need to enter a function module name for “Create a node”, “Change a node” and “Call a node”. With “Availability of type” you can hide your new type from the Easy Access menu, as in /SDF/BMSO_PFCG_ROLE_AVAILABLE. This is optional. All other function modules are not called by SAP Solution Manager.
Implement the BAdI as described above, to see your new type in the value help where you want to add it. You can copy them from the /SDF/BMSO_PFCG_ROLE* function modules or create them manually with the parameters described below (If you copy then from other function modules in the URL_EXITS table, they may not run in all releases!).
Sample for the create module:
The change function looks the same but has the following parameters:
It is good practice to encapsulate the value help in a form and use it in both functions as in /SDF/BMSO_PFCG_ROLE_CREATE and /SDF/BMSO_PFCG_ROLE_CHANGE.
Fourth you need to test this. If you get the error message SOLAR241 that tells you to implement note 951018, when you test the navigation, implement it using transaction SNOTE.
Fifth you need to transport your development to every satellite system in which you want to use it.
You have now finished this project. Congratulations! If you have any additional questions or issues, you can raise them in the following section.
What Happens With Custom Object Type in Content Activation from 7.1 to 7.2?
In Content Activation also custom obect type assignments get migrated.
If there are customer BAdI implementations of BADI_SA_OBJECT_TYPE_ACTIVATION the element type “Extra Navigation Object” will be visible also for creation of new elements. Basic navigation services are supported but not guaranteed. The SAPgui value help cannot be called from Web Dynproand the Dynpro based create and change function modules of table URL_EXITS cannot be called anymore in 7.2. for technical reasons.
Customer BAdi imlementations of BADI_SA_TYPES_ON_DEV_TAB are migrated to element type “Extra Workbench Object“. Basic navigation services are supported but not guaranteed. The SAPgui value help cannot be called from Web Dynpro for technical reasons. However with this new generic element type you can add all kinds of workbench objects without need for a BAdI implementation.
As of SP05 we offer an additional generic element type which you can use for all kind of SAP and non-SAP cloud services. It should replace the simple URL type. In type URL you can use place holders for severs etc. within <> brackets maintained in maintenance view SSM_VAR. The drawback is here that these parameters are global. They do not react on selected branch, system role and site context. Therefore we have the new “Custom URL” type. If you want to use it you need to define subtypes of this generic type. This is done again by a BAdI SMUD_EXECCUSTLOGCOMP. The customizing of a new Custom URL sub type is explained in SOLMAN_SETUP – Process Management – Configure Solution Documentation Model.