FTN4
      PROGRAM QY20(5,90),92069-16060 REV.1912 790109
C 
C 
C*************************************************************
C (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS    *
C RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- *
C PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH-  *
C OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.  *
C*************************************************************
C 
C 
C     SOURCE:    92069-18083
C     RELOC:     92069-16060
C 
C 
C************************************************************ 
C 
C 
C 
C 
C 
C  REPORT GENERATION IS MADE UP OF THREE MODULES: 
C  1) QS06 - INITIALIZATION 
C  2) QS15 - CONTROL BREAKS 
C  3) QS12 - TOTALS 
C  4) QS20 - GROUPS/DETAILS 
C 
C 
C  REPORT TABLE FORMAT IN ARRAY SS(6,100).
C  THIS TABLE IS BUILT BY QS02, LOGIC 
C  CHECKED BY QS04, AND SORTED (IF NEEDED)
C  BY QS05. 
C 
C  EACH ROW OF ARRAY S CONTAINS INFORMATION 
C  ABOUT EACH REPORT STATEMENT: 
C 
C     1. REPORT STATEMENT TYPE
C         10-15 SORT STATEMENT
C         21-25 HEADER STATEMENT
C         31-36 TOTAL STATEMENT 
C         41-46 GROUP STATEMENT 
C         50-59 DETAIL STATEMENT
C         60-69 EDIT MASKS
C 
C     2. DATA-ITEM NUMBER 
C 
C     3. LITERAL POINTER TO QSKIB.  QSKIB IS AN RTE TRACK 
C        WHICH CONTAINS ALL LITERALS OR EDIT
C        MASKS IN A2 FORMAT, PRECEDED BY IT'S 
C        CHARACTER LENGTH.
C 
C     4. END PRINT POSITION 
C 
C     5. REPORT OPTION 1
C        UNITS PLACE     = SPACE BEFORE (0-5) 
C        TENS PLACE      = SPACE AFTER  (0-5) 
C        HUNDREDS PLACE  = SKIP BEFORE (0-1)
C        THOUSANDS PLACE = SKIP AFTER (0-1) 
C        TEN THOUSANDS   = ADD (0-1)
C 
C     6. REPORT OPTION 2
C        UNITS PLACE  = O NO EDIT  = 1 ZERO SUPPRESS
C        60 - 69  EDIT MASK 
C        HUNDREDS PLACE  = COUNT (0-1)
C        THOUSANDS PLACE = AVERAGE (0-1)
C 
C     7. OFFSET INTO THE LIST-ARRAY 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C     T ARRAY IS USED TO HOLD INDEX INTO LIST-ARRAY FOR SORT FIELDS 
C 
C     U ARRAY IS USED TO FOR TOTAL COUNT
C        1. FIELD MAP          (1,I)
C        2. ACCUMULATE COUNTS  (2,I) - (7,I)
C 
C     ATOTAL ARRAY IS FOR TOTAL ADD 10*5
C       NOTE: THERE CAN BE NO MORE THAN 10 ITEMS TOTALED ON 
C 
C     LIST ARRAY CONTAINS INFORMATION ABOUT THE DBMS DATA BUFFER
C 
C         FIRST ENTRY IS DIFFERENT THAN THE OTHERS
C            1. CONTAINS # OF ENTRIES IN ARRAY
C            2 - 5. ARE EMPTY 
C            6. CONTAINS THE # OF SORT ITEMS
C                 NOTE: ALL THE SORT ITEMS ARE AT THE TOP OF THE ARRAY
C 
C         OTHER ENTRIES 
C            1. ITEM NUMBER 
C            2. ITEM TYPE 
C            3. ITEM LENGTH 
C            4. ELEMENT COUNT 
C            5. OFFSET INTO DBMS BUFFER 
C            6. CONTAIN THE ITEM NUMBER IFF IT IS A SORT ITEM 
C 
C 
C 
C    LEVSTR ARRAY IS AN 66 BY 5 ARRAY WHICH CONTAINS THE LEVEL BREAK
C     STRINGS 
C 
C    LEVLEN ARRAY CONTAINS THE LENGTHS OF EACH STRING 
C 
C 
C 
C 
C 
      LOGICAL HDFLG 
      LOGICAL LEVBRK
      INTEGER CS(66),V(8),NTST,N
      REAL    DINT,REAL 
      INTEGER INTGR,R 
C$$$$$$$$$$$$$$$$$$$ NOVEMBER 3,1978   $$$$$$$$$$$$$$$$$$$$$
      INTEGER INLU,ITTY,ILP,IDCB,JDCB,XEQ 
      INTEGER DBNAM,DBLEV,DSNAM,DINAM,SELECT,SNAM 
      INTEGER DSNUM,DINUM,PARM,LPARM,ECHO,QSERR 
      INTEGER IMA,IB,IBSZ,SECNO,IEND,ISCAN
      LOGICAL BREAK 
      INTEGER IPFLAG,IOFLAG,RMOTE 
      LOGICAL BATCH,XQBCH 
      INTEGER PAGCNT,LNCNT
      INTEGER PAGLEN,COLLIM 
      REAL    RRCNT 
      REAL    SELT,RSEC 
      INTEGER IPTR
      REAL    RCOUNT
      INTEGER S,R3,TRKNM,IDILU
      INTEGER R6
      REAL    ATOTAL
      INTEGER LIST,L,T,U
      INTEGER LEVSTR,LEVLEN 
      INTEGER IBUFF 
      INTEGER SS(7,100) 
C 
      COMMON INLU(145),ITTY(145),ILP(145),IDCB(145),JDCB(144),XEQ(145)
      COMMON DBNAM(10),DBLEV(3),DSNAM(3),DINAM(3),SELECT(6),SNAM(3) 
      COMMON DSNUM,DINUM,PARM(40),LPARM,ECHO,QSERR
      COMMON IMA(37),IB(896),IBSZ,SECNO,IEND,ISCAN
      COMMON BREAK
      COMMON IPFLAG,IOFLAG,RMOTE
      COMMON BATCH,XQBCH
      COMMON PAGCNT,LNCNT 
      COMMON PAGLEN,COLLIM
      COMMON RRCNT
      COMMON SELT(64),RSEC
      COMMON IPTR 
      COMMON RCOUNT 
      COMMON S(15,50),R3,TRKNM,IDILU
      COMMON R6 
      COMMON ATOTAL(6,5)
      COMMON LIST(101,6),L(7),T(5),U(7,5) 
      COMMON LEVSTR(66,5),LEVLEN(5) 
      COMMON IBUFF(2048)
C 
      EQUIVALENCE (S,SS)
C$$$$$$$$$$$$$$$$$$$ NOVEMBER 3,1978   $$$$$$$$$$$$$$$$$$$$$
      DATA INTGR/111B/
      DATA R/122B/
      DATA HDFLG/.FALSE./ 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C BEGIN 
C 
C ACCUMULATE COUNTS AND TOTALS
C 
      DO 50 I = 1,5 
      IF( U(1,I) .EQ. 0) GOTO 60
C 
C INCREASE COUNT ON EACH LEVEL
C 
      DO 10 I2 = 2,7
      U(I2,I) = U(I2,I) + 1 
10    CONTINUE
C 
C ACCUMULATE
C 
      LNDX = U(1,I) 
      IOFF = LIST(LNDX,5) 
      IOFF2 = IOFF + LIST(LNDX,3) - 1 
      ITYPE = LIST(LNDX,2)
C 
C INTEGER?
C 
      IF(ITYPE .NE. INTGR) GOTO 30
      CALL SMOVE(IBUFF,IOFF,IOFF2,INUM,1) 
      DINT = DBLEI(INUM)
C 
C 
C 
      DO 20 I3 = 1,6
      ATOTAL (I3,I) = DAD(ATOTAL(I3,I),DINT)
20    CONTINUE
      GOTO 50 
C 
C REAL
C 
30    CONTINUE
      IF(ITYPE .NE. R) GOTO 50
      CALL SMOVE(IBUFF,IOFF,IOFF2,REAL,1) 
      DO 40 I3 = 1,6
      ATOTAL(I3,I) = ATOTAL(I3,I) + REAL
40    CONTINUE
C 
C 
C END OF MAJOR LOOP 
C 
C 
50    CONTINUE
C 
C 
C 
C 
C 
C 
C 
C 
C PRINT GROUPS WITH DETAIL STATEMENTS 
C 
60    CONTINUE
      CALL SFILL(CS,1,COLLIM,40B) 
      BREAK = .FALSE. 
      LEVBRK = .FALSE.
C 
C 
C 
      DO 90 I = 1,R3
      N = SS(1,I) 
      IF(N .EQ. 50) GOTO 75 
      IF(N .LT. 40  .OR.  N .GT. 49) GOTO 90
C 
C BUFFER THE INPUT LINE 
C 
      IF(L(N-40) .NE. 0) GOTO 90
C 
C SET LEVBRK TRUE SO IF LAST LINE IT WILL BE PRINTED
C 
75    CONTINUE
      LEVBRK = .TRUE. 
C 
C BUFFER THE FIELD
C 
      CALL BUFLN(I,V,CS)
C 
C 
C 
C END OF LOOP 
C 
90    CONTINUE
C 
C PRINT THE LAST LINE IF NECESSARY
C 
      IF( .NOT. LEVBRK) GOTO 120
      CALL PRTLN(CS,COLLIM,V,HDFLG) 
      IF(BREAK) GOTO 180
C 
C PRINT ALL THE DETAIL LINES
C 
120   CONTINUE
      NTST = 0
      DO 150 I = 1,R3 
      N = SS(1,I) 
      IF(N .LT. 51  ) GOTO 150
      IF(N .GT. 59  ) GOTO 160
      IF(NTST .EQ. N  .OR. NTST .EQ. 0) GOTO 140
      CALL PRTLN(CS,COLLIM,V,HDFLG) 
      IF(BREAK) GOTO 180
C 
C BUFFER THE FIELD
C 
140   CONTINUE
      NTST = N
      CALL BUFLN(I,V,CS)
150   CONTINUE
C 
C PRINT THE LAST LINE 
C 
160   CONTINUE
      IF(NTST .EQ. 0) GOTO 170
      CALL PRTLN(CS,COLLIM,V,HDFLG) 
      IF(BREAK) GOTO 180
C 
C 
C 
170   CONTINUE
      SNAM(2) = 2H15
C 
C LOAD AND EXECUTE SEGMENT
C 
175   CONTINUE
      CALL LOAD(SNAM) 
C 
C ERROR EXIT
C 
180   CONTINUE
      SNAM(2) = 2H
      GOTO 175
      END 
                                                                                              