楼主: wayne0524
3942 15

[有偿编程] 宏循环的高手请进!求解惑 [推广有奖]

  • 25关注
  • 6粉丝

已卖:1370份资源

讲师

40%

还不是VIP/贵宾

-

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

楼主
wayne0524 发表于 2012-9-20 08:57:58 |AI写论文
30论坛币
我编辑了一段宏循环:(中间代码省略了)
%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,但是不懂如何用循环调用~
请高手赐教

最佳答案

pobel 查看完整内容

data a; input time $ wj : $30. yj : $30. ; code='%'||"mypaid(time="||quote(strip(time))||", data1="||strip(wj)||", data2="||strip(yj)||")"; call execute(code); cards; 10Q4 ht.wj_10Q4 ht.yj_10Q4 10Q3 ht.wj_10Q3 ht.yj_10Q3 07Q1 ht.wj_07Q1 ht.yj_07Q1 ; run;
关键词:宏循环 Input cards Macro Data 编辑

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 2012-9-20 08:57:59

data a;
input  time $  wj : $30.  yj : $30. ;
code='%'||"mypaid(time="||quote(strip(time))||", data1="||strip(wj)||", data2="||strip(yj)||")";
call execute(code);
cards;
10Q4  ht.wj_10Q4  ht.yj_10Q4  
10Q3  ht.wj_10Q3  ht.yj_10Q3  
07Q1  ht.wj_07Q1  ht.yj_07Q1  
;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
zhangzachary + 1 + 1 + 1 精彩帖子

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

和谐拯救危机

藤椅
00810112 发表于 2012-9-21 14:49:35
试试这个吧
%macro loop(yq=11Q3,nto=9);
        %do i =1 %to &nto;
                %mypaid(time=&yq,data1=ht.wj_&yq,data2=ht.yj_&yq) ;
                %let year_tmp=%substr(&yq,1,2);
                %let qurt_tmp=%substr(&yq,4,1);

                %if &qurt_tmp=1 %then %do;
                                %let year_tmp=%eval(&year_tmp-1);
                                %let qurt_tmp=4;
                %end;
                %else %do;
                                %let qurt_tmp=%eval(&qurt_tmp-1);
                %end;
                %let yq = %sysfunc(catt(&year_tmp,Q,&qurt_tmp));
                %if %length(&yq) =3 %then %let yq=%sysfunc(catt(0,&yq));
        %end;
%mend;
%loop;

板凳
henn2010 发表于 2012-9-21 18:16:35
Create another macro to call your macro:

报纸
henn2010 发表于 2012-9-21 18:17:46
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 b;
        set a;
        id = _n_;
run;

%macro run_all(time=,data1=,data2=);
        proc sql;
                select count(*) into :count;
        run;

        %do i = 1 %to &count;
                proc sql;
                        select time into :time,
                                   wj into :wj,
                                   yj into :yj
                        from b
                        where id = i;
                run;
                %mypaid(&time, &wj, &yj);
        %end;
%mend;      

地板
henn2010 发表于 2012-9-21 18:19:34
Sorry, try this one.

7
henn2010 发表于 2012-9-21 18:20:05
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 b;
        set a;
        id = _n_;
run;

%macro run_all();
        proc sql;
                select count(*) into :count
                from b;
        run;

        %do i = 1 %to &count;
                proc sql;
                        select time into :time,
                                   wj into :wj,
                                   yj into :yj
                        from b
                        where id = i;
                run;
                %mypaid(&time, &wj, &yj);
        %end;
%mend;      

8
wayne0524 发表于 2012-9-21 21:14:46
pobel 发表于 2012-9-20 10:20
data a;
input  time $  wj : $30.  yj : $30. ;
code='%'||"mypaid(time="||quote(strip(time))||", d ...
就是 你这个了!

9
wayne0524 发表于 2012-9-21 21:22:08
henn2010 发表于 2012-9-21 18:20
data a;
input  time $  wj $  yj $ ;cards;
10Q4  ht.wj_10Q4  ht.yj_10Q4
您这个也不错,但是不如一楼的清晰简洁~~抱歉,分不能给你了
不过还是谢谢您的其它答案

10
wayne0524 发表于 2012-9-21 21:23:11
henn2010 发表于 2012-9-21 18:20
data a;
input  time $  wj $  yj $ ;cards;
10Q4  ht.wj_10Q4  ht.yj_10Q4
您这个也不错,但是总体不如一楼的清晰简洁,抱歉,分不能给你了。
不过,还是谢谢您提供的另一种思路!

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 04:26