mirror of
https://github.com/sasjs/core.git
synced 2025-12-10 14:04:36 +00:00
61 lines
1.9 KiB
SAS
61 lines
1.9 KiB
SAS
/**
|
|
@file mfv_existsashdat.sas
|
|
@brief Checks whether a CAS sashdat dataset exists in persistent storage.
|
|
@details Can be used in open code, eg as follows:
|
|
|
|
%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.
|
|
|
|
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 [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}`
|
|
|
|
@return output returns 1 or 0
|
|
|
|
@version 0.2
|
|
@author Mathieu Blauw
|
|
**/
|
|
|
|
%macro mfv_existsashdat(libds,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;
|
|
%let rc=%sysfunc(dosubl(%nrstr(
|
|
/* Read in table list (once per &lib per session) */
|
|
proc cas;
|
|
table.fileinfo result=source_list /caslib="&lib";
|
|
val=findtable(source_list);
|
|
saveresult val dataout=&outprefix._&lib;
|
|
quit;
|
|
/* Only keep name, without file extension */
|
|
data &outprefix._&lib;
|
|
set &outprefix._&lib(where=(Name like '%.sashdat') keep=Name);
|
|
Name=upcase(scan(Name,1,'.'));
|
|
run;
|
|
)));
|
|
%end;
|
|
|
|
/* Scan table for hdat existence */
|
|
%let dsid=%sysfunc(open(&outprefix._&lib(where=(name="&ds"))));
|
|
%syscall set(dsid);
|
|
%let rc = %sysfunc(fetch(&dsid));
|
|
%let rc = %sysfunc(close(&dsid));
|
|
|
|
/* Return result */
|
|
%if "%trim(&name)"="%trim(&ds)" %then 1;
|
|
%else 0;
|
|
|
|
%mend mfv_existsashdat;
|