2013-11-29 1 views
0

Я использую SAS 9.2, и я получил следующий фрагмент кода:SAS макросъемки разрешения вызова symputx (получить текущую строку)

data success error; 
length vague 3 path $150; 
set foplist; 
call symputx('error_count', rownum); 
%if &&error&error_count = 0 %then %do; 
path= "&&path&error_count"; 
vague=1; 
output success; 
%end; 
%else %do; 
... 
%end; 
run; 

Для каждой записи я хотел бы получить ROWNUM и объединить это с другой макропеременной. В rownum отображается номер журнала записи в наборе данных списка foplist. По какой-то причине я всегда получаю последний номер в наборе данных

Для примера (вероятно, из-за компиляции макроса?): --- RowNum = 1 B --- ROWNUM = 2

я только получаю rownum = 2

Любая идея, как это исправить?

Спасибо!

ответ

0

Вы не можете создать и разрешить макро переменную в пределах одного и того же файла.

Вы уже определили макропеременные ERROR1-ERRORx и PATH1-PATHn и хотите получить эти значения в datastep на основе rownum? то есть для разрешения &&ERROR&ERROR_COUNT.

Если это так, просто используйте symexist/symget ...

 
data success error ; 
    length vague 3 path $150 ; 
    set foplist ; 
    if symexist(cats('ERROR',rownum)) and symexist(cats('PATH',rownum)) then do ; 
    error_count = symget(cats('ERROR',rownum)) ; 
    if error_count = 0 then do ; 
     path = symget(cats('PATH',rownum)) ; 
     vague = 1 ; 
     output success ; 
    end ; 
    else output error ; 
    end ; 
    else output error ; 
run; 
+0

Технически вы можете создать решить макропеременную в одном шаге данных: вызова symput ('VAR', '1'); если symget ('VAR') = '1', тогда поставьте 'true'; Но я уверен, что Крис не имел в виду именно это. Он имел в виду, что вы не можете вызвать symput, а затем развернуться и использовать & VAR в том же наборе данных. Совершенно верно! Когда вы смешиваете макрокоманд% foo и & bar с шагом данных, представьте себе весь выполняемый макрокод, потому что это, по сути, то, что делает SAS. Только после того, как решены% foo и & bar, SAS выполнит ваш шаг данных. –

+0

И все равно% if ...% then ... не могут использоваться в открытом коде как сами (только внутри% macro ...% mend wrap). –