楼主: wayne0524
1341 5

高手进!!宏循环 调用问题 亟待解决 [推广有奖]

  • 25关注
  • 6粉丝

讲师

40%

还不是VIP/贵宾

-

威望
0
论坛币
4529 个
通用积分
8.3706
学术水平
30 点
热心指数
44 点
信用等级
30 点
经验
8310 点
帖子
367
精华
0
在线时间
488 小时
注册时间
2007-2-3
最后登录
2022-11-2

40论坛币
我编辑了一段宏循环:(中间代码省略了)
%macro mypaid(time=,data1=,data2=);
。。。。。。
%mend;                                                                                                                                                                                                                                                   
  %mypaid(time="2010Q4",data1=ht.wj_10Q4,data2=ht.yj_10Q4) ;

日期是从 07Q1 到10Q4的季度时点,,相应的宏可能调用调用数据集我也生成了。。。
我现在跑一次会生成一个我要的结果,但是下次就又要 修改一次%mypad 时间点的参数,次数太多太麻烦

请高手如何用一个循环解决  我一次次重复 修改 参数的问题?
我想到的方法是把需要修改的的参数做成一个专门的数据集,比如
data a;
input  time $  wj $  yj $ ;cards;
10Q4  ht.wj_10Q4  ht.yj_10Q4  
10Q3  ht.wj_10Q3  ht.yj_10Q3  
.......
07Q1  ht.wj_07Q1  ht.yj_07Q1  
;
run;
然后通过一个循环调用出来放进%mypaid,但是不懂如何编程用循环调用数据集~

或者有高手能通过别的方法实现这个循环也可以,
请高手赐教!

关键词:亟待解决 宏循环 Macro Input cards 如何
沙发
ziyenano 发表于 2012-9-20 09:32:41 |只看作者 |坛友微信交流群
call execute 实现数据步与宏的交互;
data _null_;
set a;
call execute(compress('%mypaid(time='||time||',data1='||wj||',data2='||yj||')'));
run;

不过下面数据集a有问题
$默认8个字符长度, 下面数据长度超过8,数据会截断,改一下长度。


使用道具

藤椅
nomad5 发表于 2012-9-20 12:42:15 |只看作者 |坛友微信交流群
  1. %macro test(low=,high=);
  2.     %let _low=%sysfunc(inputn(%substr(&low.,1,2),best.));   /*最小年份*/
  3.     %let _high=%sysfunc(inputn(%substr(&high.,1,2),best.)); /*最大年份*/

  4.     %do i=&_low. %to &_high.;   /*根据年份做循环*/
  5.         %let ic=%sysfunc(putn(&i.,z2.));    /*将个位数补足2位*/
  6.         %do j=1 %to 4;      /*季度循环*/

  7.         %if &ic.&j.<%sysfunc(compress(&low.,,kd)) or &ic.&j.>%sysfunc(compress(&high.,,kd))  %then %goto exit;  /*季度小于定义的最小值或大于最大值则跳出*/
  8.         %else %do;
  9.             %let time=20&ic.Q&j.;         /*定义time*/
  10.             %let date1=ht.wj_&ic.Q&j.;      /*定义date1*/
  11.             %let date2=ht.yj_&ic.Q&j.;      /*定义date2*/
  12.             %put &time.;
  13.             %put &date1.;
  14.             %put &date2.;


  15.         %end;
  16.         %exit:
  17.         %end;
  18.     %end;
  19. %mend;
  20. %test(low=07Q2, high=10Q1);
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
webgu + 1 + 1 + 1 精彩帖子

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

使用道具

板凳
kittyforever 发表于 2013-1-17 16:50:23 |只看作者 |坛友微信交流群
学习

使用道具

报纸
chenys625 发表于 2013-1-26 20:37:38 |只看作者 |坛友微信交流群
个人认为还是 call execute 比较好。我比较喜欢用cats,不用写那些||了 呵呵~

使用道具

地板
Bridgenc 发表于 2013-1-26 23:43:04 |只看作者 |坛友微信交流群
data a;
input  time $  wj $  yj $ ;cards;
10Q4  ht.wj_10Q4  ht.yj_10Q4  
10Q3  ht.wj_10Q3  ht.yj_10Q3  
.......
07Q1  ht.wj_07Q1  ht.yj_07Q1  
;
run;

data a2;
  set a;
  num=_n_;
run;

if max num is n then

%global par1 par2 par3;
%let par1=;
%let par2=;
%let par3=;

%macro get_par(count=);
proc sql;
  select time, wj,  yj into :par1, :par2, :par3
  from a2
  where num=&count;
quit;
%mend;

%macro rerun(total=);
  %do i=1 % to $total;
  %get_par(count=&i);
  %mypaid(time=&par1;,data1=&par2,data2=&par3) ;
%end;
%Mend;

%re_run(total=n);

使用道具

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

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

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

GMT+8, 2024-4-28 13:45