楼主: peterpan_aus
1410 8

[问答] 谁能帮忙解释一下下面程序运行机制 [推广有奖]

  • 5关注
  • 0粉丝

已卖:49份资源

讲师

61%

还不是VIP/贵宾

-

威望
0
论坛币
544 个
通用积分
6.5202
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
6198 点
帖子
214
精华
0
在线时间
855 小时
注册时间
2007-12-18
最后登录
2023-7-4

楼主
peterpan_aus 发表于 2013-5-31 19:43:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
%macro DownloadCPMBData(numofmonths);

%do i=1 %to (&numofmonths.);
    %if %eval(&i.)=1 %then %do;
    %let gg=test;
%put ≫
    %end;
    %else %do;
                data _null_;
                 call symput('eom',PUT(INTNX('MONTH',today(),-(%eval(&i.)+1), 'end'),yymmddn8.));
                 %PUT &eom.;
                 run;

         %end;
         
                                                           
%end;

%mend DownloadCPMBData;

%DownloadCPMBData(12);



为什么有WARNING: Apparent symbolic reference EOM not resolved.
&eom.

不是第一次到不了else里面的吗?

第二个问题是下面
%macro DownloadCPMBData(numofmonths);
data _null_;
%do i=1 %to (&numofmonths.);
    %if %eval(&i.)=1 %then %do;
    %let gg=test;
%put ≫
    %end;
    %else %do;
               
                 call symput('eom',PUT(INTNX('MONTH',today(),-(%eval(&i.)+1), 'end'),yymmddn8.));
                 %PUT &eom.;
            

         %end;
         
                                                           
%end;
run;
%mend DownloadCPMBData;

%DownloadCPMBData(12);

如果把data  _null_放到最外面就出不来结果,这是为什么。我想知道macro运行的原理。有哪位高手能解释一下吗?
谢谢了


二维码

扫码加我 拉你入群

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

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

关键词:Reference download apparent Symbolic resolved 程序

沙发
boe 发表于 2013-5-31 20:18:06
把%PUT &eom.;放在run;后面就可以了。
call symput定义的宏变量不能在本data步中引用。
如果想查看&eom.的情况可在run;之前用eom=symget('eom');put eom=;就可以了。
Gorgeous girl , I love !

藤椅
peterpan_aus 发表于 2013-5-31 20:28:16
boe 发表于 2013-5-31 20:18
把%PUT &eom.;放在run;后面就可以了。
call symput定义的宏变量不能在本data步中引用。
如果想查看&eom.的 ...
谢谢这位朋友了,但是我想知道为什么%PUT &eom.;就一定要放在run之后呢?为什么只是第一次的时候出错后来就好了呢?

call symput定义的宏变量不能在本data步中引用。这句话没太看明白call为什么不能再本data步里运行呢?

板凳
peterpan_aus 发表于 2013-6-1 07:57:38
还有人知道更好的答案吗?

报纸
Eternal0601 发表于 2013-6-1 11:02:32
peterpan_aus 发表于 2013-6-1 07:57
还有人知道更好的答案吗?
boe的解释即正解,call symput语句本身是可以在data里用,但是定义出来的宏变量var不能在同一个data里用类似%put  &var;直接应用,但是可以在另外一个新的data中用; 如果非要在同一个data步中引用需要用到symget函数

地板
peterpan_aus 发表于 2013-6-1 12:19:12
ok 明白了谢谢

7
boe 发表于 2013-6-1 13:07:28
Eternal0601 发表于 2013-6-1 11:02
boe的解释即正解,call symput语句本身是可以在data里用,但是定义出来的宏变量var不能在同一个data里用类 ...
happy brithday!
Gorgeous girl , I love !

8
peterpan_aus 发表于 2013-6-3 08:07:23
谁b'day ?anyway happy b'day

9
soporaeternus 发表于 2013-6-3 15:41:39
解析data步的时候,这个macro还不存在
这个macro的定义是在执行中产生的
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
boe + 1 + 1 + 1 精彩帖子

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

Let them be hard, but never unjust

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 02:02