29 %MACRO assertPrimaryKey (i_library = _NONE_
32 ,i_desc = Check
for primary key
34 ,o_listingVars = _NONE_
35 ,o_treatMissings = VALUE
39 %LOCAL l_result l_errMsg l_actual l_i l_variables l_name l_anz_lvars l_path l_lastVariable l_casid l_tstid l_missingWhere;
45 %IF &g_inTestcase EQ 1 %THEN %DO;
48 %ELSE %IF &g_inTestcase NE 2 %THEN %DO;
49 %PUT &g_error.(SASUNIT): assert must be called after initTestcase;
53 %*************************************************************;
54 %*** Check preconditions ***;
55 %*************************************************************;
56 %IF (&i_library. = _NONE_) %THEN %DO;
58 %LET l_errMsg =Specify a value
for parameter i_library!;
61 %IF (&i_dataset. = _NONE_) %THEN %DO;
63 %LET l_errMsg =Specify a value
for parameter i_dataset!;
66 %IF (&i_variables. = _NONE_) %THEN %DO;
68 %LET l_errMsg =Specify a value
for parameter i_variables!;
72 %*** check
for valid librefs und existence of data sets Master und Lookup***;
73 %IF (%SYSFUNC (libref (&i_library.)) NE 0) %THEN %DO;
75 %LET l_errMsg =Libref
"&i_library." of data set
"&i_dataset." is not valid!;
78 %IF (%SYSFUNC(exist(&i_library..&i_dataset.)) EQ 0) %THEN %DO;
80 %LET l_errMsg =Data set
"&i_library..&i_dataset." does not exist!;
84 %*** Is the number of variables specified
for key greater Equal 1 ? ***;
86 %LET i_variables=&i_variables.;
87 %LET l_anzvars = %eval(%SYSFUNC(count(&i_variables,%str( )))+1);
88 %IF (%length(%trim(&i_variables.)) < 1 OR &l_anzvars. LT 1) %THEN %DO;
90 %LET l_errMsg =No variables specified to check primary key condition!;
94 %*** Check
if parameter o_maxReportObs is valid ***;
95 %IF NOT (%SYSFUNC(upcase(&o_maxReportObs.)) = MAX) %THEN %DO;
96 %IF (%datatyp(&o_maxReportObs.) ~= NUMERIC) %THEN %DO;
98 %LET l_errMsg =%bquote(Parameter o_maxReportObs (&o_maxReportObs) must be MAX or numeric GE 0);
101 %ELSE %IF (&o_maxReportObs. < 0) %THEN %DO;
103 %LET l_errMsg =%bquote(Parameter o_maxReportObs(&o_maxReportObs) must be GE 0);
108 %*** Is the number of variables specified
for key greater Equal 1 ? ***;
109 %LET l_anz_lvars = 0;
110 %LET o_listingVars=&o_listingVars.;
111 %IF (&o_listingVars. ne _NONE_) %THEN %DO;
112 %LET l_anz_lvars = %eval(%SYSFUNC(count(&o_listingVars,%str( )))+1);
113 %IF (%length(%trim(&o_listingVars.)) < 1 OR &l_anz_lvars. LT 1) %THEN %DO;
115 %LET l_errMsg =No variables specified
for printing the dataset!;
120 %IF (%UPCASE(&o_treatMissings.) NE IGNORE
121 AND %UPCASE(&o_treatMissings.) NE DISALLOW
122 AND %UPCASE(&o_treatMissings.) NE VALUE) %THEN %DO;
124 %LET l_errMsg =Parameter o_treatMissings must be IGNORE%str(,) DISALLOW or VALUE!;
128 %*** Check existence of specified keys in their respective tables ***;
129 %*** Get variables in source dataset ***;
130 PROC CONTENTS data=&i_library..&i_dataset. out=work._Variables NOPRINT;
135 %LET l_missingWhere =;
136 %DO l_i=1 %TO &l_anzvars.;
137 %LET l_name = %scan (&i_variables., &l_i.);
138 %LET l_variables = &l_variables. "%upcase(&l_name.)";
139 %IF (&l_i. > 1) %THEN %DO;
140 %LET l_missingWhere = &l_missingWhere. AND;
142 %LET l_missingWhere = &l_missingWhere. not missing (&l_name.);
144 %LET l_lastVariable=&l_name.;
147 select count (*) into :l_anzahlObs from work._Variables where upcase(name) in (&l_variables.);
150 %IF (&l_anzvars. ne &l_anzahlObs.) %THEN %DO;
152 %LET l_errMsg =Parameter i_variables contains invalid column names!;
156 %IF (&o_listingVars. ne _NONE_) %THEN %DO;
158 %DO l_i=1 %TO &l_anz_lvars.;
159 %LET l_name = %scan (&o_listingVars., &l_i.);
160 %LET l_variables = &l_variables. "%upcase(&l_name.)";
163 select count (*) into :l_anzahlObs from work._Variables where upcase(name) in (&l_variables.);
165 %IF (&l_anz_lvars. ne &l_anzahlObs.) %THEN %DO;
167 %LET l_errMsg =Parameter o_listingVars contains invalid column names!;
172 %IF (%upcase(&o_treatMissings.) eq DISALLOW) %THEN %DO;
174 select count (*) into :l_anzahlObs from &i_library..&i_dataset. where not (&l_missingWhere.);
176 %IF (&l_anzahlObs. > 0) %THEN %DO;
178 %LET l_errMsg =Parameter o_treatMissings is set to disallow but dataset contains missing values!;
182 %*-- get current ids for test case and test ---------------------------------*;
183 %_getScenarioTestId (i_scnid=&g_scnid, r_casid=l_casid, r_tstid=l_tstid);
185 %*** create subfolder ***;
186 %_createTestSubfolder (i_assertType =assertPrimaryKey
193 libname _apk "&l_path.";
195 %* sort dataset by i_variables *;
196 proc sort data=&i_library..&i_dataset. out=work._sorted;
198 %IF (%upcase(&o_treatMissings.) = IGNORE) %THEN %DO;
199 where &l_missingWhere.;
203 data work._notUnique;
206 if not (first.&l_lastVariable. AND last.&l_lastVariable.);
210 select count (*) into :l_anzahlObs from work._notUnique;
214 set work._sorted (OBS=&o_maxReportObs.);
215 %IF (&o_listingVars. ne _NONE_) %THEN %DO;
216 keep &o_listingVars.;
220 data _apk._notUnique;
221 set work._notUnique (OBS=&o_maxReportObs.);
222 %IF (&o_listingVars. ne _NONE_) %THEN %DO;
223 keep &o_listingVars.;
227 %LET l_actual=%eval(&l_anzahlObs. = 0);
228 %LET l_result=%eval((&l_anzahlObs. > 0)*2);
231 %_asserts(i_type = assertPrimaryKey
233 ,i_actual = %str(&l_actual.)
235 ,i_result = &l_result.
236 ,i_errMsg = &l_errMsg.
238 %MEND assertPrimaryKey;