SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 717|回复: 1
打印 上一主题 下一主题

求好心人帮我一句句解释下程序

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-4-29 09:55:44 | 只看该作者

求好心人帮我一句句解释下程序

%macro kk;
proc sql;
select edition into :edit_p
from yrl.mt0001
where ED_OPITION="Y" and BS="YL";
quit;
data tmp1(keep=edition);
set yrl.surl0003;
where substr(edition,1,6)="&edit_p";
run;
proc sort data=tmp1 nodupkey;by edition;run;

proc sql;
create table tmp2 as
select *,count(*) as nu
from tmp1;
quit;

data _null_;
set tmp2;
if nu ne 0 then
if input(substr(edition,7,2),2.)+1 >9 then
call symput('new_edition',compress(substr(edition,1,6)||put(input(substr(edition,7,2),2.)+1,2.)));
else
call symput('new_edition',compress(substr(edition,1,6)||"0"||put(input(substr(edition,7,2),2.)+1,2.)));
else call symput('new_edition',compress("&edit_p"||"01"));
run;
data _null_;
call symput('edit52',compress(substr("&edit_p",5,2)));
run;
%put &edit52;
%if "&edit52" ne "Q0" %then %do;
                               %let T=OK;
                               %let T2=&edit_p;
                               %end;
                               %else %do;
                               %let T=ON;
                               %let T2=季度版本不存在;
   %end;
...............
put '<td height=30 align="center"  width="400" colspan="4" >';
put '<p align="center"> <b><font class="HighLight">原料季度预算数据生成</font></b></p>';
put '</td>';
put '</tr></table>';
put '<table border="1" width="400" height="30" bordercolor="#9DBDFF" style="border-collapse: collapse" cellpadding="0" cellspacing="0">';
put '<tr>';
put '<td align="right"><font class="English">版本:</td>';
put "<td align='left'><font class='English'>&T2</td>";
put '<td align="right"><font class="English">版本序号:</td>';
put '<td align="left"><select name="EDITION_NUM">';
put "<option value=&new_edition>新序号</option>";
run;
%let id=%sysfunc(open(tmp1));
%do %while(%sysfunc(fetch(&id))=0);
%let  kk1=%sysfunc(getvarc(&id,1));
data _null_;
file _webout;
put "<option value=&kk1>&kk1</option>";
run;
%end;

注:yrl.mt0001, yrl.surl0003是表的名字,前面几乎可以看懂主要是后半部分data _null_;
set tmp2;开始不是很了解,请帮我解释下句子    HTML那段基本了解HTML下面那几句不是很懂  谢谢了!能全解释当然最好 (*^__^*) 嘻嘻
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-4-29 12:42:18 | 只看该作者

Re: 求好心人帮我一句句解释下程序

[code:2mbh5gjj]%macro kk;
        /* 用SQL创建宏变量edit_p */
        /* yrl.mt0001表,条件ed_opition为Y、bs为YL的edition的值 */
        proc sql;
                select edition into :edit_p
                        from yrl.mt0001
                        where ED_OPITION="Y" and BS="YL";
        quit;
        /* 根据宏变量edit_p的值取yrl.surl0003的子集 */
        /* temp1保留1个变量edition,长度为9,前6位为字符,后2位为数字 */
        data tmp1(keep=edition);
                set yrl.surl0003;
                /* 取edition的前6位与edit_p的值比较 */
                where substr(edition,1,6)="&edit_p";
        run;
        /* 升序排tmp1,删除重复 */
        proc sort data=tmp1 nodupkey;
                by edition;
        run;
        /* 用SQL创建数据集tmp2 */
        /* 汇总变量nu存储edition的个数,并拼和到原始数据的各行 */
        /* 如tmp1为空,则nu为0 */
        proc sql;
                create table tmp2 as
                        select *,count(*) as nu
                                from tmp1;
        quit;
        /* 根据tmp2中edition和nu的值创建宏变量new_edition */
        data _null_;
                set tmp2;
                /* 当nu不为0时 */
                if nu ne 0 then
                        /* 当edition的后2位>9时,new_edition为edition的值加1 */
                        if input(substr(edition,7,2),2.)+1 >9 then
                                call symput('new_edition',compress(substr(edition,1,6)||put(input(substr(edition,7,2),2.)+1,2.)));
                        /* 当edition的后2位为1-9时,new_edition为edition的值加1(补0) */
                        else
                                call symput('new_edition',compress(substr(edition,1,6)||"0"||put(input(substr(edition,7,2),2.)+1,2.)));
                /* 当nu=0时,为宏变量edit_p的值拼上01 */
                else call symput('new_edition',compress("&edit_p"||"01"));
        run;
        /* 创建宏变量edit52,值是宏变量edit_p的值第5和第6个字符 */
        data _null_;
                call symput('edit52',compress(substr("&edit_p",5,2)));
        run;
        /* put宏变量edit52的值 */
        %put &edit52;
        /* 根据宏变量edit52的值,创建宏变量t,t2 */
        %if "&edit52" ne "Q0" %then
                %do; /* 不等于Q0 */
                        %let T=OK;
                        %let T2=&edit_p;
                %end;
        %else
                %do; /* 等于Q0 */
                        %let T=ON;
                        %let T2=季度版本不存在;
                %end;
        /* ○秘密 ○机密 ●绝密 */
        /* 警告:已拒绝未知用户的非法访问,核心代码已自动销毁! */
        /*............... */
                put '<td height=30 align="center" width="400" colspan="4" >';
                put '<p align="center"> <b><font class="HighLight">原料季度预算数据生成</font></b></p>';
                put '</td>';
                put '</tr></table>';
                put '<table border="1" width="400" height="30" bordercolor="#9DBDFF" style="border-collapse: collapse" cellpadding="0" cellspacing="0">';
                put '<tr>';
                put '<td align="right"><font class="English">版本:</td>';
                put "<td align='left'><font class='English'>&T2</td>";
                put '<td align="right"><font class="English">版本序号:</td>';
                put '<td align="left"><select name="EDITION_NUM">';
                put "<option value=&new_edition>新序号</option>";
        run;
        /* 打开tmp1表 */
        %let id=%sysfunc(open(tmp1));
        /* 用%do%while依次获取tmp1的每条观测 */
        %do %while(%sysfunc(fetch(&id))=0);
                /* 创建宏变量kk1,值为tmp1中edition的值 */
                %let kk1=%sysfunc(getvarc(&id,1));
                /* 输出kk1的值 */
                data _null_;
                        file _webout;
                        put "<option value=&kk1>&kk1</option>";
                run;
        %end;[/code:2mbh5gjj]
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 06:45 , Processed in 0.115871 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表