특정 매크로 변수가 없거나 존재하지 않는지 확인하는 간단한 매크로를 만들려고합니다. 일반적으로이 경우에는 %symexist
이라는 두 개의 명령문이 필요하며 존재할 경우 null 값인지 여부를 감지하는 추가 논리가 필요합니다. 아래의 코드는이 모든 것을 하나로 결합한 것입니다.불일치 매크로 변수 데이터 형식
%macro isnull(macvar);
%sysevalf(%superq(%superq(macvar)) NE %str(), boolean);
%mend isnull;
문제
반환 값은 항상 문자 것으로 보인다 때문에 내가하는 %if
성명에서 %isNull()
을 사용할 수 없습니다. 이 동작은 열려있는 코드 또는 매크로 자체에있는 경우 다릅니다. 내가 매크로가 숫자 값으로 해결하지 좁혔습니다
을 시도했습니다 무엇
. 나는 동봉하는 것에서부터 %sysfunc(putn())
에 %cmpres()
to %sysfunc(compress())
으로 모든 것을 시도했다. 코드가 열려 있으면 숫자입니다. 다른 매크로에 있으면 문자입니다. 이 코드를 볼 수 있습니다
/* Miss2 resolves incorrectly as character */
%macro check;
%let miss1=%sysevalf(%superq(asdf) =, boolean);
%let miss2=%isNull(asdf);
%put Miss1: %datatyp(&miss1);
%put Miss2: %datatyp(&miss2);
%mend;
%check;
/* Miss2 resolves correctly as numeric */
%let miss1=%sysevalf(%superq(asdf) =, boolean);
%let miss2=%isNull(asdf);
%put Miss1: %datatyp(&miss1);
%put Miss2: %datatyp(&miss2);
이
를 원하십니까 내가 매크로가 존재하고 동시에 비어 있지 않은 둘 여부를 확인하기 위해 %if
문이 사용할 수 있어야합니다.
%macro foo;
%if(%isNull(sysuserid) = 1) %then %put sysuserid exists;
%if(%isNull(asdffdsa) = 0) %then %put asdffdsa does not exist;
%if(%isNull(sysuserid) > 0) %then %put this should resolve;
%if(%isNull(asdffdsa) > 0) %then %put this should not resolve;
%mend;
%foo;
매크로 변수는 오해에서 시작하여 '유형'이 없으며 _all_ 텍스트입니다. – Joe
% MISSM()이 함수 인 것처럼 처리하려면 세미콜론을 생성 할 수 없습니다 !! – Tom