FTN4
      PROGRAM QY04(5,90),92069-16060 REV.2026 800507
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-18067
C     RELOC:     92069-16060
C 
C     ALTERED:   FEBRUARY 21, 1980 TO INCREASE SIZE OF X - CEJ
C 
C 
C************************************************************ 
C 
C 
C     THIS PROGRAM PERFORMS ALL THE LOGIC 
C     CHECKING FOR REPORT PROCEDURE 
C 
C 
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. OFFSET INTO LIST-ARRAY  (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 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
      INTEGER X(7),Q(255),R5
      INTEGER XASCII
      INTEGER R 
      INTEGER INFO(13)
      INTEGER ISTAT(10) 
      INTEGER ERR1(19)
      INTEGER ERR2(23)
      INTEGER ERR3(14)
      INTEGER ERR4(13)
      INTEGER ERR5(25)
      INTEGER ERR6(22)
      INTEGER ERR7(17)
      INTEGER ERR8(20)
      INTEGER ERR9(21)
      INTEGER ERR10(14) 
      INTEGER ERR11(18) 
      INTEGER ERR12(13) 
      INTEGER ERROR(8)
C 
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   $$$$$$$$$$$$$$$$$$$$$
C 
C SORT LEVEL XX IS MISSING OR DUPLICATED
      DATA ERR1/2H S,2HOR,2HT ,2HLE,2HVE, 
     1 2HL ,2HXX,2H I,2HS ,2HMI,2HSS,2HIN,
     2 2HG ,2HOR,2H D,2HUP,2HLI,2HCA,2HTE/
C DUPLICATE DATA ITEM NAMES IN SORT STATEMENTS
      DATA ERR2/2H D,2HUP,2HLI,2HCA,2HTE,2H D,
     1 2HAT,2HA ,2HIT,2HEM,2H N,2HAM,2HES,
     2 2H I,2HN ,2HSO,2HRT,2H S,2HTA,2HTE,2HME,2HNT,2HS / 
C CONTROL BREAK INCONSISTENCY 
      DATA ERR3/2H C,2HON,2HTR,2HOL,2H B,2HRE,
     1 2HAK,2H I,2HNC,2HON,2HSI,2HST,2HEN,2HCY/ 
C DUPLICATE EDIT STATEMENTS 
      DATA ERR4/2H D,2HUP,2HLI,2HCA,2HTE,2H E,
     1 2HDI,2HT ,2HST,2HAT,2HEM,2HEN,2HTS/
C INCONSISTENCY BETWEEN OPTIONS AND EDIT STATEMENTS 
      DATA ERR5/2H I,2HNC,2HON,2HSI,
     1 2HST,2HEN,2HCY,2H B,2HET,2HWE,2HEN,
     2 2H O,2HPT,2HIO,2HNS,2H A,2HND,2H E,
     3 2HDI,2HT ,2HST,2HAT,2HEM,2HEN,2HTS/
C SAME LINES HAVE CONFLICTING REPORT OPTIONS
      DATA ERR6/2H S,2HAM,2HE ,2HLI,2HNE,2HS ,
     1 2HHA,2HVE,2H C,2HON,2HFL,2HIC,2HTI,2HNG, 
     2 2H R,2HEP,2HOR,2HT ,2HOP,2HTI,2HON,2HS / 
C CONSTANT LITERAL AS EDIT OPTION 
      DATA ERR7/2H C,2HON,2HST,2HAN,2HT , 
     1 2HLI,2HTE,2HRA,2HL ,2HHA,2HS , 
     2 2HED,2HIT,2H O,2HPT,2HIO,2HN / 
C MORE THAN 5 FIELDS ARE BEING SORTED ON
      DATA ERR8/2H M,2HOR,2HE ,2HTH,2HAN,2H 5,
     1 2H F,2HIE,2HLD,2HS ,2HAR,2HE ,2HBE,
     2 2HIN,2HG ,2HTO,2HTA,2HLE,2HD ,2HON/
C REPORT CAN NOT BE GENERATED DUE TO ERRORS 
      DATA ERR9/2H R,2HEP,2HOR,2HT ,2HCA,2HNN,
     1 2HOT,2H B,2HE ,2HGE,2HNE,2HRA,2HTE,2HD , 
     2 2HDU,2HE ,2HTO,2H E,2HRR,2HOR,2HS /
C DETAIL LEVEL XX IS MISSING
      DATA ERR10/2H D,2HET,2HAI,2HL ,2HLE,2HVE,2HL ,2HXX,2H I,2HS , 
     &     2HMI,2HSS,2HIN,2HG / 
C CAN NOT ADD OR AVERAGE ASCII VALUES 
      DATA ERR11/2H C,2HAN,2H N,2HOT,2H A,2HDD,2H O,2HR ,2HAV,2HER, 
     &     2HAG,2HE ,2HAS,2HCI,2HI ,2HVA,2HLU,2HES/ 
C ERROR NO. XXXXXX
      DATA ERROR/2HER,2HRO,2HR ,2HNO,2H. ,2HXX,2HXX,2HXX/ 
C CAN NOT EDIT REAL VALUES
      DATA ERR12/2H C,2HAN,2H N,2HOT,2H E,2HDI,2HT ,2HRE,2HAL,
     &   2H V,2HAL,2HUE,2HS / 
C 
      DATA XASCII/130B/ 
      DATA R/122B/
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C BEGIN 
C 
C CLEAR ERROR INDICATOR 
C 
      IE = 0
C 
C     SORT ARRAY SS(7 * 100) BY REPORT STATEMENT
C     INDEX AND END PRINT POSITION
C 
      IF(R3.EQ.1) GOTO 65 
      DO 60 N = 1,R3-1
      DO 50 I = N+1,R3
      DO 10 J=1,7 
      X(J) = SS(J,N)
   10 CONTINUE
      IF (X(1) - SS(1,I)) 50,20,30
   20 IF (X(4) - SS(4,I)) 50,50,30
   30 DO 40 J=1,7 
      SS(J,N) = SS(J,I) 
      SS(J,I) = X(J)
      X(J)   = SS(J,N)
   40 CONTINUE
   50 CONTINUE
   60 CONTINUE
C 
C     CHECK TO SEE IF SORT LEVELS ARE 
C       1) CONTIGUOUS,
C       2) ONLY ONE STATEMENT APPEARS FOR 
C          A NON-EMPTY SORT LEVEL, AND
C       3) DATA ITEM NAMES DISTINCT 
C 
   65 R5 = 0
      N = 11
      DO 70 I=1,255 
      Q(I) = 0
   70 CONTINUE
