1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-10 22:14:35 +00:00

fix: linting

This commit is contained in:
2021-04-03 21:30:51 +02:00
parent 096bf4fa11
commit 0a38056c69
88 changed files with 1762 additions and 1468 deletions

View File

@@ -15,30 +15,30 @@ mime_pattern="\.(sas|ddl|csv|sh)"
# Check for capital letters only in file names # Check for capital letters only in file names
extra_pattern="(^|/)[^/]*([A-Z]+)[^/]*\.[A-Za-z]{3}$" extra_pattern="(^|/)[^/]*([A-Z]+)[^/]*\.[A-Za-z]{3}$"
# Grep git diff of files to commit # Grep git diff of files to commit
files=$( git diff --cached --find-copies --find-renames --name-only --diff-filter=ACMRTXBU | files=$( git diff --cached --find-copies --find-renames --name-only --diff-filter=ACMRTXBU |
grep -Ei "$mime_pattern" | grep -Ei "$mime_pattern" |
grep -E "$extra_pattern" ) grep -E "$extra_pattern" )
echo "$files" echo "$files"
if [[ -n "$files" ]]; if [[ -n "$files" ]];
then then
echo echo
echo "Found files that contain capital letters." echo "Found files that contain capital letters."
echo "Please rename the following files in lowercase, and commit again:" echo "Please rename the following files in lowercase, and commit again:"
for file in $files; do for file in $files; do
echo -e '- \E[0;32m'"$file"'\033[0m' echo -e '- \E[0;32m'"$file"'\033[0m'
done done
# Abort commit # Abort commit
exit_code=1 exit_code=1
fi fi
if [ "$exit_code" == "0" ]; then if [ "$exit_code" == "0" ]; then
echo echo
echo -e '\033[1m'"Pre-commit validation Passed"'\033[0m' echo -e '\033[1m'"Pre-commit validation Passed"'\033[0m'
echo echo
else else
echo echo
echo -e '\033[1m'"Commit Aborted!"'\033[0m' echo -e '\033[1m'"Commit Aborted!"'\033[0m'
echo echo
fi fi
exit $exit_code exit $exit_code

View File

@@ -3,7 +3,7 @@
"noEncodedPasswords": true, "noEncodedPasswords": true,
"hasDoxygenHeader": true, "hasDoxygenHeader": true,
"noSpacesInFileNames": true, "noSpacesInFileNames": true,
"maxLineLength": 120, "maxLineLength": 140,
"lowerCaseFileNames": true, "lowerCaseFileNames": true,
"noTabIndentation": true, "noTabIndentation": true,
"indentationMultiple": 2 "indentationMultiple": 2

1734
all.sas

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@
@brief abort gracefully according to context @brief abort gracefully according to context
@details Do not use directly! See bottom of explanation for details. @details Do not use directly! See bottom of explanation for details.
Configures an abort mechanism according to site specific policies or the Configures an abort mechanism according to site specific policies or the
particulars of an environment. For instance, can stream custom 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.
@@ -49,7 +49,10 @@
input; putlog _infile_; input; putlog _infile_;
i=1; i=1;
retain logonce 0; retain logonce 0;
if (_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR") and logonce=0 then do; if (
_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR"
) and logonce=0
then do;
call symputx('logline',_n_); call symputx('logline',_n_);
logonce+1; logonce+1;
end; end;
@@ -112,21 +115,22 @@
%let syscc=0; %let syscc=0;
%if %symexist(SYS_JES_JOB_URI) %then %do; %if %symexist(SYS_JES_JOB_URI) %then %do;
/* refer web service output to file service in one hit */ /* refer web service output to file service in one hit */
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" name="_webout.json"; filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
name="_webout.json";
%let rc=%sysfunc(fcopy(_web,_webout)); %let rc=%sysfunc(fcopy(_web,_webout));
%end; %end;
%else %do; %else %do;
data _null_; data _null_;
if symexist('sysprocessmode') if symexist('sysprocessmode')
then if symget("sysprocessmode")="SAS Stored Process Server" then if symget("sysprocessmode")="SAS Stored Process Server"
then rc=stpsrvset('program error', 0); then rc=stpsrvset('program error', 0);
run; run;
%end; %end;
/** /**
* endsas is reliable but kills some deployments. * endsas is reliable but kills some deployments.
* Abort variants are ungraceful (non zero return code) * Abort variants are ungraceful (non zero return code)
* This approach lets SAS run silently until the end :-) * This approach lets SAS run silently until the end :-)
*/ */
%put _all_; %put _all_;
filename skip temp; filename skip temp;
data _null_; data _null_;

View File

