Defining the contents of environment fields

When report generation begins, ReportWriter calls the routine RW_ENV_METHOD for each environment field to obtain the field’s contents. You can register your own version of this routine to provide whatever mechanism you think is necessary to define the contents of your environment fields. See Creating an environment field for additional information about environment fields.

RW_ENV_METHOD

subroutine RW_ENV_METHOD
a_fld_name      ,a      ;Name of environment field to load (a15)
a_type          ,n      ;Field type (d1)
                        ; 1     Alpha.
                        ; 2     Decimal.
                        ; 3     Implied-decimal.
a_dec_pl        ,n      ;Number of decimal places (if implied-decimal) (d2)
a_class         ,n      ;One of the following values (d1)
                        ; 0     Neither date nor time field.
                        ; 1 - 6 Date field.
                        ; 8 - 9 Time field.
                        ; These values correspond to date and time storage 
                        ; formats in Appendix B.
a_user_area     ,a      ;Associated user-text string (a40)
a_fld_data      ,a      ;Field area to load (a99)

The version of RW_ENV_METHOD that is supplied with your original ReportWriter distribution operates as follows:

In the sample RW_ENV_METHOD subroutine below, two field names are recognized as coming from a firm master file. If the master file record has not yet been read, the file is opened and the records retrieved. The firm master record, along with the flag to indicate whether or not it has been previously read, are stored in a global data section so that they will be preserved between calls to RW_ENV_METHOD. Thus, the routine doesn’t have to reread the firm master file for each environment field.

The FIRMOFFC environment field will be loaded with a Y or N if it is declared alpha and a 1 or 0 if it is numeric.

If this routine does not recognize the environment field as coming from the firm master file, it looks for a logical symbol with the same name as the field and loads the data into the field according to its type. If the logical symbol is not defined, or if it contains invalid data for the specified type, the field is cleared.

subroutine rw_env_method
;
;  Description: Supply values for environment fields.
;
    a_fldnam            ,a      ;Name of field to load
    a_type              ,n      ;Field type (1 = alpha, 2 = decimal,
                                ; 3 = implied-decimal)
    a_dec               ,n      ;# of decimal places, if implied-decimal
    a_cls               ,n      ;Class (0 = normal, 1 = date, 9 = time)
    a_use               ,a      ;Associated user string
    a_field             ,a      ;Returned loaded field
record
    chn                 ,d2     ;Firm master file channel
    srch                ,d1     ;Search parameter
global data section read_test, init
record
    master_read         ,d1     ;Has master file record been read yet?
record master                   ;Firm management master file record
    firm_name           ,a50    ;Firm name
    firm_office         ,d1     ;Does firm use multiple offices?
endglobal

proc
    case a_fldnam of
      begincase
        'FIRMNAME':  
          begin
            if (.not. master_read)
              call read_master
            a_field = firm_name
          end
        'FIRMOFFC':  
          begin
            if (.not. master_read)
              call read_master
            case a_type of
              begincase
                ;1 - Alpha, assume Y/N
                  begin
                    if (firm_office) then
                      a_field = 'Y'
                    else
                      a_field = 'N'
                  end
                ;2 - Decimal, load as 1/0
                  %d(a_field) = firm_office
                ;3 - Implied-decimal, load as 1.0/0.0
                  %f(a_field, a_dec) = firm_office
              endcase
          end
      endcase
    else
      begin                              ;Unrecognized, look for logical
        clear buf
        xcall getlog (a_fldnam, buf)
        onerror (20) clear_it           ;If bad data, clear the field
        case a_type of 
          begincase
            ;1 - Alpha
              a_field = buf
            ;2 - Decimal
              %d(a_field) = buf
            ;3 - Implied-decimal
              %f(a_field, a_dec) = buf
          endcase
        offerror
      end
return

clear_it,                               ;Clear field, based on data type
    case a_type of
      begincase
        ;1 - Alpha
          clear a_field
        ;2 - Decimal
          clear %d(a_field)
        ;3 - Implied-decimal
          clear %f(a_field, a_dec)
      endcase
return
read_master,                            ;Read firm master file
    xcall u_open (chn, 'I:I', 'FIRMMSTR', srch)
    read (chn, master, 1)
    if (.not. srch)
      xcall u_close (chn)
    incr master_read                    ;Flag master file as read
    return
endsubroutine