* Version 0010                             Date: 03-Feb-2005
REPORT ZROLE_LIST
       MESSAGE-ID Z2
       NO STANDARD PAGE HEADING
       LINE-SIZE 220
       .
TABLES:
  T000                                   "Clients
, T002                                   "Languages
, AGR_DEFINE                             "Activity Groups (Roles)
, AGR_TIME                               "Date stamp for role
, AGR_TEXTS                              "Texts for Activity Groups
, USR02
.
CONSTANTS:
  F4POOL       LIKE SY-REPID        VALUE 'ZF4AGR'
, C_FLD        LIKE DD03L-FIELDNAME VALUE 'AGR_NAME' "Def. sort. field
.
TYPES:
  BEGIN OF TY_IT
,   MANDT      LIKE AGR_DEFINE-MANDT
,   AGR_NAME   LIKE AGR_DEFINE-AGR_NAME
,   PARENT_AGR LIKE AGR_DEFINE-PARENT_AGR
,   CREATE_USR LIKE AGR_DEFINE-CREATE_USR
,   CREATE_DAT LIKE AGR_DEFINE-CREATE_DAT
,   CREATE_TIM LIKE AGR_DEFINE-CREATE_TIM
,   CREATE_TMP LIKE AGR_DEFINE-CREATE_TMP
,   CHANGE_USR LIKE AGR_DEFINE-CHANGE_USR
,   CHANGE_DAT LIKE AGR_DEFINE-CHANGE_DAT
,   CHANGE_TIM LIKE AGR_DEFINE-CHANGE_TIM
,   CHANGE_TMP LIKE AGR_DEFINE-CHANGE_TMP
,   ATTRIBUTES LIKE AGR_DEFINE-ATTRIBUTES
,   TEXT       LIKE AGR_TEXTS-TEXT
,   NR         LIKE SY-DBCNT
,   MARK       TYPE C
, END   OF TY_IT
.
FIELD-SYMBOLS:
  <FS>         TYPE TY_IT
.
DATA:
  D1           LIKE SY-DATUM
, REPID        LIKE SY-REPID

, BEGIN OF AGRLIST OCCURS 100
,   AGR_NAME   LIKE AGR_DEFINE-AGR_NAME
, END   OF AGRLIST

, BEGIN OF IT OCCURS 100.
    INCLUDE STRUCTURE AGR_DEFINE.
DATA:
    TEXT       LIKE AGR_TEXTS-TEXT
,   NR         LIKE SY-DBCNT
,   MARK
, END   OF IT

, ANS
, I            TYPE I
, INST_LANG(8)                             "Installed languages string
, CANT_SWITCH_LANG                         "Cannot switch language
, LANG_LEN     TYPE I
, LANG_POS     LIKE SY-FDPOS
, OK_CODE      LIKE SY-UCOMM
, NEW_IDX      LIKE SY-LILLI        VALUE  0
, SAV_IDX      LIKE SY-LILLI        VALUE  0
, ST_CNT(10)
, ST_CNT2      LIKE ST_CNT
, ST_NR        LIKE ST_CNT
, HEAD_LN      LIKE SY-STARO        VALUE  3       "Header rows
, LAST_LN      LIKE SY-STARO                       "Last line in list
, FLD          LIKE DD03L-FIELDNAME VALUE  C_FLD   "Initial sort. field
, SAV_FLD      LIKE DD03L-FIELDNAME VALUE  C_FLD   "Saved state of
                                                   " sorting conditions
, SORT_FLG                          VALUE 'X'      " 'X' - ascending
, F_RESTORE
, V_FILTERED
, QINFO(40)
.
INCLUDE <COLOR>.
*NCLUDE <ICON>.
TYPE-POOLS:
  ICON
.
CONSTANTS:
  IC_INDICATOR LIKE ICON_DUMMY      VALUE
                                          ICON_WS_POST
*                                         ICON_WF_REPLACE_WORKITEM
*                                         ICON_WF_RESERVE_WORKITEM
*                                         ICON_WF_RULE_SYSTEM
, IC_MENU      LIKE ICON_DUMMY      VALUE ICON_WS_POST
, IC_DERRIVED  LIKE ICON_DUMMY      VALUE
                                          ICON_WF_REPLACE_WORKITEM
*                                         ICON_WF_RESERVE_WORKITEM
*                                         ICON_WS_TRANSFER
*                                         ICON_WF_RULE_SYSTEM
, IC_NO_MENU   LIKE ICON_DUMMY      VALUE
                                          ICON_WF_WORKITEM_CANCEL
*                                         ICON_RATING_NEUTRAL
*                                         ICON_DUMMY
.
DATA:
  MY_ICON      LIKE ICON_DUMMY      VALUE
                                          ICON_WS_POST
*                                         ICON_SYSTEM_FAVORITES
*                                         ICON_OO_EVENT
*                                         ICON_PARAMETER
*                                         ICON_DISPLAY_TREE
.
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK B1
                                WITH FRAME
                                TITLE TEXT-002
                                .
  SELECT-OPTIONS:
    SO_MANDT FOR T000-MANDT            DEFAULT SY-MANDT
  , SO_AGRN  FOR AGR_DEFINE-AGR_NAME   DEFAULT 'Z*'   OPTION CP SIGN I
* , SO_AGRN  FOR AGR_DEFINE-AGR_NAME   DEFAULT 'SAP*' OPTION CP SIGN E
  , SO_PAGR  FOR AGR_DEFINE-PARENT_AGR
  , SO_CUSR  FOR AGR_DEFINE-CREATE_USR "EFAULT SY-UNAME
  , SO_CDAT  FOR AGR_DEFINE-CREATE_DAT
  , SO_CTIM  FOR AGR_DEFINE-CREATE_TIM
* , SO_CTMP  FOR AGR_DEFINE-CREATE_TMP
  , SO_MUSR  FOR AGR_DEFINE-CHANGE_USR
  , SO_MDAT  FOR AGR_DEFINE-CHANGE_DAT
  , SO_MTIM  FOR AGR_DEFINE-CHANGE_TIM