@@ -17,7 +17,7 @@
**/ **/
%macro mf_getattrc( %macro mf_getattrc(
libds libds
,attr ,attr
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local dsid rc; %local dsid rc;

View File

@@ -8,7 +8,7 @@
@param libds library.dataset @param libds library.dataset
@param attr Common values are NLOBS and NVARS, full list in [documentation]( @param attr Common values are NLOBS and NVARS, full list in [documentation](
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212040.htm) http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212040.htm)
@return output returns result of the attrn value supplied, or -1 and log @return output returns result of the attrn value supplied, or -1 and log
message if error. message if error.
@@ -17,7 +17,7 @@
**/ **/
%macro mf_getattrn( %macro mf_getattrn(
libds libds
,attr ,attr
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local dsid rc; %local dsid rc;

View File

@@ -32,7 +32,9 @@
/* in case the parameter is a libref.tablename, pull off just the libref */ /* in case the parameter is a libref.tablename, pull off just the libref */
%let libref = %upcase(%scan(&libref, 1, %str(.))); %let libref = %upcase(%scan(&libref, 1, %str(.)));
%let dsid=%sysfunc(open(sashelp.vlibnam(where=(libname="%upcase(&libref)")),i)); %let dsid=%sysfunc(
open(sashelp.vlibnam(where=(libname="%upcase(&libref)")),i)
);
%if (&dsid ^= 0) %then %do; %if (&dsid ^= 0) %then %do;
%let engnum=%sysfunc(varnum(&dsid,ENGINE)); %let engnum=%sysfunc(varnum(&dsid,ENGINE));
%let rc=%sysfunc(fetch(&dsid)); %let rc=%sysfunc(fetch(&dsid));
@@ -41,7 +43,7 @@
%let rc= %sysfunc(close(&dsid)); %let rc= %sysfunc(close(&dsid));
%end; %end;
&engine &engine
%mend; %mend;

View File

@@ -38,7 +38,7 @@
%let rc=%sysfunc(filename(fref)); %let rc=%sysfunc(filename(fref));
%if &format=NO %then %do; %if &format=NO %then %do;
&bytes &bytes
%end; %end;
%else %do; %else %do;
%sysfunc(INPUTN(&bytes, best.),sizekmg.) %sysfunc(INPUTN(&bytes, best.),sizekmg.)

View File

@@ -16,7 +16,7 @@
%macro mf_getkeyvalue(key,libds=work.mp_setkeyvalue %macro mf_getkeyvalue(key,libds=work.mp_setkeyvalue
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local ds dsid key valc valn type rc; %local ds dsid key valc valn type rc;
%let dsid=%sysfunc(open(&libds(where=(key="&key")))); %let dsid=%sysfunc(open(&libds(where=(key="&key"))));
%syscall set(dsid); %syscall set(dsid);
%let rc = %sysfunc(fetch(&dsid)); %let rc = %sysfunc(fetch(&dsid));

View File

@@ -23,7 +23,7 @@
%local a b c; %local a b c;
%if &switch.NONE=NONE %then %do; %if &switch.NONE=NONE %then %do;
%if %symexist(sysprocessmode) %then %do; %if %symexist(sysprocessmode) %then %do;
%if "&sysprocessmode"="SAS Object Server" %if "&sysprocessmode"="SAS Object Server"
or "&sysprocessmode"= "SAS Compute Server" %then %do; or "&sysprocessmode"= "SAS Compute Server" %then %do;
SASVIYA SASVIYA
%end; %end;

View File

@@ -2,7 +2,7 @@
@file @file
@brief Returns a userid according to session context @brief Returns a userid according to session context
@details In a workspace session, a user is generally represented by <code> @details In a workspace session, a user is generally represented by <code>
&sysuserid</code> or <code>SYS_COMPUTE_SESSION_OWNER</code> if it exists. &sysuserid</code> or <code>SYS_COMPUTE_SESSION_OWNER</code> if it exists.
In a Stored Process session, <code>&sysuserid</code> In a Stored Process session, <code>&sysuserid</code>
resolves to a system account (default=sassrv) and instead there are several resolves to a system account (default=sassrv) and instead there are several
metadata username variables to choose from (_metauser, _metaperson metadata username variables to choose from (_metauser, _metaperson
@@ -12,7 +12,7 @@
%let user= %mf_getUser(); %let user= %mf_getUser();
%put &user; %put &user;
@param type - do not use, may be deprecated in a future release @param type - do not use, may be deprecated in a future release
@return SYSUSERID (if workspace server) @return SYSUSERID (if workspace server)

View File

@@ -20,7 +20,7 @@
%macro mf_getvalue(libds,variable,filter=1 %macro mf_getvalue(libds,variable,filter=1
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%if %mf_getattrn(&libds,NLOBS)>0 %then %do; %if %mf_getattrn(&libds,NLOBS)>0 %then %do;
%local dsid rc &variable; %local dsid rc &variable;
%let dsid=%sysfunc(open(&libds(where=(&filter)))); %let dsid=%sysfunc(open(&libds(where=(&filter))));
%syscall set(dsid); %syscall set(dsid);

View File

@@ -5,9 +5,9 @@
Usage: Usage:
data test; data test;
format str1 $1. num1 datetime19.; format str1 $1. num1 datetime19.;
str2='hello mum!'; num2=666; str2='hello mum!'; num2=666;
stop; stop;
run; run;
%put %mf_getVarFormat(test,str1); %put %mf_getVarFormat(test,str1);
%put %mf_getVarFormat(work.test,num1); %put %mf_getVarFormat(work.test,num1);
@@ -45,9 +45,9 @@
/* Get variable format */ /* Get variable format */
%if(&vnum > 0) %then %let vformat=%sysfunc(varfmt(&dsid, &vnum)); %if(&vnum > 0) %then %let vformat=%sysfunc(varfmt(&dsid, &vnum));
%else %do; %else %do;
%put NOTE: Variable &var does not exist in &libds; %put NOTE: Variable &var does not exist in &libds;
%let rc = %sysfunc(close(&dsid)); %let rc = %sysfunc(close(&dsid));
%return; %return;
%end; %end;
%end; %end;
%else %do; %else %do;

View File

@@ -5,8 +5,8 @@
Usage: Usage:
data test; data test;
format str $1. num datetime19.; format str $1. num datetime19.;
stop; stop;
run; run;
%put %mf_getVarLen(test,str); %put %mf_getVarLen(test,str);
%put %mf_getVarLen(work.test,num); %put %mf_getVarLen(work.test,num);
@@ -39,8 +39,8 @@
/* Get variable format */ /* Get variable format */
%if(&vnum > 0) %then %let vlen = %sysfunc(varlen(&dsid, &vnum)); %if(&vnum > 0) %then %let vlen = %sysfunc(varlen(&dsid, &vnum));
%else %do; %else %do;
%put NOTE: Variable &var does not exist in &libds; %put NOTE: Variable &var does not exist in &libds;
%let vlen = %str( ); %let vlen = %str( );
%end; %end;
%end; %end;
%else %put dataset &libds not opened! (rc=&dsid); %else %put dataset &libds not opened! (rc=&dsid);

View File

@@ -6,8 +6,8 @@
Usage: Usage:
data work.test; data work.test;
format str $1. num datetime19.; format str $1. num datetime19.;
stop; stop;
run; run;
%put %mf_getVarNum(work.test,str); %put %mf_getVarNum(work.test,str);
%put %mf_getVarNum(work.test,num); %put %mf_getVarNum(work.test,num);
@@ -39,8 +39,8 @@ returns:
/* Get variable number */ /* Get variable number */
%let vnum = %sysfunc(varnum(&dsid, &var)); %let vnum = %sysfunc(varnum(&dsid, &var));
%if(&vnum <= 0) %then %do; %if(&vnum <= 0) %then %do;
%put NOTE: Variable &var does not exist in &libds; %put NOTE: Variable &var does not exist in &libds;
%let vnum = %str( ); %let vnum = %str( );
%end; %end;
%end; %end;
%else %put dataset &ds not opened! (rc=&dsid); %else %put dataset &ds not opened! (rc=&dsid);

View File

@@ -5,8 +5,8 @@
Usage: Usage:
data test; data test;
length str $1. num 8.; length str $1. num 8.;
stop; stop;
run; run;
%put %mf_getvartype(test,str); %put %mf_getvartype(test,str);
%put %mf_getvartype(work.test,num); %put %mf_getvartype(work.test,num);
@@ -35,8 +35,8 @@ Usage:
/* Get variable type (C/N) */ /* Get variable type (C/N) */
%if(&vnum. > 0) %then %let vtype = %sysfunc(vartype(&dsid, &vnum.)); %if(&vnum. > 0) %then %let vtype = %sysfunc(vartype(&dsid, &vnum.));
%else %do; %else %do;
%put NOTE: Variable &var does not exist in &libds; %put NOTE: Variable &var does not exist in &libds;
%let vtype = %str( ); %let vtype = %str( );
%end; %end;
%end; %end;
%else %put dataset &libds not opened! (rc=&dsid); %else %put dataset &libds not opened! (rc=&dsid);

View File

@@ -6,12 +6,13 @@
%sysevalf(%superq(param)=,boolean) %sysevalf(%superq(param)=,boolean)
Usage: Usage:
%put mf_isblank(&var);
inspiration: https://support.sas.com/resources/papers/proceedings09/022-2009.pdf %put mf_isblank(&var);
@param param VALUE to be checked inspiration:
https://support.sas.com/resources/papers/proceedings09/022-2009.pdf
@param param VALUE to be checked
@return output returns 1 (if blank) else 0 @return output returns 1 (if blank) else 0

View File

@@ -6,7 +6,8 @@
%let isdir=%mf_isdir(/tmp); %let isdir=%mf_isdir(/tmp);
With thanks and full credit to Andrea Defronzo - https://www.linkedin.com/in/andrea-defronzo-b1a47460/ With thanks and full credit to Andrea Defronzo -
https://www.linkedin.com/in/andrea-defronzo-b1a47460/
@param path full path of the file/directory to be checked @param path full path of the file/directory to be checked
@@ -17,17 +18,17 @@
%macro mf_isdir(path %macro mf_isdir(path
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local rc did is_directory fref_t; %local rc did is_directory fref_t;
%let is_directory = 0; %let is_directory = 0;
%let rc = %sysfunc(filename(fref_t, %superq(path))); %let rc = %sysfunc(filename(fref_t, %superq(path)));
%let did = %sysfunc(dopen(&fref_t.)); %let did = %sysfunc(dopen(&fref_t.));
%if &did. ^= 0 %then %do; %if &did. ^= 0 %then %do;
%let is_directory = 1; %let is_directory = 1;
%let rc = %sysfunc(dclose(&did.)); %let rc = %sysfunc(dclose(&did.));
%end; %end;
%let rc = %sysfunc(filename(fref_t)); %let rc = %sysfunc(filename(fref_t));
&is_directory &is_directory
%mend; %mend;

View File

@@ -46,8 +46,8 @@ Usage:
*/ */
%if (%length(&dir) gt %length(&child)) %then %do; %if (%length(&dir) gt %length(&child)) %then %do;
%let parent = %substr(&dir, 1, %length(&dir)-%length(&child)); %let parent = %substr(&dir, 1, %length(&dir)-%length(&child));
%mf_mkdir(&parent) %mf_mkdir(&parent)
%end; %end;
/* /*
@@ -56,11 +56,11 @@ Usage:
%let dname = %sysfunc(dcreate(&child, &parent)); %let dname = %sysfunc(dcreate(&child, &parent));
%if (%bquote(&dname) eq ) %then %do; %if (%bquote(&dname) eq ) %then %do;
%put %str(ERR)OR: could not create &parent + &child; %put %str(ERR)OR: could not create &parent + &child;
%abort cancel; %abort cancel;
%end; %end;
%else %do; %else %do;
%put Directory created: &dir; %put Directory created: &dir;
%end; %end;
%end; %end;
/* exit quietly if directory did exist.*/ /* exit quietly if directory did exist.*/

View File

@@ -1,8 +1,9 @@
/** /**
@file mf_mval.sas @file mf_mval.sas
@brief Returns a macro variable value if the variable exists @brief Returns a macro variable value if the variable exists
@details Use this macro to avoid repetitive use of `%if %symexist(MACVAR) %then` @details
type logic. Use this macro to avoid repetitive use of `%if %symexist(MACVAR) %then`
type logic.
Usage: Usage:
%if %mf_mval(maynotexist)=itdid %then %do; %if %mf_mval(maynotexist)=itdid %then %do;

View File

@@ -1,7 +1,7 @@
/** /**
@file mf_trimstr.sas @file mf_trimstr.sas
@brief Removes character(s) from the end, if they exist @brief Removes character(s) from the end, if they exist
@details If the designated characters exist at the end of the string, they @details If the designated characters exist at the end of the string, they
are removed are removed
%put %mf_trimstr(/blah/,/); * /blah; %put %mf_trimstr(/blah/,/); * /blah;
@@ -12,7 +12,8 @@
@param basestr The string to be modified @param basestr The string to be modified
@param trimstr The string to be removed from the end of `basestr`, if it exists @param trimstr The string to be removed from the end of `basestr`, if it
exists
@return output returns result with the value of `trimstr` removed from the end @return output returns result with the value of `trimstr` removed from the end

View File

@@ -35,7 +35,7 @@
%macro mf_verifymacvars( %macro mf_verifymacvars(
verifyVars /* list of macro variable NAMES */ verifyVars /* list of macro variable NAMES */
,makeUpcase=NO /* set to YES to make all the variable VALUES uppercase */ ,makeUpcase=NO /* set to YES to make all the variable VALUES uppercase */
,mAbort=SOFT ,mAbort=SOFT
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;

View File

@@ -6,7 +6,7 @@
Usage: Usage:
%let x= %mf_wordsInStr1ButNotStr2( %let x= %mf_wordsInStr1ButNotStr2(
Str1=blah sss blaaah brah bram boo Str1=blah sss blaaah brah bram boo
,Str2= blah blaaah brah ssss ,Str2= blah blaaah brah ssss
); );
@@ -24,8 +24,8 @@
**/ **/
%macro mf_wordsInStr1ButNotStr2( %macro mf_wordsInStr1ButNotStr2(
Str1= /* string containing words to extract */ Str1= /* string containing words to extract */
,Str2= /* used to compare with the extract string */ ,Str2= /* used to compare with the extract string */
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local count_base count_extr i i2 extr_word base_word match outvar; %local count_base count_extr i i2 extr_word base_word match outvar;

View File

@@ -6,11 +6,11 @@
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
environments. This macro takes a unique approach - we set the SAS syscc to 0, Process environments. This macro takes a unique approach - we set the SAS
run `stpsrvset('program error', 0)` (if SAS 9) and then - we open a macro syscc to 0, run `stpsrvset('program error', 0)` (if SAS 9) and then - we open
but don't close it! This provides a graceful abort for SAS web services in all a macro but don't close it! This provides a graceful abort for SAS web
web enabled environments. services in all web enabled environments.
@param mac= to contain the name of the calling macro @param mac= to contain the name of the calling macro
@param msg= message to be returned @param msg= message to be returned
@@ -48,7 +48,10 @@
input; putlog _infile_; input; putlog _infile_;
i=1; i=1;
retain logonce 0; retain logonce 0;
if (_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR") and logonce=0 then do; if (
_infile_=:"%str(WARN)ING" or _infile_=:"%str(ERR)OR"
) and logonce=0 then
do;
call symputx('logline',_n_); call symputx('logline',_n_);
logonce+1; logonce+1;
end; end;
@@ -129,15 +132,15 @@
%if %symexist(_metaport) %then %do; %if %symexist(_metaport) %then %do;
data _null_; data _null_;
if symexist('sysprocessmode') if symexist('sysprocessmode')
then if symget("sysprocessmode")="SAS Stored Process Server" then if symget("sysprocessmode")="SAS Stored Process Server"
then rc=stpsrvset('program error', 0); then rc=stpsrvset('program error', 0);
run; run;
%end; %end;
/** /**
* endsas is reliable but kills some deployments. * endsas is reliable but kills some deployments.
* Abort variants are ungraceful (non zero return code) * Abort variants are ungraceful (non zero return code)
* This approach lets SAS run silently until the end :-) * This approach lets SAS run silently until the end :-)
*/ */
%put _all_; %put _all_;
filename skip temp; filename skip temp;
data _null_; data _null_;

View File

@@ -2,9 +2,10 @@
@file @file
@brief Copy any file using binary input / output streams @brief Copy any file using binary input / output streams
@details Reads in a file byte by byte and writes it back out. Is an @details Reads in a file byte by byte and writes it back out. Is an
os-independent method to copy files. In case of naming collision, the os-independent method to copy files. In case of naming collision, the
default filerefs can be modified. default filerefs can be modified.
Based on http://stackoverflow.com/questions/13046116/using-sas-to-copy-a-text-file Based on:
https://stackoverflow.com/questions/13046116/using-sas-to-copy-a-text-file
%mp_binarycopy(inloc="/home/me/blah.txt", outref=_webout) %mp_binarycopy(inloc="/home/me/blah.txt", outref=_webout)
@@ -19,12 +20,12 @@
**/ **/
%macro mp_binarycopy( %macro mp_binarycopy(
inloc= /* full path and filename of the object to be copied */ inloc= /* full path and filename of the object to be copied */
,outloc= /* full path and filename of object to be created */ ,outloc= /* full path and filename of object to be created */
,inref=____in /* override default to use own filerefs */ ,inref=____in /* override default to use own filerefs */
,outref=____out /* override default to use own filerefs */ ,outref=____out /* override default to use own filerefs */
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
/* these IN and OUT filerefs can point to anything */ /* these IN and OUT filerefs can point to anything */
%if &inref = ____in %then %do; %if &inref = ____in %then %do;
filename &inref &inloc lrecl=1048576 ; filename &inref &inloc lrecl=1048576 ;
%end; %end;
@@ -32,20 +33,20 @@
filename &outref &outloc lrecl=1048576 ; filename &outref &outloc lrecl=1048576 ;
%end; %end;
/* copy the file byte-for-byte */ /* copy the file byte-for-byte */
data _null_; data _null_;
length filein 8 fileid 8; length filein 8 fileid 8;
filein = fopen("&inref",'I',1,'B'); filein = fopen("&inref",'I',1,'B');
fileid = fopen("&outref",'O',1,'B'); fileid = fopen("&outref",'O',1,'B');
rec = '20'x; rec = '20'x;
do while(fread(filein)=0); do while(fread(filein)=0);
rc = fget(filein,rec,1); rc = fget(filein,rec,1);
rc = fput(fileid, rec); rc = fput(fileid, rec);
rc =fwrite(fileid); rc =fwrite(fileid);
end; end;
rc = fclose(filein); rc = fclose(filein);
rc = fclose(fileid); rc = fclose(fileid);
run; run;
%if &inref = ____in %then %do; %if &inref = ____in %then %do;
filename &inref clear; filename &inref clear;
%end; %end;

View File

@@ -2,10 +2,10 @@
@file mp_cleancsv.sas @file mp_cleancsv.sas
@brief Fixes embedded cr / lf / crlf in CSV @brief Fixes embedded cr / lf / crlf in CSV
@details CSVs will sometimes contain lf or crlf within quotes (eg when @details CSVs will sometimes contain lf or crlf within quotes (eg when
saved by excel). When the termstr is ALSO lf or crlf that can be tricky saved by excel). When the termstr is ALSO lf or crlf that can be tricky
to process using SAS defaults. to process using SAS defaults.
This macro converts any csv to follow the convention of a windows excel file, This macro converts any csv to follow the convention of a windows excel file,
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:
@@ -23,7 +23,7 @@
%macro mp_cleancsv(in=NOTPROVIDED,out=NOTPROVIDED,qchar='22'x); %macro mp_cleancsv(in=NOTPROVIDED,out=NOTPROVIDED,qchar='22'x);
%if "&in"="NOTPROVIDED" or "&out"="NOTPROVIDED" %then %do; %if "&in"="NOTPROVIDED" or "&out"="NOTPROVIDED" %then %do;
%put %str(ERR)OR: Please provide valid input (&in) and output (&out) locations; %put %str(ERR)OR: Please provide valid input (&in) & output (&out) locations;
%return; %return;
%end; %end;
@@ -32,9 +32,9 @@
%if %index(&out,.) %then %let out="&out"; %if %index(&out,.) %then %let out="&out";
/** /**
* convert all cr and crlf within quotes to lf * convert all cr and crlf within quotes to lf
* convert all other cr or lf to crlf * convert all other cr or lf to crlf
*/ */
data _null_; data _null_;
infile &in recfm=n ; infile &in recfm=n ;
file &out recfm=n; file &out recfm=n;

View File

@@ -13,7 +13,7 @@
constraint unq unique(tx_from, dd_type), constraint unq unique(tx_from, dd_type),
constraint nnn not null(DD_SHORTDESC) constraint nnn not null(DD_SHORTDESC)
); );
%mp_getconstraints(lib=work,ds=example,outds=work.constraints) %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
%mp_deleteconstraints(inds=work.constraints,outds=dropped,execute=YES) %mp_deleteconstraints(inds=work.constraints,outds=dropped,execute=YES)
%mp_createconstraints(inds=work.constraints,outds=created,execute=YES) %mp_createconstraints(inds=work.constraints,outds=created,execute=YES)
@@ -48,7 +48,7 @@ data &outds;
else type=constraint_type; else type=constraint_type;
create_statement=catx(" ","alter table",libref,".",table_name create_statement=catx(" ","alter table",libref,".",table_name
,"add constraint",constraint_name,type,"("); ,"add constraint",constraint_name,type,"(");
if last.constraint_name then if last.constraint_name then
create_statement=cats(create_statement,column_name,");"); create_statement=cats(create_statement,column_name,");");
else create_statement=cats(create_statement,column_name,","); else create_statement=cats(create_statement,column_name,",");
if "&execute"="YES" then call execute(create_statement); if "&execute"="YES" then call execute(create_statement);

View File

@@ -14,7 +14,7 @@ Usage:
filename ft15f001 temp; filename ft15f001 temp;
parmcards4; parmcards4;
%* fetch any data from frontend ; %* fetch any data from frontend ;
%webout(FETCH) %webout(FETCH)
data example1 example2; data example1 example2;
set sashelp.class; set sashelp.class;
run; run;

View File

@@ -62,8 +62,8 @@
%local hasheader; %let hasheader=0; %local hasheader; %let hasheader=0;
data _null_; data _null_;
if _N_ > 1 then do; if _N_ > 1 then do;
call symputx('hasheader',1,'l'); call symputx('hasheader',1,'l');
stop; stop;
end; end;
infile &inref; infile &inref;
input; input;
@@ -131,7 +131,7 @@ run;
/* import the CSV */ /* import the CSV */
data &outds data &outds
%if %upcase(&view)=YES %then %do; %if %upcase(&view)=YES %then %do;
/view=&outds /view=&outds
%end; %end;
; ;
infile &inref dsd firstobs=2; infile &inref dsd firstobs=2;

View File

@@ -13,7 +13,7 @@
constraint unq unique(tx_from, dd_type), constraint unq unique(tx_from, dd_type),
constraint nnn not null(DD_SHORTDESC) constraint nnn not null(DD_SHORTDESC)
); );
%mp_getconstraints(lib=work,ds=example,outds=work.constraints) %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
%mp_deleteconstraints(inds=work.constraints,outds=dropped,execute=YES) %mp_deleteconstraints(inds=work.constraints,outds=dropped,execute=YES)

View File

@@ -38,13 +38,13 @@
@returns outds contains the following variables: @returns outds contains the following variables:
- directory (containing folder) - directory (containing folder)
- file_or_folder (file / folder) - file_or_folder (file / folder)
- filepath (path/to/file.name) - filepath (path/to/file.name)
- filename (just the file name) - filename (just the file name)
- ext (.extension) - ext (.extension)
- msg (system message if any issues) - msg (system message if any issues)
- OS SPECIFIC variables, if <code>getattrs=</code> is used. - OS SPECIFIC variables, if <code>getattrs=</code> is used.
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -57,8 +57,11 @@
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%let getattrs=%upcase(&getattrs)XX; %let getattrs=%upcase(&getattrs)XX;
data &outds (compress=no keep=file_or_folder filepath filename ext msg directory); data &outds(compress=no
length directory filepath $500 fref fref2 $8 file_or_folder $6 filename $80 ext $20 msg $200; keep=file_or_folder filepath filename ext msg directory
);
length directory filepath $500 fref fref2 $8 file_or_folder $6 filename $80
ext $20 msg $200;
%if &fref=0 %then %do; %if &fref=0 %then %do;
rc = filename(fref, "&path"); rc = filename(fref, "&path");
%end; %end;
@@ -67,15 +70,15 @@ data &outds (compress=no keep=file_or_folder filepath filename ext msg directory
rc=0; rc=0;
%end; %end;
if rc = 0 then do; if rc = 0 then do;
did = dopen(fref); did = dopen(fref);
directory=dinfo(did,'Directory'); directory=dinfo(did,'Directory');
if did=0 then do; if did=0 then do;
putlog "NOTE: This directory is empty - " directory; putlog "NOTE: This directory is empty - " directory;
msg=sysmsg(); msg=sysmsg();
put _all_; put _all_;
stop; stop;
end; end;
rc = filename(fref); rc = filename(fref);
end; end;
else do; else do;
msg=sysmsg(); msg=sysmsg();
@@ -98,7 +101,7 @@ data &outds (compress=no keep=file_or_folder filepath filename ext msg directory
if index(fmsg,'File is in use') or index(dmsg,'is not a directory') if index(fmsg,'File is in use') or index(dmsg,'is not a directory')
then file_or_folder='file'; then file_or_folder='file';
else if index(fmsg, 'Insufficient authorization') then file_or_folder='file'; else if index(fmsg,'Insufficient authorization') then file_or_folder='file';
else if file_or_folder='' then file_or_folder='locked'; else if file_or_folder='' then file_or_folder='locked';
if file_or_folder='file' then do; if file_or_folder='file' then do;

View File

@@ -19,7 +19,7 @@
**/ **/
%macro mp_distinctfmtvalues( %macro mp_distinctfmtvalues(
libds= libds=
,var= ,var=
,outvar=formatted_value ,outvar=formatted_value
,outds=work.mp_distinctfmtvalues ,outds=work.mp_distinctfmtvalues
@@ -34,7 +34,7 @@
create table &outds as create table &outds as
select distinct select distinct
%if &vtype=C & %trim(&fmt)=%str() %then %do; %if &vtype=C & %trim(&fmt)=%str() %then %do;
&var &var
%end; %end;
%else %if &vtype=C %then %do; %else %if &vtype=C %then %do;
put(&var,&fmt) put(&var,&fmt)
@@ -45,6 +45,6 @@
%else %do; %else %do;
put(&var,&fmt) put(&var,&fmt)
%end; %end;
as &outvar length=&varlen as &outvar length=&varlen
from &libds; from &libds;
%mend; %mend;

View File

@@ -22,7 +22,7 @@
**/ **/
%macro mp_dropmembers( %macro mp_dropmembers(
list /* space separated list of datasets / views */ list /* space separated list of datasets / views */
,libref=WORK /* can only drop from a single library at a time */ ,libref=WORK /* can only drop from a single library at a time */
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;

View File

@@ -10,20 +10,22 @@
, maxobs=5) , maxobs=5)
TODO: TODO:
- labelling the dataset - labelling the dataset
- explicity setting a unix LF - explicity setting a unix LF
- constraints / indexes etc - constraints / indexes etc
@param [in] base_ds= Should be two level - eg work.blah. This is the table that @param [in] base_ds= Should be two level - eg work.blah. This is the table
is converted to a cards file. that is converted to a cards file.
@param [in] tgt_ds= Table that the generated cards file would create. Optional - @param [in] tgt_ds= Table that the generated cards file would create.
if omitted, will be same as BASE_DS. Optional - if omitted, will be same as BASE_DS.
@param [out] cards_file= Location in which to write the (.sas) cards file @param [out] cards_file= Location in which to write the (.sas) cards file
@param [in] maxobs= to limit output to the first <code>maxobs</code> observations @param [in] maxobs= to limit output to the first <code>maxobs</code>
@param [in] showlog= whether to show generated cards file in the SAS log (YES/NO) observations
@param [in] showlog= whether to show generated cards file in the SAS log
(YES/NO)
@param [in] outencoding= provide encoding value for file statement (eg utf-8) @param [in] outencoding= provide encoding value for file statement (eg utf-8)
@param [in] append= If NO then will rebuild the cards file if it already exists, @param [in] append= If NO then will rebuild the cards file if it already
otherwise will append to it. Used by the mp_lib2cards.sas macro. exists, otherwise will append to it. Used by the mp_lib2cards.sas macro.
@version 9.2 @version 9.2
@@ -41,8 +43,8 @@
%local i setds nvars; %local i setds nvars;
%if not %sysfunc(exist(&base_ds)) %then %do; %if not %sysfunc(exist(&base_ds)) %then %do;
%put WARNING: &base_ds does not exist; %put WARNING: &base_ds does not exist;
%return; %return;
%end; %end;
%if %index(&base_ds,.)=0 %then %let base_ds=WORK.&base_ds; %if %index(&base_ds,.)=0 %then %let base_ds=WORK.&base_ds;
@@ -64,10 +66,12 @@ select count(*) into: nvars from dictionary.columns
%end; %end;
/* get indexes */ /* get indexes */
proc sort data=sashelp.vindex proc sort
(where=(upcase(libname)="%scan(%upcase(&base_ds),1)" data=sashelp.vindex(
and upcase(memname)="%scan(%upcase(&base_ds),2)")) where=(upcase(libname)="%scan(%upcase(&base_ds),1)"
out=_data_; and upcase(memname)="%scan(%upcase(&base_ds),2)")
)
out=_data_;
by indxname indxpos; by indxname indxpos;
run; run;
@@ -82,7 +86,7 @@ data _null_;
idxcnt+1; idxcnt+1;
nom=''; nom='';
uni=''; uni='';
vars=name; vars=name;
end; end;
else vars=catx(' ',vars,name); else vars=catx(' ',vars,name);
if last.indxname then do; if last.indxname then do;
@@ -110,8 +114,8 @@ proc sql
; ;
reset outobs=max; reset outobs=max;
create table datalines1 as create table datalines1 as
select name,type,length,varnum,format,label from dictionary.columns select name,type,length,varnum,format,label from dictionary.columns
where libname="%upcase(%scan(&base_ds,1))" where libname="%upcase(%scan(&base_ds,1))"
and memname="%upcase(%scan(&base_ds,2))"; and memname="%upcase(%scan(&base_ds,2))";
/** /**
@@ -126,7 +130,7 @@ create table datalines1 as
data datalines_2; data datalines_2;
format dataline $32000.; format dataline $32000.;
set datalines1 (where=(upcase(name) not in set datalines1 (where=(upcase(name) not in
('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM'))); ('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
if type='num' then dataline= if type='num' then dataline=
cats('ifc(int(',name,')=',name,' cats('ifc(int(',name,')=',name,'
@@ -140,9 +144,9 @@ proc sql noprint;
select dataline into: datalines separated by ',' from datalines_2; select dataline into: datalines separated by ',' from datalines_2;
%local %local
process_dttm_flg process_dttm_flg
valid_from_dttm_flg valid_from_dttm_flg
valid_to_dttm_flg valid_to_dttm_flg
; ;
%let process_dttm_flg = N; %let process_dttm_flg = N;
%let valid_from_dttm_flg = N; %let valid_from_dttm_flg = N;
@@ -212,7 +216,7 @@ data _null_;
put "input "; put "input ";
%do i = 1 %to &nvars.; %do i = 1 %to &nvars.;
%if(%length(&&input_stmt_&i..)) %then %if(%length(&&input_stmt_&i..)) %then
put " &&input_stmt_&i.."; put " &&input_stmt_&i..";
; ;
%end; %end;
put ";"; put ";";

View File

@@ -19,8 +19,8 @@
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%if not %sysfunc(exist(&ds)) %then %do; %if not %sysfunc(exist(&ds)) %then %do;
%put WARNING: &ds does not exist; %put WARNING: &ds does not exist;
%return; %return;
%end; %end;
%if %index(&ds,.)=0 %then %let ds=WORK.&ds; %if %index(&ds,.)=0 %then %let ds=WORK.&ds;
@@ -36,22 +36,22 @@
/* first get headers */ /* first get headers */
data _null_; data _null_;
file &outloc dlm=',' dsd &outencoding lrecl=32767; file &outloc dlm=',' dsd &outencoding lrecl=32767;
length header $ 2000; length header $ 2000;
dsid=open("&ds.","i"); dsid=open("&ds.","i");
num=attrn(dsid,"nvars"); num=attrn(dsid,"nvars");
do i=1 to num; do i=1 to num;
header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i)))); header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
put header @; put header @;
end; end;
rc=close(dsid); rc=close(dsid);
run; run;
/* next, export data */ /* next, export data */
data _null_; data _null_;
set &ds.; set &ds.;
file &outloc mod dlm=',' dsd &outencoding lrecl=32767; file &outloc mod dlm=',' dsd &outencoding lrecl=32767;
put (_all_) (+0); put (_all_) (+0);
run; run;

View File

@@ -14,7 +14,7 @@
constraint unq unique(tx_from, dd_type), constraint unq unique(tx_from, dd_type),
constraint nnn not null(DD_SHORTDESC) constraint nnn not null(DD_SHORTDESC)
); );
%mp_getconstraints(lib=work,ds=example,outds=work.constraints) %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
@param lib= The target library (default=WORK) @param lib= The target library (default=WORK)
@@ -49,8 +49,8 @@ create table &outds as
on a.TABLE_CATALOG=b.TABLE_CATALOG on a.TABLE_CATALOG=b.TABLE_CATALOG
and a.TABLE_NAME=b.TABLE_NAME and a.TABLE_NAME=b.TABLE_NAME
and a.constraint_name=b.constraint_name and a.constraint_name=b.constraint_name
where a.TABLE_CATALOG="&lib" where a.TABLE_CATALOG="&lib"
and b.TABLE_CATALOG="&lib" and b.TABLE_CATALOG="&lib"
%if "&ds" ne "" %then %do; %if "&ds" ne "" %then %do;
and a.TABLE_NAME="&ds" and a.TABLE_NAME="&ds"
and b.TABLE_NAME="&ds" and b.TABLE_NAME="&ds"

View File

@@ -133,7 +133,9 @@ run;
if notnull='yes' then notnul=' not null'; if notnull='yes' then notnul=' not null';
if notnull='no' and missing(label) then put ' ' name typ; if notnull='no' and missing(label) then put ' ' name typ;
else if notnull='yes' and missing(label) then put ' ' name typ '[' notnul ']'; else if notnull='yes' and missing(label) then do;
put ' ' name typ '[' notnul ']';
end;
else if notnull='no' then put ' ' name typ '[' lab ']'; else if notnull='no' then put ' ' name typ '[' lab ']';
else put ' ' name typ '[' notnul ',' lab ']'; else put ' ' name typ '[' notnul ',' lab ']';
@@ -166,7 +168,7 @@ run;
call symputx('constcheck',1); call symputx('constcheck',1);
end; end;
if last then call symputx('constraints_used',cats(upcase(constraints_used))); if last then call symput('constraints_used',cats(upcase(constraints_used)));
length curds const col $39; length curds const col $39;
curds="&curds"; curds="&curds";
@@ -176,7 +178,8 @@ run;
proc append base=&pkds data=&syslast;run; proc append base=&pkds data=&syslast;run;
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */ /* Create Unique Indexes, but only if they were not already defined within
the Constraints section. */
data _data_(keep=curds const col); data _data_(keep=curds const col);
set &idxinfo (where=( set &idxinfo (where=(
libname="%scan(&curds,1,.)" libname="%scan(&curds,1,.)"
@@ -187,7 +190,7 @@ run;
file &outref mod; file &outref mod;
by idxusage indxname; by idxusage indxname;
name=upcase(name); name=upcase(name);
if &constcheck=1 then stop; /* in fact we only care about PKs so stop if we have */ if &constcheck=1 then stop; /* we only care about PKs so stop if we have */
if _n_=1 and &constcheck=0 then put / ' indexes {'; if _n_=1 and &constcheck=0 then put / ' indexes {';
length cols $5000; length cols $5000;
@@ -217,8 +220,8 @@ run;
%end; %end;
/** /**
* now we need to figure out the relationships * now we need to figure out the relationships
*/ */
/* sort alphabetically so we can have one set of unique cols per table */ /* sort alphabetically so we can have one set of unique cols per table */
proc sort data=&pkds nodupkey; proc sort data=&pkds nodupkey;
@@ -226,7 +229,7 @@ proc sort data=&pkds nodupkey;
run; run;
data &pkds.1 (keep=curds col) data &pkds.1 (keep=curds col)
&pkds.2 (keep=curds cols); &pkds.2 (keep=curds cols);
set &pkds; set &pkds;
by curds const; by curds const;
length retconst $39 cols $5000; length retconst $39 cols $5000;
@@ -261,7 +264,11 @@ run;
line='Ref: "'!!"&curds" line='Ref: "'!!"&curds"
!!cats('".(',"%mf_getquotedstr(&pkcols,dlm=%str(,),quote=%str( ))",')') !!cats('".(',"%mf_getquotedstr(&pkcols,dlm=%str(,),quote=%str( ))",')')
!!' - ' !!' - '
!!cats(quote(trim(curds)),'.(',"%mf_getquotedstr(&pkcols,dlm=%str(,),quote=%str( ))",')'); !!cats(quote(trim(curds))
,'.('
,"%mf_getquotedstr(&pkcols,dlm=%str(,),quote=%str( ))"
,')'
);
put line; put line;
run; run;
@@ -282,7 +289,9 @@ run;
create table &pkds.5b as create table &pkds.5b as
select curds,count(*) as cnt select curds,count(*) as cnt
from &pkds.5a from &pkds.5a
where curds not in (select curds from &pkds.2 where cols="&pkcols") /* not a one to one match */ where curds not in (
select curds from &pkds.2 where cols="&pkcols"
) /* not a one to one match */
and curds ne "&curds" /* exclude self */ and curds ne "&curds" /* exclude self */
group by 1; group by 1;
create table &pkds.6 as create table &pkds.6 as

View File

@@ -27,7 +27,7 @@
@param schema= Choose a preferred schema name (default is to use actual schema @param schema= Choose a preferred schema name (default is to use actual schema
,else libref) ,else libref)
@param applydttm= for non SAS DDL, choose if columns are created with native @param applydttm= for non SAS DDL, choose if columns are created with native
datetime2 format or regular decimal type datetime2 format or regular decimal type
@version 9.3 @version 9.3
@author Allan Bowe @author Allan Bowe
**/ **/
@@ -86,7 +86,9 @@ create table _data_ as
%global constraints_used; %global constraints_used;
data _null_; data _null_;
length ctype $11 constraint_name_orig $256 constraints_used $5000; length ctype $11 constraint_name_orig $256 constraints_used $5000;
set &colconst (where=(table_name="&curds" and constraint_type in ('PRIMARY','UNIQUE'))) end=last; set &colconst(
where=(table_name="&curds" and constraint_type in ('PRIMARY','UNIQUE'))
) end=last;
file &fref mod; file &fref mod;
by constraint_type constraint_name; by constraint_type constraint_name;
retain constraints_used; retain constraints_used;
@@ -161,10 +163,19 @@ run;
put ');'; put ');';
run; run;
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */ /* Create Unique Indexes, but only if they were not already defined within
the Constraints section. */
data _null_; data _null_;
*length ds $128; *length ds $128;
set &idxinfo (where=(memname="&curds" and unique='yes' and indxname not in (%sysfunc(tranwrd("&constraints_used",%str( ),%str(",")))))); set &idxinfo(
where=(
memname="&curds"
and unique='yes'
and indxname not in (
%sysfunc(tranwrd("&constraints_used",%str( ),%str(",")))
)
)
);
file &fref mod; file &fref mod;
by idxusage indxname; by idxusage indxname;
/* ds=cats(libname,'.',memname); */ /* ds=cats(libname,'.',memname); */
@@ -228,10 +239,19 @@ run;
/* Extra step for data constraints */ /* Extra step for data constraints */
%addConst() %addConst()
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */ /* Create Unique Indexes, but only if they were not already defined within
the Constraints section. */
data _null_; data _null_;
*length ds $128; *length ds $128;
set &idxinfo (where=(memname="&curds" and unique='yes' and indxname not in (%sysfunc(tranwrd("&constraints_used",%str( ),%str(",")))))); set &idxinfo(
where=(
memname="&curds"
and unique='yes'
and indxname not in (
%sysfunc(tranwrd("&constraints_used",%str( ),%str(",")))
)
)
);
file &fref mod; file &fref mod;
by idxusage indxname; by idxusage indxname;
*ds=cats(libname,'.',memname); *ds=cats(libname,'.',memname);
@@ -320,15 +340,24 @@ run;
put ');'; put ');';
run; run;
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */ /* Create Unique Indexes, but only if they were not already defined within
the Constraints section. */
data _null_; data _null_;
*length ds $128; *length ds $128;
set &idxinfo (where=(memname="&curds" and unique='yes' and indxname not in (%sysfunc(tranwrd("&constraints_used",%str( ),%str(",")))))); set &idxinfo(
where=(
memname="&curds"
and unique='yes'
and indxname not in (
%sysfunc(tranwrd("&constraints_used",%str( ),%str(",")))
)
)
);
file &fref mod; file &fref mod;
by idxusage indxname; by idxusage indxname;
/* ds=cats(libname,'.',memname); */ /* ds=cats(libname,'.',memname); */
if first.indxname then do; if first.indxname then do;
put 'CREATE UNIQUE INDEX "' indxname +(-1) '" ' "ON &schema..&curds (" ; put 'CREATE UNIQUE INDEX "' indxname +(-1) '" ' "ON &schema..&curds(";
put ' "' name +(-1) '"' ; put ' "' name +(-1) '"' ;
end; end;
else put ' ,"' name +(-1) '"'; else put ' ,"' name +(-1) '"';

View File

@@ -1,17 +1,18 @@
/** /**
@file mp_getmaxvarlengths.sas @file mp_getmaxvarlengths.sas
@brief Scans a dataset to find the max length of the variable values @brief Scans a dataset to find the max length of the variable values
@details @details
This macro will scan a base dataset and produce an output dataset with two This macro will scan a base dataset and produce an output dataset with two
columns: columns:
- NAME Name of the base dataset column - NAME Name of the base dataset column
- MAXLEN Maximum length of the data contained therein. - MAXLEN Maximum length of the data contained therein.
Character fields may be allocated very large widths (eg 32000) of which the maximum Character fields may be allocated very large widths (eg 32000) of which the
value is likely to be much narrower. This macro was designed to enable a HTML maximum value is likely to be much narrower. This macro was designed to
table to be appropriately sized however this could be used as part of a data enable a HTML table to be appropriately sized however this could be used as
audit to ensure we aren't over-sizing our tables in relation to the data therein. part of a data audit to ensure we aren't over-sizing our tables in relation to
the data therein.
Numeric fields are converted using the relevant format to determine the width. Numeric fields are converted using the relevant format to determine the width.
Usage: Usage:
@@ -33,7 +34,7 @@
%macro mp_getmaxvarlengths( %macro mp_getmaxvarlengths(
libds /* libref.dataset to analyse */ libds /* libref.dataset to analyse */
,outds=work.mp_getmaxvarlengths /* name of output dataset to create */ ,outds=work.mp_getmaxvarlengths /* name of output dataset to create */
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local vars x var fmt; %local vars x var fmt;

View File

@@ -4,8 +4,8 @@
@details PROC JSON is faster but will produce errs like the ones below if @details PROC JSON is faster but will produce errs like the ones below if
special chars are encountered. special chars are encountered.
>An object or array close is not valid at this point in the JSON text. >An object or array close is not valid at this point in the JSON text.
>Date value out of range >Date value out of range
If this happens, try running with ENGINE=DATASTEP. If this happens, try running with ENGINE=DATASTEP.
@@ -13,7 +13,7 @@
filename tmp temp; filename tmp temp;
data class; set sashelp.class;run; data class; set sashelp.class;run;
%mp_jsonout(OBJ,class,jref=tmp) %mp_jsonout(OBJ,class,jref=tmp)
data _null_; data _null_;
@@ -22,7 +22,7 @@
run; run;
If you are building web apps with SAS then you are strongly encouraged to use If you are building web apps with SAS then you are strongly encouraged to use
the mX_createwebservice macros in combination with the the mX_createwebservice macros in combination with the
[sasjs adapter](https://github.com/sasjs/adapter). [sasjs adapter](https://github.com/sasjs/adapter).
For more information see https://sasjs.io For more information see https://sasjs.io
@@ -38,11 +38,11 @@
@param fmt= Whether to keep or strip formats from the table @param fmt= Whether to keep or strip formats from the table
@param engine= Which engine to use to send the JSON, options are: @param engine= Which engine to use to send the JSON, options are:
* PROCJSON (default) * PROCJSON (default)
* DATASTEP * DATASTEP
@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.
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -66,7 +66,7 @@
%if &engine=PROCJSON %then %do; %if &engine=PROCJSON %then %do;
data;run;%let tempds=&syslast; data;run;%let tempds=&syslast;
proc sql;drop table &tempds; proc sql;drop table &tempds;
data &tempds /view=&tempds;set &ds; data &tempds /view=&tempds;set &ds;
%if &fmt=N %then format _numeric_ best32.;; %if &fmt=N %then format _numeric_ best32.;;
proc json out=&jref pretty proc json out=&jref pretty
%if &action=ARR %then nokeys ; %if &action=ARR %then nokeys ;
@@ -81,13 +81,14 @@
%put &sysmacroname: &ds NOT FOUND!!!; %put &sysmacroname: &ds NOT FOUND!!!;
%return; %return;
%end; %end;
data _null_;file &jref mod ; data _null_;file &jref mod ;
put "["; call symputx('cols',0,'l'); put "["; call symputx('cols',0,'l');
proc sort data=sashelp.vcolumn(where=(libname='WORK' & memname="%upcase(&ds)")) proc sort
data=sashelp.vcolumn(where=(libname='WORK' & memname="%upcase(&ds)"))
out=_data_; out=_data_;
by varnum; by varnum;
data _null_; data _null_;
set _last_ end=last; set _last_ end=last;
call symputx(cats('name',_n_),name,'l'); call symputx(cats('name',_n_),name,'l');
call symputx(cats('type',_n_),type,'l'); call symputx(cats('type',_n_),type,'l');
@@ -121,8 +122,9 @@
)))))!!'"'; )))))!!'"';
%end; %end;
%end; %end;
run; run;
/* write to temp loc to avoid _webout truncation - https://support.sas.com/kb/49/325.html */ /* write to temp loc to avoid _webout truncation
- https://support.sas.com/kb/49/325.html */
filename _sjs temp lrecl=131068 encoding='utf-8'; filename _sjs temp lrecl=131068 encoding='utf-8';
data _null_; file _sjs lrecl=131068 encoding='utf-8' mod; data _null_; file _sjs lrecl=131068 encoding='utf-8' mod;
set &tempds; set &tempds;
@@ -131,7 +133,7 @@
%do i=1 %to &cols; %do i=1 %to &cols;
%if &i>1 %then "," ; %if &i>1 %then "," ;
%if &action=OBJ %then """&&name&i"":" ; %if &action=OBJ %then """&&name&i"":" ;
&&name&i &&name&i
%end; %end;
%if &action=ARR %then "]" ; %else "}" ; ; %if &action=ARR %then "]" ; %else "}" ; ;
proc sql; proc sql;

View File

@@ -16,13 +16,13 @@
%mp_prevobs(INIT,history=2) %mp_prevobs(INIT,history=2)
if _n_ =10 then do; if _n_ =10 then do;
%* fetch previous but 1 record; %* fetch previous but 1 record;
%mp_prevobs(FETCH,-2) %mp_prevobs(FETCH,-2)
put _n_= name= age= calc_var=; put _n_= name= age= calc_var=;
%* fetch previous record; %* fetch previous record;
%mp_prevobs(FETCH,-1) %mp_prevobs(FETCH,-1)
put _n_= name= age= calc_var=; put _n_= name= age= calc_var=;
%* reinstate current record ; %* reinstate current record ;
%mp_prevobs(FETCH,0) %mp_prevobs(FETCH,0)
put _n_= name= age= calc_var=; put _n_= name= age= calc_var=;
end; end;
run; run;
@@ -35,11 +35,11 @@
https://www.lexjansen.com/pharmasug/2008/cc/CC08.pdf https://www.lexjansen.com/pharmasug/2008/cc/CC08.pdf
@param action Either FETCH a current or previous record, or INITialise. @param action Either FETCH a current or previous record, or INITialise.
@param record The relative (to current) position of the previous observation @param record The relative (to current) position of the previous observation
to return. to return.
@param history= The number of records to retain in the hash table. Default=5 @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 @param prefix= the prefix to give to the variables used to store the hash name
and index. Default=mp_prevobs and index. Default=mp_prevobs
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -53,33 +53,33 @@
%let record=%eval((&record+0) * -1); %let record=%eval((&record+0) * -1);
%if &action=INIT %then %do; %if &action=INIT %then %do;
if _n_ eq 1 then do; if _n_ eq 1 then do;
attrib &prefix._VAR length=$64; attrib &prefix._VAR length=$64;
dcl hash &prefix._HASH(ordered:'Y'); dcl hash &prefix._HASH(ordered:'Y');
&prefix._KEY=0; &prefix._KEY=0;
&prefix._HASH.defineKey("&prefix._KEY"); &prefix._HASH.defineKey("&prefix._KEY");
do while(1); do while(1);
call vnext(&prefix._VAR); call vnext(&prefix._VAR);
if &prefix._VAR='' then leave; if &prefix._VAR='' then leave;
if &prefix._VAR eq "&prefix._VAR" then continue; if &prefix._VAR eq "&prefix._VAR" then continue;
else if &prefix._VAR eq "&prefix._KEY" then continue; else if &prefix._VAR eq "&prefix._KEY" then continue;
&prefix._HASH.defineData(&prefix._VAR); &prefix._HASH.defineData(&prefix._VAR);
end; end;
&prefix._HASH.defineDone(); &prefix._HASH.defineDone();
end; end;
/* this part has to happen before FETCHing */ /* this part has to happen before FETCHing */
&prefix._KEY+1; &prefix._KEY+1;
&prefix._rc=&prefix._HASH.add(); &prefix._rc=&prefix._HASH.add();
if &prefix._rc then putlog 'adding' &prefix._rc=; if &prefix._rc then putlog 'adding' &prefix._rc=;
%if &history>0 %then %do; %if &history>0 %then %do;
if &prefix._key>&history+1 then if &prefix._key>&history+1 then
&prefix._HASH.remove(key: &prefix._KEY - &history - 1); &prefix._HASH.remove(key: &prefix._KEY - &history - 1);
if &prefix._rc then putlog 'removing' &prefix._rc=; if &prefix._rc then putlog 'removing' &prefix._rc=;
%end; %end;
%end; %end;
%else %if &action=FETCH %then %do; %else %if &action=FETCH %then %do;
if &record > &prefix._key then putlog "Not enough records in &Prefix._hash yet"; if &record>&prefix._key then putlog "Not enough records in &Prefix._hash yet";
else &prefix._rc=&prefix._HASH.find(key: &prefix._KEY - &record); else &prefix._rc=&prefix._HASH.find(key: &prefix._KEY - &record);
if &prefix._rc then putlog &prefix._rc= " when fetching " &prefix._KEY= if &prefix._rc then putlog &prefix._rc= " when fetching " &prefix._KEY=
"with record &record and " _n_=; "with record &record and " _n_=;

View File

@@ -32,9 +32,9 @@
@returns outds contains the following variables: @returns outds contains the following variables:
- level (0 = top level) - level (0 = top level)
- &parentvar - &parentvar
- &childvar (null if none found) - &childvar (null if none found)
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe

View File

@@ -8,14 +8,14 @@
rootlib rootlib
|-- LIBREF1 |-- LIBREF1
| |__ mytable.ddl | |__ mytable.ddl
| |__ someothertable.ddl | |__ someothertable.ddl
|-- LIBREF2 |-- LIBREF2
| |__ table1.ddl | |__ table1.ddl
| |__ table2.ddl | |__ table2.ddl
|-- LIBREF3 |-- LIBREF3
|__ table3.ddl |__ table3.ddl
|__ table4.ddl |__ table4.ddl
Only files with the .ddl suffix are executed. The parent folder name is used Only files with the .ddl suffix are executed. The parent folder name is used
as the libref. as the libref.

View File

@@ -32,7 +32,7 @@ create table _data_ as
where upcase(libname) in ("IMPOSSIBLE", where upcase(libname) in ("IMPOSSIBLE",
%local x; %local x;
%do x=1 %to %sysfunc(countw(&libs)); %do x=1 %to %sysfunc(countw(&libs));
"%upcase(%scan(&libs,&x))" "%upcase(%scan(&libs,&x))"
%end; %end;
) )
%end; %end;

View File

@@ -3,7 +3,7 @@
@brief Searches all data in a library @brief Searches all data in a library
@details @details
Scans an entire library and creates a copy of any table Scans an entire library and creates a copy of any table
containing a specific string OR numeric value. Only containing a specific string OR numeric value. Only
matching records are written out. matching records are written out.
If both a string and numval are provided, the string If both a string and numval are provided, the string
will take precedence. will take precedence.
@@ -20,9 +20,10 @@
@param ds= the dataset to search (leave blank to search entire library) @param ds= the dataset to search (leave blank to search entire library)
@param string= the string value to search @param string= the string value to search
@param numval= the numeric value to search (must be exact) @param numval= the numeric value to search (must be exact)
@param outloc= the directory in which to create the output datasets with matching @param outloc= the directory in which to create the output datasets with
rows. Will default to a subfolder in the WORK library. matching rows. Will default to a subfolder in the WORK library.
@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> SAS Macros </h4> <h4> SAS Macros </h4>
@@ -36,7 +37,7 @@
**/ **/
%macro mp_searchdata(lib=sashelp %macro mp_searchdata(lib=sashelp
,ds= ,ds=
,string= /* the query will use a contains (?) operator */ ,string= /* the query will use a contains (?) operator */
,numval= /* numeric must match exactly */ ,numval= /* numeric must match exactly */
,outloc=%sysfunc(pathname(work))/mpsearch ,outloc=%sysfunc(pathname(work))/mpsearch
@@ -44,7 +45,8 @@
,filter_text=%str(1=1) ,filter_text=%str(1=1)
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%local table_list table table_num table colnum col start_tm check_tm vars type coltype; %local table_list table table_num table colnum col start_tm check_tm vars type
coltype;
%put process began at %sysfunc(datetime(),datetime19.); %put process began at %sysfunc(datetime(),datetime19.);
%if &syscc ge 4 %then %do; %if &syscc ge 4 %then %do;
@@ -61,14 +63,14 @@ libname mpsearch "&outloc";
/* get the list of tables in the library */ /* get the list of tables in the library */
proc sql noprint; proc sql noprint;
select distinct memname into: table_list separated by ' ' select distinct memname into: table_list separated by ' '
from dictionary.tables from dictionary.tables
where upcase(libname)="%upcase(&lib)" where upcase(libname)="%upcase(&lib)"
%if &ds ne %then %do; %if &ds ne %then %do;
and upcase(memname)=%upcase("&ds") and upcase(memname)=%upcase("&ds")
%end; %end;
; ;
/* check that we have something to check */ /* check that we have something to check */
proc sql proc sql
%if &outobs>-1 %then %do; %if &outobs>-1 %then %do;
outobs=&outobs outobs=&outobs
%end; %end;
@@ -85,7 +87,7 @@ proc sql
%let check_tm=%sysfunc(datetime()); %let check_tm=%sysfunc(datetime());
/* build sql statement */ /* build sql statement */
create table mpsearch.&table as select * from &lib..&table create table mpsearch.&table as select * from &lib..&table
where %unquote(&filter_text) and where %unquote(&filter_text) and
(0 (0
/* loop through columns */ /* loop through columns */
%do colnum=1 %to %sysfunc(countw(&vars,%str( ))); %do colnum=1 %to %sysfunc(countw(&vars,%str( )));
@@ -101,7 +103,8 @@ proc sql
%end; %end;
%end; %end;
); );
%put Search query for &table took %sysevalf(%sysfunc(datetime())-&check_tm) seconds; %put Search query for &table took
%sysevalf(%sysfunc(datetime())-&check_tm) seconds;
%if &sqlrc ne 0 %then %do; %if &sqlrc ne 0 %then %do;
%put %str(WAR)NING: SQLRC=&sqlrc when processing &table; %put %str(WAR)NING: SQLRC=&sqlrc when processing &table;
%return; %return;

View File

@@ -12,7 +12,7 @@
@param key Provide a key on which to perform the lookup @param key Provide a key on which to perform the lookup
@param value Provide a value @param value Provide a value
@param type= either C or N will populate valc and valn respectively. C is @param type= either C or N will populate valc and valn respectively. C is
default. default.
@param libds= define the target table to hold the parameters @param libds= define the target table to hold the parameters
@version 9.2 @version 9.2

View File

@@ -1,12 +1,13 @@
/** /**
@file @file
@brief Capture session start / finish times and request details @brief Capture session start / finish times and request details
@details For details, see http://www.rawsas.com/2015/09/logging-of-stored-process-server.html. @details For details, see
https://rawsas.com/event-logging-of-stored-process-server-sessions.
Requires a base table in the following structure (name can be changed): Requires a base table in the following structure (name can be changed):
proc sql; proc sql;
create table &libds( create table &libds(
request_dttm num not null format=datetime. request_dttm num not null format=datetime.
,status_cd char(4) not null ,status_cd char(4) not null
,_metaperson varchar(100) not null ,_metaperson varchar(100) not null
,_program varchar(500) ,_program varchar(500)

View File

@@ -6,7 +6,8 @@
Usage: Usage:
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;
%mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt) %mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt)
@@ -65,13 +66,15 @@
%else %if &contentype=XLSX %then %do; %else %if &contentype=XLSX %then %do;
%if &platform=SASMETA %then %do; %if &platform=SASMETA %then %do;
data _null_; data _null_;
rc=stpsrv_header('Content-type','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); rc=stpsrv_header('Content-type',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname"); rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
run; run;
%end; %end;
%else %if &platform=SASVIYA %then %do; %else %if &platform=SASVIYA %then %do;
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" name='_webout.xls' filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" name='_webout.xls'
contenttype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' contenttype=
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
contentdisp="attachment; filename=&outname"; contentdisp="attachment; filename=&outname";
%end; %end;
%end; %end;
@@ -113,10 +116,10 @@
%end; %end;
%if &inref ne 0 %then %do; %if &inref ne 0 %then %do;
%mp_binarycopy(inref=&inref,outref=_webout) %mp_binarycopy(inref=&inref,outref=_webout)
%end; %end;
%else %do; %else %do;
%mp_binarycopy(inloc="&inloc",outref=_webout) %mp_binarycopy(inloc="&inloc",outref=_webout)
%end; %end;
%mend; %mend;

View File

@@ -5,7 +5,7 @@
testing of arbitrary jobs. testing of arbitrary jobs.
%mp_testjob( %mp_testjob(
duration=60*5 duration=60*5
) )
@param [in] duration= the time in seconds which the job should run for. Actual @param [in] duration= the time in seconds which the job should run for. Actual

View File

@@ -1,10 +1,10 @@
/** /**
@file mp_testwritespeedlibrary.sas @file mp_testwritespeedlibrary.sas
@brief Tests the write speed of a new table in a SAS library @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 @details Will create a new table of a certain size in an
existing SAS library. The table will have one column, existing SAS library. The table will have one column,
and will be subsequently deleted. and will be subsequently deleted.
%mp_testwritespeedlibrary( %mp_testwritespeedlibrary(
lib=work lib=work
,size=0.5 ,size=0.5

View File

@@ -8,8 +8,11 @@
Credits: Credits:
* Roger Deangelis, https://communities.sas.com/t5/SAS-Programming/listing-all-files-within-a-directory-and-subdirectories/m-p/332616/highlight/true#M74887 Roger Deangelis:
* Tom, https://communities.sas.com/t5/SAS-Programming/listing-all-files-of-all-types-from-all-subdirectories/m-p/334113/highlight/true#M75419 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 dir= Directory to be scanned (default=/tmp)
@@ -17,13 +20,13 @@
@returns outds contains the following variables: @returns outds contains the following variables:
- `dir`: a flag (1/0) to say whether it is a directory or not. This is not - `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 reliable - folders that you do not have permission to open will be flagged
as directories. as directories.
- `ext`: file extension - `ext`: file extension
- `filename`: file name - `filename`: file name
- `dirname`: directory name - `dirname`: directory name
- `fullpath`: directory + file name - `fullpath`: directory + file name
@version 9.2 @version 9.2
**/ **/

View File

@@ -33,7 +33,7 @@
**/ **/
%macro mm_assigndirectlib( %macro mm_assigndirectlib(
libref /* libref to assign from metadata */ libref /* libref to assign from metadata */
,open_passthrough= /* provide an alias to produce the ,open_passthrough= /* provide an alias to produce the
CONNECT TO statement for the CONNECT TO statement for the
relevant external database */ relevant external database */
@@ -107,7 +107,7 @@ run;
run; run;
%if %sysevalf(&sysver<9.4) %then %do; %if %sysevalf(&sysver<9.4) %then %do;
libname &libref &filepath; libname &libref &filepath;
%end; %end;
%else %do; %else %do;
/* apply the new filelocks option to cater for temporary locks */ /* apply the new filelocks option to cater for temporary locks */
@@ -117,7 +117,8 @@ run;
%end; %end;
%else %if &engine=REMOTE %then %do; %else %if &engine=REMOTE %then %do;
data x; data x;
length rcCon rcProp rc k 3 uriCon uriProp PropertyValue PropertyName Delimiter $256 properties $2048; length rcCon rcProp rc k 3 uriCon uriProp PropertyValue PropertyName
Delimiter $256 properties $2048;
retain properties; retain properties;
rcCon = metadata_getnasn("&liburi", "LibraryConnection", 1, uriCon); rcCon = metadata_getnasn("&liburi", "LibraryConnection", 1, uriCon);
@@ -129,8 +130,9 @@ run;
rc = metadata_getattr(uriProp , "DefaultValue",PropertyValue); rc = metadata_getattr(uriProp , "DefaultValue",PropertyValue);
rc = metadata_getattr(uriProp , "PropertyName",PropertyName); rc = metadata_getattr(uriProp , "PropertyName",PropertyName);
rc = metadata_getattr(uriProp , "Delimiter",Delimiter); rc = metadata_getattr(uriProp , "Delimiter",Delimiter);
properties = trim(properties) !! " " !! trim(PropertyName) !! trim(Delimiter) !! trim(PropertyValue); properties = trim(properties) !! " " !! trim(PropertyName)
output; !! trim(Delimiter) !! trim(PropertyValue);
output;
k+1; k+1;
rcProp = metadata_getnasn(uriCon, "Properties", k, uriProp); rcProp = metadata_getnasn(uriCon, "Properties", k, uriProp);
end; end;
@@ -165,13 +167,14 @@ run;
rc=metadata_getnasn(connx_uri,'Properties',i,conprop_uri); rc=metadata_getnasn(connx_uri,'Properties',i,conprop_uri);
rc2=metadata_getattr(conprop_uri,'Name',value); rc2=metadata_getattr(conprop_uri,'Name',value);
if value='Connection.OLE.Property.DATASOURCE.Name.xmlKey.txt' then do; if value='Connection.OLE.Property.DATASOURCE.Name.xmlKey.txt' then do;
rc3=metadata_getattr(conprop_uri,'DefaultValue',datasource); rc3=metadata_getattr(conprop_uri,'DefaultValue',datasource);
end; end;
else if value='Connection.OLE.Property.PROVIDER.Name.xmlKey.txt' then do; else if value='Connection.OLE.Property.PROVIDER.Name.xmlKey.txt' then do;
rc4=metadata_getattr(conprop_uri,'DefaultValue',provider); rc4=metadata_getattr(conprop_uri,'DefaultValue',provider);
end; end;
else if value='Connection.OLE.Property.PROPERTIES.Name.xmlKey.txt' then do; else if value='Connection.OLE.Property.PROPERTIES.Name.xmlKey.txt' then
rc5=metadata_getattr(conprop_uri,'DefaultValue',properties); do;
rc5=metadata_getattr(conprop_uri,'DefaultValue',properties);
end; end;
end; end;
&mD.putlog 'NOTE- dsn/provider/properties: ' / &mD.putlog 'NOTE- dsn/provider/properties: ' /
@@ -194,8 +197,8 @@ run;
/* need additional properties to make this work */ /* need additional properties to make this work */
properties=('Integrated Security'=SSPI properties=('Integrated Security'=SSPI
'Persist Security Info'=True 'Persist Security Info'=True
%sysfunc(compress(%str(&SQL_properties),%str(()))) %sysfunc(compress(%str(&SQL_properties),%str(())))
) )
DATASOURCE=&sql_dsn PROMPT=NO DATASOURCE=&sql_dsn PROMPT=NO
PROVIDER=&sql_provider SCHEMA=&sql_schema CONNECTION = GLOBAL); PROVIDER=&sql_provider SCHEMA=&sql_schema CONNECTION = GLOBAL);
%end; %end;
@@ -203,9 +206,9 @@ run;
LIBNAME &libref OLEDB PROPERTIES=&sql_properties LIBNAME &libref OLEDB PROPERTIES=&sql_properties
DATASOURCE=&sql_dsn PROVIDER=&sql_provider SCHEMA=&sql_schema DATASOURCE=&sql_dsn PROVIDER=&sql_provider SCHEMA=&sql_schema
%if %length(&sql_domain)>0 %then %do; %if %length(&sql_domain)>0 %then %do;
authdomain="&sql_domain" authdomain="&sql_domain"
%end; %end;
connection=shared; connection=shared;
%end; %end;
%end; %end;
%else %if &engine=ODBC %then %do; %else %if &engine=ODBC %then %do;
@@ -222,8 +225,8 @@ run;
rc2=metadata_getnasn(connx_uri,'Properties',i,conprop_uri); rc2=metadata_getnasn(connx_uri,'Properties',i,conprop_uri);
rc3=metadata_getattr(conprop_uri,'Name',value); rc3=metadata_getattr(conprop_uri,'Name',value);
if value='Connection.ODBC.Property.DATASRC.Name.xmlKey.txt' then do; if value='Connection.ODBC.Property.DATASRC.Name.xmlKey.txt' then do;
rc4=metadata_getattr(conprop_uri,'DefaultValue',datasource); rc4=metadata_getattr(conprop_uri,'DefaultValue',datasource);
rc2=-1; rc2=-1;
end; end;
end; end;
/* get SCHEMA */ /* get SCHEMA */
@@ -280,7 +283,7 @@ run;
/* get PRESERVE_TAB_NAMES value */ /* get PRESERVE_TAB_NAMES value */
/* be careful with PRESERVE_TAB_NAMES=YES - it will mean your table will /* be careful with PRESERVE_TAB_NAMES=YES - it will mean your table will
become case sensitive!! */ become case sensitive!! */
prop='Library.DBMS.Property.PreserveTabNames.Name.xmlKey.txt'; prop='Library.DBMS.Property.PreserveTabNames.Name.xmlKey.txt';
rc=metadata_getprop("&liburi",prop,preserve_tab_names,""); rc=metadata_getprop("&liburi",prop,preserve_tab_names,"");
if preserve_tab_names^='' then preserve_tab_names= if preserve_tab_names^='' then preserve_tab_names=
@@ -357,7 +360,8 @@ run;
call symputx('authdomain',authdomain,'l'); call symputx('authdomain',authdomain,'l');
/* path */ /* path */
rc=metadata_getprop(assocuri1,'Connection.Oracle.Property.PATH.Name.xmlKey.txt',path); rc=metadata_getprop(assocuri1,
'Connection.Oracle.Property.PATH.Name.xmlKey.txt',path);
call symputx('path',path,'l'); call symputx('path',path,'l');
/* schema */ /* schema */
@@ -366,27 +370,30 @@ run;
call symputx('schema',schema,'l'); call symputx('schema',schema,'l');
run; run;
%put NOTE: Executing the following:/; %put NOTE-; %put NOTE: Executing the following:/; %put NOTE-;
%put NOTE- libname &libref ORACLE path=&path schema=&schema authdomain=&authdomain; %put NOTE- libname &libref ORACLE path=&path schema=&schema;
%put NOTE- authdomain=&authdomain;
%put NOTE-; %put NOTE-;
libname &libref ORACLE path=&path schema=&schema authdomain=&authdomain; libname &libref ORACLE path=&path schema=&schema authdomain=&authdomain;
%end; %end;
%else %if &engine=SQLSVR %then %do; %else %if &engine=SQLSVR %then %do;
%put NOTE: Obtaining &engine library details; %put NOTE: Obtaining &engine library details;
data _null; data _null;
length assocuri1 assocuri2 assocuri3 authdomain path schema userid passwd $256; length assocuri1 assocuri2 assocuri3 authdomain path schema userid
passwd $256;
call missing (of _all_); call missing (of _all_);
rc=metadata_getnasn("&liburi",'DefaultLogin',1,assocuri1); rc=metadata_getnasn("&liburi",'DefaultLogin',1,assocuri1);
rc=metadata_getattr(assocuri1,"UserID",userid); rc=metadata_getattr(assocuri1,"UserID",userid);
rc=metadata_getattr(assocuri1,"Password",passwd); rc=metadata_getattr(assocuri1,"Password",passwd);
call symputx('user',userid,'l'); call symputx('user',userid,'l');
call symputx('pass',passwd,'l'); call symputx('pass',passwd,'l');
/* path */ /* path */
rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2); rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2);
rc=metadata_getprop(assocuri2,'Connection.SQL.Property.Datasrc.Name.xmlKey.txt',path); rc=metadata_getprop(assocuri2,
'Connection.SQL.Property.Datasrc.Name.xmlKey.txt',path);
call symputx('path',path,'l'); call symputx('path',path,'l');
/* schema */ /* schema */
rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3);
rc=metadata_getattr(assocuri3,'SchemaName',schema); rc=metadata_getattr(assocuri3,'SchemaName',schema);
@@ -394,17 +401,19 @@ run;
run; run;
%put NOTE: Executing the following:/; %put NOTE-; %put NOTE: Executing the following:/; %put NOTE-;
%put NOTE- libname &libref SQLSVR datasrc=&path schema=&schema user="&user" pass="XXX"; %put NOTE- libname &libref SQLSVR datasrc=&path schema=&schema ;
%put NOTE- user="&user" pass="XXX";
%put NOTE-; %put NOTE-;
libname &libref SQLSVR datasrc=&path schema=&schema user="&user" pass="&pass" ; libname &libref SQLSVR datasrc=&path schema=&schema user="&user" pass="&pass";
%end; %end;
%else %if &engine=TERADATA %then %do; %else %if &engine=TERADATA %then %do;
%put NOTE: Obtaining &engine library details; %put NOTE: Obtaining &engine library details;
data _null; data _null;
length assocuri1 assocuri2 assocuri3 authdomain path schema userid passwd $256; length assocuri1 assocuri2 assocuri3 authdomain path schema userid
passwd $256;
call missing (of _all_); call missing (of _all_);
/* get auth domain */ /* get auth domain */
rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri1); rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri1);
rc=metadata_getnasn(assocuri1,'Domain',1,assocuri2); rc=metadata_getnasn(assocuri1,'Domain',1,assocuri2);
@@ -421,9 +430,10 @@ run;
/* path */ /* path */
rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2); rc=metadata_getnasn("&liburi",'LibraryConnection',1,assocuri2);
rc=metadata_getprop(assocuri2,'Connection.Teradata.Property.SERVER.Name.xmlKey.txt',path); rc=metadata_getprop(assocuri2,
'Connection.Teradata.Property.SERVER.Name.xmlKey.txt',path);
call symputx('path',path,'l'); call symputx('path',path,'l');
/* schema */ /* schema */
rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3); rc=metadata_getnasn("&liburi",'UsingPackages',1,assocuri3);
rc=metadata_getattr(assocuri3,'SchemaName',schema); rc=metadata_getattr(assocuri3,'SchemaName',schema);
@@ -431,7 +441,8 @@ run;
run; run;
%put NOTE: Executing the following:/; %put NOTE-; %put NOTE: Executing the following:/; %put NOTE-;
%put NOTE- libname &libref TERADATA server=&path schema=&schema authdomain=&authdomain; %put NOTE- libname &libref TERADATA server=&path schema=&schema ;
%put NOTe- authdomain=&authdomain;
%put NOTE-; %put NOTE-;
libname &libref TERADATA server=&path schema=&schema authdomain=&authdomain; libname &libref TERADATA server=&path schema=&schema authdomain=&authdomain;

