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.