2016-11-16 3 views
1

내 프로그램에서 동일한 상수 변수를 여러 번 재사용하므로 매크로에서 모두 상수를 선언 한 다음 내 함수에 해당 매크로를 호출하고 싶습니다.SAS에서 매크로에 사용할 여러 변수를 선언 하시겠습니까?

는 나는이에 run_ 매크로를 변경하는 경우가 더 이상 작동하지 않습니다 그러나

%macro vars(); 
    %let trans_1 = ever_30_ct; 
    %let trans_2 = ever_60_ct; 
%mend vars; 

%macro run_(); 
    %vars(); 
    proc sql; 
    select &trans_1 from va_purchase_fico_cts; 
    run; 
%mend run_; 

%run_(); 

작동이 같은 예를 가지고있다.

%macro run_(); 
    %vars(); 
    proc sql; 
    select &trans_1 , &trans_2 from va_purchase_fico_cts; 
    run; 
%mend run_; 

& trans_2는 해결할 수 없습니다. 왜 내가 이것을 할 수 없는지 이해하는 사람이 있습니까?

답변

2

매크로 가변 범위. 그것은 어느 쪽도 작동하지 않아야합니다. 대부분의 경우 테스트에서 trans_1 변수를 선언했을 가능성이 큽니다.

기본적으로 매크로는 매크로가 완료되면 더 이상 존재하지 않는 로컬 매크로 변수를 만듭니다. 매크로 매크로 변수로 선언하면 매크로 외부에서 사용할 수 있습니다.

%macro vars(); 
    %global trans_1; 
    %global trans_2; 
    %let trans_1 = ever_30_ct; 
    %let trans_2 = ever_60_ct; 
%mend vars; 
+0

Perfect. 감사. –

1

이 가장 간단한 해결책입니다.

저는 여러 프로젝트를 동시에 수행하기 때문에 전역 변수를 피하려고합니다. 나는 각 프로젝트에 대해 엔트리 포인트 매크로를 작성하는 것을 선호한다. 그런 다음 다른 매크로를 호출합니다. 이를 통해 해당 진입 점에서 필요한만큼 많은 변수를 %local 개 선언 할 수 있습니다. 작업이 완료되면 해당 변수가 사라집니다. 같은 : 당신은 파라 메트릭 방식으로 변수를 초기화 할 필요가있는 경우

%macro wrap_foo/des='Entry point for task foo'; 
    %local _trans1 _trans2; 
    %foo; 
%mend; 

는, 당신은 이름 변수의을 사용하는 매크로를 만들 수 있습니다. 자주 사용자 지정 로그 메시지를 만들 때 사용합니다.

%macro init_constants(varname1, varname2, project) 
/des='Parameterized constant initializer.'; 
    %let &varname1 = &project.1; 
    %let &varname2 = &project.2; 
%mend; 

%macro foo/des='Actual task foo'; 
    %init_constants(_trans1, _trans2, bar); 
    %put &=_trans1 &=_trans2; 
%mend; 

%wrap_foo; 
관련 문제