Macros for SAS Application Developers
https://github.com/sasjs/core
Loading...
Searching...
No Matches
mfv_existsashdat.sas
Go to the documentation of this file.
1/**
2 @file mfv_existsashdat.sas
3 @brief Checks whether a CAS sashdat dataset exists in persistent storage.
4 @details Can be used in open code, eg as follows:
5
6 %if %mfv_existsashdat(libds=casuser.sometable) %then %put yes it does!;
7
8 The function uses `dosubl()` to run the `table.fileinfo` action, for the
9 specified library, filtering for `*.sashdat` tables. The results are stored
10 in a WORK table (&outprefix._&lib). If that table already exists, it is
11 queried instead, to avoid the dosubl() performance hit.
12
13 To force a rescan, just use a new `&outprefix` value, or delete the table(s)
14 before running the function.
15
16 @param [in] libds library.dataset
17 @param [out] outprefix= (work.mfv_existsashdat)
18 Used to store current HDATA tables to improve subsequent query performance.
19 This reference is a prefix and is converted to `&prefix._{libref}`
20
21 @return output returns 1 or 0
22
23 @version 0.2
24 @author Mathieu Blauw
25**/
26
27%macro mfv_existsashdat(libds,outprefix=work.mfv_existsashdat
28);
29%local rc dsid name lib ds;
30%let lib=%upcase(%scan(&libds,1,'.'));
31%let ds=%upcase(%scan(&libds,-1,'.'));
32
33/* if table does not exist, create it */
34%if %sysfunc(exist(&outprefix._&lib)) ne 1 %then %do;
35 %let rc=%sysfunc(dosubl(%nrstr(
36 /* Read in table list (once per &lib per session) */
37 proc cas;
38 table.fileinfo result=source_list /caslib="&lib";
39 val=findtable(source_list);
40 saveresult val dataout=&outprefix._&lib;
41 quit;
42 /* Only keep name, without file extension */
43 data &outprefix._&lib;
44 set &outprefix._&lib(where=(Name like '%.sashdat') keep=Name);
45 Name=upcase(scan(Name,1,'.'));
46 run;
47 )));
48%end;
49
50/* Scan table for hdat existence */
51%let dsid=%sysfunc(open(&outprefix._&lib(where=(name="&ds"))));
52%syscall set(dsid);
53%let rc = %sysfunc(fetch(&dsid));
54%let rc = %sysfunc(close(&dsid));
55
56/* Return result */
57%if "%trim(&name)"="%trim(&ds)" %then 1;
58%else 0;
59
60%mend mfv_existsashdat;