C 
C 
C 
C 
C 
C 
C 
C 
C 
      DO 78 I=1,R3
C 
C PROCESS SORT LEVELS (10 - 15) 
C 
      IF(SS(1,I).GT.15) GO TO 80
C 
C MORE THAN ONE SORT STATEMENT WITHOUT A LEVEL
C IS ALLOWED. ALL SORT STATEMENTS WITH LEVELS MUST BE UNIQUE
C 
      IF (SS(1,I).EQ.10) GO TO 74 
      IF (SS(1,I).EQ.N) GO TO 72
      IN = N - 10 
C 
C  ERROR - SORT LEVEL MISSING OR DUPLICATE
C 
      CALL CITA(IN,IMA) 
      ERR1(7) = IMA(3)
      CALL QRIO(2,ITTY,ERR1,19) 
      IE = 1
      N = SS(1,I) 
C 
C INDICATE NEXT EXPECTED LEVEL IN N 
C 
   72 N = N + 1 
C 
C BE SURE THIS ITEM HAS NOT ALREADY BEEN USED AS A SORT ITEM
C 
   74 J = SS(2,I) 
      IF (Q(J).EQ.0) GO TO 76 
C  ERROR - DUPLICATE DATA ITEM NAMES
      CALL QRIO(2,ITTY,ERR2,23) 
      IE = 1
   76 Q(J) = 1
C 
C COUNT SORT STATEMENTS IN R5 
C 
      R5 = R5 + 1 
   78 CONTINUE
C 
C 
C 
C 
C 
C 
C     CHECK FOR A MATCH BETWEEN SORT LEVELS,
C     GROUPS, AND TOTALS (OTHER THAN FINAL) 
C 
   80 N = N - 11
      DO 85 I=1,R3
C 
C PICK OFF SORT AND HEADING STATEMENTS
C 
      IF (SS(1,I).LT.30) GO TO 85 
C 
C PICK OFF DETAIL AND EDIT STATEMENTS 
C 
      IF (SS(1,I).GT.45) GO TO 90 
C 
C  PROCESS TOTAL AND GROUP STATEMENTS 
C 
      J = SS(1,I) - SS(1,I)/10 * 10 
      IF (J.EQ.6) GO TO 85
      IF (J.LE.N) GO TO 85