* , SO_MUSR  FOR AGR_TIME-CHANGE_USR
* , SO_MDAT  FOR AGR_TIME-CHANGE_DAT
* , SO_MTIM  FOR AGR_TIME-CHANGE_TIM
* , SO_MTMP  FOR AGR_DEFINE-CHANGE_TMP
  , SO_ATTR  FOR AGR_DEFINE-ATTRIBUTES
  .
  PARAMETERS:
    P_LANGU  LIKE T002-SPRAS           DEFAULT SY-LANGU
  , P_ALL    RADIOBUTTON GROUP RAD1    "EFAULT 'X' "All Roles
                         USER-COMMAND RADI
  , P_ASSIGN RADIOBUTTON GROUP RAD1                "Assigned Only
  .
  SELECT-OPTIONS:
    SO_BNAME FOR USR02-BNAME MODIF ID BNA
  .
  PARAMETERS:
    P_DUMMY  RADIOBUTTON GROUP RAD1                "Not Assigned Only
  .
SELECTION-SCREEN END   OF BLOCK B1.
*---------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK B2
                                WITH FRAME
                                TITLE TEXT-003
                                .
  PARAMETERS:
*---Sort by role name
    P_SORTR  RADIOBUTTON GROUP RAD2    "EFAULT 'X'
*---Sort by date/time
  , P_SORTD  RADIOBUTTON GROUP RAD2
*---Sort by profile timestamp
  , P_SORTP  RADIOBUTTON GROUP RAD2

  , P_EDIT   AS CHECKBOX               DEFAULT ' '
*---Hide/show additional columns in MAIN
  , P_SHORT  AS CHECKBOX               DEFAULT 'X'
*---Zebra-style output
  , P_ZEBRA  AS CHECKBOX               DEFAULT ' '
*---Keep clicked items intensified
  , P_KEEP   AS CHECKBOX               DEFAULT ' '
  .
SELECTION-SCREEN END   OF BLOCK B2.
*-----------------------------------------------------------------------
DEFINE F4AGR.
  PERFORM ON_VALUE_REQUEST_ROLE IN PROGRAM (F4POOL) IF FOUND
            USING REPID '1000' &1
         CHANGING &2
                  .
END-OF-DEFINITION. "F4AGR
*-----------------------------------------------------------------------
DEFINE GET_PARAM.
  CALL 'C_SAPGPARAM'
    ID 'NAME'  FIELD &1
    ID 'VALUE' FIELD &2
    .
END-OF-DEFINITION. "GET_PARAM
*-----------------------------------------------------------------------
DEFINE CONFIRM_STEP.
  CLEAR ANS.
  CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
       EXPORTING
         DEFAULTOPTION  = 'N'
         TEXTLINE1      = &1
         TEXTLINE2      = &2
         TITEL          = &3
         START_COLUMN   = 25
         START_ROW      =  5
*        CANCEL_DISPLAY =  SPACE
       IMPORTING
         ANSWER         =  ANS
         .
END-OF-DEFINITION. "CONFIRM_STEP
*-----------------------------------------------------------------------
DEFINE SELECT_VALID_LINE.
*'Place cursor on a valid line'
* MESSAGE S898(S1). "<- Message hasn't translation in Russian
*'Select a valid line'
  MESSAGE S015(SR).
  EXIT.
END-OF-DEFINITION. "SELECT_VALID_LINE
*-----------------------------------------------------------------------
DEFINE SETUP_COLORS.
  IF IT-NR = 0.
    MY_ICON = IC_NO_MENU.
*   QINFO = TEXT-008.
    CLEAR QINFO.
  ELSE.
    IF IT-PARENT_AGR IS INITIAL. MY_ICON = IC_MENU.
                           ELSE. MY_ICON = IC_DERRIVED. ENDIF.

    MOVE IT-NR TO ST_NR. CONDENSE ST_NR.
    QINFO = 'Menu contains $ transactions'(033).
    REPLACE '$' WITH ST_NR INTO QINFO. CONDENSE QINFO.
  ENDIF.

  IF IT-MANDT = SY-MANDT.
    CL_MANDT = COL_HEADING.
  ELSE.
    CL_MANDT = COL_KEY.
  ENDIF.

  IF IT-CREATE_USR IS INITIAL.
    CL_CREUSR = COL_NEGATIVE.
  ELSE.
    CL_CREUSR = COL_NORMAL.
  ENDIF.

  IF IT-CREATE_DAT IS INITIAL.
    CL_CREDAT = COL_NEGATIVE.
  ELSE.
    CL_CREDAT = COL_NORMAL.
  ENDIF.

  IF IT-CREATE_TIM IS INITIAL.
    CL_CRETIM = COL_NEGATIVE.
  ELSE.
    CL_CRETIM = COL_NORMAL.
  ENDIF.

  IF IT-CHANGE_USR IS INITIAL.
    CL_CHAUSR = COL_NEGATIVE.
  ELSE.
    CL_CHAUSR = COL_GROUP.
  ENDIF.

  IF IT-CHANGE_DAT IS INITIAL.
    CL_CHADAT = COL_NEGATIVE.
  ELSE.
    CL_CHADAT = COL_GROUP.
  ENDIF.

  IF IT-CHANGE_TIM IS INITIAL.
    CL_CHATIM = COL_NEGATIVE.
  ELSE.
    CL_CHATIM = COL_GROUP.
  ENDIF.

  IF P_ZEBRA = 'X'.
    I = ( I + 1 ) MOD 2.
    FORMAT INTENSIFIED = I.
  ENDIF.
END-OF-DEFINITION. "SETUP_COLORS
*-----------------------------------------------------------------------
INITIALIZATION.
  REPID = SY-REPID.

*-Get installed languages
  MOVE SY-LANGU TO P_LANGU.       "Set logon language as initial
  CLEAR CANT_SWITCH_LANG.

  GET_PARAM 'zcsa/installed_languages' INST_LANG.

  LANG_LEN = STRLEN( INST_LANG ). "Length of a languages-string

  IF LANG_LEN = 0.
    CANT_SWITCH_LANG = 'X'.
  ELSE.
    SEARCH INST_LANG FOR SY-LANGU.  "Get position of logon language
    IF SY-SUBRC = 0.
      LANG_POS = SY-FDPOS.          "at installed languages string
    ELSE.
      CANT_SWITCH_LANG = 'X'.
    ENDIF.
  ENDIF.

* D1 = SY-DATUM - 30.
* CLEAR SO_CDAT.
* SO_CDAT-LOW    =  D1.
* SO_CDAT-HIGH   =  SY-DATUM.
* SO_CDAT-SIGN   = 'I'.
* SO_CDAT-OPTION = 'BT'.
* APPEND SO_CDAT.

