全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2519 9
2014-09-01
979  %payment(month);
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: 2-month
ERROR: 宏 PAYMENT 将终止执行。


这样调用的,
MONTH=MONTH(BOOKING_DATE);
%payment(month);‍


现在的宏是这样的,
‍ %macro payment (month);

%do i=2 %to 12;

  %let m=%eval(&i-&month);
  if &m<=0 then stop;
  payment&i=p&m;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-9-1 17:19:00
有老师么
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-9-1 17:19:53
%macro payment (month);

%do i=2 %to 12;

  %let m=%eval(&i-&month);
  if &m<=0 then stop;
  payment&i=p&m;

%end;

%mend payment ;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-9-1 17:40:52
复制代码

原意理解为:对于数据集中的month的值,把大于month的那些变量的值传给payment;
如果是这样的话,用stop是不是狠了点?你可以设置一个warning put或者一个变量也行啊

你一定想写成宏的话,data步内嵌套会比较容易出错啊,
因为你只能用call execute或者resolve来在data步中进行传值交互、而且你还需要宏的生成语句。
array可以说是data步内的宏,推荐使用啊。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-9-2 08:54:30
错误的原因是在%let m=%eval(&i-&month);这句。

你调用%payment(month);,就相当于让宏去运行:%let m=%eval(&i-month);。无论&i是什么值,肯定都会报错的。

楼主要区分开宏定义中的参数 和 调用宏时的参数值
也许在定义宏的时候用 %macro payment (month=);会清楚一些。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-9-2 09:47:25
还是不行。
MONTH=MONTH(BOOKING_DATE);
L=sum( of p1-p36);


%payment(mont=month);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群