楼主: melonli1976
2117 9

关于macro错误 [推广有奖]

  • 0关注
  • 0粉丝

小学生

21%

还不是VIP/贵宾

-

威望
0
论坛币
5 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
45 点
帖子
6
精华
0
在线时间
4 小时
注册时间
2014-9-1
最后登录
2017-10-26

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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;

二维码

扫码加我 拉你入群

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

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

关键词:Macro acr CRO Mac Payment

沙发
melonli1976 发表于 2014-9-1 17:19:00 |只看作者 |坛友微信交流群
有老师么

使用道具

藤椅
melonli1976 发表于 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 ;

使用道具

板凳
Tigflanker 发表于 2014-9-1 17:40:52 |只看作者 |坛友微信交流群
  1. data one;
  2.   input month @@;
  3.   array p p1 - p12;

  4.   do over p;
  5.     p = _i_ * 10;
  6.   end;

  7.   cards;
  8.   5 10
  9. ;run;

  10. data two;
  11.   set one;
  12.   array pay payment1 - payment12;
  13.   array p p1 - p12;
  14.   
  15.   do over p;
  16.     pay = ifn(_i_ > month,p,.);
  17.   end;
  18. run;
复制代码

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

你一定想写成宏的话,data步内嵌套会比较容易出错啊,
因为你只能用call execute或者resolve来在data步中进行传值交互、而且你还需要宏的生成语句。
array可以说是data步内的宏,推荐使用啊。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
jingju11 + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

报纸
pobel 在职认证  发表于 2014-9-2 08:54:30 |只看作者 |坛友微信交流群
错误的原因是在%let m=%eval(&i-&month);这句。

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

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

使用道具

地板
melonli1976 发表于 2014-9-2 09:47:25 |只看作者 |坛友微信交流群
还是不行。
MONTH=MONTH(BOOKING_DATE);
L=sum( of p1-p36);


%payment(mont=month);

使用道具

7
melonli1976 发表于 2014-9-2 09:55:08 |只看作者 |坛友微信交流群
%macro payment (mont=);


%do i=2 %to 12;


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


%end;


%mend payment ;

使用道具

8
pobel 在职认证  发表于 2014-9-2 11:10:45 |只看作者 |坛友微信交流群
melonli1976 发表于 2014-9-2 09:47
还是不行。
MONTH=MONTH(BOOKING_DATE);
L=sum( of p1-p36);
您的调用%payment(mont=month);中mont的值还是month这个字符串,而并不是变量的值,所以还会出现同样的问题。

使用道具

9
pobel 在职认证  发表于 2014-9-2 11:16:00 |只看作者 |坛友微信交流群
melonli1976 发表于 2014-9-2 09:55
%macro payment (mont=);
还有一个疑问,楼主为什么要在这里用宏?直接用data步里的语句不能实现么?

使用道具

10
melonli1976 发表于 2014-9-10 16:03:48 |只看作者 |坛友微信交流群
最后用数组在DATA步直接实现了

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 00:42