2016-12-21 20 views
0

午前4時から午前7時の間に更新するSQLデータベースがあります。私は利用可能なデータを抽出する自動化されたプログラムを実行したい。現在、30分ごとにチェックしています。私はこれを達成するSASプログラムを作成しましたが、コードを凝縮して真のループで実行したいと思います。以下は私の現在のコードです。私はコード1のブロックを合計7回繰り返す。データが最初のチェックで利用可能な場合、私のコードはまだ7回実行されます。私はそれがテーブル内のデータを最初に見つけた後に終了したいと思います。私は執拗にループを作成しようとしましたが、すべての努力で失敗しました。Do WhileまたはDo Untilステートメント内でProc SQLステートメントを実行

%Let RecordCount = 0;/*Sets initial Record Count to 0*/ 
%Let min = 30; 

/私は解決策を見つけることができました0記録/

data _NULL_; /*Get the previous Working Day based on todays date*/ 
    DateCheck = weekday(Today()); 
    Select (DateCheck); 
    When (1) Do; 
     call symputx('_ReportDt',intnx('day',Today(),-2)); 
    end; 
    When (2) Do; 
    call symputx('_ReportDt',intnx('day',Today(),-3)); 
    end;          
    otherwise do; 
    call symputx('_ReportDt',intnx('day',Today(),-1)); 
    end; 
    end; 
run; 

/****************************1***************************/ 

Proc Sql noprint; 
    Select Count(ACCOUNT_NUMBER) 
    Into :RecordCount separated by ' ' 
    From Table1 
    WHere Date = &_ReportDt; 
Quit; 

data _null_; 
if &RecordCount = 0 then do; 
          wait_sec= (60*&min); 
          time_slept = sleep(wait_sec,1); 
         end; 
        else do; 
end; 
run; 
+0

'%DO'や'%IF'のようなマクロ条件文を使用する場合は、コードをマクロ定義にラップしてからマクロを呼び出して実行する必要があります。それを試しましたか? – Tom

+0

私はしましたが、成功しませんでした。私もマクロを利用して呼び出しを実行しようとしました。 Proc SQlとデータステップを混在させようとしているからですか?私はproc SQLを実行して、レコードが返されているかどうかを確認したいと思います。彼らがプログラムを終了している場合。そうでない場合は、スリープを30分間実行します。 30分後、proc sqlをもう一度実行します。レコードが返された場合は、プログラムを終了し、もう一度30分待って繰り返します。 – Mark

答えて

0

を受けた後、テーブル再クエリ にしようとするまで、SASが待っていますどのように多くの分を決定します。以下は、私が働くことができたコードです。私はこれが他の誰かを助けることができることを望む

%MACRO SLEEP(MINUTES); 
DATA _NULL_; 
wait_sec= (60*&MINUTES); 
Var1 = sleep(wait_sec,1); 
RUN; 
%MEND SLEEP; 

%MACRO DataCheck(); 
    Proc Sql noprint; 
     Select Count(ACCOUNT) 
     Into :RecordCount separated by ' ' 
     From Table 
     Where Date = &_ReportDt; 
    Quit; 
%DO %WHILE (&RecordCount = 0); 
    Proc Sql noprint; 
     Select Count(ACCOUNT) 
     Into :RecordCount separated by ' ' 
     From Table 
     WHere Date = &_ReportDt; 
    Quit; 
    %SLEEP(15);/*Insert the number of Minutes that you want the program to sleep in between data checks.*/ 
%END; 
/*PROCESS*/ 
%PUT "IT WORKED!"; 
%MEND DataCheck; 

data _null_; 
%DataCheck; 
run; 
関連する問題