1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-11 06:24:35 +00:00

Compare commits

...

10 Commits

Author SHA1 Message Date
Allan Bowe
b9fd79bd5e fix: debugging in mm_assignlib 2020-12-25 16:58:30 +00:00
Allan Bowe
1beb30d0ff fix: updating <h4> Dependencies </h4> in header to be <h4> SAS Macros </h4> in line with the updated SASjs compilation process (which distinguishes between SAS Macro and SAS Program dependencies)
BREAKING CHANGE - this doesn't break anything in the framework but I know of at least one old project that uses the <h4> Dependencies </h4> tag to perform backend compilation, so am bumping the version to be safe (looking at you, Chris
2020-12-25 10:36:19 +00:00
Allan Bowe
e334ea9b85 chore: all.sas update 2020-12-25 10:22:44 +00:00
Allan Bowe
c090c8d53b feat: simple macro to test the write speed for a library (very very basic) 2020-12-25 10:18:02 +00:00
Allan Bowe
659339bd98 fix: more comments in mp_prevobs 2020-12-25 10:15:03 +00:00
Allan Bowe
4c333ae7b3 feat: mp_prevobs.sas macro 2020-12-23 00:33:59 +00:00
b3a8b4323e fix: adding new mp_ds2csv macro 2020-12-16 17:11:31 +01:00
0592206f2d patch: doxy formatting 2020-12-03 22:44:08 +01:00
bedc2a443a fix: @cond on new line to prevent parsing issues in sasjs cli 2020-12-02 08:09:51 +01:00
6f86ed62a2 chore: doxy formatting 2020-11-29 22:03:20 +01:00
74 changed files with 764 additions and 330 deletions

View File

