2011-08-10 4 views
2

제 코드에는 여러 레벨의 많은 매크로가 있습니다. 대부분의 매크로 변수는 동일하지만 (날짜), 때로는 다른 날짜로 매크로를 실행하려고합니다. 그러면 변수가 충돌합니다.sas 매크로에서 모든 변수를 로컬에서 만드는 방법은 무엇입니까?

매크로에 표시되는 모든 변수가 % 로컬 변수를 사용하지 않고도 로컬이어야한다는 것을 어떻게 나타낼 수 있습니까? 중첩 된 매크로의 경우 더 깊은 레벨의 변수 값은 상위 레벨의 변수를 감염시킵니다.

+0

몇 가지 샘플 코드를 게시하십시오. 매크로를 작성하는 방법을 보여 주면 더 많은 조언을 제공 할 수 있습니다. –

답변

1

매번 % local로 명시 적으로 나열해야합니다. 불행히도, 지름길은 없습니다.

중첩 된 매크로의 문제를 해결하는 데 어려움이있는 경우 내 표준을 변경하여 팁을 변경하면 결코 매크로 (입력) 매개 변수의 값이 수정되지 않습니다. 이 간단한 개념은 디버깅을 훨씬 쉽게 만듭니다.

그리고 매크로에 % include 문이 있으면 'source2'옵션을 추가하여 소스 코드가 로그에 표시되도록하십시오.

건배 롭

1

또 다른 옵션은 매크로 문 라인 매크로 매개 변수로 변수를 정의하는 것입니다. 다음은 DATE라는 전역 매크로 변수를 만든 다음 DATE라는 매개 변수가있는 매크로를 정의하는 간단한 프로그램입니다. 또한 매크로는 자신을 다른 날짜 값 (1)으로 호출합니다.

options nosource nonotes; 
%let date = '01jan2011'd; 
%put Global DATE = &date; 

%******************************************************************************; 
%macro test_macro_level(date=,nest_level=); 

    %put INSIDE MACRO - Nest Level=&nest_level : DATE=&date; 

    %if %eval(&nest_level = 1) %then %do; 
     %test_macro_level(date='01mar2011'd,nest_level=2); 
     %put INSIDE MACRO, AFTER NESTING - Nest Level=&nest_level : DATE=&date; 
    %end; 

%mend test_macro_level; 
%******************************************************************************; 
%test_macro_level(date='01feb2011'd,nest_level=1); 

%put Return to Global: Date=&date; 

로그 파일은 읽

Global DATE = '01jan2011'd 
INSIDE MACRO - Nest Level=1 : DATE='01feb2011'd 
INSIDE MACRO - Nest Level=2 : DATE='01mar2011'd 
INSIDE MACRO, AFTER NESTING - Nest Level=1 : DATE='01feb2011'd 
Return to Global: Date='01jan2011'd 

(1) 는 반복 매크로는, 예를 들어이며 어떠한 방식으로 자신의 코드를 오염해야 있습니다.

관련 문제