REPORT YSYSCHK2 NO STANDARD PAGE HEADING.
*
* This ABAP can display the most important parameters of many SAP
* systems parallel. These parameters: tablespace free space history,
* table and index extent history, space critical objects. The list
* contains in a very compact and ordered format the recent, 1 day old,
* 2 days old, 1 week old, 2 weeks old, 1 month old, 2 months old
* values.
* To make the program work, the /oracle/SID/sapcheck directories
* have to be linked to the shared /usr/sap/trans/sapcheck/SID from
* all the db. servers.
* The sapdba -check has to be scheduled to run daily on all those 
* servers too.
*
* List of the systems to monitor:
*@ DEV
*@ QAS
*@ PRD

DATA: DAY TYPE D, FLAG, COUNTER TYPE I, TFIELD(3), OFFSET TYPE I,
SID(28), FILE(40), LINE(80), STOP LIKE SY-INDEX, START LIKE SY-INDEX,
NOS TYPE I,
BEGIN OF A OCCURS 10,
 A(100),
END OF A,
BEGIN OF B OCCURS 100,
 B(300),
END OF B,
BEGIN OF C OCCURS 50,
 C(20),
 1(3), 2(3), 3(3), 4(3), 5(3), 6(3), 7(3),
END OF C.

*Find out which systems to monitor
DATA: PROGRAM LIKE SY-REPID,
      BEGIN OF T OCCURS 500,
        LINE(72),
      END   OF T.
PROGRAM = SY-REPID.
READ REPORT PROGRAM INTO T.
LOOP AT T.
  IF T(2) <> '*@'. DELETE T. ENDIF.
ENDLOOP.
DESCRIBE TABLE T LINES NOS.
*Loop on the sytems
LOOP AT T.
  SKIP 3.
  WRITE: / 'SYSTEM ' COLOR 6, T+3(3) COLOR 6.
  SKIP.
  CLEAR A. REFRESH A.
  CLEAR B. REFRESH B.
  CLEAR C. REFRESH C.
  COUNTER = 0.
  FLAG = ' '.
  CLEAR START.
  CLEAR STOP.
  SID = '/usr/sap/trans/sapcheck/'.
  SID+24(3) = T+3(3).
  SID+27(1) = '/'.
  WRITE: / 'Free % in tablespaces' COLOR 3.
  SKIP.
  DAY = SY-DATUM.DAY = DAY.

  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.
  DAY = DAY - 1.
  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.
  DAY = DAY - 1.
  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.
  DAY = DAY - 5.
  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.
  DAY = DAY - 7.
  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.
  DAY = DAY - 15.
  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.
  DAY = DAY - 30.
  A = DAY.A+8(20) = '0730.chk'.SHIFT A LEFT BY 2 PLACES.APPEND A.

  LOOP AT A.
    SHIFT A RIGHT BY 28 PLACES.
    A(28) = SID.
    MODIFY A.
  ENDLOOP.

  LOOP AT A.
    OPEN DATASET A FOR INPUT IN TEXT MODE.
    IF SY-SUBRC = 0.
      DO.
        READ DATASET A INTO B.
        IF SY-SUBRC <> 0.EXIT.ENDIF.
        IF B CS 'fragment'.
          IF B CS 'End'.
            STOP = SY-INDEX.STOP = STOP - 4.
          ELSE.
            START = SY-INDEX.START = START + 5.
          ENDIF.
        ENDIF.
      ENDDO.
      CLOSE DATASET A.
      OPEN DATASET A FOR INPUT IN TEXT MODE.
      STOP = STOP - START.
      DO START TIMES.
        READ DATASET A INTO B.
      ENDDO.
      DO STOP TIMES.
        READ DATASET A INTO B.
        APPEND B.
      ENDDO.
      CLOSE DATASET A.
    ENDIF.
    CLOSE DATASET A.
    B = '#####'.
    APPEND B.
  ENDLOOP.

  LOOP AT B.
    IF FLAG = ' '.                     "elso sorozat
      IF B(1) = '#'.                   "vege egy sorozatnak
        FLAG = 1.
      ELSE.
        C-C = B(20).C-1 = B+45(2).
        APPEND C.
      ENDIF.
    ELSE.
      IF B(1) = '#'.
        COUNTER = COUNTER + 1.
      ELSE.
        READ TABLE C WITH KEY B(20).
        IF SY-SUBRC = 0.
          OFFSET = ( COUNTER + 1 ) * 3 + 20.
          C+OFFSET(3) = B+45(2).
          MODIFY C INDEX SY-TABIX.
        ELSE.
          CLEAR C.
          OFFSET = ( COUNTER + 1 ) * 3 + 20.
          C-C = B(20).
          C+OFFSET(3) = B+45(2).
          APPEND C.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
  WRITE: / 'TABLESPACE          today'.
  WRITE: / '                    :  -1 day'.
  WRITE: / '                    :  :  -2 days'.
  WRITE: / '                    :  :  :  -1 week'.
  WRITE: / '                    :  :  :  :  -2 weeks'.
  WRITE: / '                    :  :  :  :  :  -1 month'.
  WRITE: / '                    :  :  :  :  :  :  -2 months'.
  WRITE: / '                    :  :  :  :  :  :  :'.
  SORT C BY 1 DESCENDING 2 DESCENDING 3 DESCENDING 4 DESCENDING
  5 DESCENDING 6 DESCENDING 7 DESCENDING.
  LOOP AT C.
    WRITE: / C.
  ENDLOOP.

  CLEAR B.REFRESH B.
  LOOP AT A.
    CLEAR START. CLEAR STOP. FLAG = '0'.
    OPEN DATASET A FOR INPUT IN TEXT MODE.
    IF SY-SUBRC = 0.
      DO.
        READ DATASET A INTO B.
        IF SY-SUBRC <> 0.EXIT.ENDIF.