View File

@@ -14,7 +14,8 @@
@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
@param mAbort= If not assigned, HARD will call %mp_abort(), SOFT will silently return @param mAbort= If not assigned, HARD will call %mp_abort(), SOFT will
silently return
@returns libname statement @returns libname statement
@@ -24,7 +25,7 @@
**/ **/
%macro mm_assignlib( %macro mm_assignlib(
libref libref
,mAbort=HARD ,mAbort=HARD
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;

View File

@@ -13,7 +13,9 @@
,params= name1=value1&#x0a;name2=value2&#x0a;emptyvalue= ,params= name1=value1&#x0a;name2=value2&#x0a;emptyvalue=
) )
@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> SAS Macros </h4> <h4> SAS Macros </h4>
@li mp_abort.sas @li mp_abort.sas
@@ -60,8 +62,8 @@
%mf_verifymacvars(tree name) %mf_verifymacvars(tree name)
/** /**
* check tree exists * check tree exists
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -77,8 +79,8 @@ run;
) )
/** /**
* Check object does not exist already * Check object does not exist already
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_pathobj("","&tree/&name","Application",type,uri); rc=metadata_pathobj("","&tree/&name","Application",type,uri);
@@ -94,8 +96,8 @@ run;
/** /**
* Now we can create the application * Now we can create the application
*/ */
filename &frefin temp; filename &frefin temp;
/* write header XML */ /* write header XML */

