mercredi 20 janvier 2016

How to force SAS to interpret macro vars as numbers in if condition

SAS is interpreting in_year_tolerance and abs_cost as text vars in the below if statement. Therefore the if statement is testing the alphabetical order of the vars rather than the numerical order. How do I get SAS to treat them as numbers? I have tried sticking the if condition, and the macro vars, in %sysevalf but that made no difference. in_year_tolerance is 10,000,000 and cost can vary, but in the test run starts around 20,000,000 before dropping to 9,000,000 at which point it should exit the loop but doesn't.

%macro set_downward_caps(year, in_year_tolerance, large, small, start, end, increment);
%do c = &start. %to &end. %by &increment.;
    %let nominal_down_large_&year. = %sysevalf(&large. + (&c. / 1000));
    %let nominal_down_small_&year. = %sysevalf(&small. + (&c. / 100));
    %let real_down_large_&year. = %sysevalf((1 - &&nominal_down_large_&year.) * &&rpi&year.);
    %let real_down_small_&year. = %sysevalf((1 - &&nominal_down_small_&year.) * &&rpi&year.);
    %rates(&year.);
    proc means data = output.s_&scenario. noprint nway;
        var transbill&year.;
        output out = temporary (drop = _type_ _freq_) sum=cost;
    run;
    data _null_;
        set temporary;
        call symputx('cost', put(cost,best32.));
    run;
    data temp;
        length scenario $ 30;
        scenario = "&scenario.";
        large = &&real_down_large_&year.;
        small = &&real_down_small_&year.;
        cost = &cost.;
    run;
    data output.summary_of_caps;
        set output.summary_of_caps temp;
    run;
    %let abs_cost = %sysevalf(%sysfunc(abs(&cost)));
    %if &in_year_tolerance. > &abs_cost. %then %return;
%end;
%mend set_downward_caps;

Aucun commentaire:

Enregistrer un commentaire