*DECK SUMCL 
USETEXT DNTEXT
USETEXT RPTEXT
PROC SUMCL;  #CYR33#
          BEGIN 
  
          #SUM RESET  ROUTINE#
          #*# 
          #THIS ROUTINE#
          #- DOES ANALYSIS ON ONE REPORT GROUP WITH RESPECT TO# 
          #SYNTAX RULES IN SECTION 6.39A.3 ON THE SUM CLAUSE# 
          #X# 
          #- ALSO TAKES CARE OF GENERAL RULE 6.39A.4.5# 
          #PROCEDURE DIVISION STATEMENTS MAY ALTER THE# 
          #CONTENTS OF SUM COUNTERS#
          #X# 
          #- DOES ANALYSIS ON ONE REPORT GROUP WITH RESPECT TO# 
          #SYNTAX RULES IN SECTION 6.38.3  ON THE RESET CLAUSE# 
  
  
          #DECLARATIONS FOR SUMCL#
  
          ITEM
                 RGDNATPTR    I,
                 RGTEMP       I,
                 AUXINDEX     I,
                 SUMIDDNAT    I,
                 SIAUXINDEX   I,
                 IPSUMCTRDNAT I,
                 SCHINDEX     I,
                 VUPONDETAIL  I,
                 ERINDEX      I,
                 SUMCLAUX     I,
                 NEWSCAUX     I,
                 UPONCL       I,
                 CIDA         I,
                 CIDB         I,
                 F1CNTRLAUXIN I,
                 DN3          I,
                 DN3LEVEL     I,
                 CIDR         I;
  
          XREF   FUNC         MOVECHK;
  
  
          ITEM   $TEMP$,
                $DUMMY$;
  
          XREF   PROC         INTERCEPT;
          XREF   FUNC         PLTCNVRT I; 
          XREF   PROC         RWSET    ;
          XREF   PROC         RWSET1   ;
          XREF   PROC         GETNEXT  ;
          XREF   FUNC         RP$AUXPTR;
          XREF   FUNC         RWGET    ;
          XREF   FUNC         RWGET1   ;
  
          DEF    GET          #GETFIELD#; 
          DEF    SET          #SETFIELD#; 
          DEF    GETQ         #GETQUICK#; 
  
*CALL RPCOMM
  
*CALL DNATVALS
*CALL GETSET
*CALL TABLNAMES 
  
  
  
          CONTROL EJECT;
  
          #INTERNAL PROCEDURE NO.1# 
  
FUNC VALIDATSUMID;
          BEGIN 
          #6.39A.3.1# 
          #EACH SUM CLAUSE IDENTIFIER MUST BE DEFINED AS A# 
          #NUMERIC DATA ITEM.WHEN DEFINED IN THE REPORT SECTION, THE #
          #IDENTIFIER MUST BE THE NAME OF A SUM COUNTER#
          #*# 
          #THIS INTERNAL PROCEDURE CHECKS THESE 2 RULES FOR#
          #WHATEVER SUM CLAUSE IDENTIFIER IS IN#
          #SUMIDDNAT# 
          #WHEN THIS INTERNAL PROCEDURE IS CALLED. #
          #IF CONTENTS OF SUMIDDNAT  = SUM COUNTER DEFINED# 
          #IN REPORT SECTION, THEN RETURN(1)# 
          #IF NOT DEFINED IN REPORT SECTION, OR#
          #IF DEFINED IN REPORT SECTION BUT NOT A SUM COUNTER,# 
          #THEN  RETURN(0)# 
  
          #**************#
          #NOTE -  WILL CHECK THE SECOND PART OF THIS RULE FIRST# 
          #AS THE REPORT WRITER  ITSELF MUST DEFINE A SUM COUNTER#
          #NUMERIC (REF. TRANSFORMDTS RT.)# 
  
          #IS IT DEFINED IN THE REPORT SECTION# 
          IF SUMIDDNAT  LS  RS1STDNAT 
          THEN
              GOTO CHEKSINUMRIC;
          #NOT IN REPORT SECTION# 
  
          #ELSE IF IN REPORT SECTION, IS IT A SUM COUNTER#
  
          SIAUXINDEX = RP$AUXPTR(SUMIDDNAT);
          IF
              RWGET(RAFORMAT4BIT,SIAUXINDEX) EQ 1 
              #IE.- A FORMAT-4 ENTRY# 
  
              AND 
              RWGET(RASUMCNTRBIT,SIAUXINDEX) EQ 1 
              AND 
              RWGET(RAPICBIT,SIAUXINDEX) EQ 1 
              #MUST ALSO CHECK THIS PIC BIT BECAUSE IF USER#
              #DIDN"T PROVIDE A VALID PIC, TRANSFORM-DNATS-RT#
              #WOULDN"T KNOW WHAT LENGTH TO SPECIFY WHEN IT#
              #SETS UP THE SUM COUNTER DNAT.# 
          THEN
              BEGIN 
              VALIDATSUMID = 1; 
              RETURN; 
              END 
  
          #THE SUM IDENTIFIER IS A SUM COUNTER# 
  
  
          #ELSE -  ERROR# 
  
  
          #DIAGNOSTIC#
          #WHEN DEFINED IN THE REPORT SECTION A SUM CLAUSE# 
          #IDENTIFIER MUST BE THE NAME OF A SUM COUNTER#
  
          ANALONLYRGRP = 1; 
          CALLDDIAG(RGDNATPTR,96);
          GOTO ENDVALSI;
