Não consigo encontrar a solução para este erro. Tentei usign% eval,% sysfunc e% sysevalf, sem sucesso. O que é necessário para avaliar corretamente o "& definir" na macro?
%macro set_istituzionale(set=, varout=);
%if &set/100 = 1 %then &varout = 'AP';
%mend set_istituzionale;
data soff2; set soff; %set_istituzionale(set=setcon,varout=set); run;
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
&set/100 = 1
ERROR: The macro SET_ISTITUZIONALE will stop executing.
A lógica por trás de sua macro está errada.
Você está chamando essa macro dentro de uma etapa de dados, então essa macro deve conter algo (uma instrução) que pode ser resolvida dentro da etapa de dados.
If-else não será escrito em linguagem macro, mas em linguagem normal de datastep.
%macro set_istituzionale(set=, varout=);
if &set/100 = 1 then &varout = 'AP';
%mend set_istituzionale;
agora, se você usar sua chamada, terá sua etapa de dados resolvida desta forma:
data soff2;
set soff;
%set_istituzionale(set=setcon,varout=set);
run;
vai se tornar:
data soff2;
set soff;
if setcon/100 = 1 then set = 'AP';
run;
Em seu código, você estava usando código de macro, então sua etapa foi resolvida internamente para a instrução booleana macro% if & set / 100 resolveu% if setcon / 100 onde setcon era uma string (aqui estamos falando condicionalmente com linguagem de macro, escrevendo o nome de a variável não capturará o valor da variável porque é completamente independente do passo de dados).
Você deve pensar em linguagem de macro apenas para algo que possa escrever código para você, por exemplo, algo como sua primeira tentativa poderia ser usado para inserir uma instrução condicionalmente ao valor de uma variável de macro como:
data try;
set want;
%if ¯ovar=A %then %do;
if var1=1 and var2='B' then var3='C';
%end;
%if ¯ovar=B %then %do
if var1=2 and var2='A' then var3='D';
%end;
run;
when the macro variable macrovar will be = A the step will be:
data try;
set want;
if var1=1 and var2='B' then var3='C';
run;
if the macro variable macrovar will be = B the step will be:
data try;
set want;
if var1=2 and var2='A' then var3='D';
run;
Mas você também pode usar código de macro fora da etapa de dados, por exemplo, para executar uma etapa de dados ou outra coisa condicionalmente ao valor de uma variável de macro:
%if ¯ovar=A %then %do;
data try; set tr;
some code;
run;
%end;
%else %if ¯ovar=B %then %do;
proc sort data=tr out=try nodupkey; by var1; run;
%end;
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras