WITHIN: A Noble Word

By Noreen Redden

Calculations used within a report request (COMPUTE) use aggregate values as the components of the calculation.

For instance, in the EMPLOYEE file, if cost of education is to be determined by multiplying the ED_HRS times the hourly salary, it could be specified as a COMPUTE.

 
          DEFINE  FILE EMPLOYEE
          HRLY_SAL/F8.2  = CURR_SAL / 1000;
          END   
          TABLE  FILE EMPLOYEE
          SUM  ED_HRS NOPRINT HRLY_SAL NOPRINT  
          		COMPUTE COST_OF_EDUCATION = ED_HRS *  HRLY_SAL;
          	BY DEPARTMENT BY LAST_NAME
          END
DEPARTMENT  LAST_NAME        COST_OF_EDUCATION   
----------  ---------        -----------------   
MIS         BLACKWOOD                 1,633.50   
            CROSS                     1,217.79   
            GREENSPAN                   225.00   
            JONES                       924.00   
            MCCOY                          .00   
            SMITH                       475.20   
PRODUCTION  BANNING                        .00   
            IRVING                      805.86   
            MCKNIGHT                    805.00   
            ROMANS                      105.60   
            SMITH                        95.00   
            STEVENS                     275.00   

Certainly, fields used in COMPUTES need not be mentioned explicitly, as FOCUS will determine the need for the field and create it as a NOPRINTed verb object if not previously mentioned. However, as reports get more complicated, actually explicitly mentioning the components of the calculation allows the developer to avoid any confusion (DEFAULT and DISASTER both begin with D).

In addition, if when testing the need arises to actually see the components, LET NOPRINT = ;  changes the value of NOPRINT to blank, and running the procedure  will allow the display, without having to EDIT the procedure in either a painter or text editor.

          DEPARTMENT  LAST_NAME        ED_HRS   HRLY_SAL  COST_OF_EDUCATION 
          ----------  ---------        ------   --------  ----------------- 
          MIS         BLACKWOOD         75.00     21.78           1,633.50  
          	    CROSS             45.00     27.06           1,217.79  
          	    GREENSPAN         25.00      9.00             225.00  
          	    JONES             50.00     18.48             924.00  
          	    MCCOY               .00     18.48                .00  
          	    SMITH             36.00     13.20             475.20  
          PRODUCTION  BANNING             .00     29.70                .00  
          	    IRVING            30.00     26.86             805.86  
          	    MCKNIGHT          50.00     16.10             805.00  
          	    ROMANS             5.00     21.12             105.60  
          	    SMITH             10.00      9.50              95.00  
          	    STEVENS           25.00     11.00             275.00  

But suppose that instead of calculating the cost of education based on the individual’s hourly salary, I wanted to use, in all cases, the average hourly salary for the department: 

Enter WITHIN.

          DEFINE  FILE EMPLOYEE
          HRLY_SAL/F8.2  = CURR_SAL / 1000; 
          END 
          
          TABLE  FILE EMPLOYEE 
          	SUM ED_HRS NOPRINT  AVE.HRLY_SAL NOPRINT WITHIN DEPARTMENT 
          		COMPUTE COST_OF_EDUCATION = ED_HRS *  AVE.HRLY_SAL;  
          	BY DEPARTMENT BY LAST_NAME 
          IF  DEPARTMENT NE ' ' 
              END
          
					   AVE
          DEPARTMENT  LAST_NAME        ED_HRS   HRLY_SAL  COST_OF_EDUCATION 
          ----------  ---------        ------   --------  ----------------- 
          MIS         BLACKWOOD         75.00     18.00           1,350.02 
          	    CROSS             45.00     18.00             810.01 
          	    GREENSPAN         25.00     18.00             450.01 
          	    JONES             50.00     18.00             900.02 
          	    MCCOY               .00     18.00                .00 
          	    SMITH             36.00     18.00             648.01 
          PRODUCTION  BANNING             .00     19.05                .00 
          	    IRVING            30.00     19.05             571.41 
          	    MCKNIGHT          50.00     19.05             952.35 
          	    ROMANS             5.00     19.05              95.23 
          	    SMITH             10.00     19.05             190.47 
          	    STEVENS           25.00      19.05             476.17
          

Because AVE.HRLY_SAL WITHIN DEPARTMENT was specified as the component, the value is the same for all individuals within the department. The is result clearing the LET NOPRINT = ;

   
          LET  CLEAR NOPRINT
          DEPARTMENT  LAST_NAME        COST_OF_EDUCATION 
          ----------  ---------        ----------------- 
          MIS         BLACKWOOD                 1,350.02 
          	    CROSS                       810.01 
          	    GREENSPAN                   450.01 
          	    JONES                       900.02 
          	    MCCOY                          .00 
          	    SMITH                       648.01 
          PRODUCTION  BANNING                        .00 
          	    IRVING                      571.41 
          	    MCKNIGHT                    952.35 
          	    ROMANS                       95.23 
          	    SMITH                       190.47 
          	    STEVENS                     476.17

