REPORT ZSSTAT20.

***********************************************************************
*                                                                     *
* This program displays the percentage of dialog steps ran under      *
* 1 second for the two peak business hours (the two contiguous one    *
* hour periods whose sum of dialog steps is the largest for all       *
* such periods of the day.                                            *
* The list displys the data by day between and including the start    *
* and end date specified on the input screen.                         *
* The percentage is an accumulated value for the servers determined   *
* on the selection screen.                                            *
*                                                                     *
***********************************************************************

TABLES: SAPWLACCTP.

PARAMETERS: STARTDAT  LIKE  SAPWLACCTP-STARTDATE DEFAULT SY-DATUM.
PARAMETERS: ENDDATE  LIKE  SAPWLACCTP-STARTDATE DEFAULT SY-DATUM.
SELECT-OPTIONS HOST FOR SAPWLACCTP-HOSTID.

DATA: PERIODTYPE LIKE  SAPWLACCTP-PERIODTYPE VALUE 'D',
      HOSTID     LIKE  SAPWLACCTP-HOSTID,
      DAY(9), NDAY TYPE I, INDX LIKE SY-TABIX.
DATA: BEGIN OF WEEK OCCURS 7,
      DAY(9),
END OF WEEK.
DATA: BEGIN OF TASKTYPE_STATISTIC OCCURS 50.
        INCLUDE STRUCTURE  SAPWLTSKTI.
DATA: END OF TASKTYPE_STATISTIC.
DATA: BEGIN OF TASKTYPE_SUM OCCURS 50,
      TIME LIKE SAPWLTSKTI-TIME,
      COUNT LIKE SAPWLTSKTI-COUNT,
      CSUM LIKE SAPWLTSKTI-COUNT,
      CNT001 LIKE SAPWLRTDIS-CNT001,
      CNT002 LIKE SAPWLRTDIS-CNT001,
      CNT003 LIKE SAPWLRTDIS-CNT001,
      CNT004 LIKE SAPWLRTDIS-CNT001,
      CNT005 LIKE SAPWLRTDIS-CNT001,
      CNT006 LIKE SAPWLRTDIS-CNT001,
      CNT007 LIKE SAPWLRTDIS-CNT001,
      CNT008 LIKE SAPWLRTDIS-CNT001,
      CNT009 LIKE SAPWLRTDIS-CNT001,
END OF TASKTYPE_SUM.

DATA: SUM TYPE P DECIMALS 1, ISUM LIKE SAPWLTSKTI-COUNT,
      KEY1 LIKE TASKTYPE_SUM-TIME, KEY2 LIKE TASKTYPE_SUM-TIME.

* Fill the week table
WEEK-DAY = 'Monday'. APPEND WEEK.
WEEK-DAY = 'Tuesday'. APPEND WEEK.
WEEK-DAY = 'Wednesday'. APPEND WEEK.
WEEK-DAY = 'Thursday'. APPEND WEEK.
WEEK-DAY = 'Friday'. APPEND WEEK.
WEEK-DAY = 'Saturday'. APPEND WEEK.
WEEK-DAY = 'Sunday'. APPEND WEEK.

* Display the selected servers and the list header
SKIP.
WRITE: / 'Accumulated data for servers:'.
LOOP AT HOST.
  WRITE: HOST-LOW.
ENDLOOP.
SKIP 3.
WRITE: /5 'Day-Date' COLOR 2, 28 'Time' COLOR 2,
        38 'Dialogue Steps' COLOR 2, 58 '% of Response <1s' COLOR 2.

* Loop on the days and collect the dialog step/response time data
WHILE ENDDATE >= STARTDAT.
  NDAY = STARTDAT MOD 7.
  IF NDAY > 1.
    NDAY = NDAY - 1.
  ELSE.
    NDAY = NDAY + 6.
  ENDIF.
  READ TABLE WEEK INDEX NDAY.
  CLEAR TASKTYPE_SUM.
  REFRESH TASKTYPE_SUM.
  LOOP AT HOST.
    HOSTID = HOST-LOW.
    PERFORM CALCULATE.
  ENDLOOP.
  SKIP.

* Determine and display the total number of dialog steps per day
  CLEAR ISUM.
  LOOP AT TASKTYPE_SUM.
    ISUM = ISUM + TASKTYPE_SUM-COUNT.
  ENDLOOP.
  WRITE: / STARTDAT, WEEK-DAY,  28 '*Total*',  38 ISUM.

* Delete the long night periods
  LOOP AT TASKTYPE_SUM.
    IF TASKTYPE_SUM-TIME CS '00--06'. DELETE TASKTYPE_SUM. ENDIF.
    IF TASKTYPE_SUM-TIME CS '21--24'. DELETE TASKTYPE_SUM. ENDIF.
  ENDLOOP.
* Find the two periods of the day with the most dialog steps
*  sort tasktype_sum by count descending.
*  loop at tasktype_sum.
*    if sy-tabix > 2. delete tasktype_sum. endif.
*  endloop.
*

* Find the two continuous periods of the day with the most dialog steps
  LOOP AT TASKTYPE_SUM.
    IF SY-TABIX = 1.
      ISUM = TASKTYPE_SUM-COUNT.
      CONTINUE.
    ELSE.
      TASKTYPE_SUM-CSUM = ISUM + TASKTYPE_SUM-COUNT.
      MODIFY TASKTYPE_SUM.
      ISUM = TASKTYPE_SUM-COUNT.
    ENDIF.
  ENDLOOP.
  SORT TASKTYPE_SUM BY CSUM DESCENDING.
  READ TABLE TASKTYPE_SUM INDEX 1.
  KEY1 = TASKTYPE_SUM-TIME.
  SORT TASKTYPE_SUM BY TIME.
  READ TABLE TASKTYPE_SUM WITH KEY TIME = KEY1.
  INDX = SY-TABIX - 1.
  READ TABLE TASKTYPE_SUM INDEX INDX.
  KEY2 = TASKTYPE_SUM-TIME.
  LOOP AT TASKTYPE_SUM.
    IF TASKTYPE_SUM-TIME <> KEY1 AND TASKTYPE_SUM-TIME <> KEY2.
      DELETE TASKTYPE_SUM.
    ENDIF.
  ENDLOOP.

* Display the two periods of the day with the most dialog steps
  LOOP AT TASKTYPE_SUM.
    SUM = TASKTYPE_SUM-CNT001 + TASKTYPE_SUM-CNT002 +
    TASKTYPE_SUM-CNT003 + TASKTYPE_SUM-CNT004 +
    TASKTYPE_SUM-CNT005 + TASKTYPE_SUM-CNT006.
    SUM = SUM * 100.
    SUM = SUM / TASKTYPE_SUM-COUNT.
    IF SUM < 90.
      WRITE: /28 TASKTYPE_SUM-TIME,
      38 TASKTYPE_SUM-COUNT, 62(5) SUM COLOR 3.
    ELSE.
      WRITE: /28 TASKTYPE_SUM-TIME,
      38 TASKTYPE_SUM-COUNT, 62(5) SUM.
    ENDIF.
  ENDLOOP.
  STARTDAT = STARTDAT + 1.
ENDWHILE.

*---------------------------------------------------------------------*
*       FORM CALCULATE                                                *
*---------------------------------------------------------------------*
*       Collect the statistics data                                   *
*---------------------------------------------------------------------*
FORM CALCULATE.
  CLEAR TASKTYPE_STATISTIC.
  REFRESH TASKTYPE_STATISTIC.
  CALL FUNCTION 'SAPWL_WORKLOAD_GET_STATISTIC'
       EXPORTING
            PERIODTYPE         = PERIODTYPE
            HOSTID             = HOSTID
            STARTDATE          = STARTDAT
       TABLES
            TASKTYPE_STATISTIC = TASKTYPE_STATISTIC
       EXCEPTIONS
            NO_DATA_FOUND      = 1.
  LOOP AT TASKTYPE_STATISTIC.
    CLEAR TASKTYPE_SUM.
    IF TASKTYPE_STATISTIC-TASKTYPE = 'DIALOG'.
      MOVE-CORRESPONDING TASKTYPE_STATISTIC TO TASKTYPE_SUM.
      COLLECT TASKTYPE_SUM.
    ENDIF.
  ENDLOOP.
ENDFORM.