home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR36 / C7101.ZIP / RPTGRPS.TPX < prev    next >
Text File  |  1994-01-12  |  56KB  |  1,272 lines

  1. #!┌───────────────────────────┤Template Segment├───────────┬─────────────────┐
  2. #!│                               RptGrps.TPX              │Version: 3007.000│
  3. #!├───────────────────────────────┤Contents├───────────────┴─────────────────┤
  4. #!│Structure             Type       Description                              │
  5. #!│────────────────────  ─────────  ─────────────────────────────────────────│
  6. #!│ReportDataDeclares    GROUP                                               │
  7. #!│RptRedirectGroup      GROUP                                               │
  8. #!│RptGetLookupRecords   GROUP                                               │
  9. #!│RptGetRelatedRecords  GROUP                                               │
  10. #!│PrintDetail           GROUP                                               │
  11. #!│RptTotalRoutines      GROUP                                               │
  12. #!│DoTallyTotals         GROUP                                               │
  13. #!│DoResetTotals         GROUP                                               │
  14. #!│TallyTotals           GROUP                                               │
  15. #!│ResetTotals           GROUP                                               │
  16. #!│SaveFooterFields      GROUP                                               │
  17. #!│SaveFooterRoutine     GROUP                                               │
  18. #!│SaveFooterAssigns     GROUP                                               │
  19. #!│PrintFooterFields     GROUP                                               │
  20. #!│PrintFooterRoutine    GROUP                                               │
  21. #!│RestoreFooterFields   GROUP                                               │
  22. #!│RestoreFooterRoutine  GROUP                                               │
  23. #!│ReportFormulas        GROUP                                               │
  24. #!│RptRecordFilter       GROUP                                               │
  25. #!│GroupBreakNumber      GROUP                                               │
  26. #!│PrimaryGroupBreak     GROUP                                               │
  27. #!│FindGroupBreaks       GROUP                                               │
  28. #!│SecondaryGroupBreak   GROUP                                               │
  29. #!│BreakFooterRoutines   GROUP                                               │
  30. #!│BreakHeaderRoutines   GROUP                                               │
  31. #!│GroupBreakFooter      GROUP                                               │
  32. #!│GroupBreakHeader      GROUP                                               │
  33. #!│MultiUpLabelBuild     GROUP                                               │
  34. #!│MultiUpLabelReset     GROUP                                               │
  35. #!│PrintDanglingLabels   GROUP                                               │
  36. #!│RptAbortKey           GROUP                                               │
  37. #!│RptSetFlags           GROUP                                               │
  38. #!│RptFindFile           GROUP                                               │
  39. #!│ReportErrorCheck      GROUP                                               │
  40. #!├───────────────────────────────┤Comments├─────────────────────────────────┤
  41. #!│Version   Comments                                                        │
  42. #!│────────  ────────────────────────────────────────────────────────────────│
  43. #!│3007.000  Release of CDD3 version 3007 templates                          │
  44. #!└──────────────────────────────────────────────────────────────────────────┘
  45. #!
  46. #!***************************************************************************
  47. #GROUP(%ReportDataDeclares)                     #!Internal data declarations
  48. TempFile           CSTRING(65),AUTO            #<!Temporary filename variable
  49.   #IF(%RedirectProc AND %ViewProc)
  50. SavePath           STRING(64),AUTO             #<!Temporary path save variable
  51. TempPath           STRING(64),AUTO             #<!Temporary directory variable
  52.   #ENDIF
  53.   #FIX(%File,%Primary)
  54. %FilePre::PRINTED       BYTE,AUTO              #<!%Primary recs printed flag
  55.   #FOR(%Secondary)
  56.     #IF(%SecondaryType = '1:MANY')
  57.       #FIX(%File,%Secondary)
  58. %FilePre::PRINTED       BYTE,AUTO              #<!%Secondary recs printed flag
  59.     #ENDIF
  60.   #ENDFOR
  61.   #IF(%ReportGroupExist)
  62. BreakLevel         BYTE,AUTO                    #<!Group break level flag
  63.   #ENDIF
  64.   #FOR(%ReportGroup)                            #!Group break fields
  65.     #SET(%BreakField,%ReportGroup)
  66.     #INSERT(%RptFindFile)
  67.     #IF(%Primary = %FoundFile)
  68.       #FIX(%File,%FoundFile)
  69.       #FIX(%Key,%PrimaryKey)
  70.     #ELSE
  71.       #FIX(%Secondary,%FoundFile)
  72.       #FIX(%File,%SecondaryTo)
  73.       #FIX(%Relation,%Secondary)
  74.       #SET(%TempKey,%RelationKey)
  75.       #FIX(%File,%FoundFile)
  76.       #FIX(%Key,%TempKey)
  77.     #ENDIF
  78.     #FOR(%KeyField)                             #!Build BreakFilesQueue
  79.       #FIX(%Field,%KeyField)                    #! and declare group break
  80.       #SET(%Temp,%KeyField)                     #! save fields at same time
  81.       #IF(NOT INSTRING(%Temp,%BreakFieldsQueue,1,1))
  82.         #SET(%BreakFieldsQueue,(%BreakFieldsQueue & %Temp & ','))
  83.         #IF(%FieldType = 'GROUP')
  84. BRK::%KeyField     STRING(SIZE(%KeyField)) #<!Group break save field
  85.         #ELSE
  86. BRK::%KeyField     LIKE(%KeyField)        #<!Group break save field
  87.         #ENDIF
  88.       #ENDIF
  89.       #IF(%KeyField = %ReportGroup)             #!End of break fields
  90.         #BREAK                                  #! for this Group Break
  91.       #ENDIF
  92.     #ENDFOR
  93.   #ENDFOR
  94.   #SET(%Counter1,%NULL)
  95.   #FOR(%ReportTotal)                            #!AVERAGE total fields
  96.     #SET(%Counter1,(%Counter1 + 1))
  97.     #IF(%ReportTotalType = 'LOW')
  98. %ReportTotal::Reset  BYTE(1)
  99.     #ELSIF(%ReportTotalType = 'AVERAGE')
  100.       #IF(INSTRING('[',%ReportTotalField,1,1)) #!Check for array element
  101.         #SET(%ArrayField,(SUB(%ReportTotalField,1,INSTRING('[',%ReportTotalField,1,1)-1)))
  102. %ReportTotal::Cnt::%ArrayField::%Counter1   LONG #<!Average total count
  103. %ReportTotal::Sum::%ArrayField::%Counter1   REAL #<!Average total sum
  104.       #ELSE
  105. %ReportTotal::Cnt::%ReportTotalField   LONG    #<!Average total count
  106. %ReportTotal::Sum::%ReportTotalField   REAL    #<!Average total sum
  107.       #ENDIF
  108.     #ENDIF
  109.   #ENDFOR
  110.   #IF(%ReportSaveExist)
  111.     #SET(%Counter1,%NULL)
  112.     #SET(%Counter2,%NULL)
  113.     #FOR(%ReportSave)                           #!Footer save fields
  114.       #SET(%Counter1,(%Counter1 + 1))
  115.       #FOR(%ReportSaveField)
  116.         #SET(%Counter2,(%Counter2 + 1))
  117.         #SET(%BreakField,%ReportSaveField)
  118.         #INSERT(%RptFindFile)
  119.         #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  120.           #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  121.             #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  122.             #FIX(%File,%FoundFile)
  123.             #FIX(%Field,%ArrayField)
  124.             #IF(%FieldType = 'STRING' OR %FieldType = 'CSTRING' OR %FieldType = 'PSTRING')
  125. SAV1::%ReportSave::%Field::%Counter1::%Counter2   STRING(SIZE(%ReportSaveField)),AUTO
  126. SAV2::%ReportSave::%Field::%Counter1::%Counter2   STRING(SIZE(%ReportSaveField)),AUTO
  127.                                                #<!%ReportSave Footer save fields
  128.             #ELSE
  129. SAV1::%ReportSave::%Field::%Counter1::%Counter2   REAL,AUTO
  130. SAV2::%ReportSave::%Field::%Counter1::%Counter2   REAL,AUTO
  131.                                                #<!%ReportSave Footer save fields
  132.            #ENDIF
  133.           #ELSE
  134.             #FIX(%File,%FoundFile)
  135.             #FIX(%Field,%ReportSaveField)
  136.             #IF(%FieldType = 'GROUP')
  137. SAV1::%ReportSave::%ReportSaveField   STRING(SIZE(%ReportSaveField)),AUTO
  138. SAV2::%ReportSave::%ReportSaveField   STRING(SIZE(%ReportSaveField)),AUTO
  139.                                                #<!%ReportSave Footer save fields
  140.             #ELSE
  141. SAV1::%ReportSave::%ReportSaveField   LIKE(%ReportSaveField),AUTO
  142. SAV2::%ReportSave::%ReportSaveField   LIKE(%ReportSaveField),AUTO
  143.                                                #<!%ReportSave Footer save fields
  144.             #ENDIF
  145.           #ENDIF
  146.         #ENDIF
  147.       #ENDFOR
  148.     #ENDFOR
  149.   #ENDIF
  150.   #IF(%PageTotals = 'YES')
  151. SAV::LineCounter   SHORT                       #<!Line counter save
  152.   #ENDIF
  153.   #IF(%ReportLabel)                             #!Multi-up label USE variables
  154. SAV::LabelCounter BYTE                         #<!Multi-up label counter
  155.     #SET(%Counter1,%NULL)
  156.     #FOR(%ReportLabelField)
  157.       #SET(%Counter1,(%Counter1 + 1))
  158.       #IF(INSTRING('[',%ReportLabelField,1,1)) #!Check for array element
  159.         #SET(%ArrayField,(SUB(%ReportLabelField,1,INSTRING('[',%ReportLabelField,1,1)-1)))
  160.         #SET(%BreakField,%ReportLabelField)
  161.         #INSERT(%RptFindFile)
  162.         #FIX(%File,%FoundFile)
  163.         #FIX(%Field,%ArrayField)
  164.         #IF(%FieldType = 'STRING' OR %FieldType = 'CSTRING' OR %FieldType = 'PSTRING' OR %FieldType = 'GROUP')
  165. LBL::%ArrayField::%Counter1   STRING(SIZE(%ReportLabelField)),DIM(%ReportLabel)
  166.                                                #<!%ReportLabelField Multi-up USE variable
  167.         #ELSE
  168. LBL::%ArrayField::%Counter1   REAL,DIM(%ReportLabel)
  169.                                                #<!%ReportLabelField Multi-up USE variable
  170.         #ENDIF
  171.       #ELSE
  172.         #SET(%BreakField,%ReportLabelField)
  173.         #INSERT(%RptFindFile)
  174.         #FIX(%File,%FoundFile)
  175.         #FIX(%Field,%ReportLabelField)
  176.         #IF(%FieldType = 'GROUP')
  177. LBL::%ReportLabelField   STRING(SIZE(%ReportLabelField)),DIM(%ReportLabel)
  178.                                                #<!%ReportLabelField Multi-up USE variable
  179.         #ELSE
  180. LBL::%ReportLabelField   LIKE(%ReportLabelField),DIM(%ReportLabel)
  181.                                                #<!%ReportLabelField Multi-up USE variable
  182.         #ENDIF
  183.       #ENDIF
  184.     #ENDFOR
  185.   #ENDIF
  186. #!
  187. #!***************************************************************************
  188. #GROUP(%RptRedirectGroup)                       #!Runtime report redirection
  189.   #IF(%RedirectProc)
  190. %RedirectProc                                  #<!Call redirection procedure
  191. CASE GLO:FileSpec                              #<!Detect redirection selection
  192. OF 'CANCEL'                                    #<!Cancel report requested
  193.   RETURN
  194.     #IF(%ViewProc)
  195. OF 'SCREEN'                                   #<!Screen view requested
  196.   TempPath = COMMAND('CLATMP',0)               #<!Get temporary file directory
  197.   IF TempPath                                  #<!CLATMP set?
  198.     SavePath = PATH()                          #<!Save current path
  199.     SETPATH(TempPath)                          #<!Set to temp file directory
  200.   END
  201.   LOOP                                         #<!Create temporary filename
  202.     X# += 1                                    #<! for screen report
  203.     TempFile = 'RPT' & FORMAT(X#,@N05) & '.$$$'
  204.     IF NOT Access(TempFile,0) THEN CYCLE ELSE BREAK. #<!Check existing file
  205.   END
  206.   IF TempPath                                  #<!CLATMP set?
  207.     IF SUB(CLIP(TempPath),-1,1) = '\'
  208.       TempFile = CLIP(TempPath) & TempFile     #<!Assign temporary filename
  209.     ELSE
  210.       TempFile = CLIP(TempPath) & '\' & TempFile #<!Assign temporary filename
  211.     END
  212.     SETPATH(SavePath)                          #<!Return to previous path
  213.   END
  214.   ReportDevice = TempFile
  215.   GLO:FileSpec = TempFile
  216.     #ELSE                                       #!Redirect w/o View Proc
  217. OF 'SCREEN'                                    #<!Screen view requested
  218.   RETURN                                       #<! w/o View Procedure
  219.     #ENDIF
  220. ELSE                                           #<!All other report devices
  221.   ReportDevice = GLO:FileSpec                  #<! go to the device
  222.   TempFile = SUB(LEFT(UPPER(GLO:FileSpec)),1,3) #<!Get first three characters
  223.   IF (TempFile = 'LPT' OR TempFile = 'COM') AND NUMERIC(GLO:FileSpec[4])
  224.     IF TempFile = 'LPT' and NOT STATUS(GLO:FileSpec) #<!Check printer status
  225.       #INSERT(%PrinterOffLineMsg)
  226.       DO ProcedureReturn
  227.     END
  228.     GLO:FileSpec = ''                          #<!Disable viewing
  229.   END
  230.   TempFile = ''
  231. END
  232.   #ELSIF(%ViewProc)                             #!View w/o Redirect Proc
  233. TempFile = SUB(LEFT(UPPER(%ReportDevice)),1,3) #<!Get first three characters
  234. IF (TempFile = 'LPT' OR TempFile = 'COM') AND NUMERIC(SUB(LEFT(%ReportDevice),4,1))
  235.   IF TempFile = 'LPT' and NOT STATUS(%ReportDevice) #<!Check printer status
  236.     #INSERT(%PrinterOffLineMsg)
  237.     DO ProcedureReturn
  238.   END
  239.   GLO:FileSpec = ''                            #<!Disable viewing
  240. ELSE
  241.   GLO:FileSpec = ReportDevice                  #<!Set up filename for %ViewProc
  242. END                                            #<! port selections
  243. TempFile = ''
  244.   #ELSE                                          #!No View or Redirect Proc
  245. TempFile = SUB(LEFT(UPPER(%ReportDevice)),1,3) #<!Get first three characters
  246. IF (TempFile = 'LPT' OR TempFile = 'COM') AND NUMERIC(SUB(LEFT(%ReportDevice),4,1))
  247.   IF TempFile = 'LPT' and NOT STATUS(%ReportDevice) #<!Check printer status
  248.     #INSERT(%PrinterOffLineMsg)
  249.     DO ProcedureReturn
  250.   END
  251. END                                            #<! port selections
  252. TempFile = ''
  253.   #ENDIF
  254. #!
  255. #!***************************************************************************
  256. #GROUP(%RptGetLookupRecords)                    #!Get all lookup records
  257.   #FOR(%Secondary)                              #!%GetLookupFrom must be set
  258.     #IF(%SecondaryTo = %GetLookupFrom)          #! before #INSERT of this group
  259.       #IF(%SecondaryType = 'MANY:1')            #!Check for Lookup files
  260.         #FIX(%File,%SecondaryTo)
  261.         #FIX(%Relation,%Secondary)
  262.         #FOR(%RelationKeyField)
  263. %RelationKeyField = %RelationKeyFieldLink      #<!Assign linking field value
  264.         #ENDFOR
  265. GET(%Secondary,%RelationKey)                   #<!Lookup record
  266.         #FIX(%File,%Secondary)
  267. IF ERRORCODE() THEN CLEAR(%FilePre:Record).    #<!Clear record if unsuccessful
  268.         #IF(%ReportSaveExist)
  269.           #SET(%SaveFile,%Secondary)            #!Check for footer save fields
  270. #INSERT(%SaveFooterFields)
  271.         #ENDIF
  272.         #SET(%Temp,%GetLookupFrom)              #!Push GetLookupFrom files
  273.         #IF(NOT INSTRING(%Temp,%LookupFromQueue,1,1))
  274.           #SET(%LookupFromQueue,(%Temp & ',' & %LookupFromQueue))
  275.         #ENDIF
  276.         #SET(%GetLookupFrom,%Secondary)         #!Set up for next level
  277. #INSERT(%RptGetLookupRecords)                   #! and recursively get lookups
  278.         #SET(%GetLookupFrom,(SUB(%LookupFromQueue,1,INSTRING(',',%LookupFromQueue,1,1)-1)))
  279.         #SET(%LookupFromQueue,(SUB(%LookupFromQueue,LEN(%Temp)+2,LEN(%LookupFromQueue)-LEN(%Temp)+1)))
  280.                                                 #!Pop GetLookupFrom files
  281.       #ENDIF
  282.     #ENDIF
  283.   #ENDFOR
  284. #!
  285. #!***************************************************************************
  286. #GROUP(%RptGetRelatedRecords)                   #!Get all related records
  287. #FOR(%Secondary)                                #!%Parent must be set
  288.   #IF(%SecondaryTo=%Parent)               #! before #INSERT of this group
  289.     #IF(%SecondaryType = '1:MANY')              #!Check for children files
  290.       #FIX(%File,%Secondary)
  291.       #SET(%GroupBreakOnFile,%Null)
  292.       #SET(%GroupBreakCounter,%Null)
  293.       #FOR(%ReportGroup)
  294.         #FIX(%Field,%ReportGroup)
  295.         #SET(%GroupBreakCounter,(%GroupBreakCounter+1))
  296.         #IF(%Field)
  297.           #SET(%GroupBreakOnFile,%Field)
  298.           #BREAK
  299.         #ENDIF
  300.       #ENDFOR
  301.       #FIX(%File,%Parent)
  302.       #FIX(%Relation,%Secondary)
  303.       #SET(%HoldRelationKey,%RelationKey)
  304.       #FIX(%File,%Relation)
  305.       #FIX(%Key,%HoldRelationKey)
  306.       #FOR(%KeyField)
  307.         #SET(%LastSequence,%KeyFieldSequence)
  308.       #ENDFOR
  309.       #IF(%LastSequence='ASCENDING')
  310. CLEAR(%RelationPre:Record,-1)
  311.       #ELSE
  312. CLEAR(%RelationPre:Record,1)
  313.       #ENDIF
  314.       #FIX(%File,%Parent)
  315.       #FIX(%Relation,%Secondary)
  316.       #FOR(%RelationKeyField)
  317.         #IF(%RelationKeyFieldLink)
  318. %RelationKeyField = %RelationKeyFieldLink      #<!Assign linking field value
  319.         #ELSE
  320.           #SET(%CurrentKeyField,%RelationKeyFieldLink)
  321.           #SET(%BeginClearing,%Null)
  322.           #FIX(%File,%Relation)
  323.           #FIX(%Key,%HoldRelationKey)
  324.           #FOR(%KeyField)
  325.             #IF(%KeyField=%CurrentKeyField)
  326.               #SET(%BeginClearing,'TRUE')
  327.             #ENDIF
  328.             #IF(%BeginClearing)
  329.               #IF(%KeyFieldSequence='ASCENDING')
  330. CLEAR(%KeyField,-1)                            #<!Clear ASCENDING key field
  331.               #ELSE
  332. CLEAR(%KeyField,1)                             #<!Clear DESCENDING key field
  333.               #ENDIF
  334.             #ENDIF
  335.           #ENDFOR
  336.           #BREAK
  337.         #ENDIF
  338.       #ENDFOR
  339.       #FIX(%File,%Parent)
  340.       #FIX(%Relation,%Secondary)
  341. %RelationPre::PRINTED = False                  #<!Set records printed flag
  342. SET(%RelationKey,%RelationKey)                 #<!Set to first related record
  343. LOOP                                           #<!Loop through %Secondary
  344.   NEXT(%Secondary)                             #<! getting each record
  345.   IF ERRORCODE() THEN ErrEndFileFlag# = 1 ELSE ErrEndFileFlag# = 0. #<!Flag EOF
  346.       #FIX(%File,%Secondary)
  347.       #SET(%CodePosition,(%FilePre&':FILTER'))
  348.   #INSERT(%RptRecordFilter)
  349.       #SET(%GetLookupFrom,%Secondary)
  350.   #INSERT(%RptGetLookupRecords)                 #!Get all Lookup records
  351.       #SET(%CodePosition,%Secondary)            #!Class = primary file
  352.   #INSERT(%ReportFormulas)                      #!Generate formulas
  353.       #IF(%GroupBreakOnFile)
  354.         #IF(%ReportSaveExist)
  355.           #SET(%SaveFile,%Secondary)            #!Check for footer save fields
  356.   #INSERT(%SaveFooterFields)
  357.         #ENDIF
  358.   #INSERT(%SecondaryGroupBreak)
  359.       #ELSE                                     #!No group break on this file
  360.         #IF(%ReportSaveExist)
  361.           #SET(%SaveFile,%Secondary)            #!Check for footer save fields
  362.   #INSERT(%SaveFooterFields)
  363.         #ENDIF
  364.         #SET(%IfWritten,%Null)
  365.         #FOR(%RelationKeyField)
  366.           #IF(%RelationKeyFieldLink)
  367.             #IF(%IfWritten)
  368.   OR %RelationKeyField <> %RelationKeyFieldLink | #<!Past related records?
  369.             #ELSE
  370.   IF %RelationKeyField <> %RelationKeyFieldLink |
  371.             #SET(%IfWritten,'TRUE')
  372.             #ENDIF
  373.           #ELSE
  374.             #BREAK
  375.           #ENDIF
  376.         #ENDFOR
  377.         #IF(%IfWritten)
  378.   OR ErrEndFileFlag#                           #<!  or EOF?
  379.         #ELSE
  380.   IF ErrEndFileFlag#                           #<!  or EOF?
  381.         #ENDIF
  382.     BREAK                                      #<!Break loop
  383.   END
  384.         #FIX(%File,%Secondary)
  385.         #SET(%CodePosition,(%FilePre&':FILTER'))
  386.   #INSERT(%RptRecordFilter)
  387.         #SET(%GetLookupFrom,%Secondary)
  388.   #INSERT(%RptGetLookupRecords)                 #!Get all Lookup records
  389.         #SET(%CodePosition,%Secondary)          #!Class = primary file
  390.   #INSERT(%ReportFormulas)                      #!Generate formulas
  391.       #ENDIF
  392.         #SET(%Parent,%Secondary)          #!Recursive call to this group
  393.   #INSERT(%RptGetRelatedRecords)                #!  to get next level deep
  394.       #IF(%DetailPrinted <> 'PRINTED')          #!If at lowest recursion level
  395.   #INSERT(%PrintDetail)                         #! insert PRINT(Rpt:Detail)
  396.   #INSERT(%RptAbortKey)                         #! and ESC key abort loop
  397.         #SET(%DetailPrinted,'PRINTED')          #!Set detail printed flag
  398.       #ENDIF
  399. END                                            #<!End %Secondary File Loop
  400.     #ENDIF
  401.   #ENDIF
  402. #ENDFOR
  403. #!
  404. #!***************************************************************************
  405. #GROUP(%PrintDetail)
  406.   #IF(%ReportLabel)
  407. #INSERT(%MultiUpLabelBuild)
  408.   #ENDIF
  409.   #SET(%TallyType,'ALL')                        #!For totals on ALL
  410. #INSERT(%TallyTotals)                           #!Tally total fields
  411.   #IF(%ReportDetailPre)
  412. %ReportDetailPre
  413.   #ENDIF
  414.   #IF(%ReportDetail)
  415. PRINT(%ReportPre:%ReportDetail)                #<!Print line item detail
  416.   #ENDIF
  417.   #IF(%ProgressScreen)
  418. DISPLAY                                       #<!Display report progress
  419.   #ENDIF
  420.   #IF(%ReportDetailPost)
  421. %ReportDetailPost
  422.   #ENDIF
  423.   #IF(%PageTotals)                              #!Any page total fields?
  424. IF SAV::LineCounter > %ReportLine              #<!Page overflow occurred?
  425.     #SET(%ResetTotalType,'PAGE')                #!Reset page totals
  426.   #INSERT(%ResetTotals)
  427.     #SET(%TallyType,'PAGE')                     #!Tally page totals
  428.   #INSERT(%TallyTotals)
  429. END
  430. SAV::LineCounter = %ReportLine                 #<!Save page overflow detect
  431.   #ENDIF
  432.   #IF(%ReportLabel)
  433. #INSERT(%MultiUpLabelReset)
  434.   #ENDIF
  435. #!
  436. #!***************************************************************************
  437. #GROUP(%RptTotalRoutines)                       #!Total field routines
  438.   #FOR(%ReportTotal)
  439.     #IF(%ReportTotalTally = 'PAGE')
  440.  
  441. Tally::PAGE::Totals  ROUTINE                   #<!Tallys on page break
  442.       #SET(%TallyType,'PAGE')
  443.   #INSERT(%DoTallyTotals)
  444.       #BREAK
  445.     #ENDIF
  446.   #ENDFOR
  447.   #FOR(%ReportTotal)
  448.     #IF(%ReportTotalTally = 'ALL')
  449.  
  450. Tally::ALL::Totals ROUTINE                     #<!Tallys on body detail
  451.       #SET(%TallyType,'ALL')
  452.   #INSERT(%DoTallyTotals)
  453.       #BREAK
  454.     #ENDIF
  455.   #ENDFOR
  456.   #FOR(%ReportGroup)
  457.     #FOR(%ReportTotal)
  458.       #IF(%ReportTotalTally = %ReportGroup)
  459.  
  460. Tally::%ReportTotalTally::Totals ROUTINE       #<!Tallys on group break
  461.         #SET(%TallyType,%ReportTotalTally)
  462.   #INSERT(%DoTallyTotals)
  463.         #BREAK
  464.       #ENDIF
  465.     #ENDFOR
  466.   #ENDFOR
  467.   #FOR(%ReportTotal)
  468.     #IF(%ReportTotalReset = 'PAGE')
  469.  
  470. Reset::PAGE::Totals ROUTINE                    #<!Resets on page break
  471.      #SET(%ResetTotalType,'PAGE')
  472.   #INSERT(%DoResetTotals)
  473.       #BREAK
  474.     #ENDIF
  475.   #ENDFOR
  476.   #FOR(%ReportTotal)
  477.     #IF(%ReportTotalReset = 'NONE')
  478.  
  479. Reset::NONE::Totals ROUTINE                    #<!Resets on report close
  480.      #SET(%ResetTotalType,'NONE')
  481.   #INSERT(%DoResetTotals)
  482.       #BREAK
  483.     #ENDIF
  484.   #ENDFOR
  485.   #FOR(%ReportGroup)
  486.     #FOR(%ReportTotal)
  487.       #IF(%ReportTotalReset = %ReportGroup)
  488.  
  489. Reset::%ReportTotalReset::Totals ROUTINE       #<!Resets on group break
  490.      #SET(%ResetTotalType,%ReportTotalReset)
  491.   #INSERT(%DoResetTotals)
  492.         #BREAK
  493.       #ENDIF
  494.     #ENDFOR
  495.   #ENDFOR
  496. #!
  497. #!***************************************************************************
  498. #GROUP(%DoTallyTotals)                          #!Tally total fields
  499.   #SET(%Counter1,%NULL)                         #!%TallyType must be set
  500.   #FOR(%ReportTotal)                            #! before #INSERT this group
  501.     #SET(%Counter1,(%Counter1 + 1))
  502.     #IF(%ReportTotalTally = %TallyType)
  503.       #IF(%ReportTotalType = 'SUM')
  504. %ReportPre:%ReportTotal += %ReportTotalField   #<!SUM total of %ReportTotalField
  505.       #ELSIF(%ReportTotalType = 'COUNT')
  506. %ReportPre:%ReportTotal += 1                   #<!COUNT total of %ReportTotalField
  507.       #ELSIF(%ReportTotalType = 'HIGH')
  508. IF %ReportTotalField > %ReportPre:%ReportTotal #<!HIGH value of %ReportTotalField
  509.   %ReportPre:%ReportTotal = %ReportTotalField
  510. END
  511.       #ELSIF(%ReportTotalType = 'LOW')
  512. IF %ReportTotal::Reset
  513.   %ReportTotal::Reset = False
  514.   %ReportPre:%ReportTotal = %ReportTotalField
  515. ELSE
  516.   IF %ReportTotalField < %ReportPre:%ReportTotal #<!LOW value of %ReportTotalField
  517.     %ReportPre:%ReportTotal = %ReportTotalField
  518.   END
  519. END
  520.       #ELSIF(%ReportTotalType = 'AVERAGE')
  521.         #IF(INSTRING('[',%ReportTotalField,1,1)) #!Check for array element
  522.           #SET(%ArrayField,(SUB(%ReportTotalField,1,INSTRING('[',%ReportTotalField,1,1)-1)))
  523. %ReportTotal::Cnt::%ArrayField::%Counter1 += 1 #<!AVERAGE of %ReportTotalField
  524. %ReportTotal::Sum::%ArrayField::%Counter1 += %ReportTotalField
  525. %ReportPre:%ReportTotal = %ReportTotal::Sum::%ArrayField::%Counter1 / %ReportTotal::Cnt::%ArrayField::%Counter1
  526.         #ELSE
  527. %ReportTotal::Cnt::%ReportTotalField += 1      #<!AVERAGE of %ReportTotalField
  528. %ReportTotal::Sum::%ReportTotalField += %ReportTotalField
  529. %ReportPre:%ReportTotal = %ReportTotal::Sum::%ReportTotalField / %ReportTotal::Cnt::%ReportTotalField
  530.         #ENDIF
  531.       #ENDIF
  532.     #ENDIF
  533.   #ENDFOR
  534. #!
  535. #!***************************************************************************
  536. #GROUP(%DoResetTotals)                          #!Reset total fields
  537.   #SET(%Counter1,%NULL)                         #!%ResetTotalType must be set
  538.   #FOR(%ReportTotal)                            #! before #INSERT this group
  539.     #SET(%Counter1,(%Counter1 + 1))
  540.     #IF(%ReportTotalReset = %ResetTotalType)
  541. %ReportPre:%ReportTotal = 0
  542.       #IF(%ReportTotalType = 'LOW')
  543. %ReportTotal::Reset = True
  544.       #ENDIF
  545.       #IF(%ReportTotalType = 'AVERAGE')
  546.         #IF(INSTRING('[',%ReportTotalField,1,1)) #!Check for array element
  547.           #SET(%ArrayField,(SUB(%ReportTotalField,1,INSTRING('[',%ReportTotalField,1,1)-1)))
  548. %ReportTotal::Cnt::%ArrayField::%Counter1 = 0
  549. %ReportTotal::Sum::%ArrayField::%Counter1 = 0
  550.         #ELSE
  551. %ReportTotal::Cnt::%ReportTotalField = 0
  552. %ReportTotal::Sum::%ReportTotalField = 0
  553.         #ENDIF
  554.       #ENDIF
  555.     #ENDIF
  556.   #ENDFOR
  557. #!
  558. #!***************************************************************************
  559. #GROUP(%TallyTotals)                            #!Tally total fields
  560.   #FOR(%ReportTotal)                            #!%TallyType must be set
  561.     #IF(%ReportTotalTally = %TallyType)         #! before #INSERT this group
  562. DO Tally::%TallyType::Totals                   #<!Tally %TallyType totals
  563.       #BREAK
  564.     #ENDIF
  565.   #ENDFOR
  566. #!
  567. #!***************************************************************************
  568. #GROUP(%ResetTotals)                            #!Reset total fields
  569.   #FOR(%ReportTotal)                            #!%ResetTotalType must be set
  570.     #IF(%ReportTotalReset = %ResetTotalType)    #! before #INSERT this group
  571. DO Reset::%ResetTotalType::Totals              #<!Reset %ResetTotalType totals
  572.       #BREAK
  573.     #ENDIF
  574.   #ENDFOR
  575. #!
  576. #!***************************************************************************
  577. #GROUP(%SaveFooterFields)                       #!Call footer save routines
  578.   #FOR(%ReportSave)                             #!%SaveFile must be set
  579.     #FOR(%ReportSaveField)                      #! before #INSERT this group
  580.       #SET(%BreakField,%ReportSaveField)
  581.       #INSERT(%RptFindFile)
  582.       #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  583.         #IF(%FoundFile = %SaveFile)             #!Check for save file
  584.           #FIX(%File,%SaveFile)
  585. DO Save::%FilePre::FooterFields                #<!Save %SaveFile footer fields
  586.           #SET(%Done,'YES')
  587.           #BREAK
  588.         #ELSE
  589.           #SET(%Done,%NULL)
  590.         #ENDIF
  591.       #ENDIF
  592.     #ENDFOR
  593.     #IF(%Done = 'YES')
  594.       #BREAK
  595.     #ENDIF
  596.   #ENDFOR
  597. #!
  598. #!***************************************************************************
  599. #GROUP(%SaveFooterRoutine)                      #!Rotate footer save fields
  600.   #SET(%Temp,(SUB(%TempQueue,1,INSTRING(',',%TempQueue,1,1)-1)))
  601.   #SET(%TempQueue,(SUB(%TempQueue,LEN(%Temp)+2,LEN(%TempQueue)-LEN(%Temp)+1)))
  602.   #IF(%Temp)
  603.     #FOR(%ReportSave)
  604.       #IF(%ReportSave <> 'PAGE')
  605.         #FOR(%ReportSaveField)
  606.           #SET(%BreakField,%ReportSaveField)
  607.           #INSERT(%RptFindFile)
  608.           #IF(%Temp = %FoundFile)
  609.             #FIX(%File,%FoundFile)
  610. Save::%FilePre::FooterFields ROUTINE           #<!Save footer fields
  611.             #SET(%SaveFile,%FoundFile)
  612.   #INSERT(%SaveFooterAssigns)
  613.             #SET(%GetAssigns,'YES')
  614.             #BREAK
  615.           #ELSE
  616.             #SET(%GetAssigns,%NULL)
  617.           #ENDIF
  618.         #ENDFOR
  619.       #ENDIF
  620.       #IF(%GetAssigns)
  621.         #BREAK
  622.       #ENDIF
  623.     #ENDFOR
  624. #INSERT(%SaveFooterRoutine)
  625.   #ENDIF
  626. #!
  627. #!***************************************************************************
  628. #GROUP(%SaveFooterAssigns)                      #!Rotate footer save fields
  629.   #SET(%Counter1,%NULL)
  630.   #SET(%Counter2,%NULL)
  631.   #FOR(%ReportSave)                             #!%SaveFile must be set
  632.     #SET(%Counter1,(%Counter1 + 1))
  633.     #FOR(%ReportSaveField)                      #! before #INSERT this group
  634.       #IF(%ReportSaveField <> %ReportPage)
  635.         #SET(%Counter2,(%Counter2 + 1))
  636.         #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  637.           #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  638.         #ELSE
  639.           #SET(%ArrayField,%NULL)               #!Clear array flag
  640.         #ENDIF
  641.         #SET(%BreakField,%ReportSaveField)
  642.         #INSERT(%RptFindFile)
  643.         #FIX(%Secondary,%FoundFile)
  644.         #IF(%FoundFile = %SaveFile)
  645.           #IF(%ArrayField)                      #!Check for array element
  646. SAV2::%ReportSave::%ArrayField::%Counter1::%Counter2 = SAV1::%ReportSave::%ArrayField::%Counter1::%Counter2
  647. SAV1::%ReportSave::%ArrayField::%Counter1::%Counter2 = %ReportSaveField
  648.           #ELSE
  649. SAV2::%ReportSave::%ReportSaveField = SAV1::%ReportSave::%ReportSaveField
  650. SAV1::%ReportSave::%ReportSaveField = %ReportSaveField
  651.           #ENDIF
  652.         #ENDIF
  653.       #ENDIF
  654.     #ENDFOR
  655.   #ENDFOR
  656. #!
  657. #!***************************************************************************
  658. #GROUP(%PrintFooterFields)                      #!Set footer to print correct
  659.   #FOR(%ReportSave)                             #! before #INSERT this group
  660.     #IF(%ReportSave = %WhichFooter)             #!Check for save file
  661.       #SET(%BreakField,%ReportSave)
  662.       #INSERT(%RptFindFile)
  663.       #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  664. DO Print::%FilePre::FooterFields               #<!Print correct footer fields
  665.         #BREAK
  666.       #ENDIF
  667.     #ENDIF
  668.   #ENDFOR
  669. #!
  670. #!***************************************************************************
  671. #GROUP(%PrintFooterRoutine)                     #!Set footer to print correct
  672.   #SET(%Counter1,%NULL)                         #!  footer field values
  673.   #SET(%Counter2,%NULL)
  674.   #FOR(%ReportSave)                             #! before #INSERT this group
  675.     #SET(%BreakField,%ReportSave)
  676.     #INSERT(%RptFindFile)
  677.     #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  678.       #FIX(%File,%FoundFile)
  679. Print::%FilePre::FooterFields ROUTINE          #<!Print correct footer fields
  680.       #SET(%Counter1,(%Counter1 + 1))
  681.       #FOR(%ReportSaveField)                    #! before #INSERT this group
  682.         #SET(%Counter2,(%Counter2 + 1))
  683.         #SET(%BreakField,%ReportSaveField)
  684.         #INSERT(%RptFindFile)
  685.         #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  686.           #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  687.             #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  688.   %ReportSaveField = SAV2::%ReportSave::%ArrayField::%Counter1::%Counter2
  689.           #ELSE
  690.   %ReportSaveField = SAV2::%ReportSave::%ReportSaveField
  691.           #ENDIF
  692.         #ENDIF
  693.       #ENDFOR
  694.     #ENDIF
  695.   #ENDFOR
  696. #!
  697. #!***************************************************************************
  698. #GROUP(%RestoreFooterFields)                    #!Restore changed footer
  699.   #FOR(%ReportSave)                             #! before #INSERT this group
  700.     #IF(%ReportSave = %WhichFooter)             #!Check for save file
  701.       #SET(%BreakField,%ReportSave)
  702.       #INSERT(%RptFindFile)
  703.       #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  704. DO Restore::%ReportSave::FooterFields          #<!Restore current footer fields
  705.       #BREAK
  706.       #ENDIF
  707.     #ENDIF
  708.   #ENDFOR
  709. #!
  710. #!***************************************************************************
  711. #GROUP(%RestoreFooterRoutine)                   #!Restore changed footer
  712.   #SET(%Counter1,%NULL)                         #!  footer field values
  713.   #SET(%Counter2,%NULL)
  714.   #FOR(%ReportSave)                             #! before #INSERT this group
  715.     #SET(%BreakField,%ReportSave)
  716.     #INSERT(%RptFindFile)
  717.     #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  718.  
  719. Restore::%ReportSave::FooterFields ROUTINE     #<!Restore current footer fields
  720.       #SET(%Counter1,(%Counter1 + 1))
  721.       #FOR(%ReportSaveField)                    #! before #INSERT this group
  722.         #SET(%Counter2,(%Counter2 + 1))
  723.         #SET(%BreakField,%ReportSaveField)
  724.         #INSERT(%RptFindFile)
  725.         #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  726.           #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  727.             #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  728.   %ReportSaveField = SAV1::%ReportSave::%ArrayField::%Counter1::%Counter2
  729.           #ELSE
  730.   %ReportSaveField = SAV1::%ReportSave::%ReportSaveField
  731.           #ENDIF
  732.         #ENDIF
  733.       #ENDFOR
  734.     #ENDIF
  735.   #ENDFOR
  736. #!
  737. #!***************************************************************************
  738. #GROUP(%ReportFormulas)                         #!Generate formula field code
  739.   #FOR(%Formula)                                #!%CodePosition must be set
  740.                                                 #! before #INSERT this group
  741.     #IF((UPPER(LEFT(%FormulaClass)) = UPPER(%CodePosition) OR %FormulaClass = %NULL) AND %FormulaType = 'COMPUTED')
  742. %Formula = %FormulaComputation                 #<!%FormulaDescription
  743.     #ENDIF
  744.   #ENDFOR
  745.   #FOR(%Formula)                                #!All computed fields before
  746.     #IF((UPPER(LEFT(%FormulaClass)) = UPPER(%CodePosition) OR %FormulaClass = %NULL) AND %FormulaType = 'CONDITION')
  747. IF %FormulaCondition                           #<!%FormulaDescription
  748.   %Formula = %FormulaTrue
  749. ELSE
  750.   %Formula = %FormulaFalse
  751. END
  752.     #ENDIF
  753.   #ENDFOR
  754. #!
  755. #!***************************************************************************
  756. #GROUP(%RptRecordFilter)                        #!Generate record filter code
  757.   #FOR(%Formula)                                #!%CodePosition must be set
  758.                                                 #! and must contain the file
  759.                                                 #! prefix followed by :FILTER
  760.     #IF(UPPER(LEFT(%FormulaClass)) = UPPER(%CodePosition))
  761.       #IF(%FormulaType = 'COMPUTED')
  762. IF NOT (%FormulaComputation)  |                #<!%FormulaDescription
  763.   AND NOT ErrEndFileFlag#                      #<!End of file?
  764.     CYCLE                                      #<!%File record filter
  765. END
  766.       #ELSE
  767. IF NOT (%FormulaCondition) |                   #<!%FormulaDescription
  768.   AND NOT ErrEndFileFlag#                      #<!End of file?
  769.     CYCLE                                      #<!%File record filter
  770. END
  771.       #ENDIF
  772.     #ENDIF
  773.   #ENDFOR
  774. #!***************************************************************************
  775. #GROUP(%GroupBreakNumber)                       #!Counts number of group
  776.   #SET(%GroupCounter,%NULL)                     #! breaks on %CurrentFile
  777.   #SET(%GroupFields,%NULL)                      #! and builds list of all the
  778.   #FOR(%ReportGroup)                            #! break fields for the file
  779.     #SET(%BreakField,%ReportGroup)
  780.     #INSERT(%RptFindFile)
  781.     #IF(%FoundFile = %CurrentFile)              #!Check breaks on current file
  782.       #SET(%GroupCounter,(%GroupCounter + 1))   #!Increment counter and add
  783.       #SET(%Temp,%ReportGroup)                  #! field to %GroupFields list
  784.       #SET(%GroupFields,(%Temp & ',' & %GroupFields))
  785.     #ENDIF
  786.   #ENDFOR
  787. #!***************************************************************************
  788. #GROUP(%PrimaryGroupBreak)                    #!Generates group breaks on
  789. #FIX(%File,%Primary)                            #! the %Primary file
  790. #FIX(%Key,%PrimaryKey)
  791. BreakLevel = 0                                 #<!Initialize group break flag
  792. #SET(%FirstCompareField,%Null)
  793. #IF(%SelectorAccess)                            #!If record selector
  794.   #SET(%IfWritten,%Null)                         #!Prepare For If Structure
  795.   #SET(%LastElementWritten,%Null)
  796.   #FOR(%KeyField)                                #!For each field in key
  797.     #IF(%KeyField=%KeyComponent)
  798.       #SET(%CompareAgainst,%ScopeValue)
  799.       #SET(%FirstCompareField,%KeyField)
  800.     #ELSE
  801.       #SET(%CompareAgainst,('BRK::'&%ScopeValue))
  802.     #ENDIF
  803.     #IF(%IfWritten)                              #!If the IF statement written
  804. OR %KeyComponent <> %CompareAgainst |            #<!Past Range Limits?
  805.     #ELSE                                        #!If IF not written yet
  806. IF %KeyComponent <> %CompareAgainst |            #<!Past Range Limits?
  807.     #ENDIF                                       #!END (If IF Written)
  808.     #IF(%FirstCompareField)
  809.       #BREAK
  810.     #ENDIF
  811.     #SET(%IfWritten,'TRUE')                      #!The IF statement written
  812.   #ENDFOR                                        #!END (For Relation Field)
  813. OR ErrEndFileFlag#                             #<! or End of file
  814. #ELSE
  815. IF ErrEndFileFlag#                             #<! or End of file
  816. #ENDIF
  817.   IF %FilePre::PRINTED                         #<!If %File Records printed
  818.     BreakLevel = 1                             #<! set break level to
  819.     DO Print::%FilePre::GroupFooters           #<! print last group footers
  820.   END
  821.   BREAK                                        #<!End the report
  822. END
  823. #INSERT(%FindGroupBreaks)
  824. IF NOT %FilePre::PRINTED                       #<!First time in?
  825.   BreakLevel = 1                               #<! set break level to
  826.   DO Print::%FilePre::GroupHeaders             #<! print first group headers
  827.   %FilePre::PRINTED = 1                        #<! and set recs printed flag
  828. ELSIF BreakLevel                               #<!Normal group break?
  829.   DO Print::%FilePre::GroupFooters             #<! print group footers
  830.   DO Print::%FilePre::GroupHeaders             #<! then group headers
  831. END
  832. #!***************************************************************************
  833. #GROUP(%FindGroupBreaks)
  834. #SET(%GroupCounter,'1')
  835. #FOR(%ReportGroup)
  836.   #FIX(%Field,%ReportGroup)
  837.   #IF(%Field)
  838.     #SET(%IfWritten,%Null)                       #!Prepare For If Structure
  839.     #IF(%FirstCompareField)
  840.       #IF(%FirstCompareField=%Field)
  841.         #SET(%BeginWriting,'TRUE')
  842.       #ELSE
  843.         #SET(%BeginWriting,%Null)
  844.       #ENDIF
  845.     #ELSE
  846.       #SET(%BeginWriting,'TRUE')
  847.     #ENDIF
  848.     #FOR(%KeyField)
  849.       #IF(%BeginWriting)
  850.         #IF(UPPER(%KeyField)=UPPER(%ReportGroup))#!If this is last link field
  851.           #IF(%IfWritten)                        #!If the IF statement written
  852. OR BRK::%KeyField <> %KeyField                   #<!Past Range Limits?
  853.           #ELSE                                  #!If IF not written yet
  854.             #IF(%GroupCounter<>'1')
  855. ELSIF BRK::%KeyField <> %KeyField           #<!Past Range Limits?
  856.             #ELSE
  857. IF BRK::%KeyField <> %KeyField              #<!Past Range Limits?
  858.             #ENDIF
  859.             #SET(%IfWritten,'TRUE')              #!The IF statement written
  860.           #ENDIF                                 #!END (If IF Written)
  861.           #BREAK                                 #!Break out of loop
  862.         #ELSE                                    #!otherwise (Counter > 1)
  863.           #IF(%IfWritten)                        #!If the IF statement written
  864. OR BRK::%KeyField <> %KeyField |                 #<!Past Range Limits?
  865.           #ELSE                                  #!If IF not written yet
  866.             #IF(%GroupCounter<>'1')
  867. ELSIF BRK::%KeyField <>%KeyField |               #<!Past Range Limits?
  868.             #ELSE
  869. IF BRK::%KeyField <> %KeyField |                 #<!Past Range Limits?
  870.             #ENDIF
  871.             #SET(%IfWritten,'TRUE')              #!The IF statement written
  872.           #ENDIF                                 #!END (If IF Written)
  873.         #ENDIF                                   #!END (If Field Counter = 1)
  874.       #ELSIF(%KeyField=%FirstCompareField)
  875.         #SET(%BeginWriting,'True')
  876.       #ENDIF
  877.       #IF(UPPER(%KeyField)=UPPER(%ReportGroup))
  878.         #BREAK
  879.       #ENDIF
  880.     #ENDFOR
  881.     #IF(%IfWritten)
  882.   BreakLevel = %GroupCounter
  883.       #SET(%GroupCounter,(%GroupCounter+1))
  884.       #SET(%FirstCompareField,%ReportGroup)
  885.     #ENDIF
  886.   #ENDIF
  887. #ENDFOR
  888. END
  889. IF BreakLevel
  890.   #SET(%BeginWriting,%Null)
  891.   #FOR(%KeyField)
  892.     #FIX(%ReportGroup,%KeyField)
  893.     #IF(%ReportGroup)
  894.       #SET(%BeginWriting,'TRUE')
  895.     #ELSE
  896.       #IF(%BeginWriting)
  897.         #BREAK
  898.       #ENDIF
  899.     #ENDIF
  900.     #IF(%BeginWriting)
  901.   BRK::%KeyField = %KeyField                #<!Past Range Limits?
  902.     #ENDIF
  903.   #ENDFOR
  904. END
  905. #!***************************************************************************
  906. #GROUP(%SecondaryGroupBreak)                     #!For Secondary files only
  907. BreakLevel = 0                                   #<!Initialize group break flag
  908.   #FIX(%File,%Parent)
  909.   #FIX(%Relation,%Secondary)
  910.   #SET(%IfWritten,%Null)
  911.   #SET(%FirstCompareField,%Null)
  912.   #FOR(%RelationKeyField)                        #! and build the code
  913.     #IF(%RelationKeyFieldLink)
  914.       #SET(%FirstCompareField,%RelationKeyField)
  915.       #IF(%IfWritten)
  916. OR %RelationKeyField <> %RelationKeyFieldLink   |#<!Past related records?
  917.       #ELSE
  918. IF %RelationKeyField <> %RelationKeyFieldLink   |#<!Past related records?
  919.       #ENDIF
  920.       #SET(%IfWritten,'TRUE')
  921.     #ENDIF
  922.   #ENDFOR
  923.   #IF(%IfWritten)
  924. OR ErrEndFileFlag#                             #<! or end of file?
  925.   #ELSE
  926. IF ErrEndFileFlag#                             #<! or end of file?
  927.   #ENDIF
  928.   IF %RelationPre::PRINTED                     #<!If %File Records printed
  929.     BreakLevel = 1                             #<! set max break level to
  930.     DO Print::%RelationPre::GroupFooters       #<! print last group footers
  931.   END
  932.   BREAK                                        #<!End %File file processing
  933. END
  934.   #SET(%ProcessingKey,%RelationKey)
  935.   #FIX(%File,%Relation)
  936.   #FIX(%Key,%ProcessingKey)
  937. #INSERT(%FindGroupBreaks)
  938. IF NOT %RelationPre::PRINTED                   #<!First time in?
  939.   BreakLevel = 1                               #<! set break level to
  940.   #SET(%LastProcessingField,%Null)
  941.   #FIX(%File,%Secondary)
  942.   #FOR(%ReportGroup)
  943.     #FIX(%Field,%ReportGroup)
  944.     #IF(%Field)
  945.       #SET(%LastProcessingField,%Field)
  946.     #ENDIF
  947.   #ENDFOR
  948.   #SET(%BeginWriting,%Null)
  949.   #FIX(%Key,%ProcessingKey)
  950.   #FOR(%RelationKeyField)
  951.     #IF(%RelationKeyFieldLink=%Null)
  952.   BRK::%RelationKeyField = %RelationKeyField #<!Save new break values
  953.     #ENDIF
  954.     #IF(%RelationKeyField=%LastProcessingField)
  955.       #BREAK
  956.     #ENDIF
  957.   #ENDFOR
  958.   DO Print::%RelationPre::GroupHeaders         #<! print first group headers
  959.   %RelationPre::PRINTED = 1                    #<! and set recs printed flag
  960. ELSIF BreakLevel
  961.   DO Print::%RelationPre::GroupFooters         #<! print group footers
  962.   DO Print::%RelationPre::GroupHeaders         #<! then group headers
  963. END
  964. #!
  965. #!***************************************************************************
  966. #GROUP(%BreakFooterRoutines)                   #!Build ROUTINES to print footers
  967.   #SET(%TempFiles,%BreakFilesQueue)            #!Work through all files with
  968.   #FOR(%ReportGroup)                           #! group breaks on them
  969.     #SET(%Temp1,(SUB(%TempFiles,1,INSTRING(',',%TempFiles,1,1)-1)))
  970.     #SET(%TempFiles,(SUB(%TempFiles,LEN(%Temp1)+2,LEN(%TempFiles)-LEN(%Temp1)+1)))
  971.     #IF(NOT %Temp1)                            #!No files left in queue?
  972.       #BREAK                                   #! end process
  973.     #ENDIF
  974.     #SET(%CurrentFile,%Temp1)                  #!Set up to get break fields
  975.     #INSERT(%GroupBreakNumber)                 #! and count them
  976.     #FIX(%File,%Temp1)                         #!Set up to work through
  977.     #IF(%Primary = %File)                      #! %KeyField for all code
  978.       #FIX(%Key,%PrimaryKey)
  979.     #ELSE
  980.       #FIX(%Secondary,%File)
  981.       #FIX(%File,%SecondaryTo)
  982.       #FIX(%Relation,%Secondary)
  983.       #SET(%TempKey,%RelationKey)
  984.       #FIX(%File,%Secondary)
  985.       #FIX(%Key,%TempKey)
  986.     #ENDIF
  987.  
  988. Print::%FilePre::GroupFooters ROUTINE          #<!Group Footers for %File file
  989.     #IF(%ReportLabel)                          #!Check for labels with breaks
  990.   #INSERT(%PrintDanglingLabels)
  991.     #ENDIF
  992.     #SET(%BreakCounter,%GroupCounter)
  993.     #SET(%TempGroup,%GroupFields)
  994.     #FOR(%KeyField)
  995.       #SET(%Temp,(SUB(%TempGroup,1,INSTRING(',',%TempGroup,1,1)-1)))
  996.       #SET(%TempGroup,(SUB(%TempGroup,LEN(%Temp)+2,LEN(%TempGroup)-LEN(%Temp)+1)))
  997.       #FIX(%ReportGroup,%Temp)
  998.       #IF(%ReportGroup <> %NULL)
  999.   IF BreakLevel <= %BreakCounter               #<!Check group break level
  1000.     #INSERT(%GroupBreakFooter)
  1001.   END
  1002.       #ENDIF
  1003.       #SET(%BreakCounter,(%BreakCounter - 1))
  1004.       #IF(NOT %BreakCounter)
  1005.         #BREAK
  1006.       #ENDIF
  1007.     #ENDFOR
  1008.   #ENDFOR
  1009. #!
  1010. #!***************************************************************************
  1011. #GROUP(%BreakHeaderRoutines)                   #!Build ROUTINES to print headers
  1012.   #SET(%TempFiles,%BreakFilesQueue)            #!Work through all files with
  1013.   #FOR(%ReportGroup)                           #! group breaks on them
  1014.     #SET(%Temp1,(SUB(%TempFiles,1,INSTRING(',',%TempFiles,1,1)-1)))
  1015.     #SET(%TempFiles,(SUB(%TempFiles,LEN(%Temp1)+2,LEN(%TempFiles)-LEN(%Temp1)+1)))
  1016.     #IF(NOT %Temp1)                            #!No files left in queue?
  1017.       #BREAK                                   #! end process
  1018.     #ENDIF
  1019.     #SET(%CurrentFile,%Temp1)                  #!Set up to get break fields
  1020.     #INSERT(%GroupBreakNumber)                 #! and count them
  1021.     #FIX(%File,%Temp1)                         #!Set up to work through
  1022.     #IF(%Primary = %File)                      #! %KeyField for all code
  1023.       #FIX(%Key,%PrimaryKey)
  1024.     #ELSE
  1025.       #FIX(%Secondary,%File)
  1026.       #FIX(%File,%SecondaryTo)
  1027.       #FIX(%Relation,%Secondary)
  1028.       #SET(%TempKey,%RelationKey)
  1029.       #FIX(%File,%Secondary)
  1030.       #FIX(%Key,%TempKey)
  1031.     #ENDIF
  1032.  
  1033. Print::%FilePre::GroupHeaders ROUTINE          #<!Group Headers for %File file
  1034.     #SET(%BreakCounter,'1')                    #!Check for labels with breaks
  1035.      #FOR(%KeyField)
  1036.       #IF(INSTRING(%KeyField,%GroupFields,1,1))
  1037.         #FIX(%ReportGroup,%KeyField)
  1038.   IF BreakLevel <= %BreakCounter               #<!Check group break level
  1039.     #INSERT(%GroupBreakHeader)
  1040.   END
  1041.         #IF(%BreakCounter = %GroupCounter)
  1042.           #BREAK
  1043.         #ENDIF
  1044.         #SET(%BreakCounter,(%BreakCounter + 1))
  1045.       #ENDIF
  1046.     #ENDFOR
  1047.   #ENDFOR
  1048. #!
  1049. #!***************************************************************************
  1050. #GROUP(%GroupBreakFooter)                       #!PRINT group footers
  1051.   #SET(%ThisReportGroup,%ReportGroup)           #!Save work Group
  1052.   #IF(%ReportSaveExist)
  1053.     #SET(%WhichFooter,%ThisReportGroup)         #!Ensure footer fields contain
  1054. #INSERT(%PrintFooterFields)                     #! correct values to print
  1055.   #ENDIF
  1056.   #FIX(%ReportGroup,%ThisReportGroup)           #!Fix to saved work Group
  1057.   #SET(%CodePosition,%ThisReportGroup)          #!Class = group break field
  1058. #INSERT(%ReportFormulas)                        #!Generate formulas
  1059.   #FIX(%ReportGroup,%ThisReportGroup)           #!Fix to saved work Group
  1060.    #IF(%ReportGroupFooterPre)
  1061. %ReportGroupFooterPre
  1062.    #ENDIF
  1063.    #IF(%ReportGroupFooter)
  1064. PRINT(%ReportPre:%ReportGroupFooter)           #<!Print group footer
  1065.      #IF(%ProgressScreen)
  1066. DISPLAY                                        #<!Display report progress
  1067.      #ENDIF
  1068.    #ENDIF
  1069.    #IF(%ReportGroupFooterPost)
  1070. %ReportGroupFooterPost
  1071.    #ENDIF
  1072.   #IF(%ReportSaveExist)
  1073.     #SET(%WhichFooter,%ThisReportGroup)         #!Ensure footer fields contain
  1074. #INSERT(%RestoreFooterFields)                   #!Restore saved footer fields
  1075.   #ENDIF
  1076.    #IF(%PageTotals)                             #!Any footer save fields?
  1077. IF SAV::LineCounter > %ReportLine              #<!Page overflow?
  1078.      #SET(%ResetTotalType,'PAGE')               #!Reset page totals
  1079.   #INSERT(%ResetTotals)
  1080.      #SET(%TallyType,'PAGE')                    #!Tally page totals
  1081.   #INSERT(%TallyTotals)
  1082. END
  1083. SAV::LineCounter = %ReportLine                 #<!Save line counter
  1084.   #ENDIF
  1085.   #SET(%TallyType,%ThisReportGroup)             #!Tally group total fields
  1086. #INSERT(%TallyTotals)
  1087.   #SET(%ResetTotalType,%ThisReportGroup)        #!Reset group total fields
  1088. #INSERT(%ResetTotals)
  1089. #!
  1090. #!***************************************************************************
  1091. #GROUP(%GroupBreakHeader)                       #!PRINT group header
  1092.   #SET(%ThisReportGroup,%ReportGroup)           #!Save work Group
  1093.   #IF(%ReportGroupHeaderPre)
  1094. %ReportGroupHeaderPre
  1095.   #ENDIF
  1096.   #IF(%ReportGroupHeader)
  1097. PRINT(%ReportPre:%ReportGroupHeader)           #<!Print group header
  1098.     #IF(%ProgressScreen)
  1099. DISPLAY                                        #<!Display report progress
  1100.     #ENDIF
  1101.   #ENDIF
  1102.   #IF(%ReportGroupHeaderPost)
  1103. %ReportGroupHeaderPost
  1104.   #ENDIF
  1105.    #IF(%PageTotals)                             #!Any footer save fields?
  1106. IF SAV::LineCounter > %ReportLine              #<!Page overflow?
  1107.      #SET(%ResetTotalType,'PAGE')               #!Reset page totals
  1108.   #INSERT(%ResetTotals)
  1109.      #SET(%TallyType,'PAGE')                    #!Tally page totals
  1110.   #INSERT(%TallyTotals)
  1111. END
  1112. SAV::LineCounter = %ReportLine                 #<!Save line counter
  1113.   #ENDIF
  1114. #!
  1115. #!***************************************************************************
  1116. #GROUP(%MultiUpLabelBuild)
  1117. SAV::LabelCounter += 1                         #<!Increment label counter
  1118.   #SET(%Counter1,%NULL)
  1119.   #FOR(%ReportLabelField)
  1120.     #SET(%Counter1,(%Counter1 + 1))
  1121.     #IF(INSTRING('[',%ReportLabelField,1,1)) #!Check for array element
  1122.       #SET(%ArrayField,(SUB(%ReportLabelField,1,INSTRING('[',%ReportLabelField,1,1)-1)))
  1123. LBL::%ArrayField::%Counter1[SAV::LabelCounter] = %ReportLabelField
  1124.     #ELSE
  1125. LBL::%ReportLabelField[SAV::LabelCounter] = %ReportLabelField
  1126.     #ENDIF
  1127.   #ENDFOR
  1128. IF SAV::LabelCounter < %ReportLabel
  1129.   CYCLE
  1130. END
  1131. #!
  1132. #!***************************************************************************
  1133. #GROUP(%MultiUpLabelReset)
  1134. SAV::LabelCounter = 0                          #<!Reset label counter
  1135.   #SET(%Counter1,%NULL)
  1136.   #FOR(%ReportLabelField)
  1137.     #SET(%Counter1,(%Counter1 + 1))
  1138.     #IF(INSTRING('[',%ReportLabelField,1,1)) #!Check for array element
  1139.       #SET(%ArrayField,(SUB(%ReportLabelField,1,INSTRING('[',%ReportLabelField,1,1)-1)))
  1140. CLEAR(LBL::%ArrayField::%Counter1)             #<!Reset label USE variable
  1141.     #ELSE
  1142. CLEAR(LBL::%ReportLabelField)                  #<!Reset label USE variable
  1143.     #ENDIF
  1144.   #ENDFOR
  1145. #!
  1146. #!***************************************************************************
  1147. #GROUP(%PrintDanglingLabels)
  1148. IF SAV::LabelCounter <> 0                      #<!If any labels left to print
  1149.     #IF(%ReportDetailPre)
  1150.   %ReportDetailPre
  1151.     #ENDIF
  1152.   PRINT(%ReportPre:%ReportDetail)              #<!Print last line item detail
  1153.     #IF(%ProgressScreen)
  1154.   DISPLAY                                      #<!Display report progress
  1155.     #ENDIF
  1156.     #IF(%ReportDetailPost)
  1157.   %ReportDetailPost
  1158.     #ENDIF
  1159.   #INSERT(%MultiUpLabelReset)
  1160. END
  1161. #!***************************************************************************
  1162. #GROUP(%RptAbortKey)
  1163.   #IF(%EscapeAbort)                             #!Enable ESC checked?
  1164. LOOP WHILE KEYBOARD()                          #<!If any keystrokes waiting
  1165.   ASK                                          #<! in the buffer, get them
  1166.   IF KEYCODE() = EscKey                        #<!Detect the ESC key
  1167.     DO ProcedureReturn
  1168.   END
  1169. END                                            #<!End abort key loop
  1170.   #ENDIF
  1171. #!
  1172. #!***************************************************************************
  1173. #GROUP(%RptSetFlags)                            #!Generation Condition flags
  1174.   #SET(%SelectorAccess,(%AccessMethod = 'Keyed Order' AND %KeyComponent <> %NULL))
  1175.   #FOR(%Secondary)                              #!Are there secondary files?
  1176.     #SET(%SecondaryExist,'YES')
  1177.     #BREAK
  1178.   #ENDFOR
  1179.   #FOR(%Formula)                                #!Are there Formulas?
  1180.     #SET(%FormulaExist,'YES')
  1181.     #BREAK
  1182.   #ENDFOR
  1183.   #FOR(%ReportGroup)                            #!Build queue of files that
  1184.     #SET(%BreakField,%ReportGroup)              #! have group breaks
  1185.     #INSERT(%RptFindFile)
  1186.     #SET(%Temp,%FoundFile)
  1187.     #IF(NOT INSTRING(%Temp,%BreakFilesQueue,1,1))
  1188.       #SET(%BreakFilesQueue,(%BreakFilesQueue & %Temp & ','))
  1189.     #ENDIF
  1190.     #SET(%ReportGroupExist,'YES')
  1191.   #ENDFOR
  1192.   #FOR(%ReportTotal)                            #!Are there Totals?
  1193.     #SET(%ReportTotalExist,'YES')
  1194.     #BREAK
  1195.   #ENDFOR
  1196.   #SET(%SaveFilesQueue,%NULL)
  1197.   #FOR(%ReportSave)                             #!Build list of files that
  1198.     #SET(%BreakField,%ReportSave)               #! have footers with fields
  1199.     #INSERT(%RptFindFile)                       #! from that file or are
  1200.     #SET(%BreakFile,%FoundFile)                 #! looked up from that file
  1201.     #FOR(%ReportSaveField)
  1202.       #SET(%BreakField,%ReportSaveField)
  1203.       #INSERT(%RptFindFile)
  1204.       #FIX(%Secondary,%FoundFile)
  1205.       #IF(%BreakFile = %FoundFile)
  1206.         #SET(%ReportSaveExist,'YES')            #!Set Flag
  1207.         #SET(%Temp,%FoundFile)
  1208.         #IF(NOT INSTRING(%Temp,%SaveFilesQueue,1,1))
  1209.           #SET(%SaveFilesQueue,(%SaveFilesQueue & %Temp & ','))
  1210.         #ENDIF
  1211.       #ELSIF(%SecondaryTo = %BreakFile AND %SecondaryType = 'MANY:1')
  1212.         #SET(%ReportSaveExist,'YES')            #!Set flag
  1213.         #SET(%Temp,%FoundFile)
  1214.         #IF(NOT INSTRING(%Temp,%SaveFilesQueue,1,1))
  1215.           #SET(%SaveFilesQueue,(%SaveFilesQueue & %Temp & ','))
  1216.         #ENDIF
  1217.       #ENDIF
  1218.     #ENDFOR
  1219.   #ENDFOR
  1220.   #FOR(%ReportTotal)                            #!Detect any PAGE total fields
  1221.     #IF(%ReportTotalReset = 'PAGE')
  1222.       #SET(%PageTotals,'YES')                   #!Set flag
  1223.       #BREAK
  1224.     #ELSIF(%ReportTotalTally = 'PAGE')
  1225.       #SET(%PageTotals,'YES')                   #!Set flag
  1226.       #BREAK
  1227.     #ENDIF
  1228.   #ENDFOR
  1229. #!
  1230. #!***************************************************************************
  1231. #GROUP(%RptFindFile)                            #!Find file from field prefix
  1232.   #SET(%FoundFile,%NULL)
  1233.   #FOR(%File)
  1234.     #IF(UPPER(%FilePre) = UPPER(SUB(%BreakField,1,INSTRING(':',%BreakField,1,1)-1)))
  1235.       #SET(%FoundFile,%File)
  1236.       #BREAK
  1237.     #ENDIF
  1238.   #ENDFOR
  1239. #!
  1240. #!***************************************************************************
  1241. #GROUP(%ReportErrorCheck)
  1242.   #SET(%ErrorMessage,(%Procedure & ' ERROR:'))
  1243.   #IF(%Primary = %NULL)                         #!No File Schematic?
  1244.     #ERROR(%ErrorMessage)
  1245.     #ERROR(' You MUST define a Primary File in the File Schematic.')
  1246.   #ENDIF
  1247.   #IF(%KeyComponent)
  1248.     #FIX(%File,%Primary)
  1249.     #FIX(%Key,%PrimaryKey)
  1250.     #FOR(%KeyField)
  1251.       #IF(%KeyField = %KeyComponent)
  1252.         #SET(%FoundComponent,'YES')
  1253.         #BREAK
  1254.       #ENDIF
  1255.     #ENDFOR
  1256.     #IF(%FoundComponent = %NULL)                #!Range limit on wrong Key?
  1257.       #ERROR(%ErrorMessage)
  1258.       #ERROR('  Range Limit Field must be a component of ')
  1259.       #ERROR('  the Primary file Access Key.')
  1260.     #ENDIF
  1261.     #IF(%ScopeValue = %NULL)                    #!Range limit w/o Range Value
  1262.       #ERROR(%ErrorMessage)
  1263.       #ERROR('  Must define a Range Value Field')
  1264.     #ELSIF(%KeyComponent = %ScopeValue)         #!Range limit == Range Value
  1265.       #ERROR(%ErrorMessage)
  1266.       #ERROR('  Range Value Field and Range Limit Field')
  1267.       #ERROR('  must be separate fields.')
  1268.     #ENDIF
  1269.   #ENDIF
  1270. #!
  1271. #CHAIN('Warnings.TPX')
  1272.