REPORT ZTRCONF2 NO STANDARD PAGE HEADING.
************************************************************************
* This program displays the conflicting development and customization
* objects of transports. It can be very useful in case of parallel
* projects going on in different systems/clients having a single
* consolidation client.
* The program reads from the application server two text files that
* contain transport numbers. Then it fetches the corresponding E071
* - and in case of customization objects - E071K table entries.
* The tables can be in a local, or in a remote system, because the
* program uses database links to get the data. A corresponding db. link
* has to exist in the database. Then the program compares the objects
* and keys, and displays the conflicting ones with their transport
* number.
* In case of 2X100 transports with an average number of key
* entries/development objects of 50, 500.000 checks has to be carried
* out. Two keys can be conflicting if one key is a substring of the
* other - this check is a costly operation. Because of these reasons the
* program is carefully tuned and not too pretty. It uses nested
* EXEC SQL calls, because those are much faster then RFC calls like
* the TABLE_ENTRIES_GET_VIA_RFC.
************************************************************************
TABLES: E071, "Transports and contained objects
E071K, "Transports, cust. objects and keys
RFCDES, "RFC destinations
DD02L.
PARAMETERS:
FILE_1(40) DEFAULT '/tmp/dev1trp.txt' LOWER CASE OBLIGATORY,
FILE_2(40) DEFAULT '/tmp/dev2trp.txt' LOWER CASE OBLIGATORY.
DATA: TRNUM LIKE E070-TRKORR.
DATA: PGMID LIKE E071-PGMID,
OBJECT LIKE E071-OBJECT,
OBJNAME(40),
OBJFUNC LIKE E071-OBJFUNC,
TABKEY LIKE E071K-TABKEY.
* Internal tables
* Results from file #1
DATA: BEGIN OF ITAB_1 OCCURS 100,
PGMID LIKE E071-PGMID,
OBJECT LIKE E071-OBJECT,
OBJNAME(50),
OBJFUNC,
TRKORR LIKE E071-TRKORR,
TABKEY(60),
END OF ITAB_1.
* Results from file #2
DATA: BEGIN OF ITAB_2 OCCURS 10000,
PGMID LIKE E071-PGMID,
OBJECT LIKE E071-OBJECT,
OBJNAME(50),
OBJFUNC,
TRKORR LIKE E071-TRKORR,
TABKEY(60),
END OF ITAB_2.
DATA: BEGIN OF ITAB_R1 OCCURS 100,
PGMID LIKE E071-PGMID,
OBJECT LIKE E071-OBJECT,
OBJNAME(50),
TRKORR LIKE E071-TRKORR,
TABKEY(60),
END OF ITAB_R1.
* Results from file #2
DATA: BEGIN OF ITAB_R2 OCCURS 10000,
PGMID LIKE E071-PGMID,
OBJECT LIKE E071-OBJECT,
OBJNAME(50),
TRKORR LIKE E071-TRKORR,
END OF ITAB_R2.
* The table of the merged results
DATA: BEGIN OF ITAB_3 OCCURS 100,
TRKORR_1 LIKE E071-TRKORR,
TRKORR_2 LIKE E071-TRKORR,
P_O_N(60),
TABKEY_1(60),
TABKEY_2(60),
END OF ITAB_3.
*Use this part of the code to initially create the db. links
*exec sql.
* create
* database link ld1 connect to sapr3 identified by pwd using 'DV2'
* endexec.
* exec sql.
* create
* database link ld2 connect to sapr3 identified by pwd using 'DV1'
* endexec.
*exit.
* Read the file of system #1
OPEN DATASET FILE_1 FOR INPUT IN TEXT MODE.
DO.
READ DATASET FILE_1 INTO TRNUM.
IF SY-SUBRC <> 0. EXIT. ENDIF.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = ''
TEXT = TRNUM.
PERFORM REMOTE_SELECT_1.
ENDDO.
CLOSE DATASET FILE_1.
* Read the file of system #2
OPEN DATASET FILE_2 FOR INPUT IN TEXT MODE.
DO.
READ DATASET FILE_2 INTO TRNUM.
IF SY-SUBRC <> 0. EXIT. ENDIF.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = ''
TEXT = TRNUM.
PERFORM REMOTE_SELECT_2.
ENDDO.
CLOSE DATASET FILE_2.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = ''
TEXT = 'Processing the internal tables'.
* Merge itab_1 and itab_2 to itab_3
LOOP AT ITAB_1.
LOOP AT ITAB_2 WHERE
PGMID = ITAB_1-PGMID AND
OBJECT = ITAB_1-OBJECT AND
OBJNAME = ITAB_1-OBJNAME.
IF ITAB_2-OBJFUNC = 'K'.
IF ITAB_1-TABKEY CP ITAB_2-TABKEY OR
ITAB_2-TABKEY CP ITAB_1-TABKEY.
ITAB_3-TRKORR_1 = ITAB_1-TRKORR.
ITAB_3-TRKORR_2 = ITAB_2-TRKORR.
ITAB_3-P_O_N = ITAB_1-PGMID.
ITAB_3-P_O_N+5 = ITAB_1-OBJECT.
ITAB_3-P_O_N+10 = ITAB_1-OBJNAME.
ITAB_3-TABKEY_1 = ITAB_1-TABKEY.
ITAB_3-TABKEY_2 = ITAB_2-TABKEY.
APPEND ITAB_3.
ENDIF.
ELSE.
CLEAR ITAB_3.
ITAB_3-TRKORR_1 = ITAB_1-TRKORR.
ITAB_3-TRKORR_2 = ITAB_2-TRKORR.
ITAB_3-P_O_N = ITAB_1-PGMID.
ITAB_3-P_O_N+5 = ITAB_1-OBJECT.
ITAB_3-P_O_N+10 = ITAB_1-OBJNAME.
APPEND ITAB_3.
ENDIF.
ENDLOOP.
ENDLOOP.
* Print the header lines
WRITE: / 'Conflicting transport objects'.
SKIP.
WRITE: / 'Transport from system #1' COLOR 1.
WRITE: / 'Transport from system #2' COLOR 6.
WRITE: / 'Object ' COLOR 5.
WRITE: / 'Customization object key' COLOR 2.
SKIP.
* Creat a list based upon itab_3
SORT ITAB_3 BY TRKORR_1 TRKORR_2 P_O_N.
LOOP AT ITAB_3.
AT NEW TRKORR_1.
SKIP.
WRITE: / ITAB_3-TRKORR_1 COLOR 1.
ENDAT.
AT NEW TRKORR_2.
WRITE: /5 ITAB_3-TRKORR_2 COLOR 6.
ENDAT.
AT NEW P_O_N.
WRITE: /10 ITAB_3-P_O_N COLOR 5.
ENDAT.
IF NOT ITAB_3-TABKEY_1 IS INITIAL OR NOT ITAB_3-TABKEY_1 IS INITIAL.
WRITE: /15 ' ' COLOR 1 NO-GAP, 16 ITAB_3-TABKEY_1 COLOR 2.
WRITE: /15 ' ' COLOR 6 NO-GAP, 16 ITAB_3-TABKEY_2 COLOR 2.
ENDIF.
ENDLOOP.
*---------------------------------------------------------------------*
* FORM REMOTE_SELECT_1 *
*---------------------------------------------------------------------*
FORM REMOTE_SELECT_1.
EXEC SQL PERFORMING KULSO_LOOP.
SELECT PGMID, OBJECT, OBJ_NAME, OBJFUNC
INTO :PGMID, :OBJECT, :OBJNAME, :OBJFUNC
FROM E071@LD1 WHERE TRKORR = :TRNUM
ENDEXEC.
ENDFORM.
*---------------------------------------------------------------------*
* FORM KULSO_LOOP *
*---------------------------------------------------------------------*
FORM KULSO_LOOP.
* If the object is TABU, VDAT or TDAT (customization)
IF OBJFUNC = 'K'.
EXEC SQL PERFORMING BELSO_LOOP.
SELECT TABKEY
INTO :TABKEY
FROM E071K@LD1 WHERE
TRKORR = :TRNUM AND
PGMID = :PGMID AND
MASTERTYPE = :OBJECT AND
MASTERNAME = :OBJNAME
ENDEXEC.
* Repository objects (no CORR: transport that contains other transport)
ELSEIF PGMID <> 'CORR'.
CLEAR ITAB_1-TRKORR.
ITAB_1-TRKORR = TRNUM.
ITAB_1-PGMID = PGMID.
ITAB_1-OBJECT = OBJECT.
ITAB_1-OBJNAME = OBJNAME.
ITAB_2-OBJFUNC = ''.
COLLECT ITAB_1.
ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
* FORM BELSO_LOOP *
*---------------------------------------------------------------------*
FORM BELSO_LOOP.
ITAB_1-TRKORR = TRNUM.
ITAB_1-PGMID = PGMID.
ITAB_1-OBJECT = OBJECT.
ITAB_1-OBJNAME = OBJNAME.
ITAB_2-OBJFUNC = 'K'.
ITAB_1-TABKEY = TABKEY+3.
COLLECT ITAB_1.
ENDFORM.
*---------------------------------------------------------------------*
* FORM REMOTE_SELECT_2 *
*---------------------------------------------------------------------*
FORM REMOTE_SELECT_2.
EXEC SQL PERFORMING KULSO_LOOP_2.
SELECT PGMID, OBJECT, OBJ_NAME, OBJFUNC
INTO :PGMID, :OBJECT, :OBJNAME, :OBJFUNC
FROM E071@LD2 WHERE TRKORR = :TRNUM
ENDEXEC.
ENDFORM.
*---------------------------------------------------------------------*
* FORM KULSO_LOOP_2 *
*---------------------------------------------------------------------*
FORM KULSO_LOOP_2.
* If the object is TABU, VDAT or TDAT (customization)
IF OBJFUNC = 'K'.
EXEC SQL PERFORMING BELSO_LOOP_2.
SELECT TABKEY
INTO :TABKEY
FROM E071K@LD2 WHERE
TRKORR = :TRNUM AND
PGMID = :PGMID AND
MASTERTYPE = :OBJECT AND
MASTERNAME = :OBJNAME
ENDEXEC.
* Repository objects (no CORR: transport that contains other transport)
ELSEIF PGMID <> 'CORR'.
CLEAR ITAB_2-TRKORR.
ITAB_2-TRKORR = TRNUM.
ITAB_2-PGMID = PGMID.
ITAB_2-OBJECT = OBJECT.
ITAB_2-OBJFUNC = ''.
ITAB_2-OBJNAME = OBJNAME.
COLLECT ITAB_2.
ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
* FORM BELSO_LOOP_2 *
*---------------------------------------------------------------------*
FORM BELSO_LOOP_2.
ITAB_2-TRKORR = TRNUM.
ITAB_2-PGMID = PGMID.
ITAB_2-OBJECT = OBJECT.
ITAB_2-OBJNAME = OBJNAME.
ITAB_2-OBJFUNC = 'K'.
ITAB_2-TABKEY = TABKEY+3.
COLLECT ITAB_2.
ENDFORM.