REPORT ZURLS.
************************************************************************
* This program dynamically increases/decreases the number of
* dialog/batch workpocesses by 1,2,3 or 4. Before running the program
* two working test (non-productive) operation mode has to be created
* called flex1 and flex2.
* The program does not switch workprocesses, if the workprocess number
* gets too low (min. dia: 2, min. btc.: 1)
* The instance name is hardcoded in this program version!
************************************************************************
TABLES: TPFID.
PARAMETERS:
      PLUS_4 RADIOBUTTON GROUP AAA,
      PLUS_3 RADIOBUTTON GROUP AAA,
      PLUS_2 RADIOBUTTON GROUP AAA,
      PLUS_1 RADIOBUTTON GROUP AAA,
      MINUS_1 RADIOBUTTON GROUP AAA,
      MINUS_2 RADIOBUTTON GROUP AAA,
      MINUS_3 RADIOBUTTON GROUP AAA,
      MINUS_4 RADIOBUTTON GROUP AAA.
DATA: SWITCH_TO_OPMODE LIKE TPFID-BANAME,
      RECENT_OPMODE LIKE TPFID-BANAME.
DATA: MIN_DIA      TYPE I VALUE '2',
      MIN_BTCH     TYPE I VALUE '1',
      RECENT_DIA   TYPE I,
      RECENT_BTCH  TYPE I,
      TARGET_DIA   TYPE I,
      TARGET_BTCH  TYPE I.
DATA: BEGIN OF REQ_TBL OCCURS 20.
      INCLUDE STRUCTURE STHCMLIST.
DATA: END OF REQ_TBL.
DATA: BEGIN OF RSP_TBL OCCURS 50.
      INCLUDE STRUCTURE STHCMLIST.
DATA: END OF RSP_TBL.
DATA: SUBRC LIKE SY-SUBRC.

* Find out the active operation
CALL FUNCTION 'RZL_MAKE_STRG_READ_REQ'
     EXPORTING
          NAME    = 'RZL_BANAME'
          TYP     = 'C'
     TABLES
          REQ_TBL = REQ_TBL.

CALL FUNCTION 'TH_SEND_ADM_MESS'
     EXPORTING
          LEVEL           = 2
          SERVER_NAME     = 'instance_name' "e.g. hostname_SID_00
          SERVER_TYPES    = 0
          WAIT_FOR_ANSWER = 1
          TRACE           = 1
     IMPORTING
          SUBRC           = SUBRC
     TABLES
          IN_DATA         = REQ_TBL
          OUT_DATA        = RSP_TBL
     EXCEPTIONS
          SEND_ERROR      = 1
          OTHERS          = 2.

READ TABLE RSP_TBL INDEX 1.
RECENT_OPMODE = RSP_TBL-BUFFER+24.

* Determine the switch_to operation mode
IF RECENT_OPMODE = 'flex1'.
  SWITCH_TO_OPMODE = 'flex2'.
ELSE.
  SWITCH_TO_OPMODE = 'flex1'.
ENDIF.

* Determine the current workprocess number.
SELECT * FROM TPFID WHERE BANAME = RECENT_OPMODE.
ENDSELECT.
RECENT_DIA = TPFID-WPNODIA.
RECENT_BTCH = TPFID-WPNOBTC.

* Is the switch is possible? (min. dia=2, min. batch=1)
IF PLUS_4 = 'X'. TARGET_DIA = RECENT_DIA + 4. ENDIF.
IF PLUS_3 = 'X'. TARGET_DIA = RECENT_DIA + 3. ENDIF.
IF PLUS_2 = 'X'. TARGET_DIA = RECENT_DIA + 2. ENDIF.
IF PLUS_1 = 'X'. TARGET_DIA = RECENT_DIA + 1. ENDIF.
IF MINUS_1 = 'X'. TARGET_DIA = RECENT_DIA - 1. ENDIF.
IF MINUS_2 = 'X'. TARGET_DIA = RECENT_DIA - 2. ENDIF.
IF MINUS_3 = 'X'. TARGET_DIA = RECENT_DIA - 3. ENDIF.
IF MINUS_4 = 'X'. TARGET_DIA = RECENT_DIA - 4. ENDIF.

TARGET_BTCH = RECENT_DIA + RECENT_BTCH - TARGET_DIA.

IF TARGET_DIA < MIN_DIA.
  WRITE: 'ERROR: less then ',MIN_DIA, 'dialog process is not permitted'.
  EXIT.
ENDIF.

IF TARGET_BTCH < MIN_BTCH.
  WRITE: 'ERROR: less then ',MIN_BTCH, 'batch process is not permitted'.
  EXIT.
ENDIF.

* Modify the instance definition
SELECT * FROM TPFID WHERE BANAME = SWITCH_TO_OPMODE.
ENDSELECT.
TPFID-WPNODIA = TARGET_DIA.
TPFID-WPNOBTC = TARGET_BTCH.
MODIFY TPFID.
COMMIT WORK.

* Carry out the actual switch
CALL FUNCTION 'RZL_SWITCH_TO_BA'
     EXPORTING
     BANAME = SWITCH_TO_OPMODE.