diff --git a/all.sas b/all.sas index 944e4a6..2d7f5ce 100644 --- a/all.sas +++ b/all.sas @@ -298,9 +298,9 @@ options noquotelenmax; @file @brief Checks if a set of variables ALL exist in a data set. @details Returns 0 if ANY of the variables do not exist, or 1 if they ALL do. - Usage: + Usage: - %put %mf_existVarList(sashelp.class, age sex name dummyvar) + %put %mf_existVarList(sashelp.class, age sex name dummyvar);

SAS Macros

@li mf_abort.sas @@ -1782,6 +1782,149 @@ Usage: %mend; /** @endcond *//** + @file + @brief Asserts the existence (or not) of columns + @details Useful in the context of writing sasjs tests. The results of the + test are _appended_ to the &outds. table. + + Example usage: + + %mp_assertcols(sashelp.class, + cols=name age sex, + test=ALL, + desc=check all columns exist + ) + + %mp_assertcols(sashelp.class, + cols=a b c, + test=NONE + ) + + %mp_assertcols(sashelp.class, + cols=age depth, + test=ANY + ) + +

SAS Macros

+ @li mf_existds.sas + @li mf_existvarlist.sas + @li mf_wordsinstr1butnotstr2.sas + @li mp_abort.sas + + + @param [in] inds The input library.dataset to test for values + @param [in] cols= The list of columns to check for + @param [in] desc= (Testing observations) The user provided test description + @param [in] test= (ALL) The test to apply. Valid values are: + @li ALL - Test is a PASS if ALL columns exist in &inds + @li ANY - Test is a PASS if ANY of the columns exist in &inds + @li NONE - Test is a PASS if NONE of the columns exist in &inds + @param [out] outds= (work.test_results) The output dataset to contain the + results. If it does not exist, it will be created, with the following format: + |TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256| + |---|---|---| + |User Provided description|PASS|Column &inds contained ALL columns| + + +

Related Macros

+ @li mp_assertdsobs.sas + @li mp_assertcolvals.sas + @li mp_assertdsobs.sas + + @version 9.2 + @author Allan Bowe + +**/ + +%macro mp_assertcols(inds, + cols=0, + test=ALL, + desc=0, + outds=work.test_results +)/*/STORE SOURCE*/; + + %mp_abort(iftrue= (&syscc ne 0) + ,mac=&sysmacroname + ,msg=%str(syscc=&syscc - on macro entry) + ) + + %local lib ds ; + %let lib=%scan(&inds,1,%str(.)); + %let ds=%scan(&inds,2,%str(.)); + %let cols=%upcase(&cols); + + %mp_abort(iftrue= (%mf_existds(&lib..&ds)=0) + ,mac=&sysmacroname + ,msg=%str(&lib..&ds not found!) + ) + + %mp_abort(iftrue= (&cols=0) + ,mac=&sysmacroname + ,msg=%str(No cols provided) + ) + + + %let test=%upcase(&test); + + %if &test ne ANY and &test ne ALL and &test ne NONE %then %do; + %mp_abort( + mac=&sysmacroname, + msg=%str(Invalid test - &test) + ) + %end; + + /** + * now do the actual test! + */ + %local result; + %if %mf_existVarList(&inds,&cols)=1 %then %let result=ALL; + %else %do; + %local targetcols compare; + %let targetcols=%upcase(%mf_getvarlist(&inds)); + %let compare=%mf_wordsinstr1butnotstr2( + Str1=&cols, + Str2=&targetcols + ); + %if %cmpres(&compare)=%cmpres(&cols) %then %let result=NONE; + %else %let result=SOME; + %end; + + data; + length test_description $256 test_result $4 test_comments $256; + test_description=symget('desc'); + if test_description='0' + then test_description="Testing &inds for existence of &test of: &cols"; + + test_result='FAIL'; + test_comments="&sysmacroname: &inds has &result columns "; + %if &test=ALL %then %do; + %if &result=ALL %then %do; + test_result='PASS'; + %end; + %end; + %else %if &test=ANY %then %do; + %if &result=SOME %then %do; + test_result='PASS'; + %end; + %end; + %else %if &test=NONE %then %do; + %if &result=NONE %then %do; + test_result='PASS'; + %end; + %end; + %else %do; + test_comments="&sysmacroname: Unsatisfied test condition - &test"; + %end; + run; + + %local ds; + %let ds=&syslast; + proc append base=&outds data=&ds; + run; + proc sql; + drop table &ds; + +%mend;/** @file @brief Asserts the values in a column @details Useful in the context of writing sasjs tests. The results of the @@ -6111,11 +6254,11 @@ alter table &libds modify &var char(&len); @file @brief Creates a zip file @details For DIRECTORY usage, will ignore subfolders. For DATASET usage, - provide a column that contains the full file path to each file to be zipped. + provide a column that contains the full file path to each file to be zipped. - %mp_zip(in=myzips,type=directory,outname=myDir) - %mp_zip(in=/my/file/path.txt,type=FILE,outname=myFile) - %mp_zip(in=SOMEDS,incol=FPATH,type=DATASET,outname=myFile) + %mp_zip(in=myzips,type=directory,outname=myDir) + %mp_zip(in=/my/file/path.txt,type=FILE,outname=myFile) + %mp_zip(in=SOMEDS,incol=FPATH,type=DATASET,outname=myFile) If you are sending zipped output to the _webout destination as part of an STP be sure that _debug is not set (else the SPWA will send non zipped content diff --git a/base/mf_existvarlist.sas b/base/mf_existvarlist.sas index 03e6aa3..7677d1e 100755 --- a/base/mf_existvarlist.sas +++ b/base/mf_existvarlist.sas @@ -2,9 +2,9 @@ @file @brief Checks if a set of variables ALL exist in a data set. @details Returns 0 if ANY of the variables do not exist, or 1 if they ALL do. - Usage: + Usage: - %put %mf_existVarList(sashelp.class, age sex name dummyvar) + %put %mf_existVarList(sashelp.class, age sex name dummyvar);

SAS Macros

@li mf_abort.sas diff --git a/base/mp_assertcols.sas b/base/mp_assertcols.sas new file mode 100644 index 0000000..6298b27 --- /dev/null +++ b/base/mp_assertcols.sas @@ -0,0 +1,144 @@ +/** + @file + @brief Asserts the existence (or not) of columns + @details Useful in the context of writing sasjs tests. The results of the + test are _appended_ to the &outds. table. + + Example usage: + + %mp_assertcols(sashelp.class, + cols=name age sex, + test=ALL, + desc=check all columns exist + ) + + %mp_assertcols(sashelp.class, + cols=a b c, + test=NONE + ) + + %mp_assertcols(sashelp.class, + cols=age depth, + test=ANY + ) + +

SAS Macros

+ @li mf_existds.sas + @li mf_existvarlist.sas + @li mf_wordsinstr1butnotstr2.sas + @li mp_abort.sas + + + @param [in] inds The input library.dataset to test for values + @param [in] cols= The list of columns to check for + @param [in] desc= (Testing observations) The user provided test description + @param [in] test= (ALL) The test to apply. Valid values are: + @li ALL - Test is a PASS if ALL columns exist in &inds + @li ANY - Test is a PASS if ANY of the columns exist in &inds + @li NONE - Test is a PASS if NONE of the columns exist in &inds + @param [out] outds= (work.test_results) The output dataset to contain the + results. If it does not exist, it will be created, with the following format: + |TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256| + |---|---|---| + |User Provided description|PASS|Column &inds contained ALL columns| + + +

Related Macros

+ @li mp_assertdsobs.sas + @li mp_assertcolvals.sas + @li mp_assertdsobs.sas + + @version 9.2 + @author Allan Bowe + +**/ + +%macro mp_assertcols(inds, + cols=0, + test=ALL, + desc=0, + outds=work.test_results +)/*/STORE SOURCE*/; + + %mp_abort(iftrue= (&syscc ne 0) + ,mac=&sysmacroname + ,msg=%str(syscc=&syscc - on macro entry) + ) + + %local lib ds ; + %let lib=%scan(&inds,1,%str(.)); + %let ds=%scan(&inds,2,%str(.)); + %let cols=%upcase(&cols); + + %mp_abort(iftrue= (%mf_existds(&lib..&ds)=0) + ,mac=&sysmacroname + ,msg=%str(&lib..&ds not found!) + ) + + %mp_abort(iftrue= (&cols=0) + ,mac=&sysmacroname + ,msg=%str(No cols provided) + ) + + + %let test=%upcase(&test); + + %if &test ne ANY and &test ne ALL and &test ne NONE %then %do; + %mp_abort( + mac=&sysmacroname, + msg=%str(Invalid test - &test) + ) + %end; + + /** + * now do the actual test! + */ + %local result; + %if %mf_existVarList(&inds,&cols)=1 %then %let result=ALL; + %else %do; + %local targetcols compare; + %let targetcols=%upcase(%mf_getvarlist(&inds)); + %let compare=%mf_wordsinstr1butnotstr2( + Str1=&cols, + Str2=&targetcols + ); + %if %cmpres(&compare)=%cmpres(&cols) %then %let result=NONE; + %else %let result=SOME; + %end; + + data; + length test_description $256 test_result $4 test_comments $256; + test_description=symget('desc'); + if test_description='0' + then test_description="Testing &inds for existence of &test of: &cols"; + + test_result='FAIL'; + test_comments="&sysmacroname: &inds has &result columns "; + %if &test=ALL %then %do; + %if &result=ALL %then %do; + test_result='PASS'; + %end; + %end; + %else %if &test=ANY %then %do; + %if &result=SOME %then %do; + test_result='PASS'; + %end; + %end; + %else %if &test=NONE %then %do; + %if &result=NONE %then %do; + test_result='PASS'; + %end; + %end; + %else %do; + test_comments="&sysmacroname: Unsatisfied test condition - &test"; + %end; + run; + + %local ds; + %let ds=&syslast; + proc append base=&outds data=&ds; + run; + proc sql; + drop table &ds; + +%mend; \ No newline at end of file diff --git a/base/mp_zip.sas b/base/mp_zip.sas index 45b8c06..97377a9 100644 --- a/base/mp_zip.sas +++ b/base/mp_zip.sas @@ -2,11 +2,11 @@ @file @brief Creates a zip file @details For DIRECTORY usage, will ignore subfolders. For DATASET usage, - provide a column that contains the full file path to each file to be zipped. + provide a column that contains the full file path to each file to be zipped. - %mp_zip(in=myzips,type=directory,outname=myDir) - %mp_zip(in=/my/file/path.txt,type=FILE,outname=myFile) - %mp_zip(in=SOMEDS,incol=FPATH,type=DATASET,outname=myFile) + %mp_zip(in=myzips,type=directory,outname=myDir) + %mp_zip(in=/my/file/path.txt,type=FILE,outname=myFile) + %mp_zip(in=SOMEDS,incol=FPATH,type=DATASET,outname=myFile) If you are sending zipped output to the _webout destination as part of an STP be sure that _debug is not set (else the SPWA will send non zipped content