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;