*-----------------------------------------------------------------------
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
*   IF SCREEN-GROUP1 = 'BNA'.
*     IF P_ASSIGN = 'X'.
*       SCREEN-ACTIVE = '1'.
*     ELSE.
*       SCREEN-ACTIVE = '0'.
*     ENDIF.
*     MODIFY SCREEN.
*   ENDIF.
    IF SCREEN-NAME = 'SO_BNAME-LOW' OR SCREEN-NAME = 'SO_BNAME-HIGH'.
      IF P_ASSIGN = 'X'.
        SCREEN-INPUT = '1'.
      ELSE.
        SCREEN-INPUT = '0'.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

*-----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_AGRN-LOW.
  F4AGR 'SO_AGRN-LOW'  SO_AGRN-LOW.

*-----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_AGRN-HIGH.
  F4AGR 'SO_AGRN-HIGH' SO_AGRN-HIGH.

*-----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_PAGR-LOW.
  F4AGR 'SO_PAGR-LOW'  SO_PAGR-LOW.

*-----------------------------------------------------------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_PAGR-HIGH.
  F4AGR 'SO_PAGR-HIGH' SO_PAGR-HIGH.

*-----------------------------------------------------------------------
AT LINE-SELECTION.
  PERFORM AT_LINE_SELECTION.

*-----------------------------------------------------------------------
AT USER-COMMAND.
  PERFORM AT_USER_COMMAND.

*-----------------------------------------------------------------------
TOP-OF-PAGE.
  PERFORM TOP_OF_PAGE.

*-----------------------------------------------------------------------
TOP-OF-PAGE DURING LINE-SELECTION.
  PERFORM TOP_OF_PAGE.

*-----------------------------------------------------------------------
START-OF-SELECTION.
  PERFORM REFRESH_LIST.
* PERFORM GET_DATA.

*-----------------------------------------------------------------------
END-OF-SELECTION.
* PERFORM WRITE_LIST.

*-----------------------------------------------------------------------
FORM AT_USER_COMMAND.
  CASE SY-PFKEY.
    WHEN 'MAIN'.
      CASE SY-UCOMM.
        WHEN 'SELE'. PERFORM AT_LINE_SELECTION.
        WHEN 'REFR'. PERFORM REFRESH_LIST.
*       WHEN 'SRTA'. SORT_FLG = 'X'. PERFORM SORT_LIST.
*       WHEN 'SRTD'. SORT_FLG = ' '. PERFORM SORT_LIST.
        WHEN 'SSCR'. PERFORM CALL_SELECTION_SCREEN.
        WHEN 'LANG'. PERFORM NEXT_LANGUAGE.
                     PERFORM REFRESH_LIST.
        WHEN 'MODE'. PERFORM TOGGLE_FLAG CHANGING P_EDIT.
                     PERFORM SET_TITLEBAR_001.
        WHEN 'LAYO'. PERFORM TRANSFER_SELECTION.
                     PERFORM TOGGLE_FLAG CHANGING P_SHORT.
                     PERFORM RESTORE_LIST.
        WHEN 'SALL'. PERFORM SELECT_ALL.
                     PERFORM RESTORE_LIST.
        WHEN 'SNON'. PERFORM SELECT_NONE.
                     PERFORM RESTORE_LIST.
        WHEN 'SINV'. PERFORM TRANSFER_SELECTION.
                     PERFORM INVERT_SELECTION.
                     PERFORM RESTORE_LIST.
        WHEN 'SELB'. PERFORM SELECT_BLOCK.
        WHEN 'CTLC'. PERFORM EXPORT_TO_CLIPBOARD_MAIN.
        WHEN 'CTLV'. PERFORM MARK_FROM_CLIPBOARD_MAIN.
        WHEN 'CROP'. PERFORM TRANSFER_SELECTION.
                     PERFORM CROP_VIEW.
        WHEN 'BACK'
          OR 'EXIT'
          OR 'CANCEL'
              .      SET SCREEN 0. LEAVE SCREEN.
      ENDCASE.
    WHEN 'MENU'.
      CASE SY-UCOMM.
        WHEN 'BACK'
          OR 'EXIT'
          OR 'CANCEL'
              .      SET SCREEN 0. LEAVE SCREEN.
      ENDCASE.
*   WHEN OTHERS.     IF OK_CODE(1) NE '/'.
*                      PERFORM CALL_TRANSACTION USING SY-UCOMM.
*                    ENDIF.
  ENDCASE.
ENDFORM. "AT_USER_COMMAND
*-----------------------------------------------------------------------
FORM AT_LINE_SELECTION.
* DATA V_FIELD LIKE DD03L-FIELDNAME.

* IF SY-LSIND > 1.
*   SUBTRACT 1 FROM SY-LSIND.
*   MESSAGE S030 WITH 'Further navigation is not possible'(007).
*   EXIT.
* ENDIF.
  CHECK SY-PFKEY = 'MAIN'.

  IF SY-CUROW GT HEAD_LN AND        "If relative line > HEAD_LN and
     SY-LILLI LE LAST_LN.           "  absolute line inside of list
    PERFORM HIGHLIGHT.

    GET CURSOR FIELD FLD.
    CASE FLD.
      WHEN 'IT-AGR_NAME'.   PERFORM JUMP_TO_ROLE
                              USING IT-AGR_NAME
                                    .
      WHEN 'IT-PARENT_AGR'. PERFORM JUMP_TO_ROLE
                              USING IT-PARENT_AGR
                                    .
      WHEN 'MY_ICON'.       PERFORM GET_AGR_TCODES
                              USING IT-MANDT
                                    IT-AGR_NAME
                                    IT-PARENT_AGR
                                    .
      WHEN 'IT-CREATE_USR'. PERFORM SHOW_USER_DETAILS
                              USING IT-CREATE_USR
                                    IT-MANDT
                                    .
      WHEN 'IT-CHANGE_USR'. PERFORM SHOW_USER_DETAILS
                              USING IT-CHANGE_USR
                                    IT-MANDT
                                    .
      WHEN  OTHERS.
*--------------------------'Navigation through this column not possible'
                            MESSAGE S065.
    ENDCASE.
  ELSE. SELECT_VALID_LINE. ENDIF.