C  ERROR - CONTROL BREAK INCONSISTENCY
      CALL QRIO(2,ITTY,ERR3,14) 
      IE = 1
   85 CONTINUE
C 
C 
C 
C 
C 
C 
C 
C 
C 
C 
C     CHECK THAT EDIT MASKS ARE SEPARATE AND
C     DISTINCT, AND THAT EDIT MASKS SPECIFIED 
C     IN A DETAIL, GROUP, OR TOTAL STATEMENT
C     APPEAR AS REPORT STATEMENTS 
C 
   90 DO 91 I=1,255 
      Q(I) = 0
   91 CONTINUE
C 
C 
C 
      DO 95 I=1,R3
C 
C SKIP OVER SORT AND HEADING STATEMENTS 
C 
      IF (SS(1,I).LT.30) GO TO 95 
C 
C PICK OFF TOTAL, GROUP, AND DETAIL STATEMENTS
C 
      IF (SS(1,I).GT.59) GO TO 94 
      J = SS(6,I) - SS(6,I)/100 * 100 
      IF (J .LT. 60) GOTO 95
      N = J - 59
      Q(N) = J
      GOTO 95 
C 
C PROCESS EDIT STATEMENTS VERIFYING UNIQUE EDIT LEVELS
C 
94    IF (SS(1,I).NE.Q(11))GO TO 92 
C  ERROR - DUPLICATE EDIT STATEMENTS
      CALL QRIO(2,ITTY,ERR4,13) 
      IE = 1
   92 Q(11) = SS(1,I) 
      DO 93 J=1,10
      IF (Q(11).NE.Q(J))GO TO 93
      Q(J) = 0
      GO TO 95
93    CONTINUE
C 
C EDIT STATEMENT IS NOT USED
C 
      GO TO 97
   95 CONTINUE
C 
C 
C 
C 
C 
C 
C 
C 
C 
C VERIFY EACH EDIT STATEMENT WAS USED 
C 
      DO 96 I=1,10
      IF (Q(I).NE.0) GO TO 97 
   96 CONTINUE
      GO TO 100 
C 
C  ERROR - INCONSISTENCY BETWEEN OPTION AND EDIT STATEMENTS 
C 
   97 CALL QRIO(2,ITTY,ERR5,25) 
      IE = 1
C 
C 
C 
C 
C 
C VERIFY DETAIL STATEMENTS IN ORDER 
C 
100   CONTINUE
      N = 51
      DO 320 I =1,R3
      NLEV = SS(1,I)
C 
C PICK OUT DETAIL STATEMENTS
C 
      IF(NLEV .LT. 51) GOTO 320 
      IF(NLEV .GT. 59) GOTO 330 
C 
C VERIFY THIS STATEMENT IS IN ORDER 
C 
      IF(N .EQ. NLEV  .OR.  N+1 .EQ. NLEV) GOTO 300 
      CALL CITA(N+1-50,IMA) 
      ERR10(8) = IMA(3) 
      CALL QRIO(2,ITTY,ERR10,14)
      IE = -1 
C 
C SET N TO CURRENT LEVEL
C 
300   CONTINUE
      N = NLEV
320   CONTINUE
C 
C 
C 
C 
C 
C     CHECK THAT THE SAME LINES DO NOT HAVE 
C     DUPLICATE REPORT OPTIONS (SAME LINES
C     OR ALSO WHERE ALL GROUPS AND DETAILS
C     WOULD CONFLICT OR TOTALS AT THE SAME
C     LEVEL WOULD CONFLICT).
C 
C     NOTE: 
C        1.  EDIT STATEMENTS MAY BE IN CONFLICT 
C        ON THE SAME LINE SINCE THEY APPLY TO 
C        DIFFERENT FIELDS.
C 
C        2.  CONSTANT LITERALS AND EDIT MASKS 
C        CANNOT APPEAR IN THE SAME STATEMENT. 
C 
330   CONTINUE
      N = 0 
      DO 335 I = 1,10 
335   Q(I) = 0
C 
C 
C 
C 
      DO 118 J=1,R3 
C 
C SKIP OVER SORT, AND EDIT STATEMENTS 
C 
      NLEV = SS(1,J)
      IF (NLEV.LT.20 .OR. NLEV.GT.59) GO TO 118 
