PizzaKebab
PizzaKebab

Reputation: 11

Problem with CALL SYMPUT inside if then loop

I'm encountering problems when I use the CALL SYMPUT function inside a if-then loop in SAS.

%LET food=kebab;
DATA _NULL_;
    IF &food.=pizza THEN DO;
        CALL SYMPUT('price',12);
        CALL SYMPUT('fat',5); 
    END;
    ELSE IF &food.=kebab THEN DO;
        CALL SYMPUT('price',6);
        CALL SYMPUT('fat',4);
    END;
RUN;

%put &food.;
%put &price.;
%put &fat.;

The variables actually take these values :

food = kebab ; price = 12 (instead of desired value 6) ; fat = 5 (instead of 4)

Thanks in advance for any explanation.

Upvotes: 0

Views: 732

Answers (1)

Reeza
Reeza

Reputation: 21294

Because you're using a data step, your IF statements need quotes. If it was %IF then your code would be closer to correct.

%LET food=kebab;
DATA _NULL_;
    IF "&food." = "pizza" THEN DO;
        CALL SYMPUT('price',12);
        CALL SYMPUT('fat',5); 
    END;
    ELSE IF "&food." = "kebab" THEN DO;
        CALL SYMPUT('price',6);
        CALL SYMPUT('fat',4);
    END;
RUN;

%put &food.;
%put &price.;
%put &fat.;

Another option is full macro logic, this will work in SAS 9.4M5+

%LET food=kebab;

    %IF &food.=pizza %THEN %DO;
        %let price = 12;
        %let fat=5; 
    %END;
    %ELSE %IF &food.=kebab %THEN %DO;
        %let price = 6;
        %let fat=4; 
    %END;


%put &food.;
%put &price.;
%put &fat.;

EDIT: If you're not on SAS 9.4M5+ which supports open macro code you need to wrap your logic in a macro.

%macro create_variables();

%global price fat;

%LET food=kebab;

    %IF &food.=pizza %THEN %DO;
        %let price = 12;
        %let fat=5; 
    %END;
    %ELSE %IF &food.=kebab %THEN %DO;
        %let price = 6;
        %let fat=4; 
    %END;


%put &food.;
%put &price.;
%put &fat.;

%mend;

%create_variables();

Upvotes: 3

Related Questions