Macros for SAS Application Developers
https://github.com/sasjs/core
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;