2017-01-19 2 views
0

Я хочу написать код, в котором при определенных условиях будет выполняться другое proc tabulate. Проблема заключается где-то внутри макроса. Без изменений все работало нормально. Идея кода довольно проста, но я впервые сделал что-то подобное. В зависимости от значения x в данных makro будет выполнен другой макрос. Я не знаю, как переменные должны быть определены внутри макроса.Macro with proc tabulate

data makro; 
set number; 
if number < 20 then x=1; 
else x=2; 
run; 

    proc format; 
value temp 70- HIGH='red'; 
run; 

PROC SQL; 
    CREATE TABLE Stat_for_&cel AS 
    SELECT distinct t1.&zmienna, 
      t1.&cel, 
t2.number, 
       (COUNT(t1.cid)) AS ILE 
     FROM zrodlo.abt_app t1 left join ile_zmiennych t2 on t1.&zmienna=t2.&zmienna where t1.&zmienna not is missing 
     GROUP BY t1.&zmienna, 
       t1.&cel 
     ORDER BY t1.&zmienna DESC; 
QUIT; 

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna); 

proc format; 
value temp 70- HIGH='red'; 
run; 

PROC TABULATE 
DATA= &&Stat_for_&cel format=commax10.2 ; 

    VAR &&ILE; 

    CLASS &&zmienna/ MISSING; 
    CLASS &&cel/ MISSING; 

    TABLE 

    /* Row Dimension */ 
&&cel, 
/* Column Dimension */ 
&&ILE* ColPctSum* &&zmienna*[style=[background=temp.]]; 

RUN; 
%mend tabelka1; 

data makro_2; 
set makro; 
if x=1 then call execute ('%tabelka1'); 
run; 

EDIT: Добавлена ​​информация из «ответа», поскольку это не ответ.

код должен работать так. & Cel и & zmienna - это просто переменные, которые я хочу использовать в процедуре proc proculate и которые определяются вручную в начале кода. Я хочу запустить макрос только один раз, когда «номер» равен < 20. В следующих нескольких шагах я просто подготавливаю данные с форматом proc, а также создаю таблицу «Stat_for_ & cel», которая позже будет использоваться в качестве данных в процедуре табуляции proc.

Основная проблема заключается в том, что% macro tabelka1, я считаю. Я не знаю, как следует использовать переменные & cel и & zmienna внутри макроса.

+0

К сожалению, ваш вопрос недостаточно ясен, чтобы понять, о чем именно вы просите о помощи. – Reeza

+1

Примеры входных и выходных данных помогут. Вы хотите запустить макрос несколько раз, если в MAKRO есть несколько наблюдений, которые удовлетворяют условию X = 1? Или вы хотите запустить его только один раз, если ANY наблюдение имеет X = 1? Или, может быть, только если ВСЕ наблюдения имеют X = 1? – Tom

+0

Вот пример того, как я напишу макрос. В нижней части кода есть образец кода для выполнения макроса. Обратите внимание на список параметров в комментариях и использовании. – Reeza

ответ

0

Я думаю, что вы смешиваете параметры в определении макроса, а затем фактическое использование. Вы неправильно определили свой макрос. Вместо того, чтобы:

%macro tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna); 

Оно должно быть:

%macro tabelka1(Statystyka_dla_cel,ILE,cel,zmienna); 

И тогда, когда вы вызываете макрос или попытаться использовать его, макро переменные могут быть переданы.

%tabelka1(Statystyka_dla_cel,&ILE,&cel,&zmienna); 

Лично я предпочитаю иметь знак =, чтобы подчеркнуть разницу между именами параметров и используемыми значениями. Вот простой пример:

%macro print_vars(dsin= , vars=); 

proc print data=&dsin; 
var &vars; 
run; 

%mend; 

Тогда вы могли бы назвать макрос:

%print_vars(dsin=sashelp.class, vars= name age); 
0

Это очень важно иметь четкое представление о том, что различные термины означают. Макро-переменная - это место хранения данных с именем и значением. Имя макрокоманды - это что-то вроде «ile», «cel» и т. Д. Но ясно, что имя макрокоманды не включает амперсанд !! Существуют различные способы доступа к значению макропеременной, все из которых связаны с использованием имени. Наиболее распространенным способом является использование &<macro variable name>, но вы также можете использовать (на этапе данных) x = symget('<macro variable name>'), например, без амперсанда.

-1

Нет ничего плохого в определении вашего макроса без каких-либо параметров. Вы можете просто ссылаться на макропеременные в макрокоманде и оставить его пользователю макроса, чтобы убедиться, что макропеременные определены до вызова макроса.

%macro tabelka1; 
proc format; 
value temp 70- HIGH='red'; 
run; 

PROC TABULATE DATA=Stat_for_&cel format=commax10.2 ; 
    VAR &ILE; 
    CLASS &zmienna/ MISSING; 
    CLASS &cel/ MISSING; 
    TABLE &cel,&ILE*ColPctSum*&zmienna*[style=[background=temp.]]; 
RUN; 
%mend tabelka1; 

Затем, чтобы условно назвать макрос, вы можете использовать шаг данных.

data _null_; 
    set makro; 
    if x=1; 
    call execute('%nrstr(%tabelka1);'); 
    stop; 
run; 
Смежные вопросы