SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1105|回复: 4
打印 上一主题 下一主题

请帮忙指点一下code,看这个macro问题在哪里?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-11-9 13:21:57 | 只看该作者

请帮忙指点一下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)
请高手指点一下错在何处,如何改正?
谢谢!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-11-9 23:55:07 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-11-10 10:35:51 | 只看该作者

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不产生任何错误提示,而一切的错误的提示由我来确定.
希望高手指点,谢谢!
谢谢楼上!!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-11-10 22:57:04 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-11-11 04:32:39 | 只看该作者

Re: 请帮忙指点一下code,看这个macro问题在哪里?

how about this one:

%macro sample(time=);

        data  _null_;         
                dat=input("&time",date9.);
                if missing(dat) then put "ERROR:";
        run;

%mend;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-5-7 06:14 , Processed in 0.071803 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表