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)
Discussion
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.
Examples
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