ENDFORM. "AT_LINE_SELECTION
*-----------------------------------------------------------------------
FORM TOP_OF_PAGE.
  FORMAT COLOR COL_HEADING INTENSIFIED ON.
  CASE SY-PFKEY.
    WHEN 'MAIN'.
      PERFORM ULINE_MAIN.
      WRITE:
      /  SY-VLINE                                       NO-GAP
      ,  IC_INDICATOR AS ICON
           QUICKINFO 'Transactions in menu'(032)        NO-GAP
      ,  SY-VLINE                                       NO-GAP
      ,  SPACE AS CHECKBOX INPUT OFF
      , 'Cli'(011)                                      NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'Role name_____________________'(012)           NO-GAP
      ,  SY-VLINE                                       NO-GAP
      .
      IF P_SHORT IS INITIAL.
      WRITE:
        'Parent role name______________'(013)           NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'Created by__'(014)                             NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'CreateDate'(015)                               NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'CreaTime'(016)                                 NO-GAP
      ,  SY-VLINE                                       NO-GAP
      .
      ENDIF.
      WRITE:
        'Changed by__'(017)                             NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'ChangeDate'(018)                               NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'ChanTime'(019)                                 NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'Description___________________'(020)           NO-GAP
      ,  SY-VLINE                                       NO-GAP
      .
      PERFORM ULINE_MAIN.
    WHEN 'MENU'.
      PERFORM ULINE_MENU.
      WRITE:
      /  SY-VLINE                                       NO-GAP
      , 'Transaction code________________________'(021) NO-GAP
      ,  SY-VLINE                                       NO-GAP
      .
      SET LEFT SCROLL-BOUNDARY.
      WRITE:
        'Description_________________________'(022)     NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'Program name____________________________'(023) NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'Author______'(024)                             NO-GAP
      ,  SY-VLINE                                       NO-GAP
      , 'Development Class_____________'(025)           NO-GAP
      ,  SY-VLINE                                       NO-GAP
      .
      PERFORM ULINE_MENU.
    WHEN OTHERS.
      ULINE.
      WRITE:
      / 'Unknown status. No header available.'.
      .
      ULINE.
  ENDCASE.
ENDFORM. "TOP_OF_PAGE
*-----------------------------------------------------------------------
FORM BACK_IF_DETAIL.           "REUSES EXISTING OUTPUT
*-If detail list level > 0 then decrease it
  IF SY-LSIND > 0. SUBTRACT 1 FROM SY-LSIND. ENDIF.
ENDFORM. "BACK_IF_DETAIL
*-----------------------------------------------------------------------
FORM LIST_RETURN USING LIST_IDX LIKE SY-LSIND.
*-Return list to previous position
  SCROLL LIST INDEX LIST_IDX TO COLUMN SY-STACO.
  SCROLL LIST INDEX LIST_IDX TO PAGE   SY-CPAGE LINE SY-STARO.
ENDFORM. "LIST_RETURN
*-----------------------------------------------------------------------
FORM TOGGLE_FLAG CHANGING FLAG TYPE C.    "TOGGLES BOOLEAN VAR ON/OFF
  IF FLAG IS INITIAL. MOVE 'X' TO FLAG. ELSE. CLEAR FLAG. ENDIF.
ENDFORM. "TOGGLE_FLAG
*-----------------------------------------------------------------------
FORM ACTION_CANCELLED.
*-'Action cancelled by user'
  MESSAGE S024(ES).
ENDFORM. "ACTION_CANCELLED
*-----------------------------------------------------------------------
FORM HIGHLIGHT.
  CHECK P_ZEBRA IS INITIAL.

*-Switch ON new mark
  MODIFY CURRENT LINE LINE FORMAT INTENSIFIED.
  NEW_IDX = SY-LILLI.

  IF NOT SAV_IDX IS INITIAL
     AND NEW_IDX <> SAV_IDX
     AND P_KEEP IS INITIAL.
*---Switch OFF old mark
    READ LINE SAV_IDX.
    MODIFY CURRENT LINE LINE FORMAT INTENSIFIED OFF.

*---Return to new line
    READ LINE NEW_IDX.
  ENDIF.
*-Save state
  MOVE SY-LILLI TO SAV_IDX.
ENDFORM. "HIGHLIGHT
*-----------------------------------------------------------------------
FORM REFRESH_LIST.
  CLEAR SAV_IDX.
  PERFORM GET_DATA.
* SET TITLEBAR '001' WITH ST_CNT.
  SET PF-STATUS 'MAIN'.
* PERFORM SORT_IT USING SAV_FLD CHANGING SAV_FLD.
  PERFORM WRITE_LIST.
ENDFORM. "REFRESH_LIST
*-----------------------------------------------------------------------
FORM RESTORE_LIST.
  F_RESTORE = 'X'.
  PERFORM WRITE_LIST.
ENDFORM. "RESTORE_LIST
*-----------------------------------------------------------------------
FORM COUNT_ENTRIES.
  DESCRIBE TABLE IT LINES SY-TFILL.
  MOVE SY-TFILL TO ST_CNT. CONDENSE ST_CNT.
ENDFORM. "COUNT_ENTRIES
*-----------------------------------------------------------------------
DEFINE COUNT_TCODES.
  IF <FS>-PARENT_AGR IS INITIAL.
    SELECT COUNT( * ) INTO <FS>-NR
                      FROM AGR_TCODES CLIENT SPECIFIED
                      WHERE MANDT    = <FS>-MANDT
                        AND AGR_NAME = <FS>-AGR_NAME
                            .
  ELSE.
    SELECT COUNT( * ) INTO <FS>-NR
                      FROM AGR_TCODES CLIENT SPECIFIED
                      WHERE MANDT    = <FS>-MANDT
                        AND AGR_NAME = <FS>-PARENT_AGR
                            .
  ENDIF.
END-OF-DEFINITION. "COUNT_TCODES
*-----------------------------------------------------------------------
FORM GET_DATA.
  REFRESH IT. CLEAR IT.
  SELECT A~MANDT
         A~AGR_NAME
         A~PARENT_AGR
         A~CREATE_USR
         A~CREATE_DAT
         A~CREATE_TIM
**       A~CREATE_TMP
*        A~CHANGE_USR
*        A~CHANGE_DAT
*        A~CHANGE_TIM
**       A~CHANGE_TMP
         A~ATTRIBUTES
         D~CHANGE_USR
         D~CHANGE_DAT
         D~CHANGE_TIM
         T~TEXT

         FROM (            AGR_DEFINE AS A
           LEFT OUTER JOIN AGR_TIME   AS D
                ON A~MANDT    = D~MANDT    AND
                   A~AGR_NAME = D~AGR_NAME AND
                   D~AGR_TYPE = 'PROFILE'

           LEFT OUTER JOIN AGR_TEXTS  AS T
                ON A~MANDT    = T~MANDT    AND
                   A~AGR_NAME = T~AGR_NAME AND
                   T~SPRAS    = P_LANGU    AND
                   T~LINE     = '00000'
                   )
         CLIENT SPECIFIED
         INTO CORRESPONDING FIELDS OF TABLE IT
         WHERE A~MANDT      IN SO_MANDT
           AND A~AGR_NAME   IN SO_AGRN
           AND A~PARENT_AGR IN SO_PAGR
           AND A~CREATE_USR IN SO_CUSR
           AND A~CREATE_DAT IN SO_CDAT
           AND A~CREATE_TIM IN SO_CTIM