@@ -91,7 +91,25 @@ The **Macro Core** documentation is created using [doxygen](http://www.doxygen.n
- version. The EARLIEST SAS version in which this macro is known to work.
- author. Author name, contact details optional
All macros must be commented in the doxygen format, to enable the [online documentation](https://sasjs.github.io/core.github.io/).
All macros must be commented in the doxygen format, to enable the [online documentation](https://core.sasjs.io).
### Dependencies
SAS code can contain one of two types of dependency - SAS Macros, and SAS Programs. When compiling projects using the [SASjs CLI](https://cli.sasjs.io) the doxygen header is scanned for ` @li` items under the following headers:
```
<h4> SAS Macros </h4>
@li mf_nobs.sas
@li mm_assignlib.sas
<h4> SAS Programs </h4>
@li somefile.ddl SOMEFREF
@li someprogram.sas FREFTWO
```
The CLI can then extract all the dependencies and insert as precode (SAS Macros) or in a temp engine fileref (SAS Programs) when creating SAS Jobs and Services.
When contributing to this library, it is therefore important to ensure that all dependencies are listed in the header in this format.
## Coding Standards
@@ -102,6 +120,7 @@ All macros must be commented in the doxygen format, to enable the [online docume
- Mandatory parameters should be positional, all optional parameters should be keyword (var=) style.
- All dataset references must be 2 level (eg `work.blah`, not `blah`). This is to avoid contention when options [DATASTMTCHK](https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000279064.htm)=ALLKEYWORDS is in effect.
- Avoid naming collisions! All macro variables should be local scope. Use system generated work tables where possible - eg `data ; set sashelp.class; run; data &output; set &syslast; run;`
- If you have a long-running SQL query, the use of a `quit;` statement is recommended in order to benefit from the timing statistics.
# General Notes

533
all.sas

File diff suppressed because it is too large Load Diff

View File

@@ -21,7 +21,8 @@
@version 9.2
@author Allan Bowe
**/ /** @cond */
@cond
**/
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
)/*/STORE SOURCE*/;

View File

@@ -13,13 +13,14 @@
@return output returns 1 or 0 (or -1 if not found)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getplatform.sas
@version 8
@author Allan Bowe
**/ /** @cond */
**/
/** @cond */
%macro mf_existfeature(feature
)/*/STORE SOURCE*/;

View File

@@ -11,7 +11,8 @@
@param var (positional) - variable name
@version 9.2
@author Allan Bowe
**/ /** @cond */
**/
/** @cond */
%macro mf_existvar(libds /* 2 part dataset name */
, var /* variable name */

View File

@@ -6,7 +6,7 @@
%put %mf_existVarList(sashelp.class, age sex name dummyvar)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_abort.sas
@param libds 2 part dataset or view reference
@@ -14,6 +14,7 @@
@version 9.2
@author Allan Bowe
@cond
**/
%macro mf_existvarlist(libds, varlist
@@ -53,4 +54,6 @@
0
%put Vars not found: &found;
%end;
%mend;
%mend;
/** @endcond */

View File

@@ -22,7 +22,8 @@
@version 9.2
@author Allan Bowe
**/ /** @cond */
**/
/** @cond */
%macro mf_getengine(libref
)/*/STORE SOURCE*/;

View File

@@ -10,7 +10,7 @@
@param switch the param for which to return a platform specific variable
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_mval.sas
@li mf_trimstr.sas

View File

@@ -17,6 +17,7 @@
@version 9.2
@author Allan Bowe
@cond
**/
%macro mf_getschema(libref
@@ -38,3 +39,5 @@
&schema
%mend;
/** @endcond */

View File

@@ -7,7 +7,7 @@
%put %mf_getvalue(sashelp.class,name,filter=%quote(age=15));
%put %mf_getvalue(sashelp.class,name);
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getattrn.sas
@param libds dataset to query

View File

@@ -6,7 +6,7 @@
%put Number of observations=%mf_nobs(sashelp.class);
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getattrn.sas
@param libds library.dataset

View File

@@ -8,7 +8,7 @@
%put %mf_trimstr(/blah/,h); * /blah/;
%put %mf_trimstr(/blah/,h/);* /bla;
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@param basestr The string to be modified

View File

@@ -11,7 +11,7 @@
Returns:
> 1
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_abort.sas
@param verifyvars space separated list of macro variable names

View File

@@ -5,11 +5,11 @@
the particulars of an environment. For instance, can stream custom
results back to the client in an STP Web App context, or completely stop
in the case of a batch run.
Using SAS Abort Cancel mechanisms can cause hung sessions in some Stored Process
environments. This macro takes a unique approach - we set the SAS syscc to 0,
run `stpsrvset('program error', 0)` (if SAS 9) and then - we open a macro
but don't close it! This provides a graceful abort for SAS web services in all
run `stpsrvset('program error', 0)` (if SAS 9) and then - we open a macro
but don't close it! This provides a graceful abort for SAS web services in all
web enabled environments.
@param mac= to contain the name of the calling macro
@@ -18,6 +18,7 @@
@version 9.4M3
@author Allan Bowe
@cond
**/
%macro mp_abort(mac=mp_abort.sas, type=, msg=, iftrue=%str(1=1)
@@ -30,7 +31,7 @@
%put NOTE - &msg;
/* Stored Process Server web app context */
%if %symexist(_metaperson)
%if %symexist(_metaperson)
or (%symexist(SYSPROCESSNAME) and "&SYSPROCESSNAME"="Compute Server" )
%then %do;
options obs=max replace nosyntaxcheck mprint;
@@ -151,3 +152,4 @@
%end;
%mend;
/** @endcond */

View File

@@ -8,6 +8,7 @@
applying CRLF line endings and converting embedded cr and crlf to lf.
usage:
fileref mycsv "/path/your/csv";
%mp_cleancsv(in=mycsv,out=/path/new.csv)
@@ -17,6 +18,7 @@
@version 9.2
@author Allan Bowe
@cond
**/
%macro mp_cleancsv(in=NOTPROVIDED,out=NOTPROVIDED,qchar='22'x);
@@ -65,4 +67,5 @@
else put inchar $char1.;
end;
run;
%mend;
%mend;
/** @endcond */

View File

@@ -22,7 +22,7 @@
@param outds= a table containing the create statements (create_statement column)
@param execute= `YES|NO` - default is NO. To actually create, use YES.
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@version 9.2
@author Allan Bowe

View File

@@ -26,7 +26,7 @@ Usage:
;;;;
%mp_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getplatform.sas
@li mm_createwebservice.sas
@li mv_createwebservice.sas

View File

@@ -29,7 +29,7 @@
@version 9.2
@author Allan Bowe
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_existds.sas

View File

@@ -9,7 +9,7 @@
create view view2 as select * from sashelp.class;
%mp_dropmembers(list=data1 view2)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_isblank.sas

58
base/mp_ds2csv.sas Normal file
View File

@@ -0,0 +1,58 @@
/**
@file
@brief Export a dataset to a CSV file
@details Export to a file or a fileref
Usage:
%mp_ds2csv(sashelp.class,outref="%sysfunc(pathname(work))/file.csv")
@param ds The dataset to be exported
@param outfile= The output filename - should be quoted.
@param outref= The output fileref (takes precedence if provided)
@param outencoding= The output encoding to use (unquoted)
@version 9.2
@author Allan Bowe (credit mjsq)
**/
%macro mp_ds2csv(ds, outref=0, outfile=, outencoding=0
)/*/STORE SOURCE*/;
%if not %sysfunc(exist(&ds)) %then %do;
%put WARNING: &ds does not exist;
%return;
%end;
%if %index(&ds,.)=0 %then %let ds=WORK.&ds;
%if &outencoding=0 %then %let outencoding=;
%else %let outencoding=encoding="&outencoding";
%local outloc;
%if &outref=0 %then %let outloc=&outfile;
%else %let outloc=&outref;
/* credit to mjsq - https://stackoverflow.com/a/55642267 */
/* first get headers */
data _null_;
file &outloc dlm=',' dsd &outencoding lrecl=32767;
length header $ 2000;
dsid=open("&ds.","i");
num=attrn(dsid,"nvars");
do i=1 to num;
header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
put header @;
end;
rc=close(dsid);
run;
/* next, export data */
data _null_;
set &ds.;
file &outloc mod dlm=',' dsd &outencoding lrecl=32767;
put (_all_) (+0);
run;
%mend;

View File

@@ -21,7 +21,7 @@
@param ds= The target dataset. Leave blank (default) for all datasets.
@param outds the output dataset
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@version 9.2
@author Allan Bowe

View File

@@ -16,6 +16,8 @@
You may need to adjust the rendered DBML to suit your needs.
![dbml for sas](https://i.imgur.com/8T1tIZp.gif)
<h4> SAS Macros </h4>
@li mf_getquotedstr.sas

View File

@@ -15,7 +15,7 @@
proc sql; describe table &syslast;
%mp_getddl(work,test,flavour=tsql,showlog=YES)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_getconstraints.sas
@param lib libref of the library to create DDL for. Should be assigned.

View File

@@ -21,7 +21,7 @@
@param libds Two part dataset (or view) reference.
@param outds= The output dataset to create
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getvarlist.sas
@li mf_getvartype.sas
@li mf_getvarformat.sas

View File

@@ -22,7 +22,7 @@
@param min_rows= The minimum number of rows a table should have in order to try
and guess the PK. Default=5.
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getvarlist.sas
@li mf_getuniquename.sas
@li mf_nobs.sas

View File

@@ -8,7 +8,7 @@
%mp_lib2cards(lib=sashelp
, outloc= C:\temp )
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_mkdir.sas
@li mp_ds2cards.sas

88
base/mp_prevobs.sas Normal file
View File

@@ -0,0 +1,88 @@
/**
@file
@brief Enables previous observations to be re-instated
@details Remembers the last X observations by storing them in a hash table.
Is a convenience over the use of lag() or retain, when an entire observation
needs to be restored.
This macro will also restore automatic variables (such as _n_ and _error_).
Example Usage:
data example;
set sashelp.class;
calc_var=_n_*3;
%* initialise hash and save from PDV ;
%mp_prevobs(INIT,history=2)
if _n_ =10 then do;
%* fetch previous but 1 record;
%mp_prevobs(FETCH,-2)
put _n_= name= age= calc_var=;
%* fetch previous record;
%mp_prevobs(FETCH,-1)
put _n_= name= age= calc_var=;
%* reinstate current record ;
%mp_prevobs(FETCH,0)
put _n_= name= age= calc_var=;
end;
run;
Result:
<img src="https://imgur.com/PSjHoET.png" alt="mp_prevobs sas" width="400"/>
Credit is made to `data _null_` for authoring this very helpful paper:
https://www.lexjansen.com/pharmasug/2008/cc/CC08.pdf
@param action Either FETCH a current or previous record, or INITialise.
@param record The relative (to current) position of the previous observation
to return.
@param history= The number of records to retain in the hash table. Default=5
@param prefix= the prefix to give to the variables used to store the hash name
and index. Default=mp_prevobs
@version 9.2
@author Allan Bowe
**/
%macro mp_prevobs(action,record,history=5,prefix=mp_prevobs
)/*/STORE SOURCE*/;
%let action=%upcase(&action);
%let prefix=%upcase(&prefix);
%let record=%eval((&record+0) * -1);
%if &action=INIT %then %do;
if _n_ eq 1 then do;
attrib &prefix._VAR length=$64;
dcl hash &prefix._HASH(ordered:'Y');
&prefix._KEY=0;
&prefix._HASH.defineKey("&prefix._KEY");
do while(1);
call vnext(&prefix._VAR);
if &prefix._VAR='' then leave;
if &prefix._VAR eq "&prefix._VAR" then continue;
else if &prefix._VAR eq "&prefix._KEY" then continue;
&prefix._HASH.defineData(&prefix._VAR);
end;
&prefix._HASH.defineDone();
end;
/* this part has to happen before FETCHing */
&prefix._KEY+1;
&prefix._rc=&prefix._HASH.add();
if &prefix._rc then putlog 'adding' &prefix._rc=;
%if &history>0 %then %do;
if &prefix._key>&history+1 then
&prefix._HASH.remove(key: &prefix._KEY - &history - 1);
if &prefix._rc then putlog 'removing' &prefix._rc=;
%end;
%end;
%else %if &action=FETCH %then %do;
if &record > &prefix._key then putlog "Not enough records in &Prefix._hash yet";
else &prefix._rc=&prefix._HASH.find(key: &prefix._KEY - &record);
if &prefix._rc then putlog &prefix._rc= " when fetching " &prefix._KEY=
"with record &record and " _n_=;
%end;
%mend;

View File

@@ -25,7 +25,7 @@
@param outobs= set to a positive integer to restrict the number of observations
@param filter_text= add a (valid) filter clause to further filter the results
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getvarlist.sas
@li mf_getvartype.sas
@li mf_mkdir.sas

View File

@@ -6,7 +6,7 @@
%mp_setkeyvalue(someindex,22,type=N)
%mp_setkeyvalue(somenewindex,somevalue)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_existds.sas
@param key Provide a key on which to perform the lookup

View File

@@ -11,7 +11,7 @@
%mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getplatform.sas
@li mp_binarycopy.sas

View File

@@ -0,0 +1,59 @@
/**
@file mp_testwritespeedlibrary.sas
@brief Tests the write speed of a new table in a SAS library
@details Will create a new table of a certain size in an
existing SAS library. The table will have one column,
and will be subsequently deleted.
%mp_testwritespeedlibrary(
lib=work
,size=0.5
,outds=work.results
)
@param lib= (WORK) The library in which to create the table
@param size= (0.1) The size in GB of the table to create
@param outds= (WORK.RESULTS) The output dataset to be created.
<h4> SAS Macros </h4>
@li mf_getuniquename.sas
@li mf_existds.sas
@version 9.4
@author Allan Bowe
**/
%macro mp_testwritespeedlibrary(lib=WORK
,outds=work.results
,size=0.1
)/*/STORE SOURCE*/;
%local ds start;
/* find an unused, unique name for the new table */
%let ds=%mf_getuniquename();
%do %until(%mf_existds(&lib..&ds)=0);
%let ds=%mf_getuniquename();
%end;
%let start=%sysfunc(datetime());
data &lib..&ds(compress=no keep=x);
header=128*1024;
size=(1073741824/8 * &size) - header;
do x=1 to size;
output;
end;
run;
proc sql;
drop table &lib..&ds;
data &outds;
lib="&lib";
start_dttm=put(&start,datetime19.);
end_dttm=put(datetime(),datetime19.);
duration_seconds=end_dttm-start_dttm;
run;
%mend;

View File

@@ -12,7 +12,7 @@
%mp_unzip(ziploc="/some/file.zip",outdir=/some/folder)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_mkdir.sas
@li mf_getuniquefileref.sas

View File

@@ -18,7 +18,7 @@
@param var The variable to modify
@param len The new length to apply
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_existds.sas
@li mp_abort.sas
@li mf_existvar.sas

View File

@@ -12,7 +12,7 @@
be sure that _debug is not set (else the SPWA will send non zipped content
as well).
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_dirlist.sas
@param in= unquoted filepath, dataset of files or directory to zip

View File

@@ -13,6 +13,11 @@
* Not metadata aware
* No X command
* Prefixes: _mf_, _mp_
Macros starting `mf_` are macro _functions_ and can be used in assignment
statements. Those starting `mp_` are macro _procedures_, which generate
SAS statements, and must therefore be applied accordingly.
*/
/*! \dir meta

View File

@@ -14,7 +14,7 @@
disconnect from MyAlias;
quit;
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getengine.sas
@li mp_abort.sas

View File

@@ -10,7 +10,7 @@
%mm_assignlib(SOMEREF)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@param libref the libref (not name) of the metadata library
@@ -38,6 +38,7 @@
rc=metadata_getattr(liburi,"Name",LibName);
/* now try and assign it */
if libname("&libref",,'meta',cats('liburi="',liburi,'";')) ne 0 then do;
putlog "&libref could not be assigned";
call symputx('msg',sysmsg(),'l');
if "&mabort"='HARD' then call symputx('mp_abort',1,'l');
end;

View File

@@ -15,7 +15,7 @@
@warning application components do not get deleted when removing the container folder! be sure you have the administrative priviliges to remove this kind of metadata from the SMC plugin (or be ready to do to so programmatically).
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_verifymacvars.sas

View File

@@ -18,7 +18,7 @@
%mm_createdataset(tableuri=G5X8AFW1.BE00015Y)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mm_getlibs.sas
@li mm_gettables.sas
@li mm_getcols.sas

View File

@@ -12,7 +12,7 @@
%mm_createdocument(tree=/User Folders/sasdemo
,name=MyNote)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_verifymacvars.sas

View File

@@ -19,7 +19,7 @@
,directory=/tmp/tests
,mDebug=1)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_verifymacvars.sas
@li mm_createfolder.sas

View File

@@ -39,7 +39,7 @@
,Server=SASApp
,stptype=2)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_nobs.sas
@li mf_verifymacvars.sas
@li mm_getdirectories.sas

View File

@@ -24,7 +24,7 @@ Usage:
;;;;
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mm_createstp.sas
@li mf_getuser.sas
@li mm_createfolder.sas

View File

@@ -8,7 +8,7 @@
%mm_createdocument(tree=/User Folders/&sysuserid,name=MyNote)
%mm_deletedocument(target=/User Folders/&sysuserid/MyNote)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@param target= full path to the document being deleted

View File

@@ -7,7 +7,7 @@
%mm_deletestp(target=/some/meta/path/myStoredProcess)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@param target= full path to the STP being deleted

View File

@@ -7,7 +7,7 @@
@param outds= the ONE LEVEL work dataset to create
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mm_getobjects.sas
@li mf_getuniquefileref.sas
@li mm_getdetails.sas

View File

@@ -11,7 +11,7 @@
,outref=/some/unquoted/filename.ext
)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@param tree= The metadata path of the document

View File

@@ -14,7 +14,7 @@
@param outds= the dataset to create that contains the list of directories
@param mDebug= set to 1 to show debug messages in the log
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@version 9.4
@author Allan Bowe

View File

@@ -14,7 +14,7 @@
filename __mc2 clear;
libname __mc3 clear;
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mm_getrepos.sas
@version 9.3

View File

@@ -14,7 +14,7 @@
%mm_getstps(tree=/My Folder/My STPs, name=My STP)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mm_gettree.sas
@param tree= the metadata folder location in which to search. Leave blank

View File

@@ -45,7 +45,7 @@
./mmscript.sh "myuser" "mypass"
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_loc.sas
@li mm_tree.sas
@li mf_getuniquefileref.sas

View File

@@ -46,7 +46,7 @@
Table
,outds=morestuff)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_getquotedstr.sas
@li mm_getpublictypes.sas
@li mf_isblank.sas

View File

@@ -8,7 +8,7 @@
%mm_updatestpservertype(target=/some/meta/path/myStoredProcess
,type=WKS)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@param target= full path to the STP being deleted
@param type= Either WKS or STP depending on whether Workspace or Stored Process

View File

@@ -9,7 +9,7 @@
%mmx_deletemetafolder(loc=/some/meta/folder,user=sasdemo,pass=mars345)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_loc.sas
@param loc= the metadata folder to delete

View File

@@ -25,7 +25,7 @@ Usage:
,outspkpath=%str(/tmp)
)
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mf_loc.sas
@li mm_tree.sas
@li mf_getuniquefileref.sas

View File

@@ -15,10 +15,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getuniquefileref.sas
@li mf_getuniquelibref.sas
@@ -42,7 +41,7 @@
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -121,7 +120,7 @@ options noquotelenmax;
out=&fname2
&oauth_bearer
url=%unquote(%superq(href));
headers
headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;

View File

@@ -1,34 +1,35 @@
/**
@file mv_createwebservice.sas
@brief Creates a JobExecution web service if it doesn't already exist
@details Code is passed in as one or more filerefs.
@details
Code is passed in as one or more filerefs.
%* Step 1 - compile macros ;
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
%* Step 1 - compile macros ;
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
%* Step 2 - Create some code and add it to a web service;
filename ft15f001 temp;
parmcards4;
%webout(FETCH) %* fetch any tables sent from frontend;
%* do some sas, any inputs are now already WORK tables;
data example1 example2;
set sashelp.class;
run;
%* send data back;
%webout(OPEN)
%webout(ARR,example1) * Array format, fast, suitable for large tables ;
%webout(OBJ,example2) * Object format, easier to work with ;
%webout(CLOSE)
;;;;
%mv_createwebservice(path=/Public/app/common,name=appinit)
%* Step 2 - Create some code and add it to a web service;
filename ft15f001 temp;
parmcards4;
%webout(FETCH) %* fetch any tables sent from frontend;
%* do some sas, any inputs are now already WORK tables;
data example1 example2;
set sashelp.class;
run;
%* send data back;
%webout(OPEN)
%webout(ARR,example1) * Array format, fast, suitable for large tables ;
%webout(OBJ,example2) * Object format, easier to work with ;
%webout(CLOSE)
;;;;
%mv_createwebservice(path=/Public/app/common,name=appinit)
Notes:
To minimise postgres requests, output json is stored in a temporary file
and then sent to _webout in one go at the end.
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mv_createfolder.sas
@li mf_getuniquelibref.sas
@@ -54,8 +55,7 @@
a shared context - see https://go.documentation.sas.com/?docsetId=calcontexts&docsetTarget=n1hjn8eobk5pyhn1wg3ja0drdl6h.htm&docsetVersion=3.5&locale=en
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
**/

View File

@@ -1,7 +1,7 @@
/**
@file mv_deletefoldermember.sas
@brief Deletes an item in a Viya folder
@details If not executed in Studio 5+ will expect oauth token in a global
@details If not executed in Studio 5+ will expect oauth token in a global
macro variable (default ACCESS_TOKEN).
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
@@ -20,10 +20,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -48,7 +47,7 @@
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -129,7 +128,7 @@ run;
%return;
%end;
proc http method="DELETE" url="&base_uri&uri" &oauth_bearer;
headers
headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;

View File

@@ -1,7 +1,7 @@
/**
@file mv_deletejes.sas
@brief Creates a job execution service if it does not already exist
@details If not executed in Studio 5+ will expect oauth token in a global
@details If not executed in Studio 5+ will expect oauth token in a global
macro variable (default ACCESS_TOKEN).
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
@@ -19,10 +19,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -46,7 +45,7 @@
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -126,7 +125,7 @@ run;
%return;
%end;
proc http method="DELETE" url="&uri" &oauth_bearer;
headers
headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;

View File

@@ -1,7 +1,7 @@
/**
@file mv_deleteviyafolder.sas
@brief Creates a viya folder if that folder does not already exist
@details If not running in Studo 5 +, will expect an oauth token in a global
@details If not running in Studo 5 +, will expect an oauth token in a global
macro variable (default ACCESS_TOKEN).
options mprint;
@@ -16,10 +16,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -42,7 +41,7 @@
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -121,10 +120,10 @@ run;
%let fname2=%mf_getuniquefileref();
proc http method='DELETE' out=&fname2 &oauth_bearer
url=%unquote(%superq(href));
headers
headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;
%end;
'Accept'='*/*'; /**/
run;
%if &SYS_PROCHTTP_STATUS_CODE ne 204 %then %do;

View File

@@ -3,14 +3,13 @@
@brief deprecated - replaced by mv_tokenrefresh.sas
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
<h4> Dependencies </h4>
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> SAS Macros </h4>
@li mv_tokenrefresh.sas
**/
%macro mv_getaccesstoken(client_id=someclient
,client_secret=somesecret
,grant_type=authorization_code

View File

@@ -3,14 +3,13 @@
@brief deprecated - replaced by mv_registerclient.sas
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
<h4> Dependencies </h4>
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> SAS Macros </h4>
@li mv_registerclient.sas
**/
%macro mv_getapptoken(client_id=someclient
,client_secret=somesecret
,grant_type=authorization_code

View File

@@ -29,10 +29,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -95,7 +94,7 @@ run;
/* clear refs
/* clear refs
filename &fname1 clear;
libname &libref1 clear;
*/

View File

@@ -15,10 +15,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas

View File

@@ -30,10 +30,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -56,7 +55,7 @@
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -73,7 +72,7 @@ options noquotelenmax;
%let fname1=%mf_getuniquefileref();
proc http method='GET' out=&fname1 &oauth_bearer
url="&base_uri/identities/groups/&group/members?limit=10000";
headers
headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;

View File

@@ -29,10 +29,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -54,7 +53,7 @@
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname
@@ -72,7 +71,7 @@ options noquotelenmax;
proc http method='GET' out=&fname1 &oauth_bearer
url="&base_uri/identities/groups?limit=10000";
headers
headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;

View File

@@ -3,14 +3,13 @@
@brief deprecated - replaced by mv_tokenauth.sas
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
<h4> Dependencies </h4>
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> SAS Macros </h4>
@li mv_tokenauth.sas
**/
%macro mv_getrefreshtoken(client_id=someclient
,client_secret=somesecret
,grant_type=authorization_code

View File

@@ -20,10 +20,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas

View File

@@ -34,12 +34,12 @@
creationTimeStamp char(24),
modifiedTimeStamp char(24),
state char(6)
@param access_token_var= The global macro variable to contain the access token
@param grant_type= valid values:
* password
* authorization_code
* detect - will check if access_token exists, if not will use sas_services if
* detect - will check if access_token exists, if not will use sas_services if
a SASStudioV session else authorization_code. Default option.
* sas_services - will use oauth_bearer=sas_services
@@ -47,10 +47,9 @@
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -72,7 +71,7 @@
%let &access_token_var=;
%end;
%put &sysmacroname: grant_type=&grant_type;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services
)
,mac=&sysmacroname

View File

@@ -18,7 +18,7 @@
Example with parameters:
%mv_jobexecute(path=/Public/folder
%mv_jobexecute(path=/Public/folder
,name=somejob
,paramstring=%str("macvarname":"macvarvalue","answer":42)
)
@@ -45,7 +45,7 @@
@version VIYA V.03.04
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas

View File

@@ -35,27 +35,26 @@
@param scopes= list of space-seperated unquoted scopes (default is openid)
@param grant_type= valid values are "password" or "authorization_code" (unquoted)
@param outds= the dataset to contain the registered client id and secret
@param access_token_validity= The duration of validity of the access token
@param access_token_validity= The duration of validity of the access token
in seconds. A value of DEFAULT will omit the entry (and use system default)
@param refresh_token_validity= The duration of validity of the refresh token
in seconds. A value of DEFAULT will omit the entry (and use system default)
@param name= A human readable name for the client
@param required_user_groups= A list of group names. If a user does not belong
to all the required groups, the user will not be authenticated and no tokens
are issued to this client for that user. If this field is not specified,
@param required_user_groups= A list of group names. If a user does not belong
to all the required groups, the user will not be authenticated and no tokens
are issued to this client for that user. If this field is not specified,
authentication and token issuance proceeds normally.
@param autoapprove= During the auth step the user can choose which scope to
@param autoapprove= During the auth step the user can choose which scope to
apply. Setting this to true will autoapprove all the client scopes.
@param use_session= If true, access tokens issued to this client will be
@param use_session= If true, access tokens issued to this client will be
associated with an HTTP session and revoked upon logout or time-out.
@param outjson= A dataset containing the lines of JSON submitted. Useful
for debugging. Default= _null_.
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
<h4> Dependencies </h4>
@version VIYA V.03.04
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas
@@ -143,7 +142,7 @@ data _null_;
if not missing(autoapprove) then autoapprove=cats(',"autoapprove":',autoapprove);
use_session=trim(symget('use_session'));
if not missing(use_session) then use_session=cats(',"use_session":',use_session);
put '{' clientid ;
put clientsecret ;
put clientname;

View File

@@ -41,10 +41,9 @@
@param base_uri= The Viya API server location
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas

View File

@@ -40,10 +40,9 @@
@param refresh_token_var= The global macro variable containing the refresh token
@version VIYA V.03.04
@author Allan Bowe
@source https://github.com/sasjs/core
@author Allan Bowe, source: https://github.com/sasjs/core
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_abort.sas
@li mf_getplatform.sas
@li mf_getuniquefileref.sas

View File

@@ -27,18 +27,18 @@
@param dslabel= value to use instead of the real name for sending to JSON
@param fmt= change to N to strip formats from output
<h4> Dependencies </h4>
<h4> SAS Macros </h4>
@li mp_jsonout.sas
@li mf_getuser.sas
@version Viya 3.3
@author Allan Bowe
@author Allan Bowe, source: https://github.com/sasjs/core
**/
%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y);
%global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name
sasjs_tables SYS_JES_JOB_URI;
%if %index("&_debug",log) %then %let _debug=131;
%if %index("&_debug",log) %then %let _debug=131;
%local i tempds;
%let action=%upcase(&action);
@@ -144,8 +144,8 @@
filename _webout temp lrecl=999999 mod;
%end;
%else %do;
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
name="_webout.json" lrecl=999999 mod;
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
name="_webout.json" lrecl=999999 mod;
%end;
/* setup temp ref */