1
0
mirror of https://github.com/sasjs/core.git synced 2026-06-08 20:10:20 +00:00

feat: adding tests, adding param to mfv_existsashdat, updating README

This commit is contained in:
4gl
2026-04-27 17:29:07 +01:00
parent 08f2d0d53f
commit d0a5780cd1
6 changed files with 127 additions and 13 deletions
+9 -6
View File
@@ -6,14 +6,17 @@
%if %mfv_existsashdat(libds=casuser.sometable) %then %put yes it does!;
The function uses `dosubl()` to run the `table.fileinfo` action, for the
specified library, filtering for `*.sashdat` tables. The results are stored
in a WORK table (&outprefix._&lib). If that table already exists, it is
queried instead, to avoid the dosubl() performance hit.
specified library, filtering for `*.sashdat` tables.
IMPORTANT NOTE - The results are cached in a WORK table (&outprefix._&lib).
If that table already exists, it is queried instead, to avoid the
dosubl() performance hit.
To force a rescan, just use a new `&outprefix` value, or delete the table(s)
before running the function.
@param [in] libds library.dataset
@param [in] usecache= (1) Set to 0 to rebuild the cache
@param [out] outprefix= (work.mfv_existsashdat)
Used to store current HDATA tables to improve subsequent query performance.
This reference is a prefix and is converted to `&prefix._{libref}`
@@ -24,14 +27,14 @@
@author Mathieu Blauw
**/
%macro mfv_existsashdat(libds,outprefix=work.mfv_existsashdat
%macro mfv_existsashdat(libds,usecache=1,outprefix=work.mfv_existsashdat
);
%local rc dsid name lib ds;
%let lib=%upcase(%scan(&libds,1,'.'));
%let ds=%upcase(%scan(&libds,-1,'.'));
/* if table does not exist, create it */
%if %sysfunc(exist(&outprefix._&lib)) ne 1 %then %do;
%if &usecache ne 1 or %sysfunc(exist(&outprefix._&lib)) ne 1 %then %do;
%let rc=%sysfunc(dosubl(%nrstr(
/* Read in table list (once per &lib per session) */
proc cas;
@@ -41,7 +44,7 @@
quit;
/* Only keep name, without file extension */
data &outprefix._&lib;
set &outprefix._&lib(where=(Name like '%.sashdat') keep=Name);
set &outprefix._&lib(where=(upcase(Name) like '%.SASHDAT') keep=Name);
Name=upcase(scan(Name,1,'.'));
run;
)));
+16 -5
View File
@@ -19,7 +19,7 @@
@param [in] caslib= CASLIB containing the source file
@param [in] table= Name to give the in-memory CAS table
@param [in] srcfile= (0) Source file name.ext in the caslib. If not provided,
the code assumes that srcfile=&table..hdat
the code assumes that srcfile=&table..sashdat
@param [in] mdebug= (0) Set to 1 to enable verbose logging:
- echoes resolved parameters
- prints tableExists result
@@ -28,7 +28,11 @@
@returns Sets global macro variable `MV_CASTABLOAD_RC`:
0 = table already existed (no load performed)
1 = table was loaded & promoted successfully
3 = action failed
3 = action failed (including source file missing)
<h4> SAS Macros </h4>
@li mfv_existsashdat.sas
**/
%macro mv_castabload(
@@ -49,7 +53,7 @@
%put %str(ERR)OR: caslib=, table= and srcfile= are all required;
%return;
%end;
%if "&srcfile"="0" %then %let srcfile=&table..hdat;
%if "&srcfile"="0" %then %let srcfile=&table..sashdat;
%if &mdebug=1 %then %do;
%put &=caslib;
@@ -58,6 +62,13 @@
options mprint notes;
%end;
/* ---- check source file exists ------------------------------------------ */
%if not %mfv_existsashdat(&caslib..%scan(&srcfile,1,.)) %then %do;
%put %str(ERR)OR: Source file "&srcfile" not found in caslib "&caslib";
%let MV_CASTABLOAD_RC=3;
%return;
%end;
/* ---- existence check --------------------------------------------------- */
proc cas;
table.tableExists result=r /
@@ -92,11 +103,11 @@ quit;
%put NOTE: Table &caslib..&table already loaded - skipping;
%else %if &MV_CASTABLOAD_RC=1 %then
%put NOTE: Table &caslib..&table loaded and promoted;
%else %put ERROR: load failed for &caslib..&table;
%else %put %str(ERR)OR: load failed for &caslib..&table;
/* ---- restore options --------------------------------------------------- */
%if &mdebug=1 %then %do;
options &_sysopts;
%end;
%mend mv_castabload;
%mend mv_castabload;