2015-10-09 62 views
0

我的編程經驗非常有限,所以如果可能的話,需要相當基本的回答。 我有我的第一個表的呼叫細節,然後第二個表的地址在呼叫ID匹配 我的問題是當第一個表返回零結果(這將發生更多的時候比沒有)第二個表錯誤,因爲沒有數據在第一張桌子。 所以我想在第一個表執行後,如果有零結果,然後停止/退出,如果有結果,然後繼續。我已經看過這個了,但是我發現的所有解決方案都非常技術性,而且我不會停下來理解所有建議的,因此我一直無法實現。所以我已經說過,我真的需要一個非常簡單和易於理解的解釋,這個解釋對於具有非常基本的編程知識的人或者有什麼可以解決這個問題的建議有幫助。謝謝SAS當obs爲零時退出,然後退出其他繼續

+0

一般而言,步驟不會因操作返回0個觀察值而停止。如何做到這一點取決於你在做什麼步驟。發佈您正在執行的步驟類型的示例,以便我們可以針對該情況發佈答案。 – Tom

回答

0

我有同樣的問題,用簡單的宏定這樣的:

%macro check_data(table=); 

data _null_; 
    call symput('varnobs',n_obs); 
    stop; 
    set &table nobs=n_obs; 
run; 

%if &varnobs = 0 %then %do; 
    ENDSAS; 
%end; 

%mend check_data; 
%check_data("table1"); 

簡短的說明,你給宏您表的名稱,它計算的obervations並將它們寫入macrovariable varnobs。使用stop是因爲在執行set-statement之前計算nobs,所以我在它之前停止datastep。根據varnobs中的數字,你可以像你想要的那樣行事,比如關閉中止或者結束進程,執行特定代碼等等......

我必須承認,使用ENDSAS是可以討論的命令,因爲它關閉了所有的東西,更好的辦法是使用一個合乎邏輯的做法,像

%if &varnobs ne 0 %then %do; 
data table2; 
*do your second dataset operation inside the macro only when varnobs is not 0...; 
run; 
%end; 

或者是把整個代碼到宏...

我希望這個代碼是你有足夠的基礎,在那一刻我想不出不使用宏變量的解決方案...

+0

嗨感謝您的回覆。我已經嘗試將以上代碼添加到我的代碼中,但是我有一些錯誤。 %macro check_data(table = qldreps); data_null_;調用symput('varnobs',n_obs); stop; set&qldreps nobs = n_obs;跑; %如果&varnobs = 0%,則%do; ENDSAS; %結束;%修正check_data; %check_data(「qldreps」); PROC SQL; CREATE TABLE qldreps AS SELECT c.incident_number, c.incident_type FROM 1 AS c,2 as a c.zone = a.zone QUIT; proc sql; CREATE TABLE detail AS SELECT a.incident_number FROM 1 as a,3 as b WHERE a.incident_number = b.incident_number; QUIT; – Malibu2012

+0

@ malibu2012 hm,我看到的一個錯誤是'set&qldreps'。你必須使用'set&table',table是你在這裏引用的變量,qldreps只是一個表名。如果表名總是相同的,你可以在宏定義和調用中刪除(table = qldreps),並在宏內寫入'set qldreps'。但是由於註釋中的格式化,在這裏很難分析你的代碼。你的宏調用'%check_data(「qldreps」); '必須在創建表之後,所以將它放在proc sql – kl78

+0

最適合測試的位置,只需將我的代碼複製到它的答案中,然後在%m​​end check_data之間插入用於表創建的proc sql;和 %check_data(「qldreps」); – kl78

0

感謝kl78

我抄你提供的是和現在的代碼我得到一個錯誤說:「更多的位置參數中所定義的」

我有我的代碼如下

%宏check_data(表= qldreps);

data null;

call symput('varnobs',n_obs); 

stop; 

set &table nobs=n_obs; 

run;

%if & varnobs = 0%then%do;

ENDSAS; 

%end;

%修復check_data;

proc sql;

創建表qldreps作爲

選擇c.incident_num,

c.incident_type 

從CAD。incindet as c

其中c.incident_type = 601;

quit;

%check_data(「qldreps」);

proc sql;

創建表詳細地

選擇b.details

從qldreps爲a,

cad.incident_detail as b 

其中a.incident_number = b.incident_number;

quit;

我沒有得到什麼?謝謝

+0

如果將一個參數定義爲named(帶有等號),則不能轉身稱呼它,就好像將其定義爲位置一樣。最簡單的改變是在宏調用中添加參數名稱。 '%check_data(表= qldreps)'。也不要在參數值周圍加引號。在這種情況下,它會導致SAS在當前目錄中查找名爲「qldreps.sas7bdat」的文件,而不是使用數據集work.qldreps。 – Tom

相關問題