Transport Tracking Made Easier in SAP
This blog will help in understanding the concept of transport request attributes and how it will help in transport management. This will help in achieving good governance of transport requests in big SAP implementation projects.
Pre-requisite: Basic knowledge of SAP transport request.
Transport requests are used to transfer the changes done to existing objects or new objects created in the development system to quality and then finally to production system.
Production system has real and confidential data, hence while importing transports to production system transport requests needs to be verified correctly. Any mistakes in transport list can hamper existing functionality which intern will cause in change backout and development failure.
The order in which transports should be imported to production needs to be same as per the sequence they were moved in Quality/Acceptance system.
In big SAP implementation projects which are having more than 100 transport requests created by developer / functional, there will be more chance of missing transport request in final list of production. If any transport is missed in the production list, there are several possible risks involved.
Other factors involved are number of developers working on the same project, developers working on the same objects , transports which are being moved in case of production bug fixes and multiple projects being run in single environment.
- Possible risks if transport is missed in the production list:
1. Wrong object versions can go to production: If there are multiple transport requests for one object and one of the transport requests is missed during production move, then this will lead to incorrect version of the object.
For e.g. for report program ‘ZTEST’ one transport request ‘AB123’ was created and moved from DEV system to Acceptance system. Later on there was a defect detected in Acceptance testing.
Then to fix this defect again new transport request ‘AB456’ was created and moved to Acceptance box. Now while preparing the production transport list for program ‘ZTEST’, latest transport request for defect fix ‘AB456’ was missed. Then incorrect version of program ‘ZTEST’ will go to production system and same defect which was already fixed in acceptance testing will remain unfixed as it is.
2. Possibility of RC8 Error during transport movement to production: If any transport of dependent object is missed in the final list of production movement then transport movement will result in RC8 Error.
E.g. there are 2 transport requests one is for table and another is for data element which is used in table. Both table and data element are new objects and does not exist in production before transport movement.
Now while preparing final transport list for production movement if transport ‘AB1234’ for Data Element ‘ZDTELE’ is missed then while moving transport request ‘AB5678’ (i.e. for table) RC8 error will occur.
Hence transport movement will end up with error and intern will need analysis on transport failure. Again for missing transport request separate change management process will be required to move transport to production.
Above mentioned are major risks during production transport movement and may cause HUGE BUSINESS IMPACT.
To avoid such issues because of simple mistakes, good transport management and tracking is needed in projects.
- Steps for better transport management and tracking:
o Create custom transport attribute.
o Maintain custom transport attribute for each new transport request for specific development before releasing it. Hence the entire transport list related to development will have attribute maintained.
o Fetch the list of transports from E070A table where attribute name = custom attribute name.
o This result will give complete list of transport requests for which custom attribute was maintained.
o This will avoid human error of missing any transport request in production transport list.
o Transport attribute maintenance check can be enforced for specific projects. E.g. In development environment multiple projects are being run and if we want to make transport attribute maintenance mandatory only for our project then this check can be performed specific to project ID by implementing method ‘CHECK_BEFORE_RELEASE’ of BADI “CTS_REQUEST_CHECK”.
o Once this check is implemented developer/functional will not be able to release transport request without maintaining transport attribute.
o Hence at the time of production move list of transports for specific development can be fetched from E070A table where transport attribute value =’XXXXXX’.
- Scenario for how attribute maintenance will help in better management of transports:
In single project there are multiple developments going in parallel. Each development will have separate requirement specification document with unique number of requirement document.
Below is example:
Project Name: Project1
Now under project1 there are multiple developments executed,
Requirement Spec. Document number
Now if we create a custom transport attribute ‘ZREQ_DOCNO’ for maintaining requirement specification document number.
Then while creating transport requests for development (i.e. DEV1), maintain transport attribute ZREQ_DOCNO = ‘R1111’ (which is req. spec. doc. Number for DEV1).
Now if there are total 40 transport requests were created for DEV1 then list of transports can be fetched from “E070A” table where TRANSPORT ATTRIBUTE =’ ZREQ_DOCNO’ and ATTRIBUTE VALUE = ‘R1111’.
This data fetch from E070A table will give complete list of transports created for DEV1 and there will not be any miss in transport list.
Also this transport request maintenance can be made mandatory based on project ID by implementing BADI.
Transport attributes creation and BADI implementation is explained in detail further.
- How to create Transport Attribute? We can create custom transport Attributes (Z-attribute) for easier project level transport tracking. This custom transport attribute can be maintained, so that we can find specific development transports according to custom Transport Attribute values. You can use attributes to define change requests. Also using these Attribute values, we can perform transport analysis.
- Steps for creation of TP Attribute:
1. Go to transaction SE03 (Transport Organizer Tools).Select Display/Change Request Attributes option.
2. 2. Click on ‘Create’. New pop-up window will appear.
3. Now enter the respective values for new custom Attribute:
Attribute: Enter the Attribute name for i.e. “ZREQ_DOCNO”
Short Description: Enter Short description “Project1 Transport Attribute”.
There are 3 options which need to be selected according to purpose of this attribute:
1. Attribute Value Obligatory: This specifies whether the attribute can only be assigned with a value. If it is essential that value should be specified for the attribute, then select attribute value obligatory.
2. Attribute Assigned Externally: If this field is selected, the attribute is assigned using external interfaces only. You can then no longer add this attribute to a request, or delete it from a request. Mostly this option will not be used as we need to track transport requests in SAP.
3. Attribute can only be assigned once for Each Request: If this field is selected then you can only assign this attribute once for each transport request.
We can also make these attributes mandatory to specific development client by mentioning client specific settings.
So here we will select option 1 & 3 to create custom attribute: then SAVE.
Now new attribute “ZREQ_DOCNO” will be available for maintenance through SE01.
- How to maintain transport attribute?
1. Go to SE01. Display transport request.
2. Go to properties tab of transport and enable change mode.
3. Attribute “ZREQ_DOCNO” will be available for maintenance in attribute list.
4. Select the attribute and enter the value for the attribute e.g. If we are creating transport request for DEV1 and requirement document number
for DEV1 is “R1111” then we can maintain attribute having same value.
We can define Attribute value such as some unique number for each Development for e.g. Design Document number will be different for each development. If we maintain transport attribute value “R1111” (i.e. Requirement Doc. Number) for all transport requests specific to one of the development i.e. DEV1, then it will be easier to track all the transport requests related to DEV1 for production movement.
So there will not be any chance of missing any transport request during production movement of the development.
We can find out the list of transport requests having specific attribute value From E070A table:
This selection will give list of transports for which Attribute “ZREQ_DOCNO” is maintained with value “R1111” e.g. if there were three transport requests created for DEV1 so this selection will give all the three transports in output.
This way we can identify all the transports for specific project or development. Risk for missing transports in the list during production movement will be minimized to great extent.
But there can be a miss, if somebody forgets to maintain attribute for transport request before releasing the request, then what will happen?
Still we will not be able to track that specific transport request for which attribute was not maintained.We can make this Transport Attribute Check mandatory based on few conditions.
Many projects use intelligent naming conventions for Transports. For example Project ID is mentioned in Transport request description or Design Document number is mentioned in Transport description.
Now if we make Transport Attribute maintenance mandatory, it will be mandatory check for all projects in specific development box. We can make this check obligatory project-ID specific.
- How to automate the process of Transport Attribute maintenance?
The transport attribute maintenance can be made mandatory project specific by implementing BADI “CTS_REQUEST_CHECK”.
CTS_REQUEST_CHECK: This BADI has multiple methods through which various checks can be implemented for transport requests. Method ‘CHECK_BEFORE_RELEASE’ is called before a transport request is released transport request through SE01 transaction.
By using this method we can implement our own check related to transport request:
1. 1. Check attributes and short text of transport request.
2. 2. Objects included in transport request.
BADI implementation steps:
Transport request attribute check can be implemented specific to project or according to the short text of transport request. E.g. In development environment , if currently multiple projects are run i.e. Project1,Project2,Project3……Project(n) and we want to make transport attribute maintenance mandatory only for our project (i.e. Project1) which will help in better transport tracking.
In such scenario, we can make TP attribute mandatory for specific project by implementing BADI check.
Many projects use intelligent transport naming conventions (transport request short text). E.g. Transport request description contains PROJECT ID and based on which we can make this attribute check mandatory.
E.g. TR1234 (Transport Request) -> DEV: Project1:SE38_ZTESTPROGRAM (Short text)
Now while releasing the transport request TR1234, we can check if transport request short text/description contains our project ID i.e. Project1 in this case. If yes, then check if transports attribute “ZREQ_DOCNO” is maintained for TR1234. If NO, then throw error ‘Please maintain required attribute’, while releasing the request through SE01.
We can maintain configuration for which project ID which transport attribute should be maintained, so check can be made dynamic.
1. 1. Create custom table ‘ZATTRICHECK ‘having 2 fields Project ID and Transport Request Attribute.
2. 2. Maintain ‘ZATTRICHECK ‘table with Project ID (i.e. project which will be present in Transport Request short text) and Transport attribute which
needs to be checked for particular project ID.
So for below example, if Transport short text contains “Project1”, then by implementing BADI check can be performed to see whether “ZREQ_DOCNO” attribute is maintained or not while releasing the transport request.
3. BADI Implementation Steps:
- Go to transaction SE19 and create BADI implementation for classic BADI “CTS_REQUEST_CHECK”.
- Implement method CHECK_BEFORE_RELEASE.
- Source code implementation:
1.First check if transport request is “Higher-Level Request”, if transport is Higher-Level then only Attribute check should be performed.This check can be performed by querying E070 table.
2.If transport is higher level, then fetch Project ID and Transport Attribute from custom table ‘ZATTRICHECK ‘into internal table.
3.Fetch transport attributes maintained for the current transport request from E070A table.
4.Check if transport request short text for Project ID in custom table ‘ZATTRICHECK ‘. If short text contains Project ID which is in custom table,then perform further check for transport attribute.
5. Check if custom table TP attribute present in Attributes fetched from E070A table for this transport request.
6. If transport attribute is not present then populate the error “Please maintain required attribute”.
- Implementation Source Code:
*$*$ PROGRAM ID : ZCTS_REQUEST_CHECK *
*$*$ TITLE : BADI Impl.to check Transport Attribute *
*$*$ AUTHOR : SANJANA LINGRAS *
*$*$ DESCRIPTION : BADI implementation to check if required *
*$*$ transport attribute is maintained before *
*$*$ release of TP. *
TYPES: BEGIN OF y_tpchk,
zprojid TYPE zattricheck-zprojid,
ztpattri TYPE zattricheck-ztpattri,
END OF y_tpchk,
BEGIN OF y_attri,
ztkorr TYPE e070a-trkorr,
zattri TYPE e070a-attribute,
END OF y_attri.
DATA : t_tpchk TYPE STANDARD TABLE OF y_tpchk,
t_attri TYPE STANDARD TABLE OF y_attri.
DATA : w_request TYPE e070-strkorr,
w_result_tab TYPE match_result_tab,
w_flag TYPE string.
FIELD-SYMBOLS : <fs_tpchk> TYPE y_tpchk,
<fs_attri> TYPE y_attri.
FREE : t_tpchk,
SELECT SINGLE “Check whether TP is higher level request
WHERE trkorr EQ request.
IF sy-subrc EQ 0
AND w_request IS INITIAL.
SELECT zprojid “Fetch proj.ID and attribute from custom table
INTO TABLE t_tpchk.
IF sy-subrc EQ 0.
IF t_tpchk IS NOT INITIAL.
SELECT trkorr “Fetch Attribute for current transport request
INTO TABLE t_attri
FOR ALL ENTRIES IN t_tpchk
WHERE attribute EQ t_tpchk-ztpattri
AND trkorr EQ request.
IF sy-subrc EQ 0.
LOOP AT t_tpchk
“Check if transport short text contains project ID which is maintained in custom table.
FIND ALL OCCURRENCES OF SUBSTRING <fs_tpchk>-zprojid IN text
IF sy-subrc EQ 0
AND w_result_tab IS NOT INITIAL.
READ TABLE t_attri
WITH KEY zattri = <fs_tpchk>-ztpattri
IF sy-subrc NE 0 “If attribute is not maintained then throw error
AND <fs_attri> IS NOT ASSIGNED.
“Populate error message with Attribute Name
4. 4. BADI Implementation Result: If developer or functional tries to release transport request without maintaining required transport attribute error will be thrown. User will not be able to release request without maintaining attribute for our specific project.
This way we can eliminate the risk of missing the transport in final transport list for production.
- Benefits of Transport Tracking:
1. Eliminate the risks: Proper transport tracking will reduce potential human errors in preparing final transport lists.
2. Save efforts of change management: If transports are managed properly within the project then it will reduce the burden of change management which is required for missing transports movement.
3. Cost benefits: It will reduce the cost which is required for extra change management efforts and rework on transports.
4. Less Rework: Production transport movement will be smoother and no rework will be needed for analysis of issues or errors.
Before moving transport list to production it is always a good idea to recheck the list.
Preventing transport movement issues and risks before production move is always better than solving them after production move.
Keeping the transport list clean and simple will prevent lot of issues arise later on 🙂
Very detailed and informative blag. Keep it up.
Nice Blog with a lot of things not knowen to me.
Looking at transports i always ask myself why are so few people are working with tasks? This would eliminate things like domains and tables in different transports. If the domain transport is forgotten, you will get an import error, but if those transports are go in in wrong order you wil have an import error as well.
Thanks for your feedback. Once you get the complete transport number list,
we can check table E070 in Quality system. We need to sort TP numbers by date and time in E070 table.
Then this same sequence can be referred for production move which will not have RC8 errors in production.
Well even with this you are not sure if sorting by timestamp is the correct order. We have a third party tool in place to achieve a proper import, but still people are fighting against the rules and produce import errors instead of just talking about dependant objects and let th tp do the job to decide in wich sequence objects needs to be imported.
Simple but Detailed blog!!! keep it up....!
I do have some concerns regarding the benefit of using a Transport attribute...
Even if all transports are selected that belong to a certain development (a certain group), the objects IN the transport(s) may still have been modified for other requirements. And by other developers.
The versions of these objects might still be missed. To check all dependencies (previous or later), you will need to check all the objects in the transports and find transport requests they are in, regardless of any 'group' they belong to (i.e. project, attribute, description, etc).
Also, even if an attribute has been set, a developer may still move the transport with complete disregard of other versions in Acceptance (or as an emergency transport).
Very Good Blog.. providing detailed insight of Transport Management...!!!
Excellent Blog. Thanks for sharing such an informative article. Great Work buddy.
Excellent Blog. This shows how much in depth knowledge you possess in Transport Requests. Never expected that this is available.
Informative. Thanks for sharing.
Thanks all for valuable comments !! This is my first blog.
Detail and great. Thanks very much.
Thanks a lot for sharing this 🙂
Well expalined in detail.
Good work!. Please keep it up.
Check out transaction: SPRO_ADMIN to create a project.
Then go to SE03 -> Display/Change Request Attributes and set SAP_CTS_PROJECT to Mandatory/Obligatory.
Now every transport must be assigned to a project. You can get the list of requests in the SPRO_ADMIN transaction. Much easier than the solution you are proposing 🙂
I Agree with your comments and that is used here.
Our challenge is having projects with long lead times & other projects with shorter lead times and the risk of shorter project could grab an object that was already released to Q for a larger project. & if the shorter project goes to PRD 1st it would take that object with it.
How to manage transports from Q to PRD, we need a program to see if there transports in Q not yet moved to PRD with the same object. This is with a Dev > Q > Prd landscape.
You can buy such a program from Revelation Software concepts. As far as i know you can achieve this via the solution manager, too.
I havent tried the attribute but certainly gives you a good way to eliminate the missing transports issue
Very good blog. Thanks for sharing.
very nice document............
Thanks for sharing this.
Now SAP has got ChaRm a tool to manage transports.
Frankly speaking,even then at the end of the day making the Developers of the concerned developments responsible for better management of their transports is the best way.If we use INCLUDE OBJECTS concept in a TR that solves most the problems in Transport Mangement.
For transport import tracking, there is a standard tool in STMS. This video shows how to use it.