CHEKSINUMRIC: 
          #CHECK IF IS A NUMERIC DATA ITEM# 
          $TEMP$ = GETQ(DN$TYPE,DNAT$,SUMIDDNAT); 
          IF $TEMP$ EQ NUMERIC
              OR
              $TEMP$ EQ EXTFLOAT
              OR
              $TEMP$ EQ LONGFLOAT 
              OR
              $TEMP$ EQ BINARY
              OR
              $TEMP$ EQ COMP4 
          THEN
              GOTO ENDVALSI;
  
          #ELSE ERROR (6.39A.3.1)#
  
  
          #DIAGNOSTIC  97#
          #SUM CLAUSE IDENTIFIER MUST BE DEFINED AS NUMERIC#
          #DATA ITEM# 
  
          ANALONLYRGRP = 1; 
          CALLDDIAG(RGDNATPTR,97);
ENDVALSI: 
          VALIDATSUMID = 0; 
          RETURN; 
          #SUM-IDENT NOT A       SUM COUNTER# 
          #IN THE REPORT SECTION     AND/OR NOT#
          #DEFINED IN THE REPORT SECTION# 
          END #VALIDATSUMID#
          CONTROL EJECT;
  
          #INTERNAL PROCEDURE NO. 2#
  
FUNC SUMCNTNOUPON;
          BEGIN 
          #6.39A.3.1.IF THE UPON PHRASE IS OMITTED, ANY IDENTIFIERS IN# 
          #THE SUM CLAUSE WHICH ARE THEMSELVES SUM COUNTERS MUST BE#
          #DEFINED# 
          #A) IN THE SAME REPORT GROUP THAT CONTAINS THIS SUM#
          #CLAUSE#
          #OR#
          #B) IN A REPORT GROUP THAT IS AT A LOWER LEVEL IN#
          #THE CONTROL HIERARCHY OF THIS REPORT. #
          #THIS INTERNAL PROCEDURE CHECKS FOR CONDITION A OR B# 
          #FOR WHATEVER SUM CLAUSE SUM COUNTER IDENTIFIER IS IN#
          #IPSUMCTRDNAT#
          #WHEN THIS INTERNAL PROCEDURE IS CALLED. IF A) THEN  RETURN 1#
          #IF B) THEN  RETURN 2#
          #IF ERROR  THEN RETURN 3  (AFTER OUTPUT OF DIAGNOSTIC)# 
  
          IF IPSUMCTRDNAT GQ FIRSTF3OR4DE 
              AND 
              IPSUMCTRDNAT  LQ  LASTRGDNAT
          THEN
              BEGIN 
              SUMCNTNOUPON = 1; 
              RETURN; 
              END 
          #THIS SUM IDENTIFIER IS DEFINED IN THE# 
          #SAME REPORT GROUP THAT CONTAINS THIS#
          #SUM CLAUSE.# 
          CIDA = 0; 
  
          #ELSE - DETERMINE IF IT IS DEFINED IN A REPORT GROUP# 
          #THAT IS AT A LOWER LEVEL IN THE CONTROL# 
          #HIERARCHY OF THIS REPORT#
  
          #1ST  DETERMINE IF CURRENT REPORT GROUP IS A# 
          #CONTROL  FOOTING TYPE (IF NOT, THIS WAS# 
          #ALREADY DIAGNOSED IN FORMATS-ANALYSIS-RT)# 
  
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,DNATPOINTER);
          IF $TEMP$ EQ 1
              AND 
              RWGET(RATYPERGROUP,RP$AUXPTR(DNATPOINTER)) EQ CF
          THEN
              GOTO RFPROCEED; 
          ELSE
             #ERROR  AND ANAL-ONLY-R-GROUP IS ON FROM BEFORE# 
              GOTO R3;
