793.TXT
     =====================================================================
     Using nested RUN procedures with a PAGEMODE Report
     =====================================================================
     PRODUCT:  R:BASE                   VERSION:  4.5++ or Higher
     =====================================================================
     CATALOG:  Forms, Reports & Labels  AREA   :  Reports
     =====================================================================
 
     You can significantly reduce the amount of code in PAGEMODE reports 
     by using nested command files to print header and footer sections. 
     Use the nested command file to print page headers and footer, and 
     break headers and footers. Since these sections are printed several 
     times throughout a report, the code is repeated for each case where 
     a header or footer should be printed. The end result can be a very 
     long command file. Using nested files to print the headers and 
     footers has these advantages:
 
       Code duplication is dramatically reduced leading to fewer errors 
       and simpler code. Your PAGEMODE report is easier to troubleshoot. 
       You know that the same code is being executed each time a header 
       or footer is printed. Syntax and typing errors are reduced. Changes 
       to the layout of the header or footer section are easier to make 
       since you make the change in only one place.  You can pass 
       parameters to your header or footer command files using the same 
       layout but different text.
 
     Write each of your header and footer sections as a separate command 
     file. Each time the section in question is printed, a RUN command 
     is used instead of including the same block of code in many places 
     in the program.
 
     Here's an example. The report prints detail sales amounts and totals 
     by customer. The PAGEMODE report prints each customer's data on a 
     separate page including the page number and date, general customer 
     information, detail rows, and a total sales amount. A page header, 
     break header, and break footer sections are needed in addition to the 
     detail. The page header contains the date and the page number. The 
     break header contains the customer ID number, company name, and
     contact name. The break footer contains the total sales amount.
 
     Separate command files are run for both the page header and break 
     header because there are four different places in the PAGEMODE 
     report where a new page might be required; both a page header and 
     break header are printed at the beginning of each new page. Each 
     time the new page check is true, it is a simple procedure to reset 
     page checking variables and issue the needed RUN commands. The page 
     number and customer number are passed to the header file using 
     percent variables. 
 
     For each new page, the page number is incremented using the 
     expression SET VAR VPage = (.VPage + 1). The resulting value is then 
     passed as a parameter to the page header file. For example:
 
     RUN PGHEAD.RMD USING .VPage.
 
     In the page header file, pghead.rmd, the expression VP_num =.%1 
     captures the passed parameter value; the percent variable %1 holds 
     the value from the VPage variable. The same technique is used to 
     pass the customer ID number, Custno, to the break header file. 
     Custno is used to retrieve the other customer information. Since 
     Custno was fetched in the PAGEMODE report, it is simple to pass 
     that value to the break header file, break1.rmd, using parameters.
 
     The following example passes just one or two values each time to the 
     nested header files. Up to nine values can be passed to a nested 
     file. In addition to the page number, for example, a text string can 
     be passed for dynamic header and footer titles or to use the same 
     header file across many reports. For more information about passing 
     parameters, refer to the article "Working With Variables" in the 
     September/October 1993 Exchange, document #738 on the FAX server.
 
 
     Sample report output:
 
                        This is the Page Header for my report
                                       10/20/94
                                       Page: 1
 
        Cust#: 101    Company: Computer Distributors Inc.
     Amount:
                               Timothy Johnson
 
     $176,000.00
 
     $87,500.00
 
     $22,500.00
 
     $29,000.00
 
     $30,000.00
  
                                               TOTAL:
     $345,000.00
 
 
 
                        This is the Page Header for my report
                                       10/20/94
                                        Page: 2
 
        Cust#: 104    Company: Industrial Concepts Inc.
     Amount:
                               Jillian Bailey, President
 
     $19,500.00
 
     $56,250.00
 
     $95,500.00
 
                                                TOTAL:
     $171,250.00
 
 
     *(PGHEAD.RMD -- prints a page header )
 
     SET VAR VP_Num INTEGER = .%1
     SET VAR VPg TEXT = ('Page: ' + (CTXT(.VP_Num)))
 
     WRITE 'This is the Page Header for my report' AT 2, 20
     WRITE .#DATE AT 3, 35
     WRITE .VPg AT 4, 35
     RETURN
 
 
     *(BREAK1.RMD -- prints a break header )
     SET VAR VCustno INTEGER = .%1
     SET VAR vRow INTEGER = .%2
 
     SELECT company, firstname, lastname, title +
        INTO VCompany ivc, VFirst ivf, VLast ivl, VTitle ivt +
        FROM Cust WHERE Custno = .VCustno
     IF VTitle IS NULL THEN
        SET VAR VWname = (.VFirst & .VLast)
     ELSE
        SET VAR VWname = (.VFirst & .VLast + ',' & .VTitle)
     ENDIF
 
     WRITE 'Cust#:', .VCustno AT .vRow, 8
     WRITE 'Company:', .VCompany AT .vRow, 24
     WRITE 'Amount:' AT .vRow, 59
     SET VAR vRow = (.vRow + 1)
     WRITE .VWname AT .vRow, 33
     SET VAR vRow = (.vRow - 1)
     RETURN
 
 
     *(REPORT.RMD - the PAGEMODE report that calls the header files)
     SET LINES 20
     SET PAGEMODE ON
     SET MESSAGE OFF
     SET ERROR MESSAGE OFF
     CLS
 
     SET VAR VLines TEXT = (CVAL('LINES'))
     SET VAR vRow INTEGER
     SET VAR VPage INTEGER = 1
     SET VAR VCustno INTEGER
     SET VAR VSum CURRENCY = NULL
 
     DECLARE C1 CURSOR FOR SELECT DISTINCT Custno FROM Sales +
        ORDER BY Custno
     DECLARE C2 CURSOR FOR SELECT amount FROM Sales +
        WHERE Custno = .VCustno
 
     OPEN C1
     FETCH C1 INTO VCustno ivc
     SET VAR vRow = 6
     OUTPUT REP.DAT
 
     RUN PGHEAD.RMD USING .VPage
 
     WHILE SQLCODE <> 100 THEN
 
         RUN BREAK1.RMD USING .VCustno, .vRow
 
        OPEN C2 RESET
        FETCH C2 INTO VAmount iva
        SET VAR vRow = (.vRow + 1)
 
        WHILE SQLCODE <> 100 THEN
           SET VAR vRow = (.vRow + 1)
 
           IF vRow >= (INT(.VLines)) THEN
              NEWPAGE
              SET VAR VPage = (.VPage + 1)
              SET VAR vRow = 6
              RUN PGHEAD.RMD USING .VPage
              RUN BREAK1.RMD USING .VCustno, .vRow
              SET VAR vRow = (.vRow + 2)
           ENDIF
 
           WRITE .VAmount AT .vRow 54 USING '$999,999.00'
           SET VAR VSum = (.VSum + .VAmount)
           FETCH C2 INTO VAmount iva
        ENDWHILE
 
        SET VAR vRow = (.vRow + 1)
 
        IF vRow >= (INT(.VLines)) THEN
            NEWPAGE
            SET VAR VPage = (.VPage + 1)
            SET VAR vRow = 6
            RUN PGHEAD.RMD USING .VPage
            RUN BREAK1.RMD USING .VCustno, .vRow
        ENDIF
        SET VAR vRow = (.vRow + 1)
        WRITE 'TOTAL:' AT .vRow, 43
        WRITE .VSum AT .vRow, 54 USING '$999,999.00
        SET VAR VSum = NULL
        CLOSE C2
 
        FETCH C1 INTO VCustno ivc
        IF SQLCODE = 100 THEN
           BREAK
        ELSE
           SET VAR VPage = (.VPage + 1)
           SET VAR vRow = 6
           NEWPAGE
           RUN PGHEAD.RMD USING .VPage
        ENDIF
     ENDWHILE
     OUTPUT SCREEN
 
     CLEAR ALL VAR
     DROP CURSOR C1
     DROP CURSOR C2
     SET PAGEMODE OFF
     SET LINES 20
     RETURN
 
 
 
     Store the passed page number value.
 
     Write the page header.
 
 
     Store the passed parameter values.
 
     Get the company, first and last name. If there is no title, just 
     print the name
 
     Write the break header.
 
 
     Set up the report environment.
 
     Initialize variables.
 
     Define the breakpoint and detail data through related cursors.
 
     Get the first break group value.
 
     Run the page header file and write the page header on the first page.
 
     Run the break header file to write the first break header.
 
     Get the detail data for the break value.
 
     Check to see if the report has used all printable lines and needs a 
     new page. If so, run the page header and break header files.
 
     Write the detail data and calculate the sum.
 
     Break footer processing.
 
     Check to see if footer data fits on the page.
 
     Get the next break group. If data is found, force a new page and 
     print the page header
 
     Close the report and reset the environment