*     if b cs 'more' and b cs 'extents'.
        IF B CS 'List of all tables and indexes'.
          START = SY-INDEX.START = START + 4.
          FLAG = '1'.
        ENDIF.
        IF FLAG = '1' AND B CS '***************************'.
          FLAG = '0'.
          STOP = SY-INDEX.STOP = STOP - 2.
        ENDIF.
      ENDDO.
      CLOSE DATASET A.
      OPEN DATASET A FOR INPUT IN TEXT MODE.
      IF NOT STOP = START.
        STOP = STOP - START.
      ENDIF.
      DO START TIMES.
        READ DATASET A INTO B.
      ENDDO.
      DO STOP TIMES.
        READ DATASET A INTO B.
        APPEND B.
      ENDDO.
      CLOSE DATASET A.
    ENDIF.
    CLOSE DATASET A.
    B = '#####'.
    APPEND B.
  ENDLOOP.

  CLEAR C.REFRESH C.FLAG = ' '. COUNTER = 0.
  LOOP AT B.
    IF FLAG = ' '.                     "elso sorozat
      IF B(1) = '#'.                   "vege egy sorozatnak
        FLAG = 1.
      ELSE.
        C-C = B+41(20).C-1 = B+73(3).
        APPEND C.
      ENDIF.
    ELSE.
      IF B(1) = '#'.
        COUNTER = COUNTER + 1.
      ELSE.
        READ TABLE C WITH KEY B+41(20).
        IF SY-SUBRC = 0.
          OFFSET = ( COUNTER + 1 ) * 3 + 20.
          C+OFFSET(3) = B+73(3).
          MODIFY C INDEX SY-TABIX.
        ELSE.
          CLEAR C.
          OFFSET = ( COUNTER + 1 ) * 3 + 20.
          C-C = B(20).
          C+OFFSET(3) = B+73(3).
          APPEND C.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
  SKIP 3.
  WRITE: / 'Extent # over 90' COLOR 3.
  SKIP.
  WRITE: / 'SEGMENT               today'.
  WRITE: / '                      :   -1 day'.
  WRITE: / '                      :   :  -2 days'.
  WRITE: / '                      :   :   :   -1 week'.
  WRITE: / '                      :   :   :   :   -2 weeks'.
  WRITE: / '                      :   :   :   :   :   -1 month'.
  WRITE: / '                      :   :   :   :   :   :   -2 months'.
  WRITE: / '                      :   :   :   :   :   :   :'.
  SORT C BY 1 DESCENDING 2 DESCENDING 3 DESCENDING 4 DESCENDING
  5 DESCENDING 6 DESCENDING 7 DESCENDING.
  LOOP AT C.
    WRITE: / C-C, C-1, C-2, C-3, C-4, C-5, C-6, C-7.
  ENDLOOP.

  CLEAR B.REFRESH B.
  READ TABLE A INDEX 1.
  CLEAR START. CLEAR STOP. FLAG = '0'.
  OPEN DATASET A FOR INPUT IN TEXT MODE.
  IF SY-SUBRC = 0.
    DO.
      READ DATASET A INTO B.
      IF SY-SUBRC <> 0.EXIT.ENDIF.
      IF B CS 'Critical'.
        START = SY-INDEX.
        FLAG = '1'.
      ENDIF.
      IF FLAG = '1' AND B CS '*****************'.
        FLAG = '0'.
        STOP = SY-INDEX - 1.
      ENDIF.
    ENDDO.
    CLOSE DATASET A.
    OPEN DATASET A FOR INPUT IN TEXT MODE.
    STOP = STOP - START.
    DO START TIMES.
      READ DATASET A INTO B.
    ENDDO.
    DO STOP TIMES.
      READ DATASET A INTO B.
      APPEND B.
    ENDDO.
    CLOSE DATASET A.
  ENDIF.
  CLOSE DATASET A.

  SKIP 3.
  WRITE: / 'Critical objects' COLOR 3.
  SKIP.
  LOOP AT B.
    WRITE: / B.
  ENDLOOP.
ENDLOOP.