2013-02-13 3 views
0

Вот макрос я бегу ....Как сравнить значения даты в макросе?

%macro ControlLoop(ds); 
      %global dset nvars nobs; 
      %let dset=&ds; 
      /* Open data set passed as the macro parameter */ 
      %let dsid = %sysfunc(open(&dset)); 
     /* If the data set exists, then check the number of obs ,,,then close the data set */ 
     %if &dsid %then %do; 
       %If %sysfunc(attrn(&dsid,nobs))>0 %THEN %DO;; 
         %local dsid cols rctotal ; 
         %let dsid = %sysfunc(open(&DS));  
         %let cols=%sysfunc(attrn(&dsid, nvars)); 
        %do %while (%sysfunc(fetch(&dsid)) = 0); /* outer loop across rows*/ 
             /*0:Success,>0:NoSuccess,<0:RowLocked,-1:eof reach*/ 

     %If fmt_start_dt<=&sysdate9 and fmt_end_dt>=sysdate9 %then %Do; 
          %do i = 1 %to &cols; 
     %local v t; /*To get var names and types using 
       varname and vartype functions in next step*/ 
           %let v=%sysfunc(varname(&dsid,&i)); /*gets var names*/ 
           %let t = %sysfunc(vartype(&dsid, &i)); /*gets variable type*/ 
           %let &v = %sysfunc(getvar&t(&dsid, &i));/*To get Var values Using 
                  GetvarC or GetvarN functions based on var data type*/ 
          %end; 
          %CreateFormat(dsn=&dsn, Label=&Label, Start=&Start, fmtName=&fmtName, type=&type); 
         %END; 
         %Else %put ###*****Format Expired*****; 
        %END; 
       %END; 
       %else %put ###*****Data set &dset has 0 rows in it.*****; 

       %let rc = %sysfunc(close(&dsid)); 
      %end; 
     %else %put ###*****open for data set &dset failed - %sysfunc(sysmsg()).*****; 
     %mend ControlLoop; 

     %ControlLoop(format_control); 

FOrmat_Control данных:

DSN :$12. Label :$15. Start :$15. fmtName :$8. type :$3. fmt_Start_dt :mmddyy. fmt_End_dt :mmddyy.; 
ssin.prd prd_nm prd_id mealnm 'n' 01/01/2013 12/31/9999 
ssin.prd prd_id prd_nm mealid 'c' 01/01/2013 12/31/9999 
ssin.fac fac_nm onesrc_fac_id fac1SRnm 'n' 01/01/2013 12/31/9999 
ssin.fac fac_nm D3_fac_id facD3nm 'n' 01/01/2013 12/31/9999 
ssin.fac onesrc_fac_id D3_fac_id facD31SR 'n' 01/01/2013 02/01/2012 
oper.wrkgrp wrkgrp_nm wrkgrp_id grpnm 'n' 01/01/2013 12/31/9999 

Как я могу сравнить fmt_Start_dt и fmt_end_dt с SYSDATE? Я пробовал что-то вроде %If fmt_start_dt<=&sysdate9 and fmt_end_dt>=sysdate9 %then %Do; в коде, но значения не собираются в цикле .... Любая идея ??? Заранее спасибо ....

ответ

1

Я не совсем уверен, что вы хотите, но я думаю, что это может работать:

%if &fmt_start_dt <= %sysfunc(today()) and &fmt_end_dt >= %sysfunc(today()) 

Вашего FETCH функция скопирует набор данных переменных макропеременных, так что вам нужно ссылаться на них амперсандом. Кроме того, вы должны использовать функцию TODAY(), а не макрокоманду SYSDATE9.

+0

, я пробовал ваш код, но вот проблема ... Оба fmt_start_dt и fmt_end_dt находятся в форматах date9 ... Когда я попытался выполнить свой код, я получаю следующую ошибку ... ПРЕДУПРЕЖДЕНИЕ: Явная символическая ссылка FMT_START_DT не разрешена. ОШИБКА. В функции% EVAL или% IF, где требуется числовой операнд, был найден операнд символов. Условие: & fmt_start_dt <=% sysfunc (today()) and & fmt_end_dt> =% sysfunc (today()) ВНИМАНИЕ: Явная символическая ссылка FMT_END_DT не разрешена. ОШИБКА: макрос CONTROLLOOP прекратит выполнение. –

+0

Он отлично работал, перемещая петлю условий даты до Inner loop ... –

 Смежные вопросы

  • Нет связанных вопросов^_^