SAS中文论坛

标题: 在scl中用rsubmit不能得到obs [打印本页]

作者: shiyiming    时间: 2004-2-9 15:53
标题: 在scl中用rsubmit不能得到obs
用于scl中的程序不能得到obs,而program editor中运行的程序可以,WHY?

/*以下用于program editor中运行*/
rsubmit;
proc sql noprint;
   select count(1) into <!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o -->bs from sashelp.class where age=14;
quit;

%sysrput obs=&amp;obs;
endrsubmit;

%put &amp;obs;


/*以下建立一个scl文件*/
init:
   dcl num obs;

   submit continue;rsubmit;
   proc sql noprint;
      select count(1) into <!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o -->bs from sashelp.class where age=14;
   quit;

   %sysrput obs=&amp;obs;
   endrsubmit;endsubmit;

   obs=symgetn('obs');
   put obs=;
return;
作者: shiyiming    时间: 2004-2-10 09:44
你是要从表中把obs的数取出来呀?我觉得应该这样做,你试试:

init:
dcl num obs;

submit continue;
proc sql noprint;
select count(1) into <!-- s:o --><img src="{SMILIES_PATH}/icon_surprised.gif" alt=":o" title="Surprised" /><!-- s:o -->bs from sashelp.class where age=14;
quit;

endsubmit;

obs=symgetn('obs');
put obs=;
return;

我的程序记录数据集的记录数的程序是这样的,你参考一下
submit continue;
proc sql;                                                                                                                                                                                                                                                      
      select count(*) into :nrecord                                                                                                                                                                                                                             
      from tmp1;                                                                                                                                                                                                                                                
quit;
endsubmit;                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                               
nrecord=symgetn('nrecord');
作者: shiyiming    时间: 2004-2-10 09:47
你以后要注意了,在edit中能运行的程序,在SCL中不一定能成功。需要改动一下的,我以前也遇到过这种情况,好像是运用宏语言是也有不同,具体的我忘了。
作者: shiyiming    时间: 2004-2-10 10:06
同意apan的意见,但是我觉得问题可能出在rsubmit上。
你试试先把obs写成表,再读它。
作者: shiyiming    时间: 2004-2-10 12:31
server端的表,非local,如果本地,我也犯不着再多用一个macro变量了.
注意:我用的是rsubmit.

当然,如果使用call symput(),仍然会有以上同样的问题:
init:
   dcl num obs;

   submit continue;rsubmit;   
   data _null_;
   p=0;
   set lib.dataset point=p nobs=n;  
   call symput('obs',n);
   stop;
   run;
   
   %sysrput obs=&amp;obs;
   endrsubmit;endsubmit;
   
   obs=symgetn('obs');
   put obs=;
return;
作者: shiyiming    时间: 2004-2-10 12:35
可以解决的办法是
%let dsid=%sysfunc(open(lib.dataset));
%sysrput nobs=%sysfunc(attrn(&amp;dsid,nobs));
%let rc=%sysfunc(close(&amp;dsid));

然后在本地用symgetn读出.
作者: shiyiming    时间: 2004-2-10 12:53
shiyiming,为什么他的程序里要加rsubmit?又不是远程调用。
%sysrput obs=&amp;obs;这句话又是什么意思?
作者: shiyiming    时间: 2004-2-10 13:37
apan不会吧?怎么来问我,不问本人呢?
rsubmit就是把语句递交到远程的SAS(一般服务器的配置都比较强劲),这样就不会耗费本地的内存和CPU资源,他只要截获远程执行的结果在本地显示就行了。
%sysrput是将远程的变量赋给本地宏,HELP里写的很明白。真是懒!
作者: shiyiming    时间: 2004-2-11 09:33
<!-- s:P --><img src="{SMILIES_PATH}/icon_razz.gif" alt=":P" title="Razz" /><!-- s:P -->  <!-- s:oops: --><img src="{SMILIES_PATH}/icon_redface.gif" alt=":oops:" title="Embarassed" /><!-- s:oops: -->
作者: shiyiming    时间: 2004-2-12 09:34
一般这些问题都是sas的bug,或者还有很多深奥的东西我还不理解。

我这些日子每天就是忙着给sas公司报bug了,真是搞笑!
作者: shiyiming    时间: 2004-3-8 21:52
标题: SAS peter or dream,can you give me some suggestions!
??
作者: shiyiming    时间: 2004-3-9 11:42
改动一下你的SCL变量名试试:

dcl num obs_scl;

submit continue;rsubmit;
proc sql noprint;
select count(1) into :obs from sashelp.class where age=14;
quit;

%sysrput obs=&amp;obs;
endrsubmit;endsubmit;

obs_scl=symgetn('obs');
put obs_scl=;
return;
作者: shiyiming    时间: 2004-3-10 16:15
我曾经也试过也上的程序,我只想知道为什么?
作者: shiyiming    时间: 2004-3-10 19:51
我猜原因是:SCL中DCL的变量在submit块中是全局宏变量,你在sql中 into的宏变量是局部宏变量,取值被全局变量覆盖;在sysrput中,=&amp;obs实际上是将SCL变量obs的初值(.)赋给了本地宏变量obs,而select into 的局部宏变量在此没有作用。

呵呵,有点绕... ...其实做几个实验就可以看到,SCL变量赋值后,在submit块中可以直接当宏变量引用;而select into的宏变量,只要不发生上述冲突也没有问题。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2