View File

@@ -50,8 +50,8 @@
%mf_verifymacvars(tree name) %mf_verifymacvars(tree name)
/** /**
* check tree exists * check tree exists
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -67,8 +67,8 @@ run;
) )
/** /**
* Check object does not exist already * Check object does not exist already
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_pathobj("","&tree/&name","Note",type,uri); rc=metadata_pathobj("","&tree/&name","Note",type,uri);
@@ -83,8 +83,8 @@ run;
%end; %end;
/** /**
* Now we can create the document * Now we can create the document
*/ */
filename &frefin temp; filename &frefin temp;
/* write header XML */ /* write header XML */

View File

@@ -55,7 +55,7 @@ data _null_;
* must have a starting slash ; * must have a starting slash ;
if ( substr(folderPath,1,1) ne '/' ) then do; if ( substr(folderPath,1,1) ne '/' ) then do;
put "%str(ERR)OR: &sysmacroname PATH parameter value must have starting slash"; put "%str(ERR)OR: &sysmacroname PATH param value must have starting slash";
stop; stop;
end; end;
@@ -75,8 +75,8 @@ data _null_;
* check that root folder exists ; * check that root folder exists ;
root=cats('/',scan(folderpath,1,'/'),"(Folder)"); root=cats('/',scan(folderpath,1,'/'),"(Folder)");
if metadata_pathobj('',root,"",objType,parentId)<1 then do; if metadata_pathobj('',root,"",objType,parentId)<1 then do;
put "%str(ERR)OR: " root " does not exist!"; put "%str(ERR)OR: " root " does not exist!";
stop; stop;
end; end;
* check that parent folder exists ; * check that parent folder exists ;
@@ -86,21 +86,21 @@ data _null_;
if rc<1 then do; if rc<1 then do;
putlog 'The following folders will be created:'; putlog 'The following folders will be created:';
/* folder does not exist - so start from top and work down */ /* folder does not exist - so start from top and work down */
length newpath $1000; length newpath $1000;
paths=0; paths=0;
do x=2 to countw(folderpath,'/'); do x=2 to countw(folderpath,'/');
newpath=''; newpath='';
do i=1 to x; do i=1 to x;
newpath=cats(newpath,'/',scan(folderpath,i,'/')); newpath=cats(newpath,'/',scan(folderpath,i,'/'));
end; end;
rc=metadata_pathobj('',cats(newpath,"(Folder)"),"",objType,parentId); rc=metadata_pathobj('',cats(newpath,"(Folder)"),"",objType,parentId);
if rc<1 then do; if rc<1 then do;
paths+1; paths+1;
call symputx(cats('path',paths),newpath); call symputx(cats('path',paths),newpath);
putlog newpath; putlog newpath;
end; end;
call symputx('paths',paths); call symputx('paths',paths);
end; end;
end; end;
else putlog "parent " parent " exists"; else putlog "parent " parent " exists";
@@ -115,7 +115,7 @@ run;
%if &paths>0 %then %do x=1 %to &paths; %if &paths>0 %then %do x=1 %to &paths;
%put executing recursive call for &&path&x; %put executing recursive call for &&path&x;
%mm_createfolder(path=&&path&x) %mm_createfolder(path=&&path&x)
%end; %end;
%else %do; %else %do;
filename __newdir temp; filename __newdir temp;
@@ -123,9 +123,10 @@ run;
%local inmeta; %local inmeta;
%put creating: &path; %put creating: &path;
%let inmeta=<AddMetadata><Reposid>$METAREPOSITORY</Reposid><Metadata> %let inmeta=<AddMetadata><Reposid>$METAREPOSITORY</Reposid><Metadata>
<Tree Name='&child' PublicType='Folder' TreeType='BIP Folder' UsageVersion='1000000'> <Tree Name='&child' PublicType='Folder' TreeType='BIP Folder'
<ParentTree><Tree ObjRef='&parentFolderObjId'/></ParentTree></Tree></Metadata> UsageVersion='1000000'><ParentTree><Tree ObjRef='&parentFolderObjId'/>
<NS>SAS</NS><Flags>268435456</Flags></AddMetadata>; </ParentTree></Tree></Metadata><NS>SAS</NS><Flags>268435456</Flags>
</AddMetadata>;
proc metadata in="&inmeta" out=__newdir verbose; proc metadata in="&inmeta" out=__newdir verbose;
run ; run ;