C 
C PICK OFF TOTAL, GROUP,DETAIL, AND HEADING STATEMENTS
C 
      IF (NLEV.EQ.N) GO TO 104
C 
C GROUP BREAKS AND D[NULL] STATEMENTS MUST HAVE COMPATIBLE PRINT
C OPTIONS.  DO NOT INTIALIZE THE Q ARRAY BETWEEN PROCESSING.
C BUT DO INITIALIZE THE Q ARRAY THE FIRST TIME A STATEMENT IS 
C A GROUP BREAK OR A D[NULL]. 
C 
      IF ((NLEV.GT.40).AND.(NLEV .LT. 51).AND.(N .GT. 40))GO TO 104 
C 
C 
C   CHECK THAT THERE ARE NO CONFLICTING PRINT OPTIONS ( SKIP BEFORE,
C   SKIP AFTER, ETC.) IN TOTALS.  AFTER TOTALS HAVE BEEN CHECKED SEE
C   THAT GROUPS AND D [NULL] HAVE COMPATIBLE PRINT OPTIONS. 
C 
C   ZERO THE Q-ARRAY FOR EACH NEW LEVEL OF HEADR, TOTAL, AND
C   FOR THE FIRST GROUP BREAK.  CLEAR Q(5) FOR EACH NEW STATEMENT 
C   REGUARDLESS OF THE LEVEL. Q(5) IS A FLAG THAT INDICATES THAT
C   A TOTAL OPTION (ADD,COUNT, OR AVERAGE) HAS ALREADY BEEN 
C   SELECTED FOR THIS STATEMENT.  NO TOTAL STATEMENT CAN REQUEST
C   MORE THAN ONE OPTION BUT ALL OPTIONS CAN BE CHOOSEN AT ANY
C   PARTICULIAR LEVEL OF TOTAL STATEMENTS.
C 
C 
C 
      DO 102 I=1,10 
      Q(I) = 0
  102 CONTINUE
C 
C 
104   CONTINUE
      N = NLEV
      Q(5) = 0
C 
C 
C 
C 
C 
      I = SS(5,J) 
      IF (I.EQ.0) GO TO 110 
      DO 108 I4=1,4 
      IF (I.EQ.0) GO TO 110 
      IFAC = 10**I4 
      I7 = I - I/IFAC * IFAC
      I = I - I7
      IF (I7.EQ.0) GO TO 108
      IF (Q(I4).EQ.0) GO TO 106 
C  ERROR - CONFILICTING REPORT OPTIONS
      CALL QRIO(2,ITTY,ERR6,22) 
      IE = 1
  106 Q(I4) =1
  108 CONTINUE
      IF (I .NE. 0) Q(5) = 1
C 
C 
C 
C 
C 
C CHECK THAT TOTALS,GROUPS, AND DETAILS DO NOT HAVE EDIT MASKS
C WITH REAL VALUES. 
C 
110   CONTINUE
      IF(NLEV .LT.30    .OR. NLEV .GT. 59) GOTO 111 
      ITM = SS(2,J) 
      IF(ITM .EQ. 0) GOTO 111 
C 
C IS THERE AN EDIT MASK?
C 
      NN = SS(6,J)
      IF(NN - NN/100*100   .EQ. 0) GOTO 111 
C 
C GET THE ITEM TYPE 
C 
      CALL DBINF(DBNAM,ITM,102,ISTAT,INFO)
      IF(ISTAT .EQ. 0) GOTO 109 
C 
C ERROR - LOAD AND EXECUTE ERROR PROCESSOR
C 
      QSERR = ISTAT 
      SNAM(2) = 2H23
      GOTO 150
C 
C GET THE ITEM TYPE FROM THE BUFFER 
C 
109   CONTINUE
      CALL SGET(INFO,17,ITYPE)
      IF(ITYPE .NE. R) GOTO 111 
C 
C 
C 
C OUTPUT "CAN NOT EDIT REAL VALUES" 
C 
      CALL QRIO(2,ITTY,ERR12,13)
      IE = -1 
C 
C 
C 
C 
C 
C 
C 
C TOTAL, GROUPS, HEADING STATEMENTS 
C   VERIFY THAT EDIT MASKS DON'T EXIST WITH LITERALS
C 
111   CONTINUE
      I3 = SS(6,J)
      IF (I3.EQ.0) GO TO 118
      DO 116 I4=2,3 
      IF (I3.EQ.0) GO TO 118
      IFAC = 10**I4 
      I7 = I3 - I3/IFAC * IFAC
      I3 = I3 - I7
      IF (I7.EQ.0) GO TO 116
