Modifying filenames at runtime

When you need multiple versions of the same file definition (for example, if you have an “AROxxx” filename, where xxx is a client-specific code), Repository enables you to create one file definition and then map the filename when necessary. Every time ReportWriter opens a file, the RPS_FILNAM_METHOD subroutine is called to do any filename mapping. You can supply your own version of this subroutine and link it with ReportWriter.

RPS_FILNAM_METHOD

subroutine RPS_FILNAM_METHOD
    a_inp_file          ,a      ;Original filename (a64)
    a_out_file          ,a      ;Returned with mapped filename (a64)

Use RPS_FILNAM_METHOD to map a filename. ReportWriter passes the data filename that you entered at the Open filename prompt in your file definition to this subroutine as a_inp_file. For example, if you’ve defined the file that contains your customer data, you could map the data filename to the appropriate name for your customer and return that name as a_out_file.

The version of RPS_FILNAM_METHOD that is supplied with your ReportWriter distribution returns the original filename, unmodified, in a_out_file.

If you’re using xfODBC, this routine must be named USR_DD_FILNAM. For additional information, see Using USR_DD_FILNAM to change replaceable characters.

This is an example of a user-supplied filename mapping subroutine which replaces various tokens contained in the filenames.

;
; Source:               UTS:usrdd.def 
;
; Description:          Global data section for sample rps_filnam_method 
;                       routine
;
.ifdef USRDD_INIT
global data section usrdd, init
.else
global data section usrdd
.endc

record usrdd_ctls
    usrdd_needinfo              ,d1,  1         ;Cleared when info supplied
    usrdd_cltdesc               ,a30, 'Client Number'
    usrdd_pathdesc              ,a30, 'Data Location'
    usrdd_cltno                 ,d5             ;Client Number
    usrdd_ttnum                 ,d3             ;Terminal Number
    usrdd_path                  ,a40            ;Data Location
    usrdd_pathlen               ,d2             ;%trim of usrdd_path
endglobal
;
; Source:             rps_filnam.dbl
;
subroutine rps_filnam_method
;
; Description:  Perform filename mapping
;
; The location of #### is replaced by the 4-digit client number.
; The location of ##### is replaced by the 5-digit client number
; The location of %%% is replaced by the 3-digit terminal number.
; The location of $$$ is replaced by the variable-length data path.
;
    a_filnam            ,a              ;Repository filename
    a_retnam            ,a              ;Returned filtered filename
.define USRDD_INIT
.include "UTS:usrdd.def"                ;Global region
record
    retlen              ,d3             ;Return value length
    loc                 ,d3             ;Instr pointer
proc
    a_retnam = a_filnam                 ;Map filename initially
    retlen = %size(a_retnam)
    while (%instr(1, a_retnam, '#####', loc))
      begin
        if (usrdd_needinfo)
          xcall rps_getinfo_method
        a_retnam(loc:5) = usrdd_cltno, 'XXXXX'
      end
    while (%instr(1, a_retnam, '####', loc))
      begin
        if (usrdd_needinfo)
          xcall rps_getinfo_method
        a_retnam(loc:4) = usrdd_cltno, 'XXXX'
      end
    while (%instr(1, a_retnam, '%%%', loc))
      begin
        if (usrdd_needinfo)
          xcall rps_getinfo_method
        a_retnam(loc:3) = usrdd_ttnum
      end
    while (%instr(1, a_retnam, '$$$', loc))
      begin
        if (usrdd_needinfo)
          xcall rps_getinfo_method
        a_retnam(loc+usrdd_pathlen, retlen) = a_retnam(loc+4, retlen)
        a_retnam(loc:usrdd_pathlen) = usrdd_path
      end
xreturn
endsubroutine
;
; Source:             rps_getinfo.dbl
;
subroutine rps_getinfo_method
;
; Description: Get information from the user for rps_filnam_method
;
; Arguments: None
.include "UTS:usrdd.def"
.include "WND:tools.def"
record
    chn                 ,d2             ;Library channel
    id                  ,d2             ;Window ID
    srch                ,d2             ;Search variable
proc
    xcall tnmbr(usrdd_ttnum)
    xcall e_enter
    xcall u_open(chn, 'I:I', 'SYR:utwlib',, srch)
    xcall i_ldinp(id, chn, 'utdd_info', srch)
    xcall i_dspfld(id, 'cltdesc', usrdd_cltdesc)
    xcall i_dspfld(id, 'pathdesc', usrdd_pathdesc)
    if (usrdd_path) then
      nop
    else
      usrdd_path = 'DAO:'               ;Default
    repeat
      begin
        xcall i_input(id,, usrdd_ctls,,,,D_NOTERM)
        if (g_select) then
          begin
            case g_entnam of
              begincase
                'O_EXIT':
                  exitloop
              endcase
            else
              call beep
          end
        else
          if (.not. g_setsts)
            exitloop
      end
    xcall e_exit
    clear usrdd_needinfo
    usrdd_pathlen = %trim(usrdd_path)
    xreturn
beep,
            display(g_terminal, 7)
    return
endsubroutine