By using WITHIN, I can specify exactly which values to use in each calculation.  Remember that even if columns have the same names and are NOPRINTed, if you have specified the column, SET CNOTATION = EXPLICIT gives the user the control of specifying the exact column needed for the calculation.

So,

          DEFINE  FILE EMPLOYEE
          HRLY_SAL/F8.2  = CURR_SAL / 1000;
          END 
          TABLE  FILE EMPLOYEE 
          	SUM AVE.HRLY_SAL NOPRINT WITHIN DEPARTMENT   ED_HRS NOPRINT 
          			AVE.HRLY_SAL  NOPRINT 
          	COMPUTE COST1 = ED_HRS * C1; AS 'COST BASED,ON DEPART AVERAGE' 
          	COMPUTE COST2 = ED_HRS * C3; AS 'COST  BASED,ON INDIVIDUAL' 
            BY DEPARTMENT BY LAST_NAME 
          IF  DEPARTMENT NE ' ' 
            END
          
          COST BASED          COST BASED    
          DEPARTMENT   LAST_NAME        ON DEPART  AVERAGE   ON INDIVIDUAL 
          ----------   ---------        -----------------    ------------- 
          MIS          BLACKWOOD                  1,350.02        1,633.50 
          	    CROSS                       810.01        1,217.79 
          	    GREENSPAN                   450.01          225.00 
          	    JONES                       900.02          924.00 
          	    MCCOY                          .00             .00 
          	    SMITH                       648.01          475.20 
          PRODUCTION   BANNING                         .00             .00 
          	    IRVING                      571.41           805.86 
          	    MCKNIGHT                    952.35          805.00 
          	    ROMANS                       95.23          105.60 
          	    SMITH                       190.47           95.00 
          	    STEVENS                     476.17          275.00

By the way, the same rule holds true for the customer who prefers multiple sort groups (Report Painter in Developer Studio), or multiple verbs. Consider the following:

          DEFINE  FILE EMPLOYEE
          HRLY_SAL/F8.2  = CURR_SAL / 1000;
          END
          TABLE  FILE EMPLOYEE
          	SUM AVE.HRLY_SAL NOPRINT BY DEPARTMENT
          		SUM ED_HRS NOPRINT 
          		AVE.HRLY_SAL  NOPRINT 
          	COMPUTE COST1 = ED_HRS * C1; AS 'COST BASED,ON DEPART AVERAGE' 
          	COMPUTE COST2 = ED_HRS * C3; AS 'COST BASED,ON INDIVIDUAL' 
            BY DEPARTMENT BY LAST_NAME                                         
          IF  DEPARTMENT NE ' '                                                   
            END
          

Remember that if CNOTATION = EXPLICIT, each verb object explicitly mentioned (with or without NOPRINT) is assigned a unique number in the order in which they are mentioned.  So the AVE.HRLY_SAL WITHIN DEPARTMENT (or in the first verb) is C1, ED_HRS is C2, and the HRLY_SAL for the individual is C3. 

We can even show calculations on multiple levels, using WITHIN.

          DEFINE FILE  EMPLOYEE 
          HRLY_SAL/F8.2  = CURR_SAL / 1000; 
          END 
          TABLE FILE  EMPLOYEE 
          	SUM AVE.HRLY_SAL WITHIN DEPARTMENT  NOPRINT 
          		AVE.ED_HRS   WITHIN DEPARTMENT NOPRINT 
          		ED_HRS NOPRINT 
          		HRLY_SAL NOPRINT   
          	COMPUTE COST1 = C2 * C1; NOPRINT
          	COMPUTE COST2 = C3 * C4; AS  'COST BASED,ON INDIVIDUAL'   
            BY DEPARTMENT BY LAST_NAME                                     
          IF DEPARTMENT  NE ' '                                               
          ON  DEPARTMENT  SUBHEAD                                             
          "</1  THE AVERAGE COST FOR EDUCATION IN <DEPARTMENT IS <COST1 "     
            END
          
          COST BASED                          
          DEPARTMENT   LAST_NAME         ON INDIVIDUAL                       
          ----------   ---------          -------------                       
          
          THE AVERAGE COST FOR EDUCATION IN MIS IS         693.01           
          MIS          BLACKWOOD              1,633.50                       
          	    CROSS                   1,217.79                       
          	    GREENSPAN                 225.00                       
          	    JONES                     924.00                       
          	    MCCOY                       .00                       
          	    SMITH                     475.20                       
          
          THE AVERAGE COST FOR EDUCATION IN PRODUCTION IS         380.94    
          PRODUCTION   BANNING                      .00                       
          	    IRVING                    805.86                       
          	    MCKNIGHT                  805.00                       
          	    ROMANS                    105.60                       
          	    SMITH                      95.00                       
          	    STEVENS                  275.00
          
                                                          

previous next