C 
C VERIFY THAT A LITERAL DOES NOT HAVE AN EDIT MASK
C 
      IF (I4.NE.2) GO TO 112
      IF (SS(3,J).EQ.0) GO TO 116 
C  ERROR - LITERAL HAS EDIT OPTION
      CALL QRIO(2,ITTY,ERR7,17) 
      IE = 1
      GO TO 116 
C 
C VERIFY THAT THE TOTAL STATEMENT ONLY HAS ONE OF THE 
C ACTION OPTIONS (ADD,AVERAGE, OR COUNT)
C 
C NOTE: 
C 
C   ONLY TOTAL STATEMENTS WILL HAVE THE FLAG SET
C 
  112 IF (Q(5).EQ.0) GO TO 114
C  ERROR - CONFLICTING REPORT OPTIONS 
      CALL QRIO(2,ITTY,ERR6,22) 
      IE = 1
  114 Q(5) = I3 
  116 CONTINUE
      IF ((I3 .EQ. 0) .OR. (Q(5) .EQ. 0)) GOTO 118
      CALL QRIO(2,ITTY,ERR6,22) 
      IE = 1
  118 CONTINUE
C 
C 
C 
C 
C 
C 
C 
C 
C     CHECK TO SEE THAT NOT MORE THAN 5 
C     FIELDS ARE BEING TOTALED ON.
C     ALSO VERIFY THAT ASCII VALUES ARE 
C     ONLY BEING COUNTED, AND NOT ADDED OR AVERAGED.
C 
C 
C 
C 
C 
      DO 120 I=1,255
      Q(I) = 0
  120 CONTINUE
C 
C 
C 
C 
      DO 122 J=1,R3 
C 
C PICK OFF SORT, AND HEADING STATEMENTS 
C 
      NLEV = SS(1,J)
      IF (NLEV.LT.30) GO TO 122 
C 
C PICK OFF GROUP, DETAIL, AND EDIT STATEMENTS 
C 
      IF (NLEV.GT.40) GO TO 124 
C 
C SET INDICATOR THAT THIS ITEM IS BEING TOTALED ON
C 
      N = SS(2,J) 
      IF (N.EQ.0) GO TO 122 
      Q(N) = 1
C 
C VERFY THAT  ASCII VALUES ARE ONLY BEING COUNTED 
C 
      IF ((SS(5,J)/10000 .EQ. 0) .AND. (SS(6,J)/1000 .EQ. 0)) GOTO 122
      CALL DBINF(DBNAM,N,102,ISTAT,INFO)
      IF(ISTAT .EQ. 0) GOTO 209 
C 
C DBMS ERROR - LOAD AND EXECUTE THE DBMS ERROR HANDLING SEGMENT 
C 
      QSERR = ISTAT 
      SNAM(2) = 2H23
      GOTO 150
C 
C GET THE ITEM TYPE 
C 
209   CALL SGET(INFO,17,ITYPE)
      IF(ITYPE .NE. XASCII) GOTO 122
C 
C OUTPUT "CAN NOT ADD OR AVERAGE ON ASCII VALUES" 
C 
      CALL QRIO(2,ITTY,ERR11,18)
      IE = 1
  122 CONTINUE
C 
C 
C 
C 
C 
C 
C ADD # OF DIFFERENT ITEMS
C 
  124 N = 0 
      DO 126 J=1,255
      IF (Q(J).NE.0) N = N + 1
  126 CONTINUE
      IF (N.LE.5) GO TO 130 
C  ERROR - > 5 FIELDS TOTALED ON
      CALL QRIO(2,ITTY,ERR8,20) 
      IE = 1
C 
C 
C 
C 
C 
C CHECKING COMPLETE - WAS THERE ANY ERRORS
C 
  130 IF (IE.EQ.0) GO TO 140
C  ERROR - NO REPORT GENERATED
      CALL ERIO(2,ITTY,ERR9,21) 
C  CALL MAIN PROGRAM (QS) 
C 
135   CONTINUE
      SNAM(2) = 2H
      GO TO 150 