*          AND A~CREATE_TMP IN SO_CTMP
           AND A~CHANGE_USR IN SO_MUSR
           AND A~CHANGE_DAT IN SO_MDAT
           AND A~CHANGE_TIM IN SO_MTIM
*          AND A~CHANGE_TMP IN SO_MTMP
           AND A~ATTRIBUTES IN SO_ATTR
*        ORDER BY A~CREATE_DAT DESCENDING      "Sort by ORACLE server
*                 A~CREATE_TIM DESCENDING      "
         .
*-Sort internal table in R/3-memory
  CASE 'X'.
*---Sort by role name
    WHEN P_SORTR. SORT IT BY
*                      MANDT       ASCENDING
                       AGR_NAME    ASCENDING
                       .
*---Sort by creation date/time
    WHEN P_SORTD. SORT IT BY
*                      MANDT       ASCENDING
                       CREATE_DAT DESCENDING
                       CREATE_TIM DESCENDING
                       .
*---Sort by profile timestamp
    WHEN P_SORTP. SORT IT BY
*                      MANDT       ASCENDING
                       CHANGE_DAT DESCENDING
                       CHANGE_TIM DESCENDING
                       .
  ENDCASE.

  IF P_ALL IS INITIAL.
    LOOP AT IT ASSIGNING <FS>.
      SELECT COUNT( * ) FROM AGR_USERS CLIENT SPECIFIED
                        WHERE MANDT    = <FS>-MANDT
                          AND AGR_NAME = <FS>-AGR_NAME
                          AND UNAME   IN SO_BNAME
                              .
      IF SY-SUBRC = 0. IF P_DUMMY  = 'X'. <FS>-MARK = 'X'. ENDIF.
                 ELSE. IF P_ASSIGN = 'X'. <FS>-MARK = 'X'. ENDIF. ENDIF.

      COUNT_TCODES.
*     IF SY-SUBRC = 0. MODIFY IT. ENDIF.
    ENDLOOP.
    DELETE IT WHERE MARK = 'X'.
  ELSE.
    LOOP AT IT ASSIGNING <FS>.
      COUNT_TCODES.
*     IF SY-SUBRC = 0. MODIFY IT. ENDIF.
    ENDLOOP.
  ENDIF.

  CLEAR V_FILTERED.
  PERFORM COUNT_ENTRIES.
ENDFORM. "GET_DATA
*-----------------------------------------------------------------------
FORM SET_TITLEBAR_001.
  IF P_EDIT = 'X'.
    SET TITLEBAR '001' WITH '(EDIT)'(005) ST_CNT V_FILTERED.
  ELSE.
    SET TITLEBAR '001' WITH '(SHOW)'(006) ST_CNT V_FILTERED.
  ENDIF.
ENDFORM. "SET_TITLEBAR_001
*-----------------------------------------------------------------------
FORM WRITE_LIST.
  DATA:
    CL_MANDT  TYPE I
  , CL_CREUSR TYPE I
  , CL_CREDAT TYPE I
  , CL_CRETIM TYPE I
  , CL_CHAUSR TYPE I
  , CL_CHADAT TYPE I
  , CL_CHATIM TYPE I
  .
  PERFORM BACK_IF_DETAIL.
  FORMAT COLOR COL_KEY INTENSIFIED OFF.

  PERFORM SET_TITLEBAR_001.

  FORMAT INTENSIFIED OFF. CLEAR I.
  LOOP AT IT.
    SETUP_COLORS.
    WRITE:
    / SY-VLINE                            NO-GAP
    , MY_ICON AS ICON HOTSPOT
        QUICKINFO QINFO                   NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-MARK AS CHECKBOX INPUT ON
    , IT-MANDT      COLOR = CL_MANDT      NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-AGR_NAME   COLOR = CL_MANDT      NO-GAP
    , SY-VLINE                            NO-GAP
    .
    HIDE:
      IT-MANDT
    , IT-AGR_NAME
    , IT-PARENT_AGR
    , IT-CREATE_USR
    , IT-CREATE_DAT
    , IT-CREATE_TIM
    , IT-CREATE_TMP
    , IT-CHANGE_USR
    , IT-CHANGE_DAT
    , IT-CHANGE_TIM
    , IT-CHANGE_TMP
    , IT-ATTRIBUTES
    , IT-TEXT
    , IT-NR
    , IT-MARK
    .
    SET LEFT SCROLL-BOUNDARY.

    IF P_SHORT IS INITIAL.
    WRITE:
      IT-PARENT_AGR COLOR COL_NORMAL      NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-CREATE_USR COLOR = CL_CREUSR     NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-CREATE_DAT COLOR = CL_CREDAT     NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-CREATE_TIM COLOR = CL_CRETIM     NO-GAP
    , SY-VLINE                            NO-GAP
*   , IT-CREATE_TMP COLOR COL_NORMAL      NO-GAP
*   , SY-VLINE                            NO-GAP
    .
    ENDIF.
    WRITE:
      IT-CHANGE_USR COLOR = CL_CHAUSR     NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-CHANGE_DAT COLOR = CL_CHADAT     NO-GAP
    , SY-VLINE                            NO-GAP
    , IT-CHANGE_TIM COLOR = CL_CHATIM     NO-GAP
    , SY-VLINE                            NO-GAP
*   , IT-CHANGE_TMP COLOR COL_GROUP       NO-GAP
*   , SY-VLINE                            NO-GAP
*   , IT-ATTRIBUTES COLOR COL_GROUP       NO-GAP
*   , SY-VLINE                            NO-GAP
    , IT-TEXT       COLOR COL_TOTAL       NO-GAP
    , SY-VLINE                            NO-GAP
    .
  ENDLOOP.
  MOVE SY-LINNO TO LAST_LN.    "Remember number of last line in list

  PERFORM ULINE_MAIN.
  NEW-LINE NO-SCROLLING.
  FORMAT INVERSE.
  WRITE:
     AT 2 'Total entries matching selection criteria:'(001)
