mirror of
https://github.com/sasjs/core.git
synced 2025-12-12 15:04:36 +00:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1beb30d0ff | ||
|
|
e334ea9b85 | ||
|
|
c090c8d53b | ||
|
|
659339bd98 | ||
|
|
4c333ae7b3 | ||
| b3a8b4323e | |||
| 0592206f2d | |||
| bedc2a443a | |||
| 6f86ed62a2 | |||
| def0cc8476 | |||
| 3a9029557e | |||
| 9dc3bcd513 | |||
| 2bcf6346ac | |||
| 0eccc169f5 | |||
| 493639fe4a | |||
| 4987d2fbbc | |||
| 1a35b357d6 |
2
LICENSE
2
LICENSE
@@ -1,4 +1,4 @@
|
|||||||
Copyright 2018 (Allan Bowe)
|
Copyright 2020 (Allan Bowe)
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
|||||||
21
README.md
21
README.md
@@ -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.
|
- version. The EARLIEST SAS version in which this macro is known to work.
|
||||||
- author. Author name, contact details optional
|
- 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
|
## 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.
|
- 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.
|
- 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;`
|
- 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
|
# General Notes
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
|
%macro mf_abort(mac=mf_abort.sas, type=, msg=, iftrue=%str(1=1)
|
||||||
@@ -139,3 +140,5 @@
|
|||||||
%abort cancel;
|
%abort cancel;
|
||||||
%end;
|
%end;
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/**
|
/**
|
||||||
@file mf_existfeature.sas
|
@file
|
||||||
@brief Checks whether a feature exists
|
@brief Checks whether a feature exists
|
||||||
@details Check to see if a feature is supported in your environment.
|
@details Check to see if a feature is supported in your environment.
|
||||||
Run without arguments to see a list of detectable features.
|
Run without arguments to see a list of detectable features.
|
||||||
@@ -7,19 +7,20 @@
|
|||||||
actual feature detection, as that is tricky / impossible to do
|
actual feature detection, as that is tricky / impossible to do
|
||||||
without generating errors in most cases.
|
without generating errors in most cases.
|
||||||
|
|
||||||
%put %mf_existfeature(PROCLUA);
|
%put %mf_existfeature(PROCLUA);
|
||||||
|
|
||||||
@param feature the feature to detect. Leave blank to list all in log.
|
@param feature the feature to detect. Leave blank to list all in log.
|
||||||
|
|
||||||
@return output returns 1 or 0 (or -1 if not found)
|
@return output returns 1 or 0 (or -1 if not found)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
|
|
||||||
|
|
||||||
@version 8
|
@version 8
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
**/
|
**/
|
||||||
|
/** @cond */
|
||||||
|
|
||||||
%macro mf_existfeature(feature
|
%macro mf_existfeature(feature
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
@@ -39,4 +40,6 @@
|
|||||||
-1
|
-1
|
||||||
%put &sysmacroname: &feature not found;
|
%put &sysmacroname: &feature not found;
|
||||||
%end;
|
%end;
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
**/
|
**/
|
||||||
|
/** @cond */
|
||||||
|
|
||||||
%macro mf_existvar(libds /* 2 part dataset name */
|
%macro mf_existvar(libds /* 2 part dataset name */
|
||||||
, var /* variable name */
|
, var /* variable name */
|
||||||
@@ -29,4 +30,6 @@
|
|||||||
%let rc=%sysfunc(close(&dsid));
|
%let rc=%sysfunc(close(&dsid));
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
%put %mf_existVarList(sashelp.class, age sex name dummyvar)
|
%put %mf_existVarList(sashelp.class, age sex name dummyvar)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_abort.sas
|
@li mf_abort.sas
|
||||||
|
|
||||||
@param libds 2 part dataset or view reference
|
@param libds 2 part dataset or view reference
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mf_existvarlist(libds, varlist
|
%macro mf_existvarlist(libds, varlist
|
||||||
@@ -53,4 +54,6 @@
|
|||||||
0
|
0
|
||||||
%put Vars not found: &found;
|
%put Vars not found: &found;
|
||||||
%end;
|
%end;
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
/** @cond */
|
||||||
|
|
||||||
%macro mf_getengine(libref
|
%macro mf_getengine(libref
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
@@ -42,4 +43,6 @@
|
|||||||
|
|
||||||
&engine
|
&engine
|
||||||
|
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
@param switch the param for which to return a platform specific variable
|
@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_mval.sas
|
||||||
@li mf_trimstr.sas
|
@li mf_trimstr.sas
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mf_getschema(libref
|
%macro mf_getschema(libref
|
||||||
@@ -38,3 +39,5 @@
|
|||||||
&schema
|
&schema
|
||||||
|
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
/**
|
/**
|
||||||
@file
|
@file
|
||||||
@brief Assigns and returns an unused fileref
|
@brief Assigns and returns an unused fileref
|
||||||
@details Use as follows:
|
@details
|
||||||
|
Use as follows:
|
||||||
|
|
||||||
%let fileref1=%mf_getuniquefileref();
|
%let fileref1=%mf_getuniquefileref();
|
||||||
%let fileref2=%mf_getuniquefileref();
|
%let fileref2=%mf_getuniquefileref();
|
||||||
%put &fileref1 &fileref2;
|
%put &fileref1 &fileref2;
|
||||||
|
|
||||||
which returns:
|
which returns:
|
||||||
|
|
||||||
> mcref0 mcref1
|
> mcref0 mcref1
|
||||||
|
|
||||||
@prefix= first part of fileref. Remember that filerefs can only be 8
|
@param prefix= first part of fileref. Remember that filerefs can only be 8
|
||||||
characters, so a 7 letter prefix would mean that `maxtries` should be 10.
|
characters, so a 7 letter prefix would mean that `maxtries` should be 10.
|
||||||
@param maxtries= the last part of the libref. Provide an integer value.
|
@param maxtries= the last part of the libref. Provide an integer value.
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
> mclib3
|
> mclib3
|
||||||
|
|
||||||
@prefix= first part of libref. Remember that librefs can only be 8 characters,
|
@param prefix= first part of libref. Remember that librefs can only be 8 characters,
|
||||||
so a 7 letter prefix would mean that maxtries should be 10.
|
so a 7 letter prefix would mean that maxtries should be 10.
|
||||||
@param maxtries= the last part of the libref. Provide an integer value.
|
@param maxtries= the last part of the libref. Provide an integer value.
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
%put %mf_getvalue(sashelp.class,name,filter=%quote(age=15));
|
%put %mf_getvalue(sashelp.class,name,filter=%quote(age=15));
|
||||||
%put %mf_getvalue(sashelp.class,name);
|
%put %mf_getvalue(sashelp.class,name);
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getattrn.sas
|
@li mf_getattrn.sas
|
||||||
|
|
||||||
@param libds dataset to query
|
@param libds dataset to query
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
%put Number of observations=%mf_nobs(sashelp.class);
|
%put Number of observations=%mf_nobs(sashelp.class);
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getattrn.sas
|
@li mf_getattrn.sas
|
||||||
|
|
||||||
@param libds library.dataset
|
@param libds library.dataset
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
%put %mf_trimstr(/blah/,h); * /blah/;
|
%put %mf_trimstr(/blah/,h); * /blah/;
|
||||||
%put %mf_trimstr(/blah/,h/);* /bla;
|
%put %mf_trimstr(/blah/,h/);* /bla;
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
|
|
||||||
@param basestr The string to be modified
|
@param basestr The string to be modified
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
Returns:
|
Returns:
|
||||||
> 1
|
> 1
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_abort.sas
|
@li mf_abort.sas
|
||||||
|
|
||||||
@param verifyvars space separated list of macro variable names
|
@param verifyvars space separated list of macro variable names
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
the particulars of an environment. For instance, can stream custom
|
the particulars of an environment. For instance, can stream custom
|
||||||
results back to the client in an STP Web App context, or completely stop
|
results back to the client in an STP Web App context, or completely stop
|
||||||
in the case of a batch run.
|
in the case of a batch run.
|
||||||
|
|
||||||
Using SAS Abort Cancel mechanisms can cause hung sessions in some Stored Process
|
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,
|
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
|
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
|
but don't close it! This provides a graceful abort for SAS web services in all
|
||||||
web enabled environments.
|
web enabled environments.
|
||||||
|
|
||||||
@param mac= to contain the name of the calling macro
|
@param mac= to contain the name of the calling macro
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
@version 9.4M3
|
@version 9.4M3
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mp_abort(mac=mp_abort.sas, type=, msg=, iftrue=%str(1=1)
|
%macro mp_abort(mac=mp_abort.sas, type=, msg=, iftrue=%str(1=1)
|
||||||
@@ -30,7 +31,7 @@
|
|||||||
%put NOTE - &msg;
|
%put NOTE - &msg;
|
||||||
|
|
||||||
/* Stored Process Server web app context */
|
/* Stored Process Server web app context */
|
||||||
%if %symexist(_metaperson)
|
%if %symexist(_metaperson)
|
||||||
or (%symexist(SYSPROCESSNAME) and "&SYSPROCESSNAME"="Compute Server" )
|
or (%symexist(SYSPROCESSNAME) and "&SYSPROCESSNAME"="Compute Server" )
|
||||||
%then %do;
|
%then %do;
|
||||||
options obs=max replace nosyntaxcheck mprint;
|
options obs=max replace nosyntaxcheck mprint;
|
||||||
@@ -151,3 +152,4 @@
|
|||||||
%end;
|
%end;
|
||||||
%mend;
|
%mend;
|
||||||
|
|
||||||
|
/** @endcond */
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
applying CRLF line endings and converting embedded cr and crlf to lf.
|
applying CRLF line endings and converting embedded cr and crlf to lf.
|
||||||
|
|
||||||
usage:
|
usage:
|
||||||
|
|
||||||
fileref mycsv "/path/your/csv";
|
fileref mycsv "/path/your/csv";
|
||||||
%mp_cleancsv(in=mycsv,out=/path/new.csv)
|
%mp_cleancsv(in=mycsv,out=/path/new.csv)
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@
|
|||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
@cond
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mp_cleancsv(in=NOTPROVIDED,out=NOTPROVIDED,qchar='22'x);
|
%macro mp_cleancsv(in=NOTPROVIDED,out=NOTPROVIDED,qchar='22'x);
|
||||||
@@ -65,4 +67,5 @@
|
|||||||
else put inchar $char1.;
|
else put inchar $char1.;
|
||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
%mend;
|
%mend;
|
||||||
|
/** @endcond */
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
@param outds= a table containing the create statements (create_statement column)
|
@param outds= a table containing the create statements (create_statement column)
|
||||||
@param execute= `YES|NO` - default is NO. To actually create, use YES.
|
@param execute= `YES|NO` - default is NO. To actually create, use YES.
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ Usage:
|
|||||||
;;;;
|
;;;;
|
||||||
%mp_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES)
|
%mp_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mm_createwebservice.sas
|
@li mm_createwebservice.sas
|
||||||
@li mv_createwebservice.sas
|
@li mv_createwebservice.sas
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_existds.sas
|
@li mf_existds.sas
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
create view view2 as select * from sashelp.class;
|
create view view2 as select * from sashelp.class;
|
||||||
%mp_dropmembers(list=data1 view2)
|
%mp_dropmembers(list=data1 view2)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_isblank.sas
|
@li mf_isblank.sas
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
58
base/mp_ds2csv.sas
Normal file
58
base/mp_ds2csv.sas
Normal 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;
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
@param ds= The target dataset. Leave blank (default) for all datasets.
|
@param ds= The target dataset. Leave blank (default) for all datasets.
|
||||||
@param outds the output dataset
|
@param outds the output dataset
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|||||||
@@ -16,9 +16,12 @@
|
|||||||
|
|
||||||
You may need to adjust the rendered DBML to suit your needs.
|
You may need to adjust the rendered DBML to suit your needs.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getquotedstr.sas
|
@li mf_getquotedstr.sas
|
||||||
|
@li mp_getconstraints.sas
|
||||||
|
|
||||||
@param liblist= Space seperated list of librefs to take as
|
@param liblist= Space seperated list of librefs to take as
|
||||||
input (Default=SASHELP)
|
input (Default=SASHELP)
|
||||||
@@ -255,7 +258,10 @@ run;
|
|||||||
data &pkds.4;
|
data &pkds.4;
|
||||||
file &outref mod;
|
file &outref mod;
|
||||||
set &pkds.2(where=(cols="&pkcols" and curds not in (&curdslist)));
|
set &pkds.2(where=(cols="&pkcols" and curds not in (&curdslist)));
|
||||||
line='Ref: "'!!"&curds"!!cats('".(',cols,')')!!' - '!!cats(quote(trim(curds)),'.(',cols,')');
|
line='Ref: "'!!"&curds"
|
||||||
|
!!cats('".(',"%mf_getquotedstr(&pkcols,dlm=%str(,),quote=%str( ))",')')
|
||||||
|
!!' - '
|
||||||
|
!!cats(quote(trim(curds)),'.(',"%mf_getquotedstr(&pkcols,dlm=%str(,),quote=%str( ))",')');
|
||||||
put line;
|
put line;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
proc sql; describe table &syslast;
|
proc sql; describe table &syslast;
|
||||||
%mp_getddl(work,test,flavour=tsql,showlog=YES)
|
%mp_getddl(work,test,flavour=tsql,showlog=YES)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_getconstraints.sas
|
@li mp_getconstraints.sas
|
||||||
|
|
||||||
@param lib libref of the library to create DDL for. Should be assigned.
|
@param lib libref of the library to create DDL for. Should be assigned.
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
@param libds Two part dataset (or view) reference.
|
@param libds Two part dataset (or view) reference.
|
||||||
@param outds= The output dataset to create
|
@param outds= The output dataset to create
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getvarlist.sas
|
@li mf_getvarlist.sas
|
||||||
@li mf_getvartype.sas
|
@li mf_getvartype.sas
|
||||||
@li mf_getvarformat.sas
|
@li mf_getvarformat.sas
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
@param min_rows= The minimum number of rows a table should have in order to try
|
@param min_rows= The minimum number of rows a table should have in order to try
|
||||||
and guess the PK. Default=5.
|
and guess the PK. Default=5.
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getvarlist.sas
|
@li mf_getvarlist.sas
|
||||||
@li mf_getuniquename.sas
|
@li mf_getuniquename.sas
|
||||||
@li mf_nobs.sas
|
@li mf_nobs.sas
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
%mp_lib2cards(lib=sashelp
|
%mp_lib2cards(lib=sashelp
|
||||||
, outloc= C:\temp )
|
, outloc= C:\temp )
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_mkdir.sas
|
@li mf_mkdir.sas
|
||||||
@li mp_ds2cards.sas
|
@li mp_ds2cards.sas
|
||||||
|
|
||||||
|
|||||||
88
base/mp_prevobs.sas
Normal file
88
base/mp_prevobs.sas
Normal 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;
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
@param outobs= set to a positive integer to restrict the number of observations
|
@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
|
@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_getvarlist.sas
|
||||||
@li mf_getvartype.sas
|
@li mf_getvartype.sas
|
||||||
@li mf_mkdir.sas
|
@li mf_mkdir.sas
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
%mp_setkeyvalue(someindex,22,type=N)
|
%mp_setkeyvalue(someindex,22,type=N)
|
||||||
%mp_setkeyvalue(somenewindex,somevalue)
|
%mp_setkeyvalue(somenewindex,somevalue)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_existds.sas
|
@li mf_existds.sas
|
||||||
|
|
||||||
@param key Provide a key on which to perform the lookup
|
@param key Provide a key on which to perform the lookup
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
%mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt)
|
%mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mp_binarycopy.sas
|
@li mp_binarycopy.sas
|
||||||
|
|
||||||
|
|||||||
59
base/mp_testwritespeedlibrary.sas
Normal file
59
base/mp_testwritespeedlibrary.sas
Normal 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;
|
||||||
68
base/mp_tree.sas
Normal file
68
base/mp_tree.sas
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Recursively scans a directory tree to get all subfolders and content
|
||||||
|
@details
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mp_tree(dir=/tmp, outds=work.tree)
|
||||||
|
|
||||||
|
Credits:
|
||||||
|
|
||||||
|
* Roger Deangelis, https://communities.sas.com/t5/SAS-Programming/listing-all-files-within-a-directory-and-subdirectories/m-p/332616/highlight/true#M74887
|
||||||
|
* Tom, https://communities.sas.com/t5/SAS-Programming/listing-all-files-of-all-types-from-all-subdirectories/m-p/334113/highlight/true#M75419
|
||||||
|
|
||||||
|
|
||||||
|
@param dir= Directory to be scanned (default=/tmp)
|
||||||
|
@param outds= Dataset to create (default=work.mp_tree)
|
||||||
|
|
||||||
|
@returns outds contains the following variables:
|
||||||
|
|
||||||
|
- `dir`: a flag (1/0) to say whether it is a directory or not. This is not
|
||||||
|
reliable - folders that you do not have permission to open will be flagged
|
||||||
|
as directories.
|
||||||
|
- `ext`: file extension
|
||||||
|
- `filename`: file name
|
||||||
|
- `dirname`: directory name
|
||||||
|
- `fullpath`: directory + file name
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_tree(dir=/tmp
|
||||||
|
,outds=work.mp_tree
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
data &outds ;
|
||||||
|
length dir 8 ext filename dirname $256 fullpath $512 ;
|
||||||
|
call missing(of _all_);
|
||||||
|
fullpath = "&dir";
|
||||||
|
run;
|
||||||
|
|
||||||
|
%local sep;
|
||||||
|
%if &sysscp=WIN or &SYSSCP eq DNTHOST %then %let sep=\;
|
||||||
|
%else %let sep=/;
|
||||||
|
|
||||||
|
data &outds ;
|
||||||
|
modify &outds ;
|
||||||
|
retain sep "&sep";
|
||||||
|
rc=filename('tmp',fullpath);
|
||||||
|
dir_id=dopen('tmp');
|
||||||
|
dir = (dir_id ne 0) ;
|
||||||
|
if dir then dirname=fullpath;
|
||||||
|
else do;
|
||||||
|
filename=scan(fullpath,-1,sep) ;
|
||||||
|
dirname =substrn(fullpath,1,length(fullpath)-length(filename));
|
||||||
|
if index(filename,'.')>1 then ext=scan(filename,-1,'.');
|
||||||
|
end;
|
||||||
|
replace;
|
||||||
|
if dir then do;
|
||||||
|
do i=1 to dnum(dir_id);
|
||||||
|
fullpath=cats(dirname,sep,dread(dir_id,i));
|
||||||
|
output;
|
||||||
|
end;
|
||||||
|
rc=dclose(dir_id);
|
||||||
|
end;
|
||||||
|
rc=filename('tmp');
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mend;
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
%mp_unzip(ziploc="/some/file.zip",outdir=/some/folder)
|
%mp_unzip(ziploc="/some/file.zip",outdir=/some/folder)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_mkdir.sas
|
@li mf_mkdir.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
@param var The variable to modify
|
@param var The variable to modify
|
||||||
@param len The new length to apply
|
@param len The new length to apply
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_existds.sas
|
@li mf_existds.sas
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_existvar.sas
|
@li mf_existvar.sas
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
be sure that _debug is not set (else the SPWA will send non zipped content
|
be sure that _debug is not set (else the SPWA will send non zipped content
|
||||||
as well).
|
as well).
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_dirlist.sas
|
@li mp_dirlist.sas
|
||||||
|
|
||||||
@param in= unquoted filepath, dataset of files or directory to zip
|
@param in= unquoted filepath, dataset of files or directory to zip
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ LAYOUT_FILE = ./doxy/DoxygenLayout.xml
|
|||||||
MAX_INITIALIZER_LINES = 0
|
MAX_INITIALIZER_LINES = 0
|
||||||
PROJECT_NAME = Macro Core
|
PROJECT_NAME = Macro Core
|
||||||
PROJECT_LOGO = doxy/Macro_core_website_1.png
|
PROJECT_LOGO = doxy/Macro_core_website_1.png
|
||||||
|
PROJECT_BRIEF = "Production Ready Macros for SAS Application Developers"
|
||||||
RECURSIVE = YES
|
RECURSIVE = YES
|
||||||
REPEAT_BRIEF = NO
|
REPEAT_BRIEF = NO
|
||||||
SHOW_NAMESPACES = NO
|
SHOW_NAMESPACES = NO
|
||||||
|
|||||||
@@ -101,11 +101,11 @@
|
|||||||
<!-- Layout definition for a directory page -->
|
<!-- Layout definition for a directory page -->
|
||||||
<directory>
|
<directory>
|
||||||
<briefdescription visible="yes"/>
|
<briefdescription visible="yes"/>
|
||||||
|
<detaileddescription visible="yes" title=""/>
|
||||||
<directorygraph visible="yes"/>
|
<directorygraph visible="yes"/>
|
||||||
<memberdecl>
|
<memberdecl>
|
||||||
<dirs visible="yes"/>
|
<dirs visible="yes"/>
|
||||||
<files visible="yes"/>
|
<files visible="yes"/>
|
||||||
</memberdecl>
|
</memberdecl>
|
||||||
<detaileddescription title=""/>
|
|
||||||
</directory>
|
</directory>
|
||||||
</doxygenlayout>
|
</doxygenlayout>
|
||||||
|
|||||||
@@ -33,11 +33,11 @@ cd core.github.io
|
|||||||
rm -r *
|
rm -r *
|
||||||
mv $BUILD_FOLDER/out/doxy/* .
|
mv $BUILD_FOLDER/out/doxy/* .
|
||||||
echo 'core.sasjs.io' > CNAME
|
echo 'core.sasjs.io' > CNAME
|
||||||
git add *
|
git add .
|
||||||
git commit -m "build.sh build on $(date +%F:%H:%M:%S)"
|
git commit -m "build.sh build on $(date +%F:%H:%M:%S)"
|
||||||
git push
|
git push
|
||||||
npx sitemap-generator-cli https://core.sasjs.io
|
npx sitemap-generator-cli https://core.sasjs.io
|
||||||
git add *
|
git add .
|
||||||
git commit -m "adding sitemap"
|
git commit -m "adding sitemap"
|
||||||
git push
|
git push
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,23 @@
|
|||||||
|
<!-- HTML footer for doxygen 1.8.17-->
|
||||||
|
<!-- start footer part -->
|
||||||
<!--BEGIN GENERATE_TREEVIEW-->
|
<!--BEGIN GENERATE_TREEVIEW-->
|
||||||
<li class="footer"><b>$generatedby</b>
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||||
<a href="http://www.doxygen.org/index.html">
|
<ul>
|
||||||
<img class="footer" src="doxygen.png" alt="doxygen"/></a>
|
$navpath
|
||||||
|
<li class="footer">$generatedby
|
||||||
|
<a href="https://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
|
||||||
<i> For more information visit the </i> <a href="https://github.com/sasjs/core">Macro Core library</a>.</li>
|
<i> For more information visit the </i> <a href="https://github.com/sasjs/core">Macro Core library</a>.</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!--END GENERATE_TREEVIEW-->
|
<!--END GENERATE_TREEVIEW-->
|
||||||
<!--BEGIN !GENERATE_TREEVIEW-->
|
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||||
<hr class="footer"/>
|
<hr class="footer"/><address class="footer"><small>
|
||||||
<table width="100%"><tbody><tr><td>
|
$generatedby  <a href="http://www.doxygen.org/index.html">
|
||||||
For more information visit the <a href="https://github.com/sasjs/core">Macro Core library</a>.
|
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
|
||||||
</td><td><address class="footer"><small>
|
</a> $doxygenversion
|
||||||
©$year<br/>
|
</small></address>
|
||||||
$generatedby <a href="http://www.doxygen.org/index.html">
|
|
||||||
<!--<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/>-->doxygen
|
|
||||||
</a> $doxygenversion
|
|
||||||
</small></address></tr></tbody></table>
|
|
||||||
<!--END !GENERATE_TREEVIEW-->
|
<!--END !GENERATE_TREEVIEW-->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!-- HTML header for doxygen 1.8.14-->
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!-- HTML header for doxygen 1.8.17-->
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="https://www.w3.org/1999/xhtml" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
@@ -16,51 +16,51 @@ $search
|
|||||||
$mathjax
|
$mathjax
|
||||||
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
<link REL="icon" HREF="https://sasjs.io/img/runningman.jpg">
|
<link REL="icon" HREF="https://sasjs.io/img/runningman.jpg">
|
||||||
|
|
||||||
$extrastylesheet
|
$extrastylesheet
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
<!--BEGIN TITLEAREA-->
|
<!--BEGIN TITLEAREA-->
|
||||||
<div id="titlearea" style='background-color:white' >
|
<div id="titlearea">
|
||||||
<table cellspacing="0" cellpadding="0">
|
<table cellspacing="0" cellpadding="0">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr style="height: 26px;">
|
<tr style="height: 56px;">
|
||||||
<!--BEGIN PROJECT_LOGO-->
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
<td id="projectlogo"></td>
|
<td id="projectlogo">
|
||||||
|
<img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
<!--END PROJECT_LOGO-->
|
<!--END PROJECT_LOGO-->
|
||||||
<!--BEGIN PROJECT_NAME-->
|
<!--BEGIN PROJECT_NAME-->
|
||||||
<td>
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
<div id="projectname">
|
<div id="projectname">
|
||||||
<!--a href=".">
|
<!--BEGIN PROJECT_NUMBER--> <span id="projectnumber">$projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
<img alt="Macro Core" src="https://macropeople.com/wp-content/uploads/2018/05/macropeople2014retina_V2.png" height=60/>
|
|
||||||
</a-->
|
|
||||||
<a href=".">
|
|
||||||
<img alt="Macro Core" src="./Macro_core_website_1.png" height=60/>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">
|
||||||
|
Production Ready Macros for SAS Application Developers</br>
|
||||||
|
<a href="https://github.com/sasjs/core">
|
||||||
|
https://github.com/sasjs/core
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<meta name="Description" content="$projectbrief">
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
<table style="padding-left: 2em;" cellspacing="0" cellpadding="0">
|
<table style="padding-left: 2em;" cellspacing="0" cellpadding="0">
|
||||||
<tr><td> Production Ready Macros for SAS Application Developers</td></tr>
|
<tr><td> Production Ready Macros for SAS Application Developers</td></tr>
|
||||||
<tr><td><a href="https://github.com/sasjs/core">
|
<tr><td><a href="https://github.com/sasjs/core">
|
||||||
https://github.com/sasjs/core
|
https://github.com/sasjs/core
|
||||||
</a></td></tr>
|
</a></td></tr>
|
||||||
</table>
|
</table>
|
||||||
</td>
|
</td>
|
||||||
<!--END PROJECT_NAME-->
|
|
||||||
<!--BEGIN !PROJECT_NAME-->
|
|
||||||
<!--BEGIN PROJECT_BRIEF-->
|
|
||||||
<!--END PROJECT_BRIEF-->
|
<!--END PROJECT_BRIEF-->
|
||||||
<!--END !PROJECT_NAME-->
|
<!--END !PROJECT_NAME-->
|
||||||
<div class="header">
|
|
||||||
<div class="headertitle">
|
|
||||||
|
|
||||||
<!--BEGIN DISABLE_INDEX-->
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
<!--BEGIN SEARCHENGINE-->
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
|
||||||
<td>$searchbox</td>
|
<td>$searchbox</td>
|
||||||
<!--END SEARCHENGINE-->
|
<!--END SEARCHENGINE-->
|
||||||
<!--END DISABLE_INDEX-->
|
<!--END DISABLE_INDEX-->
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
5
main.dox
5
main.dox
@@ -13,6 +13,11 @@
|
|||||||
* Not metadata aware
|
* Not metadata aware
|
||||||
* No X command
|
* No X command
|
||||||
* Prefixes: _mf_, _mp_
|
* 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
|
/*! \dir meta
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
disconnect from MyAlias;
|
disconnect from MyAlias;
|
||||||
quit;
|
quit;
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getengine.sas
|
@li mf_getengine.sas
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
%mm_assignlib(SOMEREF)
|
%mm_assignlib(SOMEREF)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
|
|
||||||
@param libref the libref (not name) of the metadata library
|
@param libref the libref (not name) of the metadata library
|
||||||
|
|||||||
@@ -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).
|
@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 mp_abort.sas
|
||||||
@li mf_verifymacvars.sas
|
@li mf_verifymacvars.sas
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
%mm_createdataset(tableuri=G5X8AFW1.BE00015Y)
|
%mm_createdataset(tableuri=G5X8AFW1.BE00015Y)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_getlibs.sas
|
@li mm_getlibs.sas
|
||||||
@li mm_gettables.sas
|
@li mm_gettables.sas
|
||||||
@li mm_getcols.sas
|
@li mm_getcols.sas
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
%mm_createdocument(tree=/User Folders/sasdemo
|
%mm_createdocument(tree=/User Folders/sasdemo
|
||||||
,name=MyNote)
|
,name=MyNote)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_verifymacvars.sas
|
@li mf_verifymacvars.sas
|
||||||
|
|
||||||
|
|||||||
@@ -9,17 +9,17 @@
|
|||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
|
|
||||||
%mm_createlibrary(
|
%mm_createlibrary(
|
||||||
libname=My New Library
|
libname=My New Library
|
||||||
,libref=mynewlib
|
,libref=mynewlib
|
||||||
,libdesc=Super & <fine>
|
,libdesc=Super & <fine>
|
||||||
,engine=BASE
|
,engine=BASE
|
||||||
,tree=/User Folders/sasdemo
|
,tree=/User Folders/sasdemo
|
||||||
,servercontext=SASApp
|
,servercontext=SASApp
|
||||||
,directory=/tmp/tests
|
,directory=/tmp/tests
|
||||||
,mDebug=1)
|
,mDebug=1)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_verifymacvars.sas
|
@li mf_verifymacvars.sas
|
||||||
@li mm_createfolder.sas
|
@li mm_createfolder.sas
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
,Server=SASApp
|
,Server=SASApp
|
||||||
,stptype=2)
|
,stptype=2)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_nobs.sas
|
@li mf_nobs.sas
|
||||||
@li mf_verifymacvars.sas
|
@li mf_verifymacvars.sas
|
||||||
@li mm_getdirectories.sas
|
@li mm_getdirectories.sas
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Usage:
|
|||||||
;;;;
|
;;;;
|
||||||
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES)
|
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_createstp.sas
|
@li mm_createstp.sas
|
||||||
@li mf_getuser.sas
|
@li mf_getuser.sas
|
||||||
@li mm_createfolder.sas
|
@li mm_createfolder.sas
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
%mm_createdocument(tree=/User Folders/&sysuserid,name=MyNote)
|
%mm_createdocument(tree=/User Folders/&sysuserid,name=MyNote)
|
||||||
%mm_deletedocument(target=/User Folders/&sysuserid/MyNote)
|
%mm_deletedocument(target=/User Folders/&sysuserid/MyNote)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
@param target= full path to the document being deleted
|
@param target= full path to the document being deleted
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
%mm_deletestp(target=/some/meta/path/myStoredProcess)
|
%mm_deletestp(target=/some/meta/path/myStoredProcess)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
@param target= full path to the STP being deleted
|
@param target= full path to the STP being deleted
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
@param outds= the ONE LEVEL work dataset to create
|
@param outds= the ONE LEVEL work dataset to create
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_getobjects.sas
|
@li mm_getobjects.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@li mm_getdetails.sas
|
@li mm_getdetails.sas
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
,outref=/some/unquoted/filename.ext
|
,outref=/some/unquoted/filename.ext
|
||||||
)
|
)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
|
|
||||||
@param tree= The metadata path of the document
|
@param tree= The metadata path of the document
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
@param outds= the dataset to create that contains the list of directories
|
@param outds= the dataset to create that contains the list of directories
|
||||||
@param mDebug= set to 1 to show debug messages in the log
|
@param mDebug= set to 1 to show debug messages in the log
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
@version 9.4
|
@version 9.4
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
filename __mc2 clear;
|
filename __mc2 clear;
|
||||||
libname __mc3 clear;
|
libname __mc3 clear;
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_getrepos.sas
|
@li mm_getrepos.sas
|
||||||
|
|
||||||
@version 9.3
|
@version 9.3
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
%mm_getstps(tree=/My Folder/My STPs, name=My STP)
|
%mm_getstps(tree=/My Folder/My STPs, name=My STP)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mm_gettree.sas
|
@li mm_gettree.sas
|
||||||
|
|
||||||
@param tree= the metadata folder location in which to search. Leave blank
|
@param tree= the metadata folder location in which to search. Leave blank
|
||||||
@@ -23,8 +23,8 @@
|
|||||||
combine with the <code>tree=</code> parameter.
|
combine with the <code>tree=</code> parameter.
|
||||||
@param outds= the dataset to create that contains the list of stps.
|
@param outds= the dataset to create that contains the list of stps.
|
||||||
@param mDebug= set to 1 to show debug messages in the log
|
@param mDebug= set to 1 to show debug messages in the log
|
||||||
@showDesc= provide a non blank value to return stored process descriptions
|
@param showDesc= provide a non blank value to return stored process descriptions
|
||||||
@showUsageVersion= provide a non blank value to return the UsageVersion. This
|
@param showUsageVersion= provide a non blank value to return the UsageVersion. This
|
||||||
is either 1000000 (type 1, 9.2) or 2000000 (type2, 9.3 onwards).
|
is either 1000000 (type 1, 9.2) or 2000000 (type2, 9.3 onwards).
|
||||||
|
|
||||||
@returns outds dataset containing the following columns
|
@returns outds dataset containing the following columns
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
@file
|
@file
|
||||||
@brief Retrieves properties of the SAS web app server
|
@brief Retrieves properties of the SAS web app server
|
||||||
@details
|
@details
|
||||||
Usage:
|
Usage:
|
||||||
|
|
||||||
%mm_getwebappsrvprops(outds= some_ds)
|
%mm_getwebappsrvprops(outds= some_ds)
|
||||||
@@ -21,8 +21,7 @@
|
|||||||
libname __shake clear;
|
libname __shake clear;
|
||||||
|
|
||||||
@version 9.4
|
@version 9.4
|
||||||
@author Allan Bowe
|
@author Allan Bowe https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
./mmscript.sh "myuser" "mypass"
|
./mmscript.sh "myuser" "mypass"
|
||||||
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_loc.sas
|
@li mf_loc.sas
|
||||||
@li mm_tree.sas
|
@li mm_tree.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
Table
|
Table
|
||||||
,outds=morestuff)
|
,outds=morestuff)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_getquotedstr.sas
|
@li mf_getquotedstr.sas
|
||||||
@li mm_getpublictypes.sas
|
@li mm_getpublictypes.sas
|
||||||
@li mf_isblank.sas
|
@li mf_isblank.sas
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
%mm_updatestpservertype(target=/some/meta/path/myStoredProcess
|
%mm_updatestpservertype(target=/some/meta/path/myStoredProcess
|
||||||
,type=WKS)
|
,type=WKS)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
|
|
||||||
@param target= full path to the STP being deleted
|
@param target= full path to the STP being deleted
|
||||||
@param type= Either WKS or STP depending on whether Workspace or Stored Process
|
@param type= Either WKS or STP depending on whether Workspace or Stored Process
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
%mmx_deletemetafolder(loc=/some/meta/folder,user=sasdemo,pass=mars345)
|
%mmx_deletemetafolder(loc=/some/meta/folder,user=sasdemo,pass=mars345)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_loc.sas
|
@li mf_loc.sas
|
||||||
|
|
||||||
@param loc= the metadata folder to delete
|
@param loc= the metadata folder to delete
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Usage:
|
|||||||
,outspkpath=%str(/tmp)
|
,outspkpath=%str(/tmp)
|
||||||
)
|
)
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_loc.sas
|
@li mf_loc.sas
|
||||||
@li mm_tree.sas
|
@li mm_tree.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@li mf_getuniquelibref.sas
|
@li mf_getuniquelibref.sas
|
||||||
@@ -42,7 +41,7 @@
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -121,7 +120,7 @@ options noquotelenmax;
|
|||||||
out=&fname2
|
out=&fname2
|
||||||
&oauth_bearer
|
&oauth_bearer
|
||||||
url=%unquote(%superq(href));
|
url=%unquote(%superq(href));
|
||||||
headers
|
headers
|
||||||
%if &grant_type=authorization_code %then %do;
|
%if &grant_type=authorization_code %then %do;
|
||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -1,34 +1,35 @@
|
|||||||
/**
|
/**
|
||||||
@file mv_createwebservice.sas
|
@file mv_createwebservice.sas
|
||||||
@brief Creates a JobExecution web service if it doesn't already exist
|
@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 ;
|
%* Step 1 - compile macros ;
|
||||||
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
||||||
%inc mc;
|
%inc mc;
|
||||||
|
|
||||||
%* Step 2 - Create some code and add it to a web service;
|
%* Step 2 - Create some code and add it to a web service;
|
||||||
filename ft15f001 temp;
|
filename ft15f001 temp;
|
||||||
parmcards4;
|
parmcards4;
|
||||||
%webout(FETCH) %* fetch any tables sent from frontend;
|
%webout(FETCH) %* fetch any tables sent from frontend;
|
||||||
%* do some sas, any inputs are now already WORK tables;
|
%* do some sas, any inputs are now already WORK tables;
|
||||||
data example1 example2;
|
data example1 example2;
|
||||||
set sashelp.class;
|
set sashelp.class;
|
||||||
run;
|
run;
|
||||||
%* send data back;
|
%* send data back;
|
||||||
%webout(OPEN)
|
%webout(OPEN)
|
||||||
%webout(ARR,example1) * Array format, fast, suitable for large tables ;
|
%webout(ARR,example1) * Array format, fast, suitable for large tables ;
|
||||||
%webout(OBJ,example2) * Object format, easier to work with ;
|
%webout(OBJ,example2) * Object format, easier to work with ;
|
||||||
%webout(CLOSE)
|
%webout(CLOSE)
|
||||||
;;;;
|
;;;;
|
||||||
%mv_createwebservice(path=/Public/app/common,name=appinit)
|
%mv_createwebservice(path=/Public/app/common,name=appinit)
|
||||||
|
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
To minimise postgres requests, output json is stored in a temporary file
|
To minimise postgres requests, output json is stored in a temporary file
|
||||||
and then sent to _webout in one go at the end.
|
and then sent to _webout in one go at the end.
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mv_createfolder.sas
|
@li mv_createfolder.sas
|
||||||
@li mf_getuniquelibref.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
|
a shared context - see https://go.documentation.sas.com/?docsetId=calcontexts&docsetTarget=n1hjn8eobk5pyhn1wg3ja0drdl6h.htm&docsetVersion=3.5&locale=en
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
@file mv_deletefoldermember.sas
|
@file mv_deletefoldermember.sas
|
||||||
@brief Deletes an item in a Viya folder
|
@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).
|
macro variable (default ACCESS_TOKEN).
|
||||||
|
|
||||||
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
||||||
@@ -20,10 +20,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -48,7 +47,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -129,7 +128,7 @@ run;
|
|||||||
%return;
|
%return;
|
||||||
%end;
|
%end;
|
||||||
proc http method="DELETE" url="&base_uri&uri" &oauth_bearer;
|
proc http method="DELETE" url="&base_uri&uri" &oauth_bearer;
|
||||||
headers
|
headers
|
||||||
%if &grant_type=authorization_code %then %do;
|
%if &grant_type=authorization_code %then %do;
|
||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
@file mv_deletejes.sas
|
@file mv_deletejes.sas
|
||||||
@brief Creates a job execution service if it does not already exist
|
@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).
|
macro variable (default ACCESS_TOKEN).
|
||||||
|
|
||||||
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
||||||
@@ -19,10 +19,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -46,7 +45,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -126,7 +125,7 @@ run;
|
|||||||
%return;
|
%return;
|
||||||
%end;
|
%end;
|
||||||
proc http method="DELETE" url="&uri" &oauth_bearer;
|
proc http method="DELETE" url="&uri" &oauth_bearer;
|
||||||
headers
|
headers
|
||||||
%if &grant_type=authorization_code %then %do;
|
%if &grant_type=authorization_code %then %do;
|
||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
@file mv_deleteviyafolder.sas
|
@file mv_deleteviyafolder.sas
|
||||||
@brief Creates a viya folder if that folder does not already exist
|
@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).
|
macro variable (default ACCESS_TOKEN).
|
||||||
|
|
||||||
options mprint;
|
options mprint;
|
||||||
@@ -16,10 +16,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -42,7 +41,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -121,10 +120,10 @@ run;
|
|||||||
%let fname2=%mf_getuniquefileref();
|
%let fname2=%mf_getuniquefileref();
|
||||||
proc http method='DELETE' out=&fname2 &oauth_bearer
|
proc http method='DELETE' out=&fname2 &oauth_bearer
|
||||||
url=%unquote(%superq(href));
|
url=%unquote(%superq(href));
|
||||||
headers
|
headers
|
||||||
%if &grant_type=authorization_code %then %do;
|
%if &grant_type=authorization_code %then %do;
|
||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
'Accept'='*/*'; /**/
|
'Accept'='*/*'; /**/
|
||||||
run;
|
run;
|
||||||
%if &SYS_PROCHTTP_STATUS_CODE ne 204 %then %do;
|
%if &SYS_PROCHTTP_STATUS_CODE ne 204 %then %do;
|
||||||
|
|||||||
@@ -3,14 +3,13 @@
|
|||||||
@brief deprecated - replaced by mv_tokenrefresh.sas
|
@brief deprecated - replaced by mv_tokenrefresh.sas
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
<h4> Dependencies </h4>
|
|
||||||
@li mv_tokenrefresh.sas
|
@li mv_tokenrefresh.sas
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mv_getaccesstoken(client_id=someclient
|
%macro mv_getaccesstoken(client_id=someclient
|
||||||
,client_secret=somesecret
|
,client_secret=somesecret
|
||||||
,grant_type=authorization_code
|
,grant_type=authorization_code
|
||||||
|
|||||||
@@ -3,14 +3,13 @@
|
|||||||
@brief deprecated - replaced by mv_registerclient.sas
|
@brief deprecated - replaced by mv_registerclient.sas
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
<h4> Dependencies </h4>
|
|
||||||
@li mv_registerclient.sas
|
@li mv_registerclient.sas
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mv_getapptoken(client_id=someclient
|
%macro mv_getapptoken(client_id=someclient
|
||||||
,client_secret=somesecret
|
,client_secret=somesecret
|
||||||
,grant_type=authorization_code
|
,grant_type=authorization_code
|
||||||
|
|||||||
@@ -29,10 +29,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -95,7 +94,7 @@ run;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* clear refs
|
/* clear refs
|
||||||
filename &fname1 clear;
|
filename &fname1 clear;
|
||||||
libname &libref1 clear;
|
libname &libref1 clear;
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -15,10 +15,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -42,7 +41,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -85,10 +84,16 @@ options noquotelenmax;
|
|||||||
/*data _null_;infile &fname1;input;putlog _infile_;run;*/
|
/*data _null_;infile &fname1;input;putlog _infile_;run;*/
|
||||||
libname &libref1 JSON fileref=&fname1;
|
libname &libref1 JSON fileref=&fname1;
|
||||||
/* now get the followon link to list members */
|
/* now get the followon link to list members */
|
||||||
|
%local href;
|
||||||
|
%let href=0;
|
||||||
data _null_;
|
data _null_;
|
||||||
set &libref1..links;
|
set &libref1..links;
|
||||||
if rel='members' then call symputx('href',quote("&base_uri"!!trim(href)),'l');
|
if rel='members' then call symputx('href',quote("&base_uri"!!trim(href)),'l');
|
||||||
run;
|
run;
|
||||||
|
%if &href=0 %then %do;
|
||||||
|
%put NOTE:;%put NOTE- No members found in &root!!;%put NOTE-;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
%local fname2 libref2;
|
%local fname2 libref2;
|
||||||
%let fname2=%mf_getuniquefileref();
|
%let fname2=%mf_getuniquefileref();
|
||||||
%let libref2=%mf_getuniquelibref();
|
%let libref2=%mf_getuniquelibref();
|
||||||
|
|||||||
@@ -30,10 +30,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -56,7 +55,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -73,7 +72,7 @@ options noquotelenmax;
|
|||||||
%let fname1=%mf_getuniquefileref();
|
%let fname1=%mf_getuniquefileref();
|
||||||
proc http method='GET' out=&fname1 &oauth_bearer
|
proc http method='GET' out=&fname1 &oauth_bearer
|
||||||
url="&base_uri/identities/groups/&group/members?limit=10000";
|
url="&base_uri/identities/groups/&group/members?limit=10000";
|
||||||
headers
|
headers
|
||||||
%if &grant_type=authorization_code %then %do;
|
%if &grant_type=authorization_code %then %do;
|
||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -29,10 +29,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -54,7 +53,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -72,7 +71,7 @@ options noquotelenmax;
|
|||||||
|
|
||||||
proc http method='GET' out=&fname1 &oauth_bearer
|
proc http method='GET' out=&fname1 &oauth_bearer
|
||||||
url="&base_uri/identities/groups?limit=10000";
|
url="&base_uri/identities/groups?limit=10000";
|
||||||
headers
|
headers
|
||||||
%if &grant_type=authorization_code %then %do;
|
%if &grant_type=authorization_code %then %do;
|
||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
|
|||||||
@@ -3,14 +3,13 @@
|
|||||||
@brief deprecated - replaced by mv_tokenauth.sas
|
@brief deprecated - replaced by mv_tokenauth.sas
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
<h4> Dependencies </h4>
|
|
||||||
@li mv_tokenauth.sas
|
@li mv_tokenauth.sas
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mv_getrefreshtoken(client_id=someclient
|
%macro mv_getrefreshtoken(client_id=someclient
|
||||||
,client_secret=somesecret
|
,client_secret=somesecret
|
||||||
,grant_type=authorization_code
|
,grant_type=authorization_code
|
||||||
|
|||||||
@@ -20,10 +20,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
|
|||||||
@@ -34,12 +34,12 @@
|
|||||||
creationTimeStamp char(24),
|
creationTimeStamp char(24),
|
||||||
modifiedTimeStamp char(24),
|
modifiedTimeStamp char(24),
|
||||||
state char(6)
|
state char(6)
|
||||||
|
|
||||||
@param access_token_var= The global macro variable to contain the access token
|
@param access_token_var= The global macro variable to contain the access token
|
||||||
@param grant_type= valid values:
|
@param grant_type= valid values:
|
||||||
* password
|
* password
|
||||||
* authorization_code
|
* 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.
|
a SASStudioV session else authorization_code. Default option.
|
||||||
* sas_services - will use oauth_bearer=sas_services
|
* sas_services - will use oauth_bearer=sas_services
|
||||||
|
|
||||||
@@ -47,10 +47,9 @@
|
|||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -72,7 +71,7 @@
|
|||||||
%let &access_token_var=;
|
%let &access_token_var=;
|
||||||
%end;
|
%end;
|
||||||
%put &sysmacroname: grant_type=&grant_type;
|
%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
|
and &grant_type ne sas_services
|
||||||
)
|
)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
|
|||||||
168
viya/mv_jobexecute.sas
Normal file
168
viya/mv_jobexecute.sas
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Executes a SAS Viya Job
|
||||||
|
@details Triggers a SAS Viya Job, with optional URL parameters, using
|
||||||
|
the JES web app.
|
||||||
|
|
||||||
|
First, compile the macros:
|
||||||
|
|
||||||
|
filename mc url
|
||||||
|
"https://raw.githubusercontent.com/sasjs/core/main/all.sas";
|
||||||
|
%inc mc;
|
||||||
|
|
||||||
|
Then, execute the job!
|
||||||
|
|
||||||
|
%mv_jobexecute(path=/Public/folder
|
||||||
|
,name=somejob
|
||||||
|
)
|
||||||
|
|
||||||
|
Example with parameters:
|
||||||
|
|
||||||
|
%mv_jobexecute(path=/Public/folder
|
||||||
|
,name=somejob
|
||||||
|
,paramstring=%str("macvarname":"macvarvalue","answer":42)
|
||||||
|
)
|
||||||
|
|
||||||
|
@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
|
||||||
|
a SASStudioV session else authorization_code. Default option.
|
||||||
|
* sas_services - will use oauth_bearer=sas_services
|
||||||
|
|
||||||
|
@param path= The SAS Drive path to the job being executed
|
||||||
|
@param name= The name of the job to execute
|
||||||
|
@param paramstring= A JSON fragment with name:value pairs, eg: `"name":"value"`
|
||||||
|
or "name":"value","name2":42`. This will need to be wrapped in `%str()`.
|
||||||
|
|
||||||
|
@param contextName= Context name with which to run the job.
|
||||||
|
Default = `SAS Job Execution compute context`
|
||||||
|
|
||||||
|
@param outds= The output dataset containing links (Default=work.mv_jobexecute)
|
||||||
|
|
||||||
|
|
||||||
|
@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
|
||||||
|
@li mf_getuniquelibref.sas
|
||||||
|
@li mv_getfoldermembers.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mv_jobexecute(path=0
|
||||||
|
,name=0
|
||||||
|
,contextName=SAS Job Execution compute context
|
||||||
|
,access_token_var=ACCESS_TOKEN
|
||||||
|
,grant_type=sas_services
|
||||||
|
,paramstring=0
|
||||||
|
,outds=work.mv_jobexecute
|
||||||
|
);
|
||||||
|
%local oauth_bearer;
|
||||||
|
%if &grant_type=detect %then %do;
|
||||||
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
|
%else %let grant_type=sas_services;
|
||||||
|
%end;
|
||||||
|
%if &grant_type=sas_services %then %do;
|
||||||
|
%let oauth_bearer=oauth_bearer=sas_services;
|
||||||
|
%let &access_token_var=;
|
||||||
|
%end;
|
||||||
|
%put &sysmacroname: grant_type=&grant_type;
|
||||||
|
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
|
||||||
|
and &grant_type ne sas_services
|
||||||
|
)
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(Invalid value for grant_type: &grant_type)
|
||||||
|
)
|
||||||
|
|
||||||
|
%mp_abort(iftrue=("&path"="0")
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(Path not provided)
|
||||||
|
)
|
||||||
|
%mp_abort(iftrue=("&name"="0")
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(Job Name not provided)
|
||||||
|
)
|
||||||
|
|
||||||
|
options noquotelenmax;
|
||||||
|
|
||||||
|
%local base_uri; /* location of rest apis */
|
||||||
|
%let base_uri=%mf_getplatform(VIYARESTAPI);
|
||||||
|
|
||||||
|
data;run;
|
||||||
|
%local foldermembers;
|
||||||
|
%let foldermembers=&syslast;
|
||||||
|
%mv_getfoldermembers(root=&path
|
||||||
|
,access_token_var=&access_token_var
|
||||||
|
,grant_type=&grant_type
|
||||||
|
,outds=&foldermembers
|
||||||
|
)
|
||||||
|
|
||||||
|
%local joburi;
|
||||||
|
%let joburi=0;
|
||||||
|
data _null_;
|
||||||
|
set &foldermembers;
|
||||||
|
if name="&name" and uri=:'/jobDefinitions/definitions'
|
||||||
|
then call symputx('joburi',uri);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_abort(iftrue=("&joburi"="0")
|
||||||
|
,mac=&sysmacroname
|
||||||
|
,msg=%str(Job &path/&name not found)
|
||||||
|
)
|
||||||
|
|
||||||
|
/* prepare request*/
|
||||||
|
%local fname0 fname1;
|
||||||
|
%let fname0=%mf_getuniquefileref();
|
||||||
|
%let fname1=%mf_getuniquefileref();
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
file &fname0;
|
||||||
|
length joburi contextname $128 paramstring $32765;
|
||||||
|
joburi=quote(trim(symget('joburi')));
|
||||||
|
contextname=quote(trim(symget('contextname')));
|
||||||
|
paramstring=symget('paramstring');
|
||||||
|
put '{"jobDefinitionUri":' joburi ;
|
||||||
|
put ' ,"arguments":{"_contextName":' contextname;
|
||||||
|
if paramstring ne "0" then do;
|
||||||
|
put ' ,' paramstring;
|
||||||
|
end;
|
||||||
|
put '}}';
|
||||||
|
run;
|
||||||
|
|
||||||
|
proc http method='POST' in=&fname0 out=&fname1 &oauth_bearer
|
||||||
|
url="&base_uri/jobExecution/jobs";
|
||||||
|
headers "Content-Type"="application/vnd.sas.job.execution.job.request+json"
|
||||||
|
"Accept"="application/vnd.sas.job.execution.job+json"
|
||||||
|
%if &grant_type=authorization_code %then %do;
|
||||||
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
|
%end;
|
||||||
|
;
|
||||||
|
run;
|
||||||
|
%if &SYS_PROCHTTP_STATUS_CODE ne 200 and &SYS_PROCHTTP_STATUS_CODE ne 201 %then
|
||||||
|
%do;
|
||||||
|
data _null_;infile &fname0;input;putlog _infile_;run;
|
||||||
|
data _null_;infile &fname1;input;putlog _infile_;run;
|
||||||
|
%mp_abort(mac=&sysmacroname
|
||||||
|
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
||||||
|
)
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%local libref;
|
||||||
|
%let libref=%mf_getuniquelibref();
|
||||||
|
libname &libref JSON fileref=&fname1;
|
||||||
|
|
||||||
|
data &outds;
|
||||||
|
set &libref..links;
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* clear refs */
|
||||||
|
filename &fname0 clear;
|
||||||
|
filename &fname1 clear;
|
||||||
|
libname &libref;
|
||||||
|
|
||||||
|
%mend;
|
||||||
@@ -35,27 +35,26 @@
|
|||||||
@param scopes= list of space-seperated unquoted scopes (default is openid)
|
@param scopes= list of space-seperated unquoted scopes (default is openid)
|
||||||
@param grant_type= valid values are "password" or "authorization_code" (unquoted)
|
@param grant_type= valid values are "password" or "authorization_code" (unquoted)
|
||||||
@param outds= the dataset to contain the registered client id and secret
|
@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)
|
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
|
@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)
|
in seconds. A value of DEFAULT will omit the entry (and use system default)
|
||||||
@param name= A human readable name for the client
|
@param name= A human readable name for the client
|
||||||
@param required_user_groups= A list of group names. If a user does not belong
|
@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
|
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,
|
are issued to this client for that user. If this field is not specified,
|
||||||
authentication and token issuance proceeds normally.
|
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.
|
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.
|
associated with an HTTP session and revoked upon logout or time-out.
|
||||||
@param outjson= A dataset containing the lines of JSON submitted. Useful
|
@param outjson= A dataset containing the lines of JSON submitted. Useful
|
||||||
for debugging. Default= _null_.
|
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 mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
@@ -143,7 +142,7 @@ data _null_;
|
|||||||
if not missing(autoapprove) then autoapprove=cats(',"autoapprove":',autoapprove);
|
if not missing(autoapprove) then autoapprove=cats(',"autoapprove":',autoapprove);
|
||||||
use_session=trim(symget('use_session'));
|
use_session=trim(symget('use_session'));
|
||||||
if not missing(use_session) then use_session=cats(',"use_session":',use_session);
|
if not missing(use_session) then use_session=cats(',"use_session":',use_session);
|
||||||
|
|
||||||
put '{' clientid ;
|
put '{' clientid ;
|
||||||
put clientsecret ;
|
put clientsecret ;
|
||||||
put clientname;
|
put clientname;
|
||||||
|
|||||||
@@ -41,10 +41,9 @@
|
|||||||
@param base_uri= The Viya API server location
|
@param base_uri= The Viya API server location
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
|
|||||||
@@ -40,10 +40,9 @@
|
|||||||
@param refresh_token_var= The global macro variable containing the refresh token
|
@param refresh_token_var= The global macro variable containing the refresh token
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@source https://github.com/sasjs/core
|
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_abort.sas
|
@li mp_abort.sas
|
||||||
@li mf_getplatform.sas
|
@li mf_getplatform.sas
|
||||||
@li mf_getuniquefileref.sas
|
@li mf_getuniquefileref.sas
|
||||||
|
|||||||
@@ -27,18 +27,18 @@
|
|||||||
@param dslabel= value to use instead of the real name for sending to JSON
|
@param dslabel= value to use instead of the real name for sending to JSON
|
||||||
@param fmt= change to N to strip formats from output
|
@param fmt= change to N to strip formats from output
|
||||||
|
|
||||||
<h4> Dependencies </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_jsonout.sas
|
@li mp_jsonout.sas
|
||||||
@li mf_getuser.sas
|
@li mf_getuser.sas
|
||||||
|
|
||||||
@version Viya 3.3
|
@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);
|
%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y);
|
||||||
%global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name
|
%global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name
|
||||||
sasjs_tables SYS_JES_JOB_URI;
|
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;
|
%local i tempds;
|
||||||
%let action=%upcase(&action);
|
%let action=%upcase(&action);
|
||||||
@@ -144,8 +144,8 @@
|
|||||||
filename _webout temp lrecl=999999 mod;
|
filename _webout temp lrecl=999999 mod;
|
||||||
%end;
|
%end;
|
||||||
%else %do;
|
%else %do;
|
||||||
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
|
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
|
||||||
name="_webout.json" lrecl=999999 mod;
|
name="_webout.json" lrecl=999999 mod;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* setup temp ref */
|
/* setup temp ref */
|
||||||
|
|||||||
Reference in New Issue
Block a user