我的编程经验非常有限,所以如果可能的话,需要相当基本的回答。 我有我的第一个表的呼叫细节,然后第二个表的地址在呼叫ID匹配 我的问题是当第一个表返回零结果(这将发生更多的时候比没有)第二个表错误,因为没有数据在第一张桌子。 所以我想在第一个表执行后,如果有零结果,然后停止/退出,如果有结果,然后继续。我已经看过这个了,但是我发现的所有解决方案都非常技术性,而且我不会停下来理解所有建议的,因此我一直无法实现。所以我已经说过,我真的需要一个非常简单和易于理解的解释,这个解释对于具有非常基本的编程知识的人或者有什么可以解决这个问题的建议有帮助。谢谢SAS当obs为零时退出,然后退出其他继续
回答
我有同样的问题,用简单的宏定这样的:
%macro check_data(table=);
data _null_;
call symput('varnobs',n_obs);
stop;
set &table nobs=n_obs;
run;
%if &varnobs = 0 %then %do;
ENDSAS;
%end;
%mend check_data;
%check_data("table1");
简短的说明,你给宏您表的名称,它计算的obervations并将它们写入macrovariable varnobs。使用stop是因为在执行set-statement之前计算nobs,所以我在它之前停止datastep。根据varnobs中的数字,你可以像你想要的那样行事,比如关闭中止或者结束进程,执行特定代码等等......
我必须承认,使用ENDSAS是可以讨论的命令,因为它关闭了所有的东西,更好的办法是使用一个合乎逻辑的做法,像
%if &varnobs ne 0 %then %do;
data table2;
*do your second dataset operation inside the macro only when varnobs is not 0...;
run;
%end;
或者是把整个代码到宏...
我希望这个代码是你有足够的基础,在那一刻我想不出不使用宏变量的解决方案...
嗨感谢您的回复。我已经尝试将以上代码添加到我的代码中,但是我有一些错误。 %macro check_data(table = qldreps); data_null_;调用symput('varnobs',n_obs); stop; set&qldreps nobs = n_obs;跑; %如果&varnobs = 0%,则%do; ENDSAS; %结束;%修正check_data; %check_data(“qldreps”); PROC SQL; CREATE TABLE qldreps AS SELECT c.incident_number, c.incident_type FROM 1 AS c,2 as a c.zone = a.zone QUIT; proc sql; CREATE TABLE detail AS SELECT a.incident_number FROM 1 as a,3 as b WHERE a.incident_number = b.incident_number; QUIT; – Malibu2012
@ malibu2012 hm,我看到的一个错误是'set&qldreps'。你必须使用'set&table',table是你在这里引用的变量,qldreps只是一个表名。如果表名总是相同的,你可以在宏定义和调用中删除(table = qldreps),并在宏内写入'set qldreps'。但是由于注释中的格式化,在这里很难分析你的代码。你的宏调用'%check_data(“qldreps”); '必须在创建表之后,所以将它放在proc sql – kl78
最适合测试的位置,只需将我的代码复制到它的答案中,然后在%mend check_data之间插入用于表创建的proc sql;和 %check_data(“qldreps”); – kl78
感谢kl78
我抄你提供的是和现在的代码我得到一个错误说:“更多的位置参数中所定义的”
我有我的代码如下
%宏check_data(表= qldreps);
data null;
call symput('varnobs',n_obs);
stop;
set &table nobs=n_obs;
run;
%if & varnobs = 0%then%do;
ENDSAS;
%end;
%修复check_data;
proc sql;
创建表qldreps作为
选择c.incident_num,
c.incident_type
从CAD。incindet as c
其中c.incident_type = 601;
quit;
%check_data(“qldreps”);
proc sql;
创建表详细地
选择b.details
从qldreps为a,
cad.incident_detail as b
其中a.incident_number = b.incident_number;
quit;
我没有得到什么?谢谢
如果将一个参数定义为named(带有等号),则不能转身称呼它,就好像将其定义为位置一样。最简单的改变是在宏调用中添加参数名称。 '%check_data(表= qldreps)'。也不要在参数值周围加引号。在这种情况下,它会导致SAS在当前目录中查找名为“qldreps.sas7bdat”的文件,而不是使用数据集work.qldreps。 – Tom
- 1. 中断/退出/退出SAS
- 2. 如何退出当前活动继续
- 3. mysql_query()在php退出后继续运行
- 4. BASH,检查文件是否存在,然后继续退出
- 5. 如何退出if语句并继续其他
- 6. 按X退出或其他任何键继续?
- 7. 即使在其中的命令退出后仍然继续循环
- 8. 多处理Python - Python突然退出,但程序仍然继续
- 9. 继续当点击后退按钮
- 10. 当条件在循环中继续时遇到循环退出
- 11. API错误时退出方法并继续使用其他方法
- 12. fadeIn();然后退出然后回来?
- 13. 后而退出,它需要很长的时间内继续
- 14. 按Enter键继续或q退出C++
- 15. 退出PowerShell功能,但继续脚本
- 16. 让它退出并继续工作
- 17. Java:是的,继续否,退出
- 18. 当由于setDuration()方法设置的持续时间超出了camel作业退出时,我想退出非零退出代码时,如何退出非零值,因为setDuration导致apache驼峰退出
- 19. 弹出窗口然后退出
- 20. GoogleFit步骤计数在退出片段的父活动后退回零(退出)
- 21. 编辑并继续退出在某些时刻为我工作
- 22. 在非零退出后继续使用“git submodule foreach”命令循环子模块
- 23. 退出按钮退出后的问题
- 24. 获取手臂 - 无 - EABI-gdb来加载ELF,继续,然后退出命令行
- 25. 如何等待2分钟完成方法,但然后退出并继续?
- 26. 当按下后退按钮时退出应用程序
- 27. LLDB - 退出...退出?
- 28. 如何让应用程序在退出后继续运行?
- 29. Android应用程序似乎在退出后继续运行
- 30. 退出后Java进程构建器子进程继续
一般而言,步骤不会因操作返回0个观察值而停止。如何做到这一点取决于你在做什么步骤。发布您正在执行的步骤类型的示例,以便我们可以针对该情况发布答案。 – Tom