diff --git a/all.sas b/all.sas index b3eda7c..c6fbf44 100644 --- a/all.sas +++ b/all.sas @@ -79,7 +79,7 @@ options noquotelenmax; Run without arguments to see a list of detectable features. Note - this list is based on known versions of SAS rather than actual feature detection, as that is tricky / impossible to do - without generating errors in most cases. + without generating errs in most cases. %put %mf_existfeature(PROCLUA); @@ -362,7 +362,7 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex @param attr full list in [documentation]( https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000147794.htm) @return output returns result of the attrc value supplied, or -1 and log - message if error. + message if err. @version 9.2 @author Allan Bowe @@ -395,7 +395,7 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex @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) @return output returns result of the attrn value supplied, or -1 and log - message if error. + message if err. @version 9.2 @author Allan Bowe @@ -1421,7 +1421,7 @@ Usage: %end; /* - Now create the directory. Complain loudly of any errors. + Now create the directory. Complain loudly of any errs. */ %let dname = %sysfunc(dcreate(&child, &parent)); @@ -1468,7 +1468,7 @@ Usage: @param libds library.dataset @return output returns result of the attrn value supplied, or log message - if error. + if err. @version 9.2 @@ -2791,6 +2791,8 @@ run; /* create folders and copy content */ data _null_; set work.&tempds; + length msg $256; + call missing(msg); if _n_ = 1 then dpos+sum(length(directory),2); filepath2="&target/"!!substr(filepath,dpos); if file_or_folder='folder' then call execute('%mf_mkdir('!!filepath2!!')'); @@ -2799,9 +2801,9 @@ run; rc1=filename(fref1,filepath,'disk','recfm=n'); rc2=filename(fref2,filepath2,'disk','recfm=n'); if fcopy(fref1,fref2) ne 0 then do; - sysmsg=sysmsg(); + msg=sysmsg(); putlog "%str(ERR)OR: Unable to copy " filepath " to " filepath2; - putlog sysmg=; + putlog msg=; end; end; rc=filename(fref1); @@ -3876,17 +3878,23 @@ run; %mend mp_ds2csv;/** @file - @brief Converts every value in a dataset to it's formatted value + @brief Converts every value in a dataset to formatted value @details Converts every value to it's formatted value. All variables will - become character, and will be in the same order. + become character, and will be in the same order as the original dataset. + + Lengths will be adjusted according to the format lengths, where applicable. Usage: %mp_ds2fmtds(sashelp.cars,work.cars) + %mp_ds2fmtds(sashelp.vallopt,vw_vallopt) @param [in] libds The library.dataset to be converted @param [out] outds The dataset to create. +

SAS Macros

+ @li mf_existds.sas +

Related Macros

@li mp_jsonout.sas @@ -3898,8 +3906,9 @@ run; )/*/STORE SOURCE*/; /* validations */ -%if not %sysfunc(exist(&libds)) %then %do; - %put %str(WARN)ING: &libds does not exist; + +%if not %mf_existds(libds=&libds) %then %do; + %put %str(WARN)ING: &libds does not exist as either a VIEW or DATASET; %return; %end; %if %index(&libds,.)=0 %then %let libds=WORK.&libds; @@ -4089,6 +4098,7 @@ data _null_; if _n_>&maxobs then stop; %end; length _____str $32767; + call missing(_____str); format _numeric_ best.; format _character_ ; %local i comma var vtype vfmt; @@ -4489,8 +4499,8 @@ filename &outref temp; @param [in] targetds The target dataset against which to verify the query @param [out] abort= (YES) If YES will call mp_abort.sas on any exceptions @param [out] outds= (work.mp_filtervalidate) Output dataset containing the - error / warning message, if one exists. If this table contains any rows, - there are problems! + err / warning message, if one exists. If this table contains any rows, + there are problems!

SAS Macros

