mirror of
https://github.com/sasjs/core.git
synced 2026-01-03 23:50:06 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a27496c7b3 | ||
|
|
265389befc | ||
|
|
db2531e0b3 | ||
|
|
5e77494aa6 | ||
|
|
6a2ac51925 | ||
|
|
f625b04189 | ||
|
|
68aee776d3 | ||
|
|
38d2195d32 | ||
|
|
4e564b5409 | ||
|
|
298acc4e50 |
@@ -116,19 +116,19 @@ The **Macro Core** documentation is created using [doxygen](http://www.doxygen.n
|
|||||||
All macros must be commented in the doxygen format, to enable the [online documentation](https://core.sasjs.io).
|
All macros must be commented in the doxygen format, to enable the [online documentation](https://core.sasjs.io).
|
||||||
|
|
||||||
### Dependencies
|
### 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:
|
SAS code can contain one of two types of dependency - SAS Macros, and SAS Includes. When compiling projects using the [SASjs CLI](https://cli.sasjs.io) the doxygen header is scanned for ` @li` items under the following headers:
|
||||||
|
|
||||||
```sas
|
```sas
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mf_nobs.sas
|
@li mf_nobs.sas
|
||||||
@li mm_assignlib.sas
|
@li mm_assignlib.sas
|
||||||
|
|
||||||
<h4> SAS Programs </h4>
|
<h4> SAS Includes </h4>
|
||||||
@li somefile.ddl SOMEFREF
|
@li somefile.ddl SOMEFREF
|
||||||
@li someprogram.sas FREFTWO
|
@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.
|
The CLI can then extract all the dependencies and insert as precode (SAS Macros) or in a temp engine fileref (SAS Includes) 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.
|
When contributing to this library, it is therefore important to ensure that all dependencies are listed in the header in this format.
|
||||||
|
|
||||||
|
|||||||
@@ -18,5 +18,5 @@
|
|||||||
|
|
||||||
|
|
||||||
%macro mf_getuniquename(prefix=MC);
|
%macro mf_getuniquename(prefix=MC);
|
||||||
&prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
|
&prefix.%substr(%sysfunc(compress(%sysfunc(uuidgen()),-)),1,32-%length(&prefix))
|
||||||
%mend;
|
%mend mf_getuniquename;
|
||||||
@@ -23,9 +23,9 @@
|
|||||||
8.
|
8.
|
||||||
NOTE: Variable renegade does not exist in test
|
NOTE: Variable renegade does not exist in test
|
||||||
|
|
||||||
@param libds Two part dataset (or view) reference.
|
@param [in] libds Two part dataset (or view) reference.
|
||||||
@param var Variable name for which a format should be returned
|
@param [in] var Variable name for which a format should be returned
|
||||||
@param force Set to 1 to supply a default if the variable has no format
|
@param [in] force=(0) Set to 1 to supply a default if the variable has no format
|
||||||
@returns outputs format
|
@returns outputs format
|
||||||
|
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
%let vlen = %sysfunc(varlen(&dsid, &vnum));
|
%let vlen = %sysfunc(varlen(&dsid, &vnum));
|
||||||
%let vtype = %sysfunc(vartype(&dsid, &vnum.));
|
%let vtype = %sysfunc(vartype(&dsid, &vnum.));
|
||||||
%if &vtype=C %then %let vformat=$&vlen..;
|
%if &vtype=C %then %let vformat=$&vlen..;
|
||||||
%else %let vformat=8.;
|
%else %let vformat=best.;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
|
|
||||||
@@ -68,4 +68,4 @@
|
|||||||
%let rc = %sysfunc(close(&dsid));
|
%let rc = %sysfunc(close(&dsid));
|
||||||
/* Return variable format */
|
/* Return variable format */
|
||||||
&vformat
|
&vformat
|
||||||
%mend;
|
%mend mf_getVarFormat;
|
||||||
@@ -128,12 +128,13 @@
|
|||||||
if debug ge '"131"' then put '>>weboutEND<<';
|
if debug ge '"131"' then put '>>weboutEND<<';
|
||||||
run;
|
run;
|
||||||
|
|
||||||
%let syscc=0;
|
|
||||||
%if %symexist(_metaport) %then %do;
|
%if %symexist(_metaport) %then %do;
|
||||||
data _null_;
|
data _null_;
|
||||||
if symexist('sysprocessmode')
|
if symexist('sysprocessmode') then
|
||||||
then if symget("sysprocessmode")="SAS Stored Process Server"
|
if symget("sysprocessmode")="SAS Stored Process Server" then do;
|
||||||
then rc=stpsrvset('program error', 0);
|
rc=stpsrvset('program error', 0);
|
||||||
|
call symputx("syscc",0,"g");
|
||||||
|
end;
|
||||||
run;
|
run;
|
||||||
%end;
|
%end;
|
||||||
/**
|
/**
|
||||||
|
|||||||
98
base/mp_ds2fmtds.sas
Normal file
98
base/mp_ds2fmtds.sas
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Converts every value in a dataset to it's formatted value
|
||||||
|
@details Converts every value to it's formatted value. All variables will
|
||||||
|
become character, and will be in the same order.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mp_ds2fmtds(sashelp.cars,work.cars)
|
||||||
|
|
||||||
|
@param [in] libds The library.dataset to be converted
|
||||||
|
@param [out] outds The dataset to create.
|
||||||
|
|
||||||
|
<h4> Related Macros <h4>
|
||||||
|
@li mp_jsonout.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_ds2fmtds(libds, outds
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
/* validations */
|
||||||
|
%if not %sysfunc(exist(&libds)) %then %do;
|
||||||
|
%put %str(WARN)ING: &libds does not exist;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
%if %index(&libds,.)=0 %then %let libds=WORK.&libds;
|
||||||
|
|
||||||
|
/* grab metadata */
|
||||||
|
proc contents noprint data=&libds
|
||||||
|
out=_data_(keep=name type length format formatl formatd varnum);
|
||||||
|
run;
|
||||||
|
proc sort;
|
||||||
|
by varnum;
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* prepare formats and varnames */
|
||||||
|
data _null_;
|
||||||
|
set &syslast end=last;
|
||||||
|
name=upcase(name);
|
||||||
|
/* fix formats */
|
||||||
|
if type=2 or type=6 then do;
|
||||||
|
length fmt $49.;
|
||||||
|
if format='' then fmt=cats('$',length,'.');
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else fmt=cats(format,formatl,'.');
|
||||||
|
newlen=max(formatl,length);
|
||||||
|
end;
|
||||||
|
else do;
|
||||||
|
if format='' then fmt='best.';
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else if formatd=0 then fmt=cats(format,formatl,'.');
|
||||||
|
else fmt=cats(format,formatl,'.',formatd);
|
||||||
|
/* needs to be wide, for datetimes etc */
|
||||||
|
newlen=max(length,formatl,24);
|
||||||
|
end;
|
||||||
|
/* 32 char unique name */
|
||||||
|
newname='sasjs'!!substr(cats(put(md5(name),$hex32.)),1,27);
|
||||||
|
|
||||||
|
call symputx(cats('name',_n_),name,'l');
|
||||||
|
call symputx(cats('newname',_n_),newname,'l');
|
||||||
|
call symputx(cats('len',_n_),newlen,'l');
|
||||||
|
call symputx(cats('fmt',_n_),fmt,'l');
|
||||||
|
call symputx(cats('type',_n_),type,'l');
|
||||||
|
if last then call symputx('nobs',_n_,'l');
|
||||||
|
run;
|
||||||
|
|
||||||
|
/* clean up */
|
||||||
|
proc sql;
|
||||||
|
drop table &syslast;
|
||||||
|
|
||||||
|
%if &nobs=0 %then %do;
|
||||||
|
%put Dataset &libds has no columns!
|
||||||
|
data &outds;
|
||||||
|
set &libds;
|
||||||
|
run;
|
||||||
|
%return;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
data &outds;
|
||||||
|
/* rename on entry */
|
||||||
|
set &libds(rename=(
|
||||||
|
%local i;
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
&&name&i=&&newname&i
|
||||||
|
%end;
|
||||||
|
));
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
length &&name&i $&&len&i;
|
||||||
|
&&name&i=left(put(&&newname&i,&&fmt&i));
|
||||||
|
drop &&newname&i;
|
||||||
|
%end;
|
||||||
|
if _error_ then call symputx('syscc',1012);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mend mp_ds2fmtds;
|
||||||
@@ -48,6 +48,8 @@
|
|||||||
@param dbg= DEPRECATED - was used to conditionally add PRETTY to
|
@param dbg= DEPRECATED - was used to conditionally add PRETTY to
|
||||||
proc json but this can cause line truncation in large files.
|
proc json but this can cause line truncation in large files.
|
||||||
|
|
||||||
|
<h4> Related Macros <h4>
|
||||||
|
@li mp_ds2fmtds.sas
|
||||||
|
|
||||||
@version 9.2
|
@version 9.2
|
||||||
@author Allan Bowe
|
@author Allan Bowe
|
||||||
@@ -55,10 +57,11 @@
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
%macro mp_jsonout(action,ds,jref=_webout,dslabel=,fmt=Y,engine=PROCJSON,dbg=0
|
%macro mp_jsonout(action,ds,jref=_webout,dslabel=,fmt=Y,engine=DATASTEP,dbg=0
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
%put output location=&jref;
|
%put output location=&jref;
|
||||||
%if &action=OPEN %then %do;
|
%if &action=OPEN %then %do;
|
||||||
|
OPTIONS NOBOMFILE;
|
||||||
data _null_;file &jref encoding='utf-8';
|
data _null_;file &jref encoding='utf-8';
|
||||||
put '{"START_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '"';
|
put '{"START_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '"';
|
||||||
run;
|
run;
|
||||||
@@ -86,6 +89,64 @@
|
|||||||
%put &sysmacroname: &ds NOT FOUND!!!;
|
%put &sysmacroname: &ds NOT FOUND!!!;
|
||||||
%return;
|
%return;
|
||||||
%end;
|
%end;
|
||||||
|
%if &fmt=Y %then %do;
|
||||||
|
%put converting every variable to a formatted variable;
|
||||||
|
/* see mp_ds2fmtds.sas for source */
|
||||||
|
proc contents noprint data=&ds
|
||||||
|
out=_data_(keep=name type length format formatl formatd varnum);
|
||||||
|
run;
|
||||||
|
proc sort;
|
||||||
|
by varnum;
|
||||||
|
run;
|
||||||
|
%local fmtds;
|
||||||
|
%let fmtds=%scan(&syslast,2,.);
|
||||||
|
/* prepare formats and varnames */
|
||||||
|
data _null_;
|
||||||
|
set &fmtds end=last;
|
||||||
|
name=upcase(name);
|
||||||
|
/* fix formats */
|
||||||
|
if type=2 or type=6 then do;
|
||||||
|
length fmt $49.;
|
||||||
|
if format='' then fmt=cats('$',length,'.');
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else fmt=cats(format,formatl,'.');
|
||||||
|
newlen=max(formatl,length);
|
||||||
|
end;
|
||||||
|
else do;
|
||||||
|
if format='' then fmt='best.';
|
||||||
|
else if formatl=0 then fmt=cats(format,'.');
|
||||||
|
else if formatd=0 then fmt=cats(format,formatl,'.');
|
||||||
|
else fmt=cats(format,formatl,'.',formatd);
|
||||||
|
/* needs to be wide, for datetimes etc */
|
||||||
|
newlen=max(length,formatl,24);
|
||||||
|
end;
|
||||||
|
/* 32 char unique name */
|
||||||
|
newname='sasjs'!!substr(cats(put(md5(name),$hex32.)),1,27);
|
||||||
|
|
||||||
|
call symputx(cats('name',_n_),name,'l');
|
||||||
|
call symputx(cats('newname',_n_),newname,'l');
|
||||||
|
call symputx(cats('len',_n_),newlen,'l');
|
||||||
|
call symputx(cats('fmt',_n_),fmt,'l');
|
||||||
|
call symputx(cats('type',_n_),type,'l');
|
||||||
|
if last then call symputx('nobs',_n_,'l');
|
||||||
|
run;
|
||||||
|
data &fmtds;
|
||||||
|
/* rename on entry */
|
||||||
|
set &ds(rename=(
|
||||||
|
%local i;
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
&&name&i=&&newname&i
|
||||||
|
%end;
|
||||||
|
));
|
||||||
|
%do i=1 %to &nobs;
|
||||||
|
length &&name&i $&&len&i;
|
||||||
|
&&name&i=left(put(&&newname&i,&&fmt&i));
|
||||||
|
drop &&newname&i;
|
||||||
|
%end;
|
||||||
|
if _error_ then call symputx('syscc',1012);
|
||||||
|
run;
|
||||||
|
%let ds=&fmtds;
|
||||||
|
%end; /* &fmt=Y */
|
||||||
data _null_;file &jref mod ;
|
data _null_;file &jref mod ;
|
||||||
put "["; call symputx('cols',0,'l');
|
put "["; call symputx('cols',0,'l');
|
||||||
proc sort
|
proc sort
|
||||||
@@ -169,4 +230,4 @@
|
|||||||
put "}";
|
put "}";
|
||||||
run;
|
run;
|
||||||
%end;
|
%end;
|
||||||
%mend;
|
%mend mp_jsonout;
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
|mustbevalidname|can be anything, oops, %abort!!|
|
|mustbevalidname|can be anything, oops, %abort!!|
|
||||||
|
|
||||||
@param [in] debug= (log) Provide the _debug value
|
@param [in] debug= (log) Provide the _debug value
|
||||||
|
@param [in] viyaresult=(WEBOUT_JSON) The Viya result type to return. For
|
||||||
|
more info, see mv_getjobresult.sas
|
||||||
@param [out] outlib= (0) Output libref to contain the final tables. Set to
|
@param [out] outlib= (0) Output libref to contain the final tables. Set to
|
||||||
0 if the service output is not in JSON format.
|
0 if the service output is not in JSON format.
|
||||||
@param [out] outref= (0) Output fileref to create, to contain the full _webout
|
@param [out] outref= (0) Output fileref to create, to contain the full _webout
|
||||||
@@ -46,8 +48,16 @@
|
|||||||
inputparams=0,
|
inputparams=0,
|
||||||
debug=log,
|
debug=log,
|
||||||
outlib=0,
|
outlib=0,
|
||||||
outref=0
|
outref=0,
|
||||||
|
viyaresult=WEBOUT_JSON
|
||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
%local mdebug;
|
||||||
|
%if &debug ne 0 %then %do;
|
||||||
|
%let mdebug=1;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let mdebug=0;
|
||||||
|
|
||||||
/* sanitise inputparams */
|
/* sanitise inputparams */
|
||||||
%local pcnt;
|
%local pcnt;
|
||||||
@@ -72,22 +82,6 @@
|
|||||||
)
|
)
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* parse the input files */
|
|
||||||
%local webcount i var;
|
|
||||||
%if %quote(&inputfiles) ne 0 %then %do;
|
|
||||||
%let webcount=%sysfunc(countw(&inputfiles));
|
|
||||||
%put &=webcount;
|
|
||||||
%do i=1 %to &webcount;
|
|
||||||
%let var=%scan(&inputfiles,&i,%str( ));
|
|
||||||
%local webfref&i webname&i;
|
|
||||||
%let webref&i=%scan(&var,1,%str(:));
|
|
||||||
%let webname&i=%scan(&var,2,%str(:));
|
|
||||||
%put webref&i=&&webref&i;
|
|
||||||
%put webname&i=&&webname&i;
|
|
||||||
%end;
|
|
||||||
%end;
|
|
||||||
%else %let webcount=0;
|
|
||||||
|
|
||||||
|
|
||||||
%local fref1 webref;
|
%local fref1 webref;
|
||||||
%let fref1=%mf_getuniquefileref();
|
%let fref1=%mf_getuniquefileref();
|
||||||
@@ -96,6 +90,23 @@
|
|||||||
%local platform;
|
%local platform;
|
||||||
%let platform=%mf_getplatform();
|
%let platform=%mf_getplatform();
|
||||||
%if &platform=SASMETA %then %do;
|
%if &platform=SASMETA %then %do;
|
||||||
|
|
||||||
|
/* parse the input files */
|
||||||
|
%local webcount i var;
|
||||||
|
%if %quote(&inputfiles) ne 0 %then %do;
|
||||||
|
%let webcount=%sysfunc(countw(&inputfiles));
|
||||||
|
%put &=webcount;
|
||||||
|
%do i=1 %to &webcount;
|
||||||
|
%let var=%scan(&inputfiles,&i,%str( ));
|
||||||
|
%local webfref&i webname&i;
|
||||||
|
%let webref&i=%scan(&var,1,%str(:));
|
||||||
|
%let webname&i=%scan(&var,2,%str(:));
|
||||||
|
%put webref&i=&&webref&i;
|
||||||
|
%put webname&i=&&webname&i;
|
||||||
|
%end;
|
||||||
|
%end;
|
||||||
|
%else %let webcount=0;
|
||||||
|
|
||||||
proc stp program="&program";
|
proc stp program="&program";
|
||||||
inputparam _program="&program"
|
inputparam _program="&program"
|
||||||
%do i=1 %to &webcount;
|
%do i=1 %to &webcount;
|
||||||
@@ -152,14 +163,65 @@
|
|||||||
|
|
||||||
%end;
|
%end;
|
||||||
%else %if &platform=SASVIYA %then %do;
|
%else %if &platform=SASVIYA %then %do;
|
||||||
data ;
|
|
||||||
_program="&program";
|
/* prepare inputparams */
|
||||||
|
%local ds1;
|
||||||
|
%let ds1=%mf_getuniquename();
|
||||||
|
%if "&inputparams" ne "0" %then %do;
|
||||||
|
proc transpose data=&inputparams out=&ds1;
|
||||||
|
id name;
|
||||||
|
var value;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
data &ds1;run;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
/* parse the input files - convert to sasjs params */
|
||||||
|
%local webcount i var sasjs_tables;
|
||||||
|
%if %quote(&inputfiles) ne 0 %then %do;
|
||||||
|
%let webcount=%sysfunc(countw(&inputfiles));
|
||||||
|
%put &=webcount;
|
||||||
|
%do i=1 %to &webcount;
|
||||||
|
%let var=%scan(&inputfiles,&i,%str( ));
|
||||||
|
%local webfref&i webname&i sasjs&i.data;
|
||||||
|
%let webref&i=%scan(&var,1,%str(:));
|
||||||
|
%let webname&i=%scan(&var,2,%str(:));
|
||||||
|
%put webref&i=&&webref&i;
|
||||||
|
%put webname&i=&&webname&i;
|
||||||
|
|
||||||
|
%let sasjs_tables=&sasjs_tables &&webname&i;
|
||||||
|
data _null_;
|
||||||
|
infile &&webref&i lrecl=32767;
|
||||||
|
input;
|
||||||
|
if _n_=1 then call symputx("sasjs&i.data",_infile_);
|
||||||
|
else call symputx(
|
||||||
|
"sasjs&i.data",cats(symget("sasjs&i.data"),'0D0A'x,_infile_)
|
||||||
|
);
|
||||||
|
putlog "&sysmacroname infile: " _infile_;
|
||||||
|
run;
|
||||||
|
data &ds1;
|
||||||
|
set &ds1;
|
||||||
|
length sasjs&i.data $32767 sasjs_tables $1000;
|
||||||
|
sasjs&i.data=symget("sasjs&i.data");
|
||||||
|
sasjs_tables=symget("sasjs_tables");
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
|
%end;
|
||||||
|
%else %let webcount=0;
|
||||||
|
|
||||||
|
data &ds1;
|
||||||
|
retain _program "&program";
|
||||||
|
set &ds1;
|
||||||
|
putlog "&sysmacroname inputparams:";
|
||||||
|
putlog (_all_)(=);
|
||||||
run;
|
run;
|
||||||
|
|
||||||
%mv_jobflow(inds=&syslast
|
%mv_jobflow(inds=&ds1
|
||||||
,maxconcurrency=1
|
,maxconcurrency=1
|
||||||
,outds=work.results
|
,outds=work.results
|
||||||
,outref=&fref1
|
,outref=&fref1
|
||||||
|
,mdebug=&mdebug
|
||||||
)
|
)
|
||||||
/* show the log */
|
/* show the log */
|
||||||
data _null_;
|
data _null_;
|
||||||
@@ -171,12 +233,14 @@
|
|||||||
data _null_;
|
data _null_;
|
||||||
set work.results;
|
set work.results;
|
||||||
call symputx('uri',uri);
|
call symputx('uri',uri);
|
||||||
|
putlog "&sysmacroname: fetching results for " uri;
|
||||||
run;
|
run;
|
||||||
/* fetch results from webout.json */
|
/* fetch results from webout.json */
|
||||||
%mv_getjobresult(uri=&uri,
|
%mv_getjobresult(uri=&uri,
|
||||||
result=WEBOUT_JSON,
|
result=&viyaresult,
|
||||||
outref=&outref,
|
outref=&outref,
|
||||||
outlib=&outlib
|
outlib=&outlib,
|
||||||
|
mdebug=&mdebug
|
||||||
)
|
)
|
||||||
|
|
||||||
%end;
|
%end;
|
||||||
@@ -184,6 +248,12 @@
|
|||||||
%put %str(ERR)OR: Unrecognised platform: &platform;
|
%put %str(ERR)OR: Unrecognised platform: &platform;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
filename &webref clear;
|
%if &mdebug=0 %then %do;
|
||||||
|
filename &webref clear;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
%put &sysmacroname exit vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
|
||||||
%mend;
|
%mend mp_testservice;
|
||||||
@@ -86,10 +86,11 @@ data _null_;
|
|||||||
put "/* Created on %sysfunc(datetime(),datetime19.) by %mf_getuser() */";
|
put "/* Created on %sysfunc(datetime(),datetime19.) by %mf_getuser() */";
|
||||||
/* WEBOUT BEGIN */
|
/* WEBOUT BEGIN */
|
||||||
put ' ';
|
put ' ';
|
||||||
put '%macro mp_jsonout(action,ds,jref=_webout,dslabel=,fmt=Y,engine=PROCJSON,dbg=0 ';
|
put '%macro mp_jsonout(action,ds,jref=_webout,dslabel=,fmt=Y,engine=DATASTEP,dbg=0 ';
|
||||||
put ')/*/STORE SOURCE*/; ';
|
put ')/*/STORE SOURCE*/; ';
|
||||||
put '%put output location=&jref; ';
|
put '%put output location=&jref; ';
|
||||||
put '%if &action=OPEN %then %do; ';
|
put '%if &action=OPEN %then %do; ';
|
||||||
|
put ' OPTIONS NOBOMFILE; ';
|
||||||
put ' data _null_;file &jref encoding=''utf-8''; ';
|
put ' data _null_;file &jref encoding=''utf-8''; ';
|
||||||
put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; ';
|
put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; ';
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
@@ -117,6 +118,64 @@ data _null_;
|
|||||||
put ' %put &sysmacroname: &ds NOT FOUND!!!; ';
|
put ' %put &sysmacroname: &ds NOT FOUND!!!; ';
|
||||||
put ' %return; ';
|
put ' %return; ';
|
||||||
put ' %end; ';
|
put ' %end; ';
|
||||||
|
put ' %if &fmt=Y %then %do; ';
|
||||||
|
put ' %put converting every variable to a formatted variable; ';
|
||||||
|
put ' /* see mp_ds2fmtds.sas for source */ ';
|
||||||
|
put ' proc contents noprint data=&ds ';
|
||||||
|
put ' out=_data_(keep=name type length format formatl formatd varnum); ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' proc sort; ';
|
||||||
|
put ' by varnum; ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' %local fmtds; ';
|
||||||
|
put ' %let fmtds=%scan(&syslast,2,.); ';
|
||||||
|
put ' /* prepare formats and varnames */ ';
|
||||||
|
put ' data _null_; ';
|
||||||
|
put ' set &fmtds end=last; ';
|
||||||
|
put ' name=upcase(name); ';
|
||||||
|
put ' /* fix formats */ ';
|
||||||
|
put ' if type=2 or type=6 then do; ';
|
||||||
|
put ' length fmt $49.; ';
|
||||||
|
put ' if format='''' then fmt=cats(''$'',length,''.''); ';
|
||||||
|
put ' else if formatl=0 then fmt=cats(format,''.''); ';
|
||||||
|
put ' else fmt=cats(format,formatl,''.''); ';
|
||||||
|
put ' newlen=max(formatl,length); ';
|
||||||
|
put ' end; ';
|
||||||
|
put ' else do; ';
|
||||||
|
put ' if format='''' then fmt=''best.''; ';
|
||||||
|
put ' else if formatl=0 then fmt=cats(format,''.''); ';
|
||||||
|
put ' else if formatd=0 then fmt=cats(format,formatl,''.''); ';
|
||||||
|
put ' else fmt=cats(format,formatl,''.'',formatd); ';
|
||||||
|
put ' /* needs to be wide, for datetimes etc */ ';
|
||||||
|
put ' newlen=max(length,formatl,24); ';
|
||||||
|
put ' end; ';
|
||||||
|
put ' /* 32 char unique name */ ';
|
||||||
|
put ' newname=''sasjs''!!substr(cats(put(md5(name),$hex32.)),1,27); ';
|
||||||
|
put ' ';
|
||||||
|
put ' call symputx(cats(''name'',_n_),name,''l''); ';
|
||||||
|
put ' call symputx(cats(''newname'',_n_),newname,''l''); ';
|
||||||
|
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
||||||
|
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
||||||
|
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
||||||
|
put ' if last then call symputx(''nobs'',_n_,''l''); ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' data &fmtds; ';
|
||||||
|
put ' /* rename on entry */ ';
|
||||||
|
put ' set &ds(rename=( ';
|
||||||
|
put ' %local i; ';
|
||||||
|
put ' %do i=1 %to &nobs; ';
|
||||||
|
put ' &&name&i=&&newname&i ';
|
||||||
|
put ' %end; ';
|
||||||
|
put ' )); ';
|
||||||
|
put ' %do i=1 %to &nobs; ';
|
||||||
|
put ' length &&name&i $&&len&i; ';
|
||||||
|
put ' &&name&i=left(put(&&newname&i,&&fmt&i)); ';
|
||||||
|
put ' drop &&newname&i; ';
|
||||||
|
put ' %end; ';
|
||||||
|
put ' if _error_ then call symputx(''syscc'',1012); ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' %let ds=&fmtds; ';
|
||||||
|
put ' %end; /* &fmt=Y */ ';
|
||||||
put ' data _null_;file &jref mod ; ';
|
put ' data _null_;file &jref mod ; ';
|
||||||
put ' put "["; call symputx(''cols'',0,''l''); ';
|
put ' put "["; call symputx(''cols'',0,''l''); ';
|
||||||
put ' proc sort ';
|
put ' proc sort ';
|
||||||
@@ -200,7 +259,7 @@ data _null_;
|
|||||||
put ' put "}"; ';
|
put ' put "}"; ';
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
put '%end; ';
|
put '%end; ';
|
||||||
put '%mend; ';
|
put '%mend mp_jsonout; ';
|
||||||
put '%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); ';
|
put '%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); ';
|
||||||
put '%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug ';
|
put '%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug ';
|
||||||
put ' sasjs_tables; ';
|
put ' sasjs_tables; ';
|
||||||
|
|||||||
@@ -16,24 +16,6 @@
|
|||||||
"readMe": "../../README.md"
|
"readMe": "../../README.md"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"serviceConfig": {
|
|
||||||
"initProgram": "tests/testinit.sas",
|
|
||||||
"termProgram": "tests/testterm.sas",
|
|
||||||
"serviceFolders": [
|
|
||||||
"tests/base",
|
|
||||||
"tests/viya"
|
|
||||||
],
|
|
||||||
"macroVars": {
|
|
||||||
"mcTestAppLoc": "/Public/temp/macrocore"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"testConfig": {
|
|
||||||
"initProgram": "tests/testinit.sas",
|
|
||||||
"termProgram": "tests/testterm.sas",
|
|
||||||
"macroVars": {
|
|
||||||
"mcTestAppLoc": "/Public/temp/macrocore"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"defaultTarget": "viya",
|
"defaultTarget": "viya",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
@@ -44,7 +26,23 @@
|
|||||||
"deployConfig": {
|
"deployConfig": {
|
||||||
"deployServicePack": true
|
"deployServicePack": true
|
||||||
},
|
},
|
||||||
"contextName": "SAS Job Execution compute context"
|
"macroFolders": [
|
||||||
|
"base",
|
||||||
|
"meta",
|
||||||
|
"metax",
|
||||||
|
"viya",
|
||||||
|
"lua",
|
||||||
|
"tests/base",
|
||||||
|
"tests/viya"
|
||||||
|
],
|
||||||
|
"contextName": "SAS Job Execution compute context",
|
||||||
|
"testConfig": {
|
||||||
|
"initProgram": "tests/testinit.sas",
|
||||||
|
"termProgram": "tests/testterm.sas",
|
||||||
|
"macroVars": {
|
||||||
|
"mcTestAppLoc": "/Public/temp/macrocore"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
28
tests/base/mp_ds2fmtds.test.sas
Normal file
28
tests/base/mp_ds2fmtds.test.sas
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_ds2fmtds.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mp_ds2fmtds.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
proc sql;
|
||||||
|
create table test as select * from dictionary.tables where libname='SASHELP';
|
||||||
|
|
||||||
|
filename inc temp;
|
||||||
|
data _null_;
|
||||||
|
set work.test;
|
||||||
|
file inc;
|
||||||
|
line=cats('%mp_ds2fmtds(sashelp.',memname,',',memname,')');
|
||||||
|
put line;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%inc inc;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&syscc=0),
|
||||||
|
desc=Checking tables were created successfully,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
42
tests/base/mp_jsonout.test.sas
Normal file
42
tests/base/mp_jsonout.test.sas
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_jsonout.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mp_jsonout.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
filename webref temp;
|
||||||
|
|
||||||
|
data demo;
|
||||||
|
dtval=date();
|
||||||
|
format dtval date9.;
|
||||||
|
compare=put(date(),date9.);
|
||||||
|
call symputx('compare',compare);
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_jsonout(OPEN,jref=webref)
|
||||||
|
%mp_jsonout(OBJ,demo,jref=webref,fmt=Y)
|
||||||
|
%mp_jsonout(CLOSE,jref=webref)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
infile webref;
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
|
||||||
|
libname web JSON fileref=webref;
|
||||||
|
%let dtval=0;
|
||||||
|
data work.test;
|
||||||
|
set web.demo;
|
||||||
|
call symputx('dtval',dtval);
|
||||||
|
run;
|
||||||
|
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&dtval=&compare),
|
||||||
|
desc=Checking tables were created successfully,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
@@ -18,20 +18,20 @@ data _null_;
|
|||||||
file testref;
|
file testref;
|
||||||
put '01'x;
|
put '01'x;
|
||||||
run;
|
run;
|
||||||
|
%put TEST1: creating web service;
|
||||||
%mv_createwebservice(
|
%mv_createwebservice(
|
||||||
path=&mcTestAppLoc/temp/macros,
|
path=&mcTestAppLoc/temp/macros,
|
||||||
code=testref,
|
name=mv_createwebservice,
|
||||||
name=mv_createwebservice
|
code=testref
|
||||||
)
|
)
|
||||||
|
%put TEST1: fetching web service code;
|
||||||
filename compare temp;
|
|
||||||
%mv_getjobcode(
|
%mv_getjobcode(
|
||||||
path=&mcTestAppLoc/temp/macros
|
path=&mcTestAppLoc/temp/macros,
|
||||||
,name=mv_createwebservice
|
name=mv_createwebservice,
|
||||||
,outref=compare;
|
outref=compare
|
||||||
)
|
)
|
||||||
|
%put TEST1: checking web service code;
|
||||||
data test_results;
|
data work.test_results;
|
||||||
length test_description $256 test_result $4 test_comments $256;
|
length test_description $256 test_result $4 test_comments $256;
|
||||||
infile compare end=eof;
|
infile compare end=eof;
|
||||||
input;
|
input;
|
||||||
|
|||||||
49
tests/viya/mv_getjobcode.test.sas
Normal file
49
tests/viya/mv_getjobcode.test.sas
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mv_getjobcode macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mv_createjob.sas
|
||||||
|
@li mv_getjobcode.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Case 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* write some code to a job */
|
||||||
|
%let incode=%str(data test; set sashelp.class;run;);
|
||||||
|
filename testref temp;
|
||||||
|
data _null_;
|
||||||
|
file testref;
|
||||||
|
put "&incode";
|
||||||
|
run;
|
||||||
|
%mv_createjob(
|
||||||
|
code=testref,
|
||||||
|
path=&mcTestAppLoc/services/temp,
|
||||||
|
name=some_job
|
||||||
|
)
|
||||||
|
|
||||||
|
/* now get the code back */
|
||||||
|
%mv_getjobcode(
|
||||||
|
path=&mcTestAppLoc/services/temp,
|
||||||
|
name=some_job,
|
||||||
|
outref=mycode
|
||||||
|
)
|
||||||
|
|
||||||
|
%let diditexist=NO;
|
||||||
|
data work.test1;
|
||||||
|
infile mycode;
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
line=_infile_;
|
||||||
|
check=symget('incode');
|
||||||
|
if _infile_=symget('incode') then call symputx('diditexist','YES');
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(&diditexist=NO),
|
||||||
|
desc=Check if the code that was sent was successfully retrieved
|
||||||
|
)
|
||||||
@@ -39,23 +39,26 @@
|
|||||||
@li mf_isblank.sas
|
@li mf_isblank.sas
|
||||||
@li mv_deletejes.sas
|
@li mv_deletejes.sas
|
||||||
|
|
||||||
@param path= The full path (on SAS Drive) where the service will be created
|
@param [in] path= The full path (on SAS Drive) where the service will be
|
||||||
@param name= The name of the service
|
created
|
||||||
@param desc= The description of the service
|
@param [in] name= The name of the service
|
||||||
@param precode= Space separated list of filerefs, pointing to the code that
|
@param [in] desc= The description of the service
|
||||||
needs to be attached to the beginning of the service
|
@param [in] precode= Space separated list of filerefs, pointing to the code
|
||||||
@param code= Fileref(s) of the actual code to be added
|
that needs to be attached to the beginning of the service
|
||||||
@param access_token_var= The global macro variable to contain the access token
|
@param [in] code= Fileref(s) of the actual code to be added
|
||||||
@param grant_type= valid values are "password" or "authorization_code"
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
|
token
|
||||||
|
@param [in] grant_type= valid values are "password" or "authorization_code"
|
||||||
(unquoted). The default is authorization_code.
|
(unquoted). The default is authorization_code.
|
||||||
@param replace= select NO to avoid replacing any existing service in that
|
@param [in] replace=(YES) Select NO to avoid replacing any existing service in
|
||||||
location
|
that location
|
||||||
@param adapter= the macro uses the sasjs adapter by default. To use another
|
@param [in] adapter= the macro uses the sasjs adapter by default. To use
|
||||||
adapter, add a (different) fileref here.
|
another adapter, add a (different) fileref here.
|
||||||
@param contextname= Choose a specific context on which to run the Job. Leave
|
@param [in] contextname= Choose a specific context on which to run the Job. Leave
|
||||||
blank to use the default context. From Viya 3.5 it is possible to configure
|
blank to use the default context. From Viya 3.5 it is possible to configure
|
||||||
a shared context - see
|
a shared context - see
|
||||||
https://go.documentation.sas.com/?docsetId=calcontexts&docsetTarget=n1hjn8eobk5pyhn1wg3ja0drdl6h.htm&docsetVersion=3.5&locale=en
|
https://go.documentation.sas.com/?docsetId=calcontexts&docsetTarget=n1hjn8eobk5pyhn1wg3ja0drdl6h.htm&docsetVersion=3.5&locale=en
|
||||||
|
@param [in] mdebug=(0) set to 1 to enable DEBUG messages
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe, source: https://github.com/sasjs/core
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@@ -71,9 +74,17 @@ https://go.documentation.sas.com/?docsetId=calcontexts&docsetTarget=n1hjn8eobk5p
|
|||||||
,grant_type=sas_services
|
,grant_type=sas_services
|
||||||
,replace=YES
|
,replace=YES
|
||||||
,adapter=sasjs
|
,adapter=sasjs
|
||||||
,debug=0
|
,mdebug=0
|
||||||
,contextname=
|
,contextname=
|
||||||
|
,debug=0 /* @TODO - Deprecate */
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -126,7 +137,7 @@ proc http method='GET' out=&fname1 &oauth_bearer
|
|||||||
headers "Authorization"="Bearer &&&access_token_var";
|
headers "Authorization"="Bearer &&&access_token_var";
|
||||||
%end;
|
%end;
|
||||||
run;
|
run;
|
||||||
%if &debug %then %do;
|
%if &mdebug=1 %then %do;
|
||||||
data _null_;
|
data _null_;
|
||||||
infile &fname1;
|
infile &fname1;
|
||||||
input;
|
input;
|
||||||
@@ -165,7 +176,7 @@ proc http method='GET'
|
|||||||
%end;
|
%end;
|
||||||
'Accept'='application/vnd.sas.collection+json'
|
'Accept'='application/vnd.sas.collection+json'
|
||||||
'Accept-Language'='string';
|
'Accept-Language'='string';
|
||||||
%if &debug=1 %then %do;
|
%if &mdebug=1 %then %do;
|
||||||
debug level = 3;
|
debug level = 3;
|
||||||
%end;
|
%end;
|
||||||
run;
|
run;
|
||||||
@@ -220,16 +231,17 @@ run;
|
|||||||
* These put statements are auto generated - to change the macro, change the
|
* These put statements are auto generated - to change the macro, change the
|
||||||
* source (mv_webout) and run `build.py`
|
* source (mv_webout) and run `build.py`
|
||||||
*/
|
*/
|
||||||
filename sasjs temp lrecl=3000;
|
filename &adapter temp lrecl=3000;
|
||||||
data _null_;
|
data _null_;
|
||||||
file sasjs;
|
file &adapter;
|
||||||
put "/* Created on %sysfunc(datetime(),datetime19.) by &sysuserid */";
|
put "/* Created on %sysfunc(datetime(),datetime19.) by &sysuserid */";
|
||||||
/* WEBOUT BEGIN */
|
/* WEBOUT BEGIN */
|
||||||
put ' ';
|
put ' ';
|
||||||
put '%macro mp_jsonout(action,ds,jref=_webout,dslabel=,fmt=Y,engine=PROCJSON,dbg=0 ';
|
put '%macro mp_jsonout(action,ds,jref=_webout,dslabel=,fmt=Y,engine=DATASTEP,dbg=0 ';
|
||||||
put ')/*/STORE SOURCE*/; ';
|
put ')/*/STORE SOURCE*/; ';
|
||||||
put '%put output location=&jref; ';
|
put '%put output location=&jref; ';
|
||||||
put '%if &action=OPEN %then %do; ';
|
put '%if &action=OPEN %then %do; ';
|
||||||
|
put ' OPTIONS NOBOMFILE; ';
|
||||||
put ' data _null_;file &jref encoding=''utf-8''; ';
|
put ' data _null_;file &jref encoding=''utf-8''; ';
|
||||||
put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; ';
|
put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; ';
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
@@ -257,6 +269,64 @@ data _null_;
|
|||||||
put ' %put &sysmacroname: &ds NOT FOUND!!!; ';
|
put ' %put &sysmacroname: &ds NOT FOUND!!!; ';
|
||||||
put ' %return; ';
|
put ' %return; ';
|
||||||
put ' %end; ';
|
put ' %end; ';
|
||||||
|
put ' %if &fmt=Y %then %do; ';
|
||||||
|
put ' %put converting every variable to a formatted variable; ';
|
||||||
|
put ' /* see mp_ds2fmtds.sas for source */ ';
|
||||||
|
put ' proc contents noprint data=&ds ';
|
||||||
|
put ' out=_data_(keep=name type length format formatl formatd varnum); ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' proc sort; ';
|
||||||
|
put ' by varnum; ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' %local fmtds; ';
|
||||||
|
put ' %let fmtds=%scan(&syslast,2,.); ';
|
||||||
|
put ' /* prepare formats and varnames */ ';
|
||||||
|
put ' data _null_; ';
|
||||||
|
put ' set &fmtds end=last; ';
|
||||||
|
put ' name=upcase(name); ';
|
||||||
|
put ' /* fix formats */ ';
|
||||||
|
put ' if type=2 or type=6 then do; ';
|
||||||
|
put ' length fmt $49.; ';
|
||||||
|
put ' if format='''' then fmt=cats(''$'',length,''.''); ';
|
||||||
|
put ' else if formatl=0 then fmt=cats(format,''.''); ';
|
||||||
|
put ' else fmt=cats(format,formatl,''.''); ';
|
||||||
|
put ' newlen=max(formatl,length); ';
|
||||||
|
put ' end; ';
|
||||||
|
put ' else do; ';
|
||||||
|
put ' if format='''' then fmt=''best.''; ';
|
||||||
|
put ' else if formatl=0 then fmt=cats(format,''.''); ';
|
||||||
|
put ' else if formatd=0 then fmt=cats(format,formatl,''.''); ';
|
||||||
|
put ' else fmt=cats(format,formatl,''.'',formatd); ';
|
||||||
|
put ' /* needs to be wide, for datetimes etc */ ';
|
||||||
|
put ' newlen=max(length,formatl,24); ';
|
||||||
|
put ' end; ';
|
||||||
|
put ' /* 32 char unique name */ ';
|
||||||
|
put ' newname=''sasjs''!!substr(cats(put(md5(name),$hex32.)),1,27); ';
|
||||||
|
put ' ';
|
||||||
|
put ' call symputx(cats(''name'',_n_),name,''l''); ';
|
||||||
|
put ' call symputx(cats(''newname'',_n_),newname,''l''); ';
|
||||||
|
put ' call symputx(cats(''len'',_n_),newlen,''l''); ';
|
||||||
|
put ' call symputx(cats(''fmt'',_n_),fmt,''l''); ';
|
||||||
|
put ' call symputx(cats(''type'',_n_),type,''l''); ';
|
||||||
|
put ' if last then call symputx(''nobs'',_n_,''l''); ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' data &fmtds; ';
|
||||||
|
put ' /* rename on entry */ ';
|
||||||
|
put ' set &ds(rename=( ';
|
||||||
|
put ' %local i; ';
|
||||||
|
put ' %do i=1 %to &nobs; ';
|
||||||
|
put ' &&name&i=&&newname&i ';
|
||||||
|
put ' %end; ';
|
||||||
|
put ' )); ';
|
||||||
|
put ' %do i=1 %to &nobs; ';
|
||||||
|
put ' length &&name&i $&&len&i; ';
|
||||||
|
put ' &&name&i=left(put(&&newname&i,&&fmt&i)); ';
|
||||||
|
put ' drop &&newname&i; ';
|
||||||
|
put ' %end; ';
|
||||||
|
put ' if _error_ then call symputx(''syscc'',1012); ';
|
||||||
|
put ' run; ';
|
||||||
|
put ' %let ds=&fmtds; ';
|
||||||
|
put ' %end; /* &fmt=Y */ ';
|
||||||
put ' data _null_;file &jref mod ; ';
|
put ' data _null_;file &jref mod ; ';
|
||||||
put ' put "["; call symputx(''cols'',0,''l''); ';
|
put ' put "["; call symputx(''cols'',0,''l''); ';
|
||||||
put ' proc sort ';
|
put ' proc sort ';
|
||||||
@@ -340,7 +410,7 @@ data _null_;
|
|||||||
put ' put "}"; ';
|
put ' put "}"; ';
|
||||||
put ' run; ';
|
put ' run; ';
|
||||||
put '%end; ';
|
put '%end; ';
|
||||||
put '%mend; ';
|
put '%mend mp_jsonout; ';
|
||||||
put '%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y); ';
|
put '%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y); ';
|
||||||
put '%global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name ';
|
put '%global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name ';
|
||||||
put ' sasjs_tables SYS_JES_JOB_URI; ';
|
put ' sasjs_tables SYS_JES_JOB_URI; ';
|
||||||
@@ -561,11 +631,12 @@ data _null_;
|
|||||||
run;
|
run;
|
||||||
|
|
||||||
/* insert the code, escaping double quotes and carriage returns */
|
/* insert the code, escaping double quotes and carriage returns */
|
||||||
|
%&dbg.put &sysmacroname: Creating final input file;
|
||||||
%local x fref freflist;
|
%local x fref freflist;
|
||||||
%let freflist= &adapter &precode &code ;
|
%let freflist= &adapter &precode &code ;
|
||||||
%do x=1 %to %sysfunc(countw(&freflist));
|
%do x=1 %to %sysfunc(countw(&freflist));
|
||||||
%let fref=%scan(&freflist,&x);
|
%let fref=%scan(&freflist,&x);
|
||||||
%put &sysmacroname: adding &fref;
|
%&dbg.put &sysmacroname: adding &fref fileref;
|
||||||
data _null_;
|
data _null_;
|
||||||
length filein 8 fileid 8;
|
length filein 8 fileid 8;
|
||||||
filein = fopen("&fref","I",1,"B");
|
filein = fopen("&fref","I",1,"B");
|
||||||
@@ -617,7 +688,12 @@ data _null_;
|
|||||||
put '"}';
|
put '"}';
|
||||||
run;
|
run;
|
||||||
|
|
||||||
/* now we can create the job!! */
|
%if &mdebug=1 and &SYS_PROCHTTP_STATUS_CODE ne 201 %then %do;
|
||||||
|
%put &sysmacroname: input about to be POSTed;
|
||||||
|
data _null_;infile &fname3;input;putlog _infile_;run;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%&dbg.put &sysmacroname: Creating the actual service!;
|
||||||
%local fname4;
|
%local fname4;
|
||||||
%let fname4=%mf_getuniquefileref();
|
%let fname4=%mf_getuniquefileref();
|
||||||
proc http method='POST'
|
proc http method='POST'
|
||||||
@@ -630,22 +706,18 @@ proc http method='POST'
|
|||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end;
|
%end;
|
||||||
"Accept"="application/vnd.sas.job.definition+json";
|
"Accept"="application/vnd.sas.job.definition+json";
|
||||||
%if &debug=1 %then %do;
|
%if &mdebug=1 %then %do;
|
||||||
debug level = 3;
|
debug level = 3;
|
||||||
%end;
|
%end;
|
||||||
run;
|
run;
|
||||||
/*data _null_;infile &fname4;input;putlog _infile_;run;*/
|
%if &mdebug=1 and &SYS_PROCHTTP_STATUS_CODE ne 201 %then %do;
|
||||||
|
%put &sysmacroname: output from POSTing job definition;
|
||||||
|
data _null_;infile &fname4;input;putlog _infile_;run;
|
||||||
|
%end;
|
||||||
%mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201)
|
%mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201)
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
||||||
)
|
)
|
||||||
/* clear refs */
|
|
||||||
filename &fname1 clear;
|
|
||||||
filename &fname2 clear;
|
|
||||||
filename &fname3 clear;
|
|
||||||
filename &fname4 clear;
|
|
||||||
filename &adapter clear;
|
|
||||||
libname &libref1 clear;
|
|
||||||
|
|
||||||
/* get the url so we can give a helpful log message */
|
/* get the url so we can give a helpful log message */
|
||||||
%local url;
|
%local url;
|
||||||
@@ -660,6 +732,19 @@ data _null_;
|
|||||||
call symputx('url',url);
|
call symputx('url',url);
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname exit vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
/* clear refs */
|
||||||
|
filename &fname1 clear;
|
||||||
|
filename &fname2 clear;
|
||||||
|
filename &fname3 clear;
|
||||||
|
filename &fname4 clear;
|
||||||
|
filename &adapter clear;
|
||||||
|
libname &libref1 clear;
|
||||||
|
%end;
|
||||||
|
|
||||||
%put &sysmacroname: Job &name successfully created in &path;
|
%put &sysmacroname: Job &name successfully created in &path;
|
||||||
%put &sysmacroname:;
|
%put &sysmacroname:;
|
||||||
@@ -669,4 +754,4 @@ run;
|
|||||||
%put &sysmacroname:;
|
%put &sysmacroname:;
|
||||||
%put &sysmacroname:;
|
%put &sysmacroname:;
|
||||||
|
|
||||||
%mend;
|
%mend mv_createwebservice;
|
||||||
|
|||||||
@@ -10,17 +10,20 @@
|
|||||||
,outfile=/tmp/some_job.sas
|
,outfile=/tmp/some_job.sas
|
||||||
)
|
)
|
||||||
|
|
||||||
@param [in] access_token_var= The global macro variable to contain the access token
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
|
token
|
||||||
@param [in] grant_type= valid values:
|
@param [in] grant_type= valid values:
|
||||||
* password
|
@li password
|
||||||
* authorization_code
|
@liauthorization_code
|
||||||
* detect - will check if access_token exists, if not will use sas_services if
|
@li detect - will check if access_token exists, if not will use sas_services
|
||||||
a SASStudioV session else authorization_code. Default option.
|
if a SASStudioV session else authorization_code. Default option.
|
||||||
* sas_services - will use oauth_bearer=sas_services
|
@li sas_services - will use oauth_bearer=sas_services
|
||||||
@param [in] path= The SAS Drive path of the job
|
@param [in] path= The SAS Drive path of the job
|
||||||
@param [in] name= The name of the job
|
@param [in] name= The name of the job
|
||||||
@param [out] outref= A fileref to which to write the source code
|
@param [in] mdebug=(0) set to 1 to enable DEBUG messages
|
||||||
@param [out] outfile= A file to which to write the source code
|
@param [out] outref=(0) A fileref to which to write the source code (will be
|
||||||
|
created with a TEMP engine)
|
||||||
|
@param [out] outfile=(0) A file to which to write the source code
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe, source: https://github.com/sasjs/core
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@@ -39,7 +42,15 @@
|
|||||||
,contextName=SAS Job Execution compute context
|
,contextName=SAS Job Execution compute context
|
||||||
,access_token_var=ACCESS_TOKEN
|
,access_token_var=ACCESS_TOKEN
|
||||||
,grant_type=sas_services
|
,grant_type=sas_services
|
||||||
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -133,18 +144,30 @@ data _null_;
|
|||||||
run;
|
run;
|
||||||
%inc "&fpath3..lua";
|
%inc "&fpath3..lua";
|
||||||
/* export to desired destination */
|
/* export to desired destination */
|
||||||
data _null_;
|
%if "&outref"="0" %then %do;
|
||||||
%if &outref=0 %then %do;
|
data _null_;
|
||||||
file "&outfile" lrecl=32767;
|
file "&outfile" lrecl=32767;
|
||||||
%end;
|
%end;
|
||||||
%else %do;
|
%else %do;
|
||||||
|
filename &outref temp;
|
||||||
|
data _null_;
|
||||||
file &outref;
|
file &outref;
|
||||||
%end;
|
%end;
|
||||||
infile &fname2;
|
infile &fname2;
|
||||||
input;
|
input;
|
||||||
put _infile_;
|
put _infile_;
|
||||||
|
&dbg. putlog _infile_;
|
||||||
run;
|
run;
|
||||||
filename &fname1 clear;
|
|
||||||
filename &fname2 clear;
|
%if &mdebug=1 %then %do;
|
||||||
filename &fname3 clear;
|
%put &sysmacroname exit vars:;
|
||||||
%mend;
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
/* clear refs */
|
||||||
|
filename &fname1 clear;
|
||||||
|
filename &fname2 clear;
|
||||||
|
filename &fname3 clear;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mv_getjobcode;
|
||||||
|
|||||||
@@ -86,6 +86,13 @@
|
|||||||
,grant_type=sas_services
|
,grant_type=sas_services
|
||||||
,mdebug=0
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -261,9 +268,10 @@ run;
|
|||||||
filename &fname3 clear;
|
filename &fname3 clear;
|
||||||
%end;
|
%end;
|
||||||
%else %do;
|
%else %do;
|
||||||
|
%put &sysmacroname exit vars:;
|
||||||
%put _local_;
|
%put _local_;
|
||||||
%end;
|
%end;
|
||||||
%mend;
|
%mend mv_getjoblog;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,9 @@
|
|||||||
|
|
||||||
@param [out] result= (WEBOUT_JSON) The result type to capture. Resolves
|
@param [out] result= (WEBOUT_JSON) The result type to capture. Resolves
|
||||||
to "_[column name]" from the results table when parsed with the JSON libname
|
to "_[column name]" from the results table when parsed with the JSON libname
|
||||||
engine.
|
engine. Example values:
|
||||||
|
@li WEBOUT_JSON
|
||||||
|
@li WEBOUT_TXT
|
||||||
|
|
||||||
@param [out] outref= (0) The output fileref to which to write the results
|
@param [out] outref= (0) The output fileref to which to write the results
|
||||||
@param [out] outlib= (0) The output library to which to assign the results
|
@param [out] outlib= (0) The output library to which to assign the results
|
||||||
@@ -96,6 +98,13 @@
|
|||||||
,outref=0
|
,outref=0
|
||||||
,outlib=0
|
,outlib=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -161,6 +170,13 @@ run;
|
|||||||
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
||||||
)
|
)
|
||||||
%end;
|
%end;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
data _null_;
|
||||||
|
infile &fname1 lrecl=32767;
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
|
|
||||||
/* extract results link */
|
/* extract results link */
|
||||||
%local lib1 resuri;
|
%local lib1 resuri;
|
||||||
@@ -169,7 +185,7 @@ libname &lib1 JSON fileref=&fname1;
|
|||||||
data _null_;
|
data _null_;
|
||||||
set &lib1..results;
|
set &lib1..results;
|
||||||
call symputx('resuri',_&result,'l');
|
call symputx('resuri',_&result,'l');
|
||||||
putlog (_all_)(=);
|
&dbg putlog "&sysmacroname results: " (_all_)(=);
|
||||||
run;
|
run;
|
||||||
%mp_abort(iftrue=("&resuri"=".")
|
%mp_abort(iftrue=("&resuri"=".")
|
||||||
,mac=&sysmacroname
|
,mac=&sysmacroname
|
||||||
@@ -187,6 +203,13 @@ proc http method='GET' out=&fname2 &oauth_bearer
|
|||||||
%end;
|
%end;
|
||||||
;
|
;
|
||||||
run;
|
run;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
data _null_;
|
||||||
|
infile &fname2 lrecl=32767;
|
||||||
|
input;
|
||||||
|
putlog _infile_;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
|
|
||||||
%if &outref ne 0 %then %do;
|
%if &outref ne 0 %then %do;
|
||||||
filename &outref temp;
|
filename &outref temp;
|
||||||
@@ -202,6 +225,8 @@ run;
|
|||||||
libname &lib1 clear;
|
libname &lib1 clear;
|
||||||
%end;
|
%end;
|
||||||
%else %do;
|
%else %do;
|
||||||
|
%put &sysmacroname exit vars:;
|
||||||
%put _local_;
|
%put _local_;
|
||||||
%end;
|
%end;
|
||||||
%mend;
|
|
||||||
|
%mend mv_getjobresult;
|
||||||
|
|||||||
@@ -23,24 +23,25 @@
|
|||||||
,paramstring=%str("macvarname":"macvarvalue","answer":42)
|
,paramstring=%str("macvarname":"macvarvalue","answer":42)
|
||||||
)
|
)
|
||||||
|
|
||||||
@param [in] access_token_var= The global macro variable to contain the access token
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
|
token
|
||||||
@param [in] grant_type= valid values:
|
@param [in] grant_type= valid values:
|
||||||
|
@li password
|
||||||
* password
|
@li authorization_code
|
||||||
* authorization_code
|
@li detect - will check if access_token exists, if not will use sas_services
|
||||||
* detect - will check if access_token exists, if not will use sas_services if
|
if a SASStudioV session else authorization_code. Default option.
|
||||||
a SASStudioV session else authorization_code. Default option.
|
@li sas_services - will use oauth_bearer=sas_services
|
||||||
* sas_services - will use oauth_bearer=sas_services
|
|
||||||
|
|
||||||
@param [in] path= The SAS Drive path to the job being executed
|
@param [in] path= The SAS Drive path to the job being executed
|
||||||
@param [in] name= The name of the job to execute
|
@param [in] name= The name of the job to execute
|
||||||
@param [in] paramstring= A JSON fragment with name:value pairs, eg: `"name":"value"`
|
@param [in] paramstring= A JSON fragment with name:value pairs, eg:
|
||||||
or "name":"value","name2":42`. This will need to be wrapped in `%str()`.
|
`"name":"value"` or "name":"value","name2":42`. This will need to be
|
||||||
|
wrapped in `%str()`.
|
||||||
|
|
||||||
@param [in] contextName= Context name with which to run the job.
|
@param [in] contextName= Context name with which to run the job.
|
||||||
Default = `SAS Job Execution compute context`
|
Default = `SAS Job Execution compute context`
|
||||||
|
@param [in] mdebug= set to 1 to enable DEBUG messages
|
||||||
@param [out] outds= The output dataset containing links (Default=work.mv_jobexecute)
|
@param [out] outds= (work.mv_jobexecute) The output dataset containing links
|
||||||
|
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@@ -62,7 +63,15 @@
|
|||||||
,grant_type=sas_services
|
,grant_type=sas_services
|
||||||
,paramstring=0
|
,paramstring=0
|
||||||
,outds=work.mv_jobexecute
|
,outds=work.mv_jobexecute
|
||||||
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -164,9 +173,14 @@ data &outds;
|
|||||||
_program="&path/&name";
|
_program="&path/&name";
|
||||||
run;
|
run;
|
||||||
|
|
||||||
/* clear refs */
|
%if &mdebug=1 %then %do;
|
||||||
filename &fname0 clear;
|
%put &sysmacroname exit vars:;
|
||||||
filename &fname1 clear;
|
%put _local_;
|
||||||
libname &libref;
|
%end;
|
||||||
|
%else %do;
|
||||||
%mend;
|
/* clear refs */
|
||||||
|
filename &fname0 clear;
|
||||||
|
filename &fname1 clear;
|
||||||
|
libname &libref;
|
||||||
|
%end;
|
||||||
|
%mend mv_jobexecute;
|
||||||
@@ -136,6 +136,13 @@
|
|||||||
,raise_err=0
|
,raise_err=0
|
||||||
,mdebug=0
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -293,6 +300,7 @@ data;run;%let jdswaitfor=&syslast;
|
|||||||
,name=&jobname
|
,name=&jobname
|
||||||
,paramstring=%superq(jparams&jid)
|
,paramstring=%superq(jparams&jid)
|
||||||
,outds=&jdsapp
|
,outds=&jdsapp
|
||||||
|
,mdebug=&mdebug
|
||||||
)
|
)
|
||||||
data &jdsapp;
|
data &jdsapp;
|
||||||
format jobparams $32767.;
|
format jobparams $32767.;
|
||||||
@@ -313,8 +321,13 @@ data;run;%let jdswaitfor=&syslast;
|
|||||||
%end;
|
%end;
|
||||||
%if &jid=&jcnt %then %do;
|
%if &jid=&jcnt %then %do;
|
||||||
/* we are at the end of the loop - time to see which jobs have finished */
|
/* we are at the end of the loop - time to see which jobs have finished */
|
||||||
%mv_jobwaitfor(ANY,inds=&jdsrunning,outds=&jdswaitfor,outref=&outref
|
%mv_jobwaitfor(ANY
|
||||||
,raise_err=&raise_err)
|
,inds=&jdsrunning
|
||||||
|
,outds=&jdswaitfor
|
||||||
|
,outref=&outref
|
||||||
|
,raise_err=&raise_err
|
||||||
|
,mdebug=&mdebug
|
||||||
|
)
|
||||||
%local done;
|
%local done;
|
||||||
%let done=%mf_nobs(&jdswaitfor);
|
%let done=%mf_nobs(&jdswaitfor);
|
||||||
%if &done>0 %then %do;
|
%if &done>0 %then %do;
|
||||||
@@ -346,7 +359,8 @@ data;run;%let jdswaitfor=&syslast;
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
%if &mdebug=1 %then %do;
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname exit vars:;
|
||||||
%put _local_;
|
%put _local_;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
%mend;
|
%mend mv_jobflow;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
@file
|
@file
|
||||||
@brief Takes a dataset of running jobs and waits for ANY or ALL of them to complete
|
@brief Takes a table of running jobs and waits for ANY/ALL of them to complete
|
||||||
@details Will poll `/jobs/{jobId}/state` at set intervals until ANY or ALL
|
@details Will poll `/jobs/{jobId}/state` at set intervals until ANY or ALL
|
||||||
jobs are completed. Completion is determined by reference to the returned
|
jobs are completed. Completion is determined by reference to the returned
|
||||||
_state_, as per the following table:
|
_state_, as per the following table:
|
||||||
@@ -55,13 +55,14 @@
|
|||||||
|
|
||||||
%mv_deletejes(path=/Public/temp,name=demo)
|
%mv_deletejes(path=/Public/temp,name=demo)
|
||||||
|
|
||||||
@param [in] access_token_var= The global macro variable to contain the access token
|
@param [in] access_token_var= The global macro variable to contain the access
|
||||||
|
token
|
||||||
@param [in] grant_type= valid values:
|
@param [in] 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
|
||||||
a SASStudioV session else authorization_code. Default option.
|
if a SASStudioV session else authorization_code. Default option.
|
||||||
- sas_services - will use oauth_bearer=sas_services
|
- sas_services - will use oauth_bearer=sas_services
|
||||||
|
|
||||||
@param [in] action=Either ALL (to wait for every job) or ANY (if one job
|
@param [in] action=Either ALL (to wait for every job) or ANY (if one job
|
||||||
@@ -72,9 +73,11 @@
|
|||||||
should be in a `_program` variable.
|
should be in a `_program` variable.
|
||||||
@param [in] raise_err=0 Set to 1 to raise SYSCC when a job does not complete
|
@param [in] raise_err=0 Set to 1 to raise SYSCC when a job does not complete
|
||||||
succcessfully
|
succcessfully
|
||||||
|
@param [in] mdebug= set to 1 to enable DEBUG messages
|
||||||
@param [out] outds= The output dataset containing the list of states by job
|
@param [out] outds= The output dataset containing the list of states by job
|
||||||
(default=work.mv_jobexecute)
|
(default=work.mv_jobexecute)
|
||||||
@param [out] outref= A fileref to which the spawned job logs should be appended.
|
@param [out] outref= A fileref to which the spawned job logs should be
|
||||||
|
appended.
|
||||||
|
|
||||||
@version VIYA V.03.04
|
@version VIYA V.03.04
|
||||||
@author Allan Bowe, source: https://github.com/sasjs/core
|
@author Allan Bowe, source: https://github.com/sasjs/core
|
||||||
@@ -97,7 +100,15 @@
|
|||||||
,outds=work.mv_jobwaitfor
|
,outds=work.mv_jobwaitfor
|
||||||
,outref=0
|
,outref=0
|
||||||
,raise_err=0
|
,raise_err=0
|
||||||
|
,mdebug=0
|
||||||
);
|
);
|
||||||
|
%local dbg;
|
||||||
|
%if &mdebug=1 %then %do;
|
||||||
|
%put &sysmacroname entry vars:;
|
||||||
|
%put _local_;
|
||||||
|
%end;
|
||||||
|
%else %let dbg=*;
|
||||||
|
|
||||||
%local oauth_bearer;
|
%local oauth_bearer;
|
||||||
%if &grant_type=detect %then %do;
|
%if &grant_type=detect %then %do;
|
||||||
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
%if %symexist(&access_token_var) %then %let grant_type=authorization_code;
|
||||||
@@ -155,7 +166,8 @@ run;
|
|||||||
%let fname0=%mf_getuniquefileref();
|
%let fname0=%mf_getuniquefileref();
|
||||||
|
|
||||||
data &outds;
|
data &outds;
|
||||||
format _program uri $128. state $32. stateDetails $32. timestamp datetime19. jobparams $32767.;
|
format _program uri $128. state $32. stateDetails $32. timestamp datetime19.
|
||||||
|
jobparams $32767.;
|
||||||
stop;
|
stop;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
@@ -168,8 +180,8 @@ run;
|
|||||||
"Authorization"="Bearer &&&access_token_var"
|
"Authorization"="Bearer &&&access_token_var"
|
||||||
%end; ;
|
%end; ;
|
||||||
run;
|
run;
|
||||||
%if &SYS_PROCHTTP_STATUS_CODE ne 200 and &SYS_PROCHTTP_STATUS_CODE ne 201 %then
|
%if &SYS_PROCHTTP_STATUS_CODE ne 200 and &SYS_PROCHTTP_STATUS_CODE ne 201
|
||||||
%do;
|
%then %do;
|
||||||
data _null_;infile &fname0;input;putlog _infile_;run;
|
data _null_;infile &fname0;input;putlog _infile_;run;
|
||||||
%mp_abort(mac=&sysmacroname
|
%mp_abort(mac=&sysmacroname
|
||||||
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
|
||||||
@@ -205,7 +217,7 @@ run;
|
|||||||
%let joburi&i=0; /* do not re-check */
|
%let joburi&i=0; /* do not re-check */
|
||||||
/* fetch log */
|
/* fetch log */
|
||||||
%if %str(&outref) ne 0 %then %do;
|
%if %str(&outref) ne 0 %then %do;
|
||||||
%mv_getjoblog(uri=&plainuri,outref=&outref)
|
%mv_getjoblog(uri=&plainuri,outref=&outref,mdebug=&mdebug)
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%else %if &status=idle or &status=pending or &status=running %then %do;
|
%else %if &status=idle or &status=pending or &status=running %then %do;
|
||||||
@@ -220,10 +232,11 @@ run;
|
|||||||
%end;
|
%end;
|
||||||
|
|
||||||
%if (&raise_err) %then %do;
|
%if (&raise_err) %then %do;
|
||||||
%if (&status = canceled or &status = failed or %length(&stateDetails)>0) %then %do;
|
%if (&status = canceled or &status = failed or %length(&stateDetails)>0)
|
||||||
|
%then %do;
|
||||||
%if ("&stateDetails" = "%str(war)ning") %then %let SYSCC=4;
|
%if ("&stateDetails" = "%str(war)ning") %then %let SYSCC=4;
|
||||||
%else %let SYSCC=5;
|
%else %let SYSCC=5;
|
||||||
%put %str(ERR)OR: Job &&jobname&i. did not complete successfully. &stateDetails;
|
%put %str(ERR)OR: Job &&jobname&i. did not complete. &stateDetails;
|
||||||
%return;
|
%return;
|
||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
@@ -238,7 +251,12 @@ run;
|
|||||||
%end;
|
%end;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
/* clear refs */
|
%if &mdebug=1 %then %do;
|
||||||
filename &fname0 clear;
|
%put &sysmacroname exit vars:;
|
||||||
|
%put _local_;
|
||||||
%mend;
|
%end;
|
||||||
|
%else %do;
|
||||||
|
/* clear refs */
|
||||||
|
filename &fname0 clear;
|
||||||
|
%end;
|
||||||
|
%mend mv_jobwaitfor;
|
||||||
Reference in New Issue
Block a user