BookmarkSubscribeRSS Feed
zscott1
Calcite | Level 5

I have a macro where I want the first part of the %if statement and the last part to run conditional on a second part to prevent errors.

this is my code, what I am attempting to do in the wrong coding is in orange type, and also underlined farther in the code:

%macro shetre;

%if &numstrat>3 and if &SS4 exists do &SS4>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=4))

         method=srs n=&SS4

          out=SampleStrata4;

strata Strata; 

   run;

   %end;

 

   %mend shetre;

   %shetre;

%macro sepstrat;

proc surveyselect data=&dsname(where=(STRATA=1))

         method=srs n=&SS1

          out=SampleStrata1; 

strata Strata;

   run;

proc surveyselect data=&dsname(where=(STRATA=2))

         method=srs n=&SS2

          out=SampleStrata2;

strata Strata;

   run;

%if &numstrat>2 %then %do;

proc surveyselect data=&dsname(where=(STRATA=3))

         method=srs n=&SS3

          out=SampleStrata3;

strata Strata; 

   run;

   %end;

%if &numstrat>3 and %if &SS4 exists %then %do %if &SS4>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=4))

         method=srs n=&SS4

          out=SampleStrata4;

strata Strata; 

   run;

   %end;

   %end;

%if &numstrat>4 and &SS5>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=5))

         method=srs n=&SS5

          out=SampleStrata5;

strata Strata; 

   run;

   %end;

%if &numstrat>5 and &SS6>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=6))

         method=srs n=&SS6

          out=SampleStrata6;

strata Strata; 

   run;

   %end;

%if &numstrat>6 and &SS7>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=7))

         method=srs n=&SS7

          out=SampleStrata7;

strata Strata; 

   run;

   %end;

   %mend;

   %sepstrat;

6 REPLIES 6
RW9
Diamond | Level 26 RW9
Diamond | Level 26

Hi,

Something like:

%if &numstrat. > 3 and %symexist(ss6) %then %do;  /* so if exist then use ss6 */

%end;

%else %do;

     %let ss6=0;

     /* Do otherwise */

%end;

zscott1
Calcite | Level 5

well, %symexist seemed tp giving the argument that it was character not numeric though it returns (1 or 0).  I will show log.

zscott1
Calcite | Level 5

1877  %macro shapla;

1878  %if &numstrat>4 and and %symexist(SS5)=1 %then %do;

1879  proc surveyselect data=&dsname(where=(STRATA=5))

1880           method=srs n=&SS5

1881            out=SampleStrata5;

1882  strata Strata;

1883     run;

1884     %end;

1885  %mend;

1886  %shapla;

MLOGIC(SHAPLA):  Beginning execution.

SYMBOLGEN:  Macro variable NUMSTRAT resolves to        4

ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand

       is required. The condition was: &numstrat>4 and and %symexist(SS5)=1

ERROR: The macro SHAPLA will stop executing.

MLOGIC(SHAPLA):  Ending execution.

RW9
Diamond | Level 26 RW9
Diamond | Level 26

Well, to start with you have the word and twice in that if statement.  Second you don't need the =1 as the result is either true or false.

zscott1
Calcite | Level 5

if anyone is curious this is what I figured out...

%macro sepstrat;

proc surveyselect data=&dsname(where=(STRATA=1))

         method=srs n=&SS1

          out=SampleStrata1; 

strata Strata;

   run;

proc surveyselect data=&dsname(where=(STRATA=2))

         method=srs n=&SS2

          out=SampleStrata2;

strata Strata;

   run;

%if &numstrat>2 %then %do;

proc surveyselect data=&dsname(where=(STRATA=3))

         method=srs n=&SS3

          out=SampleStrata3;

strata Strata; 

   run;

   %end;

%if &numstrat>3 and %symexist(SS4) %then %do;

%if &SS4>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=4))

         method=srs n=&SS4

          out=SampleStrata4;

strata Strata; 

   run;

   %end;

   %end;

%if &numstrat>4 and %symexist(SS5) %then %do;

%if &SS5>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=5))

         method=srs n=&SS5

          out=SampleStrata5;

strata Strata; 

   run;

   %end;

   %end;

%if &numstrat>5 and %symexist(SS6) %then %do;

%if &SS6>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=6))

         method=srs n=&SS6

          out=SampleStrata6;

strata Strata; 

   run;

runs great...thanks everyone.

   %end;

   %end;

%if &numstrat>6 and %symexist(SS7) %then %do;

%if &SS7>0 %then %do;

proc surveyselect data=&dsname(where=(STRATA=7))

         method=srs n=&SS7

          out=SampleStrata7;

strata Strata; 

   run;

   %end;

   %end;

   %mend;

options mlogic mprint symbolgen;

%sepstrat;

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 613 views
  • 0 likes
  • 3 in conversation