* ,  SY-TFILL LEFT-JUSTIFIED
  ,  ST_CNT
  .
  IF F_RESTORE = 'X' AND P_ZEBRA IS INITIAL.
    CLEAR F_RESTORE.
    READ LINE SAV_IDX INDEX 1.
    MODIFY CURRENT LINE LINE FORMAT INTENSIFIED ON.
  ENDIF.

  PERFORM LIST_RETURN USING 1.   "Return to previous position
ENDFORM. "WRITE_LIST
*-----------------------------------------------------------------------
FORM ULINE_MAIN.
  DATA LS LIKE SY-STACO.
  IF P_SHORT = 'X'.
    LS = 155.
  ELSE.
    LS = 219.
  ENDIF.
  WRITE: / SY-ULINE(LS).
ENDFORM. "ULINE_MAIN
*-----------------------------------------------------------------------
FORM ULINE_MENU.
  WRITE: / SY-ULINE(164).
ENDFORM. "ULINE_MENU
*-----------------------------------------------------------------------
FORM JUMP_TO_ROLE USING VALUE(V_ROLE).
* CHECK SY-CUCOL BETWEEN 10 AND 39 AND SY-CUROW > 4.
  CHECK NOT V_ROLE IS INITIAL.
  IF IT-MANDT = SY-MANDT.
    IF P_EDIT = 'X'.
      PERFORM EDIT_ROLE
              IN PROGRAM (F4POOL)
              USING V_ROLE
              IF FOUND
              .
    ELSE.
      PERFORM VIEW_ROLE
              IN PROGRAM (F4POOL)
              USING V_ROLE
              IF FOUND
              .
    ENDIF.
  ELSE.
*--'Jump to role from another client is not possible'
    MESSAGE S088.
  ENDIF.
ENDFORM. "JUMP_TO_ROLE
*-----------------------------------------------------------------------
FORM GET_AGR_TCODES USING V_MANDT      LIKE AGR_DEFINE-MANDT
                          V_AGR_NAME   LIKE AGR_DEFINE-AGR_NAME
                          V_PARENT_AGR LIKE AGR_DEFINE-PARENT_AGR
                          .
  DATA:
    L_AGR_DEFINE  LIKE AGR_DEFINE
  , L_AGR_MENU    LIKE AGR_DEFINE-AGR_NAME
  , IT_AGR_SELECT TYPE STANDARD TABLE OF AGR_SELECT
  , IT_AGR_TCODES TYPE STANDARD TABLE OF AGR_TCODES WITH HEADER LINE

  , BEGIN OF IT_TCODES OCCURS 100.
      INCLUDE STRUCTURE TADIR.
  DATA:
      PGMNA LIKE TSTC-PGMNA
  ,   TTEXT LIKE TSTCT-TTEXT
  ,   COL   LIKE COL_KEY
  ,   QINFO(40)
  , END   OF IT_TCODES

  , CL_DEVCL TYPE I
  .
  IF V_PARENT_AGR IS INITIAL.
    L_AGR_MENU = V_AGR_NAME.
  ELSE.
    L_AGR_MENU = V_PARENT_AGR.
  ENDIF.
  IF V_MANDT <> SY-MANDT.
*--'Jump to role from another client is not possible'
*   MESSAGE I088.
*   EXIT.
    SELECT * FROM AGR_TCODES CLIENT SPECIFIED
             INTO CORRESPONDING FIELDS OF TABLE IT_AGR_TCODES
             WHERE MANDT    = V_MANDT
               AND AGR_NAME = L_AGR_MENU
                   .
  ELSE.
    L_AGR_DEFINE-MANDT    = V_MANDT.
    L_AGR_DEFINE-AGR_NAME = L_AGR_MENU.

    CALL FUNCTION 'PRGN_GET_AGR_TCODES'
         EXPORTING
           S_AGR_DEFINE =  L_AGR_DEFINE
           MODE         = 'DISPLAY'
*          INHERIT      = ' '
         TABLES
           I_AGR_SELECT =  IT_AGR_SELECT
           I_AGR_TCODES =  IT_AGR_TCODES
           .
  ENDIF.

  DESCRIBE TABLE IT_AGR_TCODES LINES SY-TFILL.

  IF SY-TFILL = 0.   "IF IT_AGR_TCODES[] IS INITIAL.
    MESSAGE S030 WITH 'No transactions exist in role menu'(008).
  ELSE.
    MOVE SY-TFILL TO ST_CNT2. CONDENSE ST_CNT2.

    SET TITLEBAR '002' WITH V_AGR_NAME V_MANDT ST_CNT2.
    SET PF-STATUS 'MENU'.

    REFRESH IT_TCODES. CLEAR IT_TCODES.
    LOOP AT IT_AGR_TCODES.
      CLEAR IT_TCODES.
      SELECT SINGLE
           A~OBJ_NAME
           A~AUTHOR
           A~DEVCLASS
           C~PGMNA
           T~TTEXT
           INTO CORRESPONDING FIELDS OF IT_TCODES
           FROM ( (      TADIR AS A
                    JOIN TSTC  AS C
             ON   OBJ_NAME =  C~TCODE )
             LEFT JOIN TSTCT  AS T
             ON   SPRSL    =  P_LANGU
             AND  T~TCODE  =  C~TCODE )
             WHERE PGMID   = 'R3TR'
               AND OBJECT  = 'TRAN'
               AND C~TCODE =  IT_AGR_TCODES-TCODE
                   .
      CASE SY-SUBRC.
        WHEN 0.
          IT_TCODES-COL      = COL_KEY.
        WHEN 4.
          IT_TCODES-COL      = COL_NEGATIVE.
          IT_TCODES-OBJ_NAME = IT_AGR_TCODES-TCODE.
          IT_TCODES-QINFO    = 'Transaction does not exist'(026).
        WHEN OTHERS.
          IT_TCODES-COL      = COL_TOTAL.
          IT_TCODES-OBJ_NAME = IT_AGR_TCODES-TCODE.
          IT_TCODES-QINFO    = 'Cannot get details'(027).
      ENDCASE.
      APPEND IT_TCODES.
    ENDLOOP.
    FORMAT COLOR INTENSIFIED OFF.
    LOOP AT IT_TCODES.
      CASE IT_TCODES-DEVCLASS(1).
        WHEN 'Z'.    CL_DEVCL = COL_POSITIVE.
        WHEN '$'.    CL_DEVCL = COL_NEGATIVE.
        WHEN OTHERS. CL_DEVCL = COL_NORMAL.
      ENDCASE.

      WRITE:
      / SY-VLINE                                            NO-GAP
      , IT_TCODES-OBJ_NAME COLOR = IT_TCODES-COL
                           QUICKINFO IT_TCODES-QINFO
                           INTENSIFIED OFF                  NO-GAP
      , SY-VLINE                                            NO-GAP
      .
      SET LEFT SCROLL-BOUNDARY.
      WRITE:
        IT_TCODES-TTEXT    COLOR COL_TOTAL  INTENSIFIED OFF NO-GAP
      , SY-VLINE                                            NO-GAP
      , IT_TCODES-PGMNA    COLOR COL_NORMAL INTENSIFIED OFF NO-GAP
      , SY-VLINE                                            NO-GAP
      , IT_TCODES-AUTHOR   COLOR COL_GROUP  INTENSIFIED OFF NO-GAP
      , SY-VLINE                                            NO-GAP
      , IT_TCODES-DEVCLASS COLOR = CL_DEVCL INTENSIFIED OFF NO-GAP
      , SY-VLINE                                            NO-GAP
      .
    ENDLOOP.
    PERFORM ULINE_MENU.

    NEW-LINE NO-SCROLLING.
    FORMAT COLOR COL_KEY INVERSE.
    WRITE:
      AT 2 'Total entries matching selection criteria:'(001)
