标题: 请帮忙指点一下code,看这个macro问题在哪里? [打印本页] 作者: shiyiming 时间: 2011-11-9 13:21 标题: 请帮忙指点一下code,看这个macro问题在哪里? 在写个MACRO: %macro aa(name=, time=);. . .;%mend;
在这个macro里,首先要检查name是不是正确(所有name存在data class里),如果name出错,要求在SAS log里给出提示;
还有,要检查time的format是不是date9.,如果不是,要求在SAS log里给出提示.
我是这样写的,但发现有问题,请高手指教.
%macro aa(name=, time=);
proc sql noprint;select distinct name into :names separated by ' ' from class;quit;
%if %upcase(&name.) not in %upcase(&names.) %then %do;
%put error: &name. is invalid.;
%end;
%if %sysfunc(vformat(&time.))^='DATE9.' %then %do;
%put error: &time. format is invalid;
%end;
. . .
%mend;
%aa(name=Abc,time=01/01/2011)
请高手指点一下错在何处,如何改正?
谢谢!!!作者: shiyiming 时间: 2011-11-9 23:55 标题: Re: 请帮忙指点一下code,看这个macro问题在哪里? 我觉得Vformat() 适应于检查 Dataset 里变量的格式,不适用于 Macro 变量。同样 in () 也不适用于 Macro 变量 time。 比如你可以检查macro 变量 time 所指代的dataset 变量是否符合格式如下例。
若要检查time的值是否符合格式,把值分成三段,检查每段是否落于值域内:
前段(1 -31)中段(JAN FEB MAR ... DEC), 末段我也说不好,至少应是数字。
或许有其它更简单的方法?
%macro (name=,time=);
proc sql;
select distinct name into: fdname
from class
where name eq "&name";
%if &sqlobs ne 0 %then %do;
%put Found IT;
%put name= &fdname;
%end;
select fomat from dictionary.columns
where libname eq "WORK" and memname eq "CLASS"
and name eq "&time" and format eq "DATE9.";
%if &sqlobs eq 1 %then %put Format date9;
quit;
%mend;作者: shiyiming 时间: 2011-11-10 10:35 标题: Re: 请帮忙指点一下code,看这个macro问题在哪里? 第一个很好,但第二个不行.
对于第二个,我只要确定输入的time的format是否date9.,而这个time值未必出现在class里.
根据你第一个里&sqlobs的功能,我这样做的:
%macro aa(name=,time=);
. . .
data a; y="&time."d.;run;
proc sql noprint;select * from a;quit;
%if &sqlobs=0 %then %do;
%put error.;
%end;
%mend;
这个对于有些能行,但问题是SAS 本身就给出了ERROR的提示,而这个提示却不全是由我来产生的,我希望的是SAS不产生任何错误提示,而一切的错误的提示由我来确定.
希望高手指点,谢谢!
谢谢楼上!!!作者: shiyiming 时间: 2011-11-10 22:57 标题: Re: 请帮忙指点一下code,看这个macro问题在哪里? [code:1bp0a441]%macro aa(name=, time=);
data _null_;
var="&time";
if not find(&name.,&names.,'i') then put "error: " "&name" " is invalid.";
if vformat(var)^='DATE9.' then put "error:" "&time." " format is invalid";
run;
%mend;
%aa(name=Abc,time=01/01/2011)
[/code:1bp0a441]作者: shiyiming 时间: 2011-11-11 04:32 标题: Re: 请帮忙指点一下code,看这个macro问题在哪里? how about this one:
%macro sample(time=);
data _null_;
dat=input("&time",date9.);
if missing(dat) then put "ERROR:";
run;