RFPROCEED:  
  
          #PICK UP THE CONTROL IDENTIFIER ASSOCIATED WITH#
          #CURRENT CONTROL FOOTING  REPORT GROUP# 
  
          IF RWGET(RACI$FINAL,RP$AUXPTR(DNATPOINTER)) EQ 1
          THEN
              #CONTROL ID. = "FINAL"# 
              GOTO  RF2PROCEED; 
          CIDA = RWGET(RACONTRLDNAT,RP$AUXPTR(DNATPOINTER));
          IF CIDA  EQ 0 
          THEN
              GOTO R3;
          #THIS WILL BE DIAGNOSED LATER--#
          #IE.- NO CONTROL ID ASSOCIATED WITH THIS CONTROL# 
          #FOOTING REPORT GROUP#
RF2PROCEED: 
  
          #NEXT-# 
          #SEARCH BACKWARDS THRU THE DNATS FROM#
          #IPSUMCTRDNAT UNTIL COME TO ONE THAT HAS# 
          #LEVEL = 01 (IF NO ERROR). THEN DETERMINE IF# 
          #IT IS A CONTROL FOOTING TYPE REPORT GROUP# 
          #WITHIN THE CURRENT REPORT. IF SO GET THE CONTROL#
          #IDENTIFIER ASSOCIATED WITH IT, AND PUT IT IN#
          #CIDB.# 
          FOR 
              SCHINDEX = (IPSUMCTRDNAT - 1)  STEP -1 UNTIL
              RS1STDNAT 
              DO
              BEGIN 
              IF  GETQ(DN$LEVEL,DNAT$,SCHINDEX)  EQ  1
              THEN
                  GOTO  DETIFCR;
              IF  GETQ(DN$LEVEL,DNAT$,SCHINDEX)  EQ  RDDESCR
              THEN
                  GOTO R3;
              #ERROR    - SUM COUNTER IDENTIFIER# 
              #DOES NOT BELONG TO ANY RECOGNIZED REPORT GROUP#
              IF SCHINDEX EQ RS1STDNAT
              THEN
                  GOTO R3;
              #ERROR    - SAME AS ABOVE#
              END 
