home *** CD-ROM | disk | FTP | other *** search
/ High Voltage Shareware / high1.zip / high1 / DIR2 / CLATPL.ZIP / CLARION7.TPX < prev    next >
Text File  |  1993-07-26  |  63KB  |  1,500 lines

  1. #!------------------------------------------------------------------------------
  2. #!
  3. #!      CLARION7.TPX
  4. #!
  5. #!      Report    Print a report from a file
  6. #!
  7. #!------------------------------------------------------------------------------
  8. #!
  9. #PROCEDURE(Report,'Print a Report'),REPORT,SCREEN
  10. #!------------------------------------------------------------------------------
  11. #!
  12. #!                           The Report Template
  13. #!
  14. #!   This procedure template is designed to print most reports an application
  15. #!   may require.  Secondary file relationships (1:MANY) are handled by the
  16. #!   %RptGetRelatedRecords #GROUP code, which recurses through as many levels
  17. #!   of 1:MANY relationships as are defined in the File Schematic, starting
  18. #!   with the Primary file, going down the chain of Secondary files beginning
  19. #!   with the first Child file of the Primary.  Any other Child files of the
  20. #!   Primary file begin a second 1:MANY file chain -- this is not supported.
  21. #!
  22. #!   The MANY:1 (lookup) relationships go only one level below the file it is
  23. #!   related to, for every 1:MANY (Parent-Child) relationship at each level (a
  24. #!   lookup file may not generate a second lookup from it -- write embedded
  25. #!   source code for this).
  26. #!
  27. #!   This File Schematic is directly supported:
  28. #!      Primary
  29. #!       └──Secondary (Lookup MANY:1 from Primary)
  30. #!       └──Secondary (Lookup MANY:1 from Primary)
  31. #!       └─Secondary (Child File of Primary)
  32. #!          └──Secondary (Lookup MANY:1 from Secondary Child)
  33. #!          └──Secondary (Lookup MANY:1 from Secondary Child)
  34. #!          └─Secondary (Child File of Secondary Child)
  35. #!             └──Secondary (Lookup MANY:1 from Secondary Child)
  36. #!
  37. #!   This File Schematic is NOT directly supported:
  38. #!      Primary
  39. #!       └──Secondary (Lookup File from Primary)
  40. #!       │  └─Secondary (Child of Lookup File) -- NO Children of Lookups
  41. #!       └─Secondary (Child File of Primary)
  42. #!       │  └──Secondary (Lookup File from Secondary Child)
  43. #!       │     └──Secondary (Lookup File from Lookup File) -- NO 2nd Lookups
  44. #!       └─Secondary (Another Child File of Primary) -- NO 2nd Child chains
  45. #!
  46. #!   Formula Classes supported are:
  47. #!     The prefix of a Parent or Child file with :FILTER appended (Pre:FILTER).
  48. #!       Creates a record filter to skip records in which the filter
  49. #!       expression does not evaluate as true, just after the file's record
  50. #!       is read.
  51. #!     The name of a Parent or Child file (not a Lookup file).
  52. #!       Calculates the formula after each read from the file -- this is
  53. #!       immediately after any Pre:FILTER is evaluated.
  54. #!     No class --
  55. #!       Calculates the formula every time a record is read from any file.
  56. #!
  57. #!   Multi-Up labels are supported -- they must be in the Body Detail band.
  58. #!   Group Breaks are supported -- up to four per file (Primary or Child
  59. #!   Secondary -- not on Lookups).
  60. #!
  61. #!------------------------------------------------------------------------------
  62. #PROTOTYPE('')
  63. #DISPLAY(' ')
  64. #PROMPT('Enable ESC Key Abort',CHECK),%EscapeAbort
  65. #PROMPT('Show Report Progress',CHECK),%ProgressScreen
  66. #PROMPT('CLEAR Record &First',CHECK),%ClearRecord
  67. #PROMPT('Primary File &Access',OPTION),%AccessMethod
  68. #PROMPT('Keyed Order',RADIO)
  69. #PROMPT('Record Order',RADIO)
  70. #PROMPT('Range &Limit Field',COMPONENT),%KeyComponent
  71. #PROMPT('Range &Value Field',FIELD),%ScopeValue
  72. #PROMPT('Red&irect Procedure',PROCEDURE),%RedirectProc
  73. #PROMPT('View Procedure',PROCEDURE),%ViewProc
  74. #INSERT(%RptSetFlags)
  75. #INSERT(%ReportErrorCheck)
  76. #INSERT(%StandardHeader)
  77. #IF(%RedirectProc AND %ViewProc)
  78.   #MAP('TEMPFILE.INC')
  79. #ENDIF
  80.  
  81. %Procedure       PROCEDURE
  82.  
  83. #INSERT(%CloseFilesFlags)
  84. %LocalData
  85.  
  86. #INSERT(%ReportDataDeclares)                    #!Internal data declarations
  87.   #IF(%ProgressScreen)
  88.  
  89. %ScreenStructure
  90.   #ENDIF
  91.  
  92. %ReportStructure
  93.  
  94. #EMBED('Data Section')
  95.  
  96.   CODE
  97.   #EMBED('Setup Procedure')
  98.   #IF(%RedirectProc)                            #!Runtime report redirection
  99.   %RedirectProc                                #<!Call redirection procedure
  100.   CASE GLO:FileSpec                              !Detect redirection selection
  101.   OF 'CANCEL'                                    !Cancel report requested
  102.     RETURN
  103.     #IF(%ViewProc)
  104.   OF 'SCREEN'                                    !Screen view requested
  105.     TempPath = COMMAND('CLATMP',0)               !Get temporary file directory
  106.     IF NOT TempPath                              !None set?
  107.       LOOP                                       !Create temporary filename
  108.         X# += 1                                  !  for screen report
  109.         TempFile = 'RPT' & FORMAT(X#,@N05) & '.$$$'
  110.         IF NOT Access(TempFile,0) THEN CYCLE ELSE BREAK. !Check existing file
  111.       END
  112.     ELSE
  113.       SavePath = PATH()                          !Save current path
  114.       SETPATH(TempPath)                          !Set to temp file directory
  115.       LOOP                                       !Create temporary filename
  116.         X# += 1                                  ! for screen report
  117.         TempFile = 'RPT' & FORMAT(X#,@N05) & '.$$$'
  118.         IF NOT Access(TempFile,0) THEN CYCLE ELSE BREAK. !Check existing file
  119.       END
  120.       IF SUB(CLIP(TempPath),-1,1) = '\'
  121.         TempFile = CLIP(TempPath) & TempFile     !Assign temporary filename
  122.       ELSE
  123.         TempFile = CLIP(TempPath) & '\' & TempFile !Assign temporary filename
  124.       END
  125.       SETPATH(SavePath)                          !Return to previous path
  126.     END
  127.     ReportDevice = TempFile
  128.     GLO:FileSpec = TempFile
  129.     #ELSE                                       #!Redirect w/o View Proc
  130.   OF 'SCREEN'                                    !Screen view requested
  131.     RETURN                                       ! w/o View Procedure
  132.     #ENDIF
  133.   ELSE                                           !All other report devices
  134.     ReportDevice = GLO:FileSpec                  ! go to the device
  135.     TempFile = SUB(LEFT(UPPER(GLO:FileSpec)),1,3) !Get first three characters
  136.     IF (TempFile = 'LPT' OR TempFile = 'COM') AND NUMERIC(GLO:FileSpec[4])
  137.       IF TempFile = 'LPT' and NOT STATUS(GLO:FileSpec) !Check printer status
  138.         GLO:Message1 = 'The Printer is Off-Line!'
  139.         GLO:Message2 = 'Please correct this situation'
  140.         ShowWarning                              !Notify the user if off-line
  141.         RETURN
  142.       END
  143.       GLO:FileSpec = ''                          !Disable viewing
  144.     END
  145.     TempFile = ''
  146.   END
  147.   #ELSIF(%ViewProc)                             #!View w/o Redirect Proc
  148.   TempFile = SUB(LEFT(UPPER(%ReportDevice)),1,3) #<!Get first three characters
  149.   IF (TempFile = 'LPT' OR TempFile = 'COM') AND NUMERIC(SUB(LEFT(%ReportDevice),4,1))
  150.     IF TempFile = 'LPT' and NOT STATUS(%ReportDevice) #<!Check printer status
  151.       GLO:Message1 = 'The Printer is Off-Line!'
  152.       GLO:Message2 = 'Please correct this situation'
  153.       ShowWarning                                !Notify the user if off-line
  154.       RETURN
  155.     END
  156.     GLO:FileSpec = ''                            !Disable viewing
  157.   ELSE
  158.     GLO:FileSpec = ReportDevice                  !Set up filename for %ViewProc
  159.   END                                            ! port selections
  160.   TempFile = ''
  161.   #ELSE                                         #!No View or Redirect Proc
  162.   TempFile = SUB(LEFT(UPPER(%ReportDevice)),1,3) #<!Get first three characters
  163.   IF (TempFile = 'LPT' OR TempFile = 'COM') AND NUMERIC(SUB(LEFT(%ReportDevice),4,1))
  164.     IF TempFile = 'LPT' and NOT STATUS(%ReportDevice) #<!Check printer status
  165.       GLO:Message1 = 'The Printer is Off-Line!'
  166.       GLO:Message2 = 'Please correct this situation'
  167.       ShowWarning                                !Notify the user if off-line
  168.       RETURN
  169.     END
  170.   END                                            ! port selections
  171.   TempFile = ''
  172.   #ENDIF
  173.   #INSERT(%OpenPrimary)                         #!Open primary
  174.   #INSERT(%OpenSecondaryFiles)                  #! and all secondary files
  175.   OPEN(%Report)                                #<!Prepare to print report
  176.   #EMBED('After Report OPEN before Title page')
  177.   #IF(%ReportTitle)                             #!Print Title Page
  178.   PRINT(%ReportPre:%ReportTitle)               #<!Print Title Page
  179.     #IF(%ProgressScreen)
  180.   DISPLAY                                      #<!Display report progress
  181.     #ENDIF
  182.   #ENDIF
  183.   #IF(%ClearRecord)
  184.     #FIX(%File,%Primary)
  185.   CLEAR(%FilePre:Record)                       #<!Clear record buffer
  186.   #ENDIF
  187.   #IF(%AccessMethod = 'Record Order')           #!Determine primary file order
  188.   SET(%Primary)                                #<!Top of file, record order
  189.   #ELSIF(%SelectorAccess)
  190.     #FIX(%File,%Primary)
  191.     #FIX(%Key,%PrimaryKey)
  192.     #IF(%KeyIndex = 'INDEX')
  193.       #IF(%SharedFiles)
  194.   LOCK(%Primary,1)                             #<!Exclusive access for build
  195.   IF DiskError('Cannot Lock %Primary') THEN RETURN. #<!Check for lock error
  196.       #ENDIF
  197.   BUILD(%PrimaryKey)                           #<!Build the index first
  198.       #IF(%SharedFiles)
  199.   UNLOCK(%Primary)                             #<!Unlock locked file
  200.       #ENDIF
  201.     #ENDIF
  202.   %KeyComponent = %ScopeValue
  203.   #EMBED('Immediately before SET(key,key)')
  204.   SET(%PrimaryKey,%PrimaryKey)                 #<!Beginning of selected records
  205.   #ELSE
  206.     #FIX(%File,%Primary)
  207.     #FIX(%Key,%PrimaryKey)
  208.     #IF(%KeyIndex = 'INDEX')
  209.       #IF(%SharedFiles)
  210.   LOCK(%Primary,1)                             #<!Exclusive access for build
  211.   IF DiskError('Cannot Lock %Primary ') THEN RETURN. !Check for lock error
  212.       #ENDIF
  213.   BUILD(%PrimaryKey)                           #<!Built the index first
  214.       #IF(%SharedFiles)
  215.   UNLOCK(%Primary)                             #<!Unlock locked file
  216.       #ENDIF
  217.     #ENDIF
  218.   SET(%PrimaryKey)                             #<!Top of file, keyed order
  219.   #ENDIF
  220.   #IF(%ProgressScreen)
  221.   OPEN(Screen)
  222.   #ENDIF
  223.   #EMBED('Before primary LOOP after SET')
  224.   LOOP                                         #<!Primary file process loop
  225.     #EMBED('Top of primary LOOP')
  226.     NEXT(%Primary)                             #<!Get each %Primary record
  227.     #IF(%ReportSaveExist)
  228.       #SET(%SaveFile,%Primary)                  #!Check for footer save fields
  229.     #INSERT(%SaveFooterFields)
  230.     #ENDIF
  231.     IF ERRORCODE() THEN ErrEndFileFlag# = 1 ELSE ErrEndFileFlag# = 0. !Flag EOF
  232.     #EMBED('In primary LOOP immediately after NEXT')
  233.   #SET(%CurrentFile,%Primary)
  234.   #INSERT(%GroupBreakNumber)
  235.   #IF(%GroupCounter)
  236.     #FIX(%File,%Primary)
  237.     #SET(%CodePosition,(%FilePre&':FILTER'))
  238.     #INSERT(%RptRecordFilter)                   #!Generate record filter
  239.     #EMBED('In primary LOOP after Record Filter before Lookups')
  240.     #SET(%GetLookupFrom,%Primary)
  241.     #INSERT(%RptGetLookupRecords)               #!Get all Lookup records
  242.     #SET(%CodePosition,%Primary)                #!Class = primary file
  243.     #INSERT(%ReportFormulas)                    #!Generate formulas
  244.     #INSERT(%PrimaryFileGroupBrk)
  245.   #ELSE                                         #!No group break on this file
  246.     #IF(%SelectorAccess)                        #!If record selector
  247.     IF %KeyComponent <> %ScopeValue |          #<!Past selected records?
  248.        OR ErrEndFileFlag#                      #<!End of file? Terminate report
  249.       BREAK
  250.     END
  251.   #FIX(%File,%Primary)
  252.   #SET(%CodePosition,(%FilePre&':FILTER'))
  253.     #INSERT(%RptRecordFilter)                   #!Generate record filter
  254.     #EMBED('In primary LOOP after Record Filter before Lookups')
  255.       #SET(%GetLookupFrom,%Primary)
  256.     #INSERT(%RptGetLookupRecords)               #!Get all Lookup records
  257.       #SET(%CodePosition,%Primary)              #!Class = primary file
  258.     #INSERT(%ReportFormulas)                    #!Generate formulas
  259.     #ELSE                                       #!No record selector
  260.     IF ErrEndFileFlag# THEN BREAK.             #<!End of file? Terminate report
  261.       #FIX(%File,%Primary)
  262.       #SET(%CodePosition,(%FilePre&':FILTER'))
  263.     #INSERT(%RptRecordFilter)                   #!Generate record filter
  264.     #EMBED('In primary LOOP after Record Filter before Lookups')
  265.       #SET(%GetLookupFrom,%Primary)
  266.     #INSERT(%RptGetLookupRecords)               #!Get all Lookup records
  267.       #SET(%CodePosition,%Primary)              #!Class = primary file
  268.     #INSERT(%ReportFormulas)                    #!Generate formulas
  269.     #ENDIF
  270.   #ENDIF
  271.     #EMBED('In primary LOOP after Lookups')
  272.   #IF(%SecondaryExist)                          #!If there are secondary files
  273.     #SET(%GetRelatedTo,%Primary)
  274.     #INSERT(%RptGetRelatedRecords)
  275.   #ENDIF
  276.   #IF(%DetailPrinted <> 'PRINTED')              #!If detail print not generated
  277.     #INSERT(%PrintDetail)
  278.     #INSERT(%RptAbortKey)                       #!Insert ESC key abort loop
  279.   #ENDIF
  280.   END                                          #<!End %Primary file loop
  281.   #IF(%DetailPrinted <> 'PRINTED')              #!If detail print not generated
  282.     #IF(%ReportLabel)
  283.   IF SAV::LabelCounter <> 0                    #<!If any labels left to print
  284.       #IF(%ReportDetailPre)
  285.     %ReportDetailPre
  286.       #ENDIF
  287.     PRINT(%ReportPre:%ReportDetail)            #<!Print last line item detail
  288.       #IF(%ProgressScreen)
  289.     DISPLAY                                    #<!Display report progress
  290.       #ENDIF
  291.       #IF(%ReportDetailPost)
  292.     %ReportDetailPost
  293.       #ENDIF
  294.   END
  295.     #ENDIF
  296.   #ENDIF
  297.   #EMBED('After primary LOOP before grand totals & final page')
  298.   #IF(%ReportGrand)                             #!Print grand totals
  299.   PRINT(%ReportPre:%ReportGrand)               #<!Print grand totals
  300.     #IF(%ProgressScreen)
  301.   DISPLAY                                      #<!Display report progress
  302.     #ENDIF
  303.   #ENDIF
  304.   #IF(%ReportFinal)                             #!Print final page
  305.   PRINT(%ReportPre:%ReportFinal)               #<!Print final page
  306.     #IF(%ProgressScreen)
  307.   DISPLAY                                      #<!Display report progress
  308.     #ENDIF
  309.   #ENDIF
  310.   #SET(%ResetTotalType,'NONE')                  #!Reset report totals
  311.   #INSERT(%ResetTotals)
  312.   CLOSE(%Report)                               #<!Close report
  313.   #IF(%ProgressScreen)
  314.   CLOSE(Screen)                                #<!Close report progress screen
  315.   #ENDIF
  316.   #IF(%ViewProc)
  317.   %ViewProc                                    #<!Call View Procedure
  318.     #IF(%RedirectProc)
  319.   IF TempFile                                    !Check for temporary file
  320.     IF RemoveFile(TempFile)                      ! and delete it
  321.       GLO:Message1 = 'Could not delete temporary file'
  322.       GLO:Message2 = TempFile
  323.       ShowWarning
  324.     END
  325.   END
  326.     #ENDIF
  327.   #ENDIF
  328.   #INSERT(%CloseOpenedFiles)
  329. #EMBED('End of Procedure')
  330. #INSERT(%TotalRoutines)                         #!Total tallys and resets
  331.   #IF(%ReportSaveExist)
  332.     #SET(%TempQueue,%SaveFilesQueue)
  333. #INSERT(%SaveFooterRoutine)                     #!Footer save field saves
  334. #INSERT(%PrintFooterRoutine)                    #!Footer save field saves
  335. #INSERT(%RestoreFooterRoutine)                  #!Footer save field saves
  336.   #ENDIF
  337.  
  338. #!***************************************************************************
  339. #GROUP(%ReportDataDeclares)                     #!Internal data declarations
  340. #IF(%RedirectProc AND %ViewProc)
  341. SavePath CSTRING(65)                           #<!Temporary path save variable
  342. TempPath CSTRING(65)                           #<!Temporary directory variable
  343. #ENDIF
  344. TempFile CSTRING(65)                           #<!Temporary filename variable
  345.   #FOR(%ReportGroup)                            #!Group break fields
  346.     #IF(%ReportGroup <> %KeyComponent)          #!Group break fields
  347.       #SET(%BreakField,%ReportGroup)
  348.       #INSERT(%RptFindFile)
  349.       #FIX(%File,%FoundFile)
  350.       #FIX(%Field,%ReportGroup)
  351.       #IF(%FieldType = 'GROUP')
  352. SAV::%ReportGroup STRING(SIZE(%ReportGroup)) #<!Group break save
  353.       #ELSE
  354. SAV::%ReportGroup LIKE(%ReportGroup)           #<!Group break save
  355.       #ENDIF
  356.     #ENDIF
  357.   #ENDFOR
  358.   #SET(%Counter1,%NULL)
  359.   #FOR(%ReportTotal)                            #!AVERAGE total fields
  360.     #SET(%Counter1,(%Counter1 + 1))
  361.     #IF(%ReportTotalType = 'AVERAGE')
  362.       #IF(INSTRING('[',%ReportTotalField,1,1)) #!Check for array element
  363.         #SET(%ArrayField,(SUB(%ReportTotalField,1,INSTRING('[',%ReportTotalField,1,1)-1)))
  364. %ReportTotal::Cnt::%ArrayField::%Counter1 LONG !Average total count
  365. %ReportTotal::Sum::%ArrayField::%Counter1 REAL !Average total sum
  366.       #ELSE
  367. %ReportTotal::Cnt::%ReportTotalField LONG      #<!Average total count
  368. %ReportTotal::Sum::%ReportTotalField REAL !Average total sum
  369.       #ENDIF
  370.     #ENDIF
  371.   #ENDFOR
  372.   #IF(%ReportSaveExist)
  373.     #SET(%Counter1,%NULL)
  374.     #SET(%Counter2,%NULL)
  375.     #FOR(%ReportSave)                           #!Footer save fields
  376.       #SET(%Counter1,(%Counter1 + 1))
  377.       #FOR(%ReportSaveField)
  378.         #SET(%Counter2,(%Counter2 + 1))
  379.         #SET(%BreakField,%ReportSaveField)
  380.         #INSERT(%RptFindFile)
  381.         #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  382.           #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  383.             #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  384.             #FIX(%File,%FoundFile)
  385.             #FIX(%Field,%ArrayField)
  386.             #IF(%FieldType = 'STRING' OR %FieldType = 'CSTRING' OR %FieldType = 'PSTRING')
  387. SAV1::%ReportSave::%Field::%Counter1::%Counter2 STRING(SIZE(%ReportSaveField)),AUTO #<!%ReportSave Footer save field
  388. SAV2::%ReportSave::%Field::%Counter1::%Counter2 STRING(SIZE(%ReportSaveField)),AUTO #<!%ReportSave Footer save field
  389.             #ELSE
  390. SAV1::%ReportSave::%Field::%Counter1::%Counter2 REAL,AUTO #<!%ReportSave Footer save field
  391. SAV2::%ReportSave::%Field::%Counter1::%Counter2 REAL,AUTO #<!%ReportSave Footer save field
  392.            #ENDIF
  393.           #ELSE
  394.             #FIX(%File,%FoundFile)
  395.             #FIX(%Field,%ReportSaveField)
  396.             #IF(%FieldType = 'GROUP')
  397. SAV1::%ReportSave::%ReportSaveField STRING(SIZE(%ReportSaveField)),AUTO #<!%ReportSave Footer save field
  398. SAV2::%ReportSave::%ReportSaveField STRING(SIZE(%ReportSaveField)),AUTO #<!%ReportSave Footer save field
  399.             #ELSE
  400. SAV1::%ReportSave::%ReportSaveField LIKE(%ReportSaveField),AUTO #<!%ReportSave Footer save field
  401. SAV2::%ReportSave::%ReportSaveField LIKE(%ReportSaveField),AUTO #<!%ReportSave Footer save field
  402.             #ENDIF
  403.           #ENDIF
  404.         #ENDIF
  405.       #ENDFOR
  406.     #ENDFOR
  407.   #ENDIF
  408.   #FOR(%ReportTotal)                            #!Detect any PAGE total fields
  409.     #IF(%ReportTotalReset = 'PAGE')
  410.       #SET(%PageTotals,'YES')                   #!Set flag
  411.       #BREAK
  412.     #ELSIF(%ReportTotalTally = 'PAGE')
  413.       #SET(%PageTotals,'YES')                   #!Set flag
  414.       #BREAK
  415.     #ENDIF
  416.   #ENDFOR
  417.   #IF(%PageTotals = 'YES')
  418. SAV::LineCounter SHORT                         #<!Line counter save
  419.   #ENDIF
  420.   #IF(%SelectorAccess)                          #!Record selector save
  421.     #SET(%BreakField,%KeyComponent)
  422.     #INSERT(%RptFindFile)
  423.     #FIX(%File,%FoundFile)
  424.     #FIX(%Field,%KeyComponent)
  425.     #IF(%FieldType = 'GROUP')
  426. SAV::%KeyComponent STRING(SIZE(%KeyComponent)) #<!Record selector save
  427.     #ELSE
  428. SAV::%KeyComponent LIKE(%KeyComponent)         #<!Record selector save
  429.     #ENDIF
  430.   #ENDIF
  431.   #IF(%ReportLabel)                             #!Multi-up label USE variables
  432. SAV::LabelCounter BYTE                         #<!Multi-up label counter
  433.     #SET(%Counter1,%NULL)
  434.     #FOR(%ReportLabelField)
  435.       #SET(%Counter1,(%Counter1 + 1))
  436.       #IF(INSTRING('[',%ReportLabelField,1,1)) #!Check for array element
  437.         #SET(%ArrayField,(SUB(%ReportLabelField,1,INSTRING('[',%ReportLabelField,1,1)-1)))
  438.         #SET(%BreakField,%ReportLabelField)
  439.         #INSERT(%RptFindFile)
  440.         #FIX(%File,%FoundFile)
  441.         #FIX(%Field,%ArrayField)
  442.         #IF(%FieldType = 'STRING' OR %FieldType = 'CSTRING' OR %FieldType = 'PSTRING')
  443. LBL::%ArrayField::%Counter1 STRING(SIZE(%ReportLabelField)),DIM(%ReportLabel) #<!Multi-up label USE variables
  444.         #ELSE
  445. LBL::%ArrayField::%Counter1 REAL,DIM(%ReportLabel) #<!Multi-up label USE variables
  446.         #ENDIF
  447.       #ELSE
  448.         #SET(%BreakField,%ReportLabelField)
  449.         #INSERT(%RptFindFile)
  450.         #FIX(%File,%FoundFile)
  451.         #FIX(%Field,%ReportLabelField)
  452.         #IF(%FieldType = 'GROUP')
  453. LBL::%ReportLabelField STRING(SIZE(%ReportLabelField)),DIM(%ReportLabel) #<!Multi-up label USE variables
  454.         #ELSE
  455. LBL::%ReportLabelField LIKE(%ReportLabelField),DIM(%ReportLabel) #<!Multi-up label USE variables
  456.         #ENDIF
  457.       #ENDIF
  458.     #ENDFOR
  459.   #ENDIF
  460. #!
  461. #!***************************************************************************
  462. #GROUP(%RptGetLookupRecords)                    #!Get all lookup records
  463.   #FOR(%Secondary)                              #!%GetLookupFrom must be set
  464.     #IF(%SecondaryTo = %GetLookupFrom)          #! before #INSERT of this group
  465.       #IF(%SecondaryType = 'MANY:1')            #!Check for Lookup files
  466.         #FIX(%File,%SecondaryTo)
  467.         #FIX(%Relation,%Secondary)
  468.         #FOR(%RelationKeyField)
  469. %RelationKeyField = %RelationKeyFieldLink      #<!Assign linking field value
  470.         #ENDFOR
  471. GET(%Secondary,%RelationKey)                   #<!Lookup record
  472.         #FIX(%File,%Secondary)
  473. IF ERRORCODE() THEN CLEAR(%FilePre:Record).    #<!Clear record if unsuccessful
  474.         #IF(%ReportSaveExist)
  475.           #SET(%SaveFile,%Secondary)              #!Check for footer save fields
  476. #INSERT(%SaveFooterFields)
  477.         #ENDIF
  478.       #ENDIF
  479.     #ENDIF
  480.   #ENDFOR
  481. #!
  482. #!***************************************************************************
  483. #GROUP(%RptGetRelatedRecords)                   #!Get all related records
  484.   #FOR(%Secondary)                              #!%GetRelatedTo must be set
  485.     #IF(%SecondaryTo = %GetRelatedTo)           #! before #INSERT of this group
  486.       #IF(%SecondaryType = '1:MANY')            #!Check for children files
  487.         #FIX(%File,%SecondaryTo)
  488.         #FIX(%Relation,%Secondary)
  489.         #FOR(%RelationKeyField)
  490.           #IF(%RelationKeyFieldLink)
  491. %RelationKeyField = %RelationKeyFieldLink      #<!Assign linking field value
  492.             #SET(%RelateBreakField,%RelationKeyField)
  493.             #SET(%RelateBreakFieldLink,%RelationKeyFieldLink)
  494.           #ELSE
  495. CLEAR(%RelationKeyField)                       #<!Clear non-linking field
  496.           #ENDIF
  497.         #ENDFOR
  498. SET(%RelationKey,%RelationKey)                 #<!Set to first related record
  499. LOOP                                           #<!Loop through %Secondary
  500.   NEXT(%Secondary)                             #<! getting each record
  501.   IF ERRORCODE() THEN ErrEndFileFlag# = 1 ELSE ErrEndFileFlag# = 0. !Flag EOF
  502.         #SET(%CurrentFile,%Secondary)
  503.         #INSERT(%GroupBreakNumber)
  504.         #IF(%GroupCounter)
  505.           #FIX(%File,%Secondary)
  506.           #SET(%CodePosition,(%FilePre&':FILTER'))
  507.   #INSERT(%RptRecordFilter)
  508.           #SET(%GetLookupFrom,%Secondary)
  509.   #INSERT(%RptGetLookupRecords)                 #!Get all Lookup records
  510.           #SET(%CodePosition,%Secondary)        #!Class = primary file
  511.   #INSERT(%ReportFormulas)                      #!Generate formulas
  512.           #SET(%GetRelatedTo,%Secondary)        #!Recursive call to this group
  513.           #IF(%ReportSaveExist)
  514.             #SET(%SaveFile,%Secondary)            #!Check for footer save fields
  515.   #INSERT(%SaveFooterFields)
  516.           #ENDIF
  517.           #SET(%PassField1,%GroupField1)
  518.           #SET(%PassField2,%RelateBreakField)
  519.           #SET(%PassField3,%RelateBreakFieldLink)
  520.   #INSERT(%GroupBreakSelect)
  521.         #ELSE                                   #!No group break on this file
  522.           #IF(%ReportSaveExist)
  523.             #SET(%SaveFile,%Secondary)            #!Check for footer save fields
  524.   #INSERT(%SaveFooterFields)
  525.           #ENDIF
  526.   IF %RelateBreakField <> %RelateBreakFieldLink | #<!Past related Records?
  527.      OR ErrEndFileFlag#                        #<!  or End of file?
  528.     BREAK                                      #<!Break loop
  529.   END
  530.           #FIX(%File,%Secondary)
  531.           #SET(%CodePosition,(%FilePre&':FILTER'))
  532.   #INSERT(%RptRecordFilter)
  533.           #SET(%GetLookupFrom,%Secondary)
  534.   #INSERT(%RptGetLookupRecords)                 #!Get all Lookup records
  535.           #SET(%CodePosition,%Secondary)        #!Class = primary file
  536.   #INSERT(%ReportFormulas)                      #!Generate formulas
  537.           #SET(%GetRelatedTo,%Secondary)        #!Recursive call to this group
  538.         #ENDIF
  539.   #INSERT(%RptGetRelatedRecords)                #!  to get next level deep
  540.         #IF(%DetailPrinted <> 'PRINTED')
  541.   #INSERT(%PrintDetail)                         #!  in footer fields
  542.   #INSERT(%RptAbortKey)                         #!Insert ESC key abort loop
  543.           #SET(%DetailPrinted,'PRINTED')        #!Set detail print flag OFF
  544.         #ENDIF
  545. END                                            #<!End %Secondary Loop
  546.       #ENDIF
  547.     #ENDIF
  548.   #ENDFOR
  549. #!
  550. #!***************************************************************************
  551. #GROUP(%PrintDetail)
  552.   #IF(%ReportLabel)
  553. #INSERT(%MultiUpLabelBuild)
  554.   #ENDIF
  555.   #IF(ReportDetailPre)
  556. %ReportDetailPre
  557.   #ENDIF
  558.   #IF(%ReportDetail)
  559. PRINT(%ReportPre:%ReportDetail)                #<!Print line item detail
  560.   #ENDIF
  561.   #IF(%ProgressScreen)
  562. DISPLAY                                       #<!Display report progress
  563.   #ENDIF
  564.   #IF(%ReportDetailPost)
  565. %ReportDetailPost
  566.   #ENDIF
  567.   #IF(%PageTotals)                              #!Any page total fields?
  568. IF SAV::LineCounter > %ReportLine              #<!Page overflow?
  569.     #SET(%ResetTotalType,'PAGE')                #!Reset page totals
  570.   #INSERT(%ResetTotals)
  571.     #SET(%TallyType,'PAGE')                     #!Tally page totals
  572.   #INSERT(%TallyTotals)
  573. END
  574. SAV::LineCounter = %ReportLine                 #<!Save line counter
  575.   #ENDIF
  576.   #SET(%TallyType,'ALL')                        #!For totals on ALL
  577. #INSERT(%TallyTotals)                           #!Tally total fields
  578.   #IF(%ReportLabel)
  579. #INSERT(%MultiUpLabelReset)
  580.   #ENDIF
  581. #!
  582. #!***************************************************************************
  583. #GROUP(%TotalRoutines)                          #!Total field routines
  584.   #FOR(%ReportTotal)
  585.     #IF(%ReportTotalTally = 'PAGE')
  586.  
  587. Tally::PAGE::Totals  ROUTINE                   #<!Tallys on page break
  588.       #SET(%TallyType,'PAGE')
  589.   #INSERT(%DoTallyTotals)
  590.       #BREAK
  591.     #ENDIF
  592.   #ENDFOR
  593.   #FOR(%ReportTotal)
  594.     #IF(%ReportTotalTally = 'ALL')
  595.  
  596. Tally::ALL::Totals ROUTINE                     #<!Tallys on body detail
  597.       #SET(%TallyType,'ALL')
  598.   #INSERT(%DoTallyTotals)
  599.       #BREAK
  600.     #ENDIF
  601.   #ENDFOR
  602.   #FOR(%ReportGroup)
  603.     #FOR(%ReportTotal)
  604.       #IF(%ReportTotalTally = %ReportGroup)
  605.  
  606. Tally::%ReportTotalTally::Totals ROUTINE       #<!Tallys on group break
  607.         #SET(%TallyType,%ReportTotalTally)
  608.   #INSERT(%DoTallyTotals)
  609.         #BREAK
  610.       #ENDIF
  611.     #ENDFOR
  612.   #ENDFOR
  613.   #FOR(%ReportTotal)
  614.     #IF(%ReportTotalReset = 'PAGE')
  615.  
  616. Reset::PAGE::Totals ROUTINE                    #<!Resets on page break
  617.      #SET(%ResetTotalType,'PAGE')
  618.   #INSERT(%DoResetTotals)
  619.       #BREAK
  620.     #ENDIF
  621.   #ENDFOR
  622.   #FOR(%ReportTotal)
  623.     #IF(%ReportTotalReset = 'NONE')
  624.  
  625. Reset::NONE::Totals ROUTINE                    #<!Resets on report close
  626.      #SET(%ResetTotalType,'NONE')
  627.   #INSERT(%DoResetTotals)
  628.       #BREAK
  629.     #ENDIF
  630.   #ENDFOR
  631.   #FOR(%ReportGroup)
  632.     #FOR(%ReportTotal)
  633.       #IF(%ReportTotalReset = %ReportGroup)
  634.  
  635. Reset::%ReportTotalReset::Totals ROUTINE       #<!Resets on group break
  636.      #SET(%ResetTotalType,%ReportTotalReset)
  637.   #INSERT(%DoResetTotals)
  638.         #BREAK
  639.       #ENDIF
  640.     #ENDFOR
  641.   #ENDFOR
  642. #!
  643. #!***************************************************************************
  644. #GROUP(%DoTallyTotals)                          #!Tally total fields
  645.   #SET(%Counter1,%NULL)                         #!%TallyType must be set
  646.   #FOR(%ReportTotal)                            #! before #INSERT this group
  647.     #SET(%Counter1,(%Counter1 + 1))
  648.     #IF(%ReportTotalTally = %TallyType)
  649.       #IF(%ReportTotalType = 'SUM')
  650. %ReportPre:%ReportTotal += %ReportTotalField   #<!SUM total of %ReportTotalField
  651.       #ELSIF(%ReportTotalType = 'COUNT')
  652. %ReportPre:%ReportTotal += 1                   #<!COUNT total of %ReportTotalField
  653.       #ELSIF(%ReportTotalType = 'HIGH')
  654. IF %ReportTotalField > %ReportPre:%ReportTotal #<!HIGH value of %ReportTotalField
  655.   %ReportPre:%ReportTotal = %ReportTotalField
  656. END
  657.       #ELSIF(%ReportTotalType = 'LOW')
  658. IF %ReportTotalField < %ReportPre:%ReportTotal #<!LOW value of %ReportTotalField
  659.   %ReportPre:%ReportTotal = %ReportTotalField
  660. END
  661.       #ELSIF(%ReportTotalType = 'AVERAGE')
  662.         #IF(INSTRING('[',%ReportTotalField,1,1)) #!Check for array element
  663.           #SET(%ArrayField,(SUB(%ReportTotalField,1,INSTRING('[',%ReportTotalField,1,1)-1)))
  664. %ReportTotal::Cnt::%ArrayField::%Counter1 += 1 !AVERAGE of %ReportTotalField
  665. %ReportTotal::Sum::%ArrayField::%Counter1 += %ReportTotalField
  666. %ReportPre:%ReportTotal = %ReportTotal::Sum::%ArrayField::%Counter1 / %ReportTotal::Cnt::%ArrayField::%Counter1
  667.         #ELSE
  668. %ReportTotal::Cnt::%ReportTotalField += 1      #<!AVERAGE of %ReportTotalField
  669. %ReportTotal::Sum::%ReportTotalField += %ReportTotalField
  670. %ReportPre:%ReportTotal = %ReportTotal::Sum::%ReportTotalField / %ReportTotal::Cnt::%ReportTotalField
  671.         #ENDIF
  672.       #ENDIF
  673.     #ENDIF
  674.   #ENDFOR
  675. #!
  676. #!***************************************************************************
  677. #GROUP(%DoResetTotals)                          #!Reset total fields
  678.   #SET(%Counter1,%NULL)                         #!%ResetTotalType must be set
  679.   #FOR(%ReportTotal)                            #! before #INSERT this group
  680.     #SET(%Counter1,(%Counter1 + 1))
  681.     #IF(%ReportTotalReset = %ResetTotalType)
  682. %ReportPre:%ReportTotal = 0
  683.       #IF(%ReportTotalType = 'AVERAGE')
  684.         #IF(INSTRING('[',%ReportTotalField,1,1)) #!Check for array element
  685.           #SET(%ArrayField,(SUB(%ReportTotalField,1,INSTRING('[',%ReportTotalField,1,1)-1)))
  686. %ReportTotal::Cnt::%ArrayField::%Counter1 = 0
  687. %ReportTotal::Sum::%ArrayField::%Counter1 = 0
  688.         #ELSE
  689. %ReportTotal::Cnt::%ReportTotalField = 0
  690. %ReportTotal::Sum::%ReportTotalField = 0
  691.         #ENDIF
  692.       #ENDIF
  693.     #ENDIF
  694.   #ENDFOR
  695. #!
  696. #!***************************************************************************
  697. #GROUP(%TallyTotals)                            #!Tally total fields
  698.   #FOR(%ReportTotal)                            #!%TallyType must be set
  699.     #IF(%ReportTotalTally = %TallyType)         #! before #INSERT this group
  700. DO Tally::%TallyType::Totals                   #<!Tally %TallyType totals
  701.       #BREAK
  702.     #ENDIF
  703.   #ENDFOR
  704. #!
  705. #!***************************************************************************
  706. #GROUP(%ResetTotals)                            #!Reset total fields
  707.   #FOR(%ReportTotal)                            #!%ResetTotalType must be set
  708.     #IF(%ReportTotalReset = %ResetTotalType)    #! before #INSERT this group
  709. DO Reset::%ResetTotalType::Totals              #<!Reset %ResetTotalType totals
  710.       #BREAK
  711.     #ENDIF
  712.   #ENDFOR
  713. #!
  714. #!***************************************************************************
  715. #GROUP(%SaveFooterFields)                       #!Call footer save routines
  716.   #FOR(%ReportSave)                             #!%SaveFile must be set
  717.     #FOR(%ReportSaveField)                      #! before #INSERT this group
  718.       #SET(%BreakField,%ReportSaveField)
  719.       #INSERT(%RptFindFile)
  720.       #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  721.         #IF(%FoundFile = %SaveFile)             #!Check for save file
  722. DO Save::%SaveFile::FooterFields               #<!Save %SaveFile footer fields
  723.           #SET(%Done,'YES')
  724.           #BREAK
  725.         #ELSE
  726.           #SET(%Done,%NULL)
  727.         #ENDIF
  728.       #ENDIF
  729.     #ENDFOR
  730.     #IF(%Done = 'YES')
  731.       #BREAK
  732.     #ENDIF
  733.   #ENDFOR
  734. #!
  735. #!***************************************************************************
  736. #GROUP(%SaveFooterRoutine)                      #!Rotate footer save fields
  737.   #SET(%Temp,(SUB(%TempQueue,1,INSTRING(',',%TempQueue,1,1)-1)))
  738.   #SET(%TempQueue,(SUB(%TempQueue,LEN(%Temp)+2,LEN(%TempQueue)-LEN(%Temp)+1)))
  739.   #IF(%Temp)
  740.     #FOR(%ReportSave)
  741.       #IF(%ReportSave <> 'PAGE')
  742.         #FOR(%ReportSaveField)
  743.           #SET(%BreakField,%ReportSaveField)
  744.           #INSERT(%RptFindFile)
  745.           #IF(%Temp = %FoundFile)
  746.  
  747. Save::%FoundFile::FooterFields ROUTINE         #<!Save footer fields
  748.             #SET(%SaveFile,%FoundFile)
  749.   #INSERT(%SaveFooterAssigns)
  750.             #SET(%GetAssigns,'YES')
  751.             #BREAK
  752.           #ELSE
  753.             #SET(%GetAssigns,%NULL)
  754.           #ENDIF
  755.         #ENDFOR
  756.       #ENDIF
  757.       #IF(%GetAssigns)
  758.         #BREAK
  759.       #ENDIF
  760.     #ENDFOR
  761. #INSERT(%SaveFooterRoutine)
  762.   #ENDIF
  763. #!
  764. #!***************************************************************************
  765. #GROUP(%SaveFooterAssigns)                      #!Rotate footer save fields
  766.   #SET(%Counter1,%NULL)
  767.   #SET(%Counter2,%NULL)
  768.   #FOR(%ReportSave)                             #!%SaveFile must be set
  769.     #SET(%Counter1,(%Counter1 + 1))
  770.     #FOR(%ReportSaveField)                      #! before #INSERT this group
  771.       #IF(%ReportSaveField <> %ReportPage)
  772.         #SET(%Counter2,(%Counter2 + 1))
  773.         #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  774.           #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  775.         #ELSE
  776.           #SET(%ArrayField,%NULL)               #!Clear array flag
  777.         #ENDIF
  778.         #SET(%BreakField,%ReportSaveField)
  779.         #INSERT(%RptFindFile)
  780.         #IF(%FoundFile = %SaveFile)             #!Check for save file
  781.           #IF(%ArrayField)                      #!Check for array element
  782. SAV2::%ReportSave::%ArrayField::%Counter1::%Counter2 = SAV1::%ReportSave::%ArrayField::%Counter1::%Counter2
  783. SAV1::%ReportSave::%ArrayField::%Counter1::%Counter2 = %ReportSaveField
  784.           #ELSE
  785. SAV2::%ReportSave::%ReportSaveField = SAV1::%ReportSave::%ReportSaveField
  786. SAV1::%ReportSave::%ReportSaveField = %ReportSaveField
  787.           #ENDIF
  788.         #ENDIF
  789.       #ENDIF
  790.     #ENDFOR
  791.   #ENDFOR
  792. #!
  793. #!***************************************************************************
  794. #GROUP(%PrintFooterFields)                      #!Set footer to print correct
  795.   #FOR(%ReportSave)                             #! before #INSERT this group
  796.     #IF(%ReportSave = %WhichFooter)             #!Check for save file
  797.       #SET(%BreakField,%ReportSave)
  798.       #INSERT(%RptFindFile)
  799.       #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  800. DO Print::%ReportSave::FooterFields            #<!Print correct footer fields
  801.         #BREAK
  802.       #ENDIF
  803.     #ENDIF
  804.   #ENDFOR
  805. #!
  806. #!***************************************************************************
  807. #GROUP(%PrintFooterRoutine)                     #!Set footer to print correct
  808.   #SET(%Counter1,%NULL)                         #!  footer field values
  809.   #SET(%Counter2,%NULL)
  810.   #FOR(%ReportSave)                             #! before #INSERT this group
  811.     #SET(%BreakField,%ReportSave)
  812.     #INSERT(%RptFindFile)
  813.     #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  814.  
  815. Print::%ReportSave::FooterFields ROUTINE       #<!Print correct footer fields
  816.       #SET(%Counter1,(%Counter1 + 1))
  817.       #FOR(%ReportSaveField)                    #! before #INSERT this group
  818.         #SET(%Counter2,(%Counter2 + 1))
  819.         #SET(%BreakField,%ReportSaveField)
  820.         #INSERT(%RptFindFile)
  821.         #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  822.           #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  823.             #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  824.   %ReportSaveField = SAV2::%ReportSave::%ArrayField::%Counter1::%Counter2
  825.           #ELSE
  826.   %ReportSaveField = SAV2::%ReportSave::%ReportSaveField
  827.           #ENDIF
  828.         #ENDIF
  829.       #ENDFOR
  830.     #ENDIF
  831.   #ENDFOR
  832. #!
  833. #!***************************************************************************
  834. #GROUP(%RestoreFooterFields)                    #!Restore changed footer
  835.   #FOR(%ReportSave)                             #! before #INSERT this group
  836.     #IF(%ReportSave = %WhichFooter)             #!Check for save file
  837.       #SET(%BreakField,%ReportSave)
  838.       #INSERT(%RptFindFile)
  839.       #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  840. DO Restore::%ReportSave::FooterFields          #<!Restore current footer fields
  841.       #BREAK
  842.       #ENDIF
  843.     #ENDIF
  844.   #ENDFOR
  845. #!
  846. #!***************************************************************************
  847. #GROUP(%RestoreFooterRoutine)                   #!Restore changed footer
  848.   #SET(%Counter1,%NULL)                         #!  footer field values
  849.   #SET(%Counter2,%NULL)
  850.   #FOR(%ReportSave)                             #! before #INSERT this group
  851.     #SET(%BreakField,%ReportSave)
  852.     #INSERT(%RptFindFile)
  853.     #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  854.  
  855. Restore::%ReportSave::FooterFields ROUTINE     #<!Restore current footer fields
  856.       #SET(%Counter1,(%Counter1 + 1))
  857.       #FOR(%ReportSaveField)                    #! before #INSERT this group
  858.         #SET(%Counter2,(%Counter2 + 1))
  859.         #SET(%BreakField,%ReportSaveField)
  860.         #INSERT(%RptFindFile)
  861.         #IF(INSTRING(%FoundFile,%SaveFilesQueue,1,1))
  862.           #IF(INSTRING('[',%ReportSaveField,1,1)) #!Check for array element
  863.             #SET(%ArrayField,(SUB(%ReportSaveField,1,INSTRING('[',%ReportSaveField,1,1)-1)))
  864.   %ReportSaveField = SAV1::%ReportSave::%ArrayField::%Counter1::%Counter2
  865.           #ELSE
  866.   %ReportSaveField = SAV1::%ReportSave::%ReportSaveField
  867.           #ENDIF
  868.         #ENDIF
  869.       #ENDFOR
  870.     #ENDIF
  871.   #ENDFOR
  872. #!
  873. #!***************************************************************************
  874. #GROUP(%ReportFormulas)                         #!Generate formula field code
  875.   #FOR(%Formula)                                #!%CodePosition must be set
  876.                                                 #! before #INSERT this group
  877.     #IF((UPPER(LEFT(%FormulaClass)) = UPPER(%CodePosition) OR %FormulaClass = %NULL) AND %FormulaType = 'COMPUTED')
  878. %Formula = %FormulaComputation                 #<!%FormulaDescription
  879.     #ENDIF
  880.   #ENDFOR
  881.   #FOR(%Formula)                                #!All computed fields before
  882.     #IF((UPPER(LEFT(%FormulaClass)) = UPPER(%CodePosition) OR %FormulaClass = %NULL) AND %FormulaType = 'CONDITION')
  883. IF %FormulaCondition                           #<!%FormulaDescription
  884.   %Formula = %FormulaTrue
  885. ELSE
  886.   %Formula = %FormulaFalse
  887. END
  888.     #ENDIF
  889.   #ENDFOR
  890. #!
  891. #!***************************************************************************
  892. #GROUP(%RptRecordFilter)                        #!Generate record filter code
  893.   #FOR(%Formula)                                #!%CodePosition must be set
  894.                                                 #! and must contain the file
  895.                                                 #! prefix followed by :FILTER
  896.     #IF(UPPER(LEFT(%FormulaClass)) = UPPER(%CodePosition))
  897.       #IF(%FormulaType = 'COMPUTED')
  898. IF NOT (%FormulaComputation)  |                #<!%FormulaDescription
  899.   AND NOT ErrEndFileFlag#                      #<!End of file?
  900.     CYCLE                                      #<!%File record filter
  901. END
  902.       #ELSE
  903. IF NOT (%FormulaCondition) |                   #<!%FormulaDescription
  904.   AND NOT ErrEndFileFlag#                      #<!End of file?
  905.     CYCLE                                      #<!%File record filter
  906. END
  907.       #ENDIF
  908.     #ENDIF
  909.   #ENDFOR
  910. #!
  911. #!***************************************************************************
  912. #GROUP(%GroupBreakNumber)
  913.   #SET(%GroupCounter,%NULL)
  914.   #SET(%GroupField1,%NULL)
  915.   #SET(%GroupField2,%NULL)
  916.   #SET(%GroupField3,%NULL)
  917.   #SET(%GroupField4,%NULL)
  918.   #FOR(%ReportGroup)
  919.     #SET(%BreakField,%ReportGroup)
  920.     #INSERT(%RptFindFile)
  921.     #IF(%FoundFile = %CurrentFile)              #!Check breaks on current file
  922.       #SET(%GroupCounter,(%GroupCounter + 1))
  923.       #IF(%GroupCounter = 1)
  924.         #SET(%GroupField1,%BreakField)
  925.       #ELSIF(%GroupCounter = 2)
  926.         #SET(%GroupField2,%BreakField)
  927.       #ELSIF(%GroupCounter = 3)
  928.         #SET(%GroupField3,%BreakField)
  929.       #ELSIF(%GroupCounter = 4)
  930.         #SET(%GroupField4,%BreakField)
  931.       #ELSIF(%GroupCounter > 4)
  932.         #SET(%ErrorMessage,(%Procedure & ' ERROR:'))
  933.         #ERROR(%ErrorMessage)
  934.         #SET(%ErrorMessage,('  ' & %FoundFile & ' --Too many Group Breaks - 4/file Maximum'))
  935.         #ERROR(%ErrorMessage)
  936.       #ENDIF
  937.     #ENDIF
  938.   #ENDFOR
  939. #!
  940. #!***************************************************************************
  941. #GROUP(%PrimaryFileGroupBrk)
  942. #IF(%SelectorAccess)                          #!If record selector
  943.   #SET(%PassField1,%GroupField1)
  944.   #SET(%PassField2,%KeyComponent)
  945.   #SET(%PassField3,%ScopeValue)
  946. #INSERT(%GroupBreakSelect)
  947. #ELSE                                       #!No record selector
  948. IF NOT SAV::%GroupField1 AND NOT ErrEndFileFlag#      #<!Print first group header
  949.   #FIX(%ReportGroup,%GroupField1)
  950.   #INSERT(%GroupBreakHeader)                #!Print group header
  951.   #IF(%GroupField2)
  952.     #FIX(%ReportGroup,%GroupField2)
  953.   #INSERT(%GroupBreakHeader)                #!Print group header
  954.   #ENDIF
  955.   #IF(%GroupField3)
  956.     #FIX(%ReportGroup,%GroupField3)
  957.   #INSERT(%GroupBreakHeader)                #!Print  group header
  958.   #ENDIF
  959.   #IF(%GroupField4)
  960.     #FIX(%ReportGroup,%GroupField4)
  961.   #INSERT(%GroupBreakHeader)                #!Print group header
  962.   #ENDIF
  963. ELSIF SAV::%GroupField1 AND ErrEndFileFlag# #<!Print last group footer
  964.   #IF(%GroupField4)
  965.     #FIX(%ReportGroup,%GroupField4)
  966.   #INSERT(%GroupBreakFooter)                #!Print last group footer
  967.   #ENDIF
  968.   #IF(%GroupField3)
  969.     #FIX(%ReportGroup,%GroupField3)
  970.   #INSERT(%GroupBreakFooter)                #!Print last group footer
  971.   #ENDIF
  972.   #IF(%GroupField2)
  973.     #FIX(%ReportGroup,%GroupField2)
  974.   #INSERT(%GroupBreakFooter)                #!Print last group footer
  975.   #ENDIF
  976.   #IF(%GroupField1)
  977.     #FIX(%ReportGroup,%GroupField1)
  978.   #INSERT(%GroupBreakFooter)                #!Print last group footer
  979.   #ENDIF
  980.   BREAK
  981. ELSIF ErrEndFileFlag#                      #<!Print nothing - no records
  982.   BREAK
  983. END
  984. IF %GroupField1 <> SAV::%GroupField1       #<!Normal group break?
  985.   #IF(%GroupField4)
  986.     #FIX(%ReportGroup,%GroupField4)
  987.   #INSERT(%GroupBreakFooter)                #!Print group footer
  988.   #ENDIF
  989.   #IF(%GroupField3)
  990.     #FIX(%ReportGroup,%GroupField3)
  991.   #INSERT(%GroupBreakFooter)                #!Print group footer
  992.   #ENDIF
  993.   #IF(%GroupField2)
  994.     #FIX(%ReportGroup,%GroupField2)
  995.   #INSERT(%GroupBreakFooter)                #!Print group footer
  996.   #ENDIF
  997.     #FIX(%ReportGroup,%GroupField1)
  998.   #INSERT(%GroupBreakFooter)                #!Print group footer
  999.     #FIX(%ReportGroup,%GroupField1)
  1000.   #INSERT(%GroupBreakHeader)                #!Print group header
  1001.   #IF(%GroupField2)
  1002.     #FIX(%ReportGroup,%GroupField2)
  1003.   #INSERT(%GroupBreakHeader)                #!Print group header
  1004.   #ENDIF
  1005.   #IF(%GroupField3)
  1006.     #FIX(%ReportGroup,%GroupField3)
  1007.   #INSERT(%GroupBreakHeader)                #!Print group header
  1008.   #ENDIF
  1009.   #IF(%GroupField4)
  1010.     #FIX(%ReportGroup,%GroupField4)
  1011.   #INSERT(%GroupBreakHeader)                #!Print group header
  1012.   #ENDIF
  1013.   #IF(%GroupField2)
  1014. ELSIF %GroupField2 <> SAV::%GroupField2    #<!Normal group break?
  1015.     #IF(%GroupField4)
  1016.       #FIX(%ReportGroup,%GroupField4)
  1017.   #INSERT(%GroupBreakFooter)                #!Print group footer
  1018.       #ENDIF
  1019.     #IF(%GroupField3)
  1020.       #FIX(%ReportGroup,%GroupField3)
  1021.   #INSERT(%GroupBreakFooter)                #!Print group footer
  1022.     #ENDIF
  1023.     #FIX(%ReportGroup,%GroupField2)
  1024.   #INSERT(%GroupBreakFooter)                #!Print group footer
  1025.     #FIX(%ReportGroup,%GroupField2)
  1026.   #INSERT(%GroupBreakHeader)                #!Print group header
  1027.     #IF(%GroupField3)
  1028.       #FIX(%ReportGroup,%GroupField3)
  1029.   #INSERT(%GroupBreakHeader)                #!Print group header
  1030.     #ENDIF
  1031.     #IF(%GroupField4)
  1032.       #FIX(%ReportGroup,%GroupField4)
  1033.   #INSERT(%GroupBreakHeader)                #!Print group header
  1034.     #ENDIF
  1035.   #ENDIF
  1036.   #IF(%GroupField3)
  1037. ELSIF %GroupField3 <> SAV::%GroupField3    #<!Normal group break?
  1038.     #IF(%GroupField4)
  1039.       #FIX(%ReportGroup,%GroupField4)
  1040.   #INSERT(%GroupBreakFooter)                #!Print group footer
  1041.       #ENDIF
  1042.     #FIX(%ReportGroup,%GroupField3)
  1043.   #INSERT(%GroupBreakFooter)                #!Print group footer
  1044.     #FIX(%ReportGroup,%GroupField3)
  1045.   #INSERT(%GroupBreakHeader)                #!Print group header
  1046.     #IF(%GroupField4)
  1047.       #FIX(%ReportGroup,%GroupField4)
  1048.   #INSERT(%GroupBreakHeader)                #!Print group header
  1049.     #ENDIF
  1050.   #ENDIF
  1051.   #IF(%GroupField4)
  1052. ELSIF %GroupField4 <> SAV::%GroupField4    #<!Normal group break?
  1053.     #FIX(%ReportGroup,%GroupField4)
  1054.   #INSERT(%GroupBreakFooter)                #!Print group footer
  1055.     #FIX(%ReportGroup,%GroupField4)
  1056.   #INSERT(%GroupBreakHeader)                #!Print group header
  1057.   #ENDIF
  1058. END
  1059. #ENDIF
  1060. #!
  1061. #!***************************************************************************
  1062. #GROUP(%GroupBreakSelect)
  1063.   #IF(%PassField1 = %PassField2)                #!1st Break field & link field same
  1064. IF %PassField2 <> %PassField3       |          #<!Group Break?
  1065.     OR ErrEndFileFlag#                         #<! or end of file?
  1066.   IF SAV::%PassField1                          #<!Print group footer
  1067.     #IF(%ReportLabel)
  1068.     IF SAV::LabelCounter <> 0                  #<!If any labels left to print
  1069.       #IF(%ReportDetailPre)
  1070.       %ReportDetailPre
  1071.       #ENDIF
  1072.       PRINT(%ReportPre:%ReportDetail)          #<!Print last line item detail
  1073.       #IF(%ProgressScreen)
  1074.       DISPLAY                                  #<!Display report progress
  1075.       #ENDIF
  1076.       #IF(%ReportDetailPost)
  1077.       %ReportDetailPost
  1078.       #ENDIF
  1079.       #INSERT(%MultiUpLabelReset)
  1080.     END
  1081.     #ENDIF
  1082.     #IF(%GroupField4)
  1083.       #FIX(%ReportGroup,%GroupField4)
  1084.     #INSERT(%GroupBreakFooter)                #!Print last group footer
  1085.     CLEAR(SAV::%GroupField4)                   #<!Clear group print flag
  1086.     #ENDIF
  1087.     #IF(%GroupField3)
  1088.       #FIX(%ReportGroup,%GroupField3)
  1089.     #INSERT(%GroupBreakFooter)                #!Print last group footer
  1090.     CLEAR(SAV::%GroupField3)                   #<!Clear group print flag
  1091.     #ENDIF
  1092.     #IF(%GroupField2)
  1093.       #FIX(%ReportGroup,%GroupField2)
  1094.     #INSERT(%GroupBreakFooter)                #!Print last group footer
  1095.     CLEAR(SAV::%GroupField2)                   #<!Clear group print flag
  1096.     #ENDIF
  1097.     #IF(%GroupField1)
  1098.       #FIX(%ReportGroup,%GroupField1)
  1099.     #INSERT(%GroupBreakFooter)                #!Print last group footer
  1100.     CLEAR(SAV::%GroupField1)                   #<!Clear group print flag
  1101.     #ENDIF
  1102.     BREAK                                      #<!Terminate report processing
  1103.   ELSE                                         #<!Print group header
  1104.     BREAK
  1105.   END
  1106. END
  1107. IF NOT SAV::%PassField1                        #<!Print first group header
  1108.     #IF(%GroupField1)
  1109.       #FIX(%ReportGroup,%GroupField1)
  1110.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1111.     #ENDIF
  1112.     #IF(%GroupField2)
  1113.       #FIX(%ReportGroup,%GroupField2)
  1114.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1115.     #ENDIF
  1116.     #IF(%GroupField3)
  1117.       #FIX(%ReportGroup,%GroupField3)
  1118.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1119.     #ENDIF
  1120.     #IF(%GroupField4)
  1121.       #FIX(%ReportGroup,%GroupField4)
  1122.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1123.     #ENDIF
  1124. END
  1125.     #IF(%GroupField2)
  1126. IF %GroupField2 <> SAV::%GroupField2           #<!Normal group break?
  1127.         #IF(%GroupField4)
  1128.           #FIX(%ReportGroup,%GroupField4)
  1129.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1130.         #ENDIF
  1131.         #IF(%GroupField3)
  1132.           #FIX(%ReportGroup,%GroupField3)
  1133.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1134.         #ENDIF
  1135.         #FIX(%ReportGroup,%GroupField2)
  1136.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1137.         #FIX(%ReportGroup,%GroupField2)
  1138.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1139.         #IF(%GroupField3)
  1140.           #FIX(%ReportGroup,%GroupField3)
  1141.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1142.         #ENDIF
  1143.         #IF(%GroupField4)
  1144.           #FIX(%ReportGroup,%GroupField4)
  1145.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1146.         #ENDIF
  1147.       #IF(%GroupField3)
  1148. ELSIF %GroupField3 <> SAV::%GroupField3        #<!Normal group break?
  1149.         #IF(%GroupField4)
  1150.           #FIX(%ReportGroup,%GroupField4)
  1151.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1152.         #ENDIF
  1153.         #FIX(%ReportGroup,%GroupField3)
  1154.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1155.         #FIX(%ReportGroup,%GroupField3)
  1156.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1157.         #IF(%GroupField4)
  1158.           #FIX(%ReportGroup,%GroupField4)
  1159.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1160.         #ENDIF
  1161.       #ENDIF
  1162.       #IF(%GroupField4)
  1163. ELSIF %GroupField4 <> SAV::%GroupField4        #<!Normal group break?
  1164.         #FIX(%ReportGroup,%GroupField4)
  1165.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1166.         #FIX(%ReportGroup,%GroupField4)
  1167.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1168.       #ENDIF
  1169. END
  1170.     #ENDIF
  1171.   #ELSE                                         #!Break & link field not same
  1172. IF %PassField2 <> %PassField3 |                #<!End of related records?
  1173.     OR ErrEndFileFlag#                         #<! or end of file?
  1174.   IF SAV::%PassField1                          #<!Print last group footer
  1175.     #IF(%ReportLabel)
  1176.     IF SAV::LabelCounter <> 0                  #<!If any labels left to print
  1177.       #IF(%ReportDetailPre)
  1178.       %ReportDetailPre
  1179.       #ENDIF
  1180.       PRINT(%ReportPre:%ReportDetail)          #<!Print last line item detail
  1181.       #IF(%ProgressScreen)
  1182.       DISPLAY                                  #<!Display report progress
  1183.       #ENDIF
  1184.       #IF(%ReportDetailPost)
  1185.       %ReportDetailPost
  1186.       #ENDIF
  1187.       #INSERT(%MultiUpLabelReset)
  1188.     END
  1189.     #ENDIF
  1190.     #IF(%GroupField4)
  1191.       #FIX(%ReportGroup,%GroupField4)
  1192.       #INSERT(%GroupBreakFooter)                #!Print last group footer
  1193.     CLEAR(SAV::%GroupField4)                   #<!Clear group print flag
  1194.     #ENDIF
  1195.     #IF(%GroupField3)
  1196.       #FIX(%ReportGroup,%GroupField3)
  1197.       #INSERT(%GroupBreakFooter)                #!Print last group footer
  1198.     CLEAR(SAV::%GroupField3)                   #<!Clear group print flag
  1199.     #ENDIF
  1200.     #IF(%GroupField2)
  1201.       #FIX(%ReportGroup,%GroupField2)
  1202.       #INSERT(%GroupBreakFooter)                #!Print last group footer
  1203.     CLEAR(SAV::%GroupField2)                   #<!Clear group print flag
  1204.     #ENDIF
  1205.     #IF(%GroupField1)
  1206.       #FIX(%ReportGroup,%GroupField1)
  1207.       #INSERT(%GroupBreakFooter)                #!Print last group footer
  1208.     CLEAR(SAV::%GroupField1)                   #<!Clear group print flag
  1209.     #ENDIF
  1210.   END
  1211.   BREAK                                        #<!Terminate loop
  1212. END
  1213. IF NOT SAV::%PassField1                        #<!Print first group header
  1214.     #IF(%GroupField1)
  1215.       #FIX(%ReportGroup,%GroupField1)
  1216.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1217.     #ENDIF
  1218.     #IF(%GroupField2)
  1219.       #FIX(%ReportGroup,%GroupField2)
  1220.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1221.     #ENDIF
  1222.     #IF(%GroupField3)
  1223.       #FIX(%ReportGroup,%GroupField3)
  1224.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1225.     #ENDIF
  1226.     #IF(%GroupField4)
  1227.       #FIX(%ReportGroup,%GroupField4)
  1228.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1229.     #ENDIF
  1230. END
  1231.     #IF(%GroupField1)
  1232. IF %GroupField1 <> SAV::%GroupField1           #<!Normal group break?
  1233.       #IF(%GroupField4)
  1234.         #FIX(%ReportGroup,%GroupField4)
  1235.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1236.       #ENDIF
  1237.       #IF(%GroupField3)
  1238.         #FIX(%ReportGroup,%GroupField3)
  1239.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1240.       #ENDIF
  1241.       #IF(%GroupField2)
  1242.         #FIX(%ReportGroup,%GroupField2)
  1243.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1244.       #ENDIF
  1245.       #FIX(%ReportGroup,%GroupField1)
  1246.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1247.       #FIX(%ReportGroup,%GroupField1)
  1248.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1249.       #IF(%GroupField2)
  1250.         #FIX(%ReportGroup,%GroupField2)
  1251.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1252.       #ENDIF
  1253.       #IF(%GroupField3)
  1254.         #FIX(%ReportGroup,%GroupField3)
  1255.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1256.       #ENDIF
  1257.       #IF(%GroupField4)
  1258.         #FIX(%ReportGroup,%GroupField4)
  1259.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1260.       #ENDIF
  1261.       #IF(%GroupField2)
  1262. ELSIF %GroupField2 <> SAV::%GroupField2        #<!Normal group break?
  1263.         #IF(%GroupField4)
  1264.           #FIX(%ReportGroup,%GroupField4)
  1265.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1266.         #ENDIF
  1267.         #IF(%GroupField3)
  1268.           #FIX(%ReportGroup,%GroupField3)
  1269.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1270.         #ENDIF
  1271.         #FIX(%ReportGroup,%GroupField2)
  1272.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1273.         #FIX(%ReportGroup,%GroupField2)
  1274.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1275.         #IF(%GroupField3)
  1276.           #FIX(%ReportGroup,%GroupField3)
  1277.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1278.         #ENDIF
  1279.         #IF(%GroupField4)
  1280.           #FIX(%ReportGroup,%GroupField4)
  1281.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1282.         #ENDIF
  1283.       #ENDIF
  1284.       #IF(%GroupField3)
  1285. ELSIF %GroupField3 <> SAV::%GroupField3        #<!Normal group break?
  1286.         #IF(%GroupField4)
  1287.           #FIX(%ReportGroup,%GroupField4)
  1288.   #INSERT(%GroupBreakFooter)                  #!Print last group footer
  1289.         #ENDIF
  1290.         #FIX(%ReportGroup,%GroupField3)
  1291.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1292.         #FIX(%ReportGroup,%GroupField3)
  1293.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1294.         #IF(%GroupField4)
  1295.           #FIX(%ReportGroup,%GroupField4)
  1296.   #INSERT(%GroupBreakHeader)                    #!Print first group header
  1297.         #ENDIF
  1298.       #ENDIF
  1299.       #IF(%GroupField4)
  1300. ELSIF %GroupField4 <> SAV::%GroupField4        #<!Normal group break?
  1301.         #FIX(%ReportGroup,%GroupField4)
  1302.   #INSERT(%GroupBreakFooter)                    #!Print group footer
  1303.         #FIX(%ReportGroup,%GroupField4)
  1304.   #INSERT(%GroupBreakHeader)                    #!Print group header
  1305.       #ENDIF
  1306. END
  1307.     #ENDIF
  1308.   #ENDIF
  1309. #!
  1310. #!***************************************************************************
  1311. #GROUP(%GroupBreakFooter)                       #!Print group footers
  1312.   #SET(%ThisReportGroup,%ReportGroup)           #!Save work Group
  1313.   #IF(%ReportSaveExist)
  1314.     #SET(%WhichFooter,%ThisReportGroup)         #!Ensure footer fields contain
  1315. #INSERT(%PrintFooterFields)                     #! correct values to print
  1316.   #ENDIF
  1317.   #FIX(%ReportGroup,%ThisReportGroup)           #!Fix to saved work Group
  1318.   #SET(%CodePosition,%ThisReportGroup)          #!Class = group break field
  1319. #INSERT(%ReportFormulas)                        #!Generate formulas
  1320.   #FIX(%ReportGroup,%ThisReportGroup)           #!Fix to saved work Group
  1321.    #IF(%ReportGroupFooterPre)
  1322. %ReportGroupFooterPre
  1323.    #ENDIF
  1324.    #IF(%ReportGroupFooter)
  1325. PRINT(%ReportPre:%ReportGroupFooter)           #<!Print group footer
  1326.      #IF(%ProgressScreen)
  1327. DISPLAY                                        #<!Display report progress
  1328.      #ENDIF
  1329.    #ENDIF
  1330.    #IF(%ReportGroupFooterPost)
  1331. %ReportGroupFooterPost
  1332.    #ENDIF
  1333.   #IF(%ReportSaveExist)
  1334.     #SET(%WhichFooter,%ThisReportGroup)         #!Ensure footer fields contain
  1335. #INSERT(%RestoreFooterFields)                   #!Restore saved footer fields
  1336.   #ENDIF
  1337.    #IF(%PageTotals)                             #!Any footer save fields?
  1338. IF SAV::LineCounter > %ReportLine              #<!Page overflow?
  1339.      #SET(%ResetTotalType,'PAGE')               #!Reset page totals
  1340.   #INSERT(%ResetTotals)
  1341.      #SET(%TallyType,'PAGE')                    #!Tally page totals
  1342.   #INSERT(%TallyTotals)
  1343. END
  1344. SAV::LineCounter = %ReportLine                 #<!Save line counter
  1345.   #ENDIF
  1346.   #SET(%TallyType,%ThisReportGroup)             #!Tally group total fields
  1347. #INSERT(%TallyTotals)
  1348.   #SET(%ResetTotalType,%ThisReportGroup)        #!Reset group total fields
  1349. #INSERT(%ResetTotals)
  1350. #!
  1351. #!***************************************************************************
  1352. #GROUP(%GroupBreakHeader)                       #!Check for group breaks
  1353.   #SET(%ThisReportGroup,%ReportGroup)           #!Save work Group
  1354.   #IF(%ReportGroupHeaderPre)
  1355. %ReportGroupHeaderPre
  1356.   #ENDIF
  1357.   #IF(%ReportGroupHeader)
  1358. PRINT(%ReportPre:%ReportGroupHeader)           #<!Print group header
  1359.     #IF(%ProgressScreen)
  1360. DISPLAY                                        #<!Display report progress
  1361.     #ENDIF
  1362.   #ENDIF
  1363.   #IF(%ReportGroupHeaderPost)
  1364. %ReportGroupHeaderPost
  1365.   #ENDIF
  1366.    #IF(%PageTotals)                             #!Any footer save fields?
  1367. IF SAV::LineCounter > %ReportLine              #<!Page overflow?
  1368.      #SET(%ResetTotalType,'PAGE')               #!Reset page totals
  1369.   #INSERT(%ResetTotals)
  1370.      #SET(%TallyType,'PAGE')                    #!Tally page totals
  1371.   #INSERT(%TallyTotals)
  1372. END
  1373. SAV::LineCounter = %ReportLine                 #<!Save line counter
  1374.   #ENDIF
  1375. SAV::%ThisReportGroup = %ThisReportGroup       #<!New break field value
  1376. #!
  1377. #!***************************************************************************
  1378. #GROUP(%MultiUpLabelBuild)
  1379. SAV::LabelCounter += 1                         #<!Increment label counter
  1380.   #SET(%Counter1,%NULL)
  1381.   #FOR(%ReportLabelField)
  1382.     #SET(%Counter1,(%Counter1 + 1))
  1383.     #IF(INSTRING('[',%ReportLabelField,1,1)) #!Check for array element
  1384.       #SET(%ArrayField,(SUB(%ReportLabelField,1,INSTRING('[',%ReportLabelField,1,1)-1)))
  1385. LBL::%ArrayField::%Counter1[SAV::LabelCounter] = %ReportLabelField
  1386.     #ELSE
  1387. LBL::%ReportLabelField[SAV::LabelCounter] = %ReportLabelField
  1388.     #ENDIF
  1389.   #ENDFOR
  1390. IF SAV::LabelCounter < %ReportLabel
  1391.   CYCLE
  1392. END
  1393. #!
  1394. #!***************************************************************************
  1395. #GROUP(%MultiUpLabelReset)
  1396. SAV::LabelCounter = 0                          #<!Reset label counter
  1397.   #SET(%Counter1,%NULL)
  1398.   #FOR(%ReportLabelField)
  1399.     #SET(%Counter1,(%Counter1 + 1))
  1400.     #IF(INSTRING('[',%ReportLabelField,1,1)) #!Check for array element
  1401.       #SET(%ArrayField,(SUB(%ReportLabelField,1,INSTRING('[',%ReportLabelField,1,1)-1)))
  1402. CLEAR(LBL::%ArrayField::%Counter1)             #<!Reset label USE variable
  1403.     #ELSE
  1404. CLEAR(LBL::%ReportLabelField)                  #<!Reset label USE variable
  1405.     #ENDIF
  1406.   #ENDFOR
  1407. #!
  1408. #!***************************************************************************
  1409. #GROUP(%RptAbortKey)
  1410.   #IF(%EscapeAbort)                             #!Enable ESC checked?
  1411. LOOP WHILE KEYBOARD()                          #<!If any keystrokes waiting
  1412.   ASK                                          #<! in the buffer, get them
  1413.   IF KEYCODE() = EscKey                        #<!Detect the ESC key
  1414.     CLOSE(%Report)                             #<! close the report
  1415.     RETURN                                     #<! and get out
  1416.   END
  1417. END                                            #<!End abort key loop
  1418.   #ENDIF
  1419. #!
  1420. #!***************************************************************************
  1421. #GROUP(%RptSetFlags)
  1422.   #SET(%SelectorAccess,(%AccessMethod = 'Keyed Order' AND %KeyComponent <> %NULL))
  1423.   #FOR(%Secondary)
  1424.     #SET(%SecondaryExist,'YES')
  1425.     #BREAK
  1426.   #ENDFOR
  1427.   #FOR(%Formula)
  1428.     #SET(%FormulaExist,'YES')
  1429.     #BREAK
  1430.   #ENDFOR
  1431.   #FOR(%ReportGroup)
  1432.     #SET(%ReportGroupExist,'YES')
  1433.     #BREAK
  1434.   #ENDFOR
  1435.   #FOR(%ReportTotal)
  1436.     #SET(%ReportTotalExist,'YES')
  1437.     #BREAK
  1438.   #ENDFOR
  1439.   #SET(%SaveFilesQueue,%NULL)
  1440.   #FOR(%ReportSave)                             #!Check for footer save fields
  1441.     #SET(%BreakField,%ReportSave)
  1442.     #INSERT(%RptFindFile)
  1443.     #SET(%BreakFile,%FoundFile)                 #!Save Group Break File
  1444.     #FOR(%ReportSaveField)
  1445.       #SET(%BreakField,%ReportSaveField)
  1446.       #INSERT(%RptFindFile)
  1447.       #IF(%BreakFile = %FoundFile)              #!If break file footer fields
  1448.         #SET(%ReportSaveExist,'YES')
  1449.         #SET(%Temp,%FoundFile)
  1450.         #IF(NOT INSTRING(%Temp,%SaveFilesQueue,1,1))
  1451.           #SET(%SaveFilesQueue,(%SaveFilesQueue & %Temp & ','))
  1452.         #ENDIF
  1453.       #ENDIF
  1454.     #ENDFOR
  1455.   #ENDFOR
  1456. #!
  1457. #!***************************************************************************
  1458. #GROUP(%RptFindFile)
  1459.   #SET(%FoundFile,%NULL)
  1460.   #FOR(%File)
  1461.     #IF(UPPER(%FilePre) = UPPER(SUB(%BreakField,1,INSTRING(':',%BreakField,1,1)-1)))
  1462.       #SET(%FoundFile,%File)
  1463.       #BREAK
  1464.     #ENDIF
  1465.   #ENDFOR
  1466. #!
  1467. #!***************************************************************************
  1468. #GROUP(%ReportErrorCheck)
  1469.   #SET(%ErrorMessage,(%Procedure & ' ERROR:'))
  1470.   #IF(%Primary = %NULL)
  1471.     #ERROR(%ErrorMessage)
  1472.     #ERROR(' You MUST define a Primary File in the File Schematic.')
  1473.   #ENDIF
  1474.   #IF(%KeyComponent)
  1475.     #FIX(%File,%Primary)
  1476.     #FIX(%Key,%PrimaryKey)
  1477.     #FOR(%KeyField)
  1478.       #IF(%KeyField = %KeyComponent)
  1479.         #SET(%FoundComponent,'YES')
  1480.         #BREAK
  1481.       #ENDIF
  1482.     #ENDFOR
  1483.     #IF(%FoundComponent = %NULL)
  1484.       #ERROR(%ErrorMessage)
  1485.       #ERROR('  Range Limit Field must be a component of ')
  1486.       #ERROR('  the Primary file Access Key.')
  1487.     #ENDIF
  1488.     #IF(%ScopeValue = %NULL)
  1489.       #ERROR(%ErrorMessage)
  1490.       #ERROR('  Must define a Range Value Field')
  1491.     #ELSIF(%KeyComponent = %ScopeValue)
  1492.       #ERROR(%ErrorMessage)
  1493.       #ERROR('  Range Value Field and Range Limit Field')
  1494.       #ERROR('  must be separate fields.')
  1495.     #ENDIF
  1496.   #ENDIF
  1497. #!
  1498. #!
  1499. #CHAIN('CLARION8.TPX')
  1500.