diff --git a/base/mf_getuniquefileref.sas b/base/mf_getuniquefileref.sas index 01c3dd0..5aef3e4 100644 --- a/base/mf_getuniquefileref.sas +++ b/base/mf_getuniquefileref.sas @@ -8,30 +8,40 @@ %let fileref2=%mf_getuniquefileref(); %put &fileref1 &fileref2; - which returns: + which returns something similar to: -> mcref0 mcref1 +> #LN01295 #LN01297 - @param prefix= first part of fileref. Remember that filerefs can only be 8 - characters, so a 7 letter prefix would mean that `maxtries` should be 10. - @param maxtries= the last part of the libref. Provide an integer value. + A previous version of this macro worked by assigning sequential filerefs. + The current version uses the native "find a unique fileref" functionality + within the filename function, which is 100 times faster. + + @param prefix= Deprecated. Will be removed in a future release. + @param maxtries= Deprecated. Will be removed in a future release. @version 9.2 @author Allan Bowe **/ -%macro mf_getuniquefileref(prefix=mcref,maxtries=1000); - %local x fname; - %let x=0; - %do x=0 %to &maxtries; - %if %sysfunc(fileref(&prefix&x)) > 0 %then %do; - %let fname=&prefix&x; +%macro mf_getuniquefileref(prefix=0,maxtries=1000); + %local rc fname; + %if &prefix=0 %then %do; %let rc=%sysfunc(filename(fname,,temp)); %if &rc %then %put %sysfunc(sysmsg()); - &prefix&x - %*put &sysmacroname: Fileref &prefix&x was assigned and returned; - %return; + &fname %end; + %else %do; + %local x; + %let x=0; + %do x=0 %to &maxtries; + %if %sysfunc(fileref(&prefix&x)) > 0 %then %do; + %let fname=&prefix&x; + %let rc=%sysfunc(filename(fname,,temp)); + %if &rc %then %put %sysfunc(sysmsg()); + &prefix&x + %return; + %end; + %end; + %put unable to find available fileref in range &prefix.0-&maxtries; %end; - %put unable to find available fileref in range &prefix.0-&maxtries; %mend mf_getuniquefileref; \ No newline at end of file diff --git a/tests/crossplatform/mf_getuniquefileref.test.sas b/tests/crossplatform/mf_getuniquefileref.test.sas new file mode 100644 index 0000000..6bde5b0 --- /dev/null +++ b/tests/crossplatform/mf_getuniquefileref.test.sas @@ -0,0 +1,17 @@ +/** + @file + @brief Testing mf_getuniquefileref macro + +

SAS Macros

+ @li mf_getuniquefileref.sas + @li mp_assert.sas + +**/ + +%mp_assert( + iftrue=( + "%substr(%mf_getuniquefileref(),1,1)"="#" + ), + desc=Checking for a temp fileref, + outds=work.test_results +)