DETIFCR:  
          IF SCHINDEX  LS CURRDDNAT 
              OR
              SCHINDEX  GR ENDCURREPORT 
          THEN
              #REPORT GROUP NOT#
              GOTO R3;
          #WITHIN CURRENT REPORT# 
          IF RWGET(RATYPERGROUP,RP$AUXPTR(SCHINDEX))
              NQ CF 
          THEN
              GOTO R3;
          #ERROR   - SUM COUNTER ID NOT#
          #DEFINED IN A CF TYPE REPORT GROUP# 
  
          #ELSE, IF IT IS A CONTROL FOOTING TYPE# 
  
          CIDB = RWGET(RACONTRLDNAT,RP$AUXPTR(SCHINDEX)); 
          IF CIDB EQ 0
          THEN
              GOTO R3;
          #IMPOSSIBLE FOR#
          #THIS CI TO BE LOWER THAN CIDA IF IT EXISTS(=FINAL)#
          #NEXT STEP# 
          #FIND CIDA  IN THE PORTION OF THE CIDTLINK TABLE FOR# 
          #CURRENT REPORT (IE.- UNLESS = "FINAL" )# 
          #THE CONTROL IDENTIFIERS ARE SITTING IN CIDTLINK FROM#
          #HIGHEST TO LOWEST  STARTING AT CIDTPTRCURRD. THEREFORE -#
          #IF CIDB IS FOUND AMONG THOSE CONTROL IDENTIFIERS#
          #THAT ARE LOWER THAN CIDA,  ALL IS OK.# 
          CURRCIDTPTR = CIDTPTRCURRD; 
          IF CIDA EQ 0
              #INDICATING  CONTROL ID = "FINAL"#
          THEN
              GOTO TRY2FINDB; 
          FOR $DUMMY$ = 0 WHILE RWGET1(CIDTLINK  #CURRCIDTPTR#)  NQ 
              0 DO
              BEGIN 
              IF   RWGET1(CIDTCONTRLID  #CURRCIDTPTR#) EQ  CIDA 
              THEN
                  GOTO  TRYFINDB; 
              CURRCIDTPTR  =  RWGET1(CIDTLINK  #CURRCIDTPTR#);
              END 
          GOTO R3 ; 
          #IN CASE DON"T FIND CIDA# 
TRYFINDB: 
          CURRCIDTPTR =  RWGET1(CIDTLINK  #CURRCIDTPTR#); 
TRY2FINDB:  
          FOR $DUMMY$ = 0 WHILE RWGET1(CIDTLINK  #CURRCIDTPTR#)  NQ 
              0 DO
              BEGIN 
              IF  RWGET1(CIDTCONTRLID  #CURRCIDTPTR#) EQ  CIDB
              THEN
                  BEGIN 
                  SUMCNTNOUPON = 2; 
                  RETURN; 
                  END 
              #SUM COUNTER IS DEFINED IN A# 
              #REPORT GROUP THAT IS AT A# 
              #LOWER LEVEL IN THE CONTROL#
              #HIERARCHY OF THIS REPORT#
              CURRCIDTPTR  =  RWGET1(CIDTLINK  #CURRCIDTPTR#);
              END 
  
          #ERROR  IF  REACH HERE# 
          #ANY IDENTIFIERS IN THE SUM CLAUSE WHICH ARE SUM COUNTERS#
          #THEMSELVES CANNOT BE DEFINED IN A REPORT GROUP THAT IS AT# 
          #A HIGHER LEVEL IN THE CONTROL HIERARCHY OF THIS REPORT#
  
R3: 
          #ISSUE DIAGNOSTIC AND RETURN(3)#
          #USE CAUTION IN WORDING DIAGNOSTIC - CAN HAVE REACHED#
          #THIS POINT FOR A VARIETY OF REASONS# 
  
  
          #DIAGNOSTIC#
          #ILLEGAL SUM IDENTIFIER  IDENTIFIERS IN THE SUM CLAUSE# 
          #WHICH ARE THEMSELVES SUM COUNTERS MUST BE DEFINED IN SAME# 
          #REPORT GROUP AS THIS SUM CLAUSE OR IN ONE THAT IS AT A#
          #LOWER LEVEL IN THE CONTROL HIERARCHY OF THIS REPORT# 
  
          ANALONLYRGRP  = 1;
          CALLDDIAG(RGDNATPTR,99);
          SUMCNTNOUPON = 3; 
          RETURN; 
          END #SUMCNTNOUPON#
          CONTROL EJECT;
  
          #INTERNAL PROCEDURE NO. 3#
  
PROC UPONVALIDATE;
          BEGIN 
          #6.39A.3.2.EACH DATA-NAME IN AN UPON PHRASE MUST BE THE NAME #
          #OF A DETAIL REPORT GROUP DESCRIBED IN THE SAME REPORT# 
          #AS THE CONTROL FOOTING IN WHICH THE SUM CLAUSE APPEARS.# 
          #X# 
          #FOR WHATEVER DATA-NAME IS PASSED TO IT IN# 
          #VUPONDETAIL,#
          #THIS INTERNAL PROCEDURE CHECKS THE ABOVE RULE.#
          #IF#
          #IT FINDS AN ERROR IT ISSUES A DIAGNOSTIC.# 
  
          #1ST  IS IT A DETAIL REPORT GROUP#
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,VUPONDETAIL);
          IF $TEMP$ EQ 1
              AND 
              RWGET(RATYPERGROUP,RP$AUXPTR(VUPONDETAIL)) EQ DE
          THEN
              GOTO CVALIDATE; 
  
          #ELSE -  ERROR# 
  
UPONERROR:  
  
          #DIAGNOSTIC#
          #EACH DATA-NAME IN AN UPON PHRASE MUST BE THE NAME OF#
          #A DETAIL REPORT GROUP DESCRIBED IN THE SAME REPORT#
          #AS THE CONTROL FOOTING IN WHICH THE SUM CLAUSE APPEARS#
  
          ANALONLYRGRP = 1; 
          CALLDDIAG(RGDNATPTR,100); 
          GOTO ENDUV; 
CVALIDATE:  
  
          #IS  THE DETAIL GROUP WITHIN THE CURRENT REPORT&# 
  
          IF VUPONDETAIL  LS CURRDDNAT
              OR
              VUPONDETAIL  GR ENDCURREPORT
          THEN
              GOTO  UPONERROR;
  
          #ELSE IS VALID# 
  
ENDUV:  
          END #UPONVALIDATE#
          CONTROL EJECT;
PROC SKIPSUB(INDX); 
          BEGIN 
          ITEM INDX;
          INDX = INDX + 1;
SUBLOOP:  
          IF RWGET(RALASTSINTRY, INDX) EQ 0 THEN
              BEGIN 
              INDX = INDX + 1;
              GOTO SUBLOOP; 
              END 
          RETURN; 
          END 
          CONTROL EJECT;
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EPTRACE("SUMCL  ")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
  
          #FIRST FIND THE LAST DNAT ENTRY FOR THE#
          #CURRENT REPORT AND SAVE IT#
  
          FOR ERINDEX = (CURRDDNAT + 4)  STEP 1 UNTIL 
              LSTRSDNATIND DO 
              BEGIN 
              IF GETQ(DN$LEVEL,DNAT$,ERINDEX) EQ  RDDESCR 
              THEN
                  GOTO  FOUNDER;
              END 
          ENDCURREPORT = LSTRSDNATIND;
          GOTO SRPROCEDURES;
FOUNDER:  
          ENDCURREPORT = ERINDEX - 1; 
SRPROCEDURES: 
          #DETERMINE IF DNAT ENTRY CONTAINS A SUM CLAUSE# 
          IF FIRSTF3OR4DE EQ 0 THEN 
              GOTO ENDSUMCL;
          FOR RGDNATPTR = FIRSTF3OR4DE  STEP 1 UNTIL
              LASTRGDNAT DO 
              BEGIN 
              AUXINDEX = RP$AUXPTR(RGDNATPTR);
              IF RWGET(RASUMCNTRBIT,AUXINDEX) EQ 1
              THEN
                  SET(DN$RITEM,DNAT$,RGDNATPTR,0);
              #SO THAT# 
              #THIS SUM COUNTER CAN BE REFERENCED BY# 
              #PROCEDURE DIVISION STATEMENTS - 6.39A.4.5.#
          $TEMP$ = GETQ(DN$LEVEL,DNAT$,RGDNATPTR);
          IF $TEMP$ GR 1
                  AND 
                  RWGET(RAFORMAT4BIT,AUXINDEX) EQ 1 
                  #IE. - A FORMAT-4 ENTRY#
  
                  AND 
                  RWGET(RASUMBIT,AUXINDEX) EQ 1 
              THEN
                  BEGIN 
  
                  #WHEN IS A DNAT ENTRY WITH A SUM CLAUSE#
                  #WILL EXECUTE                                    #
                  # . SUM-IDENT-LOOP    (RULE 6.39A.3.1)           #
                  #     AS MANY TIMES AS NECESSARY                 #
                  # . UPON-LOOP         (RULE 6.39A.3.2)           #
                  #     AS MANY TIMES AS NECESSARY                 #
                  # . RESET-CLAUSE      (RULE 6.39A.3.4 AND 6.38.3)#
                  #     IF NECESSARY                               #
                  #(RULE 6.39A.3.3 WAS TAKEN CARE OF IN            #
                  #    FORMATS-ANALYSIS-RT)                        #
  
                  #CHECK MOVE LEGALITY# 
                  #REF. RULE 6.39A.4.4 RWCS MUST MOVE THE DATA         #
                  #CONTAINED IN THE SUM COUNTER, ACC. TO THE RULES OF  #
                  #THE MOVE STATEMENT, TO THE PRINTABLE ITEM FOR       #
                  #PRESENTATION.                                       #
                  #(NOTE THAT AT THIS POINT THE SUM COUNTER DNAT IS NOT#
                  # SET UP AS THE SENDING FIELD . IT STILL CONTAINS    #
                  #RECEIVING FIELD INFORMATION).# 
                  DN3 = 0;
                  IF MOVECHK(3,DN3,RGDNATPTR)  NQ  1
                  THEN
                      #PARAM. OF 3 = SENDINGFIELD IS INTERNAL DECIMAL#
                  BEGIN 
                      ANALONLYRGRP  = 1;
                      IF GETQ(DN$TYPE,DNAT$,RGDNATPTR) NQ ERRTYPE 
                      THEN
                          CALLDDIAG(RGDNATPTR,97);
                      END 
  
                  #DIAGNOSTIC 97# 
                  #RWCS CANNOT LEGALLY MOVE THIS SUM COUNTER TO THE # 
                  #PRINTABLE ITEM FOR PRESENTATION ACCORDING TO THE    #
                  #RULES OF THE MOVE STATEMENT. THE PICTURE CLAUSE     #
                  #DESCRIBING THE PRINTABLE ITEM MUST BE CHANGED.      #
  
                  #COMPUTE  INDEX OF FIRST     RA-SUM-IDENT ENTRY#
  
                  SUMCLAUX  = AUXINDEX  +  1; 
                  #********************#
SUMIDENTLOOP: 
                  #6.39A.3  RULE 1.#
                  #********************#
                  SUMIDDNAT = RWGET(RASUMID1DNAT,SUMCLAUX); 
                  IF VALIDATSUMID  EQ 1 
                  THEN
                      RWSET(RATISUMCNTRB,SUMCLAUX,1); 
                  #IE.- IT IS A SUM COUNTER IN# 
                  #THE REPORT SECTION#
SIANALYSIS: 
  
                  #LOOK THRU REST OF AUX ENT"S AND SEE IF FIND AN UPON# 
                  #TYPE ENTRY THAT IS NOT A DUMMY-UPON TYPE ENTRY#
                  #-- AND ON THAT BASIS DO FURTHER ANALYSIS ON# 
                  #SUM CLAUSE IDENTIFIERS.# 
                  NEWSCAUX = SUMCLAUX;
                  UPONCL = 0; 
                  #NO UPON CLAUSE PRESENT#
IFREALUPONFC: 
                  IF RWGET(RASLASTAUXEN,NEWSCAUX) EQ 1
                  THEN
                      GOTO NOUPONCLAUSE;
                 IF RWGET(RASUMIDTYPE,NEWSCAUX) EQ 1 THEN 
                      BEGIN 
                      IF RWGET(RASUMSITBLPT,NEWSCAUX) NQ 0 THEN 
                          SKIPSUB(NEWSCAUX);
                      END 
                  NEWSCAUX = NEWSCAUX + 1;
                  IF  RWGET(RAUPONTYPBIT,NEWSCAUX)  EQ  1 
                  THEN
                      BEGIN 
                      IF RWGET(RADUMMYUPON,NEWSCAUX) EQ 0 
                      THEN
                          UPONCL  = 1;
                      #FOUND REAL UPON CLAUSE#
                      GOTO  TESTUPCL; 
                      END 
                  GOTO IFREALUPONFC;
TESTUPCL: 
                  IF  UPONCL EQ 0 
                  THEN
                      GOTO NOUPONCLAUSE;
  
                  #ELSE - IF UPON CLAUSE IS PRESENT#
  
                  IF RWGET(RATISUMCNTRB,SUMCLAUX) EQ 1
                  THEN
                      BEGIN 
                      ANALONLYRGRP  = 1;
  
                      #DIAGNOSTIC#
                      #IF THE UPON PHRASE IS PRESENT AN IDENTIFIER IN#
                      #IN SUM CLAUSE MUST NOT BE A SUM COUNTER# 
  
                      CALLDDIAG(RGDNATPTR,98);
                      GOTO  CHKNEXTAUX; 
                      END 
NOUPONCLAUSE: 
                  #WHEN NO UPON CLAUSE WAS FOUND# 
  
                  IF RWGET(RATISUMCNTRB,SUMCLAUX) EQ 0
                  THEN
                      BEGIN 
                      #SUM CL IDENTIFIER IS NOT A SUM COUNTER#
                      RWSET(RASUMID1TYPE,SUMCLAUX,SUBTOTALLING);
                      #MARK  RWGET(RASUMID1DNAT,SUMCLAUX) AS# 
                      #A CANDIDATE FOR SUBTOTALLING  AS IT IS NOT#
                      #A SUM COUNTER# 
  
                      GOTO  CHKNEXTAUX; 
                      END 
  
                  #ELSE- IF IS A SUM COUNTER, NEED TO DO FURTHER# 
                  #ANALYSIS#
  
                  IF RDOCURDSWTCH EQ 0
                  THEN
                      GOTO CHKNEXTAUX;
                  #CAN"T DO THIS ANALYSIS#
                  #AS DON"T HAVE A CIDTLINK NOR A VALID CURRDDNAT#
  
                  IPSUMCTRDNAT = RWGET(RASUMID1DNAT,SUMCLAUX);
                  RGTEMP = SUMCNTNOUPON;
                  IF RGTEMP  EQ  1
                  THEN
                      BEGIN 
                      RWSET(RASUMID1TYPE,SUMCLAUX,CROSSFOOTING);
  
                      #MARK  RWGET(RASUMID1DNAT,SUMCLAUX) AS A# 
                      #CANDIDATE FOR   CROSSFOOTING  AS IT IS A#
                      #SUM COUNTER DEFINED IN THE SAME CONTROL FOOTING# 
  
                      GOTO CHKNEXTAUX;
                      END 
                  IF RGTEMP  EQ  2
                  THEN
                      RWSET(RASUMID1TYPE,SUMCLAUX,ROLLFORWARD); 
  
                  #MARK  RWGET(RASUMID1DNAT,SUMCLAUX) AS A# 
                  #CANDIDATE FOR ROLLING FORWARD  AS IT IS A# 
                  #SUM COUNTER DEFINED IN A LOWER LEVEL#
                  #CONTROL FOOTING# 
  
                  #*****************# 
CHKNEXTAUX: 
                  #*****************# 
  
                  #NOTE-# 
                  #IF HAVE NOT PROCESSED THE LAST AUX ENTRY FOR THE#
                  #CURRENT DNAT ENTRY THIS SECTION OF CODE DIRECTS# 
                  #PROCESSING  TO THE#
                  #1) SUMIDENTLOOP,#
                  #2) UPONLOOP,#
                  #OR#
                  #3) RESET CLAUSE# 
  
SUMCLAUXLOOP: 
                  IF RWGET(RASLASTAUXEN,SUMCLAUX) EQ 1
                  THEN
                      GOTO  SR1STDOEND; 
                  #READY TO LOOK AT NEXT# 
                  #DNAT ENTRY#
  
                  #ELSE - IF MORE AUX ENTRIES#
  
                  IF RWGET(RASUMIDTYPE,SUMCLAUX) EQ 1 THEN
                      BEGIN 
                      IF RWGET(RASUMSITBLPT,SUMCLAUX) NQ 0 THEN 
                          SKIPSUB(SUMCLAUX);
                      END 
                  SUMCLAUX = SUMCLAUX + 1;
                  IF RWGET(RASUMIDTYPE,SUMCLAUX) EQ 1 
                  THEN
                      GOTO SUMIDENTLOOP;
                  IF RWGET(RAUPONTYPBIT,SUMCLAUX) EQ 1
                      AND 
                      RWGET(RADUMMYUPON,SUMCLAUX) EQ 0
                  THEN
                      GOTO UPONLOOP;
                  IF RWGET(RAUPONTYPBIT,SUMCLAUX) EQ 1
                      AND 
                      RWGET(RADUMMYUPON,SUMCLAUX) EQ 1
                  THEN
                      GOTO SUMCLAUXLOOP;
                  IF RWGET(RARESETYPE,SUMCLAUX) EQ 1
                  THEN
                      GOTO RESETCLAUSE; 
  
                  #ELSE IF NONE OF THESE,IS A COMPILER ERROR -SO FOR# 
                  #NOW GO TO LOOK AT NEXT DNAT ENTRY# 
  
                  GOTO SR1STDOEND;
                  #END OF THIS CONTROL SECTION# 
  
                  #****************#
UPONLOOP: 
                  #6.39A.3  RULE 2# 
                  #*****************# 
                  VUPONDETAIL = RWGET(RAUPNDETAIL1,SUMCLAUX); 
                  UPONVALIDATE; 
                  VUPONDETAIL = RWGET(RAUPNDETAIL2,SUMCLAUX); 
                  IF VUPONDETAIL EQ 0 
                  THEN
                      GOTO CHKNEXTAUX;
                  UPONVALIDATE; 
                  VUPONDETAIL = RWGET(RAUPNDETAIL3,SUMCLAUX); 
                  IF VUPONDETAIL EQ 0 
                  THEN
                      GOTO CHKNEXTAUX;
                  UPONVALIDATE; 
                  GOTO CHKNEXTAUX;
  
                  #END OF UPONLOOP# 
  
                  #*******************# 
RESETCLAUSE:  
                  #6.39A.3 RULE 4  AND  6.38.3# 
                  #*******************# 
                  IF RDOCURDSWTCH  EQ 0 
                  THEN
                      GOTO  CHKNEXTAUX; 
                  #CAN"T DO THIS ANALYSIS BECAUSE#
                  #DO NOT HAVE A VALID CURRDDNAT# 
  
                  IF RWGET(RARESETFINAL,SUMCLAUX)  NQ  1
                  THEN
                      GOTO DNRESET; 
                  #RESET CLAUSE DID NOT SPECIFY#
                  #"FINAL"# 
  
                  #ELSE- IF "FINAL" APPEARED IN RESET CLAUSE, CHECK IF# 
                  #IT APPEARED IN CONTROL CLAUSE# 
  
                  F1CNTRLAUXIN = 2 + RP$AUXPTR(CURRDDNAT);
                  IF RWGET(NUMCONTRLIDS,F1CNTRLAUXIN)  NQ 0 
                      AND 
                      RWGET(CONTIDNATPTR,F1CNTRLAUXIN) EQ 0 
                      #INDICATING FINAL#
                  THEN
                      GOTO CHKNEXTAUX;
                  #ALL IS OK  AND FINAL APPEARED# 
                  #IN CONTROL CLAUSE# 
  
                  #ELSE -  ISSUE A TRIVIAL DIAG AND ALLOW REPORT GROUP# 
                  #TO BE PRINTED IF ALL ELSE IS OK  (ROLF WISHES IT#
                  #HANDLED THIS WAY AS 360 ANS COBOL DID NOT REQUIRE# 
                  #THAT FINAL BE SPECIFIED IN CONTROL CLAUSE IF#
                  #PRESENT IN TYPE CLAUSE OR  RESET PHRASE# 
  
  
                  #DIAGNOSTIC#
                  #FINAL IF SPECIFIED IN THE RESET PHRASE, MUST ALSO# 
                  #APPEAR IN THE CONTROL CLAUSE FOR THIS REPORT.# 
                  CALLTDIAG(RGDNATPTR,101); 
                  GOTO  CHKNEXTAUX; 
DNRESET:  
  
                  #CHECK TO SEE IF DATA-NAME-3 WAS SPECIFIED IN THE#
                  #CONTROL CLAUSE FOR THIS REPORT#
  
                  DN3 = RWGET(RARESETDNAT,SUMCLAUX);
                  IF CIDTPTRCURRD NQ 0
                  THEN
                      BEGIN 
                      CURRCIDTPTR = CIDTPTRCURRD; 
                      FOR $DUMMY$ = 0 WHILE 
                          RWGET1(CIDTLINK  #CURRCIDTPTR#) NQ 0 DO 
                          BEGIN 
                          IF RWGET1(CIDTCONTRLID  #CURRCIDTPTR#)  EQ DN3
                          THEN
                              #KNOW IT APPEARED IN CONTROL CLAUSE SO-#
                              GOTO HIERCHK; 
                          CURRCIDTPTR = RWGET1(CIDTLINK  #CURRCIDTPTR#);
                          END 
                      END 
  
                  #IF REACH HERE IS AN ERROR-#
  
                  RWSET(RARESETIDILL,SUMCLAUX,1); 
                  #WILL BE USED BY TABLE BUILDING ROUTINES# 
  
                  #DIAGNOSTIC#
                  #RESET DATA-NAME MUST BE ONE OF THE DATA-NAMES# 
                  #SPECIFIED IN THE CONTROL CLAUSE FOR THIS REPORT# 
  
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,102); 
                  GOTO CHKNEXTAUX;
HIERCHK:  
  
                  #CHECK THAT DATA-NAME-3 IS NOT A LOWER LEVEL CONTROL# 
                  #THAN THE ASSOCIATED CONTROL FOR THE REPORT GROUP IN# 
                  #WHICH THIS RESET PHRASE APPEARS# 
  
                  DN3LEVEL = CURRCIDTPTR; 
                  #FIND THIS REPORT GROUP"S  CONTROL-ID. POSITION IN #
                  #CIDT-TABLE (CIDTLINK)# 
                  IF RWGET(RACI$FINAL,RP$AUXPTR(DNATPOINTER)) EQ 1
                  THEN
                      GOTO RESETHIERERR;
                  #CONTROL ID = FINAL SO DN3# 
                  #MUST BE LOWER# 
                  CIDR = RWGET(RACONTRLDNAT,RP$AUXPTR(DNATPOINTER));
                  IF CIDR  EQ 0 
                  THEN
                      GOTO RESETHIERERR;
                  #NO CONTROL ID ASSOCIATED#
                  #WITH THIS REPORT GROUP#
                  CURRCIDTPTR = CIDTPTRCURRD; 
                  FOR $DUMMY$ = 0 WHILE RWGET1(CIDTLINK  #CURRCIDTPTR#) 
                      NQ 0 DO 
                      BEGIN 
                      IF  RWGET1(CIDTCONTRLID  #CURRCIDTPTR#)  EQ CIDR
                      THEN
                          GOTO  CHYCOMPARE; 
                      CURRCIDTPTR =   RWGET1(CIDTLINK  #CURRCIDTPTR#);
                      END 
                  GOTO RESETHIERERR;
                  #CIDR NOT FOUND IN CIDTLINK#
CHYCOMPARE: 
                  IF DN3LEVEL  GR CURRCIDTPTR 
                      #FOR CIDR#
                  THEN
                      GOTO RESETHIERERR;
  
                  #ELSE- ALL OK-# 
                  GOTO CHKNEXTAUX;
RESETHIERERR: 
                  RWSET(RARESETIDILL,SUMCLAUX,1); 
  
                  #DIAGNOSTIC#
                  #RESET DATA-NAME MUST NOT BE A LOWER LEVEL CONTROL #
                  #THAN THE # 
                  #CONTROL ASSOCIATED WITH REPORT GROUP IN WHICH THIS#
                  #RESET CLAUSE APPEARS.# 
                  ANALONLYRGRP = 1; 
                  CALLDDIAG(RGDNATPTR,103); 
                  GOTO CHKNEXTAUX;
                  END 
              #OF PROCESSING WHEN DNAT CONTAINS SUM CLAUSE# 
SR1STDOEND: 
              END 
ENDSUMCL: 
  
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  # * #   EXTRACE("SUMCL  ")                                       # * #
  # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *#
  
          END #SUMCL# 
          TERM
