REPORT ZRDCATF NO STANDARD PAGE HEADING.
************************************************************************
* Central user maintenance from one SAP system for a set of systems.
* (Like in UNIX: NIS, TIVOLI or OMNIGUARD)
*
* The program first calls SU01 to create, delete or modify an SAP user
*   in the local system. Everything looks normal, but in the background
*   it captures the entered data using RS_CATT_MAINTAIN.
* Then it converts the CATF table to a regular BDC table.
* As a third step it reads the type 3 RFC destinations from the table
*    RFCDES with the format: SID_user_CLIENT (where SID and CLIENT are
*    variables), and displays a selection screen (interactive list) with
*    checkboxes.
* Then runs SU01 in the selected remote systems, with the captured
*    parameters.
* The catf/bdf conversion is somewhat simplifyed, uses only the varf1,
*    but it can do the job.
************************************************************************
TABLES: CATF, CATR, CATG, CATV, CATU, CATP, CATX, CATA.
TABLES: BDCDATA, RFCDES.
DATA: FIRST(2), SECOND(2), FNAM(30), FVAL(50).
DATA: TRNAM LIKE CATF-TCODE.
DATA: ABLNR LIKE CATF-ABLNR.
DATA: BEGIN OF BDC_TAB OCCURS 5.
        INCLUDE STRUCTURE BDCDATA.
DATA: END OF BDC_TAB.
DATA: MARK, GOMB(13).
DATA: BEGIN OF MESSG.
        INCLUDE STRUCTURE MESSAGEINF.
DATA: END OF MESSG.

* Call SU01 and capture the input data in the CATT tables
CALL FUNCTION 'RS_CATT_MAINTAIN'
     EXPORTING
          AKTION       = 'GENR'
          CONFIRMATION = ' '
          TCODE        = 'SU01'
     IMPORTING
          ABLNR        = ABLNR.
* Create a BDC table based upon the data in catf
CLEAR BDC_TAB.
REFRESH BDC_TAB.
SELECT * FROM CATF WHERE ABLNR = ABLNR.
  IF NOT CATF-TCODE IS INITIAL.
    TRNAM = CATF-TCODE.
  ENDIF.
  BDC_TAB-PROGRAM = CATF-MPOOL.
  BDC_TAB-DYNPRO = CATF-DYNNR.
  BDC_TAB-DYNBEGIN = 'X'.
  APPEND BDC_TAB.
  CLEAR BDC_TAB.
  DO.
    FIRST = CATF-VARF1.
    SHIFT CATF-VARF1 LEFT BY 2 PLACES.
    SECOND = CATF-VARF1.
    SHIFT CATF-VARF1 LEFT BY 2 PLACES.
    IF FIRST IS INITIAL.EXIT. ENDIF.
    FNAM = CATF-VARF1(FIRST).
    SHIFT CATF-VARF1 LEFT BY FIRST PLACES.
    FVAL = CATF-VARF1(SECOND).
    SHIFT CATF-VARF1 LEFT BY SECOND PLACES.
    BDC_TAB-FNAM = FNAM.
    BDC_TAB-FVAL = FVAL.
    APPEND BDC_TAB.
    CLEAR BDC_TAB.
  ENDDO.
ENDSELECT.
* Clean the CATT tables
DELETE FROM CATF WHERE ABLNR = ABLNR.
DELETE FROM CATR WHERE ABLNR = ABLNR.
DELETE FROM CATG WHERE ABLNR = ABLNR.
DELETE FROM CATV WHERE ABLNR = ABLNR.
DELETE FROM CATU WHERE ABLNR = ABLNR.
DELETE FROM CATP WHERE ABLNR = ABLNR.
DELETE FROM CATX WHERE ABLNR = ABLNR.
DELETE FROM CATA WHERE ABLNR = ABLNR.
COMMIT WORK.
* Display the list of systems and clients defined with SM59
WRITE: / 'SELECT ONE OR MORE SYSTEMS AND CLIENTS        ' COLOR 4.
WRITE: / 'DOUBLECLICK ON PROCEED TO MIGRATE THE CHANGES ' COLOR 4.
WRITE: / 'DOUBLECLICK ON EXIT TO LEAVE WITHOUT MIGRATION' COLOR 4.
SKIP.
SELECT * FROM RFCDES WHERE RFCTYPE = '3' AND RFCDEST LIKE '%user%'.
  WRITE:/1(3) RFCDES-RFCDEST, 9 RFCDES-RFCDEST+9(3), MARK AS CHECKBOX.
  HIDE: RFCDES-RFCDEST, MARK.
ENDSELECT.
SKIP.
GOMB = 'PROCEED'.
WRITE: / GOMB COLOR 6. HIDE GOMB.
SKIP.
GOMB = 'EXIT'.
WRITE: / GOMB COLOR 6. HIDE GOMB.
CLEAR GOMB.
* When EXIT or PROCEED is choosed
AT LINE-SELECTION.
  IF GOMB = 'EXIT'.
    LEAVE PROGRAM.
  ELSEIF GOMB = 'PROCEED'.
    DO.
      CLEAR MARK.CLEAR RFCDES-RFCDEST.
      READ LINE SY-INDEX FIELD VALUE MARK.
      IF SY-SUBRC NE 0.  EXIT. ENDIF.
      IF RFCDES-RFCDEST IS INITIAL.CONTINUE.ENDIF.
* For all the marked entries: run su01 in the remote system
      IF MARK = 'X'.
        CALL FUNCTION 'RFC_CALL_TRANSACTION' DESTINATION RFCDES-RFCDEST
             EXPORTING
                  TRANCODE = TRNAM
             IMPORTING
                  MESSG    = MESSG
             TABLES
                  BDCTABLE = BDC_TAB.
* Write the log
      WRITE: / RFCDES-RFCDEST, MESSG-MSGTX.
      ENDIF.
    ENDDO.
  ENDIF.