2016-11-30 83 views
3

我在一個SAS項目中有幾個程序,即程序A - >程序B - > ....我想在使用宏變量的程序之間建立依賴關係。SYSERR自動宏變量

程序A將處理很少的數據步驟和過程。如果在程序中的任何程序有錯誤的執行,我想運行的程序C.否則運行程序B.

這似乎是因爲在每一步的邊界syserr復位棘手。如果程序A中的第一個數據步執行時出錯,其餘的則不執行,則在程序A結束時,syserr仍爲0。一旦發生錯誤,我需要宏變量值爲0以外的值,並且值可以保持到程序結束。

如果程序依賴性基於其他條件(比如值),則用戶定義的宏變量可以處理該條件。對於與系統錯誤有關的東西,我認爲SAS已經有一些東西可以做到這一點。但是除了syserr之外,我找不到任何東西,這似乎沒有幫助。

注:我找到這個SAS stop on first error。但基本上它是在每個數據步驟之後檢查錯誤狀態。如果程序A包含50多個數據步驟,那聽起來很瘋狂。

回答

5

簡單 - 只需使用syscc

SYSCC是一個讀/寫自動宏變量,可用於 重置作業條件代碼,並從條件恢復 防止隨後的步驟的運行。

documentation,但我猜你會尋找類似:

%if &syscc > 4 %then %do; 
    %inc "/mypath/pgmB.sas"; 
%end; 
%else %do; 
    %inc "/mypath/pgmA.sas"; 
%end; 

syscc的最高值被保留跨一步邊界,始終以整數來表示錯誤級別。值的示例:

爲SYSCC的值是:

  • 0是沒有錯誤沒有警告
  • 4是警告
  • 大於4意味着發生了錯誤

注意,有是有些東西它不會趕上,但改善它的效果,你可以使用:

options errorcheck=strict; 

最後 - 您提到'sas項目',如果您認爲您使用的是Enterprise Guide,請注意usage note中的建議。

-1

使用一個宏,稱之爲runquitA。在退出的地方在每個proc sql或proc數據的末尾調用此宏;並跑;

例子:

/*Program A*/ 

%macro runquitA; 
    ; run; quit; 
    %if &syserr. ne 0 %then %do; 
    /*Call Program C*/ 
    %end; 
%mend runquitA; 

proc sql; 
    create table class1 as 
    select * from sashelp.class; 
%runquitA; 

data class2; 
    set sashelp.class; 
%runquitA; 

/*Call Program B*/ 

/*end of Program A*/ 
+0

這不回答問題(因爲問題明確提到了這種可能性並要求更好的選擇)。 – Joe

+0

我認爲問題是:如果出現錯誤,如何不繼續運行程序A.如果出現錯誤,請直接運行程序C並且不要運行程序A直到結束。 –

+0

閱讀問題的最後一段。 – Joe

2

您可以定義保留的錯誤狀態跟蹤宏和每一步後運行此。該宏看起來像這樣:

%macro track_err; 
    %global err_status; 
    %let err_status = %sysfunc(max(&err_status, &syserr ne 0)); 
%mend; 

下面的使用示例。首先初始化該值以跟蹤整體錯誤狀態。第一datastep會失敗,第二個會成功運行和err_status終值將是1

%let err_status = 0; 

data oops; 
    set sashelp.doesnt_exist; 
run; 
%track_err; 

data yay; 
    set sashelp.class; 
run; 
%track_err; 

%put &=err_status; 

最終輸出:

ERR_STATUS=1 

至於「聽起來瘋狂後每個檢查狀態步驟'......好吧,SAS並沒有提供你需要的東西,所以唯一的辦法就是在每一步之後都要檢查一下。

編輯:更正 - 看起來像syscc方法在RawFocus的答案中提到的實際上顯示有一些東西,這在SAS中。


如果你想「在混合」多與代碼的檢查,然後再考慮與執行運行/退出宏替換您runquit語句,那麼所有的檢查在一個狀態。它會導致代碼略微更清晰。類似這樣的:

%macro run_quit_track; 
    run;quit; 
    %global err_status; 
    %let err_status = %sysfunc(max(&err_status, &syserr ne 0)); 
%mend; 

%let err_status = 0; 

data oops; 
    set sashelp.doesnt_exist; 
%run_quit_track; 

data yay; 
    set sashelp.class; 
%run_quit_track; 

%put &=err_status;