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