C 
C BUILD THE LIST ARRAY
C 
C    LIST IS A 101 BY 6 ARRAY 
C 
C     THE FIRST ENTRY IS AS FOLLOWS 
C        WORD 1 -  NUMBER OF ENTRIES IN THE ARRAY 
C        WORD 7 -  NUMBER OF SORT ITEMS IN THE ARRAY
C 
C     NOTE: THE SORT ITEMS ARE AT THE TOP OF THE ARRAY
C 
C     THE OTHER ENTRIES LOOK AS FOLLOWS 
C 
C        WORD 1 - ITEM NUMBER 
C        WORD 2 - ITEM TYPE 
C        WORD 3 - ITEM LENGTH IN BYTES
C        WORD 4 - ELEMENT COUNT 
C        WORD 5 - OFF SET INTO RECORD IN BYTES
C        WORD 6 - ITEM NUMBER REPEATED
C 
C    NOTE: THIS ARRAY IS SET UP IN THE ABOVE MANNER SO THAT 
C    COLUMN 1 AND 6 OF THE LIST ARRAY MAY BE USED WHEN MAKING 
C    DBGET CALLS. 
C 
C    THE SORT PROCESSOR AND OTHER PROCESSORS USE THE INFORMATION IN 
C    THE TABLE TO FORMAT THE REPORT IN THE CORRECT MANNER.
C 
140   CONTINUE
      DO 170 I = 1,101
      DO 170 J = 1,6
170   LIST(I,J) = 0 
C 
C BE SURE THERE IS ONLY ONE ENTRY IN THE LIST ARRAY FOR EVERY 
C UNIQUE ITEM.
C 
      IOFF = 1
      LIST = 0
      LIST(1,6) = 0 
C 
C 
C 
      DO 220 I = 1,R3 
      NLEV = SS(1,I)
C 
C BE SURE TO SKIP HEADERS 
C 
      IF(NLEV .GT. 20  .AND.  NLEV .LT. 29) GOTO 220
C 
C DO NOT LOOK AT STATEMENTS THAT DON'T HAVE ITEM NUMBERS
C 
      DINUM = SS(2,I) 
      IF(DINUM .EQ. 0) GOTO 220 
C 
C SEE IF IT ALREADY EXITS IN THE LIST 
C 
      IF(LIST .EQ. 0) GOTO 200
      DO 190 J = 2,LIST +1
      IF (LIST(J,1) .EQ. DINUM) GOTO 180
190   CONTINUE
C 
C 
C 
C PUT ITEM IN LIST ARRAY
C  INCREASE THE COUNT OF ENTRIES IN THE  LIST ARRAY 
C  SET J TO THE INDEX INTO THE LIST ARRAY FOR THAT ENTRY
C 
200   CONTINUE
      LIST = LIST+1 
      J = LIST + 1
      LIST(J,1) = DINUM 
C 
C GET THE ITEM INFORMATION
C 
      CALL DBINF(DBNAM,DINUM,102,ISTAT,INFO)
      IF (ISTAT .EQ. 0) GOTO 210
C 
C DBMS ERROR
C 
      QSERR = ISTAT 
      SNAM(2) = 2H23
      GOTO 150
210   CONTINUE
      CALL SGET(INFO,17,ITYPE)
      LIST(J,2) = ITYPE 
      IF(ITYPE .NE. XASCII) INFO(10) = 2 * INFO(10) 
      LIST(J,3) = INFO(10)
      LIST(J,4) = INFO(11)
      LIST(J,5) = IOFF
      IOFF = IOFF+ INFO(11) * INFO(10)
C 
C IF THIS IS A SORT STATEMENT 
C   INCREASE THE SORT COUNT 
C   PUT THE ITEM NUMBER AS A FLAG INDICATING THAT THIS IS A SORT ITEM 
C 
      IF(SS(1,I) .GT. 15) GOTO 180
      LIST(1,6) = LIST(1,6) + 1 
      LIST(J,6) = DINUM 
C 
C PUT LIST ARRAY OFFSET IN SS-ARRAY 
C 
180   CONTINUE
      SS(7,I) = J 
220   CONTINUE
C 
C 
C 
C 
C 
C 
C 
C  CALL REPORT GENERATOR PROGRAM
C 
      IF(R5 .NE. 0) GOTO 160
      SNAM(2) = 2H06
C 
C 
C 
150   CONTINUE
      CALL LOAD(SNAM) 
C 
C 
C 
C  CALL PRE-SORT
C 
  160 SNAM(2) = 2H05
      GO TO 150 
      END 
$ 
                                                                                                                                                                                                                          