*   ,  SY-TFILL LEFT-JUSTIFIED
    ,  ST_CNT2
    .
  ENDIF.
ENDFORM. "GET_AGR_TCODES
*-----------------------------------------------------------------------
FORM SHOW_USER_DETAILS USING V_BNAME LIKE USR02-BNAME
                             V_MANDT LIKE USR02-MANDT
                             .
  CALL FUNCTION 'SUSR_SHOW_USER_DETAILS'
       EXPORTING
         BNAME = V_BNAME
         MANDT = V_MANDT
         .
ENDFORM. "SHOW_USER_DETAILS
*-----------------------------------------------------------------------
FORM CALL_SELECTION_SCREEN.
*-Show selection screen
  CALL SELECTION-SCREEN 1000 STARTING AT 20 2.
  IF SY-SUBRC = 0.
*---Refresh data
    PERFORM REFRESH_LIST.
  ELSE. PERFORM ACTION_CANCELLED. ENDIF.
ENDFORM. "CALL_SELECTION_SCREEN
*-----------------------------------------------------------------------
FORM NEXT_LANGUAGE.
*-For two-language environment it may be hard-coded, e.g.:
* IF P_LANGU = 'E'. P_LANGU = 'R'. ELSE. P_LANGU = 'E'. ENDIF.

*-Prevent ABAP Dump
  IF LANG_LEN IS INITIAL OR CANT_SWITCH_LANG = 'X'.
*--'Cannot switch language'
    MESSAGE S095.
  ELSE.
*---For multi-language environment it must be evaluated:
    LANG_POS = ( LANG_POS + 1 ) MOD LANG_LEN.
    P_LANGU = INST_LANG+LANG_POS(1).

    SET LANGUAGE P_LANGU.
*--'Set language &'
    MESSAGE S060 WITH P_LANGU.
  ENDIF.
ENDFORM. "NEXT_LANGUAGE
*-----------------------------------------------------------------------
FORM TRANSFER_SELECTION.
  DATA:
    WA  LIKE LINE OF IT
  , IDX LIKE SY-INDEX
  .
  DEFINE READLINE.
    READ LINE IDX FIELD VALUE &1. MOVE &1 TO &2.
  END-OF-DEFINITION. "READLINE
  DO.
    IDX = SY-INDEX + 3.
    READ LINE IDX.
    IF SY-SUBRC = 0.
      CLEAR WA.
      READLINE IT-MANDT      WA-MANDT     .
      READLINE IT-AGR_NAME   WA-AGR_NAME  .
*     READLINE IT-PARENT_AGR WA-PARENT_AGR.
*     READLINE IT-CREATE_USR WA-CREATE_USR.
*     READLINE IT-CREATE_DAT WA-CREATE_DAT.
*     READLINE IT-CREATE_TIM WA-CREATE_TIM.
*     READLINE IT-CREATE_TMP WA-CREATE_TMP.
*     READLINE IT-CHANGE_USR WA-CHANGE_USR.
*     READLINE IT-CHANGE_DAT WA-CHANGE_DAT.
*     READLINE IT-CHANGE_TIM WA-CHANGE_TIM.
*     READLINE IT-CHANGE_TMP WA-CHANGE_TMP.
*     READLINE IT-ATTRIBUTES WA-ATTRIBUTES.
*     READLINE IT-TEXT       WA-TEXT      .
*     READLINE IT-NR         WA-NR        .
      READLINE IT-MARK       WA-MARK      .

*     MODIFY IT FROM WA INDEX SY-INDEX.
      READ TABLE IT WITH KEY MANDT    = WA-MANDT
                             AGR_NAME = WA-AGR_NAME
                             .
      IF SY-SUBRC = 0.
        IT-MARK = WA-MARK.
        MODIFY IT INDEX SY-TABIX.
      ENDIF.
    ELSE. EXIT. ENDIF.
  ENDDO.
ENDFORM. "TRANSFER_SELECTION
*-----------------------------------------------------------------------
DEFINE MAC_MARK_MASS.
  IT-MARK = &1.
  MODIFY IT TRANSPORTING MARK WHERE MARK = &2.
END-OF-DEFINITION. "MAC_MARK_MASS
*-----------------------------------------------------------------------
FORM SELECT_ALL.
  MAC_MARK_MASS 'X' ' '.
ENDFORM. "SELECT_ALL
*-----------------------------------------------------------------------
FORM SELECT_NONE.
  MAC_MARK_MASS ' ' 'X'.
ENDFORM. "SELECT_NONE
*-----------------------------------------------------------------------
FORM INVERT_SELECTION.
  MAC_MARK_MASS 'A' 'X'.
  MAC_MARK_MASS 'X' ' '.
  MAC_MARK_MASS ' ' 'A'.
ENDFORM. "INVERT_SELECTION
*-----------------------------------------------------------------------
DEFINE SET_FCODE_EX.
  CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'
       EXPORTING
         FUNCTIONCODE = &1
       EXCEPTIONS
         OTHERS       = &2
         .
END-OF-DEFINITION. "SET_FCODE_EX
*-----------------------------------------------------------------------
DEFINE SET_FCODE.
  SET_FCODE_EX &1 0. " <-- Mask all exceptions here