@li mf_getuniquefileref.sas @@ -4674,17 +4684,17 @@ run; %let vw=%mf_getuniquename(prefix=mp_getconstraints_vw_); data &vw /view=&vw; set sashelp.vcncolu; - where TABLE_CATALOG="&lib"; + where table_catalog="&lib"; /* use retain approach to reset the constraint order with each constraint */ length tmp $1000; retain tmp; drop tmp; - if tmp ne catx('|',libref,table_name,constraint_type,constraint_name) then do; + if tmp ne catx('|',table_catalog,table_name,constraint_name) then do; constraint_order=1; end; else constraint_order+1; - tmp=catx('|',libref, table_name, constraint_type,constraint_name); + tmp=catx('|',table_catalog, table_name,constraint_name); run; /* must use SQL as proc datasets does not support length changes */ @@ -5194,7 +5204,7 @@ run; %let curds=%scan(&dsnlist,&x); data _null_; file &fref mod; - length nm lab $1024 typ $20; + length lab $1024 typ $20; set &colinfo (where=(upcase(memname)="&curds")) end=last; if _n_=1 then do; @@ -6333,15 +6343,25 @@ filename &tempref clear; %mend mp_include;/** @file @brief Initialise session with useful settings and variables - @details Implements a set of recommended options for general SAS use. This - macro is NOT used elsewhere within the core library (other than in tests), - but it is used by the SASjs team when building web services for - SAS-Powered applications elsewhere. + @details Implements a "strict" set of SAS options for use in defensive + programming. Highly recommended, if you want your code to run on some + other machine. - If you have a good idea for an option, setting, or useful global variable - - feel free to [raise an issue](https://github.com/sasjs/core/issues/new)! + This macro is recommended to be compiled and invoked in the `initProgram` + for SASjs [Jobs](https://cli.sasjs.io/sasjsconfig.html#jobConfig_initProgram + ), [Services]( + https://cli.sasjs.io/sasjsconfig.html#serviceConfig_initProgram) and [Tests] + (https://cli.sasjs.io/sasjsconfig.html#testConfig_initProgram). - All global variables are prefixed with "SASJS_" (unless modfied with the + For non SASjs projects, you could invoke in the autoexec, or in your own + solution initialisation macro. + + + If you have a good idea for another useful option, setting, or global + variable - feel free to [raise an issue]( + https://github.com/sasjs/core/issues/new)! + + All global variables are prefixed with "SASJS" (unless modified with the prefix parameter). @param [in] prefix= (SASJS) The prefix to apply to the global macro variables @@ -6371,15 +6391,16 @@ filename &tempref clear; autocorrect /* disallow mis-spelled procedure names */ compress=CHAR /* default is none so ensure we have something! */ datastmtchk=ALLKEYWORDS /* protection from overwriting input datasets */ - errorcheck=STRICT /* catch errors in libname/filename statements */ - fmterr /* ensure err when a format cannot be found */ - mergenoby=%str(ERR)OR /* Throw err when a merge has no BY variables */ - missing=. /* some sites change this which causes hard to detect errors */ + %str(err)orcheck=STRICT /* catch errs in libname/filename statements */ + fmterr /* ensure err when a format cannot be found */ + mergenoby=%str(ERR)OR /* throw err when a merge has no BY variables */ + missing=. /* changing this can cause hard to detect errs */ noquotelenmax /* avoid warnings for long strings */ noreplace /* avoid overwriting permanent datasets */ ps=max /* reduce log size slightly */ validmemname=COMPATIBLE /* avoid special characters etc in table names */ validvarname=V7 /* avoid special characters etc in variable names */ + varinitchk=%str(ERR)OR /* avoid data mistakes from variable name typos */ varlenchk=%str(ERR)OR /* fail hard if truncation (data loss) can result */ ; @@ -6448,7 +6469,7 @@ filename &tempref clear; %if &action=OPEN %then %do; options nobomfile; data _null_;file &jref encoding='utf-8'; - put '{"START_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '"'; + put '{"PROCESSED_DTTM" : "' "%sysfunc(datetime(),E8601DT26.6)" '"'; run; %end; %else %if (&action=ARR or &action=OBJ) %then %do; @@ -7010,7 +7031,7 @@ run; %let abortme=1; %end; -/* catch errors - mp_abort must be called outside of a logic block */ +/* catch errs - mp_abort must be called outside of a logic block */ %mp_abort(iftrue=(&abortme=1), msg=%superq(msg), mac=&sysmacroname @@ -11112,7 +11133,7 @@ data _null_; put '%if &action=OPEN %then %do; '; put ' options nobomfile; '; put ' data _null_;file &jref encoding=''utf-8''; '; - put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; '; + put ' put ''{"PROCESSED_DTTM" : "'' "%sysfunc(datetime(),E8601DT26.6)" ''"''; '; put ' run; '; put '%end; '; put '%else %if (&action=ARR or &action=OBJ) %then %do; '; @@ -16194,7 +16215,7 @@ data _null_; put '%if &action=OPEN %then %do; '; put ' options nobomfile; '; put ' data _null_;file &jref encoding=''utf-8''; '; - put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; '; + put ' put ''{"PROCESSED_DTTM" : "'' "%sysfunc(datetime(),E8601DT26.6)" ''"''; '; put ' run; '; put '%end; '; put '%else %if (&action=ARR or &action=OBJ) %then %do; '; @@ -17441,6 +17462,7 @@ options noquotelenmax; libname &libref2 JSON fileref=&fname2; data &outds; length id $36 name $128 uri $64 type $32 description $256; + if _n_=1 then call missing (of _all_); set &libref2..items; run; filename &fname2 clear; @@ -19525,6 +19547,7 @@ run; data &outds; format _program uri $128. state $32. stateDetails $32. timestamp datetime19. jobparams $32767.; + call missing (of _all_); stop; run; diff --git a/meta/mm_createwebservice.sas b/meta/mm_createwebservice.sas index 4aedae2..d7bbdd3 100644 --- a/meta/mm_createwebservice.sas +++ b/meta/mm_createwebservice.sas @@ -95,7 +95,7 @@ data _null_; put '%if &action=OPEN %then %do; '; put ' options nobomfile; '; put ' data _null_;file &jref encoding=''utf-8''; '; - put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; '; + put ' put ''{"PROCESSED_DTTM" : "'' "%sysfunc(datetime(),E8601DT26.6)" ''"''; '; put ' run; '; put '%end; '; put '%else %if (&action=ARR or &action=OBJ) %then %do; '; diff --git a/viya/mv_createwebservice.sas b/viya/mv_createwebservice.sas index ad44d77..6ba39c1 100644 --- a/viya/mv_createwebservice.sas +++ b/viya/mv_createwebservice.sas @@ -243,7 +243,7 @@ data _null_; put '%if &action=OPEN %then %do; '; put ' options nobomfile; '; put ' data _null_;file &jref encoding=''utf-8''; '; - put ' put ''{"START_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''"''; '; + put ' put ''{"PROCESSED_DTTM" : "'' "%sysfunc(datetime(),E8601DT26.6)" ''"''; '; put ' run; '; put '%end; '; put '%else %if (&action=ARR or &action=OBJ) %then %do; ';