Делать Пока, Делать, пока все даты наблюдения не равны сегодня () sas proc sql - PullRequest
0 голосов
/ 22 января 2019

Я должен запускать отчет каждое утро, но не могу, пока все таблицы, из которых я запрашиваю, не были обновлены за этот день.

Я хочу создать макрос, который не продолжает обработку sasпока все таблицы не обновятся.Существует одна таблица со всеми таблицами в SSDM и датой и временем их обновления.Для более простых целей я назову эту таблицу Info, а имена столбцов - tablename и dateupdated.Таблицы, которые я буду использовать, это table1, table2 и table3 из n таблиц.

%macro Updated;

proc sql;
create table Data_ready as
select 
tablename,
dateupdated,
case when dateupdated=today() then 'Ready'
 else 'Not Ready'
 end as 'Status'
from Info
where tablename in (table1, table2, ..., tablen)
quit;


%if count(Data_ready.Status = 'Ready') ne count(Data_ready.tablename) %then %do;
proc sql;
drop table work.Data_ready
;quit;
sleep(60*30,1);
%end;
%else %do;
proc print data=Data_ready;
run;
%end
%mend;
*here I will have the rest of the code to produce the report knowing that the information is up to date

Есть ли способ сделать это с помощью do while или do before?Я пытался выяснить, какой-то макрос, но я сталкиваюсь с некоторыми проблемами, чтобы убедиться, что все таблицы обновляются, прежде чем идти вперед.Заранее спасибо.

1 Ответ

0 голосов
/ 22 января 2019

Вот пример кода (непроверенный), который использует DICTIONARY.TABLES для проверки метки времени изменения набора данных и подсчитывает, сколько из них соответствует today().Try_limit также используется для предотвращения бесконечного ожидания.

%macro wait_for_all_today (libname=);

  %local today_count all_count;
  %local try try_limit try_wait_s;
  %local rc;

  %let try = 0;
  %let try_limit = 10;
  %let try_wait_s = 60;

  %do %until (&today_count = &all_count or &try > &try_limit);
    %let try = %eval (&try + 1);
    %if &try > 1 %then %do;
      %let rc = %sysfunc(sleep(&try_wait_s, 1));
    %end;
    proc sql noprint;
      select count(*), sum(today()=datepart(moddate)) 
      into :all_count, :today_count
      from dictionary.tables
      where libname = "%sysfunc(upcase(&libname))"
        and memtype = "DATA"
      ;
    quit;

    %* at this point today_count and all_count 
    %* have values that will be used in the UNTIL evaluation;
  %end;

  %if &today_count ne &all_count %then %do;
    %put ERROR: Not all data sets in Library &libname were updated today. Waited a bunch of times;
    %abort cancel;
  %end;

%mend;
...