View File

@@ -56,7 +56,7 @@
**/ **/
%macro mm_createlibrary( %macro mm_createlibrary(
libname=My New Library libname=My New Library
,libref=mynewlib ,libref=mynewlib
,libdesc=Created automatically using the mm_createlibrary macro ,libdesc=Created automatically using the mm_createlibrary macro
,engine=BASE ,engine=BASE
@@ -78,8 +78,8 @@
%let libref=%upcase(&libref); %let libref=%upcase(&libref);
/** /**
* Check Library does not exist already with this libname * Check Library does not exist already with this libname
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_resolve("omsobj:SASLibrary?@Name='&libname'",type,uri); rc=metadata_resolve("omsobj:SASLibrary?@Name='&libname'",type,uri);
@@ -93,8 +93,8 @@ run;
%end; %end;
/** /**
* Check Library does not exist already with this libref * Check Library does not exist already with this libref
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_resolve("omsobj:SASLibrary?@Libref='&libref'",type,uri); rc=metadata_resolve("omsobj:SASLibrary?@Libref='&libref'",type,uri);
@@ -109,13 +109,13 @@ run;
/** /**
* Attempt to create tree * Attempt to create tree
*/ */
%mm_createfolder(path=&tree) %mm_createfolder(path=&tree)
/** /**
* check tree exists * check tree exists
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_pathobj("","&tree","Folder",type,uri); rc=metadata_pathobj("","&tree","Folder",type,uri);
@@ -128,8 +128,8 @@ run;
%end; %end;
/** /**
* Create filerefs for proc metadata call * Create filerefs for proc metadata call
*/ */
filename &frefin temp; filename &frefin temp;
filename &frefout temp; filename &frefout temp;
@@ -140,8 +140,8 @@ filename &frefout temp;
/** /**
* Check that the ServerContext exists * Check that the ServerContext exists
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_resolve("omsobj:ServerContext?@Name='&ServerContext'",type,uri); rc=metadata_resolve("omsobj:ServerContext?@Name='&ServerContext'",type,uri);
@@ -155,8 +155,8 @@ filename &frefout temp;
%end; %end;
/** /**
* Get prototype info * Get prototype info
*/ */
data _null_; data _null_;
length type uri str $256; length type uri str $256;
str="omsobj:Prototype?@Name='Library.SAS.Prototype.Name.xmlKey.txt'"; str="omsobj:Prototype?@Name='Library.SAS.Prototype.Name.xmlKey.txt'";
@@ -166,21 +166,21 @@ filename &frefout temp;
putlog (_all_)(=); putlog (_all_)(=);
run; run;
%if &checktype ne Prototype %then %do; %if &checktype ne Prototype %then %do;
%put %str(ERR)OR: Prototype (Library.SAS.Prototype.Name.xmlKey.txt) not found!; %put %str(ERR)OR: Prototype Library.SAS.Prototype.Name.xmlKey.txt not found;
%return; %return;
%end; %end;
/** /**
* Check that Physical location exists * Check that Physical location exists
*/ */
%if %sysfunc(fileexist(&directory))=0 %then %do; %if %sysfunc(fileexist(&directory))=0 %then %do;
%put %str(ERR)OR: Physical directory (&directory) does not appear to exist!; %put %str(ERR)OR: Physical directory (&directory) does not appear to exist!;
%return; %return;
%end; %end;
/** /**
* Check that Directory Object exists in metadata * Check that Directory Object exists in metadata
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_resolve("omsobj:Directory?@DirectoryRole='LibraryPath'" rc=metadata_resolve("omsobj:Directory?@DirectoryRole='LibraryPath'"
@@ -228,16 +228,16 @@ filename &frefout temp;
%end; %end;
/** /**
* check SAS version * check SAS version
*/ */
%if %sysevalf(&sysver lt 9.3) %then %do; %if %sysevalf(&sysver lt 9.3) %then %do;
%put WARNING: Version 9.3 or later required; %put WARNING: Version 9.3 or later required;
%return; %return;
%end; %end;
/** /**
* Prepare the XML and create the library * Prepare the XML and create the library
*/ */
data _null_; data _null_;
file &frefin; file &frefin;
treeuri=quote(symget('treeuri')); treeuri=quote(symget('treeuri'));
@@ -311,8 +311,8 @@ filename &frefout temp;
/** /**
* Wrap up * Wrap up
*/ */
%if &mdebug ne 1 %then %do; %if &mdebug ne 1 %then %do;
filename &frefin clear; filename &frefin clear;
filename &frefout clear; filename &frefout clear;

View File

@@ -72,10 +72,10 @@
foundation repo then select a different one here foundation repo then select a different one here
@returns outds dataset containing the following columns: @returns outds dataset containing the following columns:
- stpuri - stpuri
- prompturi - prompturi
- fileuri - fileuri
- texturi - texturi
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -83,7 +83,7 @@
**/ **/
%macro mm_createstp( %macro mm_createstp(
stpname=Macro People STP stpname=Macro People STP
,stpdesc=This stp was created automatically by the mm_createstp macro ,stpdesc=This stp was created automatically by the mm_createstp macro
,filename=mm_createstp.sas ,filename=mm_createstp.sas
,directory=SASEnvironment/SASCode ,directory=SASEnvironment/SASCode
@@ -109,8 +109,8 @@
%mp_dropmembers(%scan(&outds,2,.)) %mp_dropmembers(%scan(&outds,2,.))
/** /**
* check tree exists * check tree exists
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
rc=metadata_pathobj("","&tree","Folder",type,uri); rc=metadata_pathobj("","&tree","Folder",type,uri);
@@ -123,8 +123,8 @@ run;
%end; %end;
/** /**
* Check STP does not exist already * Check STP does not exist already
*/ */
%local cmtype; %local cmtype;
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -138,8 +138,8 @@ run;
%end; %end;
/** /**
* Check that the physical file exists * Check that the physical file exists
*/ */
%if %sysfunc(fileexist(&directory/&filename)) ne 1 %then %do; %if %sysfunc(fileexist(&directory/&filename)) ne 1 %then %do;
%put WARNING: FILE *&directory/&filename* NOT FOUND!; %put WARNING: FILE *&directory/&filename* NOT FOUND!;
%return; %return;
@@ -210,7 +210,8 @@ run;
rc3=METADATA_SETATTR(prompturi, 'GroupType','2'); rc3=METADATA_SETATTR(prompturi, 'GroupType','2');
rc4=METADATA_SETATTR(prompturi, 'Name','Parameters'); rc4=METADATA_SETATTR(prompturi, 'Name','Parameters');
rc5=METADATA_SETATTR(prompturi, 'PublicType','Embedded:PromptGroup'); rc5=METADATA_SETATTR(prompturi, 'PublicType','Embedded:PromptGroup');
GroupInfo="<PromptGroup promptId='PromptGroup_%sysfunc(datetime())_&sysprocessid'" GroupInfo=
"<PromptGroup promptId='PromptGroup_%sysfunc(datetime())_&sysprocessid'"
!!" version='1.0'><Label><Text xml:lang='en-GB'>Parameters</Text>" !!" version='1.0'><Label><Text xml:lang='en-GB'>Parameters</Text>"
!!"</Label></PromptGroup>"; !!"</Label></PromptGroup>";
rc6 = METADATA_SETATTR(prompturi, 'GroupInfo',groupinfo); rc6 = METADATA_SETATTR(prompturi, 'GroupInfo',groupinfo);
@@ -315,8 +316,8 @@ run;
%end; %end;
/** /**
* First, create a Hello World type 2 stored process * First, create a Hello World type 2 stored process
*/ */
filename &frefin temp; filename &frefin temp;
data _null_; data _null_;
file &frefin; file &frefin;
@@ -371,8 +372,8 @@ run;
%end; %end;
/** /**
* Next, add the source code * Next, add the source code
*/ */
%mm_updatestpsourcecode(stp=&tree/&stpname %mm_updatestpsourcecode(stp=&tree/&stpname
,stpcode="&directory/&filename" ,stpcode="&directory/&filename"
,frefin=&frefin. ,frefin=&frefin.

View File

@@ -22,7 +22,7 @@ Usage:
%webout(OBJ,example2) * Object format, easier to work with ; %webout(OBJ,example2) * Object format, easier to work with ;
%webout(CLOSE) %webout(CLOSE)
;;;; ;;;;
%mm_createwebservice(path=/Public/app/common,name=appInit,code=ft15f001,replace=YES) %mm_createwebservice(path=/Public/app/common,name=appInit)
<h4> SAS Macros </h4> <h4> SAS Macros </h4>
@li mm_createstp.sas @li mm_createstp.sas
@@ -76,10 +76,10 @@ Usage:
%let path=%substr(&path,1,%length(&path)-1); %let path=%substr(&path,1,%length(&path)-1);
/** /**
* Add webout macro * Add webout macro
* 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 (mm_webout) and run `build.py` * source (mm_webout) and run `build.py`
*/ */
filename sasjs temp; filename sasjs temp;
data _null_; data _null_;
file sasjs lrecl=3000 ; file sasjs lrecl=3000 ;
@@ -119,7 +119,8 @@ data _null_;
put ' %end; '; put ' %end; ';
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 data=sashelp.vcolumn(where=(libname=''WORK'' & memname="%upcase(&ds)")) '; put ' proc sort ';
put ' data=sashelp.vcolumn(where=(libname=''WORK'' & memname="%upcase(&ds)")) ';
put ' out=_data_; '; put ' out=_data_; ';
put ' by varnum; '; put ' by varnum; ';
put ' '; put ' ';
@@ -158,7 +159,8 @@ data _null_;
put ' %end; '; put ' %end; ';
put ' %end; '; put ' %end; ';
put ' run; '; put ' run; ';
put ' /* write to temp loc to avoid _webout truncation - https://support.sas.com/kb/49/325.html */ '; put ' /* write to temp loc to avoid _webout truncation ';
put ' - https://support.sas.com/kb/49/325.html */ ';
put ' filename _sjs temp lrecl=131068 encoding=''utf-8''; '; put ' filename _sjs temp lrecl=131068 encoding=''utf-8''; ';
put ' data _null_; file _sjs lrecl=131068 encoding=''utf-8'' mod; '; put ' data _null_; file _sjs lrecl=131068 encoding=''utf-8'' mod; ';
put ' set &tempds; '; put ' set &tempds; ';

View File

@@ -18,12 +18,12 @@
**/ **/
%macro mm_deletedocument( %macro mm_deletedocument(
target= target=
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
/** /**
* Check document exist * Check document exist
*/ */
%local type; %local type;
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -39,10 +39,10 @@ run;
filename __in temp lrecl=10000; filename __in temp lrecl=10000;
filename __out temp lrecl=10000; filename __out temp lrecl=10000;
data _null_ ; data _null_ ;
file __in ; file __in ;
put "<DeleteMetadata><Metadata><Document Id='&stpuri'/>"; put "<DeleteMetadata><Metadata><Document Id='&stpuri'/>";
put "</Metadata><NS>SAS</NS><Flags>268436480</Flags><Options/>"; put "</Metadata><NS>SAS</NS><Flags>268436480</Flags><Options/>";
put "</DeleteMetadata>"; put "</DeleteMetadata>";
run ; run ;
proc metadata in=__in out=__out verbose;run; proc metadata in=__in out=__out verbose;run;
@@ -53,8 +53,8 @@ filename __in clear;
filename __out clear; filename __out clear;
/** /**
* Check deletion * Check deletion
*/ */
%local isgone; %local isgone;
data _null_; data _null_;
length type uri $256; length type uri $256;

View File

@@ -17,12 +17,12 @@
**/ **/
%macro mm_deletestp( %macro mm_deletestp(
target= target=
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
/** /**
* Check STP does exist * Check STP does exist
*/ */
%local cmtype; %local cmtype;
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -38,10 +38,10 @@ run;
filename __in temp lrecl=10000; filename __in temp lrecl=10000;
filename __out temp lrecl=10000; filename __out temp lrecl=10000;
data _null_ ; data _null_ ;
file __in ; file __in ;
put "<DeleteMetadata><Metadata><ClassifierMap Id='&stpuri'/>"; put "<DeleteMetadata><Metadata><ClassifierMap Id='&stpuri'/>";
put "</Metadata><NS>SAS</NS><Flags>268436480</Flags><Options/>"; put "</Metadata><NS>SAS</NS><Flags>268436480</Flags><Options/>";
put "</DeleteMetadata>"; put "</DeleteMetadata>";
run ; run ;
proc metadata in=__in out=__out verbose;run; proc metadata in=__in out=__out verbose;run;
@@ -52,8 +52,8 @@ filename __in clear;
filename __out clear; filename __out clear;
/** /**
* Check deletion * Check deletion
*/ */
%local isgone; %local isgone;
data _null_; data _null_;
length type uri $256; length type uri $256;

View File

@@ -21,8 +21,8 @@
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
%if %length(&outds)>30 %then %do; %if %length(&outds)>30 %then %do;
%put %str(ERR)OR: Temp tables are created with the &outds prefix, which therefore %put %str(ERR)OR: Temp tables are created with the &outds prefix, which
needs to be 30 characters or less; therefore needs to be 30 characters or less;
%return; %return;
%end; %end;
%if %index(&outds,'.')>0 %then %do; %if %index(&outds,'.')>0 %then %do;
@@ -58,11 +58,11 @@ data _null_;
put str; put str;
if last then do; if last then do;
/* collate attributes */ /* collate attributes */
str=cats("data &outds._logat; set &outds.da1-&outds.da",_n_,";run;"); str=cats("data &outds._logat; set &outds.da1-&outds.da",_n_,";run;");
put str; put str;
/* collate associations */ /* collate associations */
str=cats("data &outds._logas; set &outds.a1-&outds.a",_n_,";run;"); str=cats("data &outds._logas; set &outds.a1-&outds.a",_n_,";run;");
put str; put str;
/* tidy up */ /* tidy up */
str=cats("proc delete data=&outds.da1-&outds.da",_n_,";run;"); str=cats("proc delete data=&outds.da1-&outds.da",_n_,";run;");
put str; put str;

View File

@@ -21,7 +21,7 @@
**/ **/
%macro mm_getcols( %macro mm_getcols(
tableuri= tableuri=
,outds=work.mm_getcols ,outds=work.mm_getcols
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;

View File

@@ -10,9 +10,9 @@
@param mDebug= set to 1 to show debug messages in the log @param mDebug= set to 1 to show debug messages in the log
@returns outds dataset containing the following columns: @returns outds dataset containing the following columns:
- directoryuri - directoryuri
- groupname - groupname
- groupdesc - groupdesc
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -20,7 +20,7 @@
**/ **/
%macro mm_getDirectories( %macro mm_getDirectories(
path= path=
,outds=work.mm_getDirectories ,outds=work.mm_getDirectories
,mDebug=0 ,mDebug=0
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
@@ -39,8 +39,10 @@ data &outds (keep=directoryuri name directoryname directorydesc );
do while do while
(metadata_getnobj("omsobj:Directory?@Id contains '.'",__i,directoryuri)>0); (metadata_getnobj("omsobj:Directory?@Id contains '.'",__i,directoryuri)>0);
%end; %else %do; %end; %else %do;
do while do while(
(metadata_getnobj("omsobj:Directory?@DirectoryName='&path'",__i,directoryuri)>0); metadata_getnobj("omsobj:Directory?@DirectoryName='&path'",__i,directoryuri)
>0
);
%end; %end;
__rc1=metadata_getattr(directoryuri, "Name", name); __rc1=metadata_getattr(directoryuri, "Name", name);
__rc2=metadata_getattr(directoryuri, "DirectoryName", directoryname); __rc2=metadata_getattr(directoryuri, "DirectoryName", directoryname);

View File

@@ -37,8 +37,8 @@
%&mD.put _local_; %&mD.put _local_;
/** /**
* check tree exists * check tree exists
*/ */
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -54,8 +54,8 @@ run;
) )
/** /**
* Check object exists * Check object exists
*/ */
data _null_; data _null_;
length type docuri tsuri tsid $256 ; length type docuri tsuri tsid $256 ;
rc1=metadata_pathobj("","&tree/&name","Note",type,docuri); rc1=metadata_pathobj("","&tree/&name","Note",type,docuri);
@@ -73,14 +73,14 @@ run;
) )
/** /**
* Now we can extract the textstore * Now we can extract the textstore
*/ */
filename __getdoc temp lrecl=10000000; filename __getdoc temp lrecl=10000000;
proc metadata proc metadata
in="<GetMetadata><Reposid>$METAREPOSITORY</Reposid> in="<GetMetadata><Reposid>$METAREPOSITORY</Reposid>
<Metadata><TextStore Id='&tsid'/></Metadata> <Metadata><TextStore Id='&tsid'/></Metadata>
<Ns>SAS</Ns><Flags>1</Flags><Options/></GetMetadata>" <Ns>SAS</Ns><Flags>1</Flags><Options/></GetMetadata>"
out=__getdoc ; out=__getdoc ;
run; run;
/* find the beginning of the text */ /* find the beginning of the text */
@@ -98,47 +98,47 @@ data _null_;
/* read the content, byte by byte, resolving escaped chars */ /* read the content, byte by byte, resolving escaped chars */
filename __outdoc "&outref" lrecl=100000; filename __outdoc "&outref" lrecl=100000;
data _null_; data _null_;
length filein 8 fileid 8; length filein 8 fileid 8;
filein = fopen("__getdoc","I",1,"B"); filein = fopen("__getdoc","I",1,"B");
fileid = fopen("__outdoc","O",1,"B"); fileid = fopen("__outdoc","O",1,"B");
rec = "20"x; rec = "20"x;
length entity $6; length entity $6;
do while(fread(filein)=0); do while(fread(filein)=0);
x+1; x+1;
if x>&start then do; if x>&start then do;
rc = fget(filein,rec,1); rc = fget(filein,rec,1);
if rec='"' then leave; if rec='"' then leave;
else if rec="&" then do; else if rec="&" then do;
entity=rec; entity=rec;
do until (rec=";"); do until (rec=";");
if fread(filein) ne 0 then goto getout; if fread(filein) ne 0 then goto getout;
rc = fget(filein,rec,1); rc = fget(filein,rec,1);
entity=cats(entity,rec); entity=cats(entity,rec);
end;
select (entity);
when ('&amp;' ) rec='&' ;
when ('&lt;' ) rec='<' ;
when ('&gt;' ) rec='>' ;
when ('&apos;') rec="'" ;
when ('&quot;') rec='"' ;
when ('&#x0a;') rec='0A'x;
when ('&#x0d;') rec='0D'x;
when ('&#36;' ) rec='$' ;
when ('&#x09;') rec='09'x;
otherwise putlog "WARNING: missing value for " entity=;
end;
rc =fput(fileid, substr(rec,1,1));
rc =fwrite(fileid);
end; end;
select (entity); else do;
when ('&amp;' ) rec='&' ; rc =fput(fileid,rec);
when ('&lt;' ) rec='<' ; rc =fwrite(fileid);
when ('&gt;' ) rec='>' ;
when ('&apos;') rec="'" ;
when ('&quot;') rec='"' ;
when ('&#x0a;') rec='0A'x;
when ('&#x0d;') rec='0D'x;
when ('&#36;' ) rec='$' ;
when ('&#x09;') rec='09'x;
otherwise putlog "WARNING: missing value for " entity=;
end; end;
rc =fput(fileid, substr(rec,1,1));
rc =fwrite(fileid);
end; end;
else do; end;
rc =fput(fileid,rec); getout:
rc =fwrite(fileid); rc=fclose(filein);
end; rc=fclose(fileid);
end;
end;
getout:
rc=fclose(filein);
rc=fclose(fileid);
run; run;
filename __getdoc clear; filename __getdoc clear;
filename __outdoc clear; filename __outdoc clear;

View File

@@ -11,7 +11,8 @@
%mm_getfoldermembers(root=/User Folders/&sysuserid, outds=usercontent) %mm_getfoldermembers(root=/User Folders/&sysuserid, outds=usercontent)
@param [in] root= the parent folder under which to return all contents @param [in] root= the parent folder under which to return all contents
@param [out] outds= the dataset to create that contains the list of directories @param [out] outds= the dataset to create that contains the list of
directories
@param [in] mDebug= set to 1 to show debug messages in the log @param [in] mDebug= set to 1 to show debug messages in the log
<h4> Data Outputs </h4> <h4> Data Outputs </h4>
@@ -20,11 +21,11 @@
|metauri $17|metaname $256|metatype $32| |metauri $17|metaname $256|metatype $32|
|---|---|---| |---|---|---|
|A5XLSNXI.AA000001|Products |Folder| |A5XLSNXI.AA000001|Products |Folder|
|A5XLSNXI.AA000002|Shared Data |Folder| |A5XLSNXI.AA000002|Shared Data |Folder|
|A5XLSNXI.AA000003|User Folders |Folder| |A5XLSNXI.AA000003|User Folders |Folder|
|A5XLSNXI.AA000004|System |Folder| |A5XLSNXI.AA000004|System |Folder|
|A5XLSNXI.AA00003K|30.SASApps |Folder| |A5XLSNXI.AA00003K|30.SASApps |Folder|
|A5XLSNXI.AA00006A|Public|Folder| |A5XLSNXI.AA00006A|Public|Folder|
<h4> SAS Macros </h4> <h4> SAS Macros </h4>
@@ -37,7 +38,7 @@
**/ **/
%macro mm_getfoldermembers( %macro mm_getfoldermembers(
root= root=
,outds=work.mm_getfoldertree ,outds=work.mm_getfoldertree
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;

View File

@@ -13,7 +13,8 @@
options notes source; options notes source;
@param [in] root= the parent folder under which to return all contents @param [in] root= the parent folder under which to return all contents
@param [out] outds= the dataset to create that contains the list of directories @param [out] outds= the dataset to create that contains the list of
directories
@param [in] mDebug= set to 1 to show debug messages in the log @param [in] mDebug= set to 1 to show debug messages in the log
<h4> SAS Macros </h4> <h4> SAS Macros </h4>
@@ -23,7 +24,7 @@
**/ **/
%macro mm_getfoldertree( %macro mm_getfoldertree(
root= root=
,outds=work.mm_getfoldertree ,outds=work.mm_getfoldertree
,mDebug=0 ,mDebug=0
,depth=50 /* how many nested folders to query */ ,depth=50 /* how many nested folders to query */

View File

@@ -2,11 +2,11 @@
@file @file
@brief Creates dataset with all members of a metadata group @brief Creates dataset with all members of a metadata group
@details @details
usage: usage:
%mm_getgroupmembers(someGroupName %mm_getgroupmembers(someGroupName
,outds=work.mm_getgroupmembers ,outds=work.mm_getgroupmembers
,emails=YES) ,emails=YES)
@param group metadata group for which to bring back members @param group metadata group for which to bring back members

View File

@@ -11,14 +11,15 @@
@param [in] user= the metadata user to return groups for. Leave blank for all @param [in] user= the metadata user to return groups for. Leave blank for all
groups. groups.
@param [in] repo= the metadata repository that contains the user/group information @param [in] repo= the metadata repository that contains the user/group
information
@param [in] mDebug= set to 1 to show debug messages in the log @param [in] mDebug= set to 1 to show debug messages in the log
@param [out] outds= the dataset to create that contains the list of groups @param [out] outds= the dataset to create that contains the list of groups
@returns outds dataset containing all groups in a column named "metagroup" @returns outds dataset containing all groups in a column named "metagroup"
- groupuri - groupuri
- groupname - groupname
- groupdesc - groupdesc
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -26,7 +27,7 @@
**/ **/
%macro mm_getGroups( %macro mm_getGroups(
user= user=
,outds=work.mm_getGroups ,outds=work.mm_getGroups
,repo=foundation ,repo=foundation
,mDebug=0 ,mDebug=0
@@ -39,7 +40,8 @@
%&mD.put Executing mm_getGroups.sas; %&mD.put Executing mm_getGroups.sas;
%&mD.put _local_; %&mD.put _local_;
/* on some sites, user / group info is in a different metadata repo to the default */ /* on some sites, user / group info is in a different metadata repo to the
default */
%if &oldrepo ne &repo %then %do; %if &oldrepo ne &repo %then %do;
options metarepository=&repo; options metarepository=&repo;
%end; %end;

View File

@@ -46,7 +46,7 @@ run;
filename response temp; filename response temp;
/* get list of libraries */ /* get list of libraries */
proc metadata in= proc metadata in=
'<GetMetadataObjects> '<GetMetadataObjects>
<Reposid>$METAREPOSITORY</Reposid> <Reposid>$METAREPOSITORY</Reposid>
<Type>SASLibrary</Type> <Type>SASLibrary</Type>
<Objects/> <Objects/>

View File

@@ -28,10 +28,10 @@
filename response temp; filename response temp;
/* get list of libraries */ /* get list of libraries */
proc metadata in= proc metadata in=
"<GetMetadataObjects><Reposid>$METAREPOSITORY</Reposid> "<GetMetadataObjects><Reposid>$METAREPOSITORY</Reposid>
<Type>&type</Type><Objects/><NS>SAS</NS> <Type>&type</Type><Objects/><NS>SAS</NS>
<Flags>0</Flags><Options/></GetMetadataObjects>" <Flags>0</Flags><Options/></GetMetadataObjects>"
out=response; out=response;
run; run;
/* write the response to the log for debugging */ /* write the response to the log for debugging */
@@ -46,7 +46,8 @@ filename sxlemap temp;
data _null_; data _null_;
file sxlemap; file sxlemap;
put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">'; put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">';
put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/&type</TABLE-PATH>"; put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/&type";
put "</TABLE-PATH>";
put '<COLUMN name="id">'; put '<COLUMN name="id">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/&type/@Id</PATH>"; put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/&type/@Id</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>";

View File

@@ -1,8 +1,9 @@
/** /**
@file mm_getpublictypes.sas @file mm_getpublictypes.sas
@brief Creates a dataset with all deployable public types @brief Creates a dataset with all deployable public types
@details More info: https://support.sas.com/documentation/cdl/en/bisag/65422/HTML/default/viewer.htm#n1nkrdzsq5iunln18bk2236istkb.htm @details More info:
https://support.sas.com/documentation/cdl/en/bisag/65422/HTML/default/viewer.htm#n1nkrdzsq5iunln18bk2236istkb.htm
Usage: Usage:
* dataset will contain one column - publictype ($64); * dataset will contain one column - publictype ($64);

View File

@@ -26,8 +26,8 @@
filename response temp; filename response temp;
/* get list of libraries */ /* get list of libraries */
proc metadata in= proc metadata in=
"<GetRepositories><Repositories/><Flags>1</Flags><Options/></GetRepositories>" "<GetRepositories><Repositories/><Flags>1</Flags><Options/></GetRepositories>"
out=response; out=response;
run; run;
/* write the response to the log for debugging */ /* write the response to the log for debugging */
@@ -44,61 +44,76 @@ filename sxlemap temp;
data _null_; data _null_;
file sxlemap; file sxlemap;
put '<SXLEMAP version="1.2" name="SASRepos"><TABLE name="SASRepos">'; put '<SXLEMAP version="1.2" name="SASRepos"><TABLE name="SASRepos">';
put "<TABLE-PATH syntax='XPath'>/GetRepositories/Repositories/Repository</TABLE-PATH>"; put "<TABLE-PATH syntax='XPath'>/GetRepositories/Repositories/Repository";
put "</TABLE-PATH>";
put '<COLUMN name="id">'; put '<COLUMN name="id">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Id</PATH>"; put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Id";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="name">'; put '<COLUMN name="name">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Name</PATH>"; put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Name";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="desc">'; put '<COLUMN name="desc">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Desc</PATH>"; put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Desc";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="DefaultNS">'; put '<COLUMN name="DefaultNS">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@DefaultNS</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@DefaultNS</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>200</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="RepositoryType">'; put '<COLUMN name="RepositoryType">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@RepositoryType</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@RepositoryType</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>20</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>20</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="RepositoryFormat">'; put '<COLUMN name="RepositoryFormat">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@RepositoryFormat</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@RepositoryFormat</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>10</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>10</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="Access">'; put '<COLUMN name="Access">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Access</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@Access</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>16</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>16</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="CurrentAccess">'; put '<COLUMN name="CurrentAccess">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@CurrentAccess</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@CurrentAccess</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>16</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>16</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="PauseState">'; put '<COLUMN name="PauseState">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@PauseState</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@PauseState</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>16</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>16</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="Path">'; put '<COLUMN name="Path">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Path</PATH>"; put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Path";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>256</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>256</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="Engine">'; put '<COLUMN name="Engine">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Engine</PATH>"; put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Engine";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>8</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>8</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="Options">'; put '<COLUMN name="Options">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Options</PATH>"; put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@Options";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="MetadataCreated">'; put '<COLUMN name="MetadataCreated">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@MetadataCreated</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@MetadataCreated</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>24</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>24</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '<COLUMN name="MetadataUpdated">'; put '<COLUMN name="MetadataUpdated">';
put "<PATH syntax='XPath'>/GetRepositories/Repositories/Repository/@MetadataUpdated</PATH>"; put "<PATH syntax='XPath'>";
put "/GetRepositories/Repositories/Repository/@MetadataUpdated</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>24</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>24</LENGTH>";
put '</COLUMN>'; put '</COLUMN>';
put '</TABLE></SXLEMAP>'; put '</TABLE></SXLEMAP>';

View File

@@ -31,28 +31,32 @@
filename response temp; filename response temp;
options noquotelenmax; options noquotelenmax;
proc metadata in= '<GetMetadataObjects><Reposid>$METAREPOSITORY</Reposid> proc metadata in= '<GetMetadataObjects><Reposid>$METAREPOSITORY</Reposid>
<Type>IdentityGroup</Type><NS>SAS</NS><Flags>388</Flags> <Type>IdentityGroup</Type><NS>SAS</NS><Flags>388</Flags>
<Options> <Options>
<Templates><IdentityGroup Name="" Desc="" PublicType=""/></Templates> <Templates><IdentityGroup Name="" Desc="" PublicType=""/></Templates>
<XMLSelect search="@PublicType=''Role''"/> <XMLSelect search="@PublicType=''Role''"/>
</Options> </Options>
</GetMetadataObjects>' </GetMetadataObjects>'
out=response; out=response;
run; run;
filename sxlemap temp; filename sxlemap temp;
data _null_; data _null_;
file sxlemap; file sxlemap;
put '<SXLEMAP version="1.2" name="roles"><TABLE name="roles">'; put '<SXLEMAP version="1.2" name="roles"><TABLE name="roles">';
put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup</TABLE-PATH>"; put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup";
put "</TABLE-PATH>";
put '<COLUMN name="roleuri">'; put '<COLUMN name="roleuri">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup/@Id</PATH>"; put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup/@Id";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>";
put '</COLUMN><COLUMN name="rolename">'; put '</COLUMN><COLUMN name="rolename">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup/@Name</PATH>"; put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup/@Name";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>256</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>256</LENGTH>";
put '</COLUMN><COLUMN name="roledesc">'; put '</COLUMN><COLUMN name="roledesc">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup/@Desc</PATH>"; put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/IdentityGroup/@Desc";
put "</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>500</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>500</LENGTH>";
put '</COLUMN></TABLE></SXLEMAP>'; put '</COLUMN></TABLE></SXLEMAP>';
run; run;

View File

@@ -69,14 +69,14 @@ run;
/** /**
* Now we can extract the textstore * Now we can extract the textstore
*/ */
filename __getdoc temp lrecl=10000000; filename __getdoc temp lrecl=10000000;
proc metadata proc metadata
in="<GetMetadata><Reposid>$METAREPOSITORY</Reposid> in="<GetMetadata><Reposid>$METAREPOSITORY</Reposid>
<Metadata><TextStore Id='&tsuri'/></Metadata> <Metadata><TextStore Id='&tsuri'/></Metadata>
<Ns>SAS</Ns><Flags>1</Flags><Options/></GetMetadata>" <Ns>SAS</Ns><Flags>1</Flags><Options/></GetMetadata>"
out=__getdoc ; out=__getdoc ;
run; run;
/* find the beginning of the text */ /* find the beginning of the text */
@@ -97,47 +97,47 @@ data _null_;
/* read the content, byte by byte, resolving escaped chars */ /* read the content, byte by byte, resolving escaped chars */
filename __outdoc &outeng lrecl=100000; filename __outdoc &outeng lrecl=100000;
data _null_; data _null_;
length filein 8 fileid 8; length filein 8 fileid 8;
filein = fopen("__getdoc","I",1,"B"); filein = fopen("__getdoc","I",1,"B");
fileid = fopen("__outdoc","O",1,"B"); fileid = fopen("__outdoc","O",1,"B");
rec = "20"x; rec = "20"x;
length entity $6; length entity $6;
do while(fread(filein)=0); do while(fread(filein)=0);
x+1; x+1;
if x>&start then do; if x>&start then do;
rc = fget(filein,rec,1); rc = fget(filein,rec,1);
if rec='"' then leave; if rec='"' then leave;
else if rec="&" then do; else if rec="&" then do;
entity=rec; entity=rec;
do until (rec=";"); do until (rec=";");
if fread(filein) ne 0 then goto getout; if fread(filein) ne 0 then goto getout;
rc = fget(filein,rec,1); rc = fget(filein,rec,1);
entity=cats(entity,rec); entity=cats(entity,rec);
end;
select (entity);
when ('&amp;' ) rec='&' ;
when ('&lt;' ) rec='<' ;
when ('&gt;' ) rec='>' ;
when ('&apos;') rec="'" ;
when ('&quot;') rec='"' ;
when ('&#x0a;') rec='0A'x;
when ('&#x0d;') rec='0D'x;
when ('&#36;' ) rec='$' ;
when ('&#x09;') rec='09'x;
otherwise putlog "%str(WARN)ING: missing value for " entity=;
end;
rc =fput(fileid, substr(rec,1,1));
rc =fwrite(fileid);
end; end;
select (entity); else do;
when ('&amp;' ) rec='&' ; rc =fput(fileid,rec);
when ('&lt;' ) rec='<' ; rc =fwrite(fileid);
when ('&gt;' ) rec='>' ;
when ('&apos;') rec="'" ;
when ('&quot;') rec='"' ;
when ('&#x0a;') rec='0A'x;
when ('&#x0d;') rec='0D'x;
when ('&#36;' ) rec='$' ;
when ('&#x09;') rec='09'x;
otherwise putlog "%str(WARN)ING: missing value for " entity=;
end; end;
rc =fput(fileid, substr(rec,1,1));
rc =fwrite(fileid);
end; end;
else do; end;
rc =fput(fileid,rec); getout:
rc =fwrite(fileid); rc=fclose(filein);
end; rc=fclose(fileid);
end;
end;
getout:
rc=fclose(filein);
rc=fclose(fileid);
run; run;
%if &outeng=TEMP %then %do; %if &outeng=TEMP %then %do;

View File

@@ -23,16 +23,17 @@
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
@param showDesc= provide a non blank value to return stored process descriptions @param showDesc= provide a non blank value to return stored process
@param showUsageVersion= provide a non blank value to return the UsageVersion. This descriptions
is either 1000000 (type 1, 9.2) or 2000000 (type2, 9.3 onwards). @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).
@returns outds dataset containing the following columns @returns outds dataset containing the following columns
- stpuri - stpuri
- stpname - stpname
- treeuri - treeuri
- stpdesc (if requested) - stpdesc (if requested)
- usageversion (if requested) - usageversion (if requested)
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -40,7 +41,7 @@
**/ **/
%macro mm_getstps( %macro mm_getstps(
tree= tree=
,name= ,name=
,outds=work.mm_getstps ,outds=work.mm_getstps
,mDebug=0 ,mDebug=0

View File

@@ -1,7 +1,7 @@
/** /**
@file mm_gettableid.sas @file mm_gettableid.sas
@brief Get the metadata id for a particular table @brief Get the metadata id for a particular table
@details Provide a libref and table name to return the corresponding metadata id @details Provide a libref and table name to return the corresponding metadata
in an output datataset. in an output datataset.
Usage: Usage:
@@ -22,7 +22,7 @@
**/ **/
%macro mm_gettableid( %macro mm_gettableid(
libref= libref=
,ds= ,ds=
,outds=work.mm_gettableid ,outds=work.mm_gettableid
,mDebug=0 ,mDebug=0
@@ -52,7 +52,7 @@ data &outds;
if type='DatabaseSchema' then tmpuri=usingpkguri; if type='DatabaseSchema' then tmpuri=usingpkguri;
else tmpuri=uri; else tmpuri=uri;
t=1; t=1;
do while(metadata_getnasn(tmpuri, "Tables", t, tableuri)>0); do while(metadata_getnasn(tmpuri, "Tables", t, tableuri)>0);
t+1; t+1;

View File

@@ -16,8 +16,8 @@
@param mDebug= set to 1 to show debug messages in the log @param mDebug= set to 1 to show debug messages in the log
@returns outds dataset containing the following columns: @returns outds dataset containing the following columns:
- treeuri - treeuri
- treepath - treepath
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@@ -25,7 +25,7 @@
**/ **/
%macro mm_getTree( %macro mm_getTree(
tree= tree=
,inds= ,inds=
,outds=work.mm_getTree ,outds=work.mm_getTree
,mDebug=0 ,mDebug=0

View File

@@ -26,16 +26,16 @@
filename response temp; filename response temp;
/* get list of libraries */ /* get list of libraries */
proc metadata in= proc metadata in=
'<GetTypes> '<GetTypes>
<Types/> <Types/>
<NS>SAS</NS> <NS>SAS</NS>
<!-- specify the OMI_SUCCINCT flag --> <!-- specify the OMI_SUCCINCT flag -->
<Flags>2048</Flags> <Flags>2048</Flags>
<Options> <Options>
<!-- include <REPOSID> XML element and a repository identifier --> <!-- include <REPOSID> XML element and a repository identifier -->
<Reposid>$METAREPOSITORY</Reposid> <Reposid>$METAREPOSITORY</Reposid>
</Options> </Options>
</GetTypes>' </GetTypes>'
out=response; out=response;
run; run;

View File

@@ -31,16 +31,16 @@
filename response temp; filename response temp;
proc metadata in= '<GetMetadataObjects> proc metadata in= '<GetMetadataObjects>
<Reposid>$METAREPOSITORY</Reposid> <Reposid>$METAREPOSITORY</Reposid>
<Type>Person</Type> <Type>Person</Type>
<NS>SAS</NS> <NS>SAS</NS>
<Flags>0</Flags> <Flags>0</Flags>
<Options> <Options>
<Templates> <Templates>
<Person Name=""/> <Person Name=""/>
</Templates> </Templates>
</Options> </Options>
</GetMetadataObjects>' </GetMetadataObjects>'
out=response; out=response;
run; run;
@@ -48,7 +48,8 @@ filename sxlemap temp;
data _null_; data _null_;
file sxlemap; file sxlemap;
put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">'; put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">';
put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/Person</TABLE-PATH>"; put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/Person";
put "</TABLE-PATH>";
put '<COLUMN name="uri">'; put '<COLUMN name="uri">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Person/@Id</PATH>"; put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Person/@Id</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>32</LENGTH>";

View File

@@ -33,23 +33,23 @@ filename __in temp lrecl=10000;
filename __out temp lrecl=10000; filename __out temp lrecl=10000;
filename __shake temp lrecl=10000; filename __shake temp lrecl=10000;
data _null_ ; data _null_ ;
file __in ; file __in ;
put '<GetMetadataObjects>' ; put '<GetMetadataObjects>' ;
put '<Reposid>$METAREPOSITORY</Reposid>' ; put '<Reposid>$METAREPOSITORY</Reposid>' ;
put '<Type>TextStore</Type>' ; put '<Type>TextStore</Type>' ;
put '<NS>SAS</NS>' ; put '<NS>SAS</NS>' ;
put '<Flags>388</Flags>' ; put '<Flags>388</Flags>' ;
put '<Options>' ; put '<Options>' ;
put '<XMLSelect search="TextStore[@Name='@@; put '<XMLSelect search="TextStore[@Name='@@;
put "'Public Configuration Properties']" @@; put "'Public Configuration Properties']" @@;
put '[Objects/SoftwareComponent[@ClassIdentifier=''webappsrv'']]' ; put '[Objects/SoftwareComponent[@ClassIdentifier=''webappsrv'']]' ;
put '"/>'; put '"/>';
put '<Templates>' ; put '<Templates>' ;
put '<TextStore StoredText="">' ; put '<TextStore StoredText="">' ;
put '</TextStore>' ; put '</TextStore>' ;
put '</Templates>' ; put '</Templates>' ;
put '</Options>' ; put '</Options>' ;
put '</GetMetadataObjects>' ; put '</GetMetadataObjects>' ;
run ; run ;
proc metadata in=__in out=__out verbose;run; proc metadata in=__in out=__out verbose;run;

View File

@@ -1,7 +1,7 @@
/** /**
@file mm_spkexport.sas @file mm_spkexport.sas
@brief Creates an batch spk export command @brief Creates an batch spk export command
@details Creates a script that will export everything in a metadata folder to @details Creates a script that will export everything in a metadata folder to
a specified location. a specified location.
If you have XCMD enabled, then you can use mmx_spkexport (which performs If you have XCMD enabled, then you can use mmx_spkexport (which performs
the actual export) the actual export)
@@ -12,7 +12,8 @@
Usage: Usage:
%* import the macros (or make them available some other way); %* import the macros (or make them available some other way);
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;
%* create sample text file as input to the macro; %* create sample text file as input to the macro;
@@ -34,7 +35,7 @@
filename myref "/tmp/mmscript.sh"; filename myref "/tmp/mmscript.sh";
%mm_spkexport(metaloc=%str(/my/meta/loc) %mm_spkexport(metaloc=%str(/my/meta/loc)
outref=myref outref=myref
,cmdoutloc=%str(/tmp) ,cmdoutloc=%str(/tmp)
,cmdoutname=mmx ,cmdoutname=mmx
) )
@@ -56,9 +57,9 @@
@param secureref= fileref containing the username / password (should point to @param secureref= fileref containing the username / password (should point to
a file in a secure location). Leave blank to substitute $bash type vars. a file in a secure location). Leave blank to substitute $bash type vars.
@param outref= fileref to which to write the command @param outref= fileref to which to write the command
@param cmdoutloc= the directory to which the command will write the SPK @param cmdoutloc= the directory to which the command will write the SPK
(default=WORK) (default=WORK)
@param cmdoutname= the name of the spk / log files to create (will be @param cmdoutname= the name of the spk / log files to create (will be
identical just with .spk or .log extension) identical just with .spk or .log extension)
@version 9.4 @version 9.4
@@ -92,7 +93,8 @@
%let port=%sysfunc(getoption(metaport)); %let port=%sysfunc(getoption(metaport));
%let platform_object_path=%mf_loc(POF); %let platform_object_path=%mf_loc(POF);
%let connx_string=%str(-host &host -port &port -user &mmxuser -password &mmxpass); %let connx_string=%str(-host &host -port &port -user &mmxuser %trim(
)-password &mmxpass);
%mm_tree(root=%str(&metaloc) ,types=EXPORTABLE ,outds=exportable) %mm_tree(root=%str(&metaloc) ,types=EXPORTABLE ,outds=exportable)

View File

@@ -15,7 +15,8 @@
Usage: Usage:
%* load macros; %* load 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;
%* export everything; %* export everything;
@@ -32,16 +33,16 @@
%* with specific types; %* with specific types;
%mm_tree(root=%str(/my/folder) %mm_tree(root=%str(/my/folder)
,types= ,types=
DeployedJob DeployedJob
ExternalFile ExternalFile
Folder Folder
Folder.SecuredData Folder.SecuredData
GeneratedTransform GeneratedTransform
InformationMap.Relational InformationMap.Relational
Job Job
Library Library
Prompt Prompt
StoredProcess StoredProcess
Table Table
,outds=morestuff) ,outds=morestuff)
@@ -53,8 +54,8 @@
@param root= the parent folder under which to return all contents @param root= the parent folder under which to return all contents
@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 types= Space-seperated, unquoted list of types for filtering the @param types= Space-seperated, unquoted list of types for filtering the
output. Special types: output. Special types:
* ALl - return all types (the default) * ALl - return all types (the default)
* EXPORTABLE - return only the content types that can be exported in an SPK * EXPORTABLE - return only the content types that can be exported in an SPK
@@ -64,7 +65,7 @@
**/ **/
%macro mm_tree( %macro mm_tree(
root= root=
,types=ALL ,types=ALL
,outds=work.mm_tree ,outds=work.mm_tree
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
@@ -84,12 +85,12 @@ options noquotelenmax;
filename response temp; filename response temp;
/* get list of libraries */ /* get list of libraries */
proc metadata in= proc metadata in=
'<GetMetadataObjects><Reposid>$METAREPOSITORY</Reposid> '<GetMetadataObjects><Reposid>$METAREPOSITORY</Reposid>
<Type>Tree</Type><Objects/><NS>SAS</NS> <Type>Tree</Type><Objects/><NS>SAS</NS>
<Flags>384</Flags> <Flags>384</Flags>
<XMLSelect search="*[@TreeType=&apos;BIP Folder&apos;]"/> <XMLSelect search="*[@TreeType=&apos;BIP Folder&apos;]"/>
<Options/></GetMetadataObjects>' <Options/></GetMetadataObjects>'
out=response; out=response;
run; run;
/* /*
data _null_; data _null_;
@@ -104,7 +105,8 @@ filename sxlemap temp;
data _null_; data _null_;
file sxlemap; file sxlemap;
put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">'; put '<SXLEMAP version="1.2" name="SASObjects"><TABLE name="SASObjects">';
put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/Tree</TABLE-PATH>"; put "<TABLE-PATH syntax='XPath'>/GetMetadataObjects/Objects/Tree";
put "</TABLE-PATH>";
put '<COLUMN name="pathuri">'; put '<COLUMN name="pathuri">';
put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Tree/@Id</PATH>"; put "<PATH syntax='XPath'>/GetMetadataObjects/Objects/Tree/@Id</PATH>";
put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>64</LENGTH>"; put "<TYPE>character</TYPE><DATATYPE>string</DATATYPE><LENGTH>64</LENGTH>";
@@ -130,7 +132,7 @@ data &outds;
path=cats('/',pname,path); path=cats('/',pname,path);
tmpuri=parenturi; tmpuri=parenturi;
end; end;
if path=:"&root"; if path=:"&root";
%if "&types"="ALL" or ("&types" ne "ALL" and "&types" ne "Folder") %then %do; %if "&types"="ALL" or ("&types" ne "ALL" and "&types" ne "Folder") %then %do;

View File

@@ -10,8 +10,8 @@
@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
type required Stored Process type required
@version 9.4 @version 9.4
@author Allan Bowe @author Allan Bowe
@@ -24,8 +24,8 @@
)/*/STORE SOURCE*/; )/*/STORE SOURCE*/;
/** /**
* Check STP does exist * Check STP does exist
*/ */
%local cmtype; %local cmtype;
data _null_; data _null_;
length type uri $256; length type uri $256;
@@ -51,7 +51,8 @@ data _null_;
n+1; n+1;
rc=metadata_getattr(uri,"Name",name); rc=metadata_getattr(uri,"Name",name);
if name='Stored Process' then do; if name='Stored Process' then do;
rc = METADATA_SETATTR(uri,'StoredText','<?xml version="1.0" encoding="UTF-8"?>' rc = METADATA_SETATTR(uri,'StoredText'
,'<?xml version="1.0" encoding="UTF-8"?>'
!!'<StoredProcess><ServerContext LogicalServerType="'!!"&newtype" !!'<StoredProcess><ServerContext LogicalServerType="'!!"&newtype"
!!'" OtherAllowed="false"/><ResultCapabilities Package="false" ' !!'" OtherAllowed="false"/><ResultCapabilities Package="false" '
!!' Streaming="true"/><OutputParameters/></StoredProcess>'); !!' Streaming="true"/><OutputParameters/></StoredProcess>');

View File

@@ -33,7 +33,7 @@
**/ **/
%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); %macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y);
%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug %global _webin_file_count _webin_fileref1 _webin_name1 _program _debug
sasjs_tables; sasjs_tables;
%local i tempds; %local i tempds;
@@ -108,7 +108,7 @@
i+1; i+1;
call symputx('wt'!!left(i),name,'l'); call symputx('wt'!!left(i),name,'l');
call symputx('wtcnt',i,'l'); call symputx('wtcnt',i,'l');
data _null_; file &fref encoding='utf-8'; data _null_; file &fref encoding='utf-8';
put ",""WORK"":{"; put ",""WORK"":{";
%do i=1 %to &wtcnt; %do i=1 %to &wtcnt;
%let wt=&&wt&i; %let wt=&&wt&i;

View File

@@ -20,7 +20,8 @@ Usage:
run; run;
filename outref "%sysfunc(pathname(work))"; filename outref "%sysfunc(pathname(work))";
%mmx_spkexport(metaloc=%str(/30.Projects/3001.Internal/300115.DataController/dc1) %mmx_spkexport(
metaloc=%str(/30.Projects/3001.Internal/300115.DataController/dc1)
,secureref=tmp ,secureref=tmp
,outspkpath=%str(/tmp) ,outspkpath=%str(/tmp)
) )
@@ -34,7 +35,7 @@ Usage:
@param metaloc= the metadata folder to export @param metaloc= the metadata folder to export
@param secureref= fileref containing the username / password (should point to @param secureref= fileref containing the username / password (should point to
a file in a secure location) a file in a secure location)
@param outspkname= name of the spk to be created (default is mmxport). @param outspkname= name of the spk to be created (default is mmxport).
@param outspkpath= directory in which to create the SPK. Default is WORK. @param outspkpath= directory in which to create the SPK. Default is WORK.
@version 9.4 @version 9.4
@@ -56,7 +57,8 @@ Usage:
/* get creds */ /* get creds */
%inc &secureref/nosource; %inc &secureref/nosource;
%let connx_string=%str(-host &host -port &port -user '&mmxuser' -password '&mmxpass'); %let connx_string=
%str(-host &host -port &port -user '&mmxuser' -password '&mmxpass');
%mm_tree(root=%str(&metaloc) ,types=EXPORTABLE ,outds=exportable) %mm_tree(root=%str(&metaloc) ,types=EXPORTABLE ,outds=exportable)

View File

@@ -1,5 +1,5 @@
#projectlogo img #projectlogo img
{ {
border: 0px none; border: 0px none;
max-height:70px max-height:70px
} }

View File

@@ -258,7 +258,8 @@ data _null_;
put ' %end; '; put ' %end; ';
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 data=sashelp.vcolumn(where=(libname=''WORK'' & memname="%upcase(&ds)")) '; put ' proc sort ';
put ' data=sashelp.vcolumn(where=(libname=''WORK'' & memname="%upcase(&ds)")) ';
put ' out=_data_; '; put ' out=_data_; ';
put ' by varnum; '; put ' by varnum; ';
put ' '; put ' ';
@@ -297,7 +298,8 @@ data _null_;
put ' %end; '; put ' %end; ';
put ' %end; '; put ' %end; ';
put ' run; '; put ' run; ';
put ' /* write to temp loc to avoid _webout truncation - https://support.sas.com/kb/49/325.html */ '; put ' /* write to temp loc to avoid _webout truncation ';
put ' - https://support.sas.com/kb/49/325.html */ ';
put ' filename _sjs temp lrecl=131068 encoding=''utf-8''; '; put ' filename _sjs temp lrecl=131068 encoding=''utf-8''; ';
put ' data _null_; file _sjs lrecl=131068 encoding=''utf-8'' mod; '; put ' data _null_; file _sjs lrecl=131068 encoding=''utf-8'' mod; ';
put ' set &tempds; '; put ' set &tempds; ';
@@ -412,7 +414,8 @@ data _null_;
put ' if _n_=1 then call symputx(''input_statement'',_infile_); '; put ' if _n_=1 then call symputx(''input_statement'',_infile_); ';
put ' list; '; put ' list; ';
put ' data &table; '; put ' data &table; ';
put ' infile "%sysfunc(pathname(work))/&table..csv" firstobs=2 dsd termstr=crlf; '; put ' infile "%sysfunc(pathname(work))/&table..csv" firstobs=2 dsd ';
put ' termstr=crlf; ';
put ' input &input_statement; '; put ' input &input_statement; ';
put ' run; '; put ' run; ';
put ' %end; '; put ' %end; ';
@@ -444,7 +447,7 @@ data _null_;
put ' /* setup webout */ '; put ' /* setup webout */ ';
put ' OPTIONS NOBOMFILE; '; put ' OPTIONS NOBOMFILE; ';
put ' %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; '; put ' %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; ';
put ' filename _webout temp lrecl=999999 mod; '; put ' filename _webout temp lrecl=999999 mod; ';
put ' %end; '; put ' %end; ';
put ' %else %do; '; put ' %else %do; ';
put ' filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" '; put ' filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" ';
@@ -453,7 +456,8 @@ data _null_;
put ' '; put ' ';
put ' /* setup temp ref */ '; put ' /* setup temp ref */ ';
put ' %if %upcase(&fref) ne _WEBOUT %then %do; '; put ' %if %upcase(&fref) ne _WEBOUT %then %do; ';
put ' filename &fref temp lrecl=999999 permission=''A::u::rwx,A::g::rw-,A::o::---'' mod; '; put ' filename &fref temp lrecl=999999 permission=''A::u::rwx,A::g::rw-,A::o::---'' ';
put ' mod; ';
put ' %end; '; put ' %end; ';
put ' '; put ' ';
put ' /* setup json */ '; put ' /* setup json */ ';