END-OF-DEFINITION. "SET_FCODE
*-----------------------------------------------------------------------
DEFINE CHECK_MARK_EXISTS.
  PERFORM TRANSFER_SELECTION.
  READ TABLE IT WITH KEY MARK = 'X'.
END-OF-DEFINITION. "CHECK_MARK_EXISTS
*-----------------------------------------------------------------------
FORM CROP_VIEW.
  CHECK_MARK_EXISTS.
  IF SY-SUBRC = 0.
    DELETE IT WHERE MARK = SPACE.
    V_FILTERED = '*'.
    CLEAR SAV_IDX.
    PERFORM COUNT_ENTRIES.
    PERFORM WRITE_LIST.
    SET_FCODE 'P--'.
  ELSE.
*--'Select at least one line'
    MESSAGE S633(L3).
  ENDIF.
ENDFORM. "CROP_VIEW
*-----------------------------------------------------------------------
FORM EXPORT_TO_CLIPBOARD TABLES DATA_TAB.
  CALL FUNCTION 'CLPB_EXPORT'
       TABLES
         DATA_TAB   = DATA_TAB
       EXCEPTIONS
         CLPB_ERROR = 1
         .
  IF SY-SUBRC <> 0.
*--'Error when copying to clipboard'
    MESSAGE E829(ED).
  ELSE.
*--'The block was copied to the buffer'
    MESSAGE S814(ED).
    FREE DATA_TAB.
  ENDIF.
ENDFORM. "EXPORT_TO_CLIPBOARD
*-----------------------------------------------------------------------
FORM EXPORT_TO_CLIPBOARD_MAIN.
  CHECK_MARK_EXISTS.
  IF SY-SUBRC = 0.
    CLEAR AGRLIST[].
    LOOP AT IT ASSIGNING <FS> WHERE MARK = 'X'.
      AGRLIST-AGR_NAME = <FS>-AGR_NAME. APPEND AGRLIST.
    ENDLOOP.
    PERFORM EXPORT_TO_CLIPBOARD TABLES AGRLIST.
  ELSE.
*--'Select at least one line'
    MESSAGE S633(L3).
  ENDIF.
ENDFORM. "EXPORT_TO_CLIPBOARD_MAIN
*-----------------------------------------------------------------------
RANGES R_ROLES FOR AGR_DEFINE-AGR_NAME.

FORM IMPORT_FROM_CLIPBOARD TABLES DATA_TAB.
  CALL FUNCTION 'CLPB_IMPORT'
       TABLES
         DATA_TAB   = DATA_TAB
       EXCEPTIONS
         CLPB_ERROR = 1
         .
  IF SY-SUBRC <> 0.
*--'Error when copying from clipboard'
    MESSAGE E830(ED).
* ELSE.
**-'The block was copied from the buffer'
**  MESSAGE S???(ED).
  ENDIF.
ENDFORM. "IMPORT_FROM_CLIPBOARD
*-----------------------------------------------------------------------
FORM IMPORT_AND_PREPARE.
  PERFORM IMPORT_FROM_CLIPBOARD TABLES AGRLIST.
  SORT AGRLIST BY AGR_NAME.
  DELETE ADJACENT DUPLICATES FROM AGRLIST.

  REFRESH R_ROLES.
  LOOP AT AGRLIST.
    R_ROLES-SIGN   = 'I'.
    R_ROLES-OPTION = 'EQ'.
    R_ROLES-LOW    =  AGRLIST-AGR_NAME.
    TRANSLATE R_ROLES-LOW TO UPPER CASE.
    APPEND R_ROLES.
  ENDLOOP.
ENDFORM. "IMPORT_AND_PREPARE
*-----------------------------------------------------------------------
DEFINE MARK_FROM_CLIPB.
  PERFORM TRANSFER_SELECTION.
  PERFORM IMPORT_AND_PREPARE.

  IF R_ROLES[] IS INITIAL.
*--'Clipboard is empty'
    MESSAGE S094.
  ELSE.
    READ TABLE &1 INDEX 1. &2 = 'X'.
    MODIFY &1 TRANSPORTING MARK WHERE AGR_NAME IN R_ROLES.

    FREE AGRLIST.
    PERFORM &3.
  ENDIF.
END-OF-DEFINITION. "MARK_FROM_CLIPB
*-----------------------------------------------------------------------
FORM MARK_FROM_CLIPBOARD_MAIN.
  MARK_FROM_CLIPB IT    IT-MARK    WRITE_LIST.
ENDFORM. "MARK_FROM_CLIPBOAD_MAIN
*-----------------------------------------------------------------------
DATA:
  F_1STMARK                         "First marker of block in MAIN
, MARK1       LIKE SY-TABIX         "Marker 1 in MAIN
, MARK2       LIKE SY-TABIX         "Marker 2 in MAIN
.
FORM INIT_BLOCK.
  CLEAR: F_1STMARK, MARK1, MARK2.
ENDFORM. "INIT_BLOCK
*-----------------------------------------------------------------------
FORM SELECT_BLOCK.
  DATA TMP_IDX LIKE SY-TABIX.

  IF SY-CUROW GT HEAD_LN AND        "If relative line > HEAD_LN and
     SY-LILLI LE LAST_LN.           "  absolute line inside of list

    TMP_IDX = SY-LILLI.
    PERFORM TRANSFER_SELECTION.
    READ LINE TMP_IDX.

    PERFORM TOGGLE_FLAG CHANGING F_1STMARK.
    READ TABLE IT WITH KEY MANDT    = IT-MANDT
                           AGR_NAME = IT-AGR_NAME
                           .
    IF SY-SUBRC = 0.
*     PERFORM TRANSFER_SELECTION.
      IF F_1STMARK = 'X'.
        MARK1 = SY-TABIX.
*------'& is beginning of block. Choose the end of block.'.
        MESSAGE S093 WITH IT-AGR_NAME.
      ELSE.
        MARK2 = SY-TABIX.
        IF MARK1  > MARK2.
          TMP_IDX = MARK1.
          MARK1   = MARK2.
          MARK2   = TMP_IDX.
        ENDIF.
        LOOP AT IT ASSIGNING <FS> FROM MARK1 TO MARK2.
          <FS>-MARK = 'X'.
        ENDLOOP.
        PERFORM RESTORE_LIST.
      ENDIF.
    ELSE. PERFORM INIT_BLOCK. ENDIF.
  ENDIF.
ENDFORM. "SELECT_BLOCK
